Hash :
819b1136
Author :
Thomas de Grivel
Date :
2022-12-31T06:17:55
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 2044 2045 2046 2047 2048 2049 2050 2051 2052 2053 2054 2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202 2203 2204 2205 2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247 2248 2249 2250 2251 2252 2253 2254 2255 2256 2257 2258 2259 2260 2261 2262 2263 2264 2265 2266 2267 2268 2269 2270 2271 2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 2370 2371 2372 2373 2374 2375 2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496 2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602 2603 2604 2605 2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633 2634 2635 2636 2637 2638 2639 2640 2641 2642 2643 2644 2645 2646 2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682 2683 2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575 3576 3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605 3606 3607 3608 3609 3610 3611 3612 3613 3614 3615 3616 3617 3618 3619 3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668 3669 3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680 3681 3682 3683 3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704 3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731 3732 3733 3734 3735 3736 3737 3738 3739 3740 3741 3742 3743 3744 3745 3746 3747 3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763 3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776 3777 3778 3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842 3843 3844 3845 3846 3847 3848 3849 3850 3851 3852 3853 3854 3855 3856 3857 3858 3859 3860 3861 3862 3863 3864 3865 3866 3867 3868 3869 3870 3871 3872 3873 3874 3875 3876 3877 3878 3879 3880 3881 3882 3883 3884 3885 3886 3887 3888 3889 3890 3891 3892 3893 3894 3895 3896 3897 3898 3899 3900 3901 3902 3903 3904 3905 3906 3907 3908 3909 3910 3911 3912 3913 3914 3915 3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940 3941 3942 3943 3944 3945 3946 3947 3948 3949 3950 3951 3952 3953 3954 3955 3956 3957 3958 3959 3960 3961 3962 3963 3964 3965 3966 3967 3968 3969 3970 3971 3972 3973 3974 3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997 3998 3999 4000 4001 4002 4003 4004 4005 4006 4007 4008 4009 4010 4011 4012 4013 4014 4015 4016 4017 4018 4019 4020 4021 4022 4023 4024 4025 4026 4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 4038 4039 4040 4041 4042 4043 4044 4045 4046 4047 4048 4049 4050 4051 4052 4053 4054 4055 4056 4057 4058 4059 4060 4061 4062 4063 4064 4065 4066 4067 4068 4069 4070 4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 4093 4094 4095 4096 4097 4098 4099 4100 4101 4102 4103 4104 4105 4106 4107 4108 4109 4110 4111 4112 4113 4114 4115 4116 4117 4118 4119 4120 4121 4122 4123 4124 4125 4126 4127 4128 4129 4130 4131 4132 4133 4134 4135 4136 4137 4138 4139 4140 4141 4142 4143 4144 4145 4146 4147 4148 4149 4150 4151 4152 4153 4154 4155 4156 4157 4158 4159 4160 4161 4162 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175 4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191 4192 4193 4194 4195 4196 4197 4198 4199 4200 4201 4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 4230 4231 4232 4233 4234 4235 4236 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 4291 4292 4293 4294 4295 4296 4297 4298 4299 4300 4301 4302 4303 4304 4305 4306 4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 4325 4326 4327 4328 4329 4330 4331 4332 4333 4334 4335 4336 4337 4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 4370 4371 4372 4373 4374 4375 4376 4377 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 4396 4397 4398 4399 4400 4401 4402 4403 4404 4405 4406 4407 4408 4409 4410 4411 4412 4413 4414 4415 4416 4417 4418 4419 4420 4421 4422 4423 4424 4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 4436 4437 4438 4439 4440 4441 4442 4443 4444 4445 4446 4447 4448 4449 4450 4451 4452 4453 4454 4455 4456 4457 4458 4459 4460 4461 4462 4463 4464 4465 4466 4467 4468 4469 4470 4471 4472 4473 4474 4475 4476 4477 4478 4479 4480 4481 4482 4483 4484 4485 4486 4487 4488 4489 4490 4491 4492 4493 4494 4495 4496 4497 4498 4499 4500 4501 4502 4503 4504 4505 4506 4507 4508 4509 4510 4511 4512 4513 4514 4515 4516 4517 4518 4519 4520 4521 4522 4523 4524 4525 4526 4527 4528 4529 4530 4531 4532 4533 4534 4535 4536 4537 4538 4539 4540 4541 4542 4543 4544 4545 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 4566 4567 4568 4569 4570 4571 4572 4573 4574 4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 4586 4587 4588 4589 4590 4591 4592 4593 4594 4595 4596 4597 4598 4599 4600 4601 4602 4603 4604 4605 4606 4607 4608 4609 4610 4611 4612 4613 4614 4615 4616 4617 4618 4619 4620 4621 4622 4623 4624 4625 4626 4627 4628 4629 4630 4631 4632 4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 4644 4645 4646 4647 4648 4649 4650 4651 4652 4653 4654 4655 4656 4657 4658 4659 4660 4661 4662 4663 4664 4665 4666 4667 4668 4669 4670 4671 4672 4673 4674 4675 4676 4677 4678 4679 4680 4681 4682 4683 4684 4685 4686 4687 4688 4689 4690 4691 4692 4693 4694 4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 4708 4709 4710 4711 4712 4713 4714 4715 4716 4717 4718 4719 4720 4721 4722 4723 4724 4725 4726 4727 4728 4729 4730 4731 4732 4733 4734 4735 4736 4737 4738 4739 4740 4741 4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4765 4766 4767 4768 4769 4770 4771 4772 4773 4774 4775 4776 4777 4778 4779 4780 4781 4782 4783 4784 4785 4786 4787 4788 4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 4800 4801 4802 4803 4804 4805 4806 4807 4808 4809 4810 4811 4812 4813 4814 4815 4816 4817 4818 4819 4820 4821 4822 4823 4824 4825 4826 4827 4828 4829 4830 4831 4832 4833 4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 4845 4846 4847 4848 4849 4850 4851 4852 4853 4854 4855 4856 4857 4858 4859 4860 4861 4862 4863 4864 4865 4866 4867 4868 4869 4870 4871 4872 4873 4874 4875 4876 4877 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 4899 4900 4901 4902 4903 4904 4905 4906 4907 4908 4909 4910 4911 4912 4913 4914 4915 4916 4917 4918 4919 4920 4921 4922 4923 4924 4925 4926 4927 4928 4929 4930 4931 4932 4933 4934 4935 4936 4937 4938 4939 4940 4941 4942 4943 4944 4945 4946 4947 4948 4949 4950 4951 4952 4953 4954 4955 4956 4957 4958 4959 4960 4961 4962 4963 4964 4965 4966 4967 4968 4969 4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 4981 4982 4983 4984 4985 4986 4987 4988 4989 4990 4991 4992 4993 4994 4995 4996 4997 4998 4999 5000 5001 5002 5003 5004 5005 5006 5007 5008 5009 5010 5011 5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 5023 5024 5025 5026 5027 5028 5029 5030 5031 5032 5033 5034 5035 5036 5037 5038 5039 5040 5041 5042 5043 5044 5045 5046 5047 5048 5049 5050 5051 5052 5053 5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 5065 5066 5067 5068 5069 5070 5071 5072 5073 5074 5075 5076 5077 5078 5079 5080 5081 5082 5083 5084 5085 5086 5087 5088 5089 5090 5091 5092 5093 5094 5095 5096 5097 5098 5099 5100 5101 5102 5103 5104 5105 5106 5107 5108 5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 5120 5121 5122 5123 5124 5125 5126 5127 5128 5129 5130 5131 5132 5133 5134 5135 5136 5137 5138 5139 5140 5141 5142 5143 5144 5145 5146 5147 5148 5149 5150 5151 5152 5153 5154 5155 5156 5157 5158 5159 5160 5161 5162 5163 5164 5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 5176 5177 5178 5179 5180 5181 5182 5183 5184 5185 5186 5187 5188 5189 5190 5191 5192 5193 5194 5195 5196 5197 5198 5199 5200 5201 5202 5203 5204 5205 5206 5207 5208 5209 5210 5211 5212 5213 5214 5215 5216 5217 5218 5219 5220 5221 5222 5223 5224 5225 5226 5227 5228 5229 5230 5231 5232 5233 5234 5235 5236 5237 5238 5239 5240 5241 5242 5243 5244 5245 5246 5247 5248 5249 5250 5251 5252 5253 5254 5255 5256 5257 5258 5259 5260 5261 5262 5263 5264 5265 5266 5267 5268 5269 5270 5271 5272 5273 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 5298 5299 5300 5301 5302 5303 5304 5305 5306 5307 5308 5309 5310 5311 5312 5313 5314 5315 5316 5317 5318 5319 5320 5321 5322 5323 5324 5325 5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 5337 5338 5339 5340 5341 5342 5343 5344 5345 5346 5347 5348 5349 5350 5351 5352 5353 5354 5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 5372 5373 5374 5375 5376 5377 5378 5379 5380 5381 5382 5383 5384 5385 5386 5387 5388 5389 5390 5391 5392 5393 5394 5395 5396 5397 5398 5399 5400 5401 5402 5403 5404 5405 5406 5407 5408 5409 5410 5411 5412 5413 5414 5415 5416 5417 5418 5419 5420 5421 5422 5423 5424 5425 5426 5427 5428 5429 5430 5431 5432 5433 5434 5435 5436 5437 5438 5439 5440 5441 5442 5443 5444 5445 5446 5447 5448 5449 5450 5451 5452 5453 5454 5455 5456 5457 5458 5459 5460 5461 5462 5463 5464 5465 5466 5467 5468 5469 5470 5471 5472 5473 5474 5475 5476 5477 5478 5479 5480 5481 5482 5483 5484 5485 5486 5487 5488 5489 5490 5491 5492 5493 5494 5495 5496 5497 5498 5499 5500 5501 5502 5503 5504 5505 5506 5507 5508 5509 5510 5511 5512 5513 5514 5515 5516 5517 5518 5519 5520 5521 5522 5523 5524 5525 5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 5559 5560 5561 5562 5563 5564 5565 5566 5567 5568 5569 5570 5571 5572 5573 5574 5575 5576 5577 5578 5579 5580 5581 5582 5583 5584 5585 5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 5609 5610 5611 5612 5613 5614 5615 5616 5617 5618 5619 5620 5621 5622 5623 5624 5625 5626 5627 5628 5629 5630 5631 5632 5633 5634 5635 5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 5659 5660 5661 5662 5663 5664 5665 5666 5667 5668 5669 5670 5671 5672 5673 5674 5675 5676 5677 5678 5679 5680 5681 5682 5683 5684 5685 5686 5687 5688 5689 5690 5691 5692 5693 5694 5695 5696 5697 5698 5699 5700 5701 5702 5703 5704 5705 5706 5707 5708 5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 5724 5725 5726 5727 5728 5729 5730 5731 5732 5733 5734 5735 5736 5737 5738 5739 5740 5741 5742 5743 5744 5745 5746 5747 5748 5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 5761 5762 5763 5764 5765 5766 5767 5768 5769 5770 5771 5772 5773 5774 5775 5776 5777 5778 5779 5780 5781 5782 5783 5784 5785 5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 5798 5799 5800 5801 5802 5803 5804 5805 5806 5807 5808 5809 5810 5811 5812 5813 5814 5815 5816 5817 5818 5819 5820 5821 5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 5834 5835 5836 5837 5838 5839 5840 5841 5842 5843 5844 5845 5846 5847 5848 5849 5850 5851 5852 5853 5854 5855 5856 5857 5858 5859 5860 5861 5862 5863 5864 5865 5866 5867 5868 5869 5870 5871 5872 5873 5874 5875 5876 5877 5878 5879 5880 5881 5882 5883 5884 5885 5886 5887 5888 5889 5890 5891 5892 5893 5894 5895 5896 5897 5898 5899 5900 5901 5902 5903 5904 5905 5906 5907 5908 5909 5910 5911 5912 5913 5914 5915 5916 5917 5918 5919 5920 5921 5922 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 5942 5943 5944 5945 5946 5947 5948 5949 5950 5951 5952 5953 5954 5955 5956 5957 5958 5959 5960 5961 5962 5963 5964 5965 5966 5967 5968 5969 5970 5971 5972 5973 5974 5975 5976 5977 5978 5979 5980 5981 5982 5983 5984 5985 5986 5987 5988 5989 5990 5991 5992 5993 5994 5995 5996 5997 5998 5999 6000 6001 6002 6003 6004 6005 6006 6007 6008 6009 6010 6011 6012 6013 6014 6015 6016 6017 6018 6019 6020 6021 6022 6023 6024 6025 6026 6027 6028 6029 6030 6031 6032 6033 6034 6035 6036 6037 6038 6039 6040 6041 6042 6043 6044 6045 6046 6047 6048 6049 6050 6051 6052 6053 6054 6055 6056 6057 6058 6059 6060 6061 6062 6063 6064 6065 6066 6067 6068 6069 6070 6071 6072 6073 6074 6075 6076 6077 6078 6079 6080 6081 6082 6083 6084 6085 6086 6087 6088 6089 6090 6091 6092 6093 6094 6095 6096 6097 6098 6099 6100 6101 6102 6103 6104 6105 6106 6107 6108 6109 6110 6111 6112 6113 6114 6115 6116 6117 6118 6119 6120 6121 6122 6123 6124 6125 6126 6127 6128 6129 6130 6131 6132 6133 6134 6135 6136 6137 6138 6139 6140 6141 6142 6143 6144 6145 6146 6147 6148 6149 6150 6151 6152 6153 6154 6155 6156 6157 6158 6159 6160 6161 6162 6163 6164 6165 6166 6167 6168 6169 6170 6171 6172 6173 6174 6175 6176 6177 6178 6179 6180 6181 6182 6183 6184 6185 6186 6187 6188 6189 6190 6191 6192 6193 6194 6195 6196 6197 6198 6199 6200 6201 6202 6203 6204 6205 6206 6207 6208 6209 6210 6211 6212 6213 6214 6215 6216 6217 6218 6219 6220 6221 6222 6223 6224 6225 6226 6227 6228 6229 6230 6231 6232 6233 6234 6235 6236 6237 6238 6239 6240 6241 6242 6243 6244 6245 6246 6247 6248 6249 6250 6251 6252 6253 6254 6255 6256 6257 6258 6259 6260 6261 6262 6263 6264 6265 6266 6267 6268 6269 6270 6271 6272 6273 6274 6275 6276 6277 6278 6279 6280 6281 6282 6283 6284 6285 6286 6287 6288 6289 6290 6291 6292 6293 6294 6295 6296 6297 6298 6299 6300 6301 6302 6303 6304 6305 6306 6307 6308 6309 6310 6311 6312 6313 6314 6315 6316 6317 6318 6319 6320 6321 6322 6323 6324 6325 6326 6327 6328 6329 6330 6331 6332 6333 6334 6335 6336 6337 6338 6339 6340 6341 6342 6343 6344 6345 6346 6347 6348 6349 6350 6351 6352 6353 6354 6355 6356 6357 6358 6359 6360 6361 6362 6363 6364 6365 6366 6367 6368 6369 6370 6371 6372 6373 6374 6375 6376 6377 6378 6379 6380 6381 6382 6383 6384 6385 6386 6387 6388 6389 6390 6391 6392 6393 6394 6395 6396 6397 6398 6399 6400 6401 6402 6403 6404 6405 6406 6407 6408 6409 6410 6411 6412 6413 6414 6415 6416 6417 6418 6419 6420 6421 6422 6423 6424 6425 6426 6427 6428 6429 6430 6431 6432 6433 6434 6435 6436 6437 6438 6439 6440 6441 6442 6443 6444 6445 6446 6447 6448 6449 6450 6451 6452 6453 6454 6455 6456 6457 6458 6459 6460 6461 6462 6463 6464 6465 6466 6467 6468 6469 6470 6471 6472 6473 6474 6475 6476 6477 6478 6479 6480 6481 6482 6483 6484 6485 6486 6487 6488 6489 6490 6491 6492 6493 6494 6495 6496 6497 6498 6499 6500 6501 6502 6503 6504 6505 6506 6507 6508 6509 6510 6511 6512 6513 6514 6515 6516 6517 6518 6519 6520 6521 6522 6523 6524 6525 6526 6527 6528 6529 6530 6531 6532 6533 6534 6535 6536 6537 6538 6539 6540 6541 6542 6543 6544 6545 6546 6547 6548 6549 6550 6551 6552 6553 6554 6555 6556 6557 6558 6559 6560 6561 6562 6563 6564 6565 6566 6567 6568 6569 6570 6571 6572 6573 6574 6575 6576 6577 6578 6579 6580 6581 6582 6583 6584 6585 6586 6587 6588 6589 6590 6591 6592 6593 6594 6595 6596 6597 6598 6599 6600 6601 6602 6603 6604 6605 6606 6607 6608 6609 6610 6611 6612 6613 6614 6615 6616 6617 6618 6619 6620 6621 6622 6623 6624 6625 6626 6627 6628 6629 6630 6631 6632 6633 6634 6635 6636 6637 6638 6639 6640 6641 6642 6643 6644 6645 6646 6647 6648 6649 6650 6651 6652 6653 6654 6655 6656 6657 6658 6659 6660 6661 6662 6663 6664 6665 6666 6667 6668 6669 6670 6671 6672 6673 6674 6675 6676 6677 6678 6679 6680 6681 6682 6683 6684 6685 6686 6687 6688 6689 6690 6691 6692 6693 6694 6695 6696 6697 6698 6699 6700 6701 6702 6703 6704 6705 6706 6707 6708 6709 6710 6711 6712 6713 6714 6715 6716 6717 6718 6719 6720 6721 6722 6723 6724 6725 6726 6727 6728 6729 6730 6731 6732 6733 6734 6735 6736 6737 6738 6739 6740 6741 6742 6743 6744 6745 6746 6747 6748 6749 6750 6751 6752 6753 6754 6755 6756 6757 6758 6759 6760 6761 6762 6763 6764 6765 6766 6767 6768 6769 6770 6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 6783 6784 6785 6786 6787 6788 6789 6790 6791 6792 6793 6794 6795 6796 6797 6798 6799 6800 6801 6802 6803 6804 6805 6806 6807 6808 6809 6810 6811 6812 6813 6814 6815 6816 6817 6818 6819 6820 6821 6822 6823 6824 6825 6826 6827 6828 6829 6830 6831 6832 6833 6834 6835 6836 6837 6838 6839 6840 6841 6842 6843 6844 6845 6846 6847 6848 6849 6850 6851 6852 6853 6854 6855 6856 6857 6858 6859 6860 6861 6862 6863 6864 6865 6866 6867 6868 6869 6870 6871 6872 6873 6874 6875 6876 6877 6878 6879 6880 6881 6882 6883 6884 6885 6886 6887 6888 6889 6890 6891 6892 6893 6894 6895 6896 6897 6898 6899 6900 6901 6902 6903 6904 6905 6906 6907 6908 6909 6910 6911 6912 6913 6914 6915 6916 6917 6918 6919 6920 6921 6922 6923 6924 6925 6926 6927 6928 6929 6930 6931 6932 6933 6934 6935 6936 6937 6938 6939 6940 6941 6942 6943 6944 6945 6946 6947 6948 6949 6950 6951 6952 6953 6954 6955 6956 6957 6958 6959 6960 6961 6962 6963 6964 6965 6966 6967 6968 6969 6970 6971 6972 6973 6974 6975 6976 6977 6978 6979 6980 6981 6982 6983 6984 6985 6986 6987 6988 6989 6990 6991 6992 6993 6994 6995 6996 6997 6998 6999 7000 7001 7002 7003 7004 7005 7006 7007 7008 7009 7010 7011 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 7026 7027 7028 7029 7030 7031 7032 7033 7034 7035 7036 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 7056 7057 7058 7059 7060 7061 7062 7063 7064 7065 7066 7067 7068 7069 7070 7071 7072 7073 7074 7075 7076 7077 7078 7079 7080 7081 7082 7083 7084 7085 7086 7087 7088 7089 7090 7091 7092 7093 7094 7095 7096 7097 7098 7099 7100 7101 7102 7103 7104 7105 7106 7107 7108 7109 7110 7111 7112 7113 7114 7115 7116 7117 7118 7119 7120 7121 7122 7123 7124 7125 7126 7127 7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 7176 7177 7178 7179 7180 7181 7182 7183 7184 7185 7186 7187 7188 7189 7190 7191 7192 7193 7194 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 7212 7213 7214 7215 7216 7217 7218 7219 7220 7221 7222 7223 7224 7225 7226 7227 7228 7229 7230 7231 7232 7233 7234 7235 7236 7237 7238 7239 7240 7241 7242 7243 7244 7245 7246 7247 7248 7249 7250 7251 7252 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 7267 7268 7269 7270 7271 7272 7273 7274 7275 7276 7277 7278 7279 7280 7281 7282 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 7302 7303 7304 7305 7306 7307 7308 7309 7310 7311 7312 7313 7314 7315 7316 7317 7318 7319 7320 7321 7322 7323 7324 7325 7326 7327 7328 7329 7330 7331 7332 7333 7334 7335 7336 7337 7338 7339 7340 7341 7342 7343 7344 7345 7346 7347 7348 7349 7350 7351 7352 7353 7354 7355 7356 7357 7358 7359 7360 7361 7362 7363 7364 7365 7366 7367 7368 7369 7370 7371 7372 7373 7374 7375 7376 7377 7378 7379 7380 7381 7382 7383 7384 7385 7386 7387 7388 7389 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 7409 7410 7411 7412 7413 7414 7415 7416 7417 7418 7419 7420 7421 7422 7423 7424 7425 7426 7427 7428 7429 7430 7431 7432 7433 7434 7435 7436 7437 7438 7439 7440 7441 7442 7443 7444 7445 7446 7447 7448 7449 7450 7451 7452 7453 7454 7455 7456 7457 7458 7459 7460 7461 7462 7463 7464 7465 7466 7467 7468 7469 7470 7471 7472 7473 7474 7475 7476 7477 7478 7479 7480 7481 7482 7483 7484 7485 7486 7487 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524 7525 7526 7527 7528 7529 7530 7531 7532 7533 7534 7535 7536 7537 7538 7539 7540 7541 7542 7543 7544 7545 7546 7547 7548 7549 7550 7551 7552 7553 7554 7555 7556 7557 7558 7559 7560 7561 7562 7563 7564 7565 7566 7567 7568 7569 7570 7571 7572 7573 7574 7575 7576 7577 7578 7579 7580 7581 7582 7583 7584 7585 7586 7587 7588 7589 7590 7591 7592 7593 7594 7595 7596 7597 7598 7599 7600 7601 7602 7603 7604 7605 7606 7607 7608 7609 7610 7611 7612 7613 7614 7615 7616 7617 7618 7619 7620 7621 7622 7623 7624 7625 7626 7627 7628 7629 7630 7631 7632 7633 7634 7635 7636 7637 7638 7639 7640 7641 7642 7643 7644 7645 7646 7647 7648 7649 7650 7651 7652 7653 7654 7655 7656 7657 7658 7659 7660 7661 7662 7663 7664 7665 7666 7667 7668 7669 7670 7671 7672 7673 7674 7675 7676 7677 7678 7679 7680 7681 7682 7683 7684 7685 7686 7687 7688 7689 7690 7691 7692 7693 7694 7695 7696 7697 7698 7699 7700 7701 7702 7703 7704 7705 7706 7707 7708 7709 7710 7711 7712 7713 7714 7715 7716 7717 7718 7719 7720 7721 7722 7723 7724 7725 7726 7727 7728 7729 7730 7731 7732 7733 7734 7735 7736 7737 7738 7739 7740 7741 7742 7743 7744 7745 7746 7747 7748 7749 7750 7751 7752 7753 7754 7755 7756 7757 7758 7759 7760 7761 7762 7763 7764 7765 7766 7767 7768 7769 7770 7771 7772 7773 7774 7775 7776 7777 7778 7779 7780 7781 7782 7783 7784 7785 7786 7787 7788 7789 7790 7791 7792 7793 7794 7795 7796 7797 7798 7799 7800 7801 7802 7803 7804 7805 7806 7807 7808 7809 7810 7811 7812 7813 7814 7815 7816 7817 7818 7819 7820 7821 7822 7823 7824 7825 7826 7827 7828 7829 7830 7831 7832 7833 7834 7835 7836 7837 7838 7839 7840 7841 7842 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 7880 7881 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891 7892 7893 7894 7895 7896 7897 7898 7899 7900 7901 7902 7903 7904 7905 7906 7907 7908 7909 7910 7911 7912 7913 7914 7915 7916 7917 7918 7919 7920 7921 7922 7923 7924 7925 7926 7927 7928 7929 7930 7931 7932 7933 7934 7935 7936 7937 7938 7939 7940 7941 7942 7943 7944 7945 7946 7947 7948 7949 7950 7951 7952 7953 7954 7955 7956 7957 7958 7959 7960 7961 7962 7963 7964 7965 7966 7967 7968 7969 7970 7971 7972 7973 7974 7975 7976 7977 7978 7979 7980 7981 7982 7983 7984 7985 7986 7987 7988 7989 7990 7991 7992 7993 7994 7995 7996 7997 7998 7999 8000 8001 8002 8003 8004 8005 8006 8007 8008 8009 8010 8011 8012 8013 8014 8015 8016 8017 8018 8019 8020 8021 8022 8023 8024 8025 8026 8027 8028 8029 8030 8031 8032 8033 8034 8035 8036 8037 8038 8039 8040 8041 8042 8043 8044 8045 8046 8047 8048 8049 8050 8051 8052 8053 8054 8055 8056 8057 8058 8059 8060 8061 8062 8063 8064 8065 8066 8067 8068 8069 8070 8071 8072 8073 8074 8075 8076 8077 8078 8079 8080 8081 8082 8083 8084 8085 8086 8087 8088 8089 8090 8091 8092 8093 8094 8095 8096 8097 8098 8099 8100 8101 8102 8103 8104 8105 8106 8107 8108 8109 8110 8111 8112 8113 8114 8115 8116 8117 8118 8119 8120 8121 8122 8123 8124 8125 8126 8127 8128 8129 8130 8131 8132 8133 8134 8135 8136 8137 8138 8139 8140 8141 8142 8143 8144 8145 8146 8147 8148 8149 8150 8151 8152 8153 8154 8155 8156 8157 8158 8159 8160 8161 8162 8163 8164 8165 8166 8167 8168 8169 8170 8171 8172 8173 8174 8175 8176 8177 8178 8179 8180 8181 8182 8183 8184 8185 8186 8187 8188 8189 8190 8191 8192 8193 8194 8195 8196 8197 8198 8199 8200 8201 8202 8203 8204 8205 8206 8207 8208 8209 8210 8211 8212 8213 8214 8215 8216 8217 8218 8219 8220 8221 8222 8223 8224 8225 8226 8227 8228 8229 8230 8231 8232 8233 8234 8235 8236 8237 8238 8239 8240 8241 8242 8243 8244 8245 8246 8247 8248 8249 8250 8251 8252 8253 8254 8255 8256 8257 8258 8259 8260 8261 8262 8263 8264 8265 8266 8267 8268 8269 8270 8271 8272 8273 8274 8275 8276 8277 8278 8279 8280 8281 8282 8283 8284 8285 8286 8287 8288 8289 8290 8291 8292 8293 8294 8295 8296 8297 8298 8299 8300 8301 8302 8303 8304 8305 8306 8307 8308 8309 8310 8311 8312 8313 8314 8315 8316 8317 8318 8319 8320 8321 8322 8323 8324 8325 8326 8327 8328 8329 8330 8331 8332 8333 8334 8335 8336 8337 8338 8339 8340 8341 8342 8343 8344 8345 8346 8347 8348 8349 8350 8351 8352 8353 8354 8355 8356 8357 8358 8359 8360 8361 8362 8363 8364 8365 8366 8367 8368 8369 8370 8371 8372 8373 8374 8375 8376 8377 8378 8379 8380 8381 8382 8383 8384 8385 8386 8387 8388 8389 8390 8391 8392 8393 8394 8395 8396 8397 8398 8399 8400 8401 8402 8403 8404 8405 8406 8407 8408 8409 8410 8411 8412 8413 8414 8415 8416 8417 8418 8419 8420 8421 8422 8423 8424 8425 8426 8427 8428 8429 8430 8431 8432 8433 8434 8435 8436 8437 8438 8439 8440 8441 8442 8443 8444 8445 8446 8447 8448 8449 8450 8451 8452 8453 8454 8455 8456 8457 8458 8459 8460 8461 8462 8463 8464 8465 8466 8467 8468 8469 8470 8471 8472 8473 8474 8475 8476 8477 8478 8479 8480 8481 8482 8483 8484 8485 8486 8487 8488 8489 8490 8491 8492 8493 8494 8495 8496 8497 8498 8499 8500 8501 8502 8503 8504 8505 8506 8507 8508 8509 8510 8511 8512 8513 8514 8515 8516 8517 8518 8519 8520 8521 8522 8523 8524 8525 8526 8527 8528 8529 8530 8531 8532 8533 8534 8535 8536 8537 8538 8539 8540 8541 8542 8543 8544 8545 8546 8547 8548 8549 8550 8551 8552 8553 8554 8555 8556 8557 8558 8559 8560 8561 8562 8563 8564 8565 8566 8567 8568 8569 8570 8571 8572 8573 8574 8575 8576 8577 8578 8579 8580 8581 8582 8583 8584 8585 8586 8587 8588 8589 8590 8591 8592 8593 8594 8595 8596 8597 8598 8599 8600 8601 8602 8603 8604 8605 8606 8607 8608 8609 8610 8611 8612 8613 8614 8615 8616 8617 8618 8619 8620 8621 8622 8623 8624 8625 8626 8627 8628 8629 8630 8631 8632 8633 8634 8635 8636 8637 8638 8639 8640 8641 8642 8643 8644 8645 8646 8647 8648 8649 8650 8651 8652 8653 8654 8655 8656 8657 8658 8659 8660 8661 8662 8663 8664 8665 8666 8667 8668 8669 8670 8671 8672 8673 8674 8675 8676 8677 8678 8679 8680 8681 8682 8683 8684 8685 8686 8687 8688 8689 8690 8691 8692 8693 8694 8695 8696 8697 8698 8699 8700 8701 8702 8703 8704 8705 8706 8707 8708 8709 8710 8711 8712 8713 8714 8715 8716 8717 8718 8719 8720 8721 8722 8723 8724 8725 8726 8727 8728 8729 8730 8731 8732 8733 8734 8735 8736 8737 8738 8739 8740 8741 8742 8743 8744 8745 8746 8747 8748 8749 8750 8751 8752 8753 8754 8755 8756 8757 8758 8759 8760 8761 8762 8763 8764 8765 8766 8767 8768 8769 8770 8771 8772 8773 8774 8775 8776 8777 8778 8779 8780 8781 8782 8783 8784 8785 8786 8787 8788 8789 8790 8791 8792 8793 8794 8795 8796 8797 8798 8799 8800 8801 8802 8803 8804 8805 8806 8807 8808 8809 8810 8811 8812 8813 8814 8815 8816 8817 8818 8819 8820 8821 8822 8823 8824 8825 8826 8827 8828 8829 8830 8831 8832 8833 8834 8835 8836 8837 8838 8839 8840 8841 8842 8843 8844 8845 8846 8847 8848 8849 8850 8851 8852 8853 8854 8855 8856 8857 8858 8859 8860 8861 8862 8863 8864 8865 8866 8867 8868 8869 8870 8871 8872 8873 8874 8875 8876 8877 8878 8879 8880 8881 8882 8883 8884 8885 8886 8887 8888 8889 8890 8891 8892 8893 8894 8895 8896 8897 8898 8899 8900 8901 8902 8903 8904 8905 8906 8907 8908 8909 8910 8911 8912 8913 8914 8915 8916 8917 8918 8919 8920 8921 8922 8923 8924 8925 8926 8927 8928 8929 8930 8931 8932 8933 8934 8935 8936 8937 8938 8939 8940 8941 8942 8943 8944 8945 8946 8947 8948 8949 8950 8951 8952 8953 8954 8955 8956 8957 8958 8959 8960 8961 8962 8963 8964 8965 8966 8967 8968 8969 8970 8971 8972 8973 8974 8975 8976 8977 8978 8979 8980 8981 8982 8983 8984 8985 8986 8987 8988 8989 8990 8991 8992 8993 8994 8995 8996 8997 8998 8999 9000 9001 9002 9003 9004 9005 9006 9007 9008 9009 9010 9011 9012 9013 9014 9015 9016 9017 9018 9019 9020 9021 9022 9023 9024 9025 9026 9027 9028 9029 9030 9031 9032 9033 9034 9035 9036 9037 9038 9039 9040 9041 9042 9043 9044 9045 9046 9047 9048 9049 9050 9051 9052 9053 9054 9055 9056 9057 9058 9059 9060 9061 9062 9063 9064 9065 9066 9067 9068 9069 9070 9071 9072 9073 9074 9075 9076 9077 9078 9079 9080 9081 9082 9083 9084 9085 9086 9087 9088 9089 9090 9091 9092 9093 9094 9095 9096 9097 9098 9099 9100 9101 9102 9103 9104 9105 9106 9107 9108 9109 9110 9111 9112 9113 9114 9115 9116 9117 9118 9119 9120 9121 9122 9123 9124 9125 9126 9127 9128 9129 9130 9131 9132 9133 9134 9135 9136 9137 9138 9139 9140 9141 9142 9143 9144 9145 9146 9147 9148 9149 9150 9151 9152 9153 9154 9155 9156 9157 9158 9159 9160 9161 9162 9163 9164 9165 9166 9167 9168 9169 9170 9171 9172 9173 9174 9175 9176 9177 9178 9179 9180 9181 9182 9183 9184 9185 9186 9187 9188 9189 9190 9191 9192 9193 9194 9195 9196 9197 9198 9199 9200 9201 9202 9203 9204 9205 9206 9207 9208 9209 9210 9211 9212 9213 9214 9215 9216 9217 9218 9219 9220 9221 9222 9223 9224 9225 9226 9227 9228 9229 9230 9231 9232 9233 9234 9235 9236 9237 9238 9239 9240 9241 9242 9243 9244 9245 9246 9247 9248 9249 9250 9251 9252 9253 9254 9255 9256 9257 9258 9259 9260 9261 9262 9263 9264 9265 9266 9267 9268 9269 9270 9271 9272 9273 9274 9275 9276 9277 9278 9279 9280 9281 9282 9283 9284 9285 9286 9287 9288 9289 9290 9291 9292 9293 9294 9295 9296 9297 9298 9299 9300 9301 9302 9303 9304 9305 9306 9307 9308 9309 9310 9311 9312 9313 9314 9315 9316 9317 9318 9319 9320 9321 9322 9323 9324 9325 9326 9327 9328 9329 9330 9331 9332 9333 9334 9335 9336 9337 9338 9339 9340 9341 9342 9343 9344 9345 9346 9347 9348 9349 9350 9351 9352 9353 9354 9355 9356 9357 9358 9359 9360 9361 9362 9363 9364 9365 9366 9367 9368 9369 9370 9371 9372 9373 9374 9375 9376 9377 9378 9379 9380 9381 9382 9383 9384 9385 9386 9387 9388 9389 9390 9391 9392 9393 9394 9395 9396 9397 9398 9399 9400 9401 9402 9403 9404 9405 9406 9407 9408 9409 9410 9411 9412 9413 9414 9415 9416 9417 9418 9419 9420 9421 9422 9423 9424 9425 9426 9427 9428 9429 9430 9431 9432 9433 9434 9435 9436 9437 9438 9439 9440 9441 9442 9443 9444 9445 9446 9447 9448 9449 9450 9451 9452 9453 9454 9455 9456 9457 9458 9459 9460 9461 9462 9463 9464 9465 9466 9467 9468 9469 9470 9471 9472 9473 9474 9475 9476 9477 9478 9479 9480 9481 9482 9483 9484 9485 9486 9487 9488 9489 9490 9491 9492 9493 9494 9495 9496 9497 9498 9499 9500 9501 9502 9503 9504 9505 9506 9507 9508 9509 9510 9511 9512 9513 9514 9515 9516 9517 9518 9519 9520 9521 9522 9523 9524 9525 9526 9527 9528 9529 9530 9531 9532 9533 9534 9535 9536 9537 9538 9539 9540 9541 9542 9543 9544 9545 9546 9547 9548 9549 9550 9551 9552 9553 9554 9555 9556 9557 9558 9559 9560 9561 9562 9563 9564 9565 9566 9567 9568 9569 9570 9571 9572 9573 9574 9575 9576 9577 9578 9579 9580 9581 9582 9583 9584 9585 9586 9587 9588 9589 9590 9591 9592 9593 9594 9595 9596 9597 9598 9599 9600 9601 9602 9603 9604 9605 9606 9607 9608 9609 9610 9611 9612 9613 9614 9615 9616 9617 9618 9619 9620 9621 9622 9623 9624 9625 9626 9627 9628 9629 9630 9631 9632 9633 9634 9635 9636 9637 9638 9639 9640 9641 9642 9643 9644 9645 9646 9647 9648 9649 9650 9651 9652 9653 9654 9655 9656 9657 9658 9659 9660 9661 9662 9663 9664 9665 9666 9667 9668 9669 9670 9671 9672 9673 9674 9675 9676 9677 9678 9679 9680 9681 9682 9683 9684 9685 9686 9687 9688 9689 9690 9691 9692 9693 9694 9695 9696 9697 9698 9699 9700 9701 9702 9703 9704 9705 9706 9707 9708 9709 9710 9711 9712 9713 9714 9715 9716 9717 9718 9719 9720 9721 9722 9723 9724 9725 9726 9727 9728 9729 9730 9731 9732 9733 9734 9735 9736 9737 9738 9739 9740 9741 9742 9743 9744 9745 9746 9747 9748 9749 9750 9751 9752 9753 9754 9755 9756 9757 9758 9759 9760 9761 9762 9763 9764 9765 9766 9767 9768 9769 9770 9771 9772 9773 9774 9775 9776 9777 9778 9779 9780 9781 9782 9783 9784 9785 9786 9787 9788 9789 9790 9791 9792 9793 9794 9795 9796 9797 9798 9799 9800 9801 9802 9803 9804 9805 9806 9807 9808 9809 9810 9811 9812 9813 9814 9815 9816 9817 9818 9819 9820 9821 9822 9823 9824 9825 9826 9827 9828 9829 9830 9831 9832 9833 9834 9835 9836 9837 9838 9839 9840 9841 9842 9843 9844 9845 9846 9847 9848 9849 9850 9851 9852 9853 9854 9855 9856 9857 9858 9859 9860 9861 9862 9863 9864 9865 9866 9867 9868 9869 9870 9871 9872 9873 9874 9875 9876 9877 9878 9879 9880 9881 9882 9883 9884 9885 9886 9887 9888 9889 9890 9891 9892 9893 9894 9895 9896 9897 9898 9899 9900 9901 9902 9903 9904 9905 9906 9907 9908 9909 9910 9911 9912 9913 9914 9915 9916 9917 9918 9919 9920 9921 9922 9923 9924 9925 9926 9927 9928 9929 9930 9931 9932 9933 9934 9935 9936 9937 9938 9939 9940 9941 9942 9943 9944 9945 9946 9947 9948 9949 9950 9951 9952 9953 9954 9955 9956 9957 9958 9959 9960 9961 9962 9963 9964 9965 9966 9967 9968 9969 9970 9971 9972 9973 9974 9975 9976 9977 9978 9979 9980 9981 9982 9983 9984 9985 9986 9987 9988 9989 9990 9991 9992 9993 9994 9995 9996 9997 9998 9999 10000 10001 10002 10003 10004 10005 10006 10007 10008 10009 10010 10011 10012 10013 10014 10015 10016 10017 10018 10019 10020 10021 10022 10023 10024 10025 10026 10027 10028 10029 10030 10031 10032 10033 10034 10035 10036 10037 10038 10039 10040 10041 10042 10043 10044 10045 10046 10047 10048 10049 10050 10051 10052 10053 10054 10055 10056 10057 10058 10059 10060 10061 10062 10063 10064 10065 10066 10067 10068 10069 10070 10071 10072 10073 10074 10075 10076 10077 10078 10079 10080 10081 10082 10083 10084 10085 10086 10087 10088 10089 10090 10091 10092 10093 10094 10095 10096 10097 10098 10099 10100 10101 10102 10103 10104 10105 10106 10107 10108 10109 10110 10111 10112 10113 10114 10115 10116 10117 10118 10119 10120 10121 10122 10123 10124 10125 10126 10127 10128 10129 10130 10131 10132 10133 10134 10135 10136 10137 10138 10139 10140 10141 10142 10143 10144 10145 10146 10147 10148 10149 10150 10151 10152 10153 10154 10155 10156 10157 10158 10159 10160 10161 10162 10163 10164 10165 10166 10167 10168 10169 10170 10171 10172 10173 10174 10175 10176 10177 10178 10179 10180 10181 10182 10183 10184 10185 10186 10187 10188 10189 10190 10191 10192 10193 10194 10195 10196 10197 10198 10199 10200 10201 10202 10203 10204 10205 10206 10207 10208 10209 10210 10211 10212 10213 10214 10215 10216 10217 10218 10219 10220 10221 10222 10223 10224 10225 10226 10227 10228 10229 10230 10231 10232 10233 10234 10235 10236 10237 10238 10239 10240 10241 10242 10243 10244 10245 10246 10247 10248 10249 10250 10251 10252 10253 10254 10255 10256 10257 10258 10259 10260 10261 10262 10263 10264 10265 10266 10267 10268 10269 10270 10271 10272 10273 10274 10275 10276 10277 10278 10279 10280 10281 10282 10283 10284 10285 10286 10287 10288 10289 10290 10291 10292 10293 10294 10295 10296 10297 10298 10299 10300 10301 10302 10303 10304 10305 10306 10307 10308 10309 10310 10311 10312 10313 10314 10315 10316 10317 10318 10319 10320 10321 10322 10323 10324 10325 10326 10327 10328 10329 10330 10331 10332 10333 10334 10335 10336 10337 10338 10339 10340 10341 10342 10343 10344 10345 10346 10347 10348 10349 10350 10351 10352 10353 10354 10355 10356 10357 10358 10359 10360 10361 10362 10363 10364 10365 10366 10367 10368 10369 10370 10371 10372 10373 10374 10375 10376 10377 10378 10379 10380 10381 10382 10383 10384 10385 10386 10387 10388 10389 10390 10391 10392 10393 10394 10395 10396 10397 10398 10399 10400 10401 10402 10403 10404 10405 10406 10407 10408 10409 10410 10411 10412 10413 10414 10415 10416 10417 10418 10419 10420 10421 10422 10423 10424 10425 10426 10427 10428 10429 10430 10431 10432 10433 10434 10435 10436 10437 10438 10439 10440 10441 10442 10443 10444 10445 10446 10447 10448 10449 10450 10451 10452 10453 10454 10455 10456 10457 10458 10459 10460 10461 10462 10463 10464 10465 10466 10467 10468 10469 10470 10471 10472 10473 10474 10475 10476 10477 10478 10479 10480 10481 10482 10483 10484 10485 10486 10487 10488 10489 10490 10491 10492 10493 10494 10495 10496 10497 10498 10499 10500 10501 10502 10503 10504 10505 10506 10507 10508 10509 10510 10511 10512 10513 10514 10515 10516 10517 10518 10519 10520 10521 10522 10523 10524 10525 10526 10527 10528 10529 10530 10531 10532 10533 10534 10535 10536 10537 10538 10539 10540 10541 10542 10543 10544 10545 10546 10547 10548 10549 10550 10551 10552 10553 10554 10555 10556 10557 10558 10559 10560 10561 10562 10563 10564 10565 10566 10567 10568 10569 10570 10571 10572 10573 10574 10575 10576 10577 10578 10579 10580 10581 10582 10583 10584 10585 10586 10587 10588 10589 10590 10591 10592 10593 10594 10595 10596 10597 10598 10599 10600 10601 10602 10603 10604 10605 10606 10607 10608 10609 10610 10611 10612 10613 10614 10615 10616 10617 10618 10619 10620 10621 10622 10623 10624 10625 10626 10627 10628 10629 10630 10631 10632 10633 10634 10635 10636 10637 10638 10639 10640 10641 10642 10643 10644 10645 10646 10647 10648 10649 10650 10651 10652 10653 10654 10655 10656 10657 10658 10659 10660 10661 10662 10663 10664 10665 10666 10667 10668 10669 10670 10671 10672 10673 10674 10675 10676 10677 10678 10679 10680 10681 10682 10683 10684 10685 10686 10687 10688 10689 10690 10691 10692 10693 10694 10695 10696 10697 10698 10699 10700 10701 10702 10703 10704 10705 10706 10707 10708 10709 10710 10711 10712 10713 10714 10715 10716 10717 10718 10719 10720 10721 10722 10723 10724 10725 10726 10727 10728 10729 10730 10731 10732 10733 10734 10735 10736 10737 10738 10739 10740 10741 10742 10743 10744 10745 10746 10747 10748 10749 10750 10751 10752 10753 10754 10755 10756 10757 10758 10759 10760 10761 10762 10763 10764 10765 10766 10767 10768 10769 10770 10771 10772 10773 10774 10775 10776 10777 10778 10779 10780 10781 10782 10783 10784 10785 10786 10787 10788 10789 10790 10791 10792 10793 10794 10795 10796 10797 10798 10799 10800 10801 10802 10803 10804 10805 10806 10807 10808 10809 10810 10811 10812 10813 10814 10815 10816 10817 10818 10819 10820 10821 10822 10823 10824 10825 10826 10827 10828 10829 10830 10831 10832 10833 10834 10835 10836 10837 10838 10839 10840 10841 10842 10843 10844 10845 10846 10847 10848 10849 10850 10851 10852 10853 10854 10855 10856 10857 10858 10859 10860 10861 10862 10863 10864 10865 10866 10867 10868 10869 10870 10871 10872 10873 10874 10875 10876 10877 10878 10879 10880 10881 10882 10883 10884 10885 10886 10887 10888 10889 10890 10891 10892 10893 10894 10895 10896 10897 10898 10899 10900 10901 10902 10903 10904 10905 10906 10907 10908 10909 10910 10911 10912 10913 10914 10915 10916 10917 10918 10919 10920 10921 10922 10923 10924 10925 10926 10927 10928 10929 10930 10931 10932 10933 10934 10935 10936 10937 10938 10939 10940 10941 10942 10943 10944 10945 10946 10947 10948 10949 10950 10951 10952 10953 10954 10955 10956 10957 10958 10959 10960 10961 10962 10963 10964 10965 10966 10967 10968 10969 10970 10971 10972 10973 10974 10975 10976 10977 10978 10979 10980 10981 10982 10983 10984 10985 10986 10987 10988 10989 10990 10991 10992 10993 10994 10995 10996 10997 10998 10999 11000 11001 11002 11003 11004 11005 11006 11007 11008 11009 11010 11011 11012 11013 11014 11015 11016 11017 11018 11019 11020 11021 11022 11023 11024 11025 11026 11027 11028 11029 11030 11031 11032 11033 11034 11035 11036 11037 11038 11039 11040 11041 11042 11043 11044 11045 11046 11047 11048 11049 11050 11051 11052 11053 11054 11055 11056 11057 11058 11059 11060 11061 11062 11063 11064 11065 11066 11067 11068 11069 11070 11071 11072 11073 11074 11075 11076 11077 11078 11079 11080 11081 11082 11083 11084 11085 11086 11087 11088 11089 11090 11091 11092 11093 11094 11095 11096 11097 11098 11099 11100 11101 11102 11103 11104 11105 11106 11107 11108 11109 11110 11111 11112 11113 11114 11115 11116 11117 11118 11119 11120 11121 11122 11123 11124 11125 11126 11127 11128 11129 11130 11131 11132 11133 11134 11135 11136 11137 11138 11139 11140 11141 11142 11143 11144 11145 11146 11147 11148 11149 11150 11151 11152 11153 11154 11155 11156 11157 11158 11159 11160 11161 11162 11163 11164 11165 11166 11167 11168 11169 11170 11171 11172 11173 11174 11175 11176 11177 11178 11179 11180 11181 11182 11183 11184 11185 11186 11187 11188 11189 11190 11191 11192 11193 11194 11195 11196 11197 11198 11199 11200 11201 11202 11203 11204 11205 11206 11207 11208 11209 11210 11211 11212 11213 11214 11215 11216 11217 11218 11219 11220 11221 11222 11223 11224 11225 11226 11227 11228 11229 11230 11231 11232 11233 11234 11235 11236 11237 11238 11239 11240 11241 11242 11243 11244 11245 11246 11247 11248 11249 11250 11251 11252 11253 11254 11255 11256 11257 11258 11259 11260 11261 11262 11263 11264 11265 11266 11267 11268 11269 11270 11271 11272 11273 11274 11275 11276 11277 11278 11279 11280 11281 11282 11283 11284 11285 11286 11287 11288 11289 11290 11291 11292 11293 11294 11295 11296 11297 11298 11299 11300 11301 11302 11303 11304 11305 11306 11307 11308 11309 11310 11311 11312 11313 11314 11315 11316 11317 11318 11319 11320 11321 11322 11323 11324 11325 11326 11327 11328 11329 11330 11331 11332 11333 11334 11335 11336 11337 11338 11339 11340 11341 11342 11343 11344 11345 11346 11347 11348 11349 11350 11351 11352 11353 11354 11355 11356 11357 11358 11359 11360 11361 11362 11363 11364 11365 11366 11367 11368 11369 11370 11371 11372 11373 11374 11375 11376 11377 11378 11379 11380 11381 11382 11383 11384 11385 11386 11387 11388 11389 11390 11391 11392 11393 11394 11395 11396 11397 11398 11399 11400 11401 11402 11403 11404 11405 11406 11407 11408 11409 11410 11411 11412 11413 11414 11415 11416 11417 11418 11419 11420 11421 11422 11423 11424 11425 11426 11427 11428 11429 11430 11431 11432 11433 11434 11435 11436 11437 11438 11439 11440 11441 11442 11443 11444 11445 11446 11447 11448 11449 11450 11451 11452 11453 11454 11455 11456 11457 11458 11459 11460 11461 11462 11463 11464 11465 11466 11467 11468 11469 11470 11471 11472 11473 11474 11475 11476 11477 11478 11479 11480 11481 11482 11483 11484 11485 11486 11487 11488 11489 11490 11491 11492 11493 11494 11495 11496 11497 11498 11499 11500 11501 11502 11503 11504 11505 11506 11507 11508 11509 11510 11511 11512 11513 11514 11515 11516 11517 11518 11519 11520 11521 11522 11523 11524 11525 11526 11527 11528 11529 11530 11531 11532 11533 11534 11535 11536 11537 11538 11539 11540 11541 11542 11543 11544 11545 11546 11547 11548 11549 11550 11551 11552 11553 11554 11555 11556 11557 11558 11559 11560 11561 11562 11563 11564 11565 11566 11567 11568 11569 11570 11571 11572 11573 11574 11575 11576 11577 11578 11579 11580 11581 11582 11583 11584 11585 11586 11587 11588 11589 11590 11591 11592 11593 11594 11595 11596 11597 11598 11599 11600 11601 11602 11603 11604 11605 11606 11607 11608 11609 11610 11611 11612 11613 11614 11615 11616 11617 11618 11619 11620 11621 11622 11623 11624 11625 11626 11627 11628 11629 11630 11631 11632 11633 11634 11635 11636 11637 11638 11639 11640 11641 11642 11643 11644 11645 11646 11647 11648 11649 11650 11651 11652 11653 11654 11655 11656 11657 11658 11659 11660 11661 11662 11663 11664 11665 11666 11667 11668 11669 11670 11671 11672 11673 11674 11675 11676 11677 11678 11679 11680 11681 11682 11683 11684 11685 11686 11687 11688 11689 11690 11691 11692 11693 11694 11695 11696 11697 11698 11699 11700 11701 11702 11703 11704 11705 11706 11707 11708 11709 11710 11711 11712 11713 11714 11715 11716 11717 11718 11719 11720 11721 11722 11723 11724 11725 11726 11727 11728 11729 11730 11731 11732 11733 11734 11735 11736 11737 11738 11739 11740 11741 11742 11743 11744 11745 11746 11747 11748 11749 11750 11751 11752 11753 11754 11755 11756 11757 11758 11759 11760 11761 11762 11763 11764 11765 11766 11767 11768 11769 11770 11771 11772 11773 11774 11775 11776 11777 11778 11779 11780 11781 11782 11783 11784 11785 11786 11787 11788 11789 11790 11791 11792 11793 11794 11795 11796 11797 11798 11799 11800 11801 11802 11803 11804 11805 11806 11807 11808 11809 11810 11811 11812 11813 11814 11815 11816 11817 11818 11819 11820 11821 11822 11823 11824 11825 11826 11827 11828 11829 11830 11831 11832 11833 11834 11835 11836 11837 11838 11839 11840 11841 11842 11843 11844 11845 11846 11847 11848 11849 11850 11851 11852 11853 11854 11855 11856 11857 11858 11859 11860 11861 11862 11863 11864 11865 11866 11867 11868 11869 11870 11871 11872 11873 11874 11875 11876 11877 11878 11879 11880 11881 11882 11883 11884 11885 11886 11887 11888 11889 11890 11891 11892 11893 11894 11895 11896 11897 11898 11899 11900 11901 11902 11903 11904 11905 11906 11907 11908 11909 11910 11911 11912 11913 11914 11915 11916 11917 11918 11919 11920 11921 11922 11923 11924 11925 11926 11927 11928 11929 11930 11931 11932 11933 11934 11935 11936 11937 11938 11939 11940 11941 11942 11943 11944 11945 11946 11947 11948 11949 11950 11951 11952 11953 11954 11955 11956 11957 11958 11959 11960 11961 11962 11963 11964 11965 11966 11967 11968 11969 11970 11971 11972 11973 11974 11975 11976 11977 11978 11979 11980 11981 11982 11983 11984 11985 11986 11987 11988 11989 11990 11991 11992 11993 11994 11995 11996 11997 11998 11999 12000 12001 12002 12003 12004 12005 12006 12007 12008 12009 12010 12011 12012 12013 12014 12015 12016 12017 12018 12019 12020 12021 12022 12023 12024 12025 12026 12027 12028 12029 12030 12031 12032 12033 12034 12035 12036 12037 12038 12039 12040 12041 12042 12043 12044 12045 12046 12047 12048 12049 12050 12051 12052 12053 12054 12055 12056 12057 12058 12059 12060 12061 12062 12063 12064 12065 12066 12067 12068 12069 12070 12071 12072 12073 12074 12075 12076 12077 12078 12079 12080 12081 12082 12083 12084 12085 12086 12087 12088 12089 12090 12091 12092 12093 12094 12095 12096 12097 12098 12099 12100 12101 12102 12103 12104 12105 12106 12107 12108 12109 12110 12111 12112 12113 12114 12115 12116 12117 12118 12119 12120 12121 12122 12123 12124 12125 12126 12127 12128 12129 12130 12131 12132 12133 12134 12135 12136 12137 12138 12139 12140 12141 12142 12143 12144 12145 12146 12147 12148 12149 12150 12151 12152 12153 12154 12155 12156 12157 12158 12159 12160 12161 12162 12163 12164 12165 12166 12167 12168 12169 12170 12171 12172 12173 12174 12175 12176 12177 12178 12179 12180 12181 12182 12183 12184 12185 12186 12187 12188 12189 12190 12191 12192 12193 12194 12195 12196 12197 12198 12199 12200 12201 12202 12203 12204 12205 12206 12207 12208 12209 12210 12211 12212 12213 12214 12215 12216 12217 12218 12219 12220 12221 12222 12223 12224 12225 12226 12227 12228 12229 12230 12231 12232 12233 12234 12235 12236 12237 12238 12239 12240 12241 12242 12243 12244 12245 12246 12247 12248 12249 12250 12251 12252 12253 12254 12255 12256 12257 12258 12259 12260 12261 12262 12263 12264 12265 12266 12267 12268 12269 12270 12271 12272 12273 12274 12275 12276 12277 12278 12279 12280 12281 12282 12283 12284 12285 12286 12287 12288 12289 12290 12291 12292 12293 12294 12295 12296 12297 12298 12299 12300 12301 12302 12303 12304 12305 12306 12307 12308 12309 12310 12311 12312 12313 12314 12315 12316 12317 12318 12319 12320 12321 12322 12323 12324 12325 12326 12327 12328 12329 12330 12331 12332 12333 12334 12335 12336 12337 12338 12339 12340 12341 12342 12343 12344 12345 12346 12347 12348 12349 12350 12351 12352 12353 12354 12355 12356 12357 12358 12359 12360 12361 12362 12363 12364 12365 12366 12367 12368 12369 12370 12371 12372 12373 12374 12375 12376 12377 12378 12379 12380 12381 12382 12383 12384 12385 12386 12387 12388 12389 12390 12391 12392 12393 12394 12395 12396 12397 12398 12399 12400 12401 12402 12403 12404 12405 12406 12407 12408 12409 12410 12411 12412 12413 12414 12415 12416 12417 12418 12419 12420 12421 12422 12423 12424 12425 12426 12427 12428 12429 12430 12431 12432 12433 12434 12435 12436 12437 12438 12439 12440 12441 12442 12443 12444 12445 12446 12447 12448 12449 12450 12451 12452 12453 12454 12455 12456 12457 12458 12459 12460 12461 12462 12463 12464 12465 12466 12467 12468 12469 12470 12471 12472 12473 12474 12475 12476 12477 12478 12479 12480 12481 12482 12483 12484 12485 12486 12487 12488 12489 12490 12491 12492 12493 12494 12495 12496 12497 12498 12499 12500 12501 12502 12503 12504 12505 12506 12507 12508 12509 12510 12511 12512 12513 12514 12515 12516 12517 12518 12519 12520 12521 12522 12523 12524 12525 12526 12527 12528 12529 12530 12531 12532 12533 12534 12535 12536 12537 12538 12539 12540 12541 12542 12543 12544 12545 12546 12547 12548 12549 12550 12551 12552 12553 12554 12555 12556 12557 12558 12559 12560 12561 12562 12563 12564 12565 12566 12567 12568 12569 12570 12571 12572 12573 12574 12575 12576 12577 12578 12579 12580 12581 12582 12583 12584 12585 12586 12587 12588 12589 12590 12591 12592 12593 12594 12595 12596 12597 12598 12599 12600 12601 12602 12603 12604 12605 12606 12607 12608 12609 12610 12611 12612 12613 12614 12615 12616 12617 12618 12619 12620 12621 12622 12623 12624 12625 12626 12627 12628 12629 12630 12631 12632 12633 12634 12635 12636 12637 12638 12639 12640 12641 12642 12643 12644 12645 12646 12647 12648 12649 12650 12651 12652 12653 12654 12655 12656 12657 12658 12659 12660 12661 12662 12663 12664 12665 12666 12667 12668 12669 12670 12671 12672 12673 12674 12675 12676 12677 12678 12679 12680 12681 12682 12683 12684 12685 12686 12687 12688 12689 12690 12691 12692 12693 12694 12695 12696 12697 12698 12699 12700 12701 12702 12703 12704 12705 12706 12707 12708 12709 12710 12711 12712 12713 12714 12715 12716 12717 12718 12719 12720 12721 12722 12723 12724 12725 12726 12727 12728 12729 12730 12731 12732 12733 12734 12735 12736 12737 12738 12739 12740 12741 12742 12743 12744 12745 12746 12747 12748 12749 12750 12751 12752 12753 12754 12755 12756 12757 12758 12759 12760 12761 12762 12763 12764 12765 12766 12767 12768 12769 12770 12771 12772 12773 12774 12775 12776 12777 12778 12779 12780 12781 12782 12783 12784 12785 12786 12787 12788 12789 12790 12791 12792 12793 12794 12795 12796 12797 12798 12799 12800 12801 12802 12803 12804 12805 12806 12807 12808 12809 12810 12811 12812 12813 12814 12815 12816 12817 12818 12819 12820 12821 12822 12823 12824 12825 12826 12827 12828 12829 12830 12831 12832 12833 12834 12835 12836 12837 12838 12839 12840 12841 12842 12843 12844 12845 12846 12847 12848 12849 12850 12851 12852 12853 12854 12855 12856 12857 12858 12859 12860 12861 12862 12863 12864 12865 12866 12867 12868 12869 12870 12871 12872 12873 12874 12875 12876 12877 12878 12879 12880 12881 12882 12883 12884 12885 12886 12887 12888 12889 12890 12891 12892 12893 12894 12895 12896 12897 12898 12899 12900 12901 12902 12903 12904 12905 12906 12907 12908 12909 12910 12911 12912 12913 12914 12915 12916 12917 12918 12919 12920 12921 12922 12923 12924 12925 12926 12927 12928 12929 12930 12931 12932 12933 12934 12935 12936 12937 12938 12939 12940 12941 12942 12943 12944 12945 12946 12947 12948 12949 12950 12951 12952 12953 12954 12955 12956 12957 12958 12959 12960 12961 12962 12963 12964 12965 12966 12967 12968 12969 12970 12971 12972 12973 12974 12975 12976 12977 12978 12979 12980 12981 12982 12983 12984 12985 12986 12987 12988 12989 12990 12991 12992 12993 12994 12995 12996 12997 12998 12999 13000 13001 13002 13003 13004 13005 13006 13007 13008 13009 13010 13011 13012 13013 13014 13015 13016 13017 13018 13019 13020 13021 13022 13023 13024 13025 13026 13027 13028 13029 13030 13031 13032 13033 13034 13035 13036 13037 13038 13039 13040 13041 13042 13043 13044 13045 13046 13047 13048 13049 13050 13051 13052 13053 13054 13055 13056 13057 13058 13059 13060 13061 13062 13063 13064 13065 13066 13067 13068 13069 13070 13071 13072 13073 13074 13075 13076 13077 13078 13079 13080 13081 13082 13083 13084 13085 13086 13087 13088 13089 13090 13091 13092 13093 13094 13095 13096 13097 13098 13099 13100 13101 13102 13103 13104 13105 13106 13107 13108 13109 13110 13111 13112 13113 13114 13115 13116 13117 13118 13119 13120 13121 13122 13123 13124 13125 13126 13127 13128 13129 13130 13131 13132 13133 13134 13135 13136 13137 13138 13139 13140 13141 13142 13143 13144 13145 13146 13147 13148 13149 13150 13151 13152 13153 13154 13155 13156 13157 13158 13159 13160 13161 13162 13163 13164 13165 13166 13167 13168 13169 13170 13171 13172 13173 13174 13175 13176 13177 13178 13179 13180 13181 13182 13183 13184 13185 13186 13187 13188 13189 13190 13191 13192 13193 13194 13195 13196 13197 13198 13199 13200 13201 13202 13203 13204 13205 13206 13207 13208 13209 13210 13211 13212 13213 13214 13215 13216 13217 13218 13219 13220 13221 13222 13223 13224 13225 13226 13227 13228 13229 13230 13231 13232 13233 13234 13235 13236 13237 13238 13239 13240 13241 13242 13243 13244 13245 13246 13247 13248 13249 13250 13251 13252 13253 13254 13255 13256 13257 13258 13259 13260 13261 13262 13263 13264 13265 13266 13267 13268 13269 13270 13271 13272 13273 13274 13275 13276 13277 13278 13279 13280 13281 13282 13283 13284 13285 13286 13287 13288 13289 13290 13291 13292 13293 13294 13295 13296 13297 13298 13299 13300 13301 13302 13303 13304 13305 13306 13307 13308 13309 13310 13311 13312 13313 13314 13315 13316 13317 13318 13319 13320 13321 13322 13323 13324 13325 13326 13327 13328 13329 13330 13331 13332 13333 13334 13335 13336 13337 13338 13339 13340 13341 13342 13343 13344 13345 13346 13347 13348 13349 13350 13351 13352 13353 13354 13355 13356 13357 13358 13359 13360 13361 13362 13363 13364 13365 13366 13367 13368 13369 13370 13371 13372 13373 13374 13375 13376 13377 13378 13379 13380 13381 13382 13383 13384 13385 13386 13387 13388 13389 13390 13391 13392 13393 13394 13395 13396 13397 13398 13399 13400 13401 13402 13403 13404 13405 13406 13407 13408 13409 13410 13411 13412 13413 13414 13415 13416 13417 13418 13419 13420 13421 13422 13423 13424 13425 13426 13427 13428 13429 13430 13431 13432 13433 13434 13435 13436 13437 13438 13439 13440 13441 13442 13443 13444 13445 13446 13447 13448 13449 13450 13451 13452 13453 13454 13455 13456 13457 13458 13459 13460 13461 13462 13463 13464 13465 13466 13467 13468 13469 13470 13471 13472 13473 13474 13475 13476 13477 13478 13479 13480 13481 13482 13483 13484 13485 13486 13487 13488 13489 13490 13491 13492 13493 13494 13495 13496 13497 13498 13499 13500 13501 13502 13503 13504 13505 13506 13507 13508 13509 13510 13511 13512 13513 13514 13515 13516 13517 13518 13519 13520 13521 13522 13523 13524 13525 13526 13527 13528 13529 13530 13531 13532 13533 13534 13535 13536 13537 13538 13539 13540 13541 13542 13543 13544 13545 13546 13547 13548 13549 13550 13551 13552 13553 13554 13555 13556 13557 13558 13559 13560 13561 13562 13563 13564 13565 13566 13567 13568 13569 13570 13571 13572 13573 13574 13575 13576 13577 13578 13579 13580 13581 13582 13583 13584 13585 13586 13587 13588 13589 13590 13591 13592 13593 13594 13595 13596 13597 13598 13599 13600 13601 13602 13603 13604 13605 13606 13607 13608 13609 13610 13611 13612 13613 13614 13615 13616 13617 13618 13619 13620 13621 13622 13623 13624 13625 13626 13627 13628 13629 13630 13631 13632 13633 13634 13635 13636 13637 13638 13639 13640 13641 13642 13643 13644 13645 13646 13647 13648 13649 13650 13651 13652 13653 13654 13655 13656 13657 13658 13659 13660 13661 13662 13663 13664 13665 13666 13667 13668 13669 13670 13671 13672 13673 13674 13675 13676 13677 13678 13679 13680 13681 13682 13683 13684 13685 13686 13687 13688 13689 13690 13691 13692 13693 13694 13695 13696 13697 13698 13699 13700 13701 13702 13703 13704 13705 13706 13707 13708 13709 13710 13711 13712 13713 13714 13715 13716 13717 13718 13719 13720 13721 13722 13723 13724 13725 13726 13727 13728 13729 13730 13731 13732 13733 13734 13735 13736 13737 13738 13739 13740 13741 13742 13743 13744 13745 13746 13747 13748 13749 13750 13751 13752 13753 13754 13755 13756 13757 13758 13759 13760 13761 13762 13763 13764 13765 13766 13767 13768 13769 13770 13771 13772 13773 13774 13775 13776 13777 13778 13779 13780 13781 13782 13783 13784 13785 13786 13787 13788 13789 13790 13791 13792 13793 13794 13795 13796 13797 13798 13799 13800 13801 13802 13803 13804 13805 13806 13807 13808 13809 13810 13811 13812 13813 13814 13815 13816 13817 13818 13819 13820 13821 13822 13823 13824 13825 13826 13827 13828 13829 13830 13831 13832 13833 13834 13835 13836 13837 13838 13839 13840 13841 13842 13843 13844 13845 13846 13847 13848 13849 13850 13851 13852 13853 13854 13855 13856 13857 13858 13859 13860 13861 13862 13863 13864 13865 13866 13867 13868 13869 13870 13871 13872 13873 13874 13875 13876 13877 13878 13879 13880 13881 13882 13883 13884 13885 13886 13887 13888 13889 13890 13891 13892 13893 13894 13895 13896 13897 13898 13899 13900 13901 13902 13903 13904 13905 13906 13907 13908 13909 13910 13911 13912 13913 13914 13915 13916 13917 13918 13919 13920 13921 13922 13923 13924 13925 13926 13927 13928 13929 13930 13931 13932 13933 13934 13935 13936 13937 13938 13939 13940 13941 13942 13943 13944 13945 13946 13947 13948 13949 13950 13951 13952 13953 13954 13955 13956 13957 13958 13959 13960 13961 13962 13963 13964 13965 13966 13967 13968 13969 13970 13971 13972 13973 13974 13975 13976 13977 13978 13979 13980 13981 13982 13983 13984 13985 13986 13987 13988 13989 13990 13991 13992 13993 13994 13995 13996 13997 13998 13999 14000 14001 14002 14003 14004 14005 14006 14007 14008 14009 14010 14011 14012 14013 14014 14015 14016 14017 14018 14019 14020 14021 14022 14023 14024 14025 14026 14027 14028 14029 14030 14031 14032 14033 14034 14035 14036 14037 14038 14039 14040 14041 14042 14043 14044 14045 14046 14047 14048 14049 14050 14051 14052 14053 14054 14055 14056 14057 14058 14059 14060 14061 14062 14063 14064 14065 14066 14067 14068 14069 14070 14071 14072 14073 14074 14075 14076 14077 14078 14079 14080 14081 14082 14083 14084 14085 14086 14087 14088 14089 14090 14091 14092 14093 14094 14095 14096 14097 14098 14099 14100 14101 14102 14103 14104 14105 14106 14107 14108 14109 14110 14111 14112 14113 14114 14115 14116 14117 14118 14119 14120 14121 14122 14123 14124 14125 14126 14127 14128 14129 14130 14131 14132 14133 14134 14135 14136 14137 14138 14139 14140 14141 14142 14143 14144 14145 14146 14147 14148 14149 14150 14151 14152 14153 14154 14155 14156 14157 14158 14159 14160 14161 14162 14163 14164 14165 14166 14167 14168 14169 14170 14171 14172 14173 14174 14175 14176 14177 14178 14179 14180 14181 14182 14183 14184 14185 14186 14187 14188 14189 14190 14191 14192 14193 14194 14195 14196 14197 14198 14199 14200 14201 14202 14203 14204 14205 14206 14207 14208 14209 14210 14211 14212 14213 14214 14215 14216 14217 14218 14219 14220 14221 14222 14223 14224 14225 14226 14227 14228 14229 14230 14231 14232 14233 14234 14235 14236 14237 14238 14239 14240 14241 14242 14243 14244 14245 14246 14247 14248 14249 14250 14251 14252 14253 14254 14255 14256 14257 14258 14259 14260 14261 14262 14263 14264 14265 14266 14267 14268 14269 14270 14271 14272 14273 14274 14275 14276 14277 14278 14279 14280 14281 14282 14283 14284 14285 14286 14287 14288 14289 14290 14291 14292 14293 14294 14295 14296 14297 14298 14299 14300 14301 14302 14303 14304 14305 14306 14307 14308 14309 14310 14311 14312 14313 14314 14315 14316 14317 14318 14319 14320 14321 14322 14323 14324 14325 14326 14327 14328 14329 14330 14331 14332 14333 14334 14335 14336 14337 14338 14339 14340 14341 14342 14343 14344 14345 14346 14347 14348 14349 14350 14351 14352 14353 14354 14355 14356 14357 14358 14359 14360 14361 14362 14363 14364 14365 14366 14367 14368 14369 14370 14371 14372 14373 14374 14375 14376 14377 14378 14379 14380 14381 14382 14383 14384 14385 14386 14387 14388 14389 14390 14391 14392 14393 14394 14395 14396 14397 14398 14399 14400 14401 14402 14403 14404 14405 14406 14407 14408 14409 14410 14411 14412 14413 14414 14415 14416 14417 14418 14419 14420 14421 14422 14423 14424 14425 14426 14427 14428 14429 14430 14431 14432 14433 14434 14435 14436 14437 14438 14439 14440 14441 14442 14443 14444 14445 14446 14447 14448 14449 14450 14451 14452 14453 14454 14455 14456 14457 14458 14459 14460 14461 14462 14463 14464 14465 14466 14467 14468 14469 14470 14471 14472 14473 14474 14475 14476 14477 14478 14479 14480 14481 14482 14483 14484 14485 14486 14487 14488 14489 14490 14491 14492 14493 14494 14495 14496 14497 14498 14499 14500 14501 14502 14503 14504 14505 14506 14507 14508 14509 14510 14511 14512 14513 14514 14515 14516 14517 14518 14519 14520 14521 14522 14523 14524 14525 14526 14527 14528 14529 14530 14531 14532 14533 14534 14535 14536 14537 14538 14539 14540 14541 14542 14543 14544 14545 14546 14547 14548 14549 14550 14551 14552 14553 14554 14555 14556 14557 14558 14559 14560 14561 14562 14563 14564 14565 14566 14567 14568 14569 14570 14571 14572 14573 14574 14575 14576 14577 14578 14579 14580 14581 14582 14583 14584 14585 14586 14587 14588 14589 14590 14591 14592 14593 14594 14595 14596 14597 14598 14599 14600 14601 14602 14603 14604 14605 14606 14607 14608 14609 14610 14611 14612 14613 14614 14615 14616 14617 14618 14619 14620 14621 14622 14623 14624 14625 14626 14627 14628 14629 14630 14631 14632 14633 14634 14635 14636 14637 14638 14639 14640 14641 14642 14643 14644 14645 14646 14647 14648 14649 14650 14651 14652 14653 14654 14655 14656 14657 14658 14659 14660 14661 14662 14663 14664 14665 14666 14667 14668 14669 14670 14671 14672 14673 14674 14675 14676 14677 14678 14679 14680 14681 14682 14683 14684 14685 14686 14687 14688 14689 14690 14691 14692 14693 14694 14695 14696 14697 14698 14699 14700 14701 14702 14703 14704 14705 14706 14707 14708 14709 14710 14711 14712 14713 14714 14715 14716 14717 14718 14719 14720 14721 14722 14723 14724 14725 14726 14727 14728 14729 14730 14731 14732 14733 14734 14735 14736 14737 14738 14739 14740 14741 14742 14743 14744 14745 14746 14747 14748 14749 14750 14751 14752 14753 14754 14755 14756 14757 14758 14759 14760 14761 14762 14763 14764 14765 14766 14767 14768 14769 14770 14771 14772 14773 14774 14775 14776 14777 14778 14779 14780 14781 14782 14783 14784 14785 14786 14787 14788 14789 14790 14791 14792 14793 14794 14795 14796 14797 14798 14799 14800 14801 14802 14803 14804 14805 14806 14807 14808 14809 14810 14811 14812 14813 14814 14815 14816 14817 14818 14819 14820 14821 14822 14823 14824 14825 14826 14827 14828 14829 14830 14831 14832 14833 14834 14835 14836 14837 14838 14839 14840 14841 14842 14843 14844 14845 14846 14847 14848 14849 14850 14851 14852 14853 14854 14855 14856 14857 14858 14859 14860 14861 14862 14863 14864 14865 14866 14867 14868 14869 14870 14871 14872 14873 14874 14875 14876 14877 14878 14879 14880 14881 14882 14883 14884 14885 14886 14887 14888 14889 14890 14891 14892 14893 14894 14895 14896 14897 14898 14899 14900 14901 14902 14903 14904 14905 14906 14907 14908 14909 14910 14911 14912 14913 14914 14915 14916 14917 14918 14919 14920 14921 14922 14923 14924 14925 14926 14927 14928 14929 14930 14931 14932 14933 14934 14935 14936 14937 14938 14939 14940 14941 14942 14943 14944 14945 14946 14947 14948 14949 14950 14951 14952 14953 14954 14955 14956 14957 14958 14959 14960 14961 14962 14963 14964 14965 14966 14967 14968 14969 14970 14971 14972 14973 14974 14975 14976 14977 14978 14979 14980 14981 14982 14983 14984 14985 14986 14987 14988 14989 14990 14991 14992 14993 14994 14995 14996 14997 14998 14999 15000 15001 15002 15003 15004 15005 15006 15007 15008 15009 15010 15011 15012 15013 15014 15015 15016 15017 15018 15019 15020 15021 15022 15023 15024 15025 15026 15027 15028 15029 15030 15031 15032 15033 15034 15035 15036 15037 15038 15039 15040 15041 15042 15043 15044 15045 15046 15047 15048 15049 15050 15051 15052 15053 15054 15055 15056 15057 15058 15059 15060 15061 15062 15063 15064 15065 15066 15067 15068 15069 15070 15071 15072 15073 15074 15075 15076 15077 15078 15079 15080 15081 15082 15083 15084 15085 15086 15087 15088 15089 15090 15091 15092 15093 15094 15095 15096 15097 15098 15099 15100 15101 15102 15103 15104 15105 15106 15107 15108 15109 15110 15111 15112 15113 15114 15115 15116 15117 15118 15119 15120 15121 15122 15123 15124 15125 15126 15127 15128 15129 15130 15131 15132 15133 15134 15135 15136 15137 15138 15139 15140 15141 15142 15143 15144 15145 15146 15147 15148 15149 15150 15151 15152 15153 15154 15155 15156 15157 15158 15159 15160 15161 15162 15163 15164 15165 15166 15167 15168 15169 15170 15171 15172 15173 15174 15175 15176 15177 15178 15179 15180 15181 15182 15183 15184 15185 15186 15187 15188 15189 15190 15191 15192 15193 15194 15195 15196 15197 15198 15199 15200 15201 15202 15203 15204 15205 15206 15207 15208 15209 15210 15211 15212 15213 15214 15215 15216 15217 15218 15219 15220 15221 15222 15223 15224 15225 15226 15227 15228 15229 15230 15231 15232 15233 15234 15235 15236 15237 15238 15239 15240 15241 15242 15243 15244 15245 15246 15247 15248 15249 15250 15251 15252 15253 15254 15255 15256 15257 15258 15259 15260 15261 15262 15263 15264 15265 15266 15267 15268 15269 15270 15271 15272 15273 15274 15275 15276 15277 15278 15279 15280 15281 15282 15283 15284 15285 15286 15287 15288 15289 15290 15291 15292 15293 15294 15295 15296 15297 15298 15299 15300 15301 15302 15303 15304 15305 15306 15307 15308 15309 15310 15311 15312 15313 15314 15315 15316 15317 15318 15319 15320 15321 15322 15323 15324 15325 15326 15327 15328 15329 15330 15331 15332 15333 15334 15335 15336 15337 15338 15339 15340 15341 15342 15343 15344 15345 15346 15347 15348 15349 15350 15351 15352 15353 15354 15355 15356 15357 15358 15359 15360 15361 15362 15363 15364 15365 15366 15367 15368 15369 15370 15371 15372 15373 15374 15375 15376 15377 15378 15379 15380 15381 15382 15383 15384 15385 15386 15387 15388 15389 15390 15391 15392 15393 15394 15395 15396 15397 15398 15399 15400 15401 15402 15403 15404 15405 15406 15407 15408 15409 15410 15411 15412 15413 15414 15415 15416 15417 15418 15419 15420 15421 15422 15423 15424 15425 15426 15427 15428 15429 15430 15431 15432 15433 15434 15435 15436 15437 15438 15439 15440 15441 15442 15443 15444 15445 15446 15447 15448 15449 15450 15451 15452 15453 15454 15455 15456 15457 15458 15459 15460 15461 15462 15463 15464 15465 15466 15467 15468 15469 15470 15471 15472 15473 15474 15475 15476 15477 15478 15479 15480 15481 15482 15483 15484 15485 15486 15487 15488 15489 15490 15491 15492 15493 15494 15495 15496 15497 15498 15499 15500 15501 15502 15503 15504 15505 15506 15507 15508 15509 15510 15511 15512 15513 15514 15515 15516 15517 15518 15519 15520 15521 15522 15523 15524 15525 15526 15527 15528 15529 15530 15531 15532 15533 15534 15535 15536 15537 15538 15539 15540 15541 15542 15543 15544 15545 15546 15547 15548 15549 15550 15551 15552 15553 15554 15555 15556 15557 15558 15559 15560 15561 15562 15563 15564 15565 15566 15567 15568 15569 15570 15571 15572 15573 15574 15575 15576 15577 15578 15579 15580 15581 15582 15583 15584 15585 15586 15587 15588 15589 15590 15591 15592 15593 15594 15595 15596 15597 15598 15599 15600 15601 15602 15603 15604 15605 15606 15607 15608 15609 15610 15611 15612 15613 15614 15615 15616 15617 15618 15619 15620 15621 15622 15623 15624 15625 15626 15627 15628 15629 15630 15631 15632 15633 15634 15635 15636 15637 15638 15639 15640 15641 15642 15643 15644 15645 15646 15647 15648 15649 15650 15651 15652 15653 15654 15655 15656 15657 15658 15659 15660 15661 15662 15663 15664 15665 15666 15667 15668 15669 15670 15671 15672 15673 15674 15675 15676 15677 15678 15679 15680 15681 15682 15683 15684 15685 15686 15687 15688 15689 15690 15691 15692 15693 15694 15695 15696 15697 15698 15699 15700 15701 15702 15703 15704 15705 15706 15707 15708 15709 15710 15711 15712 15713 15714 15715 15716 15717 15718 15719 15720 15721 15722 15723 15724 15725 15726 15727 15728 15729 15730 15731 15732 15733 15734 15735 15736 15737 15738 15739 15740 15741 15742 15743 15744 15745 15746 15747 15748 15749 15750 15751 15752 15753 15754 15755 15756 15757 15758 15759 15760 15761 15762 15763 15764 15765 15766 15767 15768 15769 15770 15771 15772 15773 15774 15775 15776 15777 15778 15779 15780 15781 15782 15783 15784 15785 15786 15787 15788 15789 15790 15791 15792 15793 15794 15795 15796 15797 15798 15799 15800 15801 15802 15803 15804 15805 15806 15807 15808 15809 15810 15811 15812 15813 15814 15815 15816 15817 15818 15819 15820 15821 15822 15823 15824 15825 15826 15827 15828 15829 15830 15831 15832 15833 15834 15835 15836 15837 15838 15839 15840 15841 15842 15843 15844 15845 15846 15847 15848 15849 15850 15851 15852 15853 15854 15855 15856 15857 15858 15859 15860 15861 15862 15863 15864 15865 15866 15867 15868 15869 15870 15871 15872 15873 15874 15875 15876 15877 15878 15879 15880 15881 15882 15883 15884 15885 15886 15887 15888 15889 15890 15891 15892 15893 15894 15895 15896 15897 15898 15899 15900 15901 15902 15903 15904 15905 15906 15907 15908 15909 15910 15911 15912 15913 15914 15915 15916 15917 15918 15919 15920 15921 15922 15923 15924 15925 15926 15927 15928 15929 15930 15931 15932 15933 15934 15935 15936 15937 15938 15939 15940 15941 15942 15943 15944 15945 15946 15947 15948 15949 15950 15951 15952 15953 15954 15955 15956 15957 15958 15959 15960 15961 15962 15963 15964 15965 15966 15967 15968 15969 15970 15971 15972 15973 15974 15975 15976 15977 15978 15979 15980 15981 15982 15983 15984 15985 15986 15987 15988 15989 15990 15991 15992 15993 15994 15995 15996 15997 15998 15999 16000 16001 16002 16003 16004 16005 16006 16007 16008 16009 16010 16011 16012 16013 16014 16015 16016 16017 16018 16019 16020 16021 16022 16023 16024 16025 16026 16027 16028 16029 16030 16031 16032 16033 16034 16035 16036 16037 16038 16039 16040 16041 16042 16043 16044 16045 16046 16047 16048 16049 16050 16051 16052 16053 16054 16055 16056 16057 16058 16059 16060 16061 16062 16063 16064 16065 16066 16067 16068 16069 16070 16071 16072 16073 16074 16075 16076 16077 16078 16079 16080 16081 16082 16083 16084 16085 16086 16087 16088 16089 16090 16091 16092 16093 16094 16095 16096 16097 16098 16099 16100 16101 16102 16103 16104 16105 16106 16107 16108 16109 16110 16111 16112 16113 16114 16115 16116 16117 16118 16119 16120 16121 16122 16123 16124 16125 16126 16127 16128 16129 16130 16131 16132 16133 16134 16135 16136 16137 16138 16139 16140 16141 16142 16143 16144 16145 16146 16147 16148 16149 16150 16151 16152 16153 16154 16155 16156 16157 16158 16159 16160 16161 16162 16163 16164 16165 16166 16167 16168 16169 16170 16171 16172 16173 16174 16175 16176 16177 16178 16179 16180 16181 16182 16183 16184 16185 16186 16187 16188 16189 16190 16191 16192 16193 16194 16195 16196 16197 16198 16199 16200 16201 16202 16203 16204 16205 16206 16207 16208 16209 16210 16211 16212 16213 16214 16215 16216 16217 16218 16219 16220 16221 16222 16223 16224 16225 16226 16227 16228 16229 16230 16231 16232 16233 16234 16235 16236 16237 16238 16239 16240 16241 16242 16243 16244 16245 16246 16247 16248 16249 16250 16251 16252 16253 16254 16255 16256 16257 16258 16259 16260 16261 16262 16263 16264 16265 16266 16267 16268 16269 16270 16271 16272 16273 16274 16275 16276 16277 16278 16279 16280 16281 16282 16283 16284 16285 16286 16287 16288 16289 16290 16291 16292 16293 16294 16295 16296 16297 16298 16299 16300 16301 16302 16303 16304 16305 16306 16307 16308 16309 16310 16311 16312 16313 16314 16315 16316 16317 16318 16319 16320 16321 16322 16323 16324 16325 16326 16327 16328 16329 16330 16331 16332 16333 16334 16335 16336 16337 16338 16339 16340 16341 16342 16343 16344 16345 16346 16347 16348 16349 16350 16351 16352 16353 16354 16355 16356 16357 16358 16359 16360 16361 16362 16363 16364 16365 16366 16367 16368 16369 16370 16371 16372 16373 16374 16375 16376 16377 16378 16379 16380 16381 16382 16383 16384 16385 16386 16387 16388 16389 16390 16391 16392 16393 16394 16395 16396 16397 16398 16399 16400 16401 16402 16403 16404 16405 16406 16407 16408 16409 16410 16411 16412 16413 16414 16415 16416 16417 16418 16419 16420 16421 16422 16423 16424 16425 16426 16427 16428 16429 16430 16431 16432 16433 16434 16435 16436 16437 16438 16439 16440 16441 16442 16443 16444 16445 16446 16447 16448 16449 16450 16451 16452 16453 16454 16455 16456 16457 16458 16459 16460 16461 16462 16463 16464 16465 16466 16467 16468 16469 16470 16471 16472 16473 16474 16475 16476 16477 16478 16479 16480 16481 16482 16483 16484 16485 16486 16487 16488 16489 16490 16491 16492 16493 16494 16495 16496 16497 16498 16499 16500 16501 16502 16503 16504 16505 16506 16507 16508 16509 16510 16511 16512 16513 16514 16515 16516 16517 16518 16519 16520 16521 16522 16523 16524 16525 16526 16527 16528 16529 16530 16531 16532 16533 16534 16535 16536 16537 16538 16539 16540 16541 16542 16543 16544 16545 16546 16547 16548 16549 16550 16551 16552 16553 16554 16555 16556 16557 16558 16559 16560 16561 16562 16563 16564 16565 16566 16567 16568 16569 16570 16571 16572 16573 16574 16575 16576 16577 16578 16579 16580 16581 16582 16583 16584 16585 16586 16587 16588 16589 16590 16591 16592 16593 16594 16595 16596 16597 16598 16599 16600 16601 16602 16603 16604 16605 16606 16607 16608 16609 16610 16611 16612 16613 16614 16615 16616 16617 16618 16619 16620 16621 16622 16623 16624 16625 16626 16627 16628 16629 16630 16631 16632 16633 16634 16635 16636 16637 16638 16639 16640 16641 16642 16643 16644 16645 16646 16647 16648 16649 16650 16651 16652 16653 16654 16655 16656 16657 16658 16659 16660 16661 16662 16663 16664 16665 16666 16667 16668 16669 16670 16671 16672 16673 16674 16675 16676 16677 16678 16679 16680 16681 16682 16683 16684 16685 16686 16687 16688 16689 16690 16691 16692 16693 16694 16695 16696 16697 16698 16699 16700 16701 16702 16703 16704 16705 16706 16707 16708 16709 16710 16711 16712 16713 16714 16715 16716 16717 16718 16719 16720 16721 16722 16723 16724 16725 16726 16727 16728 16729 16730 16731 16732 16733 16734 16735 16736 16737 16738 16739 16740 16741 16742 16743 16744 16745 16746 16747 16748 16749 16750 16751 16752 16753 16754 16755 16756 16757 16758 16759 16760 16761 16762 16763 16764 16765 16766 16767 16768 16769 16770 16771 16772 16773 16774 16775 16776 16777 16778 16779 16780 16781 16782 16783 16784 16785 16786 16787 16788 16789 16790 16791 16792 16793 16794 16795 16796 16797 16798 16799 16800 16801 16802 16803 16804 16805 16806 16807 16808 16809 16810 16811 16812 16813 16814 16815 16816 16817 16818 16819 16820 16821 16822 16823 16824 16825 16826 16827 16828 16829 16830 16831 16832 16833 16834 16835 16836 16837 16838 16839 16840 16841 16842 16843 16844 16845 16846 16847 16848 16849 16850 16851 16852 16853 16854 16855 16856 16857 16858 16859 16860 16861 16862 16863 16864 16865 16866 16867 16868 16869 16870 16871 16872 16873 16874 16875 16876 16877 16878 16879 16880 16881 16882 16883 16884 16885 16886 16887 16888 16889 16890 16891 16892 16893 16894 16895 16896 16897 16898 16899 16900 16901 16902 16903 16904 16905 16906 16907 16908 16909 16910 16911 16912 16913 16914 16915 16916 16917 16918 16919 16920 16921 16922 16923 16924 16925 16926 16927 16928 16929 16930 16931 16932 16933 16934 16935 16936 16937 16938 16939 16940 16941 16942 16943 16944 16945 16946 16947 16948 16949 16950 16951 16952 16953 16954 16955 16956 16957 16958 16959 16960 16961 16962 16963 16964 16965 16966 16967 16968 16969 16970 16971 16972 16973 16974 16975 16976 16977 16978 16979 16980 16981 16982 16983 16984 16985 16986 16987 16988 16989 16990 16991 16992 16993 16994 16995 16996 16997 16998 16999 17000 17001 17002 17003 17004 17005 17006 17007 17008 17009 17010 17011 17012 17013 17014 17015 17016 17017 17018 17019 17020 17021 17022 17023 17024 17025 17026 17027 17028 17029 17030 17031 17032 17033 17034 17035 17036 17037 17038 17039 17040 17041 17042 17043 17044 17045 17046 17047 17048 17049 17050 17051 17052 17053 17054 17055 17056 17057 17058 17059 17060 17061 17062 17063 17064 17065 17066 17067 17068 17069 17070 17071 17072 17073 17074 17075 17076 17077 17078 17079 17080 17081 17082 17083 17084 17085 17086 17087 17088 17089 17090 17091 17092 17093 17094 17095 17096 17097 17098 17099 17100 17101 17102 17103 17104 17105 17106 17107 17108 17109 17110 17111 17112 17113 17114 17115 17116 17117 17118 17119 17120 17121 17122 17123 17124 17125 17126 17127 17128 17129 17130 17131 17132 17133 17134 17135 17136 17137 17138 17139 17140 17141 17142 17143 17144 17145 17146 17147 17148 17149 17150 17151 17152 17153 17154 17155 17156 17157 17158 17159 17160 17161 17162 17163 17164 17165 17166 17167 17168 17169 17170 17171 17172 17173 17174 17175 17176 17177 17178 17179 17180 17181 17182 17183 17184 17185 17186 17187 17188 17189 17190 17191 17192 17193 17194 17195 17196 17197 17198 17199 17200 17201 17202 17203 17204 17205 17206 17207 17208 17209 17210 17211 17212 17213 17214 17215 17216 17217 17218 17219 17220 17221 17222 17223 17224 17225 17226 17227 17228 17229 17230 17231 17232 17233 17234 17235 17236 17237 17238 17239 17240 17241 17242 17243 17244 17245 17246 17247 17248 17249 17250 17251 17252 17253 17254 17255 17256 17257 17258 17259 17260 17261 17262 17263 17264 17265 17266 17267 17268 17269 17270 17271 17272 17273 17274 17275 17276 17277 17278 17279 17280 17281 17282 17283 17284 17285 17286 17287 17288 17289 17290 17291 17292 17293 17294 17295 17296 17297 17298 17299 17300 17301 17302 17303 17304 17305 17306 17307 17308 17309 17310 17311 17312 17313 17314 17315 17316 17317 17318 17319 17320 17321 17322 17323 17324 17325 17326 17327 17328 17329 17330 17331 17332 17333 17334 17335 17336 17337 17338 17339 17340 17341 17342 17343 17344 17345 17346 17347 17348 17349 17350 17351 17352 17353 17354 17355 17356 17357 17358 17359 17360 17361 17362 17363 17364 17365 17366 17367 17368 17369 17370 17371 17372 17373 17374 17375 17376 17377 17378 17379 17380 17381 17382 17383 17384 17385 17386 17387 17388 17389 17390 17391 17392 17393 17394 17395 17396 17397 17398 17399 17400 17401 17402 17403 17404 17405 17406 17407 17408 17409 17410 17411 17412 17413 17414 17415 17416 17417 17418 17419 17420 17421 17422 17423 17424 17425 17426 17427 17428 17429 17430 17431 17432 17433 17434 17435 17436 17437 17438 17439 17440 17441 17442 17443 17444 17445 17446 17447 17448 17449 17450 17451 17452 17453 17454 17455 17456 17457 17458 17459 17460 17461 17462 17463 17464 17465 17466 17467 17468 17469 17470 17471 17472 17473 17474 17475 17476 17477 17478 17479 17480 17481 17482 17483 17484 17485 17486 17487 17488 17489 17490 17491 17492 17493 17494 17495 17496 17497 17498 17499 17500 17501 17502 17503 17504 17505 17506 17507 17508 17509 17510 17511 17512 17513 17514 17515 17516 17517 17518 17519 17520 17521 17522 17523 17524 17525 17526 17527 17528 17529 17530 17531 17532 17533 17534 17535 17536 17537 17538 17539 17540 17541 17542 17543 17544 17545 17546 17547 17548 17549 17550 17551 17552 17553 17554 17555 17556 17557 17558 17559 17560 17561 17562 17563 17564 17565 17566 17567 17568 17569 17570 17571 17572 17573 17574 17575 17576 17577 17578 17579 17580 17581 17582 17583 17584 17585 17586 17587 17588 17589 17590 17591 17592 17593 17594 17595 17596 17597 17598 17599 17600 17601 17602 17603 17604 17605 17606 17607 17608 17609 17610 17611 17612 17613 17614 17615 17616 17617 17618 17619 17620 17621 17622 17623 17624 17625 17626 17627 17628 17629 17630 17631 17632 17633 17634 17635 17636 17637 17638 17639 17640 17641 17642 17643 17644 17645 17646 17647 17648 17649 17650 17651 17652 17653 17654 17655 17656 17657 17658 17659 17660 17661 17662 17663 17664 17665 17666 17667 17668 17669 17670 17671 17672 17673 17674 17675 17676 17677 17678 17679 17680 17681 17682 17683 17684 17685 17686 17687 17688 17689 17690 17691 17692 17693 17694 17695 17696 17697 17698 17699 17700 17701 17702 17703 17704 17705 17706 17707 17708 17709 17710 17711 17712 17713 17714 17715 17716 17717 17718 17719 17720 17721 17722 17723 17724 17725 17726 17727 17728 17729 17730 17731 17732 17733 17734 17735 17736 17737 17738 17739 17740 17741 17742 17743 17744 17745 17746 17747 17748 17749 17750 17751 17752 17753 17754 17755 17756 17757 17758 17759 17760 17761 17762 17763 17764 17765 17766 17767 17768 17769 17770 17771 17772 17773 17774 17775 17776 17777 17778 17779 17780 17781 17782 17783 17784 17785 17786 17787 17788 17789 17790 17791 17792 17793 17794 17795 17796 17797 17798 17799 17800 17801 17802 17803 17804 17805 17806 17807 17808 17809 17810 17811 17812 17813 17814 17815 17816 17817 17818 17819 17820 17821 17822 17823 17824 17825 17826 17827 17828 17829 17830 17831 17832 17833 17834 17835 17836 17837 17838 17839 17840 17841 17842 17843 17844 17845 17846 17847 17848 17849 17850 17851 17852 17853 17854 17855 17856 17857 17858 17859 17860 17861 17862 17863 17864 17865 17866 17867 17868 17869 17870 17871 17872 17873 17874 17875 17876 17877 17878 17879 17880 17881 17882 17883 17884 17885 17886 17887 17888 17889 17890 17891 17892 17893 17894 17895 17896 17897 17898 17899 17900 17901 17902 17903 17904 17905 17906 17907 17908 17909 17910 17911 17912 17913 17914 17915 17916 17917 17918 17919 17920 17921 17922 17923 17924 17925 17926 17927 17928 17929 17930 17931 17932 17933 17934 17935 17936 17937 17938 17939 17940 17941 17942 17943 17944 17945 17946 17947 17948 17949 17950 17951 17952 17953 17954 17955 17956 17957 17958 17959 17960 17961 17962 17963 17964 17965 17966 17967 17968 17969 17970 17971 17972 17973 17974 17975 17976 17977 17978 17979 17980 17981 17982 17983 17984 17985 17986 17987 17988 17989 17990 17991 17992 17993 17994 17995 17996 17997 17998 17999 18000 18001 18002 18003 18004 18005 18006 18007 18008 18009 18010 18011 18012 18013 18014 18015 18016 18017 18018 18019 18020 18021 18022 18023 18024 18025 18026 18027 18028 18029 18030 18031 18032 18033 18034 18035 18036 18037 18038 18039 18040 18041 18042 18043 18044 18045 18046 18047 18048 18049 18050 18051 18052 18053 18054 18055 18056 18057 18058 18059 18060 18061 18062 18063 18064 18065 18066 18067 18068 18069 18070 18071 18072 18073 18074 18075 18076 18077 18078 18079 18080 18081 18082 18083 18084 18085 18086 18087 18088 18089 18090 18091 18092 18093 18094 18095 18096 18097 18098 18099 18100 18101 18102 18103 18104 18105 18106 18107 18108 18109 18110 18111 18112 18113 18114 18115 18116 18117 18118 18119 18120 18121 18122 18123 18124 18125 18126 18127 18128 18129 18130 18131 18132 18133 18134 18135 18136 18137 18138 18139 18140 18141 18142 18143 18144 18145 18146 18147 18148 18149 18150 18151 18152 18153 18154 18155 18156 18157 18158 18159 18160 18161 18162 18163 18164 18165 18166 18167 18168 18169 18170 18171 18172 18173 18174 18175 18176 18177 18178 18179 18180 18181 18182 18183 18184 18185 18186 18187 18188 18189 18190 18191 18192 18193 18194 18195 18196 18197 18198 18199 18200 18201 18202 18203 18204 18205 18206 18207 18208 18209 18210 18211 18212 18213 18214 18215 18216 18217 18218 18219 18220 18221 18222 18223 18224 18225 18226 18227 18228 18229 18230 18231 18232 18233 18234 18235 18236 18237 18238 18239 18240 18241 18242 18243 18244 18245 18246 18247 18248 18249 18250 18251 18252 18253 18254 18255 18256 18257 18258 18259 18260 18261 18262 18263 18264 18265 18266 18267 18268 18269 18270 18271 18272 18273 18274 18275 18276 18277 18278 18279 18280 18281 18282 18283 18284 18285 18286 18287 18288 18289 18290 18291 18292 18293 18294 18295 18296 18297 18298 18299 18300 18301 18302 18303 18304 18305 18306 18307 18308 18309 18310 18311 18312 18313 18314 18315 18316 18317 18318 18319 18320 18321 18322 18323 18324 18325 18326 18327 18328 18329 18330 18331 18332 18333 18334 18335 18336 18337 18338 18339 18340 18341 18342 18343 18344 18345 18346 18347 18348 18349 18350 18351 18352 18353 18354 18355 18356 18357 18358 18359 18360 18361 18362 18363 18364 18365 18366 18367 18368 18369 18370 18371 18372 18373 18374 18375 18376 18377 18378 18379 18380 18381 18382 18383 18384 18385 18386 18387 18388 18389 18390 18391 18392 18393 18394 18395 18396 18397 18398 18399 18400 18401 18402 18403 18404 18405 18406 18407 18408 18409 18410 18411 18412 18413 18414 18415 18416 18417 18418 18419 18420 18421 18422 18423 18424 18425 18426 18427 18428 18429 18430 18431 18432 18433 18434 18435 18436 18437 18438 18439 18440 18441 18442 18443 18444 18445 18446 18447 18448 18449 18450 18451 18452 18453 18454 18455 18456 18457 18458 18459 18460 18461 18462 18463 18464 18465 18466 18467 18468 18469 18470 18471 18472 18473 18474 18475 18476 18477 18478 18479 18480 18481 18482 18483 18484 18485 18486 18487 18488 18489 18490 18491 18492 18493 18494 18495 18496 18497 18498 18499 18500 18501 18502 18503 18504 18505 18506 18507 18508 18509 18510 18511 18512 18513 18514 18515 18516 18517 18518 18519 18520 18521 18522 18523 18524 18525 18526 18527 18528 18529 18530 18531 18532 18533 18534 18535 18536 18537 18538 18539 18540 18541 18542 18543 18544 18545 18546 18547 18548 18549 18550 18551 18552 18553 18554 18555 18556 18557 18558 18559 18560 18561 18562 18563 18564 18565 18566 18567 18568 18569 18570 18571 18572 18573 18574 18575 18576 18577 18578 18579 18580 18581 18582 18583 18584 18585 18586 18587 18588 18589 18590 18591 18592 18593 18594 18595 18596 18597 18598 18599 18600 18601 18602 18603 18604 18605 18606 18607 18608 18609 18610 18611 18612 18613 18614 18615 18616 18617 18618 18619 18620 18621 18622 18623 18624 18625 18626 18627 18628 18629 18630 18631 18632 18633 18634 18635 18636 18637 18638 18639 18640 18641 18642 18643 18644 18645 18646 18647 18648 18649 18650 18651 18652 18653 18654 18655 18656 18657 18658 18659 18660 18661 18662 18663 18664 18665 18666 18667 18668 18669 18670 18671 18672 18673 18674 18675 18676 18677 18678 18679 18680 18681 18682 18683 18684 18685 18686 18687 18688 18689 18690 18691 18692 18693 18694 18695 18696 18697 18698 18699 18700 18701 18702 18703 18704 18705 18706 18707 18708 18709 18710 18711 18712 18713 18714 18715 18716 18717 18718 18719 18720 18721 18722 18723 18724 18725 18726 18727 18728 18729 18730 18731 18732 18733 18734 18735 18736 18737 18738 18739 18740 18741 18742 18743 18744 18745 18746 18747 18748 18749 18750 18751 18752 18753 18754 18755 18756 18757 18758 18759 18760 18761 18762 18763 18764 18765 18766 18767 18768 18769 18770 18771 18772 18773 18774 18775 18776 18777 18778 18779 18780 18781 18782 18783 18784 18785 18786 18787 18788 18789 18790 18791 18792 18793 18794 18795 18796 18797 18798 18799 18800 18801 18802 18803 18804 18805 18806 18807 18808 18809 18810 18811 18812 18813 18814 18815 18816 18817 18818 18819 18820 18821 18822 18823 18824 18825 18826 18827 18828 18829 18830 18831 18832 18833 18834 18835 18836 18837 18838 18839 18840 18841 18842 18843 18844 18845 18846 18847 18848 18849 18850 18851 18852 18853 18854 18855 18856 18857 18858 18859 18860 18861 18862 18863 18864 18865 18866 18867 18868 18869 18870 18871 18872 18873 18874 18875 18876 18877 18878 18879 18880 18881 18882 18883 18884 18885 18886 18887 18888 18889 18890 18891 18892 18893 18894 18895 18896 18897 18898 18899 18900 18901 18902 18903 18904 18905 18906 18907 18908 18909 18910 18911 18912 18913 18914 18915 18916 18917 18918 18919 18920 18921 18922 18923 18924 18925 18926 18927 18928 18929 18930 18931 18932 18933 18934 18935 18936 18937 18938 18939 18940 18941 18942 18943 18944 18945 18946 18947 18948 18949 18950 18951 18952 18953 18954 18955 18956 18957 18958 18959 18960 18961 18962 18963 18964 18965 18966 18967 18968 18969 18970 18971 18972 18973 18974 18975 18976 18977 18978 18979 18980 18981 18982 18983 18984 18985 18986 18987 18988 18989 18990 18991 18992 18993 18994 18995 18996 18997 18998 18999 19000 19001 19002 19003 19004 19005 19006 19007 19008 19009 19010 19011 19012 19013 19014 19015 19016 19017 19018 19019 19020 19021 19022 19023 19024 19025 19026 19027 19028 19029 19030 19031 19032 19033 19034 19035 19036 19037 19038 19039 19040 19041 19042 19043 19044 19045 19046 19047 19048 19049 19050 19051 19052 19053 19054 19055 19056 19057 19058 19059 19060 19061 19062 19063 19064 19065 19066 19067 19068 19069 19070 19071 19072 19073 19074 19075 19076 19077 19078 19079 19080 19081 19082 19083 19084 19085 19086 19087 19088 19089 19090 19091 19092 19093 19094 19095 19096 19097 19098 19099 19100 19101 19102 19103 19104 19105 19106 19107 19108 19109 19110 19111 19112 19113 19114 19115 19116 19117 19118 19119 19120 19121 19122 19123 19124 19125 19126 19127 19128 19129 19130 19131 19132 19133 19134 19135 19136 19137 19138 19139 19140 19141 19142 19143 19144 19145 19146 19147 19148 19149 19150 19151 19152 19153 19154 19155 19156 19157 19158 19159 19160 19161 19162 19163 19164 19165 19166 19167 19168 19169 19170 19171 19172 19173 19174 19175 19176 19177 19178 19179 19180 19181 19182 19183 19184 19185 19186 19187 19188 19189 19190 19191 19192 19193 19194 19195 19196 19197 19198 19199 19200 19201 19202 19203 19204 19205 19206 19207 19208 19209 19210 19211 19212 19213 19214 19215 19216 19217 19218 19219 19220 19221 19222 19223 19224 19225 19226 19227 19228 19229 19230 19231 19232 19233 19234 19235 19236 19237 19238 19239 19240 19241 19242 19243 19244 19245 19246 19247 19248 19249 19250 19251 19252 19253 19254 19255 19256 19257 19258 19259 19260 19261 19262 19263 19264 19265 19266 19267 19268 19269 19270 19271 19272 19273 19274 19275 19276 19277 19278 19279 19280 19281 19282 19283 19284 19285 19286 19287 19288 19289 19290 19291 19292 19293 19294 19295 19296 19297 19298 19299 19300 19301 19302 19303 19304 19305 19306 19307 19308 19309 19310 19311 19312 19313 19314 19315 19316 19317 19318 19319 19320 19321 19322 19323 19324 19325 19326 19327 19328 19329 19330 19331 19332 19333 19334 19335 19336 19337 19338 19339 19340 19341 19342 19343 19344 19345 19346 19347 19348 19349 19350 19351 19352 19353 19354 19355 19356 19357 19358 19359 19360 19361 19362 19363 19364 19365 19366 19367 19368 19369 19370 19371 19372 19373 19374 19375 19376 19377 19378 19379 19380 19381 19382 19383 19384 19385 19386 19387 19388 19389 19390 19391 19392 19393 19394 19395 19396 19397 19398 19399 19400 19401 19402 19403 19404 19405 19406 19407 19408 19409 19410 19411 19412 19413 19414 19415 19416 19417 19418 19419 19420 19421 19422 19423 19424 19425 19426 19427 19428 19429 19430 19431 19432 19433 19434 19435 19436 19437 19438 19439 19440 19441 19442 19443 19444 19445 19446 19447 19448 19449 19450 19451 19452 19453 19454 19455 19456 19457 19458 19459 19460 19461 19462 19463 19464 19465 19466 19467 19468 19469 19470 19471 19472 19473 19474 19475 19476 19477 19478 19479 19480 19481 19482 19483 19484 19485 19486 19487 19488 19489 19490 19491 19492 19493 19494 19495 19496 19497 19498 19499 19500 19501 19502 19503 19504 19505 19506 19507 19508 19509 19510 19511 19512 19513 19514 19515 19516 19517 19518 19519 19520 19521 19522 19523 19524 19525 19526 19527 19528 19529 19530 19531 19532 19533 19534 19535 19536 19537 19538 19539 19540 19541 19542 19543 19544 19545 19546 19547 19548 19549 19550 19551 19552 19553 19554 19555 19556 19557 19558 19559 19560 19561 19562 19563 19564 19565 19566 19567 19568 19569 19570 19571 19572 19573 19574 19575 19576 19577 19578 19579 19580 19581 19582 19583 19584 19585 19586 19587 19588 19589 19590 19591 19592 19593 19594 19595 19596 19597 19598 19599 19600 19601 19602 19603 19604 19605 19606 19607 19608 19609 19610 19611 19612 19613 19614 19615 19616 19617 19618 19619 19620 19621 19622 19623 19624 19625 19626 19627 19628 19629 19630 19631 19632 19633 19634 19635 19636 19637 19638 19639 19640 19641 19642 19643 19644 19645 19646 19647 19648 19649 19650 19651 19652 19653 19654 19655 19656 19657 19658 19659 19660 19661 19662 19663 19664 19665 19666 19667 19668 19669 19670 19671 19672 19673 19674 19675 19676 19677 19678 19679 19680 19681 19682 19683 19684 19685 19686 19687 19688 19689 19690 19691 19692 19693 19694 19695 19696 19697 19698 19699 19700 19701 19702 19703 19704 19705 19706 19707 19708 19709 19710 19711 19712 19713 19714 19715 19716 19717 19718 19719 19720 19721 19722 19723 19724 19725 19726 19727 19728 19729 19730 19731 19732 19733 19734 19735 19736 19737 19738 19739 19740 19741 19742 19743 19744 19745 19746 19747 19748 19749 19750 19751 19752 19753 19754 19755 19756 19757 19758 19759 19760 19761 19762 19763 19764 19765 19766 19767 19768 19769 19770 19771 19772 19773 19774 19775 19776 19777 19778 19779 19780 19781 19782 19783 19784 19785 19786 19787 19788 19789 19790 19791 19792 19793 19794 19795 19796 19797 19798 19799 19800 19801 19802 19803 19804 19805 19806 19807 19808 19809 19810 19811 19812 19813 19814 19815 19816 19817 19818 19819 19820 19821 19822 19823 19824 19825 19826 19827 19828 19829 19830 19831 19832 19833 19834 19835 19836 19837 19838 19839 19840 19841 19842 19843 19844 19845 19846 19847 19848 19849 19850 19851 19852 19853 19854 19855 19856 19857 19858 19859 19860 19861 19862 19863 19864 19865 19866 19867 19868 19869 19870 19871 19872 19873 19874 19875 19876 19877 19878 19879 19880 19881 19882 19883 19884 19885 19886 19887 19888 19889 19890 19891 19892 19893 19894 19895 19896 19897 19898 19899 19900 19901 19902 19903 19904 19905 19906 19907 19908 19909 19910 19911 19912 19913 19914 19915 19916 19917 19918 19919 19920 19921 19922 19923 19924 19925 19926 19927 19928 19929 19930 19931 19932 19933 19934 19935 19936 19937 19938 19939 19940 19941 19942 19943 19944 19945 19946 19947 19948 19949 19950 19951 19952 19953 19954 19955 19956 19957 19958 19959 19960 19961 19962 19963 19964 19965 19966 19967 19968 19969 19970 19971 19972 19973 19974 19975 19976 19977 19978 19979 19980 19981 19982 19983 19984 19985 19986 19987 19988 19989 19990 19991 19992 19993 19994 19995 19996 19997 19998 19999 20000 20001 20002 20003 20004 20005 20006 20007 20008 20009 20010 20011 20012 20013 20014 20015 20016 20017 20018 20019 20020 20021 20022 20023 20024 20025 20026 20027 20028 20029 20030 20031 20032 20033 20034 20035 20036 20037 20038 20039 20040 20041 20042 20043 20044 20045 20046 20047 20048 20049 20050 20051 20052 20053 20054 20055 20056 20057 20058 20059 20060 20061 20062 20063 20064 20065 20066 20067 20068 20069 20070 20071 20072 20073 20074 20075 20076 20077 20078 20079 20080 20081 20082 20083 20084 20085 20086 20087 20088 20089 20090 20091 20092 20093 20094 20095 20096 20097 20098 20099 20100 20101 20102 20103 20104 20105 20106 20107 20108 20109 20110 20111 20112 20113 20114 20115 20116 20117 20118 20119 20120 20121 20122 20123 20124 20125 20126 20127 20128 20129 20130 20131 20132 20133 20134 20135 20136 20137 20138 20139 20140 20141 20142 20143 20144 20145 20146 20147 20148 20149 20150 20151 20152 20153 20154 20155 20156 20157 20158 20159 20160 20161 20162 20163 20164 20165 20166 20167 20168 20169 20170 20171 20172 20173 20174 20175 20176 20177 20178 20179 20180 20181 20182 20183 20184 20185 20186 20187 20188 20189 20190 20191 20192 20193 20194 20195 20196 20197 20198 20199 20200 20201 20202 20203 20204 20205 20206 20207 20208 20209 20210 20211 20212 20213 20214 20215 20216 20217 20218 20219 20220 20221 20222 20223 20224 20225 20226 20227 20228 20229 20230 20231 20232 20233 20234 20235 20236 20237 20238 20239 20240 20241 20242 20243 20244 20245 20246 20247 20248 20249 20250 20251 20252 20253 20254 20255 20256 20257 20258 20259 20260 20261 20262 20263 20264 20265 20266 20267 20268 20269 20270 20271 20272 20273 20274 20275 20276 20277 20278 20279 20280 20281 20282 20283 20284 20285 20286 20287 20288 20289 20290 20291 20292 20293 20294 20295 20296 20297 20298 20299 20300 20301 20302 20303 20304 20305 20306 20307 20308 20309 20310 20311 20312 20313 20314 20315 20316 20317 20318 20319 20320 20321 20322 20323 20324 20325 20326 20327 20328 20329 20330 20331 20332 20333 20334 20335 20336 20337 20338 20339 20340 20341 20342 20343 20344 20345 20346 20347 20348 20349 20350 20351 20352 20353 20354 20355 20356 20357 20358 20359 20360 20361 20362 20363 20364 20365 20366 20367 20368 20369 20370 20371 20372 20373 20374 20375 20376 20377 20378 20379 20380 20381 20382 20383 20384 20385 20386 20387 20388 20389 20390 20391 20392 20393 20394 20395 20396 20397 20398 20399 20400 20401 20402 20403 20404 20405 20406 20407 20408 20409 20410 20411 20412 20413 20414 20415 20416 20417 20418 20419 20420 20421 20422 20423 20424 20425 20426 20427 20428 20429 20430 20431 20432 20433 20434 20435 20436 20437 20438 20439 20440 20441 20442 20443 20444 20445 20446 20447 20448 20449 20450 20451 20452 20453 20454 20455 20456 20457 20458 20459 20460 20461 20462 20463 20464 20465 20466 20467 20468 20469 20470 20471 20472 20473 20474 20475 20476 20477 20478 20479 20480 20481 20482 20483 20484 20485 20486 20487 20488 20489 20490 20491 20492 20493 20494 20495 20496 20497 20498 20499 20500 20501 20502 20503 20504 20505 20506 20507 20508 20509 20510 20511 20512 20513 20514 20515 20516 20517 20518 20519 20520 20521 20522 20523 20524 20525 20526 20527 20528 20529 20530 20531 20532 20533 20534 20535 20536 20537 20538 20539 20540 20541 20542 20543 20544 20545 20546 20547 20548 20549 20550 20551 20552 20553 20554 20555 20556 20557 20558 20559 20560 20561 20562 20563 20564 20565 20566 20567 20568 20569 20570 20571 20572 20573 20574 20575 20576 20577 20578 20579 20580 20581 20582 20583 20584 20585 20586 20587 20588 20589 20590 20591 20592 20593 20594 20595 20596 20597 20598 20599 20600 20601 20602 20603 20604 20605 20606 20607 20608 20609 20610 20611 20612 20613 20614 20615 20616 20617 20618 20619 20620 20621 20622 20623 20624 20625 20626 20627 20628 20629 20630 20631 20632 20633 20634 20635 20636 20637 20638 20639 20640 20641 20642 20643 20644 20645 20646 20647 20648 20649 20650 20651 20652 20653 20654 20655 20656 20657 20658 20659 20660 20661 20662 20663 20664 20665 20666 20667 20668 20669 20670 20671 20672 20673 20674 20675 20676 20677 20678 20679 20680 20681 20682 20683 20684 20685 20686 20687 20688 20689 20690 20691 20692 20693 20694 20695 20696 20697 20698 20699 20700 20701 20702 20703 20704 20705 20706 20707 20708 20709 20710 20711 20712 20713 20714 20715 20716 20717 20718 20719 20720 20721 20722 20723 20724 20725 20726 20727 20728 20729 20730 20731 20732 20733 20734 20735 20736 20737 20738 20739 20740 20741 20742 20743 20744 20745 20746 20747 20748 20749 20750 20751 20752 20753 20754 20755 20756 20757 20758 20759 20760 20761 20762 20763 20764 20765 20766 20767 20768 20769 20770 20771 20772 20773 20774 20775 20776 20777 20778 20779 20780 20781 20782 20783 20784 20785 20786 20787 20788 20789 20790 20791 20792 20793 20794 20795 20796 20797 20798 20799 20800 20801 20802 20803 20804 20805 20806 20807 20808 20809 20810 20811 20812 20813 20814 20815 20816 20817 20818 20819 20820 20821 20822 20823 20824 20825 20826 20827 20828 20829 20830 20831 20832 20833 20834 20835 20836 20837 20838 20839 20840 20841 20842 20843 20844 20845 20846 20847 20848 20849 20850 20851 20852 20853 20854 20855 20856 20857 20858 20859 20860 20861 20862 20863 20864 20865 20866 20867 20868 20869 20870 20871 20872 20873 20874 20875 20876 20877 20878 20879 20880 20881 20882 20883 20884 20885 20886 20887 20888 20889 20890 20891 20892 20893 20894 20895 20896 20897 20898 20899 20900 20901 20902 20903 20904 20905 20906 20907 20908 20909 20910 20911 20912 20913 20914 20915 20916 20917 20918 20919 20920 20921 20922 20923 20924 20925 20926 20927 20928 20929 20930 20931 20932 20933 20934 20935 20936 20937 20938 20939 20940 20941 20942 20943 20944 20945 20946 20947 20948 20949 20950 20951 20952 20953 20954 20955 20956 20957 20958 20959 20960 20961 20962 20963 20964 20965 20966 20967 20968 20969 20970 20971 20972 20973 20974 20975 20976 20977 20978 20979 20980 20981 20982 20983 20984 20985 20986 20987 20988 20989 20990 20991 20992 20993 20994 20995 20996 20997 20998 20999 21000 21001 21002 21003 21004 21005 21006 21007 21008 21009 21010 21011 21012 21013 21014 21015 21016 21017 21018 21019 21020 21021 21022 21023 21024 21025 21026 21027 21028 21029 21030 21031 21032 21033 21034 21035 21036 21037 21038 21039 21040 21041 21042 21043 21044 21045 21046 21047 21048 21049 21050 21051 21052 21053 21054 21055 21056 21057 21058 21059 21060 21061 21062 21063 21064 21065 21066 21067 21068 21069 21070 21071 21072 21073 21074 21075 21076 21077 21078 21079 21080 21081 21082 21083 21084 21085 21086 21087 21088 21089 21090 21091 21092 21093 21094 21095 21096 21097 21098 21099 21100 21101 21102 21103 21104 21105 21106 21107 21108 21109 21110 21111 21112 21113 21114 21115 21116 21117 21118 21119 21120 21121 21122 21123 21124 21125 21126 21127 21128 21129 21130 21131 21132 21133 21134 21135 21136 21137 21138 21139 21140 21141 21142 21143 21144 21145 21146 21147 21148 21149 21150 21151 21152 21153 21154 21155 21156 21157 21158 21159 21160 21161 21162 21163 21164 21165 21166 21167 21168 21169 21170 21171 21172 21173 21174 21175 21176 21177 21178 21179 21180 21181 21182 21183 21184 21185 21186 21187 21188 21189 21190 21191 21192 21193 21194 21195 21196 21197 21198 21199 21200 21201 21202 21203 21204 21205 21206 21207 21208 21209 21210 21211 21212 21213 21214 21215 21216 21217 21218 21219 21220 21221 21222 21223 21224 21225 21226 21227 21228 21229 21230 21231 21232 21233 21234 21235 21236 21237 21238 21239 21240 21241 21242 21243 21244 21245 21246 21247 21248 21249 21250 21251 21252 21253 21254 21255 21256 21257 21258 21259 21260 21261 21262 21263 21264 21265 21266 21267 21268 21269 21270 21271 21272 21273 21274 21275 21276 21277 21278 21279 21280 21281 21282 21283 21284 21285 21286 21287 21288 21289 21290 21291 21292 21293 21294 21295 21296 21297 21298 21299 21300 21301 21302 21303 21304 21305 21306 21307 21308 21309 21310 21311 21312 21313 21314 21315 21316 21317 21318 21319 21320 21321 21322 21323 21324 21325 21326 21327 21328 21329 21330 21331 21332 21333 21334 21335 21336 21337 21338 21339 21340 21341 21342 21343 21344 21345 21346 21347 21348 21349 21350 21351 21352 21353 21354 21355 21356 21357 21358 21359 21360 21361 21362 21363 21364 21365 21366 21367 21368 21369 21370 21371 21372 21373 21374 21375 21376 21377 21378 21379 21380 21381 21382 21383 21384 21385 21386 21387 21388 21389 21390 21391 21392 21393 21394 21395 21396 21397 21398 21399 21400 21401 21402 21403 21404 21405 21406 21407 21408 21409 21410 21411 21412 21413 21414 21415 21416 21417 21418 21419 21420 21421 21422 21423 21424 21425 21426 21427 21428 21429 21430 21431 21432 21433 21434 21435 21436 21437 21438 21439 21440 21441 21442 21443 21444 21445 21446 21447 21448 21449 21450 21451 21452 21453 21454 21455 21456 21457 21458 21459 21460 21461 21462 21463 21464 21465 21466 21467 21468 21469 21470 21471 21472 21473 21474 21475 21476 21477 21478 21479 21480 21481 21482 21483 21484 21485 21486 21487 21488 21489 21490 21491 21492 21493 21494 21495 21496 21497 21498 21499 21500 21501 21502 21503 21504 21505 21506 21507 21508 21509 21510 21511 21512 21513 21514 21515 21516 21517 21518 21519 21520 21521 21522 21523 21524 21525 21526 21527 21528 21529 21530 21531 21532 21533 21534 21535 21536 21537 21538 21539 21540 21541 21542 21543 21544 21545 21546 21547 21548 21549 21550 21551 21552 21553 21554 21555 21556 21557 21558 21559 21560 21561 21562 21563 21564 21565 21566 21567 21568 21569 21570 21571 21572 21573 21574 21575 21576 21577 21578 21579 21580 21581 21582 21583 21584 21585 21586 21587 21588 21589 21590 21591 21592 21593 21594 21595 21596 21597 21598 21599 21600 21601 21602 21603 21604 21605 21606 21607 21608 21609 21610 21611 21612 21613 21614 21615 21616 21617 21618 21619 21620 21621 21622 21623 21624 21625 21626 21627 21628 21629 21630 21631 21632 21633 21634 21635 21636 21637 21638 21639 21640 21641 21642 21643 21644 21645 21646 21647 21648 21649 21650 21651 21652 21653 21654 21655 21656 21657 21658 21659 21660 21661 21662 21663 21664 21665 21666 21667 21668 21669 21670 21671 21672 21673 21674 21675 21676 21677 21678 21679 21680 21681 21682 21683 21684 21685 21686 21687 21688 21689 21690 21691 21692 21693 21694 21695 21696 21697 21698 21699 21700 21701 21702 21703 21704 21705 21706 21707 21708 21709 21710 21711 21712 21713 21714 21715 21716 21717 21718 21719 21720 21721 21722 21723 21724 21725 21726 21727 21728 21729 21730 21731 21732 21733 21734 21735 21736 21737 21738 21739 21740 21741 21742 21743 21744 21745 21746 21747 21748 21749 21750 21751 21752 21753 21754 21755 21756 21757 21758 21759 21760 21761 21762 21763 21764 21765 21766 21767 21768 21769 21770 21771 21772 21773 21774 21775 21776 21777 21778 21779 21780 21781 21782 21783 21784 21785 21786 21787 21788 21789 21790 21791 21792 21793 21794 21795 21796 21797 21798 21799 21800 21801 21802 21803 21804 21805 21806 21807 21808 21809 21810 21811 21812 21813 21814 21815 21816 21817 21818 21819 21820 21821 21822 21823 21824 21825 21826 21827 21828 21829 21830 21831 21832 21833 21834 21835 21836 21837 21838 21839 21840 21841 21842 21843 21844 21845 21846 21847 21848 21849 21850 21851 21852 21853 21854 21855 21856 21857 21858 21859 21860 21861 21862 21863 21864 21865 21866 21867 21868 21869 21870 21871 21872 21873 21874 21875 21876 21877 21878 21879 21880 21881 21882 21883 21884 21885 21886 21887 21888 21889 21890 21891 21892 21893 21894 21895 21896 21897 21898 21899 21900 21901 21902 21903 21904 21905 21906 21907 21908 21909 21910 21911 21912 21913 21914 21915 21916 21917 21918 21919 21920 21921 21922 21923 21924 21925 21926 21927 21928 21929 21930 21931 21932 21933 21934 21935 21936 21937 21938 21939 21940 21941 21942 21943 21944 21945 21946 21947 21948 21949 21950 21951 21952 21953 21954 21955 21956 21957 21958 21959 21960 21961 21962 21963 21964 21965 21966 21967 21968 21969 21970 21971 21972 21973 21974 21975 21976 21977 21978 21979 21980 21981 21982 21983 21984 21985 21986 21987 21988 21989 21990 21991 21992 21993 21994 21995 21996 21997 21998 21999 22000 22001 22002 22003 22004 22005 22006 22007 22008 22009 22010 22011 22012 22013 22014 22015 22016 22017 22018 22019 22020 22021 22022 22023 22024 22025 22026 22027 22028 22029 22030 22031 22032 22033 22034 22035 22036 22037 22038 22039 22040 22041 22042 22043 22044 22045 22046 22047 22048 22049 22050 22051 22052 22053 22054 22055 22056 22057 22058 22059 22060 22061 22062 22063 22064 22065 22066 22067 22068 22069 22070 22071 22072 22073 22074 22075 22076 22077 22078 22079 22080 22081 22082 22083 22084 22085 22086 22087 22088 22089 22090 22091 22092 22093 22094 22095 22096 22097 22098 22099 22100 22101 22102 22103 22104 22105 22106 22107 22108 22109 22110 22111 22112 22113 22114 22115 22116 22117 22118 22119 22120 22121 22122 22123 22124 22125 22126 22127 22128 22129 22130 22131 22132 22133 22134 22135 22136 22137 22138 22139 22140 22141 22142 22143 22144 22145 22146 22147 22148 22149 22150 22151 22152 22153 22154 22155 22156 22157 22158 22159 22160 22161 22162 22163 22164 22165 22166 22167 22168 22169 22170 22171 22172 22173 22174 22175 22176 22177 22178 22179 22180 22181 22182 22183 22184 22185 22186 22187 22188 22189 22190 22191 22192 22193 22194 22195 22196 22197 22198 22199 22200 22201 22202 22203 22204 22205 22206 22207 22208 22209 22210 22211 22212 22213 22214 22215 22216 22217 22218 22219 22220 22221 22222 22223 22224 22225 22226 22227 22228 22229 22230 22231 22232 22233 22234 22235 22236 22237 22238 22239 22240 22241 22242 22243 22244 22245 22246 22247 22248 22249 22250 22251 22252 22253 22254 22255 22256 22257 22258 22259 22260 22261 22262 22263 22264 22265 22266 22267 22268 22269 22270 22271 22272 22273 22274 22275 22276 22277 22278 22279 22280 22281 22282 22283 22284 22285 22286 22287 22288 22289 22290 22291 22292 22293 22294 22295 22296 22297 22298 22299 22300 22301 22302 22303 22304 22305 22306 22307 22308 22309 22310 22311 22312 22313 22314 22315 22316 22317 22318 22319 22320 22321 22322 22323 22324 22325 22326 22327 22328 22329 22330 22331 22332 22333 22334 22335 22336 22337 22338 22339 22340 22341 22342 22343 22344 22345 22346 22347 22348 22349 22350 22351 22352 22353 22354 22355 22356 22357 22358 22359 22360 22361 22362 22363 22364 22365 22366 22367 22368 22369 22370 22371 22372 22373 22374 22375 22376 22377 22378 22379 22380 22381 22382 22383 22384 22385 22386 22387 22388 22389 22390 22391 22392 22393 22394 22395 22396 22397 22398 22399 22400 22401 22402 22403 22404 22405 22406 22407 22408 22409 22410 22411 22412 22413 22414 22415 22416 22417 22418 22419 22420 22421 22422 22423 22424 22425 22426 22427 22428 22429 22430 22431 22432 22433 22434 22435 22436 22437 22438 22439 22440 22441 22442 22443 22444 22445 22446 22447 22448 22449 22450 22451 22452 22453 22454 22455 22456 22457 22458 22459 22460 22461 22462 22463 22464 22465 22466 22467 22468 22469 22470 22471 22472 22473 22474 22475 22476 22477 22478 22479 22480 22481 22482 22483 22484 22485 22486 22487 22488 22489 22490 22491 22492 22493 22494 22495 22496 22497 22498 22499 22500 22501 22502 22503 22504 22505 22506 22507 22508 22509 22510 22511 22512 22513 22514 22515 22516 22517 22518 22519 22520 22521 22522 22523 22524 22525 22526 22527 22528 22529 22530 22531 22532 22533 22534 22535 22536 22537 22538 22539 22540 22541 22542 22543 22544 22545 22546 22547 22548 22549 22550 22551 22552 22553 22554 22555 22556 22557 22558 22559 22560 22561 22562 22563 22564 22565 22566 22567 22568 22569 22570 22571 22572 22573 22574 22575 22576 22577 22578 22579 22580 22581 22582 22583 22584 22585 22586 22587 22588 22589 22590 22591 22592 22593 22594 22595 22596 22597 22598 22599 22600 22601 22602 22603 22604 22605 22606 22607 22608 22609 22610 22611 22612 22613 22614 22615 22616 22617 22618 22619 22620 22621 22622 22623 22624 22625 22626 22627 22628 22629 22630 22631 22632 22633 22634 22635 22636 22637 22638 22639 22640 22641 22642 22643 22644 22645 22646 22647 22648 22649 22650 22651 22652 22653 22654 22655 22656 22657 22658 22659 22660 22661 22662 22663 22664 22665 22666 22667 22668 22669 22670 22671 22672 22673 22674 22675 22676 22677 22678 22679 22680 22681 22682 22683 22684 22685 22686 22687 22688 22689 22690 22691 22692 22693 22694 22695 22696 22697 22698 22699 22700 22701 22702 22703 22704 22705 22706 22707 22708 22709 22710 22711 22712 22713 22714 22715 22716 22717 22718 22719 22720 22721 22722 22723 22724 22725 22726 22727 22728 22729 22730 22731 22732 22733 22734 22735 22736 22737 22738 22739 22740 22741 22742 22743 22744 22745 22746 22747 22748 22749 22750 22751 22752 22753 22754 22755 22756 22757 22758 22759 22760 22761 22762 22763 22764 22765 22766 22767 22768 22769 22770 22771 22772 22773 22774 22775 22776 22777 22778 22779 22780 22781 22782 22783 22784 22785 22786 22787 22788 22789 22790 22791 22792 22793 22794 22795 22796 22797 22798 22799 22800 22801 22802 22803 22804 22805 22806 22807 22808 22809 22810 22811 22812 22813 22814 22815 22816 22817 22818 22819 22820 22821 22822 22823 22824 22825 22826 22827 22828 22829 22830 22831 22832 22833 22834 22835 22836 22837 22838 22839 22840 22841 22842 22843 22844 22845 22846 22847 22848 22849 22850 22851 22852 22853 22854 22855 22856 22857 22858 22859 22860 22861 22862 22863 22864 22865 22866 22867 22868 22869 22870 22871 22872 22873 22874 22875 22876 22877 22878 22879 22880 22881 22882 22883 22884 22885 22886 22887 22888 22889 22890 22891 22892 22893 22894 22895 22896 22897 22898 22899 22900 22901 22902 22903 22904 22905 22906 22907 22908 22909 22910 22911 22912 22913 22914 22915 22916 22917 22918 22919 22920 22921 22922 22923 22924 22925 22926 22927 22928 22929 22930 22931 22932 22933 22934 22935 22936 22937 22938 22939 22940 22941 22942 22943 22944 22945 22946 22947 22948 22949 22950 22951 22952 22953 22954 22955 22956 22957 22958 22959 22960 22961 22962 22963 22964 22965 22966 22967 22968 22969 22970 22971 22972 22973 22974 22975 22976 22977 22978 22979 22980 22981 22982 22983 22984 22985 22986 22987 22988 22989 22990 22991 22992 22993 22994 22995 22996 22997 22998 22999 23000 23001 23002 23003 23004 23005 23006 23007 23008 23009 23010 23011 23012 23013 23014 23015 23016 23017 23018 23019 23020 23021 23022 23023 23024 23025 23026 23027 23028 23029 23030 23031 23032 23033 23034 23035 23036 23037 23038 23039 23040 23041 23042 23043 23044 23045 23046 23047 23048 23049 23050 23051 23052 23053 23054 23055 23056 23057 23058 23059 23060 23061 23062 23063 23064 23065 23066 23067 23068 23069 23070 23071 23072 23073 23074 23075 23076 23077 23078 23079 23080 23081 23082 23083 23084 23085 23086 23087 23088 23089 23090 23091 23092 23093 23094 23095 23096 23097 23098 23099 23100 23101 23102 23103 23104 23105 23106 23107 23108 23109 23110 23111 23112 23113 23114 23115 23116 23117 23118 23119 23120 23121 23122 23123 23124 23125 23126 23127 23128 23129 23130 23131 23132 23133 23134 23135 23136 23137 23138 23139 23140 23141 23142 23143 23144 23145 23146 23147 23148 23149 23150 23151 23152 23153 23154 23155 23156 23157 23158 23159 23160 23161 23162 23163 23164 23165 23166 23167 23168 23169 23170 23171 23172 23173 23174 23175 23176 23177 23178 23179 23180 23181 23182 23183 23184 23185 23186 23187 23188 23189 23190 23191 23192 23193 23194 23195 23196 23197 23198 23199 23200 23201 23202 23203 23204 23205 23206 23207 23208 23209 23210 23211 23212 23213 23214 23215 23216 23217 23218 23219 23220 23221 23222 23223 23224 23225 23226 23227 23228 23229 23230 23231 23232 23233 23234 23235 23236 23237 23238 23239 23240 23241 23242 23243 23244 23245 23246 23247 23248 23249 23250 23251 23252 23253 23254 23255 23256 23257 23258 23259 23260 23261 23262 23263 23264 23265 23266 23267 23268 23269 23270 23271 23272 23273 23274 23275 23276 23277 23278 23279 23280 23281 23282 23283 23284 23285 23286 23287 23288 23289 23290 23291 23292 23293 23294 23295 23296 23297 23298 23299 23300 23301 23302 23303 23304 23305 23306 23307 23308 23309 23310 23311 23312 23313 23314 23315 23316 23317 23318 23319 23320 23321 23322 23323 23324 23325 23326 23327 23328 23329 23330 23331 23332 23333 23334 23335 23336 23337 23338 23339 23340 23341 23342 23343 23344 23345 23346 23347 23348 23349 23350 23351 23352 23353 23354 23355 23356 23357 23358 23359 23360 23361 23362 23363 23364 23365 23366 23367 23368 23369 23370 23371 23372 23373 23374 23375 23376 23377 23378 23379 23380 23381 23382 23383 23384 23385 23386 23387 23388 23389 23390 23391 23392 23393 23394 23395 23396 23397 23398 23399 23400 23401 23402 23403 23404 23405 23406 23407 23408 23409 23410 23411 23412 23413 23414 23415 23416 23417 23418 23419 23420 23421 23422 23423 23424 23425 23426 23427 23428 23429 23430 23431 23432 23433 23434 23435 23436 23437 23438 23439 23440 23441 23442 23443 23444 23445 23446 23447 23448 23449 23450 23451 23452 23453 23454 23455 23456 23457 23458 23459 23460 23461 23462 23463 23464 23465 23466 23467 23468 23469 23470 23471 23472 23473 23474 23475 23476 23477 23478 23479 23480 23481 23482 23483 23484 23485 23486 23487 23488 23489 23490 23491 23492 23493 23494 23495 23496 23497 23498 23499 23500 23501 23502 23503 23504 23505 23506 23507 23508 23509 23510 23511 23512 23513 23514 23515 23516 23517 23518 23519 23520 23521 23522 23523 23524 23525 23526 23527 23528 23529 23530 23531 23532 23533 23534 23535 23536 23537 23538 23539 23540 23541 23542 23543 23544 23545 23546 23547 23548 23549 23550 23551 23552 23553 23554 23555 23556 23557 23558 23559 23560 23561 23562 23563 23564 23565 23566 23567 23568 23569 23570 23571 23572 23573 23574 23575 23576 23577 23578 23579 23580 23581 23582 23583 23584 23585 23586 23587 23588 23589 23590 23591 23592 23593 23594 23595 23596 23597 23598 23599 23600 23601 23602 23603 23604 23605 23606 23607 23608 23609 23610 23611 23612 23613 23614 23615 23616 23617 23618 23619 23620 23621 23622 23623 23624 23625 23626 23627 23628 23629 23630 23631 23632 23633 23634 23635 23636 23637 23638 23639 23640 23641 23642 23643 23644 23645 23646 23647 23648 23649 23650 23651 23652 23653 23654 23655 23656 23657 23658 23659 23660 23661 23662 23663 23664 23665 23666 23667 23668 23669 23670 23671 23672 23673 23674 23675 23676 23677 23678 23679 23680 23681 23682 23683 23684 23685 23686 23687 23688 23689 23690 23691 23692 23693 23694 23695 23696 23697 23698 23699 23700 23701 23702 23703 23704 23705 23706 23707 23708 23709 23710 23711 23712 23713 23714 23715 23716 23717 23718 23719 23720 23721 23722 23723 23724 23725 23726 23727 23728 23729 23730 23731 23732 23733 23734 23735 23736 23737 23738 23739 23740 23741 23742 23743 23744 23745 23746 23747 23748 23749 23750 23751 23752 23753 23754 23755 23756 23757 23758 23759 23760 23761 23762 23763 23764 23765 23766 23767 23768 23769 23770 23771 23772 23773 23774 23775 23776 23777 23778 23779 23780 23781 23782 23783 23784 23785 23786 23787 23788 23789 23790 23791 23792 23793 23794 23795 23796 23797 23798 23799 23800 23801 23802 23803 23804 23805 23806 23807 23808 23809 23810 23811 23812 23813 23814 23815 23816 23817 23818 23819 23820 23821 23822 23823 23824 23825 23826 23827 23828 23829 23830 23831 23832 23833 23834 23835 23836 23837 23838 23839 23840 23841 23842 23843 23844 23845 23846 23847 23848 23849 23850 23851 23852 23853 23854 23855 23856 23857 23858 23859 23860 23861 23862 23863 23864 23865 23866 23867 23868 23869 23870 23871 23872 23873 23874 23875 23876 23877 23878 23879 23880 23881 23882 23883 23884 23885 23886 23887 23888 23889 23890 23891 23892 23893 23894 23895 23896 23897 23898 23899 23900 23901 23902 23903 23904 23905 23906 23907 23908 23909 23910 23911 23912 23913 23914 23915 23916 23917 23918 23919 23920 23921 23922 23923 23924 23925 23926 23927 23928 23929 23930 23931 23932 23933 23934 23935 23936 23937 23938 23939 23940 23941 23942 23943 23944 23945 23946 23947 23948 23949 23950 23951 23952 23953 23954 23955 23956 23957 23958 23959 23960 23961 23962 23963 23964 23965 23966 23967 23968 23969 23970 23971 23972 23973 23974 23975 23976 23977 23978 23979 23980 23981 23982 23983 23984 23985 23986 23987 23988 23989 23990 23991 23992 23993 23994 23995 23996 23997 23998 23999 24000 24001 24002 24003 24004 24005 24006 24007 24008 24009 24010 24011 24012 24013 24014 24015 24016 24017 24018 24019 24020 24021 24022 24023 24024 24025 24026 24027 24028 24029 24030 24031 24032 24033 24034 24035 24036 24037 24038 24039 24040 24041 24042 24043 24044 24045 24046 24047 24048 24049 24050 24051 24052 24053 24054 24055 24056 24057 24058 24059 24060 24061 24062 24063 24064 24065 24066 24067 24068 24069 24070 24071 24072 24073 24074 24075 24076 24077 24078 24079 24080 24081 24082 24083 24084 24085 24086 24087 24088 24089 24090 24091 24092 24093 24094 24095 24096 24097 24098 24099 24100 24101 24102 24103 24104 24105 24106 24107 24108 24109 24110 24111 24112 24113 24114 24115 24116 24117 24118 24119 24120 24121 24122 24123 24124 24125 24126 24127 24128 24129 24130 24131 24132 24133 24134 24135 24136 24137 24138 24139 24140 24141 24142 24143 24144 24145 24146 24147 24148 24149 24150 24151 24152 24153 24154 24155 24156 24157 24158 24159 24160 24161 24162 24163 24164 24165 24166 24167 24168 24169 24170 24171 24172 24173 24174 24175 24176 24177 24178 24179 24180 24181 24182 24183 24184 24185 24186 24187 24188 24189 24190 24191 24192 24193 24194 24195 24196 24197 24198 24199 24200 24201 24202 24203 24204 24205 24206 24207 24208 24209 24210 24211 24212 24213 24214 24215 24216 24217 24218 24219 24220 24221 24222 24223 24224 24225 24226 24227 24228 24229 24230 24231 24232 24233 24234 24235 24236 24237 24238 24239 24240 24241 24242 24243 24244 24245 24246 24247 24248 24249 24250 24251 24252 24253 24254 24255 24256 24257 24258 24259 24260 24261 24262 24263 24264 24265 24266 24267 24268 24269 24270 24271 24272 24273 24274 24275 24276 24277 24278 24279 24280 24281 24282 24283 24284 24285 24286 24287 24288 24289 24290 24291 24292 24293 24294 24295 24296 24297 24298 24299 24300 24301 24302 24303 24304 24305 24306 24307 24308 24309 24310 24311 24312 24313 24314 24315 24316 24317 24318 24319 24320 24321 24322 24323 24324 24325 24326 24327 24328 24329 24330 24331 24332 24333 24334 24335 24336 24337 24338 24339 24340 24341 24342 24343 24344 24345 24346 24347 24348 24349 24350 24351 24352 24353 24354 24355 24356 24357 24358 24359 24360 24361 24362 24363 24364 24365 24366 24367 24368 24369 24370 24371 24372 24373 24374 24375 24376 24377 24378 24379 24380 24381 24382 24383 24384 24385 24386 24387 24388 24389 24390 24391 24392 24393 24394 24395 24396 24397 24398 24399 24400 24401 24402 24403 24404 24405 24406 24407 24408 24409 24410 24411 24412 24413 24414 24415 24416 24417 24418 24419 24420 24421 24422 24423 24424 24425 24426 24427 24428 24429 24430 24431 24432 24433 24434 24435 24436 24437 24438 24439 24440 24441 24442 24443 24444 24445 24446 24447 24448 24449 24450 24451 24452 24453 24454 24455 24456 24457 24458 24459 24460 24461 24462 24463 24464 24465 24466 24467 24468 24469 24470 24471 24472 24473 24474 24475 24476 24477 24478 24479 24480 24481 24482 24483 24484 24485 24486 24487 24488 24489 24490 24491 24492 24493 24494 24495 24496 24497 24498 24499 24500 24501 24502 24503 24504 24505 24506 24507 24508 24509 24510 24511 24512 24513 24514 24515 24516 24517 24518 24519 24520 24521 24522 24523 24524 24525 24526 24527 24528 24529 24530 24531 24532 24533 24534 24535 24536 24537 24538 24539 24540 24541 24542 24543 24544 24545 24546 24547 24548 24549 24550 24551 24552 24553 24554 24555 24556 24557 24558 24559 24560 24561 24562 24563 24564 24565 24566 24567 24568 24569 24570 24571 24572 24573 24574 24575 24576 24577 24578 24579 24580 24581 24582 24583 24584 24585 24586 24587 24588 24589 24590 24591 24592 24593 24594 24595 24596 24597 24598 24599 24600 24601 24602 24603 24604 24605 24606 24607 24608 24609 24610 24611 24612 24613 24614 24615 24616 24617 24618 24619 24620 24621 24622 24623 24624 24625 24626 24627 24628 24629 24630 24631 24632 24633 24634 24635 24636 24637 24638 24639 24640 24641 24642 24643 24644 24645 24646 24647 24648 24649 24650 24651 24652 24653 24654 24655 24656 24657 24658 24659 24660 24661 24662 24663 24664 24665 24666 24667 24668 24669 24670 24671 24672 24673 24674 24675 24676 24677 24678 24679 24680 24681 24682 24683 24684 24685 24686 24687 24688 24689 24690 24691 24692 24693 24694 24695 24696 24697 24698 24699 24700 24701 24702 24703 24704 24705 24706 24707 24708 24709 24710 24711 24712 24713 24714 24715 24716 24717 24718 24719 24720 24721 24722 24723 24724 24725 24726 24727 24728 24729 24730 24731 24732 24733 24734 24735 24736 24737 24738 24739 24740 24741 24742 24743 24744 24745 24746 24747 24748 24749 24750 24751 24752 24753 24754 24755 24756 24757 24758 24759 24760 24761 24762 24763 24764 24765 24766 24767 24768 24769 24770 24771 24772 24773 24774 24775 24776 24777 24778 24779 24780 24781 24782 24783 24784 24785 24786 24787 24788 24789 24790 24791 24792 24793 24794 24795 24796 24797 24798 24799 24800 24801 24802 24803 24804 24805 24806 24807 24808 24809 24810 24811 24812 24813 24814 24815 24816 24817 24818 24819 24820 24821 24822 24823 24824 24825 24826 24827 24828 24829 24830 24831 24832 24833 24834 24835 24836 24837 24838 24839 24840 24841 24842 24843 24844 24845 24846 24847 24848 24849 24850 24851 24852 24853 24854 24855 24856 24857 24858 24859 24860 24861 24862 24863 24864 24865 24866 24867 24868 24869 24870 24871 24872 24873 24874 24875 24876 24877 24878 24879 24880 24881 24882 24883 24884 24885 24886 24887 24888 24889 24890 24891 24892 24893 24894 24895 24896 24897 24898 24899 24900 24901 24902 24903 24904 24905 24906 24907 24908 24909 24910 24911 24912 24913 24914 24915 24916 24917 24918 24919 24920 24921 24922 24923 24924 24925 24926 24927 24928 24929 24930 24931 24932 24933 24934 24935 24936 24937 24938 24939 24940 24941 24942 24943 24944 24945 24946 24947 24948 24949 24950 24951 24952 24953 24954 24955 24956 24957 24958 24959 24960 24961 24962 24963 24964 24965 24966 24967 24968 24969 24970 24971 24972 24973 24974 24975 24976 24977 24978 24979 24980 24981 24982 24983 24984 24985 24986 24987 24988 24989 24990 24991 24992 24993 24994 24995 24996 24997 24998 24999 25000 25001 25002 25003 25004 25005 25006 25007 25008 25009 25010 25011 25012 25013 25014 25015 25016 25017 25018 25019 25020 25021 25022 25023 25024 25025 25026 25027 25028 25029 25030 25031 25032 25033 25034 25035 25036 25037 25038 25039 25040 25041 25042 25043 25044 25045 25046 25047 25048 25049 25050 25051 25052 25053 25054 25055 25056 25057 25058 25059 25060 25061 25062 25063 25064 25065 25066 25067 25068 25069 25070 25071 25072 25073 25074 25075 25076 25077 25078 25079 25080 25081 25082 25083 25084 25085 25086 25087 25088 25089 25090 25091 25092 25093 25094 25095 25096 25097 25098 25099 25100 25101 25102 25103 25104 25105 25106 25107 25108 25109 25110 25111 25112 25113 25114 25115 25116 25117 25118 25119 25120 25121 25122 25123 25124 25125 25126 25127 25128 25129 25130 25131 25132 25133 25134 25135 25136 25137 25138 25139 25140 25141 25142 25143 25144 25145 25146 25147 25148 25149 25150 25151 25152 25153 25154 25155 25156 25157 25158 25159 25160 25161 25162 25163 25164 25165 25166 25167 25168 25169 25170 25171 25172 25173 25174 25175 25176 25177 25178 25179 25180 25181 25182 25183 25184 25185 25186 25187 25188 25189 25190 25191 25192 25193 25194 25195 25196 25197 25198 25199 25200 25201 25202 25203 25204 25205 25206 25207 25208 25209 25210 25211 25212 25213 25214 25215 25216 25217 25218 25219 25220 25221 25222 25223 25224 25225 25226 25227 25228 25229 25230 25231 25232 25233 25234 25235 25236 25237 25238 25239 25240 25241 25242 25243 25244 25245 25246 25247 25248 25249 25250 25251 25252 25253 25254 25255 25256 25257 25258 25259 25260 25261 25262 25263 25264 25265 25266 25267 25268 25269 25270 25271 25272 25273 25274 25275 25276 25277 25278 25279 25280 25281 25282 25283 25284 25285 25286 25287 25288 25289 25290 25291 25292 25293 25294 25295 25296 25297 25298 25299 25300 25301 25302 25303 25304 25305 25306 25307 25308 25309 25310 25311 25312 25313 25314 25315 25316 25317 25318 25319 25320 25321 25322 25323 25324 25325 25326 25327 25328 25329 25330 25331 25332 25333 25334 25335 25336 25337 25338 25339 25340 25341 25342 25343 25344 25345 25346 25347 25348 25349 25350 25351 25352 25353 25354 25355 25356 25357 25358 25359 25360 25361 25362 25363 25364 25365 25366 25367 25368 25369 25370 25371 25372 25373 25374 25375 25376 25377 25378 25379 25380 25381 25382 25383 25384 25385 25386 25387 25388 25389 25390 25391 25392 25393 25394 25395 25396 25397 25398 25399 25400 25401 25402 25403 25404 25405 25406 25407 25408 25409 25410 25411 25412 25413 25414 25415 25416 25417 25418 25419 25420 25421 25422 25423 25424 25425 25426 25427 25428 25429 25430 25431 25432 25433 25434 25435 25436 25437 25438 25439 25440 25441 25442 25443 25444 25445 25446 25447 25448 25449 25450 25451 25452 25453 25454 25455 25456 25457 25458 25459 25460 25461 25462 25463 25464 25465 25466 25467 25468 25469 25470 25471 25472 25473 25474 25475 25476 25477 25478 25479 25480 25481 25482 25483 25484 25485 25486 25487 25488 25489 25490 25491 25492 25493 25494 25495 25496 25497 25498 25499 25500 25501 25502 25503 25504 25505 25506 25507 25508 25509 25510 25511 25512 25513 25514 25515 25516 25517 25518 25519 25520 25521 25522 25523 25524 25525 25526 25527 25528 25529 25530 25531 25532 25533 25534 25535 25536 25537 25538 25539 25540 25541 25542 25543 25544 25545 25546 25547 25548 25549 25550 25551 25552 25553 25554 25555 25556 25557 25558 25559 25560 25561 25562 25563 25564 25565 25566 25567 25568 25569 25570 25571 25572 25573 25574 25575 25576 25577 25578 25579 25580 25581 25582 25583 25584 25585 25586 25587 25588 25589 25590 25591 25592 25593 25594 25595 25596 25597 25598 25599 25600 25601 25602 25603 25604 25605 25606 25607 25608 25609 25610 25611 25612 25613 25614 25615 25616 25617 25618 25619 25620 25621 25622 25623 25624 25625 25626 25627 25628 25629 25630 25631 25632 25633 25634 25635 25636 25637 25638 25639 25640 25641 25642 25643 25644 25645 25646 25647 25648 25649 25650 25651 25652 25653 25654 25655 25656 25657 25658 25659 25660 25661 25662 25663 25664 25665 25666 25667 25668 25669 25670 25671 25672 25673 25674 25675 25676 25677 25678 25679 25680 25681 25682 25683 25684 25685 25686 25687 25688 25689 25690 25691 25692 25693 25694 25695 25696 25697 25698 25699 25700 25701 25702 25703 25704 25705 25706 25707 25708 25709 25710 25711 25712 25713 25714 25715 25716 25717 25718 25719 25720 25721 25722 25723 25724 25725 25726 25727 25728 25729 25730 25731 25732 25733 25734 25735 25736 25737 25738 25739 25740 25741 25742 25743 25744 25745 25746 25747 25748 25749 25750 25751 25752 25753 25754 25755 25756 25757 25758 25759 25760 25761 25762 25763 25764 25765 25766 25767 25768 25769 25770 25771 25772 25773 25774 25775 25776 25777 25778 25779 25780 25781 25782 25783 25784 25785 25786 25787 25788 25789 25790 25791 25792 25793 25794 25795 25796 25797 25798 25799 25800 25801 25802 25803 25804 25805 25806 25807 25808 25809 25810 25811 25812 25813 25814 25815 25816 25817 25818 25819 25820 25821 25822 25823 25824 25825 25826 25827 25828 25829 25830 25831 25832 25833 25834 25835 25836 25837 25838 25839 25840 25841 25842 25843 25844 25845 25846 25847 25848 25849 25850 25851 25852 25853 25854 25855 25856 25857 25858 25859 25860 25861 25862 25863 25864 25865 25866 25867 25868 25869 25870 25871 25872 25873 25874 25875 25876 25877 25878 25879 25880 25881 25882 25883 25884 25885 25886 25887 25888 25889 25890 25891 25892 25893 25894 25895 25896 25897 25898 25899 25900 25901 25902 25903 25904 25905 25906 25907 25908 25909 25910 25911 25912 25913 25914 25915 25916 25917 25918 25919 25920 25921 25922 25923 25924 25925 25926 25927 25928 25929 25930 25931 25932 25933 25934 25935 25936 25937 25938 25939 25940 25941 25942 25943 25944 25945 25946 25947 25948 25949 25950 25951 25952 25953 25954 25955 25956 25957 25958 25959 25960 25961 25962 25963 25964 25965 25966 25967 25968 25969 25970 25971 25972 25973 25974 25975 25976 25977 25978 25979 25980 25981 25982 25983 25984 25985 25986 25987 25988 25989 25990 25991 25992 25993 25994 25995 25996 25997 25998 25999 26000 26001 26002 26003 26004 26005 26006 26007 26008 26009 26010 26011 26012 26013 26014 26015 26016 26017 26018 26019 26020 26021 26022 26023 26024 26025 26026 26027 26028 26029 26030 26031 26032 26033 26034 26035 26036 26037 26038 26039 26040 26041 26042 26043 26044 26045 26046 26047 26048 26049 26050 26051 26052 26053 26054 26055 26056 26057 26058 26059 26060 26061 26062 26063 26064 26065 26066 26067 26068 26069 26070 26071 26072 26073 26074 26075 26076 26077 26078 26079 26080 26081 26082 26083 26084 26085 26086 26087 26088 26089 26090 26091 26092 26093 26094 26095 26096 26097 26098 26099 26100 26101 26102 26103 26104 26105 26106 26107 26108 26109 26110 26111 26112 26113 26114 26115 26116 26117 26118 26119 26120 26121 26122 26123 26124 26125 26126 26127 26128 26129 26130 26131 26132 26133 26134 26135 26136 26137 26138 26139 26140 26141 26142 26143 26144 26145 26146 26147 26148 26149 26150 26151 26152 26153 26154 26155 26156 26157 26158 26159 26160 26161 26162 26163 26164 26165 26166 26167 26168 26169 26170 26171 26172 26173 26174 26175 26176 26177 26178 26179 26180 26181 26182 26183 26184 26185 26186 26187 26188 26189 26190 26191 26192 26193 26194 26195 26196 26197 26198 26199 26200 26201 26202 26203 26204 26205 26206 26207 26208 26209 26210 26211 26212 26213 26214 26215 26216 26217 26218 26219 26220 26221 26222 26223 26224 26225 26226 26227 26228 26229 26230 26231 26232 26233 26234 26235 26236 26237 26238 26239 26240 26241 26242 26243 26244 26245 26246 26247 26248 26249 26250 26251 26252 26253 26254 26255 26256 26257 26258 26259 26260 26261 26262 26263 26264 26265 26266 26267 26268 26269 26270 26271 26272 26273 26274 26275 26276 26277 26278 26279 26280 26281 26282 26283 26284 26285 26286 26287 26288 26289 26290 26291 26292 26293 26294 26295 26296 26297 26298 26299 26300 26301 26302 26303 26304 26305 26306 26307 26308 26309 26310 26311 26312 26313 26314 26315 26316 26317 26318 26319 26320 26321 26322 26323 26324 26325 26326 26327 26328 26329 26330 26331 26332 26333 26334 26335 26336 26337 26338 26339 26340 26341 26342 26343 26344 26345 26346 26347 26348 26349 26350 26351 26352 26353 26354 26355 26356 26357 26358 26359 26360 26361 26362 26363 26364 26365 26366 26367 26368 26369 26370 26371 26372 26373 26374 26375 26376 26377 26378 26379 26380 26381 26382 26383 26384 26385 26386 26387 26388 26389 26390 26391 26392 26393 26394 26395 26396 26397 26398 26399 26400 26401 26402 26403 26404 26405 26406 26407 26408 26409 26410 26411 26412 26413 26414 26415 26416 26417 26418 26419 26420 26421 26422 26423 26424 26425 26426 26427 26428 26429 26430 26431 26432 26433 26434 26435 26436 26437 26438 26439 26440 26441 26442 26443 26444 26445 26446 26447 26448 26449 26450 26451 26452 26453 26454 26455 26456 26457 26458 26459 26460 26461 26462 26463 26464 26465 26466 26467 26468 26469 26470 26471 26472 26473 26474 26475 26476 26477 26478 26479 26480 26481 26482 26483 26484 26485 26486 26487 26488 26489 26490 26491 26492 26493 26494 26495 26496 26497 26498 26499 26500 26501 26502 26503 26504 26505 26506 26507 26508 26509 26510 26511 26512 26513 26514 26515 26516 26517 26518 26519 26520 26521 26522 26523 26524 26525 26526 26527 26528 26529 26530 26531 26532 26533 26534 26535 26536 26537 26538 26539 26540 26541 26542 26543 26544 26545 26546 26547 26548 26549 26550 26551 26552 26553 26554 26555 26556 26557 26558 26559 26560 26561 26562 26563 26564 26565 26566 26567 26568 26569 26570 26571 26572 26573 26574 26575 26576 26577 26578 26579 26580 26581 26582 26583 26584 26585 26586 26587 26588 26589 26590 26591 26592 26593 26594 26595 26596 26597 26598 26599 26600 26601 26602 26603 26604 26605 26606 26607 26608 26609 26610 26611 26612 26613 26614 26615 26616 26617 26618 26619 26620 26621 26622 26623 26624 26625 26626 26627 26628 26629 26630 26631 26632 26633 26634 26635 26636 26637 26638 26639 26640 26641 26642 26643 26644 26645 26646 26647 26648 26649 26650 26651 26652 26653 26654 26655 26656 26657 26658 26659 26660 26661 26662 26663 26664 26665 26666 26667 26668 26669 26670 26671 26672 26673 26674 26675 26676 26677 26678 26679 26680 26681 26682 26683 26684 26685 26686 26687 26688 26689 26690 26691 26692 26693 26694 26695 26696 26697 26698 26699 26700 26701 26702 26703 26704 26705 26706 26707 26708 26709 26710 26711 26712 26713 26714 26715 26716 26717 26718 26719 26720 26721 26722 26723 26724 26725 26726 26727 26728 26729 26730 26731 26732 26733 26734 26735 26736 26737 26738 26739 26740 26741 26742 26743 26744 26745 26746 26747 26748 26749 26750 26751 26752 26753 26754 26755 26756 26757 26758 26759 26760 26761 26762 26763 26764 26765 26766 26767 26768 26769 26770 26771 26772 26773 26774 26775 26776 26777 26778 26779 26780 26781 26782 26783 26784 26785 26786 26787 26788 26789 26790 26791 26792 26793 26794 26795 26796 26797 26798 26799 26800 26801 26802 26803 26804 26805 26806 26807 26808 26809 26810 26811 26812 26813 26814 26815 26816 26817 26818 26819 26820 26821 26822 26823 26824 26825 26826 26827 26828 26829 26830 26831 26832 26833 26834 26835 26836 26837 26838 26839 26840 26841 26842 26843 26844 26845 26846 26847 26848 26849 26850 26851 26852 26853 26854 26855 26856 26857 26858 26859 26860 26861 26862 26863 26864 26865 26866 26867 26868 26869 26870 26871 26872 26873 26874 26875 26876 26877 26878 26879 26880 26881 26882 26883 26884 26885 26886 26887 26888 26889 26890 26891 26892 26893 26894 26895 26896 26897 26898 26899 26900 26901 26902 26903 26904 26905 26906 26907 26908 26909 26910 26911 26912 26913 26914 26915 26916 26917 26918 26919 26920 26921 26922 26923 26924 26925 26926 26927 26928 26929 26930 26931 26932 26933 26934 26935 26936 26937 26938 26939 26940 26941 26942 26943 26944 26945 26946 26947 26948 26949 26950 26951 26952 26953 26954 26955 26956 26957 26958 26959 26960 26961 26962 26963 26964 26965 26966 26967 26968 26969 26970 26971 26972 26973 26974 26975 26976 26977 26978 26979 26980 26981 26982 26983 26984 26985 26986 26987 26988 26989 26990 26991 26992 26993 26994 26995 26996 26997 26998 26999 27000 27001 27002 27003 27004 27005 27006 27007 27008 27009 27010 27011 27012 27013 27014 27015 27016 27017 27018 27019 27020 27021 27022 27023 27024 27025 27026 27027 27028 27029 27030 27031 27032 27033 27034 27035 27036 27037 27038 27039 27040 27041 27042 27043 27044 27045 27046 27047 27048 27049 27050 27051 27052 27053 27054 27055 27056 27057 27058 27059 27060 27061 27062 27063 27064 27065 27066 27067 27068 27069 27070 27071 27072 27073 27074 27075 27076 27077 27078 27079 27080 27081 27082 27083 27084 27085 27086 27087 27088 27089 27090 27091 27092 27093 27094 27095 27096 27097 27098 27099 27100 27101 27102 27103 27104 27105 27106 27107 27108 27109 27110 27111 27112 27113 27114 27115 27116 27117 27118 27119 27120 27121 27122 27123 27124 27125 27126 27127 27128 27129 27130 27131 27132 27133 27134 27135 27136 27137 27138 27139 27140 27141 27142 27143 27144 27145 27146 27147 27148 27149 27150 27151 27152 27153 27154 27155 27156 27157 27158 27159 27160 27161 27162 27163 27164 27165 27166 27167 27168 27169 27170 27171 27172 27173 27174 27175 27176 27177 27178 27179 27180 27181 27182 27183 27184 27185 27186 27187 27188 27189 27190 27191 27192 27193 27194 27195 27196 27197 27198 27199 27200 27201 27202 27203 27204 27205 27206 27207 27208 27209 27210 27211 27212 27213 27214 27215 27216 27217 27218 27219 27220 27221 27222 27223 27224 27225 27226 27227 27228 27229 27230 27231 27232 27233 27234 27235 27236 27237 27238 27239 27240 27241 27242 27243 27244 27245 27246 27247 27248 27249 27250 27251 27252 27253 27254 27255 27256 27257 27258 27259 27260 27261 27262 27263 27264 27265 27266 27267 27268 27269 27270 27271 27272 27273 27274 27275 27276 27277 27278 27279 27280 27281 27282 27283 27284 27285 27286 27287 27288 27289 27290 27291 27292 27293 27294 27295 27296 27297 27298 27299 27300 27301 27302 27303 27304 27305 27306 27307 27308 27309 27310 27311 27312 27313 27314 27315 27316 27317 27318 27319 27320 27321 27322 27323 27324 27325 27326 27327 27328 27329 27330 27331 27332 27333 27334 27335 27336 27337 27338 27339 27340 27341 27342 27343 27344 27345 27346 27347 27348 27349 27350 27351 27352 27353 27354 27355 27356 27357 27358 27359 27360 27361 27362 27363 27364 27365 27366 27367 27368 27369 27370 27371 27372 27373 27374 27375 27376 27377 27378 27379 27380 27381 27382 27383 27384 27385 27386 27387 27388 27389 27390 27391 27392 27393 27394 27395 27396 27397 27398 27399 27400 27401 27402 27403 27404 27405 27406 27407 27408 27409 27410 27411 27412 27413 27414 27415 27416 27417 27418 27419 27420 27421 27422 27423 27424 27425 27426 27427 27428 27429 27430 27431 27432 27433 27434 27435 27436 27437 27438 27439 27440 27441 27442 27443 27444 27445 27446 27447 27448 27449 27450 27451 27452 27453 27454 27455 27456 27457 27458 27459 27460 27461 27462 27463 27464 27465 27466 27467 27468 27469 27470 27471 27472 27473 27474 27475 27476 27477 27478 27479 27480 27481 27482 27483 27484 27485 27486 27487 27488 27489 27490 27491 27492 27493 27494 27495 27496 27497 27498 27499 27500 27501 27502 27503 27504 27505 27506 27507 27508 27509 27510 27511 27512 27513 27514 27515 27516 27517 27518 27519 27520 27521 27522 27523 27524 27525 27526 27527 27528 27529 27530 27531 27532 27533 27534 27535 27536 27537 27538 27539 27540 27541 27542 27543 27544 27545 27546 27547 27548 27549 27550 27551 27552 27553 27554 27555 27556 27557 27558 27559 27560 27561 27562 27563 27564 27565 27566 27567 27568 27569 27570 27571 27572 27573 27574 27575 27576 27577 27578 27579 27580 27581 27582 27583 27584 27585 27586 27587 27588 27589 27590 27591 27592 27593 27594 27595 27596 27597 27598 27599 27600 27601 27602 27603 27604 27605 27606 27607 27608 27609 27610 27611 27612 27613 27614 27615 27616 27617 27618 27619 27620 27621 27622 27623 27624 27625 27626 27627 27628 27629 27630 27631 27632 27633 27634 27635 27636 27637 27638 27639 27640 27641 27642 27643 27644 27645 27646 27647 27648 27649 27650 27651 27652 27653 27654 27655 27656 27657 27658 27659 27660 27661 27662 27663 27664 27665 27666 27667 27668 27669 27670 27671 27672 27673 27674 27675 27676 27677 27678 27679 27680 27681 27682 27683 27684 27685 27686 27687 27688 27689 27690 27691 27692 27693 27694 27695 27696 27697 27698 27699 27700 27701 27702 27703 27704 27705 27706 27707 27708 27709 27710 27711 27712 27713 27714 27715 27716 27717 27718 27719 27720 27721 27722 27723 27724 27725 27726 27727 27728 27729 27730 27731 27732 27733 27734 27735 27736 27737 27738 27739 27740 27741 27742 27743 27744 27745 27746 27747 27748 27749 27750 27751 27752 27753 27754 27755 27756 27757 27758 27759 27760 27761 27762 27763 27764 27765 27766 27767 27768 27769 27770 27771 27772 27773 27774 27775 27776 27777 27778 27779 27780 27781 27782 27783 27784 27785 27786 27787 27788 27789 27790 27791 27792 27793 27794 27795 27796 27797 27798 27799 27800 27801 27802 27803 27804 27805 27806 27807 27808 27809 27810 27811 27812 27813 27814 27815 27816 27817 27818 27819 27820 27821 27822 27823 27824 27825 27826 27827 27828 27829 27830 27831 27832 27833 27834 27835 27836 27837 27838 27839 27840 27841 27842 27843 27844 27845 27846 27847 27848 27849 27850 27851 27852 27853 27854 27855 27856 27857 27858 27859 27860 27861 27862 27863 27864 27865 27866 27867 27868 27869 27870 27871 27872 27873 27874 27875 27876 27877 27878 27879 27880 27881 27882 27883 27884 27885 27886 27887 27888 27889 27890 27891 27892 27893 27894 27895 27896 27897 27898 27899 27900 27901 27902 27903 27904 27905 27906 27907 27908 27909 27910 27911 27912 27913 27914 27915 27916 27917 27918 27919 27920 27921 27922 27923 27924 27925 27926 27927 27928 27929 27930 27931 27932 27933 27934 27935 27936 27937 27938 27939 27940 27941 27942 27943 27944 27945 27946 27947 27948 27949 27950 27951 27952 27953 27954 27955 27956 27957 27958 27959 27960 27961 27962 27963 27964 27965 27966 27967 27968 27969 27970 27971 27972 27973 27974 27975 27976 27977 27978 27979 27980 27981 27982 27983 27984 27985 27986 27987 27988 27989 27990 27991 27992 27993 27994 27995 27996 27997 27998 27999 28000 28001 28002 28003 28004 28005 28006 28007 28008 28009 28010 28011 28012 28013 28014 28015 28016 28017 28018 28019 28020 28021 28022 28023 28024 28025 28026 28027 28028 28029 28030 28031 28032 28033 28034 28035 28036 28037 28038 28039 28040 28041 28042 28043 28044 28045 28046 28047 28048 28049 28050 28051 28052 28053 28054 28055 28056 28057 28058 28059 28060 28061 28062 28063 28064 28065 28066 28067 28068 28069 28070 28071 28072 28073 28074 28075 28076 28077 28078 28079 28080 28081 28082 28083 28084 28085 28086 28087 28088 28089 28090 28091 28092 28093 28094 28095 28096 28097 28098 28099 28100 28101 28102 28103 28104 28105 28106 28107 28108 28109 28110 28111 28112 28113 28114 28115 28116 28117 28118 28119 28120 28121 28122 28123 28124 28125 28126 28127 28128 28129 28130 28131 28132 28133 28134 28135 28136 28137 28138 28139 28140 28141 28142 28143 28144 28145 28146 28147 28148 28149 28150 28151 28152 28153 28154 28155 28156 28157 28158 28159 28160 28161 28162 28163 28164 28165 28166 28167 28168 28169 28170 28171 28172 28173 28174 28175 28176 28177 28178 28179 28180 28181 28182 28183 28184 28185 28186 28187 28188 28189 28190 28191 28192 28193 28194 28195 28196 28197 28198 28199 28200 28201 28202 28203 28204 28205 28206 28207 28208 28209 28210 28211 28212 28213 28214 28215 28216 28217 28218 28219 28220 28221 28222 28223 28224 28225 28226 28227 28228 28229 28230 28231 28232 28233 28234 28235 28236 28237 28238 28239 28240 28241 28242 28243 28244 28245 28246 28247 28248 28249 28250 28251 28252 28253 28254 28255 28256 28257 28258 28259 28260 28261 28262 28263 28264 28265 28266 28267 28268 28269 28270 28271 28272 28273 28274 28275 28276 28277 28278 28279 28280 28281 28282 28283 28284 28285 28286 28287 28288 28289 28290 28291 28292 28293 28294 28295 28296 28297 28298 28299 28300 28301 28302 28303 28304 28305 28306 28307 28308 28309 28310 28311 28312 28313 28314 28315 28316 28317 28318 28319 28320 28321 28322 28323 28324 28325 28326 28327 28328 28329 28330 28331 28332 28333 28334 28335 28336 28337 28338 28339 28340 28341 28342 28343 28344 28345 28346 28347 28348 28349 28350 28351 28352 28353 28354 28355 28356 28357 28358 28359 28360 28361 28362 28363 28364 28365 28366 28367 28368 28369 28370 28371 28372 28373 28374 28375 28376 28377 28378 28379 28380 28381 28382 28383 28384 28385 28386 28387 28388 28389 28390 28391 28392 28393 28394 28395 28396 28397 28398 28399 28400 28401 28402 28403 28404 28405 28406 28407 28408 28409 28410 28411 28412 28413 28414 28415 28416 28417 28418 28419 28420 28421 28422 28423 28424 28425 28426 28427 28428 28429 28430 28431 28432 28433 28434 28435 28436 28437 28438 28439 28440 28441 28442 28443 28444 28445 28446 28447 28448 28449 28450 28451 28452 28453 28454 28455 28456 28457 28458 28459 28460 28461 28462 28463 28464 28465 28466 28467 28468 28469 28470 28471 28472 28473 28474 28475 28476 28477 28478 28479 28480 28481 28482 28483 28484 28485 28486 28487 28488 28489 28490 28491 28492 28493 28494 28495 28496 28497 28498 28499 28500 28501 28502 28503 28504 28505 28506 28507 28508 28509 28510 28511 28512 28513 28514 28515 28516 28517 28518 28519 28520 28521 28522 28523 28524 28525 28526 28527 28528 28529 28530 28531 28532 28533 28534 28535 28536 28537 28538 28539 28540 28541 28542 28543 28544 28545 28546 28547 28548 28549 28550 28551 28552 28553 28554 28555 28556 28557 28558 28559 28560 28561 28562 28563 28564 28565 28566 28567 28568 28569 28570 28571 28572 28573 28574 28575 28576 28577 28578 28579 28580 28581 28582 28583 28584 28585 28586 28587 28588 28589 28590 28591 28592 28593 28594 28595 28596 28597 28598 28599 28600 28601 28602 28603 28604 28605 28606 28607 28608 28609 28610 28611 28612 28613 28614 28615 28616 28617 28618 28619 28620 28621 28622 28623 28624 28625 28626 28627 28628 28629 28630 28631 28632 28633 28634 28635 28636 28637 28638 28639 28640 28641 28642 28643 28644 28645 28646 28647 28648 28649 28650 28651 28652 28653 28654 28655 28656 28657 28658 28659 28660 28661 28662 28663 28664 28665 28666 28667 28668 28669 28670 28671 28672 28673 28674 28675 28676 28677 28678 28679 28680 28681 28682 28683 28684 28685 28686 28687 28688 28689 28690 28691 28692 28693 28694 28695 28696 28697 28698 28699 28700 28701 28702 28703 28704 28705 28706 28707 28708 28709 28710 28711 28712 28713 28714 28715 28716 28717 28718 28719 28720 28721 28722 28723 28724 28725 28726 28727 28728 28729 28730 28731 28732 28733 28734 28735 28736 28737 28738 28739 28740 28741 28742 28743 28744 28745 28746 28747 28748 28749 28750 28751 28752 28753 28754 28755 28756 28757 28758 28759 28760 28761 28762 28763 28764 28765 28766 28767 28768 28769 28770 28771 28772 28773 28774 28775 28776 28777 28778 28779 28780 28781 28782 28783 28784 28785 28786 28787 28788 28789 28790 28791 28792 28793 28794 28795 28796 28797 28798 28799 28800 28801 28802 28803 28804 28805 28806 28807 28808 28809 28810 28811 28812 28813 28814 28815 28816 28817 28818 28819 28820 28821 28822 28823 28824 28825 28826 28827 28828 28829 28830 28831 28832 28833 28834 28835 28836 28837 28838 28839 28840 28841 28842 28843 28844 28845 28846 28847 28848 28849 28850 28851 28852 28853 28854 28855 28856 28857 28858 28859 28860 28861 28862 28863 28864 28865 28866 28867 28868 28869 28870 28871 28872 28873 28874 28875 28876 28877 28878 28879 28880 28881 28882 28883 28884 28885 28886 28887 28888 28889 28890 28891 28892 28893 28894 28895 28896 28897 28898 28899 28900 28901 28902 28903 28904 28905 28906 28907 28908 28909 28910 28911 28912 28913 28914 28915 28916 28917 28918 28919 28920 28921 28922 28923 28924 28925 28926 28927 28928 28929 28930 28931 28932 28933 28934 28935 28936 28937 28938 28939 28940 28941 28942 28943 28944 28945 28946 28947 28948 28949 28950 28951 28952 28953 28954 28955 28956 28957 28958 28959 28960 28961 28962 28963 28964 28965 28966 28967 28968 28969 28970 28971 28972 28973 28974 28975 28976 28977 28978 28979 28980 28981 28982 28983 28984 28985 28986 28987 28988 28989 28990 28991 28992 28993 28994 28995 28996 28997 28998 28999 29000 29001 29002 29003 29004 29005 29006 29007 29008 29009 29010 29011 29012 29013 29014 29015 29016 29017 29018 29019 29020 29021 29022 29023 29024 29025 29026 29027 29028 29029 29030 29031 29032 29033 29034 29035 29036 29037 29038 29039 29040 29041 29042 29043 29044 29045 29046 29047 29048 29049 29050 29051 29052 29053 29054 29055 29056 29057 29058 29059 29060 29061 29062 29063 29064 29065 29066 29067 29068 29069 29070 29071 29072 29073 29074 29075 29076 29077 29078 29079 29080 29081 29082 29083 29084 29085 29086 29087 29088 29089 29090 29091 29092 29093 29094 29095 29096 29097 29098 29099 29100 29101 29102 29103 29104 29105 29106 29107 29108 29109 29110 29111 29112 29113 29114 29115 29116 29117 29118 29119 29120 29121 29122 29123 29124 29125 29126 29127 29128 29129 29130 29131 29132 29133 29134 29135 29136 29137 29138 29139 29140 29141 29142 29143 29144 29145 29146 29147 29148 29149 29150 29151 29152 29153 29154 29155 29156 29157 29158 29159 29160 29161 29162 29163 29164 29165 29166 29167 29168 29169 29170 29171 29172 29173 29174 29175 29176 29177 29178 29179 29180 29181 29182 29183 29184 29185 29186 29187 29188 29189 29190 29191 29192 29193 29194 29195 29196 29197 29198 29199 29200 29201 29202 29203 29204 29205 29206 29207 29208 29209 29210 29211 29212 29213 29214 29215 29216 29217 29218 29219 29220 29221 29222 29223 29224 29225 29226 29227 29228 29229 29230 29231 29232 29233 29234 29235 29236 29237 29238 29239 29240 29241 29242 29243 29244 29245 29246 29247 29248 29249 29250 29251 29252 29253 29254 29255 29256 29257 29258 29259 29260 29261 29262 29263 29264 29265 29266 29267 29268 29269 29270 29271 29272 29273 29274 29275 29276 29277 29278 29279 29280 29281 29282 29283 29284 29285 29286 29287 29288 29289 29290 29291 29292 29293 29294 29295 29296 29297 29298 29299 29300 29301 29302 29303 29304 29305 29306 29307 29308 29309 29310 29311 29312 29313 29314 29315 29316 29317 29318 29319 29320 29321 29322 29323 29324 29325 29326 29327 29328 29329 29330 29331 29332 29333 29334 29335 29336 29337 29338 29339 29340 29341 29342 29343 29344 29345 29346 29347 29348 29349 29350 29351 29352 29353 29354 29355 29356 29357 29358 29359 29360 29361 29362 29363 29364 29365 29366 29367 29368 29369 29370 29371 29372 29373 29374 29375 29376 29377 29378 29379 29380 29381 29382 29383 29384 29385 29386 29387 29388 29389 29390 29391 29392 29393 29394 29395 29396 29397 29398 29399 29400 29401 29402 29403 29404 29405 29406 29407 29408 29409 29410 29411 29412 29413 29414 29415 29416 29417 29418 29419 29420 29421 29422 29423 29424 29425 29426 29427 29428 29429 29430 29431 29432 29433 29434 29435 29436 29437 29438 29439 29440 29441 29442 29443 29444 29445 29446 29447 29448 29449 29450 29451 29452 29453 29454 29455 29456 29457 29458 29459 29460 29461 29462 29463 29464 29465 29466 29467 29468 29469 29470 29471 29472 29473 29474 29475 29476 29477 29478 29479 29480 29481 29482 29483 29484 29485 29486 29487 29488 29489 29490 29491 29492 29493 29494 29495 29496 29497 29498 29499 29500 29501 29502 29503 29504 29505 29506 29507 29508 29509 29510 29511 29512 29513 29514 29515 29516 29517 29518 29519 29520 29521 29522 29523 29524 29525 29526 29527 29528 29529 29530 29531 29532 29533 29534 29535 29536 29537 29538 29539 29540 29541 29542 29543 29544 29545 29546 29547 29548 29549 29550 29551 29552 29553 29554 29555 29556 29557 29558 29559 29560 29561 29562 29563 29564 29565 29566 29567 29568 29569 29570 29571 29572 29573 29574 29575 29576 29577 29578 29579 29580 29581 29582 29583 29584 29585 29586 29587 29588 29589 29590 29591 29592 29593 29594 29595 29596 29597 29598 29599 29600 29601 29602 29603 29604 29605 29606 29607 29608 29609 29610 29611 29612 29613 29614 29615 29616 29617 29618 29619 29620 29621 29622 29623 29624 29625 29626 29627 29628 29629 29630 29631 29632 29633 29634 29635 29636 29637 29638 29639 29640 29641 29642 29643 29644 29645 29646 29647 29648 29649 29650 29651 29652 29653 29654 29655 29656 29657 29658 29659 29660 29661 29662 29663 29664 29665 29666 29667 29668 29669 29670 29671 29672 29673 29674 29675 29676 29677 29678 29679 29680 29681 29682 29683 29684 29685 29686 29687 29688 29689 29690 29691 29692 29693 29694 29695 29696 29697 29698 29699 29700 29701 29702 29703 29704 29705 29706 29707 29708 29709 29710 29711 29712 29713 29714 29715 29716 29717 29718 29719 29720 29721 29722 29723 29724 29725 29726 29727 29728 29729 29730 29731 29732 29733 29734 29735 29736 29737 29738 29739 29740 29741 29742 29743 29744 29745 29746 29747 29748 29749 29750 29751 29752 29753 29754 29755 29756 29757 29758 29759 29760 29761 29762 29763 29764 29765 29766 29767 29768 29769 29770 29771 29772 29773 29774 29775 29776 29777 29778 29779 29780 29781 29782 29783 29784 29785 29786 29787 29788 29789 29790 29791 29792 29793 29794 29795 29796 29797 29798 29799 29800 29801 29802 29803 29804 29805 29806 29807 29808 29809 29810 29811 29812 29813 29814 29815 29816 29817 29818 29819 29820 29821 29822 29823 29824 29825 29826 29827 29828 29829 29830 29831 29832 29833 29834 29835 29836 29837 29838 29839 29840 29841 29842 29843 29844 29845 29846 29847 29848 29849 29850 29851 29852 29853 29854 29855 29856 29857 29858 29859 29860 29861 29862 29863 29864 29865 29866 29867 29868 29869 29870 29871 29872 29873 29874 29875 29876 29877 29878 29879 29880 29881 29882 29883 29884 29885 29886 29887 29888 29889 29890 29891 29892 29893 29894 29895 29896 29897 29898 29899 29900 29901 29902 29903 29904 29905 29906 29907 29908 29909 29910 29911 29912 29913 29914 29915 29916 29917 29918 29919 29920 29921 29922 29923 29924 29925 29926 29927 29928 29929 29930 29931 29932 29933 29934 29935 29936 29937 29938 29939 29940 29941 29942 29943 29944 29945 29946 29947 29948 29949 29950 29951 29952 29953 29954 29955 29956 29957 29958 29959 29960 29961 29962 29963 29964 29965 29966 29967 29968 29969 29970 29971 29972 29973 29974 29975 29976 29977 29978 29979 29980 29981 29982 29983 29984 29985 29986 29987 29988 29989 29990 29991 29992 29993 29994 29995 29996 29997 29998 29999 30000 30001 30002 30003 30004 30005 30006 30007 30008 30009 30010 30011 30012 30013 30014 30015 30016 30017 30018 30019 30020 30021 30022 30023 30024 30025 30026 30027 30028 30029 30030 30031 30032 30033 30034 30035 30036 30037 30038 30039 30040 30041 30042 30043 30044 30045 30046 30047 30048 30049 30050 30051 30052 30053 30054 30055 30056 30057 30058 30059 30060 30061 30062 30063 30064 30065 30066 30067 30068 30069 30070 30071 30072 30073 30074 30075 30076 30077 30078 30079 30080 30081 30082 30083 30084 30085 30086 30087 30088 30089 30090 30091 30092 30093 30094 30095 30096 30097 30098 30099 30100 30101 30102 30103 30104 30105 30106 30107 30108 30109 30110 30111 30112 30113 30114 30115 30116 30117 30118 30119 30120 30121 30122 30123 30124 30125 30126 30127 30128 30129 30130 30131 30132 30133 30134 30135 30136 30137 30138 30139 30140 30141 30142 30143 30144 30145 30146 30147 30148 30149 30150 30151 30152 30153 30154 30155 30156 30157 30158 30159 30160 30161 30162 30163 30164 30165 30166 30167 30168 30169 30170 30171 30172 30173 30174 30175 30176 30177 30178 30179 30180 30181 30182 30183 30184 30185 30186 30187 30188 30189 30190 30191 30192 30193 30194 30195 30196 30197 30198 30199 30200 30201 30202 30203 30204 30205 30206 30207 30208 30209 30210 30211 30212 30213 30214 30215 30216 30217 30218 30219 30220 30221 30222 30223 30224 30225 30226 30227 30228 30229 30230 30231 30232 30233 30234 30235 30236 30237 30238 30239 30240 30241 30242 30243 30244 30245 30246 30247 30248 30249 30250 30251 30252 30253 30254 30255 30256 30257 30258 30259 30260 30261 30262 30263 30264 30265 30266 30267 30268 30269 30270 30271 30272 30273 30274 30275 30276 30277 30278 30279 30280 30281 30282 30283 30284 30285 30286 30287 30288 30289 30290 30291 30292 30293 30294 30295 30296 30297 30298 30299 30300 30301 30302 30303 30304 30305 30306 30307 30308 30309 30310 30311 30312 30313 30314 30315 30316 30317 30318 30319 30320 30321 30322 30323 30324 30325 30326 30327 30328 30329 30330 30331 30332 30333 30334 30335 30336 30337 30338 30339 30340 30341 30342 30343 30344 30345 30346 30347 30348 30349 30350 30351 30352 30353 30354 30355 30356 30357 30358 30359 30360 30361 30362 30363 30364 30365 30366 30367 30368 30369 30370 30371 30372 30373 30374 30375 30376 30377 30378 30379 30380 30381 30382 30383 30384 30385 30386 30387 30388 30389 30390 30391 30392 30393 30394 30395 30396 30397 30398 30399 30400 30401 30402 30403 30404 30405 30406 30407 30408 30409 30410 30411 30412 30413 30414 30415 30416 30417 30418 30419 30420 30421 30422 30423 30424 30425 30426 30427 30428 30429 30430 30431 30432 30433 30434 30435 30436 30437 30438 30439 30440 30441 30442 30443 30444 30445 30446 30447 30448 30449 30450 30451 30452 30453 30454 30455 30456 30457 30458 30459 30460 30461 30462 30463 30464 30465 30466 30467 30468 30469 30470 30471 30472 30473 30474 30475 30476 30477 30478 30479 30480 30481 30482 30483 30484 30485 30486 30487 30488 30489 30490 30491 30492 30493 30494 30495 30496 30497 30498 30499 30500 30501 30502 30503 30504 30505 30506 30507 30508 30509 30510 30511 30512 30513 30514 30515 30516 30517 30518 30519 30520 30521 30522 30523 30524 30525 30526 30527 30528 30529 30530 30531 30532 30533 30534 30535 30536 30537 30538 30539 30540 30541 30542 30543 30544 30545 30546 30547 30548 30549 30550 30551 30552 30553 30554 30555 30556 30557 30558 30559 30560 30561 30562 30563 30564 30565 30566 30567 30568 30569 30570 30571 30572 30573 30574 30575 30576 30577 30578 30579 30580 30581 30582 30583 30584 30585 30586 30587 30588 30589 30590 30591 30592 30593 30594 30595 30596 30597 30598 30599 30600 30601 30602 30603 30604 30605 30606 30607 30608 30609 30610 30611 30612 30613 30614 30615 30616 30617 30618 30619 30620 30621 30622 30623 30624 30625 30626 30627 30628 30629 30630 30631 30632 30633 30634 30635 30636 30637 30638 30639 30640 30641 30642 30643 30644 30645 30646 30647 30648 30649 30650 30651 30652 30653 30654 30655 30656 30657 30658 30659 30660 30661 30662 30663 30664 30665 30666 30667 30668 30669 30670 30671 30672 30673 30674 30675 30676 30677 30678 30679 30680 30681 30682 30683 30684 30685 30686 30687 30688 30689 30690 30691 30692 30693 30694 30695 30696 30697 30698 30699 30700 30701 30702 30703 30704 30705 30706 30707 30708 30709 30710 30711 30712 30713 30714 30715 30716 30717 30718 30719 30720 30721 30722 30723 30724 30725 30726 30727 30728 30729 30730 30731 30732 30733 30734 30735 30736 30737 30738 30739 30740 30741 30742 30743 30744 30745 30746 30747 30748 30749 30750 30751 30752 30753 30754 30755 30756 30757 30758 30759 30760 30761 30762 30763 30764 30765 30766 30767 30768 30769 30770 30771 30772 30773 30774 30775 30776 30777 30778 30779 30780 30781 30782 30783 30784 30785 30786 30787 30788 30789 30790 30791 30792 30793 30794 30795 30796 30797 30798 30799 30800 30801 30802 30803 30804 30805 30806 30807 30808 30809 30810 30811 30812 30813 30814 30815 30816 30817 30818 30819 30820 30821 30822 30823 30824 30825 30826 30827 30828 30829 30830 30831 30832 30833 30834 30835 30836 30837 30838 30839 30840 30841 30842 30843 30844 30845 30846 30847 30848 30849 30850 30851 30852 30853 30854 30855 30856 30857 30858 30859 30860 30861 30862 30863 30864 30865 30866 30867 30868 30869 30870 30871 30872 30873 30874 30875 30876 30877 30878 30879 30880 30881 30882 30883 30884 30885 30886 30887 30888 30889 30890 30891 30892 30893 30894 30895 30896 30897 30898 30899 30900 30901 30902 30903 30904 30905 30906 30907 30908 30909 30910 30911 30912 30913 30914 30915 30916 30917 30918 30919 30920 30921 30922 30923 30924 30925 30926 30927 30928 30929 30930 30931 30932 30933 30934 30935 30936 30937 30938 30939 30940 30941 30942 30943 30944 30945 30946 30947 30948 30949 30950 30951 30952 30953 30954 30955 30956 30957 30958 30959 30960 30961 30962 30963 30964 30965 30966 30967 30968 30969 30970 30971 30972 30973 30974 30975 30976 30977 30978 30979 30980 30981 30982 30983 30984 30985 30986 30987 30988 30989 30990 30991 30992 30993 30994 30995 30996 30997 30998 30999 31000 31001 31002 31003 31004 31005 31006 31007 31008 31009 31010 31011 31012 31013 31014 31015 31016 31017 31018 31019 31020 31021 31022 31023 31024 31025 31026 31027 31028 31029 31030 31031 31032 31033 31034 31035 31036 31037 31038 31039 31040 31041 31042 31043 31044 31045 31046 31047 31048 31049 31050 31051 31052 31053 31054 31055 31056 31057 31058 31059 31060 31061 31062 31063 31064 31065 31066 31067 31068 31069 31070 31071 31072 31073 31074 31075 31076 31077 31078 31079 31080 31081 31082 31083 31084 31085 31086 31087 31088 31089 31090 31091 31092 31093 31094 31095 31096 31097 31098 31099 31100 31101 31102 31103 31104 31105 31106 31107 31108 31109 31110 31111 31112 31113 31114 31115 31116 31117 31118 31119 31120 31121 31122 31123 31124 31125 31126 31127 31128 31129 31130 31131 31132 31133 31134 31135 31136 31137 31138 31139 31140 31141 31142 31143 31144 31145 31146 31147 31148 31149 31150 31151 31152 31153 31154 31155 31156 31157 31158 31159 31160 31161 31162 31163 31164 31165 31166 31167 31168 31169 31170 31171 31172 31173 31174 31175 31176 31177 31178 31179 31180 31181 31182 31183 31184 31185 31186 31187 31188 31189 31190 31191 31192 31193 31194 31195 31196 31197 31198 31199 31200 31201 31202 31203 31204 31205 31206 31207 31208 31209 31210 31211 31212 31213 31214 31215 31216 31217 31218 31219 31220 31221 31222 31223 31224 31225 31226 31227 31228 31229 31230 31231 31232 31233 31234 31235 31236 31237 31238 31239 31240 31241 31242 31243 31244 31245 31246 31247 31248 31249 31250 31251 31252 31253 31254 31255 31256 31257 31258 31259 31260 31261 31262 31263 31264 31265 31266 31267 31268 31269 31270 31271 31272 31273 31274 31275 31276 31277 31278 31279 31280 31281 31282 31283 31284 31285 31286 31287 31288 31289 31290 31291 31292 31293 31294 31295 31296 31297 31298 31299 31300 31301 31302 31303 31304 31305 31306 31307 31308 31309 31310 31311 31312 31313 31314 31315 31316 31317 31318 31319 31320 31321 31322 31323 31324 31325 31326 31327 31328 31329 31330 31331 31332 31333 31334 31335 31336 31337 31338 31339 31340 31341 31342 31343 31344 31345 31346 31347 31348 31349 31350 31351 31352 31353 31354 31355 31356 31357 31358 31359 31360 31361 31362 31363 31364 31365 31366 31367 31368 31369 31370 31371 31372 31373 31374 31375 31376 31377 31378 31379 31380 31381 31382 31383 31384 31385 31386 31387 31388 31389 31390 31391 31392 31393 31394 31395 31396 31397 31398 31399 31400 31401 31402 31403 31404 31405 31406 31407 31408 31409 31410 31411 31412 31413 31414 31415 31416 31417 31418 31419 31420 31421 31422 31423 31424 31425 31426 31427 31428 31429 31430 31431 31432 31433 31434 31435 31436 31437 31438 31439 31440 31441 31442 31443 31444 31445 31446 31447 31448 31449 31450 31451 31452 31453 31454 31455 31456 31457 31458 31459 31460 31461 31462 31463 31464 31465 31466 31467 31468 31469 31470 31471 31472 31473 31474 31475 31476 31477 31478 31479 31480 31481 31482 31483 31484 31485 31486 31487 31488 31489 31490 31491 31492 31493 31494 31495 31496 31497 31498 31499 31500 31501 31502 31503 31504 31505 31506 31507 31508 31509 31510 31511 31512 31513 31514 31515 31516 31517 31518 31519 31520 31521 31522 31523 31524 31525 31526 31527 31528 31529 31530 31531 31532 31533 31534 31535 31536 31537 31538 31539 31540 31541 31542 31543 31544 31545 31546 31547 31548 31549 31550 31551 31552 31553 31554 31555 31556 31557 31558 31559 31560 31561 31562 31563 31564 31565 31566 31567 31568 31569 31570 31571 31572 31573 31574 31575 31576 31577 31578 31579 31580 31581 31582 31583 31584 31585 31586 31587 31588 31589 31590 31591 31592 31593 31594 31595 31596 31597 31598 31599 31600 31601 31602 31603 31604 31605 31606 31607 31608 31609 31610 31611 31612 31613 31614 31615 31616 31617 31618 31619 31620 31621 31622 31623 31624 31625 31626 31627 31628 31629 31630 31631 31632 31633 31634 31635 31636 31637 31638 31639 31640 31641 31642 31643 31644 31645 31646 31647 31648 31649 31650 31651 31652 31653 31654 31655 31656 31657 31658 31659 31660 31661 31662 31663 31664 31665 31666 31667 31668 31669 31670 31671 31672 31673 31674 31675 31676 31677 31678 31679 31680 31681 31682 31683 31684 31685 31686 31687 31688 31689 31690 31691 31692 31693 31694 31695 31696 31697 31698 31699 31700 31701 31702 31703 31704 31705 31706 31707 31708 31709 31710 31711 31712 31713 31714 31715 31716 31717 31718 31719 31720 31721 31722 31723 31724 31725 31726 31727 31728 31729 31730 31731 31732 31733 31734 31735 31736 31737 31738 31739 31740 31741 31742 31743 31744 31745 31746 31747 31748 31749 31750 31751 31752 31753 31754 31755 31756 31757 31758 31759 31760 31761 31762 31763 31764 31765 31766 31767 31768 31769 31770 31771 31772 31773 31774 31775 31776 31777 31778 31779 31780 31781 31782 31783 31784 31785 31786 31787 31788 31789 31790 31791 31792 31793 31794 31795 31796 31797 31798 31799 31800 31801 31802 31803 31804 31805 31806 31807 31808 31809 31810 31811 31812 31813 31814 31815 31816 31817 31818 31819 31820 31821 31822 31823 31824 31825 31826 31827 31828 31829 31830 31831 31832 31833 31834 31835 31836 31837 31838 31839 31840 31841 31842 31843 31844 31845 31846 31847 31848 31849 31850 31851 31852 31853 31854 31855 31856 31857 31858 31859 31860 31861 31862 31863 31864 31865 31866 31867 31868 31869 31870 31871 31872 31873 31874 31875 31876 31877 31878 31879 31880 31881 31882 31883 31884 31885 31886 31887 31888 31889 31890 31891 31892 31893 31894 31895 31896 31897 31898 31899 31900 31901 31902 31903 31904 31905 31906 31907 31908 31909 31910 31911 31912 31913 31914 31915 31916 31917 31918 31919 31920 31921 31922 31923 31924 31925 31926 31927 31928 31929 31930 31931 31932 31933 31934 31935 31936 31937 31938 31939 31940 31941 31942 31943 31944 31945 31946 31947 31948 31949 31950 31951 31952 31953 31954 31955 31956 31957 31958 31959 31960 31961 31962 31963 31964 31965 31966 31967 31968 31969 31970 31971 31972 31973 31974 31975 31976 31977 31978 31979 31980 31981 31982 31983 31984 31985 31986 31987 31988 31989 31990 31991 31992 31993 31994 31995 31996 31997 31998 31999 32000 32001 32002 32003 32004 32005 32006 32007 32008 32009 32010 32011 32012 32013 32014 32015 32016 32017 32018 32019 32020 32021 32022 32023 32024 32025 32026 32027 32028 32029 32030 32031 32032 32033 32034 32035 32036 32037 32038 32039 32040 32041 32042 32043 32044 32045 32046 32047 32048 32049 32050 32051 32052 32053 32054 32055 32056 32057 32058 32059 32060 32061 32062 32063 32064 32065 32066 32067 32068 32069 32070 32071 32072 32073 32074 32075 32076 32077 32078 32079 32080 32081 32082 32083 32084 32085 32086 32087 32088 32089 32090 32091 32092 32093 32094 32095 32096 32097 32098 32099 32100 32101 32102 32103 32104 32105 32106 32107 32108 32109 32110 32111 32112 32113 32114 32115 32116 32117 32118 32119 32120 32121 32122 32123 32124 32125 32126 32127 32128 32129 32130 32131 32132 32133 32134 32135 32136 32137 32138 32139 32140 32141 32142 32143 32144 32145 32146 32147 32148 32149 32150 32151 32152 32153 32154 32155 32156 32157 32158 32159 32160 32161 32162 32163 32164 32165 32166 32167 32168 32169 32170 32171 32172 32173 32174 32175 32176 32177 32178 32179 32180 32181 32182 32183 32184 32185 32186 32187 32188 32189 32190 32191 32192 32193 32194 32195 32196 32197 32198 32199 32200 32201 32202 32203 32204 32205 32206 32207 32208 32209 32210 32211 32212 32213 32214 32215 32216 32217 32218 32219 32220 32221 32222 32223 32224 32225 32226 32227 32228 32229 32230 32231 32232 32233 32234 32235 32236 32237 32238 32239 32240 32241 32242 32243 32244 32245 32246 32247 32248 32249 32250 32251 32252 32253 32254 32255 32256 32257 32258 32259 32260 32261 32262 32263 32264 32265 32266 32267 32268 32269 32270 32271 32272 32273 32274 32275 32276 32277 32278 32279 32280 32281 32282 32283 32284 32285 32286 32287 32288 32289 32290 32291 32292 32293 32294 32295 32296 32297 32298 32299 32300 32301 32302 32303 32304 32305 32306 32307 32308 32309 32310 32311 32312 32313 32314 32315 32316 32317 32318 32319 32320 32321 32322 32323 32324 32325 32326 32327 32328 32329 32330 32331 32332 32333 32334 32335 32336 32337 32338 32339 32340 32341 32342 32343 32344 32345 32346 32347 32348 32349 32350 32351 32352 32353 32354 32355 32356 32357 32358 32359 32360 32361 32362 32363 32364 32365 32366 32367 32368 32369 32370 32371 32372 32373 32374 32375 32376 32377 32378 32379 32380 32381 32382 32383 32384 32385 32386 32387 32388 32389 32390 32391 32392 32393 32394 32395 32396 32397 32398 32399 32400 32401 32402 32403 32404 32405 32406 32407 32408 32409 32410 32411 32412 32413 32414 32415 32416 32417 32418 32419 32420 32421 32422 32423 32424 32425 32426 32427 32428 32429 32430 32431 32432 32433 32434 32435 32436 32437 32438 32439 32440 32441 32442 32443 32444 32445 32446 32447 32448 32449 32450 32451 32452 32453 32454 32455 32456 32457 32458 32459 32460 32461 32462 32463 32464 32465 32466 32467 32468 32469 32470 32471 32472 32473 32474 32475 32476 32477 32478 32479 32480 32481 32482 32483 32484 32485 32486 32487 32488 32489 32490 32491 32492 32493 32494 32495 32496 32497 32498 32499 32500 32501 32502 32503 32504 32505 32506 32507 32508 32509 32510 32511 32512 32513 32514 32515 32516 32517 32518 32519 32520 32521 32522 32523 32524 32525 32526 32527 32528 32529 32530 32531 32532 32533 32534 32535 32536 32537 32538 32539 32540 32541 32542 32543 32544 32545 32546 32547 32548 32549 32550 32551 32552 32553 32554 32555 32556 32557 32558 32559 32560 32561 32562 32563 32564 32565 32566 32567 32568 32569 32570 32571 32572 32573 32574 32575 32576 32577 32578 32579 32580 32581 32582 32583 32584 32585 32586 32587 32588 32589 32590 32591 32592 32593 32594 32595 32596 32597 32598 32599 32600 32601 32602 32603 32604 32605 32606 32607 32608 32609 32610 32611 32612 32613 32614 32615 32616 32617 32618 32619 32620 32621 32622 32623 32624 32625 32626 32627 32628 32629 32630 32631 32632 32633 32634 32635 32636 32637 32638 32639 32640 32641 32642 32643 32644 32645 32646 32647 32648 32649 32650 32651 32652 32653 32654 32655 32656 32657 32658 32659 32660 32661 32662 32663 32664 32665 32666 32667 32668 32669 32670 32671 32672 32673 32674 32675 32676 32677 32678 32679 32680 32681 32682 32683 32684 32685 32686 32687 32688 32689 32690 32691 32692 32693 32694 32695 32696 32697 32698 32699 32700 32701 32702 32703 32704 32705 32706 32707 32708 32709 32710 32711 32712 32713 32714 32715 32716 32717 32718 32719 32720 32721 32722 32723 32724 32725 32726 32727 32728 32729 32730 32731 32732 32733 32734 32735 32736 32737 32738 32739 32740 32741 32742 32743 32744 32745 32746 32747 32748 32749 32750 32751 32752 32753 32754 32755 32756 32757 32758 32759 32760 32761 32762 32763 32764 32765 32766 32767 32768 32769 32770 32771 32772 32773 32774 32775 32776 32777 32778 32779 32780 32781 32782 32783 32784 32785 32786 32787 32788 32789 32790 32791 32792 32793 32794 32795 32796 32797 32798 32799 32800 32801 32802 32803 32804 32805 32806 32807 32808 32809 32810 32811 32812 32813 32814 32815 32816 32817 32818 32819 32820 32821 32822 32823 32824 32825 32826 32827 32828 32829 32830 32831 32832 32833 32834 32835 32836 32837 32838 32839 32840 32841 32842 32843 32844 32845 32846 32847 32848 32849 32850 32851 32852 32853 32854 32855 32856 32857 32858 32859 32860 32861 32862 32863 32864 32865 32866 32867 32868 32869 32870 32871 32872 32873 32874 32875 32876 32877 32878 32879 32880 32881 32882 32883 32884 32885 32886 32887 32888 32889 32890 32891 32892 32893 32894 32895 32896 32897 32898 32899 32900 32901 32902 32903 32904 32905 32906 32907 32908 32909 32910 32911 32912 32913 32914 32915 32916 32917 32918 32919 32920 32921 32922 32923 32924 32925 32926 32927 32928 32929 32930 32931 32932 32933 32934 32935 32936 32937 32938 32939 32940 32941 32942 32943 32944 32945 32946 32947 32948 32949 32950 32951 32952 32953 32954 32955 32956 32957 32958 32959 32960 32961 32962 32963 32964 32965 32966 32967 32968 32969 32970 32971 32972 32973 32974 32975 32976 32977 32978 32979 32980 32981 32982 32983 32984 32985 32986 32987 32988 32989 32990 32991 32992 32993 32994 32995 32996 32997 32998 32999 33000 33001 33002 33003 33004 33005 33006 33007 33008 33009 33010 33011 33012 33013 33014 33015 33016 33017 33018 33019 33020 33021 33022 33023 33024 33025 33026 33027 33028 33029 33030 33031 33032 33033 33034 33035 33036 33037 33038 33039 33040 33041 33042 33043 33044 33045 33046 33047 33048 33049 33050 33051 33052 33053 33054 33055 33056 33057 33058 33059 33060 33061 33062 33063 33064 33065 33066 33067 33068 33069 33070 33071 33072 33073 33074 33075 33076 33077 33078 33079 33080 33081 33082 33083 33084 33085 33086 33087 33088 33089 33090 33091 33092 33093 33094 33095 33096 33097 33098 33099 33100 33101 33102 33103 33104 33105 33106 33107 33108 33109 33110 33111 33112 33113 33114 33115 33116 33117 33118 33119 33120 33121 33122 33123 33124 33125 33126 33127 33128 33129 33130 33131 33132 33133 33134 33135 33136 33137 33138 33139 33140 33141 33142 33143 33144 33145 33146 33147 33148 33149 33150 33151 33152 33153 33154 33155 33156 33157 33158 33159 33160 33161 33162 33163 33164 33165 33166 33167 33168 33169 33170 33171 33172 33173 33174 33175 33176 33177 33178 33179 33180 33181 33182 33183 33184 33185 33186 33187 33188 33189 33190 33191 33192 33193 33194 33195 33196 33197 33198 33199 33200 33201 33202 33203 33204 33205 33206 33207 33208 33209 33210 33211 33212 33213 33214 33215 33216 33217 33218 33219 33220 33221 33222 33223 33224 33225 33226 33227 33228 33229 33230 33231 33232 33233 33234 33235 33236 33237 33238 33239 33240 33241 33242 33243 33244 33245 33246 33247 33248 33249 33250 33251 33252 33253 33254 33255 33256 33257 33258 33259 33260 33261 33262 33263 33264 33265 33266 33267 33268 33269 33270 33271 33272 33273 33274 33275 33276 33277 33278 33279 33280 33281 33282 33283 33284 33285 33286 33287 33288 33289 33290 33291 33292 33293 33294 33295 33296 33297 33298 33299 33300 33301 33302 33303 33304 33305 33306 33307 33308 33309 33310 33311 33312 33313 33314 33315 33316 33317 33318 33319 33320 33321 33322 33323 33324 33325 33326 33327 33328 33329 33330 33331 33332 33333 33334 33335 33336 33337 33338 33339 33340 33341 33342 33343 33344 33345 33346 33347 33348 33349 33350 33351 33352 33353 33354 33355 33356 33357 33358 33359 33360 33361 33362 33363 33364 33365 33366 33367 33368 33369 33370 33371 33372 33373 33374 33375 33376 33377 33378 33379 33380 33381 33382 33383 33384 33385 33386 33387 33388 33389 33390 33391 33392 33393 33394 33395 33396 33397 33398 33399 33400 33401 33402 33403 33404 33405 33406 33407 33408 33409 33410 33411 33412 33413 33414 33415 33416 33417 33418 33419 33420 33421 33422 33423 33424 33425 33426 33427 33428 33429 33430 33431 33432 33433 33434 33435 33436 33437 33438 33439 33440 33441 33442 33443 33444 33445 33446 33447 33448 33449 33450 33451 33452 33453 33454 33455 33456 33457 33458 33459 33460 33461 33462 33463 33464 33465 33466 33467 33468 33469 33470 33471 33472 33473 33474 33475 33476 33477 33478 33479 33480 33481 33482 33483 33484 33485 33486 33487 33488 33489 33490 33491 33492 33493 33494 33495 33496 33497 33498 33499 33500 33501 33502 33503 33504 33505 33506 33507 33508 33509 33510 33511 33512 33513 33514 33515 33516 33517 33518 33519 33520 33521 33522 33523 33524 33525 33526 33527 33528 33529 33530 33531 33532 33533 33534 33535 33536 33537 33538 33539 33540 33541 33542 33543 33544 33545 33546 33547 33548 33549 33550 33551 33552 33553 33554 33555 33556 33557 33558 33559 33560 33561 33562 33563 33564 33565 33566 33567 33568 33569 33570 33571 33572 33573 33574 33575 33576 33577 33578 33579 33580 33581 33582 33583 33584 33585 33586 33587 33588 33589 33590 33591 33592 33593 33594 33595 33596 33597 33598 33599 33600 33601 33602 33603 33604 33605 33606 33607 33608 33609 33610 33611 33612 33613 33614 33615 33616 33617 33618 33619 33620 33621 33622 33623 33624 33625 33626 33627 33628 33629 33630 33631 33632 33633 33634 33635 33636 33637 33638 33639 33640 33641 33642 33643 33644 33645 33646 33647 33648 33649 33650 33651 33652 33653 33654 33655 33656 33657 33658 33659 33660 33661 33662 33663 33664 33665 33666 33667 33668 33669 33670 33671 33672 33673 33674 33675 33676 33677 33678 33679 33680 33681 33682 33683 33684 33685 33686 33687 33688 33689 33690 33691 33692 33693 33694 33695 33696 33697 33698 33699 33700 33701 33702 33703 33704 33705 33706 33707 33708 33709 33710 33711 33712 33713 33714 33715 33716 33717 33718 33719 33720 33721 33722 33723 33724 33725 33726 33727 33728 33729 33730 33731 33732 33733 33734 33735 33736 33737 33738 33739 33740 33741 33742 33743 33744 33745 33746 33747 33748 33749 33750 33751 33752 33753 33754 33755 33756 33757 33758 33759 33760 33761 33762 33763 33764 33765 33766 33767 33768 33769 33770 33771 33772 33773 33774 33775 33776 33777 33778 33779 33780 33781 33782 33783 33784 33785 33786 33787 33788 33789 33790 33791 33792 33793 33794 33795 33796 33797 33798 33799 33800 33801 33802 33803 33804 33805 33806 33807 33808 33809 33810 33811 33812 33813 33814 33815 33816 33817 33818 33819 33820 33821 33822 33823 33824 33825 33826 33827 33828 33829 33830 33831 33832 33833 33834 33835 33836 33837 33838 33839 33840 33841 33842 33843 33844 33845 33846 33847 33848 33849 33850 33851 33852 33853 33854 33855 33856 33857 33858 33859 33860 33861 33862 33863 33864 33865 33866 33867 33868 33869 33870 33871 33872 33873 33874 33875 33876 33877 33878 33879 33880 33881 33882 33883 33884 33885 33886 33887 33888 33889 33890 33891 33892 33893 33894 33895 33896 33897 33898 33899 33900 33901 33902 33903 33904 33905 33906 33907 33908 33909 33910 33911 33912 33913 33914 33915 33916 33917 33918 33919 33920 33921 33922 33923 33924 33925 33926 33927 33928 33929 33930 33931 33932 33933 33934 33935 33936 33937 33938 33939 33940 33941 33942 33943 33944 33945 33946 33947 33948 33949 33950 33951 33952 33953 33954 33955 33956 33957 33958 33959 33960 33961 33962 33963 33964 33965 33966 33967 33968 33969 33970 33971 33972 33973 33974 33975 33976 33977 33978 33979 33980 33981 33982 33983 33984 33985 33986 33987 33988 33989 33990 33991 33992 33993 33994 33995 33996 33997 33998 33999 34000 34001 34002 34003 34004 34005 34006 34007 34008 34009 34010 34011 34012 34013 34014 34015 34016 34017 34018 34019 34020 34021 34022 34023 34024 34025 34026 34027 34028 34029 34030 34031 34032 34033 34034 34035 34036 34037 34038 34039 34040 34041 34042 34043 34044 34045 34046 34047 34048 34049 34050 34051 34052 34053 34054 34055 34056 34057 34058 34059 34060 34061 34062 34063 34064 34065 34066 34067 34068 34069 34070 34071 34072 34073 34074 34075 34076 34077 34078 34079 34080 34081 34082 34083 34084 34085 34086 34087 34088 34089 34090 34091 34092 34093 34094 34095 34096 34097 34098 34099 34100 34101 34102 34103 34104 34105 34106 34107 34108 34109 34110 34111 34112 34113 34114 34115 34116 34117 34118 34119 34120 34121 34122 34123 34124 34125 34126 34127 34128 34129 34130 34131 34132 34133 34134 34135 34136 34137 34138 34139 34140 34141 34142 34143 34144 34145 34146 34147 34148 34149 34150 34151 34152 34153 34154 34155 34156 34157 34158 34159 34160 34161 34162 34163 34164 34165 34166 34167 34168 34169 34170 34171 34172 34173 34174 34175 34176 34177 34178 34179 34180 34181 34182 34183 34184 34185 34186 34187 34188 34189 34190 34191 34192 34193 34194 34195 34196 34197 34198 34199 34200 34201 34202 34203 34204 34205 34206 34207 34208 34209 34210 34211 34212 34213 34214 34215 34216 34217 34218 34219 34220 34221 34222 34223 34224 34225 34226 34227 34228 34229 34230 34231 34232 34233 34234 34235 34236 34237 34238 34239 34240 34241 34242 34243 34244 34245 34246 34247 34248 34249 34250 34251 34252 34253 34254 34255 34256 34257 34258 34259 34260 34261 34262 34263 34264 34265 34266 34267
(() => {
var __create = Object.create;
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
// node_modules/jquery/dist/jquery.js
var require_jquery = __commonJS({
"node_modules/jquery/dist/jquery.js"(exports, module) {
(function(global3, factory) {
"use strict";
if (typeof module === "object" && typeof module.exports === "object") {
module.exports = global3.document ? factory(global3, true) : function(w) {
if (!w.document) {
throw new Error("jQuery requires a window with a document");
}
return factory(w);
};
} else {
factory(global3);
}
})(typeof window !== "undefined" ? window : exports, function(window2, noGlobal) {
"use strict";
var arr = [];
var getProto = Object.getPrototypeOf;
var slice = arr.slice;
var flat = arr.flat ? function(array) {
return arr.flat.call(array);
} : function(array) {
return arr.concat.apply([], array);
};
var push = arr.push;
var indexOf = arr.indexOf;
var class2type = {};
var toString = class2type.toString;
var hasOwn = class2type.hasOwnProperty;
var fnToString = hasOwn.toString;
var ObjectFunctionString = fnToString.call(Object);
var support = {};
var isFunction = function isFunction2(obj) {
return typeof obj === "function" && typeof obj.nodeType !== "number" && typeof obj.item !== "function";
};
var isWindow = function isWindow2(obj) {
return obj != null && obj === obj.window;
};
var document2 = window2.document;
var preservedScriptAttributes = {
type: true,
src: true,
nonce: true,
noModule: true
};
function DOMEval(code, node, doc2) {
doc2 = doc2 || document2;
var i, val, script = doc2.createElement("script");
script.text = code;
if (node) {
for (i in preservedScriptAttributes) {
val = node[i] || node.getAttribute && node.getAttribute(i);
if (val) {
script.setAttribute(i, val);
}
}
}
doc2.head.appendChild(script).parentNode.removeChild(script);
}
function toType2(obj) {
if (obj == null) {
return obj + "";
}
return typeof obj === "object" || typeof obj === "function" ? class2type[toString.call(obj)] || "object" : typeof obj;
}
var version = "3.6.0", jQuery = function(selector, context) {
return new jQuery.fn.init(selector, context);
};
jQuery.fn = jQuery.prototype = {
jquery: version,
constructor: jQuery,
length: 0,
toArray: function() {
return slice.call(this);
},
get: function(num) {
if (num == null) {
return slice.call(this);
}
return num < 0 ? this[num + this.length] : this[num];
},
pushStack: function(elems) {
var ret = jQuery.merge(this.constructor(), elems);
ret.prevObject = this;
return ret;
},
each: function(callback) {
return jQuery.each(this, callback);
},
map: function(callback) {
return this.pushStack(jQuery.map(this, function(elem, i) {
return callback.call(elem, i, elem);
}));
},
slice: function() {
return this.pushStack(slice.apply(this, arguments));
},
first: function() {
return this.eq(0);
},
last: function() {
return this.eq(-1);
},
even: function() {
return this.pushStack(jQuery.grep(this, function(_elem, i) {
return (i + 1) % 2;
}));
},
odd: function() {
return this.pushStack(jQuery.grep(this, function(_elem, i) {
return i % 2;
}));
},
eq: function(i) {
var len = this.length, j = +i + (i < 0 ? len : 0);
return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
},
end: function() {
return this.prevObject || this.constructor();
},
push,
sort: arr.sort,
splice: arr.splice
};
jQuery.extend = jQuery.fn.extend = function() {
var options, name, src, copy, copyIsArray, clone2, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false;
if (typeof target === "boolean") {
deep = target;
target = arguments[i] || {};
i++;
}
if (typeof target !== "object" && !isFunction(target)) {
target = {};
}
if (i === length) {
target = this;
i--;
}
for (; i < length; i++) {
if ((options = arguments[i]) != null) {
for (name in options) {
copy = options[name];
if (name === "__proto__" || target === copy) {
continue;
}
if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) {
src = target[name];
if (copyIsArray && !Array.isArray(src)) {
clone2 = [];
} else if (!copyIsArray && !jQuery.isPlainObject(src)) {
clone2 = {};
} else {
clone2 = src;
}
copyIsArray = false;
target[name] = jQuery.extend(deep, clone2, copy);
} else if (copy !== void 0) {
target[name] = copy;
}
}
}
}
return target;
};
jQuery.extend({
expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),
isReady: true,
error: function(msg) {
throw new Error(msg);
},
noop: function() {
},
isPlainObject: function(obj) {
var proto, Ctor;
if (!obj || toString.call(obj) !== "[object Object]") {
return false;
}
proto = getProto(obj);
if (!proto) {
return true;
}
Ctor = hasOwn.call(proto, "constructor") && proto.constructor;
return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString;
},
isEmptyObject: function(obj) {
var name;
for (name in obj) {
return false;
}
return true;
},
globalEval: function(code, options, doc2) {
DOMEval(code, { nonce: options && options.nonce }, doc2);
},
each: function(obj, callback) {
var length, i = 0;
if (isArrayLike(obj)) {
length = obj.length;
for (; i < length; i++) {
if (callback.call(obj[i], i, obj[i]) === false) {
break;
}
}
} else {
for (i in obj) {
if (callback.call(obj[i], i, obj[i]) === false) {
break;
}
}
}
return obj;
},
makeArray: function(arr2, results) {
var ret = results || [];
if (arr2 != null) {
if (isArrayLike(Object(arr2))) {
jQuery.merge(
ret,
typeof arr2 === "string" ? [arr2] : arr2
);
} else {
push.call(ret, arr2);
}
}
return ret;
},
inArray: function(elem, arr2, i) {
return arr2 == null ? -1 : indexOf.call(arr2, elem, i);
},
merge: function(first, second) {
var len = +second.length, j = 0, i = first.length;
for (; j < len; j++) {
first[i++] = second[j];
}
first.length = i;
return first;
},
grep: function(elems, callback, invert) {
var callbackInverse, matches = [], i = 0, length = elems.length, callbackExpect = !invert;
for (; i < length; i++) {
callbackInverse = !callback(elems[i], i);
if (callbackInverse !== callbackExpect) {
matches.push(elems[i]);
}
}
return matches;
},
map: function(elems, callback, arg) {
var length, value, i = 0, ret = [];
if (isArrayLike(elems)) {
length = elems.length;
for (; i < length; i++) {
value = callback(elems[i], i, arg);
if (value != null) {
ret.push(value);
}
}
} else {
for (i in elems) {
value = callback(elems[i], i, arg);
if (value != null) {
ret.push(value);
}
}
}
return flat(ret);
},
guid: 1,
support
});
if (typeof Symbol === "function") {
jQuery.fn[Symbol.iterator] = arr[Symbol.iterator];
}
jQuery.each(
"Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),
function(_i, name) {
class2type["[object " + name + "]"] = name.toLowerCase();
}
);
function isArrayLike(obj) {
var length = !!obj && "length" in obj && obj.length, type = toType2(obj);
if (isFunction(obj) || isWindow(obj)) {
return false;
}
return type === "array" || length === 0 || typeof length === "number" && length > 0 && length - 1 in obj;
}
var Sizzle = function(window3) {
var i, support2, Expr, getText, isXML, tokenize, compile, select, outermostContext, sortInput, hasDuplicate, setDocument, document3, docElem, documentIsHTML, rbuggyQSA, rbuggyMatches, matches, contains2, expando = "sizzle" + 1 * new Date(), preferredDoc = window3.document, dirruns = 0, done = 0, classCache = createCache(), tokenCache = createCache(), compilerCache = createCache(), nonnativeSelectorCache = createCache(), sortOrder = function(a, b) {
if (a === b) {
hasDuplicate = true;
}
return 0;
}, hasOwn2 = {}.hasOwnProperty, arr2 = [], pop = arr2.pop, pushNative = arr2.push, push2 = arr2.push, slice2 = arr2.slice, indexOf2 = function(list, elem) {
var i2 = 0, len = list.length;
for (; i2 < len; i2++) {
if (list[i2] === elem) {
return i2;
}
}
return -1;
}, booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", whitespace = "[\\x20\\t\\r\\n\\f]", identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + "*([*^$|!~]?=)" + whitespace + `*(?:'((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)"|(` + identifier + "))|)" + whitespace + "*\\]", pseudos = ":(" + identifier + `)(?:\\((('((?:\\\\.|[^\\\\'])*)'|"((?:\\\\.|[^\\\\"])*)")|((?:\\\\.|[^\\\\()[\\]]|` + attributes + ")*)|.*)\\)|)", rwhitespace = new RegExp(whitespace + "+", "g"), rtrim2 = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"), rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"), rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"), rdescend = new RegExp(whitespace + "|>"), rpseudo = new RegExp(pseudos), ridentifier = new RegExp("^" + identifier + "$"), matchExpr = {
"ID": new RegExp("^#(" + identifier + ")"),
"CLASS": new RegExp("^\\.(" + identifier + ")"),
"TAG": new RegExp("^(" + identifier + "|[*])"),
"ATTR": new RegExp("^" + attributes),
"PSEUDO": new RegExp("^" + pseudos),
"CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
"bool": new RegExp("^(?:" + booleans + ")$", "i"),
"needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
}, rhtml2 = /HTML$/i, rinputs = /^(?:input|select|textarea|button)$/i, rheader = /^h\d$/i, rnative = /^[^{]+\{\s*\[native \w/, rquickExpr2 = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, rsibling = /[+~]/, runescape = new RegExp("\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g"), funescape = function(escape, nonHex) {
var high = "0x" + escape.slice(1) - 65536;
return nonHex ? nonHex : high < 0 ? String.fromCharCode(high + 65536) : String.fromCharCode(high >> 10 | 55296, high & 1023 | 56320);
}, rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, fcssescape = function(ch, asCodePoint) {
if (asCodePoint) {
if (ch === "\0") {
return "\uFFFD";
}
return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " ";
}
return "\\" + ch;
}, unloadHandler = function() {
setDocument();
}, inDisabledFieldset = addCombinator(
function(elem) {
return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset";
},
{ dir: "parentNode", next: "legend" }
);
try {
push2.apply(
arr2 = slice2.call(preferredDoc.childNodes),
preferredDoc.childNodes
);
arr2[preferredDoc.childNodes.length].nodeType;
} catch (e) {
push2 = {
apply: arr2.length ? function(target, els) {
pushNative.apply(target, slice2.call(els));
} : function(target, els) {
var j = target.length, i2 = 0;
while (target[j++] = els[i2++]) {
}
target.length = j - 1;
}
};
}
function Sizzle2(selector, context, results, seed) {
var m, i2, elem, nid, match, groups, newSelector, newContext = context && context.ownerDocument, nodeType = context ? context.nodeType : 9;
results = results || [];
if (typeof selector !== "string" || !selector || nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {
return results;
}
if (!seed) {
setDocument(context);
context = context || document3;
if (documentIsHTML) {
if (nodeType !== 11 && (match = rquickExpr2.exec(selector))) {
if (m = match[1]) {
if (nodeType === 9) {
if (elem = context.getElementById(m)) {
if (elem.id === m) {
results.push(elem);
return results;
}
} else {
return results;
}
} else {
if (newContext && (elem = newContext.getElementById(m)) && contains2(context, elem) && elem.id === m) {
results.push(elem);
return results;
}
}
} else if (match[2]) {
push2.apply(results, context.getElementsByTagName(selector));
return results;
} else if ((m = match[3]) && support2.getElementsByClassName && context.getElementsByClassName) {
push2.apply(results, context.getElementsByClassName(m));
return results;
}
}
if (support2.qsa && !nonnativeSelectorCache[selector + " "] && (!rbuggyQSA || !rbuggyQSA.test(selector)) && (nodeType !== 1 || context.nodeName.toLowerCase() !== "object")) {
newSelector = selector;
newContext = context;
if (nodeType === 1 && (rdescend.test(selector) || rcombinators.test(selector))) {
newContext = rsibling.test(selector) && testContext(context.parentNode) || context;
if (newContext !== context || !support2.scope) {
if (nid = context.getAttribute("id")) {
nid = nid.replace(rcssescape, fcssescape);
} else {
context.setAttribute("id", nid = expando);
}
}
groups = tokenize(selector);
i2 = groups.length;
while (i2--) {
groups[i2] = (nid ? "#" + nid : ":scope") + " " + toSelector(groups[i2]);
}
newSelector = groups.join(",");
}
try {
push2.apply(
results,
newContext.querySelectorAll(newSelector)
);
return results;
} catch (qsaError) {
nonnativeSelectorCache(selector, true);
} finally {
if (nid === expando) {
context.removeAttribute("id");
}
}
}
}
}
return select(selector.replace(rtrim2, "$1"), context, results, seed);
}
function createCache() {
var keys = [];
function cache(key, value) {
if (keys.push(key + " ") > Expr.cacheLength) {
delete cache[keys.shift()];
}
return cache[key + " "] = value;
}
return cache;
}
function markFunction(fn2) {
fn2[expando] = true;
return fn2;
}
function assert(fn2) {
var el = document3.createElement("fieldset");
try {
return !!fn2(el);
} catch (e) {
return false;
} finally {
if (el.parentNode) {
el.parentNode.removeChild(el);
}
el = null;
}
}
function addHandle(attrs, handler) {
var arr3 = attrs.split("|"), i2 = arr3.length;
while (i2--) {
Expr.attrHandle[arr3[i2]] = handler;
}
}
function siblingCheck(a, b) {
var cur = b && a, diff = cur && a.nodeType === 1 && b.nodeType === 1 && a.sourceIndex - b.sourceIndex;
if (diff) {
return diff;
}
if (cur) {
while (cur = cur.nextSibling) {
if (cur === b) {
return -1;
}
}
}
return a ? 1 : -1;
}
function createInputPseudo(type) {
return function(elem) {
var name = elem.nodeName.toLowerCase();
return name === "input" && elem.type === type;
};
}
function createButtonPseudo(type) {
return function(elem) {
var name = elem.nodeName.toLowerCase();
return (name === "input" || name === "button") && elem.type === type;
};
}
function createDisabledPseudo(disabled) {
return function(elem) {
if ("form" in elem) {
if (elem.parentNode && elem.disabled === false) {
if ("label" in elem) {
if ("label" in elem.parentNode) {
return elem.parentNode.disabled === disabled;
} else {
return elem.disabled === disabled;
}
}
return elem.isDisabled === disabled || elem.isDisabled !== !disabled && inDisabledFieldset(elem) === disabled;
}
return elem.disabled === disabled;
} else if ("label" in elem) {
return elem.disabled === disabled;
}
return false;
};
}
function createPositionalPseudo(fn2) {
return markFunction(function(argument) {
argument = +argument;
return markFunction(function(seed, matches2) {
var j, matchIndexes = fn2([], seed.length, argument), i2 = matchIndexes.length;
while (i2--) {
if (seed[j = matchIndexes[i2]]) {
seed[j] = !(matches2[j] = seed[j]);
}
}
});
});
}
function testContext(context) {
return context && typeof context.getElementsByTagName !== "undefined" && context;
}
support2 = Sizzle2.support = {};
isXML = Sizzle2.isXML = function(elem) {
var namespace = elem && elem.namespaceURI, docElem2 = elem && (elem.ownerDocument || elem).documentElement;
return !rhtml2.test(namespace || docElem2 && docElem2.nodeName || "HTML");
};
setDocument = Sizzle2.setDocument = function(node) {
var hasCompare, subWindow, doc2 = node ? node.ownerDocument || node : preferredDoc;
if (doc2 == document3 || doc2.nodeType !== 9 || !doc2.documentElement) {
return document3;
}
document3 = doc2;
docElem = document3.documentElement;
documentIsHTML = !isXML(document3);
if (preferredDoc != document3 && (subWindow = document3.defaultView) && subWindow.top !== subWindow) {
if (subWindow.addEventListener) {
subWindow.addEventListener("unload", unloadHandler, false);
} else if (subWindow.attachEvent) {
subWindow.attachEvent("onunload", unloadHandler);
}
}
support2.scope = assert(function(el) {
docElem.appendChild(el).appendChild(document3.createElement("div"));
return typeof el.querySelectorAll !== "undefined" && !el.querySelectorAll(":scope fieldset div").length;
});
support2.attributes = assert(function(el) {
el.className = "i";
return !el.getAttribute("className");
});
support2.getElementsByTagName = assert(function(el) {
el.appendChild(document3.createComment(""));
return !el.getElementsByTagName("*").length;
});
support2.getElementsByClassName = rnative.test(document3.getElementsByClassName);
support2.getById = assert(function(el) {
docElem.appendChild(el).id = expando;
return !document3.getElementsByName || !document3.getElementsByName(expando).length;
});
if (support2.getById) {
Expr.filter["ID"] = function(id) {
var attrId = id.replace(runescape, funescape);
return function(elem) {
return elem.getAttribute("id") === attrId;
};
};
Expr.find["ID"] = function(id, context) {
if (typeof context.getElementById !== "undefined" && documentIsHTML) {
var elem = context.getElementById(id);
return elem ? [elem] : [];
}
};
} else {
Expr.filter["ID"] = function(id) {
var attrId = id.replace(runescape, funescape);
return function(elem) {
var node2 = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
return node2 && node2.value === attrId;
};
};
Expr.find["ID"] = function(id, context) {
if (typeof context.getElementById !== "undefined" && documentIsHTML) {
var node2, i2, elems, elem = context.getElementById(id);
if (elem) {
node2 = elem.getAttributeNode("id");
if (node2 && node2.value === id) {
return [elem];
}
elems = context.getElementsByName(id);
i2 = 0;
while (elem = elems[i2++]) {
node2 = elem.getAttributeNode("id");
if (node2 && node2.value === id) {
return [elem];
}
}
}
return [];
}
};
}
Expr.find["TAG"] = support2.getElementsByTagName ? function(tag, context) {
if (typeof context.getElementsByTagName !== "undefined") {
return context.getElementsByTagName(tag);
} else if (support2.qsa) {
return context.querySelectorAll(tag);
}
} : function(tag, context) {
var elem, tmp = [], i2 = 0, results = context.getElementsByTagName(tag);
if (tag === "*") {
while (elem = results[i2++]) {
if (elem.nodeType === 1) {
tmp.push(elem);
}
}
return tmp;
}
return results;
};
Expr.find["CLASS"] = support2.getElementsByClassName && function(className, context) {
if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) {
return context.getElementsByClassName(className);
}
};
rbuggyMatches = [];
rbuggyQSA = [];
if (support2.qsa = rnative.test(document3.querySelectorAll)) {
assert(function(el) {
var input;
docElem.appendChild(el).innerHTML = "<a id='" + expando + "'></a><select id='" + expando + "-\r\\' msallowcapture=''><option selected=''></option></select>";
if (el.querySelectorAll("[msallowcapture^='']").length) {
rbuggyQSA.push("[*^$]=" + whitespace + `*(?:''|"")`);
}
if (!el.querySelectorAll("[selected]").length) {
rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
}
if (!el.querySelectorAll("[id~=" + expando + "-]").length) {
rbuggyQSA.push("~=");
}
input = document3.createElement("input");
input.setAttribute("name", "");
el.appendChild(input);
if (!el.querySelectorAll("[name='']").length) {
rbuggyQSA.push("\\[" + whitespace + "*name" + whitespace + "*=" + whitespace + `*(?:''|"")`);
}
if (!el.querySelectorAll(":checked").length) {
rbuggyQSA.push(":checked");
}
if (!el.querySelectorAll("a#" + expando + "+*").length) {
rbuggyQSA.push(".#.+[+~]");
}
el.querySelectorAll("\\\f");
rbuggyQSA.push("[\\r\\n\\f]");
});
assert(function(el) {
el.innerHTML = "<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";
var input = document3.createElement("input");
input.setAttribute("type", "hidden");
el.appendChild(input).setAttribute("name", "D");
if (el.querySelectorAll("[name=d]").length) {
rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");
}
if (el.querySelectorAll(":enabled").length !== 2) {
rbuggyQSA.push(":enabled", ":disabled");
}
docElem.appendChild(el).disabled = true;
if (el.querySelectorAll(":disabled").length !== 2) {
rbuggyQSA.push(":enabled", ":disabled");
}
el.querySelectorAll("*,:x");
rbuggyQSA.push(",.*:");
});
}
if (support2.matchesSelector = rnative.test(matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || docElem.msMatchesSelector)) {
assert(function(el) {
support2.disconnectedMatch = matches.call(el, "*");
matches.call(el, "[s!='']:x");
rbuggyMatches.push("!=", pseudos);
});
}
rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|"));
hasCompare = rnative.test(docElem.compareDocumentPosition);
contains2 = hasCompare || rnative.test(docElem.contains) ? function(a, b) {
var adown = a.nodeType === 9 ? a.documentElement : a, bup = b && b.parentNode;
return a === bup || !!(bup && bup.nodeType === 1 && (adown.contains ? adown.contains(bup) : a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16));
} : function(a, b) {
if (b) {
while (b = b.parentNode) {
if (b === a) {
return true;
}
}
}
return false;
};
sortOrder = hasCompare ? function(a, b) {
if (a === b) {
hasDuplicate = true;
return 0;
}
var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
if (compare) {
return compare;
}
compare = (a.ownerDocument || a) == (b.ownerDocument || b) ? a.compareDocumentPosition(b) : 1;
if (compare & 1 || !support2.sortDetached && b.compareDocumentPosition(a) === compare) {
if (a == document3 || a.ownerDocument == preferredDoc && contains2(preferredDoc, a)) {
return -1;
}
if (b == document3 || b.ownerDocument == preferredDoc && contains2(preferredDoc, b)) {
return 1;
}
return sortInput ? indexOf2(sortInput, a) - indexOf2(sortInput, b) : 0;
}
return compare & 4 ? -1 : 1;
} : function(a, b) {
if (a === b) {
hasDuplicate = true;
return 0;
}
var cur, i2 = 0, aup = a.parentNode, bup = b.parentNode, ap = [a], bp = [b];
if (!aup || !bup) {
return a == document3 ? -1 : b == document3 ? 1 : aup ? -1 : bup ? 1 : sortInput ? indexOf2(sortInput, a) - indexOf2(sortInput, b) : 0;
} else if (aup === bup) {
return siblingCheck(a, b);
}
cur = a;
while (cur = cur.parentNode) {
ap.unshift(cur);
}
cur = b;
while (cur = cur.parentNode) {
bp.unshift(cur);
}
while (ap[i2] === bp[i2]) {
i2++;
}
return i2 ? siblingCheck(ap[i2], bp[i2]) : ap[i2] == preferredDoc ? -1 : bp[i2] == preferredDoc ? 1 : 0;
};
return document3;
};
Sizzle2.matches = function(expr, elements) {
return Sizzle2(expr, null, null, elements);
};
Sizzle2.matchesSelector = function(elem, expr) {
setDocument(elem);
if (support2.matchesSelector && documentIsHTML && !nonnativeSelectorCache[expr + " "] && (!rbuggyMatches || !rbuggyMatches.test(expr)) && (!rbuggyQSA || !rbuggyQSA.test(expr))) {
try {
var ret = matches.call(elem, expr);
if (ret || support2.disconnectedMatch || elem.document && elem.document.nodeType !== 11) {
return ret;
}
} catch (e) {
nonnativeSelectorCache(expr, true);
}
}
return Sizzle2(expr, document3, null, [elem]).length > 0;
};
Sizzle2.contains = function(context, elem) {
if ((context.ownerDocument || context) != document3) {
setDocument(context);
}
return contains2(context, elem);
};
Sizzle2.attr = function(elem, name) {
if ((elem.ownerDocument || elem) != document3) {
setDocument(elem);
}
var fn2 = Expr.attrHandle[name.toLowerCase()], val = fn2 && hasOwn2.call(Expr.attrHandle, name.toLowerCase()) ? fn2(elem, name, !documentIsHTML) : void 0;
return val !== void 0 ? val : support2.attributes || !documentIsHTML ? elem.getAttribute(name) : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
};
Sizzle2.escape = function(sel) {
return (sel + "").replace(rcssescape, fcssescape);
};
Sizzle2.error = function(msg) {
throw new Error("Syntax error, unrecognized expression: " + msg);
};
Sizzle2.uniqueSort = function(results) {
var elem, duplicates = [], j = 0, i2 = 0;
hasDuplicate = !support2.detectDuplicates;
sortInput = !support2.sortStable && results.slice(0);
results.sort(sortOrder);
if (hasDuplicate) {
while (elem = results[i2++]) {
if (elem === results[i2]) {
j = duplicates.push(i2);
}
}
while (j--) {
results.splice(duplicates[j], 1);
}
}
sortInput = null;
return results;
};
getText = Sizzle2.getText = function(elem) {
var node, ret = "", i2 = 0, nodeType = elem.nodeType;
if (!nodeType) {
while (node = elem[i2++]) {
ret += getText(node);
}
} else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
if (typeof elem.textContent === "string") {
return elem.textContent;
} else {
for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
ret += getText(elem);
}
}
} else if (nodeType === 3 || nodeType === 4) {
return elem.nodeValue;
}
return ret;
};
Expr = Sizzle2.selectors = {
cacheLength: 50,
createPseudo: markFunction,
match: matchExpr,
attrHandle: {},
find: {},
relative: {
">": { dir: "parentNode", first: true },
" ": { dir: "parentNode" },
"+": { dir: "previousSibling", first: true },
"~": { dir: "previousSibling" }
},
preFilter: {
"ATTR": function(match) {
match[1] = match[1].replace(runescape, funescape);
match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);
if (match[2] === "~=") {
match[3] = " " + match[3] + " ";
}
return match.slice(0, 4);
},
"CHILD": function(match) {
match[1] = match[1].toLowerCase();
if (match[1].slice(0, 3) === "nth") {
if (!match[3]) {
Sizzle2.error(match[0]);
}
match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd"));
match[5] = +(match[7] + match[8] || match[3] === "odd");
} else if (match[3]) {
Sizzle2.error(match[0]);
}
return match;
},
"PSEUDO": function(match) {
var excess, unquoted = !match[6] && match[2];
if (matchExpr["CHILD"].test(match[0])) {
return null;
}
if (match[3]) {
match[2] = match[4] || match[5] || "";
} else if (unquoted && rpseudo.test(unquoted) && (excess = tokenize(unquoted, true)) && (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {
match[0] = match[0].slice(0, excess);
match[2] = unquoted.slice(0, excess);
}
return match.slice(0, 3);
}
},
filter: {
"TAG": function(nodeNameSelector) {
var nodeName2 = nodeNameSelector.replace(runescape, funescape).toLowerCase();
return nodeNameSelector === "*" ? function() {
return true;
} : function(elem) {
return elem.nodeName && elem.nodeName.toLowerCase() === nodeName2;
};
},
"CLASS": function(className) {
var pattern = classCache[className + " "];
return pattern || (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) && classCache(
className,
function(elem) {
return pattern.test(
typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || ""
);
}
);
},
"ATTR": function(name, operator, check) {
return function(elem) {
var result = Sizzle2.attr(elem, name);
if (result == null) {
return operator === "!=";
}
if (!operator) {
return true;
}
result += "";
return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf(check) === 0 : operator === "*=" ? check && result.indexOf(check) > -1 : operator === "$=" ? check && result.slice(-check.length) === check : operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 : operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" : false;
};
},
"CHILD": function(type, what, _argument, first, last) {
var simple = type.slice(0, 3) !== "nth", forward = type.slice(-4) !== "last", ofType = what === "of-type";
return first === 1 && last === 0 ? function(elem) {
return !!elem.parentNode;
} : function(elem, _context, xml) {
var cache, uniqueCache, outerCache, node, nodeIndex, start2, dir2 = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, name = ofType && elem.nodeName.toLowerCase(), useCache = !xml && !ofType, diff = false;
if (parent) {
if (simple) {
while (dir2) {
node = elem;
while (node = node[dir2]) {
if (ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) {
return false;
}
}
start2 = dir2 = type === "only" && !start2 && "nextSibling";
}
return true;
}
start2 = [forward ? parent.firstChild : parent.lastChild];
if (forward && useCache) {
node = parent;
outerCache = node[expando] || (node[expando] = {});
uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
cache = uniqueCache[type] || [];
nodeIndex = cache[0] === dirruns && cache[1];
diff = nodeIndex && cache[2];
node = nodeIndex && parent.childNodes[nodeIndex];
while (node = ++nodeIndex && node && node[dir2] || (diff = nodeIndex = 0) || start2.pop()) {
if (node.nodeType === 1 && ++diff && node === elem) {
uniqueCache[type] = [dirruns, nodeIndex, diff];
break;
}
}
} else {
if (useCache) {
node = elem;
outerCache = node[expando] || (node[expando] = {});
uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
cache = uniqueCache[type] || [];
nodeIndex = cache[0] === dirruns && cache[1];
diff = nodeIndex;
}
if (diff === false) {
while (node = ++nodeIndex && node && node[dir2] || (diff = nodeIndex = 0) || start2.pop()) {
if ((ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1) && ++diff) {
if (useCache) {
outerCache = node[expando] || (node[expando] = {});
uniqueCache = outerCache[node.uniqueID] || (outerCache[node.uniqueID] = {});
uniqueCache[type] = [dirruns, diff];
}
if (node === elem) {
break;
}
}
}
}
}
diff -= last;
return diff === first || diff % first === 0 && diff / first >= 0;
}
};
},
"PSEUDO": function(pseudo, argument) {
var args, fn2 = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] || Sizzle2.error("unsupported pseudo: " + pseudo);
if (fn2[expando]) {
return fn2(argument);
}
if (fn2.length > 1) {
args = [pseudo, pseudo, "", argument];
return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ? markFunction(function(seed, matches2) {
var idx, matched = fn2(seed, argument), i2 = matched.length;
while (i2--) {
idx = indexOf2(seed, matched[i2]);
seed[idx] = !(matches2[idx] = matched[i2]);
}
}) : function(elem) {
return fn2(elem, 0, args);
};
}
return fn2;
}
},
pseudos: {
"not": markFunction(function(selector) {
var input = [], results = [], matcher = compile(selector.replace(rtrim2, "$1"));
return matcher[expando] ? markFunction(function(seed, matches2, _context, xml) {
var elem, unmatched = matcher(seed, null, xml, []), i2 = seed.length;
while (i2--) {
if (elem = unmatched[i2]) {
seed[i2] = !(matches2[i2] = elem);
}
}
}) : function(elem, _context, xml) {
input[0] = elem;
matcher(input, null, xml, results);
input[0] = null;
return !results.pop();
};
}),
"has": markFunction(function(selector) {
return function(elem) {
return Sizzle2(selector, elem).length > 0;
};
}),
"contains": markFunction(function(text) {
text = text.replace(runescape, funescape);
return function(elem) {
return (elem.textContent || getText(elem)).indexOf(text) > -1;
};
}),
"lang": markFunction(function(lang) {
if (!ridentifier.test(lang || "")) {
Sizzle2.error("unsupported lang: " + lang);
}
lang = lang.replace(runescape, funescape).toLowerCase();
return function(elem) {
var elemLang;
do {
if (elemLang = documentIsHTML ? elem.lang : elem.getAttribute("xml:lang") || elem.getAttribute("lang")) {
elemLang = elemLang.toLowerCase();
return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
}
} while ((elem = elem.parentNode) && elem.nodeType === 1);
return false;
};
}),
"target": function(elem) {
var hash3 = window3.location && window3.location.hash;
return hash3 && hash3.slice(1) === elem.id;
},
"root": function(elem) {
return elem === docElem;
},
"focus": function(elem) {
return elem === document3.activeElement && (!document3.hasFocus || document3.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
},
"enabled": createDisabledPseudo(false),
"disabled": createDisabledPseudo(true),
"checked": function(elem) {
var nodeName2 = elem.nodeName.toLowerCase();
return nodeName2 === "input" && !!elem.checked || nodeName2 === "option" && !!elem.selected;
},
"selected": function(elem) {
if (elem.parentNode) {
elem.parentNode.selectedIndex;
}
return elem.selected === true;
},
"empty": function(elem) {
for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
if (elem.nodeType < 6) {
return false;
}
}
return true;
},
"parent": function(elem) {
return !Expr.pseudos["empty"](elem);
},
"header": function(elem) {
return rheader.test(elem.nodeName);
},
"input": function(elem) {
return rinputs.test(elem.nodeName);
},
"button": function(elem) {
var name = elem.nodeName.toLowerCase();
return name === "input" && elem.type === "button" || name === "button";
},
"text": function(elem) {
var attr;
return elem.nodeName.toLowerCase() === "input" && elem.type === "text" && ((attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text");
},
"first": createPositionalPseudo(function() {
return [0];
}),
"last": createPositionalPseudo(function(_matchIndexes, length) {
return [length - 1];
}),
"eq": createPositionalPseudo(function(_matchIndexes, length, argument) {
return [argument < 0 ? argument + length : argument];
}),
"even": createPositionalPseudo(function(matchIndexes, length) {
var i2 = 0;
for (; i2 < length; i2 += 2) {
matchIndexes.push(i2);
}
return matchIndexes;
}),
"odd": createPositionalPseudo(function(matchIndexes, length) {
var i2 = 1;
for (; i2 < length; i2 += 2) {
matchIndexes.push(i2);
}
return matchIndexes;
}),
"lt": createPositionalPseudo(function(matchIndexes, length, argument) {
var i2 = argument < 0 ? argument + length : argument > length ? length : argument;
for (; --i2 >= 0; ) {
matchIndexes.push(i2);
}
return matchIndexes;
}),
"gt": createPositionalPseudo(function(matchIndexes, length, argument) {
var i2 = argument < 0 ? argument + length : argument;
for (; ++i2 < length; ) {
matchIndexes.push(i2);
}
return matchIndexes;
})
}
};
Expr.pseudos["nth"] = Expr.pseudos["eq"];
for (i in { radio: true, checkbox: true, file: true, password: true, image: true }) {
Expr.pseudos[i] = createInputPseudo(i);
}
for (i in { submit: true, reset: true }) {
Expr.pseudos[i] = createButtonPseudo(i);
}
function setFilters() {
}
setFilters.prototype = Expr.filters = Expr.pseudos;
Expr.setFilters = new setFilters();
tokenize = Sizzle2.tokenize = function(selector, parseOnly) {
var matched, match, tokens, type, soFar, groups, preFilters, cached = tokenCache[selector + " "];
if (cached) {
return parseOnly ? 0 : cached.slice(0);
}
soFar = selector;
groups = [];
preFilters = Expr.preFilter;
while (soFar) {
if (!matched || (match = rcomma.exec(soFar))) {
if (match) {
soFar = soFar.slice(match[0].length) || soFar;
}
groups.push(tokens = []);
}
matched = false;
if (match = rcombinators.exec(soFar)) {
matched = match.shift();
tokens.push({
value: matched,
type: match[0].replace(rtrim2, " ")
});
soFar = soFar.slice(matched.length);
}
for (type in Expr.filter) {
if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] || (match = preFilters[type](match)))) {
matched = match.shift();
tokens.push({
value: matched,
type,
matches: match
});
soFar = soFar.slice(matched.length);
}
}
if (!matched) {
break;
}
}
return parseOnly ? soFar.length : soFar ? Sizzle2.error(selector) : tokenCache(selector, groups).slice(0);
};
function toSelector(tokens) {
var i2 = 0, len = tokens.length, selector = "";
for (; i2 < len; i2++) {
selector += tokens[i2].value;
}
return selector;
}
function addCombinator(matcher, combinator, base) {
var dir2 = combinator.dir, skip = combinator.next, key = skip || dir2, checkNonElements = base && key === "parentNode", doneName = done++;
return combinator.first ? function(elem, context, xml) {
while (elem = elem[dir2]) {
if (elem.nodeType === 1 || checkNonElements) {
return matcher(elem, context, xml);
}
}
return false;
} : function(elem, context, xml) {
var oldCache, uniqueCache, outerCache, newCache = [dirruns, doneName];
if (xml) {
while (elem = elem[dir2]) {
if (elem.nodeType === 1 || checkNonElements) {
if (matcher(elem, context, xml)) {
return true;
}
}
}
} else {
while (elem = elem[dir2]) {
if (elem.nodeType === 1 || checkNonElements) {
outerCache = elem[expando] || (elem[expando] = {});
uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {});
if (skip && skip === elem.nodeName.toLowerCase()) {
elem = elem[dir2] || elem;
} else if ((oldCache = uniqueCache[key]) && oldCache[0] === dirruns && oldCache[1] === doneName) {
return newCache[2] = oldCache[2];
} else {
uniqueCache[key] = newCache;
if (newCache[2] = matcher(elem, context, xml)) {
return true;
}
}
}
}
}
return false;
};
}
function elementMatcher(matchers) {
return matchers.length > 1 ? function(elem, context, xml) {
var i2 = matchers.length;
while (i2--) {
if (!matchers[i2](elem, context, xml)) {
return false;
}
}
return true;
} : matchers[0];
}
function multipleContexts(selector, contexts, results) {
var i2 = 0, len = contexts.length;
for (; i2 < len; i2++) {
Sizzle2(selector, contexts[i2], results);
}
return results;
}
function condense(unmatched, map, filter, context, xml) {
var elem, newUnmatched = [], i2 = 0, len = unmatched.length, mapped = map != null;
for (; i2 < len; i2++) {
if (elem = unmatched[i2]) {
if (!filter || filter(elem, context, xml)) {
newUnmatched.push(elem);
if (mapped) {
map.push(i2);
}
}
}
}
return newUnmatched;
}
function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
if (postFilter && !postFilter[expando]) {
postFilter = setMatcher(postFilter);
}
if (postFinder && !postFinder[expando]) {
postFinder = setMatcher(postFinder, postSelector);
}
return markFunction(function(seed, results, context, xml) {
var temp, i2, elem, preMap = [], postMap = [], preexisting = results.length, elems = seed || multipleContexts(
selector || "*",
context.nodeType ? [context] : context,
[]
), matcherIn = preFilter && (seed || !selector) ? condense(elems, preMap, preFilter, context, xml) : elems, matcherOut = matcher ? postFinder || (seed ? preFilter : preexisting || postFilter) ? [] : results : matcherIn;
if (matcher) {
matcher(matcherIn, matcherOut, context, xml);
}
if (postFilter) {
temp = condense(matcherOut, postMap);
postFilter(temp, [], context, xml);
i2 = temp.length;
while (i2--) {
if (elem = temp[i2]) {
matcherOut[postMap[i2]] = !(matcherIn[postMap[i2]] = elem);
}
}
}
if (seed) {
if (postFinder || preFilter) {
if (postFinder) {
temp = [];
i2 = matcherOut.length;
while (i2--) {
if (elem = matcherOut[i2]) {
temp.push(matcherIn[i2] = elem);
}
}
postFinder(null, matcherOut = [], temp, xml);
}
i2 = matcherOut.length;
while (i2--) {
if ((elem = matcherOut[i2]) && (temp = postFinder ? indexOf2(seed, elem) : preMap[i2]) > -1) {
seed[temp] = !(results[temp] = elem);
}
}
}
} else {
matcherOut = condense(
matcherOut === results ? matcherOut.splice(preexisting, matcherOut.length) : matcherOut
);
if (postFinder) {
postFinder(null, results, matcherOut, xml);
} else {
push2.apply(results, matcherOut);
}
}
});
}
function matcherFromTokens(tokens) {
var checkContext, matcher, j, len = tokens.length, leadingRelative = Expr.relative[tokens[0].type], implicitRelative = leadingRelative || Expr.relative[" "], i2 = leadingRelative ? 1 : 0, matchContext = addCombinator(function(elem) {
return elem === checkContext;
}, implicitRelative, true), matchAnyContext = addCombinator(function(elem) {
return indexOf2(checkContext, elem) > -1;
}, implicitRelative, true), matchers = [function(elem, context, xml) {
var ret = !leadingRelative && (xml || context !== outermostContext) || ((checkContext = context).nodeType ? matchContext(elem, context, xml) : matchAnyContext(elem, context, xml));
checkContext = null;
return ret;
}];
for (; i2 < len; i2++) {
if (matcher = Expr.relative[tokens[i2].type]) {
matchers = [addCombinator(elementMatcher(matchers), matcher)];
} else {
matcher = Expr.filter[tokens[i2].type].apply(null, tokens[i2].matches);
if (matcher[expando]) {
j = ++i2;
for (; j < len; j++) {
if (Expr.relative[tokens[j].type]) {
break;
}
}
return setMatcher(
i2 > 1 && elementMatcher(matchers),
i2 > 1 && toSelector(
tokens.slice(0, i2 - 1).concat({ value: tokens[i2 - 2].type === " " ? "*" : "" })
).replace(rtrim2, "$1"),
matcher,
i2 < j && matcherFromTokens(tokens.slice(i2, j)),
j < len && matcherFromTokens(tokens = tokens.slice(j)),
j < len && toSelector(tokens)
);
}
matchers.push(matcher);
}
}
return elementMatcher(matchers);
}
function matcherFromGroupMatchers(elementMatchers, setMatchers) {
var bySet = setMatchers.length > 0, byElement = elementMatchers.length > 0, superMatcher = function(seed, context, xml, results, outermost) {
var elem, j, matcher, matchedCount = 0, i2 = "0", unmatched = seed && [], setMatched = [], contextBackup = outermostContext, elems = seed || byElement && Expr.find["TAG"]("*", outermost), dirrunsUnique = dirruns += contextBackup == null ? 1 : Math.random() || 0.1, len = elems.length;
if (outermost) {
outermostContext = context == document3 || context || outermost;
}
for (; i2 !== len && (elem = elems[i2]) != null; i2++) {
if (byElement && elem) {
j = 0;
if (!context && elem.ownerDocument != document3) {
setDocument(elem);
xml = !documentIsHTML;
}
while (matcher = elementMatchers[j++]) {
if (matcher(elem, context || document3, xml)) {
results.push(elem);
break;
}
}
if (outermost) {
dirruns = dirrunsUnique;
}
}
if (bySet) {
if (elem = !matcher && elem) {
matchedCount--;
}
if (seed) {
unmatched.push(elem);
}
}
}
matchedCount += i2;
if (bySet && i2 !== matchedCount) {
j = 0;
while (matcher = setMatchers[j++]) {
matcher(unmatched, setMatched, context, xml);
}
if (seed) {
if (matchedCount > 0) {
while (i2--) {
if (!(unmatched[i2] || setMatched[i2])) {
setMatched[i2] = pop.call(results);
}
}
}
setMatched = condense(setMatched);
}
push2.apply(results, setMatched);
if (outermost && !seed && setMatched.length > 0 && matchedCount + setMatchers.length > 1) {
Sizzle2.uniqueSort(results);
}
}
if (outermost) {
dirruns = dirrunsUnique;
outermostContext = contextBackup;
}
return unmatched;
};
return bySet ? markFunction(superMatcher) : superMatcher;
}
compile = Sizzle2.compile = function(selector, match) {
var i2, setMatchers = [], elementMatchers = [], cached = compilerCache[selector + " "];
if (!cached) {
if (!match) {
match = tokenize(selector);
}
i2 = match.length;
while (i2--) {
cached = matcherFromTokens(match[i2]);
if (cached[expando]) {
setMatchers.push(cached);
} else {
elementMatchers.push(cached);
}
}
cached = compilerCache(
selector,
matcherFromGroupMatchers(elementMatchers, setMatchers)
);
cached.selector = selector;
}
return cached;
};
select = Sizzle2.select = function(selector, context, results, seed) {
var i2, tokens, token, type, find, compiled = typeof selector === "function" && selector, match = !seed && tokenize(selector = compiled.selector || selector);
results = results || [];
if (match.length === 1) {
tokens = match[0] = match[0].slice(0);
if (tokens.length > 2 && (token = tokens[0]).type === "ID" && context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {
context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0];
if (!context) {
return results;
} else if (compiled) {
context = context.parentNode;
}
selector = selector.slice(tokens.shift().value.length);
}
i2 = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;
while (i2--) {
token = tokens[i2];
if (Expr.relative[type = token.type]) {
break;
}
if (find = Expr.find[type]) {
if (seed = find(
token.matches[0].replace(runescape, funescape),
rsibling.test(tokens[0].type) && testContext(context.parentNode) || context
)) {
tokens.splice(i2, 1);
selector = seed.length && toSelector(tokens);
if (!selector) {
push2.apply(results, seed);
return results;
}
break;
}
}
}
}
(compiled || compile(selector, match))(
seed,
context,
!documentIsHTML,
results,
!context || rsibling.test(selector) && testContext(context.parentNode) || context
);
return results;
};
support2.sortStable = expando.split("").sort(sortOrder).join("") === expando;
support2.detectDuplicates = !!hasDuplicate;
setDocument();
support2.sortDetached = assert(function(el) {
return el.compareDocumentPosition(document3.createElement("fieldset")) & 1;
});
if (!assert(function(el) {
el.innerHTML = "<a href='#'></a>";
return el.firstChild.getAttribute("href") === "#";
})) {
addHandle("type|href|height|width", function(elem, name, isXML2) {
if (!isXML2) {
return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2);
}
});
}
if (!support2.attributes || !assert(function(el) {
el.innerHTML = "<input/>";
el.firstChild.setAttribute("value", "");
return el.firstChild.getAttribute("value") === "";
})) {
addHandle("value", function(elem, _name, isXML2) {
if (!isXML2 && elem.nodeName.toLowerCase() === "input") {
return elem.defaultValue;
}
});
}
if (!assert(function(el) {
return el.getAttribute("disabled") == null;
})) {
addHandle(booleans, function(elem, name, isXML2) {
var val;
if (!isXML2) {
return elem[name] === true ? name.toLowerCase() : (val = elem.getAttributeNode(name)) && val.specified ? val.value : null;
}
});
}
return Sizzle2;
}(window2);
jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[":"] = jQuery.expr.pseudos;
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;
jQuery.escapeSelector = Sizzle.escape;
var dir = function(elem, dir2, until) {
var matched = [], truncate = until !== void 0;
while ((elem = elem[dir2]) && elem.nodeType !== 9) {
if (elem.nodeType === 1) {
if (truncate && jQuery(elem).is(until)) {
break;
}
matched.push(elem);
}
}
return matched;
};
var siblings = function(n, elem) {
var matched = [];
for (; n; n = n.nextSibling) {
if (n.nodeType === 1 && n !== elem) {
matched.push(n);
}
}
return matched;
};
var rneedsContext = jQuery.expr.match.needsContext;
function nodeName(elem, name) {
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
}
var rsingleTag = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;
function winnow(elements, qualifier, not) {
if (isFunction(qualifier)) {
return jQuery.grep(elements, function(elem, i) {
return !!qualifier.call(elem, i, elem) !== not;
});
}
if (qualifier.nodeType) {
return jQuery.grep(elements, function(elem) {
return elem === qualifier !== not;
});
}
if (typeof qualifier !== "string") {
return jQuery.grep(elements, function(elem) {
return indexOf.call(qualifier, elem) > -1 !== not;
});
}
return jQuery.filter(qualifier, elements, not);
}
jQuery.filter = function(expr, elems, not) {
var elem = elems[0];
if (not) {
expr = ":not(" + expr + ")";
}
if (elems.length === 1 && elem.nodeType === 1) {
return jQuery.find.matchesSelector(elem, expr) ? [elem] : [];
}
return jQuery.find.matches(expr, jQuery.grep(elems, function(elem2) {
return elem2.nodeType === 1;
}));
};
jQuery.fn.extend({
find: function(selector) {
var i, ret, len = this.length, self2 = this;
if (typeof selector !== "string") {
return this.pushStack(jQuery(selector).filter(function() {
for (i = 0; i < len; i++) {
if (jQuery.contains(self2[i], this)) {
return true;
}
}
}));
}
ret = this.pushStack([]);
for (i = 0; i < len; i++) {
jQuery.find(selector, self2[i], ret);
}
return len > 1 ? jQuery.uniqueSort(ret) : ret;
},
filter: function(selector) {
return this.pushStack(winnow(this, selector || [], false));
},
not: function(selector) {
return this.pushStack(winnow(this, selector || [], true));
},
is: function(selector) {
return !!winnow(
this,
typeof selector === "string" && rneedsContext.test(selector) ? jQuery(selector) : selector || [],
false
).length;
}
});
var rootjQuery, rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, init = jQuery.fn.init = function(selector, context, root) {
var match, elem;
if (!selector) {
return this;
}
root = root || rootjQuery;
if (typeof selector === "string") {
if (selector[0] === "<" && selector[selector.length - 1] === ">" && selector.length >= 3) {
match = [null, selector, null];
} else {
match = rquickExpr.exec(selector);
}
if (match && (match[1] || !context)) {
if (match[1]) {
context = context instanceof jQuery ? context[0] : context;
jQuery.merge(this, jQuery.parseHTML(
match[1],
context && context.nodeType ? context.ownerDocument || context : document2,
true
));
if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
for (match in context) {
if (isFunction(this[match])) {
this[match](context[match]);
} else {
this.attr(match, context[match]);
}
}
}
return this;
} else {
elem = document2.getElementById(match[2]);
if (elem) {
this[0] = elem;
this.length = 1;
}
return this;
}
} else if (!context || context.jquery) {
return (context || root).find(selector);
} else {
return this.constructor(context).find(selector);
}
} else if (selector.nodeType) {
this[0] = selector;
this.length = 1;
return this;
} else if (isFunction(selector)) {
return root.ready !== void 0 ? root.ready(selector) : selector(jQuery);
}
return jQuery.makeArray(selector, this);
};
init.prototype = jQuery.fn;
rootjQuery = jQuery(document2);
var rparentsprev = /^(?:parents|prev(?:Until|All))/, guaranteedUnique = {
children: true,
contents: true,
next: true,
prev: true
};
jQuery.fn.extend({
has: function(target) {
var targets = jQuery(target, this), l = targets.length;
return this.filter(function() {
var i = 0;
for (; i < l; i++) {
if (jQuery.contains(this, targets[i])) {
return true;
}
}
});
},
closest: function(selectors, context) {
var cur, i = 0, l = this.length, matched = [], targets = typeof selectors !== "string" && jQuery(selectors);
if (!rneedsContext.test(selectors)) {
for (; i < l; i++) {
for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {
if (cur.nodeType < 11 && (targets ? targets.index(cur) > -1 : cur.nodeType === 1 && jQuery.find.matchesSelector(cur, selectors))) {
matched.push(cur);
break;
}
}
}
}
return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);
},
index: function(elem) {
if (!elem) {
return this[0] && this[0].parentNode ? this.first().prevAll().length : -1;
}
if (typeof elem === "string") {
return indexOf.call(jQuery(elem), this[0]);
}
return indexOf.call(
this,
elem.jquery ? elem[0] : elem
);
},
add: function(selector, context) {
return this.pushStack(
jQuery.uniqueSort(
jQuery.merge(this.get(), jQuery(selector, context))
)
);
},
addBack: function(selector) {
return this.add(
selector == null ? this.prevObject : this.prevObject.filter(selector)
);
}
});
function sibling(cur, dir2) {
while ((cur = cur[dir2]) && cur.nodeType !== 1) {
}
return cur;
}
jQuery.each({
parent: function(elem) {
var parent = elem.parentNode;
return parent && parent.nodeType !== 11 ? parent : null;
},
parents: function(elem) {
return dir(elem, "parentNode");
},
parentsUntil: function(elem, _i, until) {
return dir(elem, "parentNode", until);
},
next: function(elem) {
return sibling(elem, "nextSibling");
},
prev: function(elem) {
return sibling(elem, "previousSibling");
},
nextAll: function(elem) {
return dir(elem, "nextSibling");
},
prevAll: function(elem) {
return dir(elem, "previousSibling");
},
nextUntil: function(elem, _i, until) {
return dir(elem, "nextSibling", until);
},
prevUntil: function(elem, _i, until) {
return dir(elem, "previousSibling", until);
},
siblings: function(elem) {
return siblings((elem.parentNode || {}).firstChild, elem);
},
children: function(elem) {
return siblings(elem.firstChild);
},
contents: function(elem) {
if (elem.contentDocument != null && getProto(elem.contentDocument)) {
return elem.contentDocument;
}
if (nodeName(elem, "template")) {
elem = elem.content || elem;
}
return jQuery.merge([], elem.childNodes);
}
}, function(name, fn2) {
jQuery.fn[name] = function(until, selector) {
var matched = jQuery.map(this, fn2, until);
if (name.slice(-5) !== "Until") {
selector = until;
}
if (selector && typeof selector === "string") {
matched = jQuery.filter(selector, matched);
}
if (this.length > 1) {
if (!guaranteedUnique[name]) {
jQuery.uniqueSort(matched);
}
if (rparentsprev.test(name)) {
matched.reverse();
}
}
return this.pushStack(matched);
};
});
var rnothtmlwhite = /[^\x20\t\r\n\f]+/g;
function createOptions(options) {
var object = {};
jQuery.each(options.match(rnothtmlwhite) || [], function(_, flag) {
object[flag] = true;
});
return object;
}
jQuery.Callbacks = function(options) {
options = typeof options === "string" ? createOptions(options) : jQuery.extend({}, options);
var firing, memory, fired, locked, list = [], queue = [], firingIndex = -1, fire = function() {
locked = locked || options.once;
fired = firing = true;
for (; queue.length; firingIndex = -1) {
memory = queue.shift();
while (++firingIndex < list.length) {
if (list[firingIndex].apply(memory[0], memory[1]) === false && options.stopOnFalse) {
firingIndex = list.length;
memory = false;
}
}
}
if (!options.memory) {
memory = false;
}
firing = false;
if (locked) {
if (memory) {
list = [];
} else {
list = "";
}
}
}, self2 = {
add: function() {
if (list) {
if (memory && !firing) {
firingIndex = list.length - 1;
queue.push(memory);
}
(function add(args) {
jQuery.each(args, function(_, arg) {
if (isFunction(arg)) {
if (!options.unique || !self2.has(arg)) {
list.push(arg);
}
} else if (arg && arg.length && toType2(arg) !== "string") {
add(arg);
}
});
})(arguments);
if (memory && !firing) {
fire();
}
}
return this;
},
remove: function() {
jQuery.each(arguments, function(_, arg) {
var index;
while ((index = jQuery.inArray(arg, list, index)) > -1) {
list.splice(index, 1);
if (index <= firingIndex) {
firingIndex--;
}
}
});
return this;
},
has: function(fn2) {
return fn2 ? jQuery.inArray(fn2, list) > -1 : list.length > 0;
},
empty: function() {
if (list) {
list = [];
}
return this;
},
disable: function() {
locked = queue = [];
list = memory = "";
return this;
},
disabled: function() {
return !list;
},
lock: function() {
locked = queue = [];
if (!memory && !firing) {
list = memory = "";
}
return this;
},
locked: function() {
return !!locked;
},
fireWith: function(context, args) {
if (!locked) {
args = args || [];
args = [context, args.slice ? args.slice() : args];
queue.push(args);
if (!firing) {
fire();
}
}
return this;
},
fire: function() {
self2.fireWith(this, arguments);
return this;
},
fired: function() {
return !!fired;
}
};
return self2;
};
function Identity(v) {
return v;
}
function Thrower(ex) {
throw ex;
}
function adoptValue(value, resolve, reject, noValue) {
var method;
try {
if (value && isFunction(method = value.promise)) {
method.call(value).done(resolve).fail(reject);
} else if (value && isFunction(method = value.then)) {
method.call(value, resolve, reject);
} else {
resolve.apply(void 0, [value].slice(noValue));
}
} catch (value2) {
reject.apply(void 0, [value2]);
}
}
jQuery.extend({
Deferred: function(func) {
var tuples = [
[
"notify",
"progress",
jQuery.Callbacks("memory"),
jQuery.Callbacks("memory"),
2
],
[
"resolve",
"done",
jQuery.Callbacks("once memory"),
jQuery.Callbacks("once memory"),
0,
"resolved"
],
[
"reject",
"fail",
jQuery.Callbacks("once memory"),
jQuery.Callbacks("once memory"),
1,
"rejected"
]
], state = "pending", promise = {
state: function() {
return state;
},
always: function() {
deferred.done(arguments).fail(arguments);
return this;
},
"catch": function(fn2) {
return promise.then(null, fn2);
},
pipe: function() {
var fns = arguments;
return jQuery.Deferred(function(newDefer) {
jQuery.each(tuples, function(_i, tuple) {
var fn2 = isFunction(fns[tuple[4]]) && fns[tuple[4]];
deferred[tuple[1]](function() {
var returned = fn2 && fn2.apply(this, arguments);
if (returned && isFunction(returned.promise)) {
returned.promise().progress(newDefer.notify).done(newDefer.resolve).fail(newDefer.reject);
} else {
newDefer[tuple[0] + "With"](
this,
fn2 ? [returned] : arguments
);
}
});
});
fns = null;
}).promise();
},
then: function(onFulfilled, onRejected, onProgress) {
var maxDepth = 0;
function resolve(depth, deferred2, handler, special) {
return function() {
var that = this, args = arguments, mightThrow = function() {
var returned, then;
if (depth < maxDepth) {
return;
}
returned = handler.apply(that, args);
if (returned === deferred2.promise()) {
throw new TypeError("Thenable self-resolution");
}
then = returned && (typeof returned === "object" || typeof returned === "function") && returned.then;
if (isFunction(then)) {
if (special) {
then.call(
returned,
resolve(maxDepth, deferred2, Identity, special),
resolve(maxDepth, deferred2, Thrower, special)
);
} else {
maxDepth++;
then.call(
returned,
resolve(maxDepth, deferred2, Identity, special),
resolve(maxDepth, deferred2, Thrower, special),
resolve(
maxDepth,
deferred2,
Identity,
deferred2.notifyWith
)
);
}
} else {
if (handler !== Identity) {
that = void 0;
args = [returned];
}
(special || deferred2.resolveWith)(that, args);
}
}, process2 = special ? mightThrow : function() {
try {
mightThrow();
} catch (e) {
if (jQuery.Deferred.exceptionHook) {
jQuery.Deferred.exceptionHook(
e,
process2.stackTrace
);
}
if (depth + 1 >= maxDepth) {
if (handler !== Thrower) {
that = void 0;
args = [e];
}
deferred2.rejectWith(that, args);
}
}
};
if (depth) {
process2();
} else {
if (jQuery.Deferred.getStackHook) {
process2.stackTrace = jQuery.Deferred.getStackHook();
}
window2.setTimeout(process2);
}
};
}
return jQuery.Deferred(function(newDefer) {
tuples[0][3].add(
resolve(
0,
newDefer,
isFunction(onProgress) ? onProgress : Identity,
newDefer.notifyWith
)
);
tuples[1][3].add(
resolve(
0,
newDefer,
isFunction(onFulfilled) ? onFulfilled : Identity
)
);
tuples[2][3].add(
resolve(
0,
newDefer,
isFunction(onRejected) ? onRejected : Thrower
)
);
}).promise();
},
promise: function(obj) {
return obj != null ? jQuery.extend(obj, promise) : promise;
}
}, deferred = {};
jQuery.each(tuples, function(i, tuple) {
var list = tuple[2], stateString = tuple[5];
promise[tuple[1]] = list.add;
if (stateString) {
list.add(
function() {
state = stateString;
},
tuples[3 - i][2].disable,
tuples[3 - i][3].disable,
tuples[0][2].lock,
tuples[0][3].lock
);
}
list.add(tuple[3].fire);
deferred[tuple[0]] = function() {
deferred[tuple[0] + "With"](this === deferred ? void 0 : this, arguments);
return this;
};
deferred[tuple[0] + "With"] = list.fireWith;
});
promise.promise(deferred);
if (func) {
func.call(deferred, deferred);
}
return deferred;
},
when: function(singleValue) {
var remaining = arguments.length, i = remaining, resolveContexts = Array(i), resolveValues = slice.call(arguments), primary = jQuery.Deferred(), updateFunc = function(i2) {
return function(value) {
resolveContexts[i2] = this;
resolveValues[i2] = arguments.length > 1 ? slice.call(arguments) : value;
if (!--remaining) {
primary.resolveWith(resolveContexts, resolveValues);
}
};
};
if (remaining <= 1) {
adoptValue(
singleValue,
primary.done(updateFunc(i)).resolve,
primary.reject,
!remaining
);
if (primary.state() === "pending" || isFunction(resolveValues[i] && resolveValues[i].then)) {
return primary.then();
}
}
while (i--) {
adoptValue(resolveValues[i], updateFunc(i), primary.reject);
}
return primary.promise();
}
});
var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
jQuery.Deferred.exceptionHook = function(error, stack) {
if (window2.console && window2.console.warn && error && rerrorNames.test(error.name)) {
window2.console.warn("jQuery.Deferred exception: " + error.message, error.stack, stack);
}
};
jQuery.readyException = function(error) {
window2.setTimeout(function() {
throw error;
});
};
var readyList = jQuery.Deferred();
jQuery.fn.ready = function(fn2) {
readyList.then(fn2).catch(function(error) {
jQuery.readyException(error);
});
return this;
};
jQuery.extend({
isReady: false,
readyWait: 1,
ready: function(wait) {
if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
return;
}
jQuery.isReady = true;
if (wait !== true && --jQuery.readyWait > 0) {
return;
}
readyList.resolveWith(document2, [jQuery]);
}
});
jQuery.ready.then = readyList.then;
function completed() {
document2.removeEventListener("DOMContentLoaded", completed);
window2.removeEventListener("load", completed);
jQuery.ready();
}
if (document2.readyState === "complete" || document2.readyState !== "loading" && !document2.documentElement.doScroll) {
window2.setTimeout(jQuery.ready);
} else {
document2.addEventListener("DOMContentLoaded", completed);
window2.addEventListener("load", completed);
}
var access = function(elems, fn2, key, value, chainable, emptyGet, raw) {
var i = 0, len = elems.length, bulk = key == null;
if (toType2(key) === "object") {
chainable = true;
for (i in key) {
access(elems, fn2, i, key[i], true, emptyGet, raw);
}
} else if (value !== void 0) {
chainable = true;
if (!isFunction(value)) {
raw = true;
}
if (bulk) {
if (raw) {
fn2.call(elems, value);
fn2 = null;
} else {
bulk = fn2;
fn2 = function(elem, _key, value2) {
return bulk.call(jQuery(elem), value2);
};
}
}
if (fn2) {
for (; i < len; i++) {
fn2(
elems[i],
key,
raw ? value : value.call(elems[i], i, fn2(elems[i], key))
);
}
}
}
if (chainable) {
return elems;
}
if (bulk) {
return fn2.call(elems);
}
return len ? fn2(elems[0], key) : emptyGet;
};
var rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g;
function fcamelCase(_all, letter) {
return letter.toUpperCase();
}
function camelCase(string) {
return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
}
var acceptData = function(owner) {
return owner.nodeType === 1 || owner.nodeType === 9 || !+owner.nodeType;
};
function Data2() {
this.expando = jQuery.expando + Data2.uid++;
}
Data2.uid = 1;
Data2.prototype = {
cache: function(owner) {
var value = owner[this.expando];
if (!value) {
value = {};
if (acceptData(owner)) {
if (owner.nodeType) {
owner[this.expando] = value;
} else {
Object.defineProperty(owner, this.expando, {
value,
configurable: true
});
}
}
}
return value;
},
set: function(owner, data, value) {
var prop, cache = this.cache(owner);
if (typeof data === "string") {
cache[camelCase(data)] = value;
} else {
for (prop in data) {
cache[camelCase(prop)] = data[prop];
}
}
return cache;
},
get: function(owner, key) {
return key === void 0 ? this.cache(owner) : owner[this.expando] && owner[this.expando][camelCase(key)];
},
access: function(owner, key, value) {
if (key === void 0 || key && typeof key === "string" && value === void 0) {
return this.get(owner, key);
}
this.set(owner, key, value);
return value !== void 0 ? value : key;
},
remove: function(owner, key) {
var i, cache = owner[this.expando];
if (cache === void 0) {
return;
}
if (key !== void 0) {
if (Array.isArray(key)) {
key = key.map(camelCase);
} else {
key = camelCase(key);
key = key in cache ? [key] : key.match(rnothtmlwhite) || [];
}
i = key.length;
while (i--) {
delete cache[key[i]];
}
}
if (key === void 0 || jQuery.isEmptyObject(cache)) {
if (owner.nodeType) {
owner[this.expando] = void 0;
} else {
delete owner[this.expando];
}
}
},
hasData: function(owner) {
var cache = owner[this.expando];
return cache !== void 0 && !jQuery.isEmptyObject(cache);
}
};
var dataPriv = new Data2();
var dataUser = new Data2();
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /[A-Z]/g;
function getData(data) {
if (data === "true") {
return true;
}
if (data === "false") {
return false;
}
if (data === "null") {
return null;
}
if (data === +data + "") {
return +data;
}
if (rbrace.test(data)) {
return JSON.parse(data);
}
return data;
}
function dataAttr(elem, key, data) {
var name;
if (data === void 0 && elem.nodeType === 1) {
name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase();
data = elem.getAttribute(name);
if (typeof data === "string") {
try {
data = getData(data);
} catch (e) {
}
dataUser.set(elem, key, data);
} else {
data = void 0;
}
}
return data;
}
jQuery.extend({
hasData: function(elem) {
return dataUser.hasData(elem) || dataPriv.hasData(elem);
},
data: function(elem, name, data) {
return dataUser.access(elem, name, data);
},
removeData: function(elem, name) {
dataUser.remove(elem, name);
},
_data: function(elem, name, data) {
return dataPriv.access(elem, name, data);
},
_removeData: function(elem, name) {
dataPriv.remove(elem, name);
}
});
jQuery.fn.extend({
data: function(key, value) {
var i, name, data, elem = this[0], attrs = elem && elem.attributes;
if (key === void 0) {
if (this.length) {
data = dataUser.get(elem);
if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) {
i = attrs.length;
while (i--) {
if (attrs[i]) {
name = attrs[i].name;
if (name.indexOf("data-") === 0) {
name = camelCase(name.slice(5));
dataAttr(elem, name, data[name]);
}
}
}
dataPriv.set(elem, "hasDataAttrs", true);
}
}
return data;
}
if (typeof key === "object") {
return this.each(function() {
dataUser.set(this, key);
});
}
return access(this, function(value2) {
var data2;
if (elem && value2 === void 0) {
data2 = dataUser.get(elem, key);
if (data2 !== void 0) {
return data2;
}
data2 = dataAttr(elem, key);
if (data2 !== void 0) {
return data2;
}
return;
}
this.each(function() {
dataUser.set(this, key, value2);
});
}, null, value, arguments.length > 1, null, true);
},
removeData: function(key) {
return this.each(function() {
dataUser.remove(this, key);
});
}
});
jQuery.extend({
queue: function(elem, type, data) {
var queue;
if (elem) {
type = (type || "fx") + "queue";
queue = dataPriv.get(elem, type);
if (data) {
if (!queue || Array.isArray(data)) {
queue = dataPriv.access(elem, type, jQuery.makeArray(data));
} else {
queue.push(data);
}
}
return queue || [];
}
},
dequeue: function(elem, type) {
type = type || "fx";
var queue = jQuery.queue(elem, type), startLength = queue.length, fn2 = queue.shift(), hooks = jQuery._queueHooks(elem, type), next = function() {
jQuery.dequeue(elem, type);
};
if (fn2 === "inprogress") {
fn2 = queue.shift();
startLength--;
}
if (fn2) {
if (type === "fx") {
queue.unshift("inprogress");
}
delete hooks.stop;
fn2.call(elem, next, hooks);
}
if (!startLength && hooks) {
hooks.empty.fire();
}
},
_queueHooks: function(elem, type) {
var key = type + "queueHooks";
return dataPriv.get(elem, key) || dataPriv.access(elem, key, {
empty: jQuery.Callbacks("once memory").add(function() {
dataPriv.remove(elem, [type + "queue", key]);
})
});
}
});
jQuery.fn.extend({
queue: function(type, data) {
var setter = 2;
if (typeof type !== "string") {
data = type;
type = "fx";
setter--;
}
if (arguments.length < setter) {
return jQuery.queue(this[0], type);
}
return data === void 0 ? this : this.each(function() {
var queue = jQuery.queue(this, type, data);
jQuery._queueHooks(this, type);
if (type === "fx" && queue[0] !== "inprogress") {
jQuery.dequeue(this, type);
}
});
},
dequeue: function(type) {
return this.each(function() {
jQuery.dequeue(this, type);
});
},
clearQueue: function(type) {
return this.queue(type || "fx", []);
},
promise: function(type, obj) {
var tmp, count = 1, defer = jQuery.Deferred(), elements = this, i = this.length, resolve = function() {
if (!--count) {
defer.resolveWith(elements, [elements]);
}
};
if (typeof type !== "string") {
obj = type;
type = void 0;
}
type = type || "fx";
while (i--) {
tmp = dataPriv.get(elements[i], type + "queueHooks");
if (tmp && tmp.empty) {
count++;
tmp.empty.add(resolve);
}
}
resolve();
return defer.promise(obj);
}
});
var pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source;
var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");
var cssExpand = ["Top", "Right", "Bottom", "Left"];
var documentElement = document2.documentElement;
var isAttached = function(elem) {
return jQuery.contains(elem.ownerDocument, elem);
}, composed = { composed: true };
if (documentElement.getRootNode) {
isAttached = function(elem) {
return jQuery.contains(elem.ownerDocument, elem) || elem.getRootNode(composed) === elem.ownerDocument;
};
}
var isHiddenWithinTree = function(elem, el) {
elem = el || elem;
return elem.style.display === "none" || elem.style.display === "" && isAttached(elem) && jQuery.css(elem, "display") === "none";
};
function adjustCSS(elem, prop, valueParts, tween) {
var adjusted, scale, maxIterations = 20, currentValue = tween ? function() {
return tween.cur();
} : function() {
return jQuery.css(elem, prop, "");
}, initial = currentValue(), unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"), initialInUnit = elem.nodeType && (jQuery.cssNumber[prop] || unit !== "px" && +initial) && rcssNum.exec(jQuery.css(elem, prop));
if (initialInUnit && initialInUnit[3] !== unit) {
initial = initial / 2;
unit = unit || initialInUnit[3];
initialInUnit = +initial || 1;
while (maxIterations--) {
jQuery.style(elem, prop, initialInUnit + unit);
if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) {
maxIterations = 0;
}
initialInUnit = initialInUnit / scale;
}
initialInUnit = initialInUnit * 2;
jQuery.style(elem, prop, initialInUnit + unit);
valueParts = valueParts || [];
}
if (valueParts) {
initialInUnit = +initialInUnit || +initial || 0;
adjusted = valueParts[1] ? initialInUnit + (valueParts[1] + 1) * valueParts[2] : +valueParts[2];
if (tween) {
tween.unit = unit;
tween.start = initialInUnit;
tween.end = adjusted;
}
}
return adjusted;
}
var defaultDisplayMap = {};
function getDefaultDisplay(elem) {
var temp, doc2 = elem.ownerDocument, nodeName2 = elem.nodeName, display = defaultDisplayMap[nodeName2];
if (display) {
return display;
}
temp = doc2.body.appendChild(doc2.createElement(nodeName2));
display = jQuery.css(temp, "display");
temp.parentNode.removeChild(temp);
if (display === "none") {
display = "block";
}
defaultDisplayMap[nodeName2] = display;
return display;
}
function showHide(elements, show) {
var display, elem, values = [], index = 0, length = elements.length;
for (; index < length; index++) {
elem = elements[index];
if (!elem.style) {
continue;
}
display = elem.style.display;
if (show) {
if (display === "none") {
values[index] = dataPriv.get(elem, "display") || null;
if (!values[index]) {
elem.style.display = "";
}
}
if (elem.style.display === "" && isHiddenWithinTree(elem)) {
values[index] = getDefaultDisplay(elem);
}
} else {
if (display !== "none") {
values[index] = "none";
dataPriv.set(elem, "display", display);
}
}
}
for (index = 0; index < length; index++) {
if (values[index] != null) {
elements[index].style.display = values[index];
}
}
return elements;
}
jQuery.fn.extend({
show: function() {
return showHide(this, true);
},
hide: function() {
return showHide(this);
},
toggle: function(state) {
if (typeof state === "boolean") {
return state ? this.show() : this.hide();
}
return this.each(function() {
if (isHiddenWithinTree(this)) {
jQuery(this).show();
} else {
jQuery(this).hide();
}
});
}
});
var rcheckableType = /^(?:checkbox|radio)$/i;
var rtagName = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i;
var rscriptType = /^$|^module$|\/(?:java|ecma)script/i;
(function() {
var fragment = document2.createDocumentFragment(), div = fragment.appendChild(document2.createElement("div")), input = document2.createElement("input");
input.setAttribute("type", "radio");
input.setAttribute("checked", "checked");
input.setAttribute("name", "t");
div.appendChild(input);
support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;
div.innerHTML = "<textarea>x</textarea>";
support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;
div.innerHTML = "<option></option>";
support.option = !!div.lastChild;
})();
var wrapMap = {
thead: [1, "<table>", "</table>"],
col: [2, "<table><colgroup>", "</colgroup></table>"],
tr: [2, "<table><tbody>", "</tbody></table>"],
td: [3, "<table><tbody><tr>", "</tr></tbody></table>"],
_default: [0, "", ""]
};
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;
if (!support.option) {
wrapMap.optgroup = wrapMap.option = [1, "<select multiple='multiple'>", "</select>"];
}
function getAll(context, tag) {
var ret;
if (typeof context.getElementsByTagName !== "undefined") {
ret = context.getElementsByTagName(tag || "*");
} else if (typeof context.querySelectorAll !== "undefined") {
ret = context.querySelectorAll(tag || "*");
} else {
ret = [];
}
if (tag === void 0 || tag && nodeName(context, tag)) {
return jQuery.merge([context], ret);
}
return ret;
}
function setGlobalEval(elems, refElements) {
var i = 0, l = elems.length;
for (; i < l; i++) {
dataPriv.set(
elems[i],
"globalEval",
!refElements || dataPriv.get(refElements[i], "globalEval")
);
}
}
var rhtml = /<|&#?\w+;/;
function buildFragment(elems, context, scripts, selection, ignored) {
var elem, tmp, tag, wrap, attached, j, fragment = context.createDocumentFragment(), nodes = [], i = 0, l = elems.length;
for (; i < l; i++) {
elem = elems[i];
if (elem || elem === 0) {
if (toType2(elem) === "object") {
jQuery.merge(nodes, elem.nodeType ? [elem] : elem);
} else if (!rhtml.test(elem)) {
nodes.push(context.createTextNode(elem));
} else {
tmp = tmp || fragment.appendChild(context.createElement("div"));
tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
wrap = wrapMap[tag] || wrapMap._default;
tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2];
j = wrap[0];
while (j--) {
tmp = tmp.lastChild;
}
jQuery.merge(nodes, tmp.childNodes);
tmp = fragment.firstChild;
tmp.textContent = "";
}
}
}
fragment.textContent = "";
i = 0;
while (elem = nodes[i++]) {
if (selection && jQuery.inArray(elem, selection) > -1) {
if (ignored) {
ignored.push(elem);
}
continue;
}
attached = isAttached(elem);
tmp = getAll(fragment.appendChild(elem), "script");
if (attached) {
setGlobalEval(tmp);
}
if (scripts) {
j = 0;
while (elem = tmp[j++]) {
if (rscriptType.test(elem.type || "")) {
scripts.push(elem);
}
}
}
}
return fragment;
}
var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
}
function returnFalse() {
return false;
}
function expectSync(elem, type) {
return elem === safeActiveElement() === (type === "focus");
}
function safeActiveElement() {
try {
return document2.activeElement;
} catch (err) {
}
}
function on(elem, types, selector, data, fn2, one) {
var origFn, type;
if (typeof types === "object") {
if (typeof selector !== "string") {
data = data || selector;
selector = void 0;
}
for (type in types) {
on(elem, type, selector, data, types[type], one);
}
return elem;
}
if (data == null && fn2 == null) {
fn2 = selector;
data = selector = void 0;
} else if (fn2 == null) {
if (typeof selector === "string") {
fn2 = data;
data = void 0;
} else {
fn2 = data;
data = selector;
selector = void 0;
}
}
if (fn2 === false) {
fn2 = returnFalse;
} else if (!fn2) {
return elem;
}
if (one === 1) {
origFn = fn2;
fn2 = function(event) {
jQuery().off(event);
return origFn.apply(this, arguments);
};
fn2.guid = origFn.guid || (origFn.guid = jQuery.guid++);
}
return elem.each(function() {
jQuery.event.add(this, types, fn2, data, selector);
});
}
jQuery.event = {
global: {},
add: function(elem, types, handler, data, selector) {
var handleObjIn, eventHandle, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.get(elem);
if (!acceptData(elem)) {
return;
}
if (handler.handler) {
handleObjIn = handler;
handler = handleObjIn.handler;
selector = handleObjIn.selector;
}
if (selector) {
jQuery.find.matchesSelector(documentElement, selector);
}
if (!handler.guid) {
handler.guid = jQuery.guid++;
}
if (!(events = elemData.events)) {
events = elemData.events = /* @__PURE__ */ Object.create(null);
}
if (!(eventHandle = elemData.handle)) {
eventHandle = elemData.handle = function(e) {
return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? jQuery.event.dispatch.apply(elem, arguments) : void 0;
};
}
types = (types || "").match(rnothtmlwhite) || [""];
t = types.length;
while (t--) {
tmp = rtypenamespace.exec(types[t]) || [];
type = origType = tmp[1];
namespaces = (tmp[2] || "").split(".").sort();
if (!type) {
continue;
}
special = jQuery.event.special[type] || {};
type = (selector ? special.delegateType : special.bindType) || type;
special = jQuery.event.special[type] || {};
handleObj = jQuery.extend({
type,
origType,
data,
handler,
guid: handler.guid,
selector,
needsContext: selector && jQuery.expr.match.needsContext.test(selector),
namespace: namespaces.join(".")
}, handleObjIn);
if (!(handlers = events[type])) {
handlers = events[type] = [];
handlers.delegateCount = 0;
if (!special.setup || special.setup.call(elem, data, namespaces, eventHandle) === false) {
if (elem.addEventListener) {
elem.addEventListener(type, eventHandle);
}
}
}
if (special.add) {
special.add.call(elem, handleObj);
if (!handleObj.handler.guid) {
handleObj.handler.guid = handler.guid;
}
}
if (selector) {
handlers.splice(handlers.delegateCount++, 0, handleObj);
} else {
handlers.push(handleObj);
}
jQuery.event.global[type] = true;
}
},
remove: function(elem, types, handler, selector, mappedTypes) {
var j, origCount, tmp, events, t, handleObj, special, handlers, type, namespaces, origType, elemData = dataPriv.hasData(elem) && dataPriv.get(elem);
if (!elemData || !(events = elemData.events)) {
return;
}
types = (types || "").match(rnothtmlwhite) || [""];
t = types.length;
while (t--) {
tmp = rtypenamespace.exec(types[t]) || [];
type = origType = tmp[1];
namespaces = (tmp[2] || "").split(".").sort();
if (!type) {
for (type in events) {
jQuery.event.remove(elem, type + types[t], handler, selector, true);
}
continue;
}
special = jQuery.event.special[type] || {};
type = (selector ? special.delegateType : special.bindType) || type;
handlers = events[type] || [];
tmp = tmp[2] && new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");
origCount = j = handlers.length;
while (j--) {
handleObj = handlers[j];
if ((mappedTypes || origType === handleObj.origType) && (!handler || handler.guid === handleObj.guid) && (!tmp || tmp.test(handleObj.namespace)) && (!selector || selector === handleObj.selector || selector === "**" && handleObj.selector)) {
handlers.splice(j, 1);
if (handleObj.selector) {
handlers.delegateCount--;
}
if (special.remove) {
special.remove.call(elem, handleObj);
}
}
}
if (origCount && !handlers.length) {
if (!special.teardown || special.teardown.call(elem, namespaces, elemData.handle) === false) {
jQuery.removeEvent(elem, type, elemData.handle);
}
delete events[type];
}
}
if (jQuery.isEmptyObject(events)) {
dataPriv.remove(elem, "handle events");
}
},
dispatch: function(nativeEvent) {
var i, j, ret, matched, handleObj, handlerQueue, args = new Array(arguments.length), event = jQuery.event.fix(nativeEvent), handlers = (dataPriv.get(this, "events") || /* @__PURE__ */ Object.create(null))[event.type] || [], special = jQuery.event.special[event.type] || {};
args[0] = event;
for (i = 1; i < arguments.length; i++) {
args[i] = arguments[i];
}
event.delegateTarget = this;
if (special.preDispatch && special.preDispatch.call(this, event) === false) {
return;
}
handlerQueue = jQuery.event.handlers.call(this, event, handlers);
i = 0;
while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
event.currentTarget = matched.elem;
j = 0;
while ((handleObj = matched.handlers[j++]) && !event.isImmediatePropagationStopped()) {
if (!event.rnamespace || handleObj.namespace === false || event.rnamespace.test(handleObj.namespace)) {
event.handleObj = handleObj;
event.data = handleObj.data;
ret = ((jQuery.event.special[handleObj.origType] || {}).handle || handleObj.handler).apply(matched.elem, args);
if (ret !== void 0) {
if ((event.result = ret) === false) {
event.preventDefault();
event.stopPropagation();
}
}
}
}
}
if (special.postDispatch) {
special.postDispatch.call(this, event);
}
return event.result;
},
handlers: function(event, handlers) {
var i, handleObj, sel, matchedHandlers, matchedSelectors, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target;
if (delegateCount && cur.nodeType && !(event.type === "click" && event.button >= 1)) {
for (; cur !== this; cur = cur.parentNode || this) {
if (cur.nodeType === 1 && !(event.type === "click" && cur.disabled === true)) {
matchedHandlers = [];
matchedSelectors = {};
for (i = 0; i < delegateCount; i++) {
handleObj = handlers[i];
sel = handleObj.selector + " ";
if (matchedSelectors[sel] === void 0) {
matchedSelectors[sel] = handleObj.needsContext ? jQuery(sel, this).index(cur) > -1 : jQuery.find(sel, this, null, [cur]).length;
}
if (matchedSelectors[sel]) {
matchedHandlers.push(handleObj);
}
}
if (matchedHandlers.length) {
handlerQueue.push({ elem: cur, handlers: matchedHandlers });
}
}
}
}
cur = this;
if (delegateCount < handlers.length) {
handlerQueue.push({ elem: cur, handlers: handlers.slice(delegateCount) });
}
return handlerQueue;
},
addProp: function(name, hook) {
Object.defineProperty(jQuery.Event.prototype, name, {
enumerable: true,
configurable: true,
get: isFunction(hook) ? function() {
if (this.originalEvent) {
return hook(this.originalEvent);
}
} : function() {
if (this.originalEvent) {
return this.originalEvent[name];
}
},
set: function(value) {
Object.defineProperty(this, name, {
enumerable: true,
configurable: true,
writable: true,
value
});
}
});
},
fix: function(originalEvent) {
return originalEvent[jQuery.expando] ? originalEvent : new jQuery.Event(originalEvent);
},
special: {
load: {
noBubble: true
},
click: {
setup: function(data) {
var el = this || data;
if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) {
leverageNative(el, "click", returnTrue);
}
return false;
},
trigger: function(data) {
var el = this || data;
if (rcheckableType.test(el.type) && el.click && nodeName(el, "input")) {
leverageNative(el, "click");
}
return true;
},
_default: function(event) {
var target = event.target;
return rcheckableType.test(target.type) && target.click && nodeName(target, "input") && dataPriv.get(target, "click") || nodeName(target, "a");
}
},
beforeunload: {
postDispatch: function(event) {
if (event.result !== void 0 && event.originalEvent) {
event.originalEvent.returnValue = event.result;
}
}
}
}
};
function leverageNative(el, type, expectSync2) {
if (!expectSync2) {
if (dataPriv.get(el, type) === void 0) {
jQuery.event.add(el, type, returnTrue);
}
return;
}
dataPriv.set(el, type, false);
jQuery.event.add(el, type, {
namespace: false,
handler: function(event) {
var notAsync, result, saved = dataPriv.get(this, type);
if (event.isTrigger & 1 && this[type]) {
if (!saved.length) {
saved = slice.call(arguments);
dataPriv.set(this, type, saved);
notAsync = expectSync2(this, type);
this[type]();
result = dataPriv.get(this, type);
if (saved !== result || notAsync) {
dataPriv.set(this, type, false);
} else {
result = {};
}
if (saved !== result) {
event.stopImmediatePropagation();
event.preventDefault();
return result && result.value;
}
} else if ((jQuery.event.special[type] || {}).delegateType) {
event.stopPropagation();
}
} else if (saved.length) {
dataPriv.set(this, type, {
value: jQuery.event.trigger(
jQuery.extend(saved[0], jQuery.Event.prototype),
saved.slice(1),
this
)
});
event.stopImmediatePropagation();
}
}
});
}
jQuery.removeEvent = function(elem, type, handle) {
if (elem.removeEventListener) {
elem.removeEventListener(type, handle);
}
};
jQuery.Event = function(src, props) {
if (!(this instanceof jQuery.Event)) {
return new jQuery.Event(src, props);
}
if (src && src.type) {
this.originalEvent = src;
this.type = src.type;
this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === void 0 && src.returnValue === false ? returnTrue : returnFalse;
this.target = src.target && src.target.nodeType === 3 ? src.target.parentNode : src.target;
this.currentTarget = src.currentTarget;
this.relatedTarget = src.relatedTarget;
} else {
this.type = src;
}
if (props) {
jQuery.extend(this, props);
}
this.timeStamp = src && src.timeStamp || Date.now();
this[jQuery.expando] = true;
};
jQuery.Event.prototype = {
constructor: jQuery.Event,
isDefaultPrevented: returnFalse,
isPropagationStopped: returnFalse,
isImmediatePropagationStopped: returnFalse,
isSimulated: false,
preventDefault: function() {
var e = this.originalEvent;
this.isDefaultPrevented = returnTrue;
if (e && !this.isSimulated) {
e.preventDefault();
}
},
stopPropagation: function() {
var e = this.originalEvent;
this.isPropagationStopped = returnTrue;
if (e && !this.isSimulated) {
e.stopPropagation();
}
},
stopImmediatePropagation: function() {
var e = this.originalEvent;
this.isImmediatePropagationStopped = returnTrue;
if (e && !this.isSimulated) {
e.stopImmediatePropagation();
}
this.stopPropagation();
}
};
jQuery.each({
altKey: true,
bubbles: true,
cancelable: true,
changedTouches: true,
ctrlKey: true,
detail: true,
eventPhase: true,
metaKey: true,
pageX: true,
pageY: true,
shiftKey: true,
view: true,
"char": true,
code: true,
charCode: true,
key: true,
keyCode: true,
button: true,
buttons: true,
clientX: true,
clientY: true,
offsetX: true,
offsetY: true,
pointerId: true,
pointerType: true,
screenX: true,
screenY: true,
targetTouches: true,
toElement: true,
touches: true,
which: true
}, jQuery.event.addProp);
jQuery.each({ focus: "focusin", blur: "focusout" }, function(type, delegateType) {
jQuery.event.special[type] = {
setup: function() {
leverageNative(this, type, expectSync);
return false;
},
trigger: function() {
leverageNative(this, type);
return true;
},
_default: function() {
return true;
},
delegateType
};
});
jQuery.each({
mouseenter: "mouseover",
mouseleave: "mouseout",
pointerenter: "pointerover",
pointerleave: "pointerout"
}, function(orig, fix) {
jQuery.event.special[orig] = {
delegateType: fix,
bindType: fix,
handle: function(event) {
var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj;
if (!related || related !== target && !jQuery.contains(target, related)) {
event.type = handleObj.origType;
ret = handleObj.handler.apply(this, arguments);
event.type = fix;
}
return ret;
}
};
});
jQuery.fn.extend({
on: function(types, selector, data, fn2) {
return on(this, types, selector, data, fn2);
},
one: function(types, selector, data, fn2) {
return on(this, types, selector, data, fn2, 1);
},
off: function(types, selector, fn2) {
var handleObj, type;
if (types && types.preventDefault && types.handleObj) {
handleObj = types.handleObj;
jQuery(types.delegateTarget).off(
handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
handleObj.selector,
handleObj.handler
);
return this;
}
if (typeof types === "object") {
for (type in types) {
this.off(type, selector, types[type]);
}
return this;
}
if (selector === false || typeof selector === "function") {
fn2 = selector;
selector = void 0;
}
if (fn2 === false) {
fn2 = returnFalse;
}
return this.each(function() {
jQuery.event.remove(this, types, fn2, selector);
});
}
});
var rnoInnerhtml = /<script|<style|<link/i, rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
function manipulationTarget(elem, content) {
if (nodeName(elem, "table") && nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr")) {
return jQuery(elem).children("tbody")[0] || elem;
}
return elem;
}
function disableScript(elem) {
elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
return elem;
}
function restoreScript(elem) {
if ((elem.type || "").slice(0, 5) === "true/") {
elem.type = elem.type.slice(5);
} else {
elem.removeAttribute("type");
}
return elem;
}
function cloneCopyEvent(src, dest) {
var i, l, type, pdataOld, udataOld, udataCur, events;
if (dest.nodeType !== 1) {
return;
}
if (dataPriv.hasData(src)) {
pdataOld = dataPriv.get(src);
events = pdataOld.events;
if (events) {
dataPriv.remove(dest, "handle events");
for (type in events) {
for (i = 0, l = events[type].length; i < l; i++) {
jQuery.event.add(dest, type, events[type][i]);
}
}
}
}
if (dataUser.hasData(src)) {
udataOld = dataUser.access(src);
udataCur = jQuery.extend({}, udataOld);
dataUser.set(dest, udataCur);
}
}
function fixInput(src, dest) {
var nodeName2 = dest.nodeName.toLowerCase();
if (nodeName2 === "input" && rcheckableType.test(src.type)) {
dest.checked = src.checked;
} else if (nodeName2 === "input" || nodeName2 === "textarea") {
dest.defaultValue = src.defaultValue;
}
}
function domManip(collection, args, callback, ignored) {
args = flat(args);
var fragment, first, scripts, hasScripts, node, doc2, i = 0, l = collection.length, iNoClone = l - 1, value = args[0], valueIsFunction = isFunction(value);
if (valueIsFunction || l > 1 && typeof value === "string" && !support.checkClone && rchecked.test(value)) {
return collection.each(function(index) {
var self2 = collection.eq(index);
if (valueIsFunction) {
args[0] = value.call(this, index, self2.html());
}
domManip(self2, args, callback, ignored);
});
}
if (l) {
fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);
first = fragment.firstChild;
if (fragment.childNodes.length === 1) {
fragment = first;
}
if (first || ignored) {
scripts = jQuery.map(getAll(fragment, "script"), disableScript);
hasScripts = scripts.length;
for (; i < l; i++) {
node = fragment;
if (i !== iNoClone) {
node = jQuery.clone(node, true, true);
if (hasScripts) {
jQuery.merge(scripts, getAll(node, "script"));
}
}
callback.call(collection[i], node, i);
}
if (hasScripts) {
doc2 = scripts[scripts.length - 1].ownerDocument;
jQuery.map(scripts, restoreScript);
for (i = 0; i < hasScripts; i++) {
node = scripts[i];
if (rscriptType.test(node.type || "") && !dataPriv.access(node, "globalEval") && jQuery.contains(doc2, node)) {
if (node.src && (node.type || "").toLowerCase() !== "module") {
if (jQuery._evalUrl && !node.noModule) {
jQuery._evalUrl(node.src, {
nonce: node.nonce || node.getAttribute("nonce")
}, doc2);
}
} else {
DOMEval(node.textContent.replace(rcleanScript, ""), node, doc2);
}
}
}
}
}
}
return collection;
}
function remove(elem, selector, keepData) {
var node, nodes = selector ? jQuery.filter(selector, elem) : elem, i = 0;
for (; (node = nodes[i]) != null; i++) {
if (!keepData && node.nodeType === 1) {
jQuery.cleanData(getAll(node));
}
if (node.parentNode) {
if (keepData && isAttached(node)) {
setGlobalEval(getAll(node, "script"));
}
node.parentNode.removeChild(node);
}
}
return elem;
}
jQuery.extend({
htmlPrefilter: function(html) {
return html;
},
clone: function(elem, dataAndEvents, deepDataAndEvents) {
var i, l, srcElements, destElements, clone2 = elem.cloneNode(true), inPage = isAttached(elem);
if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem)) {
destElements = getAll(clone2);
srcElements = getAll(elem);
for (i = 0, l = srcElements.length; i < l; i++) {
fixInput(srcElements[i], destElements[i]);
}
}
if (dataAndEvents) {
if (deepDataAndEvents) {
srcElements = srcElements || getAll(elem);
destElements = destElements || getAll(clone2);
for (i = 0, l = srcElements.length; i < l; i++) {
cloneCopyEvent(srcElements[i], destElements[i]);
}
} else {
cloneCopyEvent(elem, clone2);
}
}
destElements = getAll(clone2, "script");
if (destElements.length > 0) {
setGlobalEval(destElements, !inPage && getAll(elem, "script"));
}
return clone2;
},
cleanData: function(elems) {
var data, elem, type, special = jQuery.event.special, i = 0;
for (; (elem = elems[i]) !== void 0; i++) {
if (acceptData(elem)) {
if (data = elem[dataPriv.expando]) {
if (data.events) {
for (type in data.events) {
if (special[type]) {
jQuery.event.remove(elem, type);
} else {
jQuery.removeEvent(elem, type, data.handle);
}
}
}
elem[dataPriv.expando] = void 0;
}
if (elem[dataUser.expando]) {
elem[dataUser.expando] = void 0;
}
}
}
}
});
jQuery.fn.extend({
detach: function(selector) {
return remove(this, selector, true);
},
remove: function(selector) {
return remove(this, selector);
},
text: function(value) {
return access(this, function(value2) {
return value2 === void 0 ? jQuery.text(this) : this.empty().each(function() {
if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
this.textContent = value2;
}
});
}, null, value, arguments.length);
},
append: function() {
return domManip(this, arguments, function(elem) {
if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
var target = manipulationTarget(this, elem);
target.appendChild(elem);
}
});
},
prepend: function() {
return domManip(this, arguments, function(elem) {
if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
var target = manipulationTarget(this, elem);
target.insertBefore(elem, target.firstChild);
}
});
},
before: function() {
return domManip(this, arguments, function(elem) {
if (this.parentNode) {
this.parentNode.insertBefore(elem, this);
}
});
},
after: function() {
return domManip(this, arguments, function(elem) {
if (this.parentNode) {
this.parentNode.insertBefore(elem, this.nextSibling);
}
});
},
empty: function() {
var elem, i = 0;
for (; (elem = this[i]) != null; i++) {
if (elem.nodeType === 1) {
jQuery.cleanData(getAll(elem, false));
elem.textContent = "";
}
}
return this;
},
clone: function(dataAndEvents, deepDataAndEvents) {
dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
return this.map(function() {
return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
});
},
html: function(value) {
return access(this, function(value2) {
var elem = this[0] || {}, i = 0, l = this.length;
if (value2 === void 0 && elem.nodeType === 1) {
return elem.innerHTML;
}
if (typeof value2 === "string" && !rnoInnerhtml.test(value2) && !wrapMap[(rtagName.exec(value2) || ["", ""])[1].toLowerCase()]) {
value2 = jQuery.htmlPrefilter(value2);
try {
for (; i < l; i++) {
elem = this[i] || {};
if (elem.nodeType === 1) {
jQuery.cleanData(getAll(elem, false));
elem.innerHTML = value2;
}
}
elem = 0;
} catch (e) {
}
}
if (elem) {
this.empty().append(value2);
}
}, null, value, arguments.length);
},
replaceWith: function() {
var ignored = [];
return domManip(this, arguments, function(elem) {
var parent = this.parentNode;
if (jQuery.inArray(this, ignored) < 0) {
jQuery.cleanData(getAll(this));
if (parent) {
parent.replaceChild(elem, this);
}
}
}, ignored);
}
});
jQuery.each({
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function(name, original) {
jQuery.fn[name] = function(selector) {
var elems, ret = [], insert = jQuery(selector), last = insert.length - 1, i = 0;
for (; i <= last; i++) {
elems = i === last ? this : this.clone(true);
jQuery(insert[i])[original](elems);
push.apply(ret, elems.get());
}
return this.pushStack(ret);
};
});
var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");
var getStyles = function(elem) {
var view = elem.ownerDocument.defaultView;
if (!view || !view.opener) {
view = window2;
}
return view.getComputedStyle(elem);
};
var swap = function(elem, options, callback) {
var ret, name, old = {};
for (name in options) {
old[name] = elem.style[name];
elem.style[name] = options[name];
}
ret = callback.call(elem);
for (name in options) {
elem.style[name] = old[name];
}
return ret;
};
var rboxStyle = new RegExp(cssExpand.join("|"), "i");
(function() {
function computeStyleTests() {
if (!div) {
return;
}
container.style.cssText = "position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0";
div.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%";
documentElement.appendChild(container).appendChild(div);
var divStyle = window2.getComputedStyle(div);
pixelPositionVal = divStyle.top !== "1%";
reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12;
div.style.right = "60%";
pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36;
boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36;
div.style.position = "absolute";
scrollboxSizeVal = roundPixelMeasures(div.offsetWidth / 3) === 12;
documentElement.removeChild(container);
div = null;
}
function roundPixelMeasures(measure) {
return Math.round(parseFloat(measure));
}
var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, reliableTrDimensionsVal, reliableMarginLeftVal, container = document2.createElement("div"), div = document2.createElement("div");
if (!div.style) {
return;
}
div.style.backgroundClip = "content-box";
div.cloneNode(true).style.backgroundClip = "";
support.clearCloneStyle = div.style.backgroundClip === "content-box";
jQuery.extend(support, {
boxSizingReliable: function() {
computeStyleTests();
return boxSizingReliableVal;
},
pixelBoxStyles: function() {
computeStyleTests();
return pixelBoxStylesVal;
},
pixelPosition: function() {
computeStyleTests();
return pixelPositionVal;
},
reliableMarginLeft: function() {
computeStyleTests();
return reliableMarginLeftVal;
},
scrollboxSize: function() {
computeStyleTests();
return scrollboxSizeVal;
},
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if (reliableTrDimensionsVal == null) {
table = document2.createElement("table");
tr = document2.createElement("tr");
trChild = document2.createElement("div");
table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
tr.style.cssText = "border:1px solid";
tr.style.height = "1px";
trChild.style.height = "9px";
trChild.style.display = "block";
documentElement.appendChild(table).appendChild(tr).appendChild(trChild);
trStyle = window2.getComputedStyle(tr);
reliableTrDimensionsVal = parseInt(trStyle.height, 10) + parseInt(trStyle.borderTopWidth, 10) + parseInt(trStyle.borderBottomWidth, 10) === tr.offsetHeight;
documentElement.removeChild(table);
}
return reliableTrDimensionsVal;
}
});
})();
function curCSS(elem, name, computed) {
var width, minWidth, maxWidth, ret, style = elem.style;
computed = computed || getStyles(elem);
if (computed) {
ret = computed.getPropertyValue(name) || computed[name];
if (ret === "" && !isAttached(elem)) {
ret = jQuery.style(elem, name);
}
if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) {
width = style.width;
minWidth = style.minWidth;
maxWidth = style.maxWidth;
style.minWidth = style.maxWidth = style.width = ret;
ret = computed.width;
style.width = width;
style.minWidth = minWidth;
style.maxWidth = maxWidth;
}
}
return ret !== void 0 ? ret + "" : ret;
}
function addGetHookIf(conditionFn, hookFn) {
return {
get: function() {
if (conditionFn()) {
delete this.get;
return;
}
return (this.get = hookFn).apply(this, arguments);
}
};
}
var cssPrefixes = ["Webkit", "Moz", "ms"], emptyStyle = document2.createElement("div").style, vendorProps = {};
function vendorPropName(name) {
var capName = name[0].toUpperCase() + name.slice(1), i = cssPrefixes.length;
while (i--) {
name = cssPrefixes[i] + capName;
if (name in emptyStyle) {
return name;
}
}
}
function finalPropName(name) {
var final = jQuery.cssProps[name] || vendorProps[name];
if (final) {
return final;
}
if (name in emptyStyle) {
return name;
}
return vendorProps[name] = vendorPropName(name) || name;
}
var rdisplayswap = /^(none|table(?!-c[ea]).+)/, rcustomProp = /^--/, cssShow = { position: "absolute", visibility: "hidden", display: "block" }, cssNormalTransform = {
letterSpacing: "0",
fontWeight: "400"
};
function setPositiveNumber(_elem, value, subtract) {
var matches = rcssNum.exec(value);
return matches ? Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px") : value;
}
function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) {
var i = dimension === "width" ? 1 : 0, extra = 0, delta = 0;
if (box === (isBorderBox ? "border" : "content")) {
return 0;
}
for (; i < 4; i += 2) {
if (box === "margin") {
delta += jQuery.css(elem, box + cssExpand[i], true, styles);
}
if (!isBorderBox) {
delta += jQuery.css(elem, "padding" + cssExpand[i], true, styles);
if (box !== "padding") {
delta += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
} else {
extra += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
}
} else {
if (box === "content") {
delta -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
}
if (box !== "margin") {
delta -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
}
}
}
if (!isBorderBox && computedVal >= 0) {
delta += Math.max(0, Math.ceil(
elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - computedVal - delta - extra - 0.5
)) || 0;
}
return delta;
}
function getWidthOrHeight(elem, dimension, extra) {
var styles = getStyles(elem), boxSizingNeeded = !support.boxSizingReliable() || extra, isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles) === "border-box", valueIsBorderBox = isBorderBox, val = curCSS(elem, dimension, styles), offsetProp = "offset" + dimension[0].toUpperCase() + dimension.slice(1);
if (rnumnonpx.test(val)) {
if (!extra) {
return val;
}
val = "auto";
}
if ((!support.boxSizingReliable() && isBorderBox || !support.reliableTrDimensions() && nodeName(elem, "tr") || val === "auto" || !parseFloat(val) && jQuery.css(elem, "display", false, styles) === "inline") && elem.getClientRects().length) {
isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box";
valueIsBorderBox = offsetProp in elem;
if (valueIsBorderBox) {
val = elem[offsetProp];
}
}
val = parseFloat(val) || 0;
return val + boxModelAdjustment(
elem,
dimension,
extra || (isBorderBox ? "border" : "content"),
valueIsBorderBox,
styles,
val
) + "px";
}
jQuery.extend({
cssHooks: {
opacity: {
get: function(elem, computed) {
if (computed) {
var ret = curCSS(elem, "opacity");
return ret === "" ? "1" : ret;
}
}
}
},
cssNumber: {
"animationIterationCount": true,
"columnCount": true,
"fillOpacity": true,
"flexGrow": true,
"flexShrink": true,
"fontWeight": true,
"gridArea": true,
"gridColumn": true,
"gridColumnEnd": true,
"gridColumnStart": true,
"gridRow": true,
"gridRowEnd": true,
"gridRowStart": true,
"lineHeight": true,
"opacity": true,
"order": true,
"orphans": true,
"widows": true,
"zIndex": true,
"zoom": true
},
cssProps: {},
style: function(elem, name, value, extra) {
if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
return;
}
var ret, type, hooks, origName = camelCase(name), isCustomProp = rcustomProp.test(name), style = elem.style;
if (!isCustomProp) {
name = finalPropName(origName);
}
hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
if (value !== void 0) {
type = typeof value;
if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) {
value = adjustCSS(elem, name, ret);
type = "number";
}
if (value == null || value !== value) {
return;
}
if (type === "number" && !isCustomProp) {
value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px");
}
if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {
style[name] = "inherit";
}
if (!hooks || !("set" in hooks) || (value = hooks.set(elem, value, extra)) !== void 0) {
if (isCustomProp) {
style.setProperty(name, value);
} else {
style[name] = value;
}
}
} else {
if (hooks && "get" in hooks && (ret = hooks.get(elem, false, extra)) !== void 0) {
return ret;
}
return style[name];
}
},
css: function(elem, name, extra, styles) {
var val, num, hooks, origName = camelCase(name), isCustomProp = rcustomProp.test(name);
if (!isCustomProp) {
name = finalPropName(origName);
}
hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
if (hooks && "get" in hooks) {
val = hooks.get(elem, true, extra);
}
if (val === void 0) {
val = curCSS(elem, name, styles);
}
if (val === "normal" && name in cssNormalTransform) {
val = cssNormalTransform[name];
}
if (extra === "" || extra) {
num = parseFloat(val);
return extra === true || isFinite(num) ? num || 0 : val;
}
return val;
}
});
jQuery.each(["height", "width"], function(_i, dimension) {
jQuery.cssHooks[dimension] = {
get: function(elem, computed, extra) {
if (computed) {
return rdisplayswap.test(jQuery.css(elem, "display")) && (!elem.getClientRects().length || !elem.getBoundingClientRect().width) ? swap(elem, cssShow, function() {
return getWidthOrHeight(elem, dimension, extra);
}) : getWidthOrHeight(elem, dimension, extra);
}
},
set: function(elem, value, extra) {
var matches, styles = getStyles(elem), scrollboxSizeBuggy = !support.scrollboxSize() && styles.position === "absolute", boxSizingNeeded = scrollboxSizeBuggy || extra, isBorderBox = boxSizingNeeded && jQuery.css(elem, "boxSizing", false, styles) === "border-box", subtract = extra ? boxModelAdjustment(
elem,
dimension,
extra,
isBorderBox,
styles
) : 0;
if (isBorderBox && scrollboxSizeBuggy) {
subtract -= Math.ceil(
elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] - parseFloat(styles[dimension]) - boxModelAdjustment(elem, dimension, "border", false, styles) - 0.5
);
}
if (subtract && (matches = rcssNum.exec(value)) && (matches[3] || "px") !== "px") {
elem.style[dimension] = value;
value = jQuery.css(elem, dimension);
}
return setPositiveNumber(elem, value, subtract);
}
};
});
jQuery.cssHooks.marginLeft = addGetHookIf(
support.reliableMarginLeft,
function(elem, computed) {
if (computed) {
return (parseFloat(curCSS(elem, "marginLeft")) || elem.getBoundingClientRect().left - swap(elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
})) + "px";
}
}
);
jQuery.each({
margin: "",
padding: "",
border: "Width"
}, function(prefix, suffix) {
jQuery.cssHooks[prefix + suffix] = {
expand: function(value) {
var i = 0, expanded = {}, parts = typeof value === "string" ? value.split(" ") : [value];
for (; i < 4; i++) {
expanded[prefix + cssExpand[i] + suffix] = parts[i] || parts[i - 2] || parts[0];
}
return expanded;
}
};
if (prefix !== "margin") {
jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
}
});
jQuery.fn.extend({
css: function(name, value) {
return access(this, function(elem, name2, value2) {
var styles, len, map = {}, i = 0;
if (Array.isArray(name2)) {
styles = getStyles(elem);
len = name2.length;
for (; i < len; i++) {
map[name2[i]] = jQuery.css(elem, name2[i], false, styles);
}
return map;
}
return value2 !== void 0 ? jQuery.style(elem, name2, value2) : jQuery.css(elem, name2);
}, name, value, arguments.length > 1);
}
});
function Tween(elem, options, prop, end2, easing) {
return new Tween.prototype.init(elem, options, prop, end2, easing);
}
jQuery.Tween = Tween;
Tween.prototype = {
constructor: Tween,
init: function(elem, options, prop, end2, easing, unit) {
this.elem = elem;
this.prop = prop;
this.easing = easing || jQuery.easing._default;
this.options = options;
this.start = this.now = this.cur();
this.end = end2;
this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
},
cur: function() {
var hooks = Tween.propHooks[this.prop];
return hooks && hooks.get ? hooks.get(this) : Tween.propHooks._default.get(this);
},
run: function(percent) {
var eased, hooks = Tween.propHooks[this.prop];
if (this.options.duration) {
this.pos = eased = jQuery.easing[this.easing](
percent,
this.options.duration * percent,
0,
1,
this.options.duration
);
} else {
this.pos = eased = percent;
}
this.now = (this.end - this.start) * eased + this.start;
if (this.options.step) {
this.options.step.call(this.elem, this.now, this);
}
if (hooks && hooks.set) {
hooks.set(this);
} else {
Tween.propHooks._default.set(this);
}
return this;
}
};
Tween.prototype.init.prototype = Tween.prototype;
Tween.propHooks = {
_default: {
get: function(tween) {
var result;
if (tween.elem.nodeType !== 1 || tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {
return tween.elem[tween.prop];
}
result = jQuery.css(tween.elem, tween.prop, "");
return !result || result === "auto" ? 0 : result;
},
set: function(tween) {
if (jQuery.fx.step[tween.prop]) {
jQuery.fx.step[tween.prop](tween);
} else if (tween.elem.nodeType === 1 && (jQuery.cssHooks[tween.prop] || tween.elem.style[finalPropName(tween.prop)] != null)) {
jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
} else {
tween.elem[tween.prop] = tween.now;
}
}
}
};
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
set: function(tween) {
if (tween.elem.nodeType && tween.elem.parentNode) {
tween.elem[tween.prop] = tween.now;
}
}
};
jQuery.easing = {
linear: function(p) {
return p;
},
swing: function(p) {
return 0.5 - Math.cos(p * Math.PI) / 2;
},
_default: "swing"
};
jQuery.fx = Tween.prototype.init;
jQuery.fx.step = {};
var fxNow, inProgress, rfxtypes = /^(?:toggle|show|hide)$/, rrun = /queueHooks$/;
function schedule() {
if (inProgress) {
if (document2.hidden === false && window2.requestAnimationFrame) {
window2.requestAnimationFrame(schedule);
} else {
window2.setTimeout(schedule, jQuery.fx.interval);
}
jQuery.fx.tick();
}
}
function createFxNow() {
window2.setTimeout(function() {
fxNow = void 0;
});
return fxNow = Date.now();
}
function genFx(type, includeWidth) {
var which, i = 0, attrs = { height: type };
includeWidth = includeWidth ? 1 : 0;
for (; i < 4; i += 2 - includeWidth) {
which = cssExpand[i];
attrs["margin" + which] = attrs["padding" + which] = type;
}
if (includeWidth) {
attrs.opacity = attrs.width = type;
}
return attrs;
}
function createTween(value, prop, animation) {
var tween, collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]), index = 0, length = collection.length;
for (; index < length; index++) {
if (tween = collection[index].call(animation, prop, value)) {
return tween;
}
}
}
function defaultPrefilter(elem, props, opts) {
var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, isBox = "width" in props || "height" in props, anim = this, orig = {}, style = elem.style, hidden = elem.nodeType && isHiddenWithinTree(elem), dataShow = dataPriv.get(elem, "fxshow");
if (!opts.queue) {
hooks = jQuery._queueHooks(elem, "fx");
if (hooks.unqueued == null) {
hooks.unqueued = 0;
oldfire = hooks.empty.fire;
hooks.empty.fire = function() {
if (!hooks.unqueued) {
oldfire();
}
};
}
hooks.unqueued++;
anim.always(function() {
anim.always(function() {
hooks.unqueued--;
if (!jQuery.queue(elem, "fx").length) {
hooks.empty.fire();
}
});
});
}
for (prop in props) {
value = props[prop];
if (rfxtypes.test(value)) {
delete props[prop];
toggle = toggle || value === "toggle";
if (value === (hidden ? "hide" : "show")) {
if (value === "show" && dataShow && dataShow[prop] !== void 0) {
hidden = true;
} else {
continue;
}
}
orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);
}
}
propTween = !jQuery.isEmptyObject(props);
if (!propTween && jQuery.isEmptyObject(orig)) {
return;
}
if (isBox && elem.nodeType === 1) {
opts.overflow = [style.overflow, style.overflowX, style.overflowY];
restoreDisplay = dataShow && dataShow.display;
if (restoreDisplay == null) {
restoreDisplay = dataPriv.get(elem, "display");
}
display = jQuery.css(elem, "display");
if (display === "none") {
if (restoreDisplay) {
display = restoreDisplay;
} else {
showHide([elem], true);
restoreDisplay = elem.style.display || restoreDisplay;
display = jQuery.css(elem, "display");
showHide([elem]);
}
}
if (display === "inline" || display === "inline-block" && restoreDisplay != null) {
if (jQuery.css(elem, "float") === "none") {
if (!propTween) {
anim.done(function() {
style.display = restoreDisplay;
});
if (restoreDisplay == null) {
display = style.display;
restoreDisplay = display === "none" ? "" : display;
}
}
style.display = "inline-block";
}
}
}
if (opts.overflow) {
style.overflow = "hidden";
anim.always(function() {
style.overflow = opts.overflow[0];
style.overflowX = opts.overflow[1];
style.overflowY = opts.overflow[2];
});
}
propTween = false;
for (prop in orig) {
if (!propTween) {
if (dataShow) {
if ("hidden" in dataShow) {
hidden = dataShow.hidden;
}
} else {
dataShow = dataPriv.access(elem, "fxshow", { display: restoreDisplay });
}
if (toggle) {
dataShow.hidden = !hidden;
}
if (hidden) {
showHide([elem], true);
}
anim.done(function() {
if (!hidden) {
showHide([elem]);
}
dataPriv.remove(elem, "fxshow");
for (prop in orig) {
jQuery.style(elem, prop, orig[prop]);
}
});
}
propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim);
if (!(prop in dataShow)) {
dataShow[prop] = propTween.start;
if (hidden) {
propTween.end = propTween.start;
propTween.start = 0;
}
}
}
}
function propFilter(props, specialEasing) {
var index, name, easing, value, hooks;
for (index in props) {
name = camelCase(index);
easing = specialEasing[name];
value = props[index];
if (Array.isArray(value)) {
easing = value[1];
value = props[index] = value[0];
}
if (index !== name) {
props[name] = value;
delete props[index];
}
hooks = jQuery.cssHooks[name];
if (hooks && "expand" in hooks) {
value = hooks.expand(value);
delete props[name];
for (index in value) {
if (!(index in props)) {
props[index] = value[index];
specialEasing[index] = easing;
}
}
} else {
specialEasing[name] = easing;
}
}
}
function Animation(elem, properties, options) {
var result, stopped, index = 0, length = Animation.prefilters.length, deferred = jQuery.Deferred().always(function() {
delete tick.elem;
}), tick = function() {
if (stopped) {
return false;
}
var currentTime = fxNow || createFxNow(), remaining = Math.max(0, animation.startTime + animation.duration - currentTime), temp = remaining / animation.duration || 0, percent = 1 - temp, index2 = 0, length2 = animation.tweens.length;
for (; index2 < length2; index2++) {
animation.tweens[index2].run(percent);
}
deferred.notifyWith(elem, [animation, percent, remaining]);
if (percent < 1 && length2) {
return remaining;
}
if (!length2) {
deferred.notifyWith(elem, [animation, 1, 0]);
}
deferred.resolveWith(elem, [animation]);
return false;
}, animation = deferred.promise({
elem,
props: jQuery.extend({}, properties),
opts: jQuery.extend(true, {
specialEasing: {},
easing: jQuery.easing._default
}, options),
originalProperties: properties,
originalOptions: options,
startTime: fxNow || createFxNow(),
duration: options.duration,
tweens: [],
createTween: function(prop, end2) {
var tween = jQuery.Tween(
elem,
animation.opts,
prop,
end2,
animation.opts.specialEasing[prop] || animation.opts.easing
);
animation.tweens.push(tween);
return tween;
},
stop: function(gotoEnd) {
var index2 = 0, length2 = gotoEnd ? animation.tweens.length : 0;
if (stopped) {
return this;
}
stopped = true;
for (; index2 < length2; index2++) {
animation.tweens[index2].run(1);
}
if (gotoEnd) {
deferred.notifyWith(elem, [animation, 1, 0]);
deferred.resolveWith(elem, [animation, gotoEnd]);
} else {
deferred.rejectWith(elem, [animation, gotoEnd]);
}
return this;
}
}), props = animation.props;
propFilter(props, animation.opts.specialEasing);
for (; index < length; index++) {
result = Animation.prefilters[index].call(animation, elem, props, animation.opts);
if (result) {
if (isFunction(result.stop)) {
jQuery._queueHooks(animation.elem, animation.opts.queue).stop = result.stop.bind(result);
}
return result;
}
}
jQuery.map(props, createTween, animation);
if (isFunction(animation.opts.start)) {
animation.opts.start.call(elem, animation);
}
animation.progress(animation.opts.progress).done(animation.opts.done, animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always);
jQuery.fx.timer(
jQuery.extend(tick, {
elem,
anim: animation,
queue: animation.opts.queue
})
);
return animation;
}
jQuery.Animation = jQuery.extend(Animation, {
tweeners: {
"*": [function(prop, value) {
var tween = this.createTween(prop, value);
adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
return tween;
}]
},
tweener: function(props, callback) {
if (isFunction(props)) {
callback = props;
props = ["*"];
} else {
props = props.match(rnothtmlwhite);
}
var prop, index = 0, length = props.length;
for (; index < length; index++) {
prop = props[index];
Animation.tweeners[prop] = Animation.tweeners[prop] || [];
Animation.tweeners[prop].unshift(callback);
}
},
prefilters: [defaultPrefilter],
prefilter: function(callback, prepend) {
if (prepend) {
Animation.prefilters.unshift(callback);
} else {
Animation.prefilters.push(callback);
}
}
});
jQuery.speed = function(speed, easing, fn2) {
var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
complete: fn2 || !fn2 && easing || isFunction(speed) && speed,
duration: speed,
easing: fn2 && easing || easing && !isFunction(easing) && easing
};
if (jQuery.fx.off) {
opt.duration = 0;
} else {
if (typeof opt.duration !== "number") {
if (opt.duration in jQuery.fx.speeds) {
opt.duration = jQuery.fx.speeds[opt.duration];
} else {
opt.duration = jQuery.fx.speeds._default;
}
}
}
if (opt.queue == null || opt.queue === true) {
opt.queue = "fx";
}
opt.old = opt.complete;
opt.complete = function() {
if (isFunction(opt.old)) {
opt.old.call(this);
}
if (opt.queue) {
jQuery.dequeue(this, opt.queue);
}
};
return opt;
};
jQuery.fn.extend({
fadeTo: function(speed, to, easing, callback) {
return this.filter(isHiddenWithinTree).css("opacity", 0).show().end().animate({ opacity: to }, speed, easing, callback);
},
animate: function(prop, speed, easing, callback) {
var empty = jQuery.isEmptyObject(prop), optall = jQuery.speed(speed, easing, callback), doAnimation = function() {
var anim = Animation(this, jQuery.extend({}, prop), optall);
if (empty || dataPriv.get(this, "finish")) {
anim.stop(true);
}
};
doAnimation.finish = doAnimation;
return empty || optall.queue === false ? this.each(doAnimation) : this.queue(optall.queue, doAnimation);
},
stop: function(type, clearQueue, gotoEnd) {
var stopQueue = function(hooks) {
var stop = hooks.stop;
delete hooks.stop;
stop(gotoEnd);
};
if (typeof type !== "string") {
gotoEnd = clearQueue;
clearQueue = type;
type = void 0;
}
if (clearQueue) {
this.queue(type || "fx", []);
}
return this.each(function() {
var dequeue = true, index = type != null && type + "queueHooks", timers = jQuery.timers, data = dataPriv.get(this);
if (index) {
if (data[index] && data[index].stop) {
stopQueue(data[index]);
}
} else {
for (index in data) {
if (data[index] && data[index].stop && rrun.test(index)) {
stopQueue(data[index]);
}
}
}
for (index = timers.length; index--; ) {
if (timers[index].elem === this && (type == null || timers[index].queue === type)) {
timers[index].anim.stop(gotoEnd);
dequeue = false;
timers.splice(index, 1);
}
}
if (dequeue || !gotoEnd) {
jQuery.dequeue(this, type);
}
});
},
finish: function(type) {
if (type !== false) {
type = type || "fx";
}
return this.each(function() {
var index, data = dataPriv.get(this), queue = data[type + "queue"], hooks = data[type + "queueHooks"], timers = jQuery.timers, length = queue ? queue.length : 0;
data.finish = true;
jQuery.queue(this, type, []);
if (hooks && hooks.stop) {
hooks.stop.call(this, true);
}
for (index = timers.length; index--; ) {
if (timers[index].elem === this && timers[index].queue === type) {
timers[index].anim.stop(true);
timers.splice(index, 1);
}
}
for (index = 0; index < length; index++) {
if (queue[index] && queue[index].finish) {
queue[index].finish.call(this);
}
}
delete data.finish;
});
}
});
jQuery.each(["toggle", "show", "hide"], function(_i, name) {
var cssFn = jQuery.fn[name];
jQuery.fn[name] = function(speed, easing, callback) {
return speed == null || typeof speed === "boolean" ? cssFn.apply(this, arguments) : this.animate(genFx(name, true), speed, easing, callback);
};
});
jQuery.each({
slideDown: genFx("show"),
slideUp: genFx("hide"),
slideToggle: genFx("toggle"),
fadeIn: { opacity: "show" },
fadeOut: { opacity: "hide" },
fadeToggle: { opacity: "toggle" }
}, function(name, props) {
jQuery.fn[name] = function(speed, easing, callback) {
return this.animate(props, speed, easing, callback);
};
});
jQuery.timers = [];
jQuery.fx.tick = function() {
var timer, i = 0, timers = jQuery.timers;
fxNow = Date.now();
for (; i < timers.length; i++) {
timer = timers[i];
if (!timer() && timers[i] === timer) {
timers.splice(i--, 1);
}
}
if (!timers.length) {
jQuery.fx.stop();
}
fxNow = void 0;
};
jQuery.fx.timer = function(timer) {
jQuery.timers.push(timer);
jQuery.fx.start();
};
jQuery.fx.interval = 13;
jQuery.fx.start = function() {
if (inProgress) {
return;
}
inProgress = true;
schedule();
};
jQuery.fx.stop = function() {
inProgress = null;
};
jQuery.fx.speeds = {
slow: 600,
fast: 200,
_default: 400
};
jQuery.fn.delay = function(time, type) {
time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
type = type || "fx";
return this.queue(type, function(next, hooks) {
var timeout = window2.setTimeout(next, time);
hooks.stop = function() {
window2.clearTimeout(timeout);
};
});
};
(function() {
var input = document2.createElement("input"), select = document2.createElement("select"), opt = select.appendChild(document2.createElement("option"));
input.type = "checkbox";
support.checkOn = input.value !== "";
support.optSelected = opt.selected;
input = document2.createElement("input");
input.value = "t";
input.type = "radio";
support.radioValue = input.value === "t";
})();
var boolHook, attrHandle = jQuery.expr.attrHandle;
jQuery.fn.extend({
attr: function(name, value) {
return access(this, jQuery.attr, name, value, arguments.length > 1);
},
removeAttr: function(name) {
return this.each(function() {
jQuery.removeAttr(this, name);
});
}
});
jQuery.extend({
attr: function(elem, name, value) {
var ret, hooks, nType = elem.nodeType;
if (nType === 3 || nType === 8 || nType === 2) {
return;
}
if (typeof elem.getAttribute === "undefined") {
return jQuery.prop(elem, name, value);
}
if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
hooks = jQuery.attrHooks[name.toLowerCase()] || (jQuery.expr.match.bool.test(name) ? boolHook : void 0);
}
if (value !== void 0) {
if (value === null) {
jQuery.removeAttr(elem, name);
return;
}
if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== void 0) {
return ret;
}
elem.setAttribute(name, value + "");
return value;
}
if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
return ret;
}
ret = jQuery.find.attr(elem, name);
return ret == null ? void 0 : ret;
},
attrHooks: {
type: {
set: function(elem, value) {
if (!support.radioValue && value === "radio" && nodeName(elem, "input")) {
var val = elem.value;
elem.setAttribute("type", value);
if (val) {
elem.value = val;
}
return value;
}
}
}
},
removeAttr: function(elem, value) {
var name, i = 0, attrNames = value && value.match(rnothtmlwhite);
if (attrNames && elem.nodeType === 1) {
while (name = attrNames[i++]) {
elem.removeAttribute(name);
}
}
}
});
boolHook = {
set: function(elem, value, name) {
if (value === false) {
jQuery.removeAttr(elem, name);
} else {
elem.setAttribute(name, name);
}
return name;
}
};
jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function(_i, name) {
var getter = attrHandle[name] || jQuery.find.attr;
attrHandle[name] = function(elem, name2, isXML) {
var ret, handle, lowercaseName = name2.toLowerCase();
if (!isXML) {
handle = attrHandle[lowercaseName];
attrHandle[lowercaseName] = ret;
ret = getter(elem, name2, isXML) != null ? lowercaseName : null;
attrHandle[lowercaseName] = handle;
}
return ret;
};
});
var rfocusable = /^(?:input|select|textarea|button)$/i, rclickable = /^(?:a|area)$/i;
jQuery.fn.extend({
prop: function(name, value) {
return access(this, jQuery.prop, name, value, arguments.length > 1);
},
removeProp: function(name) {
return this.each(function() {
delete this[jQuery.propFix[name] || name];
});
}
});
jQuery.extend({
prop: function(elem, name, value) {
var ret, hooks, nType = elem.nodeType;
if (nType === 3 || nType === 8 || nType === 2) {
return;
}
if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
name = jQuery.propFix[name] || name;
hooks = jQuery.propHooks[name];
}
if (value !== void 0) {
if (hooks && "set" in hooks && (ret = hooks.set(elem, value, name)) !== void 0) {
return ret;
}
return elem[name] = value;
}
if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
return ret;
}
return elem[name];
},
propHooks: {
tabIndex: {
get: function(elem) {
var tabindex = jQuery.find.attr(elem, "tabindex");
if (tabindex) {
return parseInt(tabindex, 10);
}
if (rfocusable.test(elem.nodeName) || rclickable.test(elem.nodeName) && elem.href) {
return 0;
}
return -1;
}
}
},
propFix: {
"for": "htmlFor",
"class": "className"
}
});
if (!support.optSelected) {
jQuery.propHooks.selected = {
get: function(elem) {
var parent = elem.parentNode;
if (parent && parent.parentNode) {
parent.parentNode.selectedIndex;
}
return null;
},
set: function(elem) {
var parent = elem.parentNode;
if (parent) {
parent.selectedIndex;
if (parent.parentNode) {
parent.parentNode.selectedIndex;
}
}
}
};
}
jQuery.each([
"tabIndex",
"readOnly",
"maxLength",
"cellSpacing",
"cellPadding",
"rowSpan",
"colSpan",
"useMap",
"frameBorder",
"contentEditable"
], function() {
jQuery.propFix[this.toLowerCase()] = this;
});
function stripAndCollapse(value) {
var tokens = value.match(rnothtmlwhite) || [];
return tokens.join(" ");
}
function getClass(elem) {
return elem.getAttribute && elem.getAttribute("class") || "";
}
function classesToArray(value) {
if (Array.isArray(value)) {
return value;
}
if (typeof value === "string") {
return value.match(rnothtmlwhite) || [];
}
return [];
}
jQuery.fn.extend({
addClass: function(value) {
var classes, elem, cur, curValue, clazz, j, finalValue, i = 0;
if (isFunction(value)) {
return this.each(function(j2) {
jQuery(this).addClass(value.call(this, j2, getClass(this)));
});
}
classes = classesToArray(value);
if (classes.length) {
while (elem = this[i++]) {
curValue = getClass(elem);
cur = elem.nodeType === 1 && " " + stripAndCollapse(curValue) + " ";
if (cur) {
j = 0;
while (clazz = classes[j++]) {
if (cur.indexOf(" " + clazz + " ") < 0) {
cur += clazz + " ";
}
}
finalValue = stripAndCollapse(cur);
if (curValue !== finalValue) {
elem.setAttribute("class", finalValue);
}
}
}
}
return this;
},
removeClass: function(value) {
var classes, elem, cur, curValue, clazz, j, finalValue, i = 0;
if (isFunction(value)) {
return this.each(function(j2) {
jQuery(this).removeClass(value.call(this, j2, getClass(this)));
});
}
if (!arguments.length) {
return this.attr("class", "");
}
classes = classesToArray(value);
if (classes.length) {
while (elem = this[i++]) {
curValue = getClass(elem);
cur = elem.nodeType === 1 && " " + stripAndCollapse(curValue) + " ";
if (cur) {
j = 0;
while (clazz = classes[j++]) {
while (cur.indexOf(" " + clazz + " ") > -1) {
cur = cur.replace(" " + clazz + " ", " ");
}
}
finalValue = stripAndCollapse(cur);
if (curValue !== finalValue) {
elem.setAttribute("class", finalValue);
}
}
}
}
return this;
},
toggleClass: function(value, stateVal) {
var type = typeof value, isValidValue = type === "string" || Array.isArray(value);
if (typeof stateVal === "boolean" && isValidValue) {
return stateVal ? this.addClass(value) : this.removeClass(value);
}
if (isFunction(value)) {
return this.each(function(i) {
jQuery(this).toggleClass(
value.call(this, i, getClass(this), stateVal),
stateVal
);
});
}
return this.each(function() {
var className, i, self2, classNames;
if (isValidValue) {
i = 0;
self2 = jQuery(this);
classNames = classesToArray(value);
while (className = classNames[i++]) {
if (self2.hasClass(className)) {
self2.removeClass(className);
} else {
self2.addClass(className);
}
}
} else if (value === void 0 || type === "boolean") {
className = getClass(this);
if (className) {
dataPriv.set(this, "__className__", className);
}
if (this.setAttribute) {
this.setAttribute(
"class",
className || value === false ? "" : dataPriv.get(this, "__className__") || ""
);
}
}
});
},
hasClass: function(selector) {
var className, elem, i = 0;
className = " " + selector + " ";
while (elem = this[i++]) {
if (elem.nodeType === 1 && (" " + stripAndCollapse(getClass(elem)) + " ").indexOf(className) > -1) {
return true;
}
}
return false;
}
});
var rreturn = /\r/g;
jQuery.fn.extend({
val: function(value) {
var hooks, ret, valueIsFunction, elem = this[0];
if (!arguments.length) {
if (elem) {
hooks = jQuery.valHooks[elem.type] || jQuery.valHooks[elem.nodeName.toLowerCase()];
if (hooks && "get" in hooks && (ret = hooks.get(elem, "value")) !== void 0) {
return ret;
}
ret = elem.value;
if (typeof ret === "string") {
return ret.replace(rreturn, "");
}
return ret == null ? "" : ret;
}
return;
}
valueIsFunction = isFunction(value);
return this.each(function(i) {
var val;
if (this.nodeType !== 1) {
return;
}
if (valueIsFunction) {
val = value.call(this, i, jQuery(this).val());
} else {
val = value;
}
if (val == null) {
val = "";
} else if (typeof val === "number") {
val += "";
} else if (Array.isArray(val)) {
val = jQuery.map(val, function(value2) {
return value2 == null ? "" : value2 + "";
});
}
hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];
if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === void 0) {
this.value = val;
}
});
}
});
jQuery.extend({
valHooks: {
option: {
get: function(elem) {
var val = jQuery.find.attr(elem, "value");
return val != null ? val : stripAndCollapse(jQuery.text(elem));
}
},
select: {
get: function(elem) {
var value, option, i, options = elem.options, index = elem.selectedIndex, one = elem.type === "select-one", values = one ? null : [], max2 = one ? index + 1 : options.length;
if (index < 0) {
i = max2;
} else {
i = one ? index : 0;
}
for (; i < max2; i++) {
option = options[i];
if ((option.selected || i === index) && !option.disabled && (!option.parentNode.disabled || !nodeName(option.parentNode, "optgroup"))) {
value = jQuery(option).val();
if (one) {
return value;
}
values.push(value);
}
}
return values;
},
set: function(elem, value) {
var optionSet, option, options = elem.options, values = jQuery.makeArray(value), i = options.length;
while (i--) {
option = options[i];
if (option.selected = jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1) {
optionSet = true;
}
}
if (!optionSet) {
elem.selectedIndex = -1;
}
return values;
}
}
}
});
jQuery.each(["radio", "checkbox"], function() {
jQuery.valHooks[this] = {
set: function(elem, value) {
if (Array.isArray(value)) {
return elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1;
}
}
};
if (!support.checkOn) {
jQuery.valHooks[this].get = function(elem) {
return elem.getAttribute("value") === null ? "on" : elem.value;
};
}
});
support.focusin = "onfocusin" in window2;
var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, stopPropagationCallback = function(e) {
e.stopPropagation();
};
jQuery.extend(jQuery.event, {
trigger: function(event, data, elem, onlyHandlers) {
var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, eventPath = [elem || document2], type = hasOwn.call(event, "type") ? event.type : event, namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];
cur = lastElement = tmp = elem = elem || document2;
if (elem.nodeType === 3 || elem.nodeType === 8) {
return;
}
if (rfocusMorph.test(type + jQuery.event.triggered)) {
return;
}
if (type.indexOf(".") > -1) {
namespaces = type.split(".");
type = namespaces.shift();
namespaces.sort();
}
ontype = type.indexOf(":") < 0 && "on" + type;
event = event[jQuery.expando] ? event : new jQuery.Event(type, typeof event === "object" && event);
event.isTrigger = onlyHandlers ? 2 : 3;
event.namespace = namespaces.join(".");
event.rnamespace = event.namespace ? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
event.result = void 0;
if (!event.target) {
event.target = elem;
}
data = data == null ? [event] : jQuery.makeArray(data, [event]);
special = jQuery.event.special[type] || {};
if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {
return;
}
if (!onlyHandlers && !special.noBubble && !isWindow(elem)) {
bubbleType = special.delegateType || type;
if (!rfocusMorph.test(bubbleType + type)) {
cur = cur.parentNode;
}
for (; cur; cur = cur.parentNode) {
eventPath.push(cur);
tmp = cur;
}
if (tmp === (elem.ownerDocument || document2)) {
eventPath.push(tmp.defaultView || tmp.parentWindow || window2);
}
}
i = 0;
while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {
lastElement = cur;
event.type = i > 1 ? bubbleType : special.bindType || type;
handle = (dataPriv.get(cur, "events") || /* @__PURE__ */ Object.create(null))[event.type] && dataPriv.get(cur, "handle");
if (handle) {
handle.apply(cur, data);
}
handle = ontype && cur[ontype];
if (handle && handle.apply && acceptData(cur)) {
event.result = handle.apply(cur, data);
if (event.result === false) {
event.preventDefault();
}
}
}
event.type = type;
if (!onlyHandlers && !event.isDefaultPrevented()) {
if ((!special._default || special._default.apply(eventPath.pop(), data) === false) && acceptData(elem)) {
if (ontype && isFunction(elem[type]) && !isWindow(elem)) {
tmp = elem[ontype];
if (tmp) {
elem[ontype] = null;
}
jQuery.event.triggered = type;
if (event.isPropagationStopped()) {
lastElement.addEventListener(type, stopPropagationCallback);
}
elem[type]();
if (event.isPropagationStopped()) {
lastElement.removeEventListener(type, stopPropagationCallback);
}
jQuery.event.triggered = void 0;
if (tmp) {
elem[ontype] = tmp;
}
}
}
}
return event.result;
},
simulate: function(type, elem, event) {
var e = jQuery.extend(
new jQuery.Event(),
event,
{
type,
isSimulated: true
}
);
jQuery.event.trigger(e, null, elem);
}
});
jQuery.fn.extend({
trigger: function(type, data) {
return this.each(function() {
jQuery.event.trigger(type, data, this);
});
},
triggerHandler: function(type, data) {
var elem = this[0];
if (elem) {
return jQuery.event.trigger(type, data, elem, true);
}
}
});
if (!support.focusin) {
jQuery.each({ focus: "focusin", blur: "focusout" }, function(orig, fix) {
var handler = function(event) {
jQuery.event.simulate(fix, event.target, jQuery.event.fix(event));
};
jQuery.event.special[fix] = {
setup: function() {
var doc2 = this.ownerDocument || this.document || this, attaches = dataPriv.access(doc2, fix);
if (!attaches) {
doc2.addEventListener(orig, handler, true);
}
dataPriv.access(doc2, fix, (attaches || 0) + 1);
},
teardown: function() {
var doc2 = this.ownerDocument || this.document || this, attaches = dataPriv.access(doc2, fix) - 1;
if (!attaches) {
doc2.removeEventListener(orig, handler, true);
dataPriv.remove(doc2, fix);
} else {
dataPriv.access(doc2, fix, attaches);
}
}
};
});
}
var location2 = window2.location;
var nonce = { guid: Date.now() };
var rquery = /\?/;
jQuery.parseXML = function(data) {
var xml, parserErrorElem;
if (!data || typeof data !== "string") {
return null;
}
try {
xml = new window2.DOMParser().parseFromString(data, "text/xml");
} catch (e) {
}
parserErrorElem = xml && xml.getElementsByTagName("parsererror")[0];
if (!xml || parserErrorElem) {
jQuery.error("Invalid XML: " + (parserErrorElem ? jQuery.map(parserErrorElem.childNodes, function(el) {
return el.textContent;
}).join("\n") : data));
}
return xml;
};
var rbracket = /\[\]$/, rCRLF = /\r?\n/g, rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, rsubmittable = /^(?:input|select|textarea|keygen)/i;
function buildParams(prefix, obj, traditional, add) {
var name;
if (Array.isArray(obj)) {
jQuery.each(obj, function(i, v) {
if (traditional || rbracket.test(prefix)) {
add(prefix, v);
} else {
buildParams(
prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]",
v,
traditional,
add
);
}
});
} else if (!traditional && toType2(obj) === "object") {
for (name in obj) {
buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
}
} else {
add(prefix, obj);
}
}
jQuery.param = function(a, traditional) {
var prefix, s = [], add = function(key, valueOrFunction) {
var value = isFunction(valueOrFunction) ? valueOrFunction() : valueOrFunction;
s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value == null ? "" : value);
};
if (a == null) {
return "";
}
if (Array.isArray(a) || a.jquery && !jQuery.isPlainObject(a)) {
jQuery.each(a, function() {
add(this.name, this.value);
});
} else {
for (prefix in a) {
buildParams(prefix, a[prefix], traditional, add);
}
}
return s.join("&");
};
jQuery.fn.extend({
serialize: function() {
return jQuery.param(this.serializeArray());
},
serializeArray: function() {
return this.map(function() {
var elements = jQuery.prop(this, "elements");
return elements ? jQuery.makeArray(elements) : this;
}).filter(function() {
var type = this.type;
return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !rcheckableType.test(type));
}).map(function(_i, elem) {
var val = jQuery(this).val();
if (val == null) {
return null;
}
if (Array.isArray(val)) {
return jQuery.map(val, function(val2) {
return { name: elem.name, value: val2.replace(rCRLF, "\r\n") };
});
}
return { name: elem.name, value: val.replace(rCRLF, "\r\n") };
}).get();
}
});
var r20 = /%20/g, rhash = /#.*$/, rantiCache = /([?&])_=[^&]*/, rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, rnoContent = /^(?:GET|HEAD)$/, rprotocol = /^\/\//, prefilters = {}, transports = {}, allTypes = "*/".concat("*"), originAnchor = document2.createElement("a");
originAnchor.href = location2.href;
function addToPrefiltersOrTransports(structure) {
return function(dataTypeExpression, func) {
if (typeof dataTypeExpression !== "string") {
func = dataTypeExpression;
dataTypeExpression = "*";
}
var dataType, i = 0, dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || [];
if (isFunction(func)) {
while (dataType = dataTypes[i++]) {
if (dataType[0] === "+") {
dataType = dataType.slice(1) || "*";
(structure[dataType] = structure[dataType] || []).unshift(func);
} else {
(structure[dataType] = structure[dataType] || []).push(func);
}
}
}
};
}
function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {
var inspected = {}, seekingTransport = structure === transports;
function inspect(dataType) {
var selected;
inspected[dataType] = true;
jQuery.each(structure[dataType] || [], function(_, prefilterOrFactory) {
var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
if (typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[dataTypeOrTransport]) {
options.dataTypes.unshift(dataTypeOrTransport);
inspect(dataTypeOrTransport);
return false;
} else if (seekingTransport) {
return !(selected = dataTypeOrTransport);
}
});
return selected;
}
return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
}
function ajaxExtend(target, src) {
var key, deep, flatOptions = jQuery.ajaxSettings.flatOptions || {};
for (key in src) {
if (src[key] !== void 0) {
(flatOptions[key] ? target : deep || (deep = {}))[key] = src[key];
}
}
if (deep) {
jQuery.extend(true, target, deep);
}
return target;
}
function ajaxHandleResponses(s, jqXHR, responses) {
var ct, type, finalDataType, firstDataType, contents = s.contents, dataTypes = s.dataTypes;
while (dataTypes[0] === "*") {
dataTypes.shift();
if (ct === void 0) {
ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
}
}
if (ct) {
for (type in contents) {
if (contents[type] && contents[type].test(ct)) {
dataTypes.unshift(type);
break;
}
}
}
if (dataTypes[0] in responses) {
finalDataType = dataTypes[0];
} else {
for (type in responses) {
if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
finalDataType = type;
break;
}
if (!firstDataType) {
firstDataType = type;
}
}
finalDataType = finalDataType || firstDataType;
}
if (finalDataType) {
if (finalDataType !== dataTypes[0]) {
dataTypes.unshift(finalDataType);
}
return responses[finalDataType];
}
}
function ajaxConvert(s, response, jqXHR, isSuccess) {
var conv2, current, conv, tmp, prev, converters = {}, dataTypes = s.dataTypes.slice();
if (dataTypes[1]) {
for (conv in s.converters) {
converters[conv.toLowerCase()] = s.converters[conv];
}
}
current = dataTypes.shift();
while (current) {
if (s.responseFields[current]) {
jqXHR[s.responseFields[current]] = response;
}
if (!prev && isSuccess && s.dataFilter) {
response = s.dataFilter(response, s.dataType);
}
prev = current;
current = dataTypes.shift();
if (current) {
if (current === "*") {
current = prev;
} else if (prev !== "*" && prev !== current) {
conv = converters[prev + " " + current] || converters["* " + current];
if (!conv) {
for (conv2 in converters) {
tmp = conv2.split(" ");
if (tmp[1] === current) {
conv = converters[prev + " " + tmp[0]] || converters["* " + tmp[0]];
if (conv) {
if (conv === true) {
conv = converters[conv2];
} else if (converters[conv2] !== true) {
current = tmp[0];
dataTypes.unshift(tmp[1]);
}
break;
}
}
}
}
if (conv !== true) {
if (conv && s.throws) {
response = conv(response);
} else {
try {
response = conv(response);
} catch (e) {
return {
state: "parsererror",
error: conv ? e : "No conversion from " + prev + " to " + current
};
}
}
}
}
}
}
return { state: "success", data: response };
}
jQuery.extend({
active: 0,
lastModified: {},
etag: {},
ajaxSettings: {
url: location2.href,
type: "GET",
isLocal: rlocalProtocol.test(location2.protocol),
global: true,
processData: true,
async: true,
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
accepts: {
"*": allTypes,
text: "text/plain",
html: "text/html",
xml: "application/xml, text/xml",
json: "application/json, text/javascript"
},
contents: {
xml: /\bxml\b/,
html: /\bhtml/,
json: /\bjson\b/
},
responseFields: {
xml: "responseXML",
text: "responseText",
json: "responseJSON"
},
converters: {
"* text": String,
"text html": true,
"text json": JSON.parse,
"text xml": jQuery.parseXML
},
flatOptions: {
url: true,
context: true
}
},
ajaxSetup: function(target, settings) {
return settings ? ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) : ajaxExtend(jQuery.ajaxSettings, target);
},
ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
ajaxTransport: addToPrefiltersOrTransports(transports),
ajax: function(url, options) {
if (typeof url === "object") {
options = url;
url = void 0;
}
options = options || {};
var transport, cacheURL, responseHeadersString, responseHeaders, timeoutTimer, urlAnchor, completed2, fireGlobals, i, uncached, s = jQuery.ajaxSetup({}, options), callbackContext = s.context || s, globalEventContext = s.context && (callbackContext.nodeType || callbackContext.jquery) ? jQuery(callbackContext) : jQuery.event, deferred = jQuery.Deferred(), completeDeferred = jQuery.Callbacks("once memory"), statusCode = s.statusCode || {}, requestHeaders = {}, requestHeadersNames = {}, strAbort = "canceled", jqXHR = {
readyState: 0,
getResponseHeader: function(key) {
var match;
if (completed2) {
if (!responseHeaders) {
responseHeaders = {};
while (match = rheaders.exec(responseHeadersString)) {
responseHeaders[match[1].toLowerCase() + " "] = (responseHeaders[match[1].toLowerCase() + " "] || []).concat(match[2]);
}
}
match = responseHeaders[key.toLowerCase() + " "];
}
return match == null ? null : match.join(", ");
},
getAllResponseHeaders: function() {
return completed2 ? responseHeadersString : null;
},
setRequestHeader: function(name, value) {
if (completed2 == null) {
name = requestHeadersNames[name.toLowerCase()] = requestHeadersNames[name.toLowerCase()] || name;
requestHeaders[name] = value;
}
return this;
},
overrideMimeType: function(type) {
if (completed2 == null) {
s.mimeType = type;
}
return this;
},
statusCode: function(map) {
var code;
if (map) {
if (completed2) {
jqXHR.always(map[jqXHR.status]);
} else {
for (code in map) {
statusCode[code] = [statusCode[code], map[code]];
}
}
}
return this;
},
abort: function(statusText) {
var finalText = statusText || strAbort;
if (transport) {
transport.abort(finalText);
}
done(0, finalText);
return this;
}
};
deferred.promise(jqXHR);
s.url = ((url || s.url || location2.href) + "").replace(rprotocol, location2.protocol + "//");
s.type = options.method || options.type || s.method || s.type;
s.dataTypes = (s.dataType || "*").toLowerCase().match(rnothtmlwhite) || [""];
if (s.crossDomain == null) {
urlAnchor = document2.createElement("a");
try {
urlAnchor.href = s.url;
urlAnchor.href = urlAnchor.href;
s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== urlAnchor.protocol + "//" + urlAnchor.host;
} catch (e) {
s.crossDomain = true;
}
}
if (s.data && s.processData && typeof s.data !== "string") {
s.data = jQuery.param(s.data, s.traditional);
}
inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);
if (completed2) {
return jqXHR;
}
fireGlobals = jQuery.event && s.global;
if (fireGlobals && jQuery.active++ === 0) {
jQuery.event.trigger("ajaxStart");
}
s.type = s.type.toUpperCase();
s.hasContent = !rnoContent.test(s.type);
cacheURL = s.url.replace(rhash, "");
if (!s.hasContent) {
uncached = s.url.slice(cacheURL.length);
if (s.data && (s.processData || typeof s.data === "string")) {
cacheURL += (rquery.test(cacheURL) ? "&" : "?") + s.data;
delete s.data;
}
if (s.cache === false) {
cacheURL = cacheURL.replace(rantiCache, "$1");
uncached = (rquery.test(cacheURL) ? "&" : "?") + "_=" + nonce.guid++ + uncached;
}
s.url = cacheURL + uncached;
} else if (s.data && s.processData && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0) {
s.data = s.data.replace(r20, "+");
}
if (s.ifModified) {
if (jQuery.lastModified[cacheURL]) {
jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
}
if (jQuery.etag[cacheURL]) {
jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
}
}
if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
jqXHR.setRequestHeader("Content-Type", s.contentType);
}
jqXHR.setRequestHeader(
"Accept",
s.dataTypes[0] && s.accepts[s.dataTypes[0]] ? s.accepts[s.dataTypes[0]] + (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") : s.accepts["*"]
);
for (i in s.headers) {
jqXHR.setRequestHeader(i, s.headers[i]);
}
if (s.beforeSend && (s.beforeSend.call(callbackContext, jqXHR, s) === false || completed2)) {
return jqXHR.abort();
}
strAbort = "abort";
completeDeferred.add(s.complete);
jqXHR.done(s.success);
jqXHR.fail(s.error);
transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);
if (!transport) {
done(-1, "No Transport");
} else {
jqXHR.readyState = 1;
if (fireGlobals) {
globalEventContext.trigger("ajaxSend", [jqXHR, s]);
}
if (completed2) {
return jqXHR;
}
if (s.async && s.timeout > 0) {
timeoutTimer = window2.setTimeout(function() {
jqXHR.abort("timeout");
}, s.timeout);
}
try {
completed2 = false;
transport.send(requestHeaders, done);
} catch (e) {
if (completed2) {
throw e;
}
done(-1, e);
}
}
function done(status, nativeStatusText, responses, headers) {
var isSuccess, success, error, response, modified, statusText = nativeStatusText;
if (completed2) {
return;
}
completed2 = true;
if (timeoutTimer) {
window2.clearTimeout(timeoutTimer);
}
transport = void 0;
responseHeadersString = headers || "";
jqXHR.readyState = status > 0 ? 4 : 0;
isSuccess = status >= 200 && status < 300 || status === 304;
if (responses) {
response = ajaxHandleResponses(s, jqXHR, responses);
}
if (!isSuccess && jQuery.inArray("script", s.dataTypes) > -1 && jQuery.inArray("json", s.dataTypes) < 0) {
s.converters["text script"] = function() {
};
}
response = ajaxConvert(s, response, jqXHR, isSuccess);
if (isSuccess) {
if (s.ifModified) {
modified = jqXHR.getResponseHeader("Last-Modified");
if (modified) {
jQuery.lastModified[cacheURL] = modified;
}
modified = jqXHR.getResponseHeader("etag");
if (modified) {
jQuery.etag[cacheURL] = modified;
}
}
if (status === 204 || s.type === "HEAD") {
statusText = "nocontent";
} else if (status === 304) {
statusText = "notmodified";
} else {
statusText = response.state;
success = response.data;
error = response.error;
isSuccess = !error;
}
} else {
error = statusText;
if (status || !statusText) {
statusText = "error";
if (status < 0) {
status = 0;
}
}
}
jqXHR.status = status;
jqXHR.statusText = (nativeStatusText || statusText) + "";
if (isSuccess) {
deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
} else {
deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
}
jqXHR.statusCode(statusCode);
statusCode = void 0;
if (fireGlobals) {
globalEventContext.trigger(
isSuccess ? "ajaxSuccess" : "ajaxError",
[jqXHR, s, isSuccess ? success : error]
);
}
completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);
if (fireGlobals) {
globalEventContext.trigger("ajaxComplete", [jqXHR, s]);
if (!--jQuery.active) {
jQuery.event.trigger("ajaxStop");
}
}
}
return jqXHR;
},
getJSON: function(url, data, callback) {
return jQuery.get(url, data, callback, "json");
},
getScript: function(url, callback) {
return jQuery.get(url, void 0, callback, "script");
}
});
jQuery.each(["get", "post"], function(_i, method) {
jQuery[method] = function(url, data, callback, type) {
if (isFunction(data)) {
type = type || callback;
callback = data;
data = void 0;
}
return jQuery.ajax(jQuery.extend({
url,
type: method,
dataType: type,
data,
success: callback
}, jQuery.isPlainObject(url) && url));
};
});
jQuery.ajaxPrefilter(function(s) {
var i;
for (i in s.headers) {
if (i.toLowerCase() === "content-type") {
s.contentType = s.headers[i] || "";
}
}
});
jQuery._evalUrl = function(url, options, doc2) {
return jQuery.ajax({
url,
type: "GET",
dataType: "script",
cache: true,
async: false,
global: false,
converters: {
"text script": function() {
}
},
dataFilter: function(response) {
jQuery.globalEval(response, options, doc2);
}
});
};
jQuery.fn.extend({
wrapAll: function(html) {
var wrap;
if (this[0]) {
if (isFunction(html)) {
html = html.call(this[0]);
}
wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);
if (this[0].parentNode) {
wrap.insertBefore(this[0]);
}
wrap.map(function() {
var elem = this;
while (elem.firstElementChild) {
elem = elem.firstElementChild;
}
return elem;
}).append(this);
}
return this;
},
wrapInner: function(html) {
if (isFunction(html)) {
return this.each(function(i) {
jQuery(this).wrapInner(html.call(this, i));
});
}
return this.each(function() {
var self2 = jQuery(this), contents = self2.contents();
if (contents.length) {
contents.wrapAll(html);
} else {
self2.append(html);
}
});
},
wrap: function(html) {
var htmlIsFunction = isFunction(html);
return this.each(function(i) {
jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i) : html);
});
},
unwrap: function(selector) {
this.parent(selector).not("body").each(function() {
jQuery(this).replaceWith(this.childNodes);
});
return this;
}
});
jQuery.expr.pseudos.hidden = function(elem) {
return !jQuery.expr.pseudos.visible(elem);
};
jQuery.expr.pseudos.visible = function(elem) {
return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
};
jQuery.ajaxSettings.xhr = function() {
try {
return new window2.XMLHttpRequest();
} catch (e) {
}
};
var xhrSuccessStatus = {
0: 200,
1223: 204
}, xhrSupported = jQuery.ajaxSettings.xhr();
support.cors = !!xhrSupported && "withCredentials" in xhrSupported;
support.ajax = xhrSupported = !!xhrSupported;
jQuery.ajaxTransport(function(options) {
var callback, errorCallback;
if (support.cors || xhrSupported && !options.crossDomain) {
return {
send: function(headers, complete) {
var i, xhr = options.xhr();
xhr.open(
options.type,
options.url,
options.async,
options.username,
options.password
);
if (options.xhrFields) {
for (i in options.xhrFields) {
xhr[i] = options.xhrFields[i];
}
}
if (options.mimeType && xhr.overrideMimeType) {
xhr.overrideMimeType(options.mimeType);
}
if (!options.crossDomain && !headers["X-Requested-With"]) {
headers["X-Requested-With"] = "XMLHttpRequest";
}
for (i in headers) {
xhr.setRequestHeader(i, headers[i]);
}
callback = function(type) {
return function() {
if (callback) {
callback = errorCallback = xhr.onload = xhr.onerror = xhr.onabort = xhr.ontimeout = xhr.onreadystatechange = null;
if (type === "abort") {
xhr.abort();
} else if (type === "error") {
if (typeof xhr.status !== "number") {
complete(0, "error");
} else {
complete(
xhr.status,
xhr.statusText
);
}
} else {
complete(
xhrSuccessStatus[xhr.status] || xhr.status,
xhr.statusText,
(xhr.responseType || "text") !== "text" || typeof xhr.responseText !== "string" ? { binary: xhr.response } : { text: xhr.responseText },
xhr.getAllResponseHeaders()
);
}
}
};
};
xhr.onload = callback();
errorCallback = xhr.onerror = xhr.ontimeout = callback("error");
if (xhr.onabort !== void 0) {
xhr.onabort = errorCallback;
} else {
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
window2.setTimeout(function() {
if (callback) {
errorCallback();
}
});
}
};
}
callback = callback("abort");
try {
xhr.send(options.hasContent && options.data || null);
} catch (e) {
if (callback) {
throw e;
}
}
},
abort: function() {
if (callback) {
callback();
}
}
};
}
});
jQuery.ajaxPrefilter(function(s) {
if (s.crossDomain) {
s.contents.script = false;
}
});
jQuery.ajaxSetup({
accepts: {
script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
},
contents: {
script: /\b(?:java|ecma)script\b/
},
converters: {
"text script": function(text) {
jQuery.globalEval(text);
return text;
}
}
});
jQuery.ajaxPrefilter("script", function(s) {
if (s.cache === void 0) {
s.cache = false;
}
if (s.crossDomain) {
s.type = "GET";
}
});
jQuery.ajaxTransport("script", function(s) {
if (s.crossDomain || s.scriptAttrs) {
var script, callback;
return {
send: function(_, complete) {
script = jQuery("<script>").attr(s.scriptAttrs || {}).prop({ charset: s.scriptCharset, src: s.url }).on("load error", callback = function(evt) {
script.remove();
callback = null;
if (evt) {
complete(evt.type === "error" ? 404 : 200, evt.type);
}
});
document2.head.appendChild(script[0]);
},
abort: function() {
if (callback) {
callback();
}
}
};
}
});
var oldCallbacks = [], rjsonp = /(=)\?(?=&|$)|\?\?/;
jQuery.ajaxSetup({
jsonp: "callback",
jsonpCallback: function() {
var callback = oldCallbacks.pop() || jQuery.expando + "_" + nonce.guid++;
this[callback] = true;
return callback;
}
});
jQuery.ajaxPrefilter("json jsonp", function(s, originalSettings, jqXHR) {
var callbackName, overwritten, responseContainer, jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ? "url" : typeof s.data === "string" && (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0 && rjsonp.test(s.data) && "data");
if (jsonProp || s.dataTypes[0] === "jsonp") {
callbackName = s.jsonpCallback = isFunction(s.jsonpCallback) ? s.jsonpCallback() : s.jsonpCallback;
if (jsonProp) {
s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);
} else if (s.jsonp !== false) {
s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
}
s.converters["script json"] = function() {
if (!responseContainer) {
jQuery.error(callbackName + " was not called");
}
return responseContainer[0];
};
s.dataTypes[0] = "json";
overwritten = window2[callbackName];
window2[callbackName] = function() {
responseContainer = arguments;
};
jqXHR.always(function() {
if (overwritten === void 0) {
jQuery(window2).removeProp(callbackName);
} else {
window2[callbackName] = overwritten;
}
if (s[callbackName]) {
s.jsonpCallback = originalSettings.jsonpCallback;
oldCallbacks.push(callbackName);
}
if (responseContainer && isFunction(overwritten)) {
overwritten(responseContainer[0]);
}
responseContainer = overwritten = void 0;
});
return "script";
}
});
support.createHTMLDocument = function() {
var body = document2.implementation.createHTMLDocument("").body;
body.innerHTML = "<form></form><form></form>";
return body.childNodes.length === 2;
}();
jQuery.parseHTML = function(data, context, keepScripts) {
if (typeof data !== "string") {
return [];
}
if (typeof context === "boolean") {
keepScripts = context;
context = false;
}
var base, parsed, scripts;
if (!context) {
if (support.createHTMLDocument) {
context = document2.implementation.createHTMLDocument("");
base = context.createElement("base");
base.href = document2.location.href;
context.head.appendChild(base);
} else {
context = document2;
}
}
parsed = rsingleTag.exec(data);
scripts = !keepScripts && [];
if (parsed) {
return [context.createElement(parsed[1])];
}
parsed = buildFragment([data], context, scripts);
if (scripts && scripts.length) {
jQuery(scripts).remove();
}
return jQuery.merge([], parsed.childNodes);
};
jQuery.fn.load = function(url, params, callback) {
var selector, type, response, self2 = this, off = url.indexOf(" ");
if (off > -1) {
selector = stripAndCollapse(url.slice(off));
url = url.slice(0, off);
}
if (isFunction(params)) {
callback = params;
params = void 0;
} else if (params && typeof params === "object") {
type = "POST";
}
if (self2.length > 0) {
jQuery.ajax({
url,
type: type || "GET",
dataType: "html",
data: params
}).done(function(responseText) {
response = arguments;
self2.html(selector ? jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) : responseText);
}).always(callback && function(jqXHR, status) {
self2.each(function() {
callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
});
});
}
return this;
};
jQuery.expr.pseudos.animated = function(elem) {
return jQuery.grep(jQuery.timers, function(fn2) {
return elem === fn2.elem;
}).length;
};
jQuery.offset = {
setOffset: function(elem, options, i) {
var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, position = jQuery.css(elem, "position"), curElem = jQuery(elem), props = {};
if (position === "static") {
elem.style.position = "relative";
}
curOffset = curElem.offset();
curCSSTop = jQuery.css(elem, "top");
curCSSLeft = jQuery.css(elem, "left");
calculatePosition = (position === "absolute" || position === "fixed") && (curCSSTop + curCSSLeft).indexOf("auto") > -1;
if (calculatePosition) {
curPosition = curElem.position();
curTop = curPosition.top;
curLeft = curPosition.left;
} else {
curTop = parseFloat(curCSSTop) || 0;
curLeft = parseFloat(curCSSLeft) || 0;
}
if (isFunction(options)) {
options = options.call(elem, i, jQuery.extend({}, curOffset));
}
if (options.top != null) {
props.top = options.top - curOffset.top + curTop;
}
if (options.left != null) {
props.left = options.left - curOffset.left + curLeft;
}
if ("using" in options) {
options.using.call(elem, props);
} else {
curElem.css(props);
}
}
};
jQuery.fn.extend({
offset: function(options) {
if (arguments.length) {
return options === void 0 ? this : this.each(function(i) {
jQuery.offset.setOffset(this, options, i);
});
}
var rect, win, elem = this[0];
if (!elem) {
return;
}
if (!elem.getClientRects().length) {
return { top: 0, left: 0 };
}
rect = elem.getBoundingClientRect();
win = elem.ownerDocument.defaultView;
return {
top: rect.top + win.pageYOffset,
left: rect.left + win.pageXOffset
};
},
position: function() {
if (!this[0]) {
return;
}
var offsetParent, offset2, doc2, elem = this[0], parentOffset = { top: 0, left: 0 };
if (jQuery.css(elem, "position") === "fixed") {
offset2 = elem.getBoundingClientRect();
} else {
offset2 = this.offset();
doc2 = elem.ownerDocument;
offsetParent = elem.offsetParent || doc2.documentElement;
while (offsetParent && (offsetParent === doc2.body || offsetParent === doc2.documentElement) && jQuery.css(offsetParent, "position") === "static") {
offsetParent = offsetParent.parentNode;
}
if (offsetParent && offsetParent !== elem && offsetParent.nodeType === 1) {
parentOffset = jQuery(offsetParent).offset();
parentOffset.top += jQuery.css(offsetParent, "borderTopWidth", true);
parentOffset.left += jQuery.css(offsetParent, "borderLeftWidth", true);
}
}
return {
top: offset2.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
left: offset2.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
};
},
offsetParent: function() {
return this.map(function() {
var offsetParent = this.offsetParent;
while (offsetParent && jQuery.css(offsetParent, "position") === "static") {
offsetParent = offsetParent.offsetParent;
}
return offsetParent || documentElement;
});
}
});
jQuery.each({ scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function(method, prop) {
var top2 = "pageYOffset" === prop;
jQuery.fn[method] = function(val) {
return access(this, function(elem, method2, val2) {
var win;
if (isWindow(elem)) {
win = elem;
} else if (elem.nodeType === 9) {
win = elem.defaultView;
}
if (val2 === void 0) {
return win ? win[prop] : elem[method2];
}
if (win) {
win.scrollTo(
!top2 ? val2 : win.pageXOffset,
top2 ? val2 : win.pageYOffset
);
} else {
elem[method2] = val2;
}
}, method, val, arguments.length);
};
});
jQuery.each(["top", "left"], function(_i, prop) {
jQuery.cssHooks[prop] = addGetHookIf(
support.pixelPosition,
function(elem, computed) {
if (computed) {
computed = curCSS(elem, prop);
return rnumnonpx.test(computed) ? jQuery(elem).position()[prop] + "px" : computed;
}
}
);
});
jQuery.each({ Height: "height", Width: "width" }, function(name, type) {
jQuery.each({
padding: "inner" + name,
content: type,
"": "outer" + name
}, function(defaultExtra, funcName) {
jQuery.fn[funcName] = function(margin, value) {
var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"), extra = defaultExtra || (margin === true || value === true ? "margin" : "border");
return access(this, function(elem, type2, value2) {
var doc2;
if (isWindow(elem)) {
return funcName.indexOf("outer") === 0 ? elem["inner" + name] : elem.document.documentElement["client" + name];
}
if (elem.nodeType === 9) {
doc2 = elem.documentElement;
return Math.max(
elem.body["scroll" + name],
doc2["scroll" + name],
elem.body["offset" + name],
doc2["offset" + name],
doc2["client" + name]
);
}
return value2 === void 0 ? jQuery.css(elem, type2, extra) : jQuery.style(elem, type2, value2, extra);
}, type, chainable ? margin : void 0, chainable);
};
});
});
jQuery.each([
"ajaxStart",
"ajaxStop",
"ajaxComplete",
"ajaxError",
"ajaxSuccess",
"ajaxSend"
], function(_i, type) {
jQuery.fn[type] = function(fn2) {
return this.on(type, fn2);
};
});
jQuery.fn.extend({
bind: function(types, data, fn2) {
return this.on(types, null, data, fn2);
},
unbind: function(types, fn2) {
return this.off(types, null, fn2);
},
delegate: function(selector, types, data, fn2) {
return this.on(types, selector, data, fn2);
},
undelegate: function(selector, types, fn2) {
return arguments.length === 1 ? this.off(selector, "**") : this.off(types, selector || "**", fn2);
},
hover: function(fnOver, fnOut) {
return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
}
});
jQuery.each(
"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),
function(_i, name) {
jQuery.fn[name] = function(data, fn2) {
return arguments.length > 0 ? this.on(name, null, data, fn2) : this.trigger(name);
};
}
);
var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
jQuery.proxy = function(fn2, context) {
var tmp, args, proxy;
if (typeof context === "string") {
tmp = fn2[context];
context = fn2;
fn2 = tmp;
}
if (!isFunction(fn2)) {
return void 0;
}
args = slice.call(arguments, 2);
proxy = function() {
return fn2.apply(context || this, args.concat(slice.call(arguments)));
};
proxy.guid = fn2.guid = fn2.guid || jQuery.guid++;
return proxy;
};
jQuery.holdReady = function(hold) {
if (hold) {
jQuery.readyWait++;
} else {
jQuery.ready(true);
}
};
jQuery.isArray = Array.isArray;
jQuery.parseJSON = JSON.parse;
jQuery.nodeName = nodeName;
jQuery.isFunction = isFunction;
jQuery.isWindow = isWindow;
jQuery.camelCase = camelCase;
jQuery.type = toType2;
jQuery.now = Date.now;
jQuery.isNumeric = function(obj) {
var type = jQuery.type(obj);
return (type === "number" || type === "string") && !isNaN(obj - parseFloat(obj));
};
jQuery.trim = function(text) {
return text == null ? "" : (text + "").replace(rtrim, "");
};
if (typeof define === "function" && define.amd) {
define("jquery", [], function() {
return jQuery;
});
}
var _jQuery = window2.jQuery, _$ = window2.$;
jQuery.noConflict = function(deep) {
if (window2.$ === jQuery) {
window2.$ = _$;
}
if (deep && window2.jQuery === jQuery) {
window2.jQuery = _jQuery;
}
return jQuery;
};
if (typeof noGlobal === "undefined") {
window2.jQuery = window2.$ = jQuery;
}
return jQuery;
});
}
});
// vendor/prism.js
var require_prism = __commonJS({
"vendor/prism.js"(exports, module) {
var _self = typeof window !== "undefined" ? window : typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope ? self : {};
var Prism = function(_self2) {
var lang = /(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i;
var uniqueId = 0;
var plainTextGrammar = {};
var _ = {
manual: _self2.Prism && _self2.Prism.manual,
disableWorkerMessageHandler: _self2.Prism && _self2.Prism.disableWorkerMessageHandler,
util: {
encode: function encode(tokens) {
if (tokens instanceof Token) {
return new Token(tokens.type, encode(tokens.content), tokens.alias);
} else if (Array.isArray(tokens)) {
return tokens.map(encode);
} else {
return tokens.replace(/&/g, "&").replace(/</g, "<").replace(/\u00a0/g, " ");
}
},
type: function(o) {
return Object.prototype.toString.call(o).slice(8, -1);
},
objId: function(obj) {
if (!obj["__id"]) {
Object.defineProperty(obj, "__id", { value: ++uniqueId });
}
return obj["__id"];
},
clone: function deepClone(o, visited) {
visited = visited || {};
var clone2;
var id;
switch (_.util.type(o)) {
case "Object":
id = _.util.objId(o);
if (visited[id]) {
return visited[id];
}
clone2 = {};
visited[id] = clone2;
for (var key in o) {
if (o.hasOwnProperty(key)) {
clone2[key] = deepClone(o[key], visited);
}
}
return clone2;
case "Array":
id = _.util.objId(o);
if (visited[id]) {
return visited[id];
}
clone2 = [];
visited[id] = clone2;
o.forEach(function(v, i) {
clone2[i] = deepClone(v, visited);
});
return clone2;
default:
return o;
}
},
getLanguage: function(element) {
while (element) {
var m = lang.exec(element.className);
if (m) {
return m[1].toLowerCase();
}
element = element.parentElement;
}
return "none";
},
setLanguage: function(element, language) {
element.className = element.className.replace(RegExp(lang, "gi"), "");
element.classList.add("language-" + language);
},
currentScript: function() {
if (typeof document === "undefined") {
return null;
}
if ("currentScript" in document && 1 < 2) {
return document.currentScript;
}
try {
throw new Error();
} catch (err) {
var src = (/at [^(\r\n]*\((.*):[^:]+:[^:]+\)$/i.exec(err.stack) || [])[1];
if (src) {
var scripts = document.getElementsByTagName("script");
for (var i in scripts) {
if (scripts[i].src == src) {
return scripts[i];
}
}
}
return null;
}
},
isActive: function(element, className, defaultActivation) {
var no = "no-" + className;
while (element) {
var classList = element.classList;
if (classList.contains(className)) {
return true;
}
if (classList.contains(no)) {
return false;
}
element = element.parentElement;
}
return !!defaultActivation;
}
},
languages: {
plain: plainTextGrammar,
plaintext: plainTextGrammar,
text: plainTextGrammar,
txt: plainTextGrammar,
extend: function(id, redef) {
var lang2 = _.util.clone(_.languages[id]);
for (var key in redef) {
lang2[key] = redef[key];
}
return lang2;
},
insertBefore: function(inside, before, insert, root) {
root = root || _.languages;
var grammar = root[inside];
var ret = {};
for (var token in grammar) {
if (grammar.hasOwnProperty(token)) {
if (token == before) {
for (var newToken in insert) {
if (insert.hasOwnProperty(newToken)) {
ret[newToken] = insert[newToken];
}
}
}
if (!insert.hasOwnProperty(token)) {
ret[token] = grammar[token];
}
}
}
var old = root[inside];
root[inside] = ret;
_.languages.DFS(_.languages, function(key, value) {
if (value === old && key != inside) {
this[key] = ret;
}
});
return ret;
},
DFS: function DFS(o, callback, type, visited) {
visited = visited || {};
var objId = _.util.objId;
for (var i in o) {
if (o.hasOwnProperty(i)) {
callback.call(o, i, o[i], type || i);
var property = o[i];
var propertyType = _.util.type(property);
if (propertyType === "Object" && !visited[objId(property)]) {
visited[objId(property)] = true;
DFS(property, callback, null, visited);
} else if (propertyType === "Array" && !visited[objId(property)]) {
visited[objId(property)] = true;
DFS(property, callback, i, visited);
}
}
}
}
},
plugins: {},
highlightAll: function(async, callback) {
_.highlightAllUnder(document, async, callback);
},
highlightAllUnder: function(container, async, callback) {
var env = {
callback,
container,
selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
};
_.hooks.run("before-highlightall", env);
env.elements = Array.prototype.slice.apply(env.container.querySelectorAll(env.selector));
_.hooks.run("before-all-elements-highlight", env);
for (var i = 0, element; element = env.elements[i++]; ) {
_.highlightElement(element, async === true, env.callback);
}
},
highlightElement: function(element, async, callback) {
var language = _.util.getLanguage(element);
var grammar = _.languages[language];
_.util.setLanguage(element, language);
var parent = element.parentElement;
if (parent && parent.nodeName.toLowerCase() === "pre") {
_.util.setLanguage(parent, language);
}
var code = element.textContent;
var env = {
element,
language,
grammar,
code
};
function insertHighlightedCode(highlightedCode) {
env.highlightedCode = highlightedCode;
_.hooks.run("before-insert", env);
env.element.innerHTML = env.highlightedCode;
_.hooks.run("after-highlight", env);
_.hooks.run("complete", env);
callback && callback.call(env.element);
}
_.hooks.run("before-sanity-check", env);
parent = env.element.parentElement;
if (parent && parent.nodeName.toLowerCase() === "pre" && !parent.hasAttribute("tabindex")) {
parent.setAttribute("tabindex", "0");
}
if (!env.code) {
_.hooks.run("complete", env);
callback && callback.call(env.element);
return;
}
_.hooks.run("before-highlight", env);
if (!env.grammar) {
insertHighlightedCode(_.util.encode(env.code));
return;
}
if (async && _self2.Worker) {
var worker = new Worker(_.filename);
worker.onmessage = function(evt) {
insertHighlightedCode(evt.data);
};
worker.postMessage(JSON.stringify({
language: env.language,
code: env.code,
immediateClose: true
}));
} else {
insertHighlightedCode(_.highlight(env.code, env.grammar, env.language));
}
},
highlight: function(text, grammar, language) {
var env = {
code: text,
grammar,
language
};
_.hooks.run("before-tokenize", env);
if (!env.grammar) {
throw new Error('The language "' + env.language + '" has no grammar.');
}
env.tokens = _.tokenize(env.code, env.grammar);
_.hooks.run("after-tokenize", env);
return Token.stringify(_.util.encode(env.tokens), env.language);
},
tokenize: function(text, grammar) {
var rest = grammar.rest;
if (rest) {
for (var token in rest) {
grammar[token] = rest[token];
}
delete grammar.rest;
}
var tokenList = new LinkedList();
addAfter(tokenList, tokenList.head, text);
matchGrammar(text, tokenList, grammar, tokenList.head, 0);
return toArray(tokenList);
},
hooks: {
all: {},
add: function(name, callback) {
var hooks = _.hooks.all;
hooks[name] = hooks[name] || [];
hooks[name].push(callback);
},
run: function(name, env) {
var callbacks = _.hooks.all[name];
if (!callbacks || !callbacks.length) {
return;
}
for (var i = 0, callback; callback = callbacks[i++]; ) {
callback(env);
}
}
},
Token
};
_self2.Prism = _;
function Token(type, content, alias, matchedStr) {
this.type = type;
this.content = content;
this.alias = alias;
this.length = (matchedStr || "").length | 0;
}
Token.stringify = function stringify(o, language) {
if (typeof o == "string") {
return o;
}
if (Array.isArray(o)) {
var s = "";
o.forEach(function(e) {
s += stringify(e, language);
});
return s;
}
var env = {
type: o.type,
content: stringify(o.content, language),
tag: "span",
classes: ["token", o.type],
attributes: {},
language
};
var aliases = o.alias;
if (aliases) {
if (Array.isArray(aliases)) {
Array.prototype.push.apply(env.classes, aliases);
} else {
env.classes.push(aliases);
}
}
_.hooks.run("wrap", env);
var attributes = "";
for (var name in env.attributes) {
attributes += " " + name + '="' + (env.attributes[name] || "").replace(/"/g, """) + '"';
}
return "<" + env.tag + ' class="' + env.classes.join(" ") + '"' + attributes + ">" + env.content + "</" + env.tag + ">";
};
function matchPattern(pattern, pos, text, lookbehind) {
pattern.lastIndex = pos;
var match = pattern.exec(text);
if (match && lookbehind && match[1]) {
var lookbehindLength = match[1].length;
match.index += lookbehindLength;
match[0] = match[0].slice(lookbehindLength);
}
return match;
}
function matchGrammar(text, tokenList, grammar, startNode, startPos, rematch) {
for (var token in grammar) {
if (!grammar.hasOwnProperty(token) || !grammar[token]) {
continue;
}
var patterns = grammar[token];
patterns = Array.isArray(patterns) ? patterns : [patterns];
for (var j = 0; j < patterns.length; ++j) {
if (rematch && rematch.cause == token + "," + j) {
return;
}
var patternObj = patterns[j];
var inside = patternObj.inside;
var lookbehind = !!patternObj.lookbehind;
var greedy = !!patternObj.greedy;
var alias = patternObj.alias;
if (greedy && !patternObj.pattern.global) {
var flags = patternObj.pattern.toString().match(/[imsuy]*$/)[0];
patternObj.pattern = RegExp(patternObj.pattern.source, flags + "g");
}
var pattern = patternObj.pattern || patternObj;
for (var currentNode = startNode.next, pos = startPos; currentNode !== tokenList.tail; pos += currentNode.value.length, currentNode = currentNode.next) {
if (rematch && pos >= rematch.reach) {
break;
}
var str = currentNode.value;
if (tokenList.length > text.length) {
return;
}
if (str instanceof Token) {
continue;
}
var removeCount = 1;
var match;
if (greedy) {
match = matchPattern(pattern, pos, text, lookbehind);
if (!match || match.index >= text.length) {
break;
}
var from = match.index;
var to = match.index + match[0].length;
var p = pos;
p += currentNode.value.length;
while (from >= p) {
currentNode = currentNode.next;
p += currentNode.value.length;
}
p -= currentNode.value.length;
pos = p;
if (currentNode.value instanceof Token) {
continue;
}
for (var k = currentNode; k !== tokenList.tail && (p < to || typeof k.value === "string"); k = k.next) {
removeCount++;
p += k.value.length;
}
removeCount--;
str = text.slice(pos, p);
match.index -= pos;
} else {
match = matchPattern(pattern, 0, str, lookbehind);
if (!match) {
continue;
}
}
var from = match.index;
var matchStr = match[0];
var before = str.slice(0, from);
var after = str.slice(from + matchStr.length);
var reach = pos + str.length;
if (rematch && reach > rematch.reach) {
rematch.reach = reach;
}
var removeFrom = currentNode.prev;
if (before) {
removeFrom = addAfter(tokenList, removeFrom, before);
pos += before.length;
}
removeRange(tokenList, removeFrom, removeCount);
var wrapped = new Token(token, inside ? _.tokenize(matchStr, inside) : matchStr, alias, matchStr);
currentNode = addAfter(tokenList, removeFrom, wrapped);
if (after) {
addAfter(tokenList, currentNode, after);
}
if (removeCount > 1) {
var nestedRematch = {
cause: token + "," + j,
reach
};
matchGrammar(text, tokenList, grammar, currentNode.prev, pos, nestedRematch);
if (rematch && nestedRematch.reach > rematch.reach) {
rematch.reach = nestedRematch.reach;
}
}
}
}
}
}
function LinkedList() {
var head = { value: null, prev: null, next: null };
var tail = { value: null, prev: head, next: null };
head.next = tail;
this.head = head;
this.tail = tail;
this.length = 0;
}
function addAfter(list, node, value) {
var next = node.next;
var newNode = { value, prev: node, next };
node.next = newNode;
next.prev = newNode;
list.length++;
return newNode;
}
function removeRange(list, node, count) {
var next = node.next;
for (var i = 0; i < count && next !== list.tail; i++) {
next = next.next;
}
node.next = next;
next.prev = node;
list.length -= i;
}
function toArray(list) {
var array = [];
var node = list.head.next;
while (node !== list.tail) {
array.push(node.value);
node = node.next;
}
return array;
}
if (!_self2.document) {
if (!_self2.addEventListener) {
return _;
}
if (!_.disableWorkerMessageHandler) {
_self2.addEventListener("message", function(evt) {
var message = JSON.parse(evt.data);
var lang2 = message.language;
var code = message.code;
var immediateClose = message.immediateClose;
_self2.postMessage(_.highlight(code, _.languages[lang2], lang2));
if (immediateClose) {
_self2.close();
}
}, false);
}
return _;
}
var script = _.util.currentScript();
if (script) {
_.filename = script.src;
if (script.hasAttribute("data-manual")) {
_.manual = true;
}
}
function highlightAutomaticallyCallback() {
if (!_.manual) {
_.highlightAll();
}
}
if (!_.manual) {
var readyState = document.readyState;
if (readyState === "loading" || readyState === "interactive" && script && script.defer) {
document.addEventListener("DOMContentLoaded", highlightAutomaticallyCallback);
} else {
if (window.requestAnimationFrame) {
window.requestAnimationFrame(highlightAutomaticallyCallback);
} else {
window.setTimeout(highlightAutomaticallyCallback, 16);
}
}
}
return _;
}(_self);
if (typeof module !== "undefined" && module.exports) {
module.exports = Prism;
}
if (typeof global !== "undefined") {
global.Prism = Prism;
}
Prism.languages.markup = {
"comment": {
pattern: /<!--(?:(?!<!--)[\s\S])*?-->/,
greedy: true
},
"prolog": {
pattern: /<\?[\s\S]+?\?>/,
greedy: true
},
"doctype": {
pattern: /<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,
greedy: true,
inside: {
"internal-subset": {
pattern: /(^[^\[]*\[)[\s\S]+(?=\]>$)/,
lookbehind: true,
greedy: true,
inside: null
},
"string": {
pattern: /"[^"]*"|'[^']*'/,
greedy: true
},
"punctuation": /^<!|>$|[[\]]/,
"doctype-tag": /^DOCTYPE/i,
"name": /[^\s<>'"]+/
}
},
"cdata": {
pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
greedy: true
},
"tag": {
pattern: /<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,
greedy: true,
inside: {
"tag": {
pattern: /^<\/?[^\s>\/]+/,
inside: {
"punctuation": /^<\/?/,
"namespace": /^[^\s>\/:]+:/
}
},
"special-attr": [],
"attr-value": {
pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,
inside: {
"punctuation": [
{
pattern: /^=/,
alias: "attr-equals"
},
{
pattern: /^(\s*)["']|["']$/,
lookbehind: true
}
]
}
},
"punctuation": /\/?>/,
"attr-name": {
pattern: /[^\s>\/]+/,
inside: {
"namespace": /^[^\s>\/:]+:/
}
}
}
},
"entity": [
{
pattern: /&[\da-z]{1,8};/i,
alias: "named-entity"
},
/&#x?[\da-f]{1,8};/i
]
};
Prism.languages.markup["tag"].inside["attr-value"].inside["entity"] = Prism.languages.markup["entity"];
Prism.languages.markup["doctype"].inside["internal-subset"].inside = Prism.languages.markup;
Prism.hooks.add("wrap", function(env) {
if (env.type === "entity") {
env.attributes["title"] = env.content.replace(/&/, "&");
}
});
Object.defineProperty(Prism.languages.markup.tag, "addInlined", {
value: function addInlined(tagName, lang) {
var includedCdataInside = {};
includedCdataInside["language-" + lang] = {
pattern: /(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,
lookbehind: true,
inside: Prism.languages[lang]
};
includedCdataInside["cdata"] = /^<!\[CDATA\[|\]\]>$/i;
var inside = {
"included-cdata": {
pattern: /<!\[CDATA\[[\s\S]*?\]\]>/i,
inside: includedCdataInside
}
};
inside["language-" + lang] = {
pattern: /[\s\S]+/,
inside: Prism.languages[lang]
};
var def = {};
def[tagName] = {
pattern: RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g, function() {
return tagName;
}), "i"),
lookbehind: true,
greedy: true,
inside
};
Prism.languages.insertBefore("markup", "cdata", def);
}
});
Object.defineProperty(Prism.languages.markup.tag, "addAttribute", {
value: function(attrName, lang) {
Prism.languages.markup.tag.inside["special-attr"].push({
pattern: RegExp(
/(^|["'\s])/.source + "(?:" + attrName + ")" + /\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,
"i"
),
lookbehind: true,
inside: {
"attr-name": /^[^\s=]+/,
"attr-value": {
pattern: /=[\s\S]+/,
inside: {
"value": {
pattern: /(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,
lookbehind: true,
alias: [lang, "language-" + lang],
inside: Prism.languages[lang]
},
"punctuation": [
{
pattern: /^=/,
alias: "attr-equals"
},
/"|'/
]
}
}
}
});
}
});
Prism.languages.html = Prism.languages.markup;
Prism.languages.mathml = Prism.languages.markup;
Prism.languages.svg = Prism.languages.markup;
Prism.languages.xml = Prism.languages.extend("markup", {});
Prism.languages.ssml = Prism.languages.xml;
Prism.languages.atom = Prism.languages.xml;
Prism.languages.rss = Prism.languages.xml;
(function(Prism2) {
var string = /(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;
Prism2.languages.css = {
"comment": /\/\*[\s\S]*?\*\//,
"atrule": {
pattern: RegExp("@[\\w-](?:" + /[^;{\s"']|\s+(?!\s)/.source + "|" + string.source + ")*?" + /(?:;|(?=\s*\{))/.source),
inside: {
"rule": /^@[\w-]+/,
"selector-function-argument": {
pattern: /(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,
lookbehind: true,
alias: "selector"
},
"keyword": {
pattern: /(^|[^\w-])(?:and|not|only|or)(?![\w-])/,
lookbehind: true
}
}
},
"url": {
pattern: RegExp("\\burl\\((?:" + string.source + "|" + /(?:[^\\\r\n()"']|\\[\s\S])*/.source + ")\\)", "i"),
greedy: true,
inside: {
"function": /^url/i,
"punctuation": /^\(|\)$/,
"string": {
pattern: RegExp("^" + string.source + "$"),
alias: "url"
}
}
},
"selector": {
pattern: RegExp(`(^|[{}\\s])[^{}\\s](?:[^{};"'\\s]|\\s+(?![\\s{])|` + string.source + ")*(?=\\s*\\{)"),
lookbehind: true
},
"string": {
pattern: string,
greedy: true
},
"property": {
pattern: /(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,
lookbehind: true
},
"important": /!important\b/i,
"function": {
pattern: /(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,
lookbehind: true
},
"punctuation": /[(){};:,]/
};
Prism2.languages.css["atrule"].inside.rest = Prism2.languages.css;
var markup = Prism2.languages.markup;
if (markup) {
markup.tag.addInlined("style", "css");
markup.tag.addAttribute("style", "css");
}
})(Prism);
Prism.languages.clike = {
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"string": {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"class-name": {
pattern: /(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,
lookbehind: true,
inside: {
"punctuation": /[.\\]/
}
},
"keyword": /\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,
"boolean": /\b(?:false|true)\b/,
"function": /\b\w+(?=\()/,
"number": /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
"operator": /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.javascript = Prism.languages.extend("clike", {
"class-name": [
Prism.languages.clike["class-name"],
{
pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,
lookbehind: true
}
],
"keyword": [
{
pattern: /((?:^|\})\s*)catch\b/,
lookbehind: true
},
{
pattern: /(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,
lookbehind: true
}
],
"function": /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,
"number": {
pattern: RegExp(
/(^|[^\w$])/.source + "(?:" + (/NaN|Infinity/.source + "|" + /0[bB][01]+(?:_[01]+)*n?/.source + "|" + /0[oO][0-7]+(?:_[0-7]+)*n?/.source + "|" + /0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source + "|" + /\d+(?:_\d+)*n/.source + "|" + /(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source) + ")" + /(?![\w$])/.source
),
lookbehind: true
},
"operator": /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/
});
Prism.languages.javascript["class-name"][0].pattern = /(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/;
Prism.languages.insertBefore("javascript", "keyword", {
"regex": {
pattern: RegExp(
/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source + /\//.source + "(?:" + /(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source + "|" + /(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source + ")" + /(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source
),
lookbehind: true,
greedy: true,
inside: {
"regex-source": {
pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
lookbehind: true,
alias: "language-regex",
inside: Prism.languages.regex
},
"regex-delimiter": /^\/|\/$/,
"regex-flags": /^[a-z]+$/
}
},
"function-variable": {
pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,
alias: "function"
},
"parameter": [
{
pattern: /(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,
lookbehind: true,
inside: Prism.languages.javascript
},
{
pattern: /(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,
lookbehind: true,
inside: Prism.languages.javascript
},
{
pattern: /(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,
lookbehind: true,
inside: Prism.languages.javascript
},
{
pattern: /((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,
lookbehind: true,
inside: Prism.languages.javascript
}
],
"constant": /\b[A-Z](?:[A-Z_]|\dx?)*\b/
});
Prism.languages.insertBefore("javascript", "string", {
"hashbang": {
pattern: /^#!.*/,
greedy: true,
alias: "comment"
},
"template-string": {
pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,
greedy: true,
inside: {
"template-punctuation": {
pattern: /^`|`$/,
alias: "string"
},
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^\$\{|\}$/,
alias: "punctuation"
},
rest: Prism.languages.javascript
}
},
"string": /[\s\S]+/
}
},
"string-property": {
pattern: /((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,
lookbehind: true,
greedy: true,
alias: "property"
}
});
Prism.languages.insertBefore("javascript", "operator", {
"literal-property": {
pattern: /((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,
lookbehind: true,
alias: "property"
}
});
if (Prism.languages.markup) {
Prism.languages.markup.tag.addInlined("script", "javascript");
Prism.languages.markup.tag.addAttribute(
/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,
"javascript"
);
}
Prism.languages.js = Prism.languages.javascript;
Prism.languages.abap = {
"comment": /^\*.*/m,
"string": /(`|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
"string-template": {
pattern: /([|}])(?:\\.|[^\\|{\r\n])*(?=[|{])/,
lookbehind: true,
alias: "string"
},
"eol-comment": {
pattern: /(^|\s)".*/m,
lookbehind: true,
alias: "comment"
},
"keyword": {
pattern: /(\s|\.|^)(?:\*-INPUT|\?TO|ABAP-SOURCE|ABBREVIATED|ABS|ABSTRACT|ACCEPT|ACCEPTING|ACCESSPOLICY|ACCORDING|ACOS|ACTIVATION|ACTUAL|ADD|ADD-CORRESPONDING|ADJACENT|AFTER|ALIAS|ALIASES|ALIGN|ALL|ALLOCATE|ALPHA|ANALYSIS|ANALYZER|AND|ANY|APPEND|APPENDAGE|APPENDING|APPLICATION|ARCHIVE|AREA|ARITHMETIC|AS|ASCENDING|ASIN|ASPECT|ASSERT|ASSIGN|ASSIGNED|ASSIGNING|ASSOCIATION|ASYNCHRONOUS|AT|ATAN|ATTRIBUTES|AUTHORITY|AUTHORITY-CHECK|AVG|BACK|BACKGROUND|BACKUP|BACKWARD|BADI|BASE|BEFORE|BEGIN|BETWEEN|BIG|BINARY|BINDING|BIT|BIT-AND|BIT-NOT|BIT-OR|BIT-XOR|BLACK|BLANK|BLANKS|BLOB|BLOCK|BLOCKS|BLUE|BOUND|BOUNDARIES|BOUNDS|BOXED|BREAK-POINT|BT|BUFFER|BY|BYPASSING|BYTE|BYTE-CA|BYTE-CN|BYTE-CO|BYTE-CS|BYTE-NA|BYTE-NS|BYTE-ORDER|C|CA|CALL|CALLING|CASE|CAST|CASTING|CATCH|CEIL|CENTER|CENTERED|CHAIN|CHAIN-INPUT|CHAIN-REQUEST|CHANGE|CHANGING|CHANNELS|CHAR-TO-HEX|CHARACTER|CHARLEN|CHECK|CHECKBOX|CIRCULAR|CI_|CLASS|CLASS-CODING|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|CLEANUP|CLEAR|CLIENT|CLOB|CLOCK|CLOSE|CN|CNT|CO|COALESCE|CODE|CODING|COLLECT|COLOR|COLUMN|COLUMNS|COL_BACKGROUND|COL_GROUP|COL_HEADING|COL_KEY|COL_NEGATIVE|COL_NORMAL|COL_POSITIVE|COL_TOTAL|COMMENT|COMMENTS|COMMIT|COMMON|COMMUNICATION|COMPARING|COMPONENT|COMPONENTS|COMPRESSION|COMPUTE|CONCAT|CONCATENATE|COND|CONDENSE|CONDITION|CONNECT|CONNECTION|CONSTANTS|CONTEXT|CONTEXTS|CONTINUE|CONTROL|CONTROLS|CONV|CONVERSION|CONVERT|COPIES|COPY|CORRESPONDING|COS|COSH|COUNT|COUNTRY|COVER|CP|CPI|CREATE|CREATING|CRITICAL|CS|CURRENCY|CURRENCY_CONVERSION|CURRENT|CURSOR|CURSOR-SELECTION|CUSTOMER|CUSTOMER-FUNCTION|DANGEROUS|DATA|DATABASE|DATAINFO|DATASET|DATE|DAYLIGHT|DBMAXLEN|DD\/MM\/YY|DD\/MM\/YYYY|DDMMYY|DEALLOCATE|DECIMALS|DECIMAL_SHIFT|DECLARATIONS|DEEP|DEFAULT|DEFERRED|DEFINE|DEFINING|DEFINITION|DELETE|DELETING|DEMAND|DEPARTMENT|DESCENDING|DESCRIBE|DESTINATION|DETAIL|DIALOG|DIRECTORY|DISCONNECT|DISPLAY|DISPLAY-MODE|DISTANCE|DISTINCT|DIV|DIVIDE|DIVIDE-CORRESPONDING|DIVISION|DO|DUMMY|DUPLICATE|DUPLICATES|DURATION|DURING|DYNAMIC|DYNPRO|E|EACH|EDIT|EDITOR-CALL|ELSE|ELSEIF|EMPTY|ENABLED|ENABLING|ENCODING|END|END-ENHANCEMENT-SECTION|END-LINES|END-OF-DEFINITION|END-OF-FILE|END-OF-PAGE|END-OF-SELECTION|ENDAT|ENDCASE|ENDCATCH|ENDCHAIN|ENDCLASS|ENDDO|ENDENHANCEMENT|ENDEXEC|ENDFOR|ENDFORM|ENDFUNCTION|ENDIAN|ENDIF|ENDING|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDON|ENDPROVIDE|ENDSELECT|ENDTRY|ENDWHILE|ENGINEERING|ENHANCEMENT|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|ENHANCEMENTS|ENTRIES|ENTRY|ENVIRONMENT|EQ|EQUAL|EQUIV|ERRORMESSAGE|ERRORS|ESCAPE|ESCAPING|EVENT|EVENTS|EXACT|EXCEPT|EXCEPTION|EXCEPTION-TABLE|EXCEPTIONS|EXCLUDE|EXCLUDING|EXEC|EXECUTE|EXISTS|EXIT|EXIT-COMMAND|EXP|EXPAND|EXPANDING|EXPIRATION|EXPLICIT|EXPONENT|EXPORT|EXPORTING|EXTEND|EXTENDED|EXTENSION|EXTRACT|FAIL|FETCH|FIELD|FIELD-GROUPS|FIELD-SYMBOL|FIELD-SYMBOLS|FIELDS|FILE|FILTER|FILTER-TABLE|FILTERS|FINAL|FIND|FIRST|FIRST-LINE|FIXED-POINT|FKEQ|FKGE|FLOOR|FLUSH|FONT|FOR|FORM|FORMAT|FORWARD|FOUND|FRAC|FRAME|FRAMES|FREE|FRIENDS|FROM|FUNCTION|FUNCTION-POOL|FUNCTIONALITY|FURTHER|GAPS|GE|GENERATE|GET|GIVING|GKEQ|GKGE|GLOBAL|GRANT|GREATER|GREEN|GROUP|GROUPS|GT|HANDLE|HANDLER|HARMLESS|HASHED|HAVING|HDB|HEAD-LINES|HEADER|HEADERS|HEADING|HELP-ID|HELP-REQUEST|HIDE|HIGH|HINT|HOLD|HOTSPOT|I|ICON|ID|IDENTIFICATION|IDENTIFIER|IDS|IF|IGNORE|IGNORING|IMMEDIATELY|IMPLEMENTATION|IMPLEMENTATIONS|IMPLEMENTED|IMPLICIT|IMPORT|IMPORTING|IN|INACTIVE|INCL|INCLUDE|INCLUDES|INCLUDING|INCREMENT|INDEX|INDEX-LINE|INFOTYPES|INHERITING|INIT|INITIAL|INITIALIZATION|INNER|INOUT|INPUT|INSERT|INSTANCES|INTENSIFIED|INTERFACE|INTERFACE-POOL|INTERFACES|INTERNAL|INTERVALS|INTO|INVERSE|INVERTED-DATE|IS|ISO|ITERATOR|ITNO|JOB|JOIN|KEEP|KEEPING|KERNEL|KEY|KEYS|KEYWORDS|KIND|LANGUAGE|LAST|LATE|LAYOUT|LE|LEADING|LEAVE|LEFT|LEFT-JUSTIFIED|LEFTPLUS|LEFTSPACE|LEGACY|LENGTH|LESS|LET|LEVEL|LEVELS|LIKE|LINE|LINE-COUNT|LINE-SELECTION|LINE-SIZE|LINEFEED|LINES|LIST|LIST-PROCESSING|LISTBOX|LITTLE|LLANG|LOAD|LOAD-OF-PROGRAM|LOB|LOCAL|LOCALE|LOCATOR|LOG|LOG-POINT|LOG10|LOGFILE|LOGICAL|LONG|LOOP|LOW|LOWER|LPAD|LPI|LT|M|MAIL|MAIN|MAJOR-ID|MAPPING|MARGIN|MARK|MASK|MATCH|MATCHCODE|MAX|MAXIMUM|MEDIUM|MEMBERS|MEMORY|MESH|MESSAGE|MESSAGE-ID|MESSAGES|MESSAGING|METHOD|METHODS|MIN|MINIMUM|MINOR-ID|MM\/DD\/YY|MM\/DD\/YYYY|MMDDYY|MOD|MODE|MODIF|MODIFIER|MODIFY|MODULE|MOVE|MOVE-CORRESPONDING|MULTIPLY|MULTIPLY-CORRESPONDING|NA|NAME|NAMETAB|NATIVE|NB|NE|NESTED|NESTING|NEW|NEW-LINE|NEW-PAGE|NEW-SECTION|NEXT|NO|NO-DISPLAY|NO-EXTENSION|NO-GAP|NO-GAPS|NO-GROUPING|NO-HEADING|NO-SCROLLING|NO-SIGN|NO-TITLE|NO-TOPOFPAGE|NO-ZERO|NODE|NODES|NON-UNICODE|NON-UNIQUE|NOT|NP|NS|NULL|NUMBER|NUMOFCHAR|O|OBJECT|OBJECTS|OBLIGATORY|OCCURRENCE|OCCURRENCES|OCCURS|OF|OFF|OFFSET|OLE|ON|ONLY|OPEN|OPTION|OPTIONAL|OPTIONS|OR|ORDER|OTHER|OTHERS|OUT|OUTER|OUTPUT|OUTPUT-LENGTH|OVERFLOW|OVERLAY|PACK|PACKAGE|PAD|PADDING|PAGE|PAGES|PARAMETER|PARAMETER-TABLE|PARAMETERS|PART|PARTIALLY|PATTERN|PERCENTAGE|PERFORM|PERFORMING|PERSON|PF|PF-STATUS|PINK|PLACES|POOL|POSITION|POS_HIGH|POS_LOW|PRAGMAS|PRECOMPILED|PREFERRED|PRESERVING|PRIMARY|PRINT|PRINT-CONTROL|PRIORITY|PRIVATE|PROCEDURE|PROCESS|PROGRAM|PROPERTY|PROTECTED|PROVIDE|PUBLIC|PUSHBUTTON|PUT|QUEUE-ONLY|QUICKINFO|RADIOBUTTON|RAISE|RAISING|RANGE|RANGES|RAW|READ|READ-ONLY|READER|RECEIVE|RECEIVED|RECEIVER|RECEIVING|RED|REDEFINITION|REDUCE|REDUCED|REF|REFERENCE|REFRESH|REGEX|REJECT|REMOTE|RENAMING|REPLACE|REPLACEMENT|REPLACING|REPORT|REQUEST|REQUESTED|RESERVE|RESET|RESOLUTION|RESPECTING|RESPONSIBLE|RESULT|RESULTS|RESUMABLE|RESUME|RETRY|RETURN|RETURNCODE|RETURNING|RIGHT|RIGHT-JUSTIFIED|RIGHTPLUS|RIGHTSPACE|RISK|RMC_COMMUNICATION_FAILURE|RMC_INVALID_STATUS|RMC_SYSTEM_FAILURE|ROLE|ROLLBACK|ROUND|ROWS|RTTI|RUN|SAP|SAP-SPOOL|SAVING|SCALE_PRESERVING|SCALE_PRESERVING_SCIENTIFIC|SCAN|SCIENTIFIC|SCIENTIFIC_WITH_LEADING_ZERO|SCREEN|SCROLL|SCROLL-BOUNDARY|SCROLLING|SEARCH|SECONDARY|SECONDS|SECTION|SELECT|SELECT-OPTIONS|SELECTION|SELECTION-SCREEN|SELECTION-SET|SELECTION-SETS|SELECTION-TABLE|SELECTIONS|SELECTOR|SEND|SEPARATE|SEPARATED|SET|SHARED|SHIFT|SHORT|SHORTDUMP-ID|SIGN|SIGN_AS_POSTFIX|SIMPLE|SIN|SINGLE|SINH|SIZE|SKIP|SKIPPING|SMART|SOME|SORT|SORTABLE|SORTED|SOURCE|SPACE|SPECIFIED|SPLIT|SPOOL|SPOTS|SQL|SQLSCRIPT|SQRT|STABLE|STAMP|STANDARD|START-OF-SELECTION|STARTING|STATE|STATEMENT|STATEMENTS|STATIC|STATICS|STATUSINFO|STEP-LOOP|STOP|STRLEN|STRUCTURE|STRUCTURES|STYLE|SUBKEY|SUBMATCHES|SUBMIT|SUBROUTINE|SUBSCREEN|SUBSTRING|SUBTRACT|SUBTRACT-CORRESPONDING|SUFFIX|SUM|SUMMARY|SUMMING|SUPPLIED|SUPPLY|SUPPRESS|SWITCH|SWITCHSTATES|SYMBOL|SYNCPOINTS|SYNTAX|SYNTAX-CHECK|SYNTAX-TRACE|SYSTEM-CALL|SYSTEM-EXCEPTIONS|SYSTEM-EXIT|TAB|TABBED|TABLE|TABLES|TABLEVIEW|TABSTRIP|TAN|TANH|TARGET|TASK|TASKS|TEST|TESTING|TEXT|TEXTPOOL|THEN|THROW|TIME|TIMES|TIMESTAMP|TIMEZONE|TITLE|TITLE-LINES|TITLEBAR|TO|TOKENIZATION|TOKENS|TOP-LINES|TOP-OF-PAGE|TRACE-FILE|TRACE-TABLE|TRAILING|TRANSACTION|TRANSFER|TRANSFORMATION|TRANSLATE|TRANSPORTING|TRMAC|TRUNC|TRUNCATE|TRUNCATION|TRY|TYPE|TYPE-POOL|TYPE-POOLS|TYPES|ULINE|UNASSIGN|UNDER|UNICODE|UNION|UNIQUE|UNIT|UNIT_CONVERSION|UNIX|UNPACK|UNTIL|UNWIND|UP|UPDATE|UPPER|USER|USER-COMMAND|USING|UTF-8|VALID|VALUE|VALUE-REQUEST|VALUES|VARY|VARYING|VERIFICATION-MESSAGE|VERSION|VIA|VIEW|VISIBLE|WAIT|WARNING|WHEN|WHENEVER|WHERE|WHILE|WIDTH|WINDOW|WINDOWS|WITH|WITH-HEADING|WITH-TITLE|WITHOUT|WORD|WORK|WRITE|WRITER|X|XML|XOR|XSD|XSTRLEN|YELLOW|YES|YYMMDD|Z|ZERO|ZONE)(?![\w-])/i,
lookbehind: true
},
"number": /\b\d+\b/,
"operator": {
pattern: /(\s)(?:\*\*?|<[=>]?|>=?|\?=|[-+\/=])(?=\s)/,
lookbehind: true
},
"string-operator": {
pattern: /(\s)&&?(?=\s)/,
lookbehind: true,
alias: "keyword"
},
"token-operator": [{
pattern: /(\w)(?:->?|=>|[~|{}])(?=\w)/,
lookbehind: true,
alias: "punctuation"
}, {
pattern: /[|{}]/,
alias: "punctuation"
}],
"punctuation": /[,.:()]/
};
(function(Prism2) {
var coreRules = "(?:ALPHA|BIT|CHAR|CR|CRLF|CTL|DIGIT|DQUOTE|HEXDIG|HTAB|LF|LWSP|OCTET|SP|VCHAR|WSP)";
Prism2.languages.abnf = {
"comment": /;.*/,
"string": {
pattern: /(?:%[is])?"[^"\n\r]*"/,
greedy: true,
inside: {
"punctuation": /^%[is]/
}
},
"range": {
pattern: /%(?:b[01]+-[01]+|d\d+-\d+|x[A-F\d]+-[A-F\d]+)/i,
alias: "number"
},
"terminal": {
pattern: /%(?:b[01]+(?:\.[01]+)*|d\d+(?:\.\d+)*|x[A-F\d]+(?:\.[A-F\d]+)*)/i,
alias: "number"
},
"repetition": {
pattern: /(^|[^\w-])(?:\d*\*\d*|\d+)/,
lookbehind: true,
alias: "operator"
},
"definition": {
pattern: /(^[ \t]*)(?:[a-z][\w-]*|<[^<>\r\n]*>)(?=\s*=)/m,
lookbehind: true,
alias: "keyword",
inside: {
"punctuation": /<|>/
}
},
"core-rule": {
pattern: RegExp("(?:(^|[^<\\w-])" + coreRules + "|<" + coreRules + ">)(?![\\w-])", "i"),
lookbehind: true,
alias: ["rule", "constant"],
inside: {
"punctuation": /<|>/
}
},
"rule": {
pattern: /(^|[^<\w-])[a-z][\w-]*|<[^<>\r\n]*>/i,
lookbehind: true,
inside: {
"punctuation": /<|>/
}
},
"operator": /=\/?|\//,
"punctuation": /[()\[\]]/
};
})(Prism);
Prism.languages.actionscript = Prism.languages.extend("javascript", {
"keyword": /\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,
"operator": /\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/
});
Prism.languages.actionscript["class-name"].alias = "function";
delete Prism.languages.actionscript["parameter"];
delete Prism.languages.actionscript["literal-property"];
if (Prism.languages.markup) {
Prism.languages.insertBefore("actionscript", "string", {
"xml": {
pattern: /(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,
lookbehind: true,
inside: Prism.languages.markup
}
});
}
Prism.languages.ada = {
"comment": /--.*/,
"string": /"(?:""|[^"\r\f\n])*"/,
"number": [
{
pattern: /\b\d(?:_?\d)*#[\dA-F](?:_?[\dA-F])*(?:\.[\dA-F](?:_?[\dA-F])*)?#(?:E[+-]?\d(?:_?\d)*)?/i
},
{
pattern: /\b\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:E[+-]?\d(?:_?\d)*)?\b/i
}
],
"attribute": {
pattern: /\b'\w+/,
alias: "attr-name"
},
"keyword": /\b(?:abort|abs|abstract|accept|access|aliased|all|and|array|at|begin|body|case|constant|declare|delay|delta|digits|do|else|elsif|end|entry|exception|exit|for|function|generic|goto|if|in|interface|is|limited|loop|mod|new|not|null|of|or|others|out|overriding|package|pragma|private|procedure|protected|raise|range|record|rem|renames|requeue|return|reverse|select|separate|some|subtype|synchronized|tagged|task|terminate|then|type|until|use|when|while|with|xor)\b/i,
"boolean": /\b(?:false|true)\b/i,
"operator": /<[=>]?|>=?|=>?|:=|\/=?|\*\*?|[&+-]/,
"punctuation": /\.\.?|[,;():]/,
"char": /'.'/,
"variable": /\b[a-z](?:\w)*\b/i
};
(function(Prism2) {
Prism2.languages.agda = {
"comment": /\{-[\s\S]*?(?:-\}|$)|--.*/,
"string": {
pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,
greedy: true
},
"punctuation": /[(){}⦃⦄.;@]/,
"class-name": {
pattern: /((?:data|record) +)\S+/,
lookbehind: true
},
"function": {
pattern: /(^[ \t]*)(?!\s)[^:\r\n]+(?=:)/m,
lookbehind: true
},
"operator": {
pattern: /(^\s*|\s)(?:[=|:∀→λ\\?_]|->)(?=\s)/,
lookbehind: true
},
"keyword": /\b(?:Set|abstract|constructor|data|eta-equality|field|forall|hiding|import|in|inductive|infix|infixl|infixr|instance|let|macro|module|mutual|no-eta-equality|open|overlap|pattern|postulate|primitive|private|public|quote|quoteContext|quoteGoal|quoteTerm|record|renaming|rewrite|syntax|tactic|unquote|unquoteDecl|unquoteDef|using|variable|where|with)\b/
};
})(Prism);
Prism.languages.al = {
"comment": /\/\/.*|\/\*[\s\S]*?\*\//,
"string": {
pattern: /'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,
greedy: true
},
"function": {
pattern: /(\b(?:event|procedure|trigger)\s+|(?:^|[^.])\.\s*)[a-z_]\w*(?=\s*\()/i,
lookbehind: true
},
"keyword": [
/\b(?:array|asserterror|begin|break|case|do|downto|else|end|event|exit|for|foreach|function|if|implements|in|indataset|interface|internal|local|of|procedure|program|protected|repeat|runonclient|securityfiltering|suppressdispose|temporary|then|to|trigger|until|var|while|with|withevents)\b/i,
/\b(?:action|actions|addafter|addbefore|addfirst|addlast|area|assembly|chartpart|codeunit|column|controladdin|cuegroup|customizes|dataitem|dataset|dotnet|elements|enum|enumextension|extends|field|fieldattribute|fieldelement|fieldgroup|fieldgroups|fields|filter|fixed|grid|group|key|keys|label|labels|layout|modify|moveafter|movebefore|movefirst|movelast|page|pagecustomization|pageextension|part|profile|query|repeater|report|requestpage|schema|separator|systempart|table|tableelement|tableextension|textattribute|textelement|type|usercontrol|value|xmlport)\b/i
],
"number": /\b(?:0x[\da-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)(?:F|LL?|U(?:LL?)?)?\b/i,
"boolean": /\b(?:false|true)\b/i,
"variable": /\b(?:Curr(?:FieldNo|Page|Report)|x?Rec|RequestOptionsPage)\b/,
"class-name": /\b(?:automation|biginteger|bigtext|blob|boolean|byte|char|clienttype|code|completiontriggererrorlevel|connectiontype|database|dataclassification|datascope|date|dateformula|datetime|decimal|defaultlayout|dialog|dictionary|dotnetassembly|dotnettypedeclaration|duration|errorinfo|errortype|executioncontext|executionmode|fieldclass|fieldref|fieldtype|file|filterpagebuilder|guid|httpclient|httpcontent|httpheaders|httprequestmessage|httpresponsemessage|instream|integer|joker|jsonarray|jsonobject|jsontoken|jsonvalue|keyref|list|moduledependencyinfo|moduleinfo|none|notification|notificationscope|objecttype|option|outstream|pageresult|record|recordid|recordref|reportformat|securityfilter|sessionsettings|tableconnectiontype|tablefilter|testaction|testfield|testfilterfield|testpage|testpermissions|testrequestpage|text|textbuilder|textconst|textencoding|time|transactionmodel|transactiontype|variant|verbosity|version|view|views|webserviceactioncontext|webserviceactionresultcode|xmlattribute|xmlattributecollection|xmlcdata|xmlcomment|xmldeclaration|xmldocument|xmldocumenttype|xmlelement|xmlnamespacemanager|xmlnametable|xmlnode|xmlnodelist|xmlprocessinginstruction|xmlreadoptions|xmltext|xmlwriteoptions)\b/i,
"operator": /\.\.|:[=:]|[-+*/]=?|<>|[<>]=?|=|\b(?:and|div|mod|not|or|xor)\b/i,
"punctuation": /[()\[\]{}:.;,]/
};
Prism.languages.antlr4 = {
"comment": /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
"string": {
pattern: /'(?:\\.|[^\\'\r\n])*'/,
greedy: true
},
"character-class": {
pattern: /\[(?:\\.|[^\\\]\r\n])*\]/,
greedy: true,
alias: "regex",
inside: {
"range": {
pattern: /([^[]|(?:^|[^\\])(?:\\\\)*\\\[)-(?!\])/,
lookbehind: true,
alias: "punctuation"
},
"escape": /\\(?:u(?:[a-fA-F\d]{4}|\{[a-fA-F\d]+\})|[pP]\{[=\w-]+\}|[^\r\nupP])/,
"punctuation": /[\[\]]/
}
},
"action": {
pattern: /\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\}/,
greedy: true,
inside: {
"content": {
pattern: /(\{)[\s\S]+(?=\})/,
lookbehind: true
},
"punctuation": /[{}]/
}
},
"command": {
pattern: /(->\s*(?!\s))(?:\s*(?:,\s*)?\b[a-z]\w*(?:\s*\([^()\r\n]*\))?)+(?=\s*;)/i,
lookbehind: true,
inside: {
"function": /\b\w+(?=\s*(?:[,(]|$))/,
"punctuation": /[,()]/
}
},
"annotation": {
pattern: /@\w+(?:::\w+)*/,
alias: "keyword"
},
"label": {
pattern: /#[ \t]*\w+/,
alias: "punctuation"
},
"keyword": /\b(?:catch|channels|finally|fragment|grammar|import|lexer|locals|mode|options|parser|returns|throws|tokens)\b/,
"definition": [
{
pattern: /\b[a-z]\w*(?=\s*:)/,
alias: ["rule", "class-name"]
},
{
pattern: /\b[A-Z]\w*(?=\s*:)/,
alias: ["token", "constant"]
}
],
"constant": /\b[A-Z][A-Z_]*\b/,
"operator": /\.\.|->|[|~]|[*+?]\??/,
"punctuation": /[;:()=]/
};
Prism.languages.g4 = Prism.languages.antlr4;
Prism.languages.apacheconf = {
"comment": /#.*/,
"directive-inline": {
pattern: /(^[\t ]*)\b(?:AcceptFilter|AcceptPathInfo|AccessFileName|Action|Add(?:Alt|AltByEncoding|AltByType|Charset|DefaultCharset|Description|Encoding|Handler|Icon|IconByEncoding|IconByType|InputFilter|Language|ModuleInfo|OutputFilter|OutputFilterByType|Type)|Alias|AliasMatch|Allow(?:CONNECT|EncodedSlashes|Methods|Override|OverrideList)?|Anonymous(?:_LogEmail|_MustGiveEmail|_NoUserID|_VerifyEmail)?|AsyncRequestWorkerFactor|Auth(?:BasicAuthoritative|BasicFake|BasicProvider|BasicUseDigestAlgorithm|DBDUserPWQuery|DBDUserRealmQuery|DBMGroupFile|DBMType|DBMUserFile|Digest(?:Algorithm|Domain|NonceLifetime|Provider|Qop|ShmemSize)|Form(?:Authoritative|Body|DisableNoStore|FakeBasicAuth|Location|LoginRequiredLocation|LoginSuccessLocation|LogoutLocation|Method|Mimetype|Password|Provider|SitePassphrase|Size|Username)|GroupFile|LDAP(?:AuthorizePrefix|BindAuthoritative|BindDN|BindPassword|CharsetConfig|CompareAsUser|CompareDNOnServer|DereferenceAliases|GroupAttribute|GroupAttributeIsDN|InitialBindAsUser|InitialBindPattern|MaxSubGroupDepth|RemoteUserAttribute|RemoteUserIsDN|SearchAsUser|SubGroupAttribute|SubGroupClass|Url)|Merging|Name|nCache(?:Context|Enable|ProvideFor|SOCache|Timeout)|nzFcgiCheckAuthnProvider|nzFcgiDefineProvider|Type|UserFile|zDBDLoginToReferer|zDBDQuery|zDBDRedirectQuery|zDBMType|zSendForbiddenOnFailure)|BalancerGrowth|BalancerInherit|BalancerMember|BalancerPersist|BrowserMatch|BrowserMatchNoCase|BufferedLogs|BufferSize|Cache(?:DefaultExpire|DetailHeader|DirLength|DirLevels|Disable|Enable|File|Header|IgnoreCacheControl|IgnoreHeaders|IgnoreNoLastMod|IgnoreQueryString|IgnoreURLSessionIdentifiers|KeyBaseURL|LastModifiedFactor|Lock|LockMaxAge|LockPath|MaxExpire|MaxFileSize|MinExpire|MinFileSize|NegotiatedDocs|QuickHandler|ReadSize|ReadTime|Root|Socache(?:MaxSize|MaxTime|MinTime|ReadSize|ReadTime)?|StaleOnError|StoreExpired|StoreNoStore|StorePrivate)|CGIDScriptTimeout|CGIMapExtension|CharsetDefault|CharsetOptions|CharsetSourceEnc|CheckCaseOnly|CheckSpelling|ChrootDir|ContentDigest|CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking|CoreDumpDirectory|CustomLog|Dav|DavDepthInfinity|DavGenericLockDB|DavLockDB|DavMinTimeout|DBDExptime|DBDInitSQL|DBDKeep|DBDMax|DBDMin|DBDParams|DBDPersist|DBDPrepareSQL|DBDriver|DefaultIcon|DefaultLanguage|DefaultRuntimeDir|DefaultType|Define|Deflate(?:BufferSize|CompressionLevel|FilterNote|InflateLimitRequestBody|InflateRatio(?:Burst|Limit)|MemLevel|WindowSize)|Deny|DirectoryCheckHandler|DirectoryIndex|DirectoryIndexRedirect|DirectorySlash|DocumentRoot|DTracePrivileges|DumpIOInput|DumpIOOutput|EnableExceptionHook|EnableMMAP|EnableSendfile|Error|ErrorDocument|ErrorLog|ErrorLogFormat|Example|ExpiresActive|ExpiresByType|ExpiresDefault|ExtendedStatus|ExtFilterDefine|ExtFilterOptions|FallbackResource|FileETag|FilterChain|FilterDeclare|FilterProtocol|FilterProvider|FilterTrace|ForceLanguagePriority|ForceType|ForensicLog|GprofDir|GracefulShutdownTimeout|Group|Header|HeaderName|Heartbeat(?:Address|Listen|MaxServers|Storage)|HostnameLookups|IdentityCheck|IdentityCheckTimeout|ImapBase|ImapDefault|ImapMenu|Include|IncludeOptional|Index(?:HeadInsert|Ignore|IgnoreReset|Options|OrderDefault|StyleSheet)|InputSed|ISAPI(?:AppendLogToErrors|AppendLogToQuery|CacheFile|FakeAsync|LogNotSupported|ReadAheadBuffer)|KeepAlive|KeepAliveTimeout|KeptBodySize|LanguagePriority|LDAP(?:CacheEntries|CacheTTL|ConnectionPoolTTL|ConnectionTimeout|LibraryDebug|OpCacheEntries|OpCacheTTL|ReferralHopLimit|Referrals|Retries|RetryDelay|SharedCacheFile|SharedCacheSize|Timeout|TrustedClientCert|TrustedGlobalCert|TrustedMode|VerifyServerCert)|Limit(?:InternalRecursion|Request(?:Body|Fields|FieldSize|Line)|XMLRequestBody)|Listen|ListenBackLog|LoadFile|LoadModule|LogFormat|LogLevel|LogMessage|LuaAuthzProvider|LuaCodeCache|Lua(?:Hook(?:AccessChecker|AuthChecker|CheckUserID|Fixups|InsertFilter|Log|MapToStorage|TranslateName|TypeChecker)|Inherit|InputFilter|MapHandler|OutputFilter|PackageCPath|PackagePath|QuickHandler|Root|Scope)|Max(?:ConnectionsPerChild|KeepAliveRequests|MemFree|RangeOverlaps|RangeReversals|Ranges|RequestWorkers|SpareServers|SpareThreads|Threads)|MergeTrailers|MetaDir|MetaFiles|MetaSuffix|MimeMagicFile|MinSpareServers|MinSpareThreads|MMapFile|ModemStandard|ModMimeUsePathInfo|MultiviewsMatch|Mutex|NameVirtualHost|NoProxy|NWSSLTrustedCerts|NWSSLUpgradeable|Options|Order|OutputSed|PassEnv|PidFile|PrivilegesMode|Protocol|ProtocolEcho|Proxy(?:AddHeaders|BadHeader|Block|Domain|ErrorOverride|ExpressDBMFile|ExpressDBMType|ExpressEnable|FtpDirCharset|FtpEscapeWildcards|FtpListOnWildcard|HTML(?:BufSize|CharsetOut|DocType|Enable|Events|Extended|Fixups|Interp|Links|Meta|StripComments|URLMap)|IOBufferSize|MaxForwards|Pass(?:Inherit|InterpolateEnv|Match|Reverse|ReverseCookieDomain|ReverseCookiePath)?|PreserveHost|ReceiveBufferSize|Remote|RemoteMatch|Requests|SCGIInternalRedirect|SCGISendfile|Set|SourceAddress|Status|Timeout|Via)|ReadmeName|ReceiveBufferSize|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ReflectorHeader|RemoteIP(?:Header|InternalProxy|InternalProxyList|ProxiesHeader|TrustedProxy|TrustedProxyList)|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|RequestHeader|RequestReadTimeout|Require|Rewrite(?:Base|Cond|Engine|Map|Options|Rule)|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScoreBoardFile|Script(?:Alias|AliasMatch|InterpreterSource|Log|LogBuffer|LogLength|Sock)?|SecureListen|SeeRequestTail|SendBufferSize|Server(?:Admin|Alias|Limit|Name|Path|Root|Signature|Tokens)|Session(?:Cookie(?:Name|Name2|Remove)|Crypto(?:Cipher|Driver|Passphrase|PassphraseFile)|DBD(?:CookieName|CookieName2|CookieRemove|DeleteLabel|InsertLabel|PerUser|SelectLabel|UpdateLabel)|Env|Exclude|Header|Include|MaxAge)?|SetEnv|SetEnvIf|SetEnvIfExpr|SetEnvIfNoCase|SetHandler|SetInputFilter|SetOutputFilter|SSIEndTag|SSIErrorMsg|SSIETag|SSILastModified|SSILegacyExprParser|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|SSL(?:CACertificateFile|CACertificatePath|CADNRequestFile|CADNRequestPath|CARevocationCheck|CARevocationFile|CARevocationPath|CertificateChainFile|CertificateFile|CertificateKeyFile|CipherSuite|Compression|CryptoDevice|Engine|FIPS|HonorCipherOrder|InsecureRenegotiation|OCSP(?:DefaultResponder|Enable|OverrideResponder|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|UseRequestNonce)|OpenSSLConfCmd|Options|PassPhraseDialog|Protocol|Proxy(?:CACertificateFile|CACertificatePath|CARevocation(?:Check|File|Path)|CheckPeer(?:CN|Expire|Name)|CipherSuite|Engine|MachineCertificate(?:ChainFile|File|Path)|Protocol|Verify|VerifyDepth)|RandomSeed|RenegBufferSize|Require|RequireSSL|Session(?:Cache|CacheTimeout|TicketKeyFile|Tickets)|SRPUnknownUserSeed|SRPVerifierFile|Stapling(?:Cache|ErrorCacheTimeout|FakeTryLater|ForceURL|ResponderTimeout|ResponseMaxAge|ResponseTimeSkew|ReturnResponderErrors|StandardCacheTimeout)|StrictSNIVHostCheck|UserName|UseStapling|VerifyClient|VerifyDepth)|StartServers|StartThreads|Substitute|Suexec|SuexecUserGroup|ThreadLimit|ThreadsPerChild|ThreadStackSize|TimeOut|TraceEnable|TransferLog|TypesConfig|UnDefine|UndefMacro|UnsetEnv|Use|UseCanonicalName|UseCanonicalPhysicalPort|User|UserDir|VHostCGIMode|VHostCGIPrivs|VHostGroup|VHostPrivs|VHostSecure|VHostUser|Virtual(?:DocumentRoot|ScriptAlias)(?:IP)?|WatchdogInterval|XBitHack|xml2EncAlias|xml2EncDefault|xml2StartParse)\b/im,
lookbehind: true,
alias: "property"
},
"directive-block": {
pattern: /<\/?\b(?:Auth[nz]ProviderAlias|Directory|DirectoryMatch|Else|ElseIf|Files|FilesMatch|If|IfDefine|IfModule|IfVersion|Limit|LimitExcept|Location|LocationMatch|Macro|Proxy|Require(?:All|Any|None)|VirtualHost)\b.*>/i,
inside: {
"directive-block": {
pattern: /^<\/?\w+/,
inside: {
"punctuation": /^<\/?/
},
alias: "tag"
},
"directive-block-parameter": {
pattern: /.*[^>]/,
inside: {
"punctuation": /:/,
"string": {
pattern: /("|').*\1/,
inside: {
"variable": /[$%]\{?(?:\w\.?[-+:]?)+\}?/
}
}
},
alias: "attr-value"
},
"punctuation": />/
},
alias: "tag"
},
"directive-flags": {
pattern: /\[(?:[\w=],?)+\]/,
alias: "keyword"
},
"string": {
pattern: /("|').*\1/,
inside: {
"variable": /[$%]\{?(?:\w\.?[-+:]?)+\}?/
}
},
"variable": /[$%]\{?(?:\w\.?[-+:]?)+\}?/,
"regex": /\^?.*\$|\^.*\$?/
};
Prism.languages.sql = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,
lookbehind: true
},
"variable": [
{
pattern: /@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,
greedy: true
},
/@[\w.$]+/
],
"string": {
pattern: /(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,
greedy: true,
lookbehind: true
},
"identifier": {
pattern: /(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,
greedy: true,
lookbehind: true,
inside: {
"punctuation": /^`|`$/
}
},
"function": /\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,
"keyword": /\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,
"boolean": /\b(?:FALSE|NULL|TRUE)\b/i,
"number": /\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,
"operator": /[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,
"punctuation": /[;[\]()`,.]/
};
(function(Prism2) {
var keywords = /\b(?:(?:after|before)(?=\s+[a-z])|abstract|activate|and|any|array|as|asc|autonomous|begin|bigdecimal|blob|boolean|break|bulk|by|byte|case|cast|catch|char|class|collect|commit|const|continue|currency|date|datetime|decimal|default|delete|desc|do|double|else|end|enum|exception|exit|export|extends|final|finally|float|for|from|get(?=\s*[{};])|global|goto|group|having|hint|if|implements|import|in|inner|insert|instanceof|int|integer|interface|into|join|like|limit|list|long|loop|map|merge|new|not|null|nulls|number|object|of|on|or|outer|override|package|parallel|pragma|private|protected|public|retrieve|return|rollback|select|set|short|sObject|sort|static|string|super|switch|synchronized|system|testmethod|then|this|throw|time|transaction|transient|trigger|try|undelete|update|upsert|using|virtual|void|webservice|when|where|while|(?:inherited|with|without)\s+sharing)\b/i;
var className = /\b(?:(?=[a-z_]\w*\s*[<\[])|(?!<keyword>))[A-Z_]\w*(?:\s*\.\s*[A-Z_]\w*)*\b(?:\s*(?:\[\s*\]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>))*/.source.replace(/<keyword>/g, function() {
return keywords.source;
});
function insertClassName(pattern) {
return RegExp(pattern.replace(/<CLASS-NAME>/g, function() {
return className;
}), "i");
}
var classNameInside = {
"keyword": keywords,
"punctuation": /[()\[\]{};,:.<>]/
};
Prism2.languages.apex = {
"comment": Prism2.languages.clike.comment,
"string": Prism2.languages.clike.string,
"sql": {
pattern: /((?:[=,({:]|\breturn)\s*)\[[^\[\]]*\]/i,
lookbehind: true,
greedy: true,
alias: "language-sql",
inside: Prism2.languages.sql
},
"annotation": {
pattern: /@\w+\b/,
alias: "punctuation"
},
"class-name": [
{
pattern: insertClassName(/(\b(?:class|enum|extends|implements|instanceof|interface|new|trigger\s+\w+\s+on)\s+)<CLASS-NAME>/.source),
lookbehind: true,
inside: classNameInside
},
{
pattern: insertClassName(/(\(\s*)<CLASS-NAME>(?=\s*\)\s*[\w(])/.source),
lookbehind: true,
inside: classNameInside
},
{
pattern: insertClassName(/<CLASS-NAME>(?=\s*\w+\s*[;=,(){:])/.source),
inside: classNameInside
}
],
"trigger": {
pattern: /(\btrigger\s+)\w+\b/i,
lookbehind: true,
alias: "class-name"
},
"keyword": keywords,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"boolean": /\b(?:false|true)\b/i,
"number": /(?:\B\.\d+|\b\d+(?:\.\d+|L)?)\b/i,
"operator": /[!=](?:==?)?|\?\.?|&&|\|\||--|\+\+|[-+*/^&|]=?|:|<<?=?|>{1,3}=?/,
"punctuation": /[()\[\]{};,.]/
};
})(Prism);
Prism.languages.apl = {
"comment": /(?:⍝|#[! ]).*$/m,
"string": {
pattern: /'(?:[^'\r\n]|'')*'/,
greedy: true
},
"number": /¯?(?:\d*\.?\b\d+(?:e[+¯]?\d+)?|¯|∞)(?:j¯?(?:(?:\d+(?:\.\d+)?|\.\d+)(?:e[+¯]?\d+)?|¯|∞))?/i,
"statement": /:[A-Z][a-z][A-Za-z]*\b/,
"system-function": {
pattern: /⎕[A-Z]+/i,
alias: "function"
},
"constant": /[⍬⌾#⎕⍞]/,
"function": /[-+×÷⌈⌊∣|⍳⍸?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⊆⊇⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⍯↗¤→]/,
"monadic-operator": {
pattern: /[\\\/⌿⍀¨⍨⌶&∥]/,
alias: "operator"
},
"dyadic-operator": {
pattern: /[.⍣⍠⍤∘⌸@⌺⍥]/,
alias: "operator"
},
"assignment": {
pattern: /←/,
alias: "keyword"
},
"punctuation": /[\[;\]()◇⋄]/,
"dfn": {
pattern: /[{}⍺⍵⍶⍹∇⍫:]/,
alias: "builtin"
}
};
Prism.languages.applescript = {
"comment": [
/\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,
/--.+/,
/#.+/
],
"string": /"(?:\\.|[^"\\\r\n])*"/,
"number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?\b/i,
"operator": [
/[&=≠≤≥*+\-\/÷^]|[<>]=?/,
/\b(?:(?:begin|end|start)s? with|(?:contains?|(?:does not|doesn't) contain)|(?:is|isn't|is not) (?:contained by|in)|(?:(?:is|isn't|is not) )?(?:greater|less) than(?: or equal)?(?: to)?|(?:comes|(?:does not|doesn't) come) (?:after|before)|(?:is|isn't|is not) equal(?: to)?|(?:(?:does not|doesn't) equal|equal to|equals|is not|isn't)|(?:a )?(?:ref(?: to)?|reference to)|(?:and|as|div|mod|not|or))\b/
],
"keyword": /\b(?:about|above|after|against|apart from|around|aside from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|continue|copy|does|eighth|else|end|equal|error|every|exit|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead of|into|is|it|its|last|local|me|middle|my|ninth|of|on|onto|out of|over|prop|property|put|repeat|return|returning|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\b/,
"class-name": /\b(?:POSIX file|RGB color|alias|application|boolean|centimeters|centimetres|class|constant|cubic centimeters|cubic centimetres|cubic feet|cubic inches|cubic meters|cubic metres|cubic yards|date|degrees Celsius|degrees Fahrenheit|degrees Kelvin|feet|file|gallons|grams|inches|integer|kilograms|kilometers|kilometres|list|liters|litres|meters|metres|miles|number|ounces|pounds|quarts|real|record|reference|script|square feet|square kilometers|square kilometres|square meters|square metres|square miles|square yards|text|yards)\b/,
"punctuation": /[{}():,¬«»《》]/
};
Prism.languages.aql = {
"comment": /\/\/.*|\/\*[\s\S]*?\*\//,
"property": {
pattern: /([{,]\s*)(?:(?!\d)\w+|(["'´`])(?:(?!\2)[^\\\r\n]|\\.)*\2)(?=\s*:)/,
lookbehind: true,
greedy: true
},
"string": {
pattern: /(["'])(?:(?!\1)[^\\\r\n]|\\.)*\1/,
greedy: true
},
"identifier": {
pattern: /([´`])(?:(?!\1)[^\\\r\n]|\\.)*\1/,
greedy: true
},
"variable": /@@?\w+/,
"keyword": [
{
pattern: /(\bWITH\s+)COUNT(?=\s+INTO\b)/i,
lookbehind: true
},
/\b(?:AGGREGATE|ALL|AND|ANY|ASC|COLLECT|DESC|DISTINCT|FILTER|FOR|GRAPH|IN|INBOUND|INSERT|INTO|K_PATHS|K_SHORTEST_PATHS|LET|LIKE|LIMIT|NONE|NOT|NULL|OR|OUTBOUND|REMOVE|REPLACE|RETURN|SHORTEST_PATH|SORT|UPDATE|UPSERT|WINDOW|WITH)\b/i,
{
pattern: /(^|[^\w.[])(?:KEEP|PRUNE|SEARCH|TO)\b/i,
lookbehind: true
},
{
pattern: /(^|[^\w.[])(?:CURRENT|NEW|OLD)\b/,
lookbehind: true
},
{
pattern: /\bOPTIONS(?=\s*\{)/i
}
],
"function": /\b(?!\d)\w+(?=\s*\()/,
"boolean": /\b(?:false|true)\b/i,
"range": {
pattern: /\.\./,
alias: "operator"
},
"number": [
/\b0b[01]+/i,
/\b0x[0-9a-f]+/i,
/(?:\B\.\d+|\b(?:0|[1-9]\d*)(?:\.\d+)?)(?:e[+-]?\d+)?/i
],
"operator": /\*{2,}|[=!]~|[!=<>]=?|&&|\|\||[-+*/%]/,
"punctuation": /::|[?.:,;()[\]{}]/
};
Prism.languages.c = Prism.languages.extend("clike", {
"comment": {
pattern: /\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,
greedy: true
},
"string": {
pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
greedy: true
},
"class-name": {
pattern: /(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,
lookbehind: true
},
"keyword": /\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"number": /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,
"operator": />>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/
});
Prism.languages.insertBefore("c", "string", {
"char": {
pattern: /'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,
greedy: true
}
});
Prism.languages.insertBefore("c", "string", {
"macro": {
pattern: /(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,
lookbehind: true,
greedy: true,
alias: "property",
inside: {
"string": [
{
pattern: /^(#\s*include\s*)<[^>]+>/,
lookbehind: true
},
Prism.languages.c["string"]
],
"char": Prism.languages.c["char"],
"comment": Prism.languages.c["comment"],
"macro-name": [
{
pattern: /(^#\s*define\s+)\w+\b(?!\()/i,
lookbehind: true
},
{
pattern: /(^#\s*define\s+)\w+\b(?=\()/i,
lookbehind: true,
alias: "function"
}
],
"directive": {
pattern: /^(#\s*)[a-z]+/,
lookbehind: true,
alias: "keyword"
},
"directive-hash": /^#/,
"punctuation": /##|\\(?=[\r\n])/,
"expression": {
pattern: /\S[\s\S]*/,
inside: Prism.languages.c
}
}
}
});
Prism.languages.insertBefore("c", "function", {
"constant": /\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/
});
delete Prism.languages.c["boolean"];
(function(Prism2) {
var keyword = /\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/;
var modName = /\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g, function() {
return keyword.source;
});
Prism2.languages.cpp = Prism2.languages.extend("c", {
"class-name": [
{
pattern: RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g, function() {
return keyword.source;
})),
lookbehind: true
},
/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,
/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,
/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/
],
"keyword": keyword,
"number": {
pattern: /(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,
greedy: true
},
"operator": />>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,
"boolean": /\b(?:false|true)\b/
});
Prism2.languages.insertBefore("cpp", "string", {
"module": {
pattern: RegExp(
/(\b(?:import|module)\s+)/.source + "(?:" + /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source + "|" + /<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g, function() {
return modName;
}) + ")"
),
lookbehind: true,
greedy: true,
inside: {
"string": /^[<"][\s\S]+/,
"operator": /:/,
"punctuation": /\./
}
},
"raw-string": {
pattern: /R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,
alias: "string",
greedy: true
}
});
Prism2.languages.insertBefore("cpp", "keyword", {
"generic-function": {
pattern: /\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,
inside: {
"function": /^\w+/,
"generic": {
pattern: /<[\s\S]+/,
alias: "class-name",
inside: Prism2.languages.cpp
}
}
}
});
Prism2.languages.insertBefore("cpp", "operator", {
"double-colon": {
pattern: /::/,
alias: "punctuation"
}
});
Prism2.languages.insertBefore("cpp", "class-name", {
"base-clause": {
pattern: /(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,
lookbehind: true,
greedy: true,
inside: Prism2.languages.extend("cpp", {})
}
});
Prism2.languages.insertBefore("inside", "double-colon", {
"class-name": /\b[a-z_]\w*\b(?!\s*::)/i
}, Prism2.languages.cpp["base-clause"]);
})(Prism);
Prism.languages.arduino = Prism.languages.extend("cpp", {
"keyword": /\b(?:String|array|bool|boolean|break|byte|case|catch|continue|default|do|double|else|finally|for|function|goto|if|in|instanceof|int|integer|long|loop|new|null|return|setup|string|switch|throw|try|void|while|word)\b/,
"constant": /\b(?:ANALOG_MESSAGE|DEFAULT|DIGITAL_MESSAGE|EXTERNAL|FIRMATA_STRING|HIGH|INPUT|INPUT_PULLUP|INTERNAL|INTERNAL1V1|INTERNAL2V56|LED_BUILTIN|LOW|OUTPUT|REPORT_ANALOG|REPORT_DIGITAL|SET_PIN_MODE|SYSEX_START|SYSTEM_RESET)\b/,
"builtin": /\b(?:Audio|BSSID|Bridge|Client|Console|EEPROM|Esplora|EsploraTFT|Ethernet|EthernetClient|EthernetServer|EthernetUDP|File|FileIO|FileSystem|Firmata|GPRS|GSM|GSMBand|GSMClient|GSMModem|GSMPIN|GSMScanner|GSMServer|GSMVoiceCall|GSM_SMS|HttpClient|IPAddress|IRread|Keyboard|KeyboardController|LiquidCrystal|LiquidCrystal_I2C|Mailbox|Mouse|MouseController|PImage|Process|RSSI|RobotControl|RobotMotor|SD|SPI|SSID|Scheduler|Serial|Server|Servo|SoftwareSerial|Stepper|Stream|TFT|Task|USBHost|WiFi|WiFiClient|WiFiServer|WiFiUDP|Wire|YunClient|YunServer|abs|addParameter|analogRead|analogReadResolution|analogReference|analogWrite|analogWriteResolution|answerCall|attach|attachGPRS|attachInterrupt|attached|autoscroll|available|background|beep|begin|beginPacket|beginSD|beginSMS|beginSpeaker|beginTFT|beginTransmission|beginWrite|bit|bitClear|bitRead|bitSet|bitWrite|blink|blinkVersion|buffer|changePIN|checkPIN|checkPUK|checkReg|circle|cityNameRead|cityNameWrite|clear|clearScreen|click|close|compassRead|config|connect|connected|constrain|cos|countryNameRead|countryNameWrite|createChar|cursor|debugPrint|delay|delayMicroseconds|detach|detachInterrupt|digitalRead|digitalWrite|disconnect|display|displayLogos|drawBMP|drawCompass|encryptionType|end|endPacket|endSMS|endTransmission|endWrite|exists|exitValue|fill|find|findUntil|flush|gatewayIP|get|getAsynchronously|getBand|getButton|getCurrentCarrier|getIMEI|getKey|getModifiers|getOemKey|getPINUsed|getResult|getSignalStrength|getSocket|getVoiceCallStatus|getXChange|getYChange|hangCall|height|highByte|home|image|interrupts|isActionDone|isDirectory|isListening|isPIN|isPressed|isValid|keyPressed|keyReleased|keyboardRead|knobRead|leftToRight|line|lineFollowConfig|listen|listenOnLocalhost|loadImage|localIP|lowByte|macAddress|maintain|map|max|messageAvailable|micros|millis|min|mkdir|motorsStop|motorsWrite|mouseDragged|mouseMoved|mousePressed|mouseReleased|move|noAutoscroll|noBlink|noBuffer|noCursor|noDisplay|noFill|noInterrupts|noListenOnLocalhost|noStroke|noTone|onReceive|onRequest|open|openNextFile|overflow|parseCommand|parseFloat|parseInt|parsePacket|pauseMode|peek|pinMode|playFile|playMelody|point|pointTo|position|pow|prepare|press|print|printFirmwareVersion|printVersion|println|process|processInput|pulseIn|put|random|randomSeed|read|readAccelerometer|readBlue|readButton|readBytes|readBytesUntil|readGreen|readJoystickButton|readJoystickSwitch|readJoystickX|readJoystickY|readLightSensor|readMessage|readMicrophone|readNetworks|readRed|readSlider|readString|readStringUntil|readTemperature|ready|rect|release|releaseAll|remoteIP|remoteNumber|remotePort|remove|requestFrom|retrieveCallingNumber|rewindDirectory|rightToLeft|rmdir|robotNameRead|robotNameWrite|run|runAsynchronously|runShellCommand|runShellCommandAsynchronously|running|scanNetworks|scrollDisplayLeft|scrollDisplayRight|seek|sendAnalog|sendDigitalPortPair|sendDigitalPorts|sendString|sendSysex|serialEvent|setBand|setBitOrder|setClockDivider|setCursor|setDNS|setDataMode|setFirmwareVersion|setMode|setPINUsed|setSpeed|setTextSize|setTimeout|shiftIn|shiftOut|shutdown|sin|size|sqrt|startLoop|step|stop|stroke|subnetMask|switchPIN|tan|tempoWrite|text|tone|transfer|tuneWrite|turn|updateIR|userNameRead|userNameWrite|voiceCall|waitContinue|width|write|writeBlue|writeGreen|writeJSON|writeMessage|writeMicroseconds|writeRGB|writeRed|yield)\b/
});
Prism.languages.ino = Prism.languages.arduino;
Prism.languages.arff = {
"comment": /%.*/,
"string": {
pattern: /(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"keyword": /@(?:attribute|data|end|relation)\b/i,
"number": /\b\d+(?:\.\d+)?\b/,
"punctuation": /[{},]/
};
Prism.languages.armasm = {
"comment": {
pattern: /;.*/,
greedy: true
},
"string": {
pattern: /"(?:[^"\r\n]|"")*"/,
greedy: true,
inside: {
"variable": {
pattern: /((?:^|[^$])(?:\${2})*)\$\w+/,
lookbehind: true
}
}
},
"char": {
pattern: /'(?:[^'\r\n]{0,4}|'')'/,
greedy: true
},
"version-symbol": {
pattern: /\|[\w@]+\|/,
greedy: true,
alias: "property"
},
"boolean": /\b(?:FALSE|TRUE)\b/,
"directive": {
pattern: /\b(?:ALIAS|ALIGN|AREA|ARM|ASSERT|ATTR|CN|CODE|CODE16|CODE32|COMMON|CP|DATA|DCB|DCD|DCDO|DCDU|DCFD|DCFDU|DCI|DCQ|DCQU|DCW|DCWU|DN|ELIF|ELSE|END|ENDFUNC|ENDIF|ENDP|ENTRY|EQU|EXPORT|EXPORTAS|EXTERN|FIELD|FILL|FN|FUNCTION|GBLA|GBLL|GBLS|GET|GLOBAL|IF|IMPORT|INCBIN|INCLUDE|INFO|KEEP|LCLA|LCLL|LCLS|LTORG|MACRO|MAP|MEND|MEXIT|NOFP|OPT|PRESERVE8|PROC|QN|READONLY|RELOC|REQUIRE|REQUIRE8|RLIST|ROUT|SETA|SETL|SETS|SN|SPACE|SUBT|THUMB|THUMBX|TTL|WEND|WHILE)\b/,
alias: "property"
},
"instruction": {
pattern: /((?:^|(?:^|[^\\])(?:\r\n?|\n))[ \t]*(?:(?:[A-Z][A-Z0-9_]*[a-z]\w*|[a-z]\w*|\d+)[ \t]+)?)\b[A-Z.]+\b/,
lookbehind: true,
alias: "keyword"
},
"variable": /\$\w+/,
"number": /(?:\b[2-9]_\d+|(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e-?\d+)?|\b0(?:[fd]_|x)[0-9a-f]+|&[0-9a-f]+)\b/i,
"register": {
pattern: /\b(?:r\d|lr)\b/,
alias: "symbol"
},
"operator": /<>|<<|>>|&&|\|\||[=!<>/]=?|[+\-*%#?&|^]|:[A-Z]+:/,
"punctuation": /[()[\],]/
};
Prism.languages["arm-asm"] = Prism.languages.armasm;
(function(Prism2) {
var createLanguageString = function(lang, pattern) {
return {
pattern: RegExp(/\{!/.source + "(?:" + (pattern || lang) + ")" + /$[\s\S]*\}/.source, "m"),
greedy: true,
inside: {
"embedded": {
pattern: /(^\{!\w+\b)[\s\S]+(?=\}$)/,
lookbehind: true,
alias: "language-" + lang,
inside: Prism2.languages[lang]
},
"string": /[\s\S]+/
}
};
};
Prism2.languages.arturo = {
"comment": {
pattern: /;.*/,
greedy: true
},
"character": {
pattern: /`.`/,
alias: "char",
greedy: true
},
"number": {
pattern: /\b\d+(?:\.\d+(?:\.\d+(?:-[\w+-]+)?)?)?\b/
},
"string": {
pattern: /"(?:[^"\\\r\n]|\\.)*"/,
greedy: true
},
"regex": {
pattern: /\{\/.*?\/\}/,
greedy: true
},
"html-string": createLanguageString("html"),
"css-string": createLanguageString("css"),
"js-string": createLanguageString("js"),
"md-string": createLanguageString("md"),
"sql-string": createLanguageString("sql"),
"sh-string": createLanguageString("shell", "sh"),
"multistring": {
pattern: /».*|\{:[\s\S]*?:\}|\{[\s\S]*?\}|^-{6}$[\s\S]*/m,
alias: "string",
greedy: true
},
"label": {
pattern: /\w+\b\??:/,
alias: "property"
},
"literal": {
pattern: /'(?:\w+\b\??:?)/,
alias: "constant"
},
"type": {
pattern: /:(?:\w+\b\??:?)/,
alias: "class-name"
},
"color": /#\w+/,
"predicate": {
pattern: /\b(?:all|and|any|ascii|attr|attribute|attributeLabel|binary|block|char|contains|database|date|dictionary|empty|equal|even|every|exists|false|floating|function|greater|greaterOrEqual|if|in|inline|integer|is|key|label|leap|less|lessOrEqual|literal|logical|lower|nand|negative|nor|not|notEqual|null|numeric|odd|or|path|pathLabel|positive|prefix|prime|regex|same|set|some|sorted|standalone|string|subset|suffix|superset|symbol|symbolLiteral|true|try|type|unless|upper|when|whitespace|word|xnor|xor|zero)\?/,
alias: "keyword"
},
"builtin-function": {
pattern: /\b(?:abs|acos|acosh|acsec|acsech|actan|actanh|add|after|alert|alias|and|angle|append|arg|args|arity|array|as|asec|asech|asin|asinh|atan|atan2|atanh|attr|attrs|average|before|benchmark|blend|break|call|capitalize|case|ceil|chop|clear|clip|close|color|combine|conj|continue|copy|cos|cosh|crc|csec|csech|ctan|ctanh|cursor|darken|dec|decode|define|delete|desaturate|deviation|dialog|dictionary|difference|digest|digits|div|do|download|drop|dup|e|else|empty|encode|ensure|env|escape|execute|exit|exp|extend|extract|factors|fdiv|filter|first|flatten|floor|fold|from|function|gamma|gcd|get|goto|hash|hypot|if|inc|indent|index|infinity|info|input|insert|inspect|intersection|invert|jaro|join|keys|kurtosis|last|let|levenshtein|lighten|list|ln|log|loop|lower|mail|map|match|max|median|min|mod|module|mul|nand|neg|new|nor|normalize|not|now|null|open|or|outdent|pad|palette|panic|path|pause|permissions|permutate|pi|pop|popup|pow|powerset|powmod|prefix|print|prints|process|product|query|random|range|read|relative|remove|rename|render|repeat|replace|request|return|reverse|round|sample|saturate|script|sec|sech|select|serve|set|shl|shr|shuffle|sin|sinh|size|skewness|slice|sort|spin|split|sqrt|squeeze|stack|strip|sub|suffix|sum|switch|symbols|symlink|sys|take|tan|tanh|terminal|terminate|to|truncate|try|type|unclip|union|unique|unless|until|unzip|upper|values|var|variance|volume|webview|while|with|wordwrap|write|xnor|xor|zip)\b/,
alias: "keyword"
},
"sugar": {
pattern: /->|=>|\||::/,
alias: "operator"
},
"punctuation": /[()[\],]/,
"symbol": {
pattern: /<:|-:|ø|@|#|\+|\||\*|\$|---|-|%|\/|\.\.|\^|~|=|<|>|\\/
},
"boolean": {
pattern: /\b(?:false|maybe|true)\b/
}
};
Prism2.languages.art = Prism2.languages["arturo"];
})(Prism);
(function(Prism2) {
var attributes = {
pattern: /(^[ \t]*)\[(?!\[)(?:(["'$`])(?:(?!\2)[^\\]|\\.)*\2|\[(?:[^\[\]\\]|\\.)*\]|[^\[\]\\"'$`]|\\.)*\]/m,
lookbehind: true,
inside: {
"quoted": {
pattern: /([$`])(?:(?!\1)[^\\]|\\.)*\1/,
inside: {
"punctuation": /^[$`]|[$`]$/
}
},
"interpreted": {
pattern: /'(?:[^'\\]|\\.)*'/,
inside: {
"punctuation": /^'|'$/
}
},
"string": /"(?:[^"\\]|\\.)*"/,
"variable": /\w+(?==)/,
"punctuation": /^\[|\]$|,/,
"operator": /=/,
"attr-value": /(?!^\s+$).+/
}
};
var asciidoc = Prism2.languages.asciidoc = {
"comment-block": {
pattern: /^(\/{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1/m,
alias: "comment"
},
"table": {
pattern: /^\|={3,}(?:(?:\r?\n|\r(?!\n)).*)*?(?:\r?\n|\r)\|={3,}$/m,
inside: {
"specifiers": {
pattern: /(?:(?:(?:\d+(?:\.\d+)?|\.\d+)[+*](?:[<^>](?:\.[<^>])?|\.[<^>])?|[<^>](?:\.[<^>])?|\.[<^>])[a-z]*|[a-z]+)(?=\|)/,
alias: "attr-value"
},
"punctuation": {
pattern: /(^|[^\\])[|!]=*/,
lookbehind: true
}
}
},
"passthrough-block": {
pattern: /^(\+{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,
inside: {
"punctuation": /^\++|\++$/
}
},
"literal-block": {
pattern: /^(-{4,}|\.{4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,
inside: {
"punctuation": /^(?:-+|\.+)|(?:-+|\.+)$/
}
},
"other-block": {
pattern: /^(--|\*{4,}|_{4,}|={4,})(?:\r?\n|\r)(?:[\s\S]*(?:\r?\n|\r))??\1$/m,
inside: {
"punctuation": /^(?:-+|\*+|_+|=+)|(?:-+|\*+|_+|=+)$/
}
},
"list-punctuation": {
pattern: /(^[ \t]*)(?:-|\*{1,5}|\.{1,5}|(?:[a-z]|\d+)\.|[xvi]+\))(?= )/im,
lookbehind: true,
alias: "punctuation"
},
"list-label": {
pattern: /(^[ \t]*)[a-z\d].+(?::{2,4}|;;)(?=\s)/im,
lookbehind: true,
alias: "symbol"
},
"indented-block": {
pattern: /((\r?\n|\r)\2)([ \t]+)\S.*(?:(?:\r?\n|\r)\3.+)*(?=\2{2}|$)/,
lookbehind: true
},
"comment": /^\/\/.*/m,
"title": {
pattern: /^.+(?:\r?\n|\r)(?:={3,}|-{3,}|~{3,}|\^{3,}|\+{3,})$|^={1,5} .+|^\.(?![\s.]).*/m,
alias: "important",
inside: {
"punctuation": /^(?:\.|=+)|(?:=+|-+|~+|\^+|\++)$/
}
},
"attribute-entry": {
pattern: /^:[^:\r\n]+:(?: .*?(?: \+(?:\r?\n|\r).*?)*)?$/m,
alias: "tag"
},
"attributes": attributes,
"hr": {
pattern: /^'{3,}$/m,
alias: "punctuation"
},
"page-break": {
pattern: /^<{3,}$/m,
alias: "punctuation"
},
"admonition": {
pattern: /^(?:CAUTION|IMPORTANT|NOTE|TIP|WARNING):/m,
alias: "keyword"
},
"callout": [
{
pattern: /(^[ \t]*)<?\d*>/m,
lookbehind: true,
alias: "symbol"
},
{
pattern: /<\d+>/,
alias: "symbol"
}
],
"macro": {
pattern: /\b[a-z\d][a-z\d-]*::?(?:[^\s\[\]]*\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
inside: {
"function": /^[a-z\d-]+(?=:)/,
"punctuation": /^::?/,
"attributes": {
pattern: /(?:\[(?:[^\]\\"']|(["'])(?:(?!\1)[^\\]|\\.)*\1|\\.)*\])/,
inside: attributes.inside
}
}
},
"inline": {
pattern: /(^|[^\\])(?:(?:\B\[(?:[^\]\\"']|(["'])(?:(?!\2)[^\\]|\\.)*\2|\\.)*\])?(?:\b_(?!\s)(?: _|[^_\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: _|[^_\\\r\n]|\\.)+)*_\b|\B``(?!\s).+?(?:(?:\r?\n|\r).+?)*''\B|\B`(?!\s)(?:[^`'\s]|\s+\S)+['`]\B|\B(['*+#])(?!\s)(?: \3|(?!\3)[^\\\r\n]|\\.)+(?:(?:\r?\n|\r)(?: \3|(?!\3)[^\\\r\n]|\\.)+)*\3\B)|(?:\[(?:[^\]\\"']|(["'])(?:(?!\4)[^\\]|\\.)*\4|\\.)*\])?(?:(__|\*\*|\+\+\+?|##|\$\$|[~^]).+?(?:(?:\r?\n|\r).+?)*\5|\{[^}\r\n]+\}|\[\[\[?.+?(?:(?:\r?\n|\r).+?)*\]?\]\]|<<.+?(?:(?:\r?\n|\r).+?)*>>|\(\(\(?.+?(?:(?:\r?\n|\r).+?)*\)?\)\)))/m,
lookbehind: true,
inside: {
"attributes": attributes,
"url": {
pattern: /^(?:\[\[\[?.+?\]?\]\]|<<.+?>>)$/,
inside: {
"punctuation": /^(?:\[\[\[?|<<)|(?:\]\]\]?|>>)$/
}
},
"attribute-ref": {
pattern: /^\{.+\}$/,
inside: {
"variable": {
pattern: /(^\{)[a-z\d,+_-]+/,
lookbehind: true
},
"operator": /^[=?!#%@$]|!(?=[:}])/,
"punctuation": /^\{|\}$|::?/
}
},
"italic": {
pattern: /^(['_])[\s\S]+\1$/,
inside: {
"punctuation": /^(?:''?|__?)|(?:''?|__?)$/
}
},
"bold": {
pattern: /^\*[\s\S]+\*$/,
inside: {
punctuation: /^\*\*?|\*\*?$/
}
},
"punctuation": /^(?:``?|\+{1,3}|##?|\$\$|[~^]|\(\(\(?)|(?:''?|\+{1,3}|##?|\$\$|[~^`]|\)?\)\))$/
}
},
"replacement": {
pattern: /\((?:C|R|TM)\)/,
alias: "builtin"
},
"entity": /&#?[\da-z]{1,8};/i,
"line-continuation": {
pattern: /(^| )\+$/m,
lookbehind: true,
alias: "punctuation"
}
};
function copyFromAsciiDoc(keys) {
keys = keys.split(" ");
var o = {};
for (var i = 0, l = keys.length; i < l; i++) {
o[keys[i]] = asciidoc[keys[i]];
}
return o;
}
attributes.inside["interpreted"].inside.rest = copyFromAsciiDoc("macro inline replacement entity");
asciidoc["passthrough-block"].inside.rest = copyFromAsciiDoc("macro");
asciidoc["literal-block"].inside.rest = copyFromAsciiDoc("callout");
asciidoc["table"].inside.rest = copyFromAsciiDoc("comment-block passthrough-block literal-block other-block list-punctuation indented-block comment title attribute-entry attributes hr page-break admonition list-label callout macro inline replacement entity line-continuation");
asciidoc["other-block"].inside.rest = copyFromAsciiDoc("table list-punctuation indented-block comment attribute-entry attributes hr page-break admonition list-label macro inline replacement entity line-continuation");
asciidoc["title"].inside.rest = copyFromAsciiDoc("macro inline replacement entity");
Prism2.hooks.add("wrap", function(env) {
if (env.type === "entity") {
env.attributes["title"] = env.content.replace(/&/, "&");
}
});
Prism2.languages.adoc = Prism2.languages.asciidoc;
})(Prism);
(function(Prism2) {
function replace(pattern, replacements) {
return pattern.replace(/<<(\d+)>>/g, function(m, index) {
return "(?:" + replacements[+index] + ")";
});
}
function re(pattern, replacements, flags) {
return RegExp(replace(pattern, replacements), flags || "");
}
function nested(pattern, depthLog2) {
for (var i = 0; i < depthLog2; i++) {
pattern = pattern.replace(/<<self>>/g, function() {
return "(?:" + pattern + ")";
});
}
return pattern.replace(/<<self>>/g, "[^\\s\\S]");
}
var keywordKinds = {
type: "bool byte char decimal double dynamic float int long object sbyte short string uint ulong ushort var void",
typeDeclaration: "class enum interface record struct",
contextual: "add alias and ascending async await by descending from(?=\\s*(?:\\w|$)) get global group into init(?=\\s*;) join let nameof not notnull on or orderby partial remove select set unmanaged value when where with(?=\\s*{)",
other: "abstract as base break case catch checked const continue default delegate do else event explicit extern finally fixed for foreach goto if implicit in internal is lock namespace new null operator out override params private protected public readonly ref return sealed sizeof stackalloc static switch this throw try typeof unchecked unsafe using virtual volatile while yield"
};
function keywordsToPattern(words) {
return "\\b(?:" + words.trim().replace(/ /g, "|") + ")\\b";
}
var typeDeclarationKeywords = keywordsToPattern(keywordKinds.typeDeclaration);
var keywords = RegExp(keywordsToPattern(keywordKinds.type + " " + keywordKinds.typeDeclaration + " " + keywordKinds.contextual + " " + keywordKinds.other));
var nonTypeKeywords = keywordsToPattern(keywordKinds.typeDeclaration + " " + keywordKinds.contextual + " " + keywordKinds.other);
var nonContextualKeywords = keywordsToPattern(keywordKinds.type + " " + keywordKinds.typeDeclaration + " " + keywordKinds.other);
var generic = nested(/<(?:[^<>;=+\-*/%&|^]|<<self>>)*>/.source, 2);
var nestedRound = nested(/\((?:[^()]|<<self>>)*\)/.source, 2);
var name = /@?\b[A-Za-z_]\w*\b/.source;
var genericName = replace(/<<0>>(?:\s*<<1>>)?/.source, [name, generic]);
var identifier = replace(/(?!<<0>>)<<1>>(?:\s*\.\s*<<1>>)*/.source, [nonTypeKeywords, genericName]);
var array = /\[\s*(?:,\s*)*\]/.source;
var typeExpressionWithoutTuple = replace(/<<0>>(?:\s*(?:\?\s*)?<<1>>)*(?:\s*\?)?/.source, [identifier, array]);
var tupleElement = replace(/[^,()<>[\];=+\-*/%&|^]|<<0>>|<<1>>|<<2>>/.source, [generic, nestedRound, array]);
var tuple = replace(/\(<<0>>+(?:,<<0>>+)+\)/.source, [tupleElement]);
var typeExpression = replace(/(?:<<0>>|<<1>>)(?:\s*(?:\?\s*)?<<2>>)*(?:\s*\?)?/.source, [tuple, identifier, array]);
var typeInside = {
"keyword": keywords,
"punctuation": /[<>()?,.:[\]]/
};
var character = /'(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'/.source;
var regularString = /"(?:\\.|[^\\"\r\n])*"/.source;
var verbatimString = /@"(?:""|\\[\s\S]|[^\\"])*"(?!")/.source;
Prism2.languages.csharp = Prism2.languages.extend("clike", {
"string": [
{
pattern: re(/(^|[^$\\])<<0>>/.source, [verbatimString]),
lookbehind: true,
greedy: true
},
{
pattern: re(/(^|[^@$\\])<<0>>/.source, [regularString]),
lookbehind: true,
greedy: true
}
],
"class-name": [
{
pattern: re(/(\busing\s+static\s+)<<0>>(?=\s*;)/.source, [identifier]),
lookbehind: true,
inside: typeInside
},
{
pattern: re(/(\busing\s+<<0>>\s*=\s*)<<1>>(?=\s*;)/.source, [name, typeExpression]),
lookbehind: true,
inside: typeInside
},
{
pattern: re(/(\busing\s+)<<0>>(?=\s*=)/.source, [name]),
lookbehind: true
},
{
pattern: re(/(\b<<0>>\s+)<<1>>/.source, [typeDeclarationKeywords, genericName]),
lookbehind: true,
inside: typeInside
},
{
pattern: re(/(\bcatch\s*\(\s*)<<0>>/.source, [identifier]),
lookbehind: true,
inside: typeInside
},
{
pattern: re(/(\bwhere\s+)<<0>>/.source, [name]),
lookbehind: true
},
{
pattern: re(/(\b(?:is(?:\s+not)?|as)\s+)<<0>>/.source, [typeExpressionWithoutTuple]),
lookbehind: true,
inside: typeInside
},
{
pattern: re(/\b<<0>>(?=\s+(?!<<1>>|with\s*\{)<<2>>(?:\s*[=,;:{)\]]|\s+(?:in|when)\b))/.source, [typeExpression, nonContextualKeywords, name]),
inside: typeInside
}
],
"keyword": keywords,
"number": /(?:\b0(?:x[\da-f_]*[\da-f]|b[01_]*[01])|(?:\B\.\d+(?:_+\d+)*|\b\d+(?:_+\d+)*(?:\.\d+(?:_+\d+)*)?)(?:e[-+]?\d+(?:_+\d+)*)?)(?:[dflmu]|lu|ul)?\b/i,
"operator": />>=?|<<=?|[-=]>|([-+&|])\1|~|\?\?=?|[-+*/%&|^!=<>]=?/,
"punctuation": /\?\.?|::|[{}[\];(),.:]/
});
Prism2.languages.insertBefore("csharp", "number", {
"range": {
pattern: /\.\./,
alias: "operator"
}
});
Prism2.languages.insertBefore("csharp", "punctuation", {
"named-parameter": {
pattern: re(/([(,]\s*)<<0>>(?=\s*:)/.source, [name]),
lookbehind: true,
alias: "punctuation"
}
});
Prism2.languages.insertBefore("csharp", "class-name", {
"namespace": {
pattern: re(/(\b(?:namespace|using)\s+)<<0>>(?:\s*\.\s*<<0>>)*(?=\s*[;{])/.source, [name]),
lookbehind: true,
inside: {
"punctuation": /\./
}
},
"type-expression": {
pattern: re(/(\b(?:default|sizeof|typeof)\s*\(\s*(?!\s))(?:[^()\s]|\s(?!\s)|<<0>>)*(?=\s*\))/.source, [nestedRound]),
lookbehind: true,
alias: "class-name",
inside: typeInside
},
"return-type": {
pattern: re(/<<0>>(?=\s+(?:<<1>>\s*(?:=>|[({]|\.\s*this\s*\[)|this\s*\[))/.source, [typeExpression, identifier]),
inside: typeInside,
alias: "class-name"
},
"constructor-invocation": {
pattern: re(/(\bnew\s+)<<0>>(?=\s*[[({])/.source, [typeExpression]),
lookbehind: true,
inside: typeInside,
alias: "class-name"
},
"generic-method": {
pattern: re(/<<0>>\s*<<1>>(?=\s*\()/.source, [name, generic]),
inside: {
"function": re(/^<<0>>/.source, [name]),
"generic": {
pattern: RegExp(generic),
alias: "class-name",
inside: typeInside
}
}
},
"type-list": {
pattern: re(
/\b((?:<<0>>\s+<<1>>|record\s+<<1>>\s*<<5>>|where\s+<<2>>)\s*:\s*)(?:<<3>>|<<4>>|<<1>>\s*<<5>>|<<6>>)(?:\s*,\s*(?:<<3>>|<<4>>|<<6>>))*(?=\s*(?:where|[{;]|=>|$))/.source,
[typeDeclarationKeywords, genericName, name, typeExpression, keywords.source, nestedRound, /\bnew\s*\(\s*\)/.source]
),
lookbehind: true,
inside: {
"record-arguments": {
pattern: re(/(^(?!new\s*\()<<0>>\s*)<<1>>/.source, [genericName, nestedRound]),
lookbehind: true,
greedy: true,
inside: Prism2.languages.csharp
},
"keyword": keywords,
"class-name": {
pattern: RegExp(typeExpression),
greedy: true,
inside: typeInside
},
"punctuation": /[,()]/
}
},
"preprocessor": {
pattern: /(^[\t ]*)#.*/m,
lookbehind: true,
alias: "property",
inside: {
"directive": {
pattern: /(#)\b(?:define|elif|else|endif|endregion|error|if|line|nullable|pragma|region|undef|warning)\b/,
lookbehind: true,
alias: "keyword"
}
}
}
});
var regularStringOrCharacter = regularString + "|" + character;
var regularStringCharacterOrComment = replace(/\/(?![*/])|\/\/[^\r\n]*[\r\n]|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>/.source, [regularStringOrCharacter]);
var roundExpression = nested(replace(/[^"'/()]|<<0>>|\(<<self>>*\)/.source, [regularStringCharacterOrComment]), 2);
var attrTarget = /\b(?:assembly|event|field|method|module|param|property|return|type)\b/.source;
var attr = replace(/<<0>>(?:\s*\(<<1>>*\))?/.source, [identifier, roundExpression]);
Prism2.languages.insertBefore("csharp", "class-name", {
"attribute": {
pattern: re(/((?:^|[^\s\w>)?])\s*\[\s*)(?:<<0>>\s*:\s*)?<<1>>(?:\s*,\s*<<1>>)*(?=\s*\])/.source, [attrTarget, attr]),
lookbehind: true,
greedy: true,
inside: {
"target": {
pattern: re(/^<<0>>(?=\s*:)/.source, [attrTarget]),
alias: "keyword"
},
"attribute-arguments": {
pattern: re(/\(<<0>>*\)/.source, [roundExpression]),
inside: Prism2.languages.csharp
},
"class-name": {
pattern: RegExp(identifier),
inside: {
"punctuation": /\./
}
},
"punctuation": /[:,]/
}
}
});
var formatString = /:[^}\r\n]+/.source;
var mInterpolationRound = nested(replace(/[^"'/()]|<<0>>|\(<<self>>*\)/.source, [regularStringCharacterOrComment]), 2);
var mInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [mInterpolationRound, formatString]);
var sInterpolationRound = nested(replace(/[^"'/()]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|<<0>>|\(<<self>>*\)/.source, [regularStringOrCharacter]), 2);
var sInterpolation = replace(/\{(?!\{)(?:(?![}:])<<0>>)*<<1>>?\}/.source, [sInterpolationRound, formatString]);
function createInterpolationInside(interpolation, interpolationRound) {
return {
"interpolation": {
pattern: re(/((?:^|[^{])(?:\{\{)*)<<0>>/.source, [interpolation]),
lookbehind: true,
inside: {
"format-string": {
pattern: re(/(^\{(?:(?![}:])<<0>>)*)<<1>>(?=\}$)/.source, [interpolationRound, formatString]),
lookbehind: true,
inside: {
"punctuation": /^:/
}
},
"punctuation": /^\{|\}$/,
"expression": {
pattern: /[\s\S]+/,
alias: "language-csharp",
inside: Prism2.languages.csharp
}
}
},
"string": /[\s\S]+/
};
}
Prism2.languages.insertBefore("csharp", "string", {
"interpolation-string": [
{
pattern: re(/(^|[^\\])(?:\$@|@\$)"(?:""|\\[\s\S]|\{\{|<<0>>|[^\\{"])*"/.source, [mInterpolation]),
lookbehind: true,
greedy: true,
inside: createInterpolationInside(mInterpolation, mInterpolationRound)
},
{
pattern: re(/(^|[^@\\])\$"(?:\\.|\{\{|<<0>>|[^\\"{])*"/.source, [sInterpolation]),
lookbehind: true,
greedy: true,
inside: createInterpolationInside(sInterpolation, sInterpolationRound)
}
],
"char": {
pattern: RegExp(character),
greedy: true
}
});
Prism2.languages.dotnet = Prism2.languages.cs = Prism2.languages.csharp;
})(Prism);
Prism.languages.aspnet = Prism.languages.extend("markup", {
"page-directive": {
pattern: /<%\s*@.*%>/,
alias: "tag",
inside: {
"page-directive": {
pattern: /<%\s*@\s*(?:Assembly|Control|Implements|Import|Master(?:Type)?|OutputCache|Page|PreviousPageType|Reference|Register)?|%>/i,
alias: "tag"
},
rest: Prism.languages.markup.tag.inside
}
},
"directive": {
pattern: /<%.*%>/,
alias: "tag",
inside: {
"directive": {
pattern: /<%\s*?[$=%#:]{0,2}|%>/,
alias: "tag"
},
rest: Prism.languages.csharp
}
}
});
Prism.languages.aspnet.tag.pattern = /<(?!%)\/?[^\s>\/]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/;
Prism.languages.insertBefore("inside", "punctuation", {
"directive": Prism.languages.aspnet["directive"]
}, Prism.languages.aspnet.tag.inside["attr-value"]);
Prism.languages.insertBefore("aspnet", "comment", {
"asp-comment": {
pattern: /<%--[\s\S]*?--%>/,
alias: ["asp", "comment"]
}
});
Prism.languages.insertBefore("aspnet", Prism.languages.javascript ? "script" : "tag", {
"asp-script": {
pattern: /(<script(?=.*runat=['"]?server\b)[^>]*>)[\s\S]*?(?=<\/script>)/i,
lookbehind: true,
alias: ["asp", "script"],
inside: Prism.languages.csharp || {}
}
});
Prism.languages.asm6502 = {
"comment": /;.*/,
"directive": {
pattern: /\.\w+(?= )/,
alias: "property"
},
"string": /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
"op-code": {
pattern: /\b(?:ADC|AND|ASL|BCC|BCS|BEQ|BIT|BMI|BNE|BPL|BRK|BVC|BVS|CLC|CLD|CLI|CLV|CMP|CPX|CPY|DEC|DEX|DEY|EOR|INC|INX|INY|JMP|JSR|LDA|LDX|LDY|LSR|NOP|ORA|PHA|PHP|PLA|PLP|ROL|ROR|RTI|RTS|SBC|SEC|SED|SEI|STA|STX|STY|TAX|TAY|TSX|TXA|TXS|TYA|adc|and|asl|bcc|bcs|beq|bit|bmi|bne|bpl|brk|bvc|bvs|clc|cld|cli|clv|cmp|cpx|cpy|dec|dex|dey|eor|inc|inx|iny|jmp|jsr|lda|ldx|ldy|lsr|nop|ora|pha|php|pla|plp|rol|ror|rti|rts|sbc|sec|sed|sei|sta|stx|sty|tax|tay|tsx|txa|txs|tya)\b/,
alias: "keyword"
},
"hex-number": {
pattern: /#?\$[\da-f]{1,4}\b/i,
alias: "number"
},
"binary-number": {
pattern: /#?%[01]+\b/,
alias: "number"
},
"decimal-number": {
pattern: /#?\b\d+\b/,
alias: "number"
},
"register": {
pattern: /\b[xya]\b/i,
alias: "variable"
},
"punctuation": /[(),:]/
};
Prism.languages.asmatmel = {
"comment": {
pattern: /;.*/,
greedy: true
},
"string": {
pattern: /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"constant": /\b(?:PORT[A-Z]|DDR[A-Z]|(?:DD|P)[A-Z](?:\d|[0-2]\d|3[01]))\b/,
"directive": {
pattern: /\.\w+(?= )/,
alias: "property"
},
"r-register": {
pattern: /\br(?:\d|[12]\d|3[01])\b/,
alias: "variable"
},
"op-code": {
pattern: /\b(?:ADC|ADD|ADIW|AND|ANDI|ASR|BCLR|BLD|BRBC|BRBS|BRCC|BRCS|BREAK|BREQ|BRGE|BRHC|BRHS|BRID|BRIE|BRLO|BRLT|BRMI|BRNE|BRPL|BRSH|BRTC|BRTS|BRVC|BRVS|BSET|BST|CALL|CBI|CBR|CLC|CLH|CLI|CLN|CLR|CLS|CLT|CLV|CLZ|COM|CP|CPC|CPI|CPSE|DEC|DES|EICALL|EIJMP|ELPM|EOR|FMUL|FMULS|FMULSU|ICALL|IJMP|IN|INC|JMP|LAC|LAS|LAT|LD|LD[A-Za-z0-9]|LPM|LSL|LSR|MOV|MOVW|MUL|MULS|MULSU|NEG|NOP|OR|ORI|OUT|POP|PUSH|RCALL|RET|RETI|RJMP|ROL|ROR|SBC|SBCI|SBI|SBIC|SBIS|SBIW|SBR|SBRC|SBRS|SEC|SEH|SEI|SEN|SER|SES|SET|SEV|SEZ|SLEEP|SPM|ST|ST[A-Z0-9]|SUB|SUBI|SWAP|TST|WDR|XCH|adc|add|adiw|and|andi|asr|bclr|bld|brbc|brbs|brcc|brcs|break|breq|brge|brhc|brhs|brid|brie|brlo|brlt|brmi|brne|brpl|brsh|brtc|brts|brvc|brvs|bset|bst|call|cbi|cbr|clc|clh|cli|cln|clr|cls|clt|clv|clz|com|cp|cpc|cpi|cpse|dec|des|eicall|eijmp|elpm|eor|fmul|fmuls|fmulsu|icall|ijmp|in|inc|jmp|lac|las|lat|ld|ld[a-z0-9]|lpm|lsl|lsr|mov|movw|mul|muls|mulsu|neg|nop|or|ori|out|pop|push|rcall|ret|reti|rjmp|rol|ror|sbc|sbci|sbi|sbic|sbis|sbiw|sbr|sbrc|sbrs|sec|seh|sei|sen|ser|ses|set|sev|sez|sleep|spm|st|st[a-zA-Z0-9]|sub|subi|swap|tst|wdr|xch)\b/,
alias: "keyword"
},
"hex-number": {
pattern: /#?\$[\da-f]{2,4}\b/i,
alias: "number"
},
"binary-number": {
pattern: /#?%[01]+\b/,
alias: "number"
},
"decimal-number": {
pattern: /#?\b\d+\b/,
alias: "number"
},
"register": {
pattern: /\b[acznvshtixy]\b/i,
alias: "variable"
},
"operator": />>=?|<<=?|&[&=]?|\|[\|=]?|[-+*/%^!=<>?]=?/,
"punctuation": /[(),:]/
};
Prism.languages.autohotkey = {
"comment": [
{
pattern: /(^|\s);.*/,
lookbehind: true
},
{
pattern: /(^[\t ]*)\/\*(?:[\r\n](?![ \t]*\*\/)|[^\r\n])*(?:[\r\n][ \t]*\*\/)?/m,
lookbehind: true,
greedy: true
}
],
"tag": {
pattern: /^([ \t]*)[^\s,`":]+(?=:[ \t]*$)/m,
lookbehind: true
},
"string": /"(?:[^"\n\r]|"")*"/,
"variable": /%\w+%/,
"number": /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,
"operator": /\?|\/\/?=?|:=|\|[=|]?|&[=&]?|\+[=+]?|-[=-]?|\*[=*]?|<(?:<=?|>|=)?|>>?=?|[.^!=~]=?|\b(?:AND|NOT|OR)\b/,
"boolean": /\b(?:false|true)\b/,
"command": {
pattern: /\b(?:AutoTrim|BlockInput|Break|Click|ClipWait|Continue|Control|ControlClick|ControlFocus|ControlGet|ControlGetFocus|ControlGetPos|ControlGetText|ControlMove|ControlSend|ControlSendRaw|ControlSetText|CoordMode|Critical|DetectHiddenText|DetectHiddenWindows|Drive|DriveGet|DriveSpaceFree|EnvAdd|EnvDiv|EnvGet|EnvMult|EnvSet|EnvSub|EnvUpdate|Exit|ExitApp|FileAppend|FileCopy|FileCopyDir|FileCreateDir|FileCreateShortcut|FileDelete|FileEncoding|FileGetAttrib|FileGetShortcut|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileMoveDir|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileRemoveDir|FileSelectFile|FileSelectFolder|FileSetAttrib|FileSetTime|FormatTime|GetKeyState|Gosub|Goto|GroupActivate|GroupAdd|GroupClose|GroupDeactivate|Gui|GuiControl|GuiControlGet|Hotkey|ImageSearch|IniDelete|IniRead|IniWrite|Input|InputBox|KeyWait|ListHotkeys|ListLines|ListVars|Loop|Menu|MouseClick|MouseClickDrag|MouseGetPos|MouseMove|MsgBox|OnExit|OutputDebug|Pause|PixelGetColor|PixelSearch|PostMessage|Process|Progress|Random|RegDelete|RegRead|RegWrite|Reload|Repeat|Return|Run|RunAs|RunWait|Send|SendEvent|SendInput|SendMessage|SendMode|SendPlay|SendRaw|SetBatchLines|SetCapslockState|SetControlDelay|SetDefaultMouseSpeed|SetEnv|SetFormat|SetKeyDelay|SetMouseDelay|SetNumlockState|SetRegView|SetScrollLockState|SetStoreCapslockMode|SetTimer|SetTitleMatchMode|SetWinDelay|SetWorkingDir|Shutdown|Sleep|Sort|SoundBeep|SoundGet|SoundGetWaveVolume|SoundPlay|SoundSet|SoundSetWaveVolume|SplashImage|SplashTextOff|SplashTextOn|SplitPath|StatusBarGetText|StatusBarWait|StringCaseSense|StringGetPos|StringLeft|StringLen|StringLower|StringMid|StringReplace|StringRight|StringSplit|StringTrimLeft|StringTrimRight|StringUpper|Suspend|SysGet|Thread|ToolTip|Transform|TrayTip|URLDownloadToFile|WinActivate|WinActivateBottom|WinClose|WinGet|WinGetActiveStats|WinGetActiveTitle|WinGetClass|WinGetPos|WinGetText|WinGetTitle|WinHide|WinKill|WinMaximize|WinMenuSelectItem|WinMinimize|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinRestore|WinSet|WinSetTitle|WinShow|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive)\b/i,
alias: "selector"
},
"constant": /\b(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_fileencoding|a_formatfloat|a_formatinteger|a_gui|a_guicontrol|a_guicontrolevent|a_guievent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_is64bitos|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_isunicode|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|a_priorkey|a_programfiles|a_programs|a_programscommon|a_ptrsize|a_regview|a_screendpi|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scripthwnd|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel|programfiles)\b/i,
"builtin": /\b(?:abs|acos|asc|asin|atan|ceil|chr|class|comobjactive|comobjarray|comobjconnect|comobjcreate|comobjerror|comobjflags|comobjget|comobjquery|comobjtype|comobjvalue|cos|dllcall|exp|fileexist|Fileopen|floor|format|il_add|il_create|il_destroy|instr|isfunc|islabel|IsObject|ln|log|ltrim|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|numget|numput|onmessage|regexmatch|regexreplace|registercallback|round|rtrim|sb_seticon|sb_setparts|sb_settext|sin|sqrt|strlen|strreplace|strsplit|substr|tan|tv_add|tv_delete|tv_get|tv_getchild|tv_getcount|tv_getnext|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist|__Call|__Get|__New|__Set)\b/i,
"symbol": /\b(?:alt|altdown|altup|appskey|backspace|browser_back|browser_favorites|browser_forward|browser_home|browser_refresh|browser_search|browser_stop|bs|capslock|ctrl|ctrlbreak|ctrldown|ctrlup|del|delete|down|end|enter|esc|escape|f1|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f2|f20|f21|f22|f23|f24|f3|f4|f5|f6|f7|f8|f9|home|ins|insert|joy1|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy2|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy3|joy30|joy31|joy32|joy4|joy5|joy6|joy7|joy8|joy9|joyaxes|joybuttons|joyinfo|joyname|joypov|joyr|joyu|joyv|joyx|joyy|joyz|lalt|launch_app1|launch_app2|launch_mail|launch_media|lbutton|lcontrol|lctrl|left|lshift|lwin|lwindown|lwinup|mbutton|media_next|media_play_pause|media_prev|media_stop|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadadd|numpadclear|numpaddel|numpaddiv|numpaddot|numpaddown|numpadend|numpadenter|numpadhome|numpadins|numpadleft|numpadmult|numpadpgdn|numpadpgup|numpadright|numpadsub|numpadup|pgdn|pgup|printscreen|ralt|rbutton|rcontrol|rctrl|right|rshift|rwin|rwindown|rwinup|scrolllock|shift|shiftdown|shiftup|space|tab|up|volume_down|volume_mute|volume_up|wheeldown|wheelleft|wheelright|wheelup|xbutton1|xbutton2)\b/i,
"directive": {
pattern: /#[a-z]+\b/i,
alias: "important"
},
"keyword": /\b(?:Abort|AboveNormal|Add|ahk_class|ahk_exe|ahk_group|ahk_id|ahk_pid|All|Alnum|Alpha|AltSubmit|AltTab|AltTabAndMenu|AltTabMenu|AltTabMenuDismiss|AlwaysOnTop|AutoSize|Background|BackgroundTrans|BelowNormal|between|BitAnd|BitNot|BitOr|BitShiftLeft|BitShiftRight|BitXOr|Bold|Border|Button|ByRef|Catch|Checkbox|Checked|CheckedGray|Choose|ChooseString|Close|Color|ComboBox|Contains|ControlList|Count|Date|DateTime|Days|DDL|Default|DeleteAll|Delimiter|Deref|Destroy|Digit|Disable|Disabled|DropDownList|Edit|Eject|Else|Enable|Enabled|Error|Exist|Expand|ExStyle|FileSystem|Finally|First|Flash|Float|FloatFast|Focus|Font|for|global|Grid|Group|GroupBox|GuiClose|GuiContextMenu|GuiDropFiles|GuiEscape|GuiSize|Hdr|Hidden|Hide|High|HKCC|HKCR|HKCU|HKEY_CLASSES_ROOT|HKEY_CURRENT_CONFIG|HKEY_CURRENT_USER|HKEY_LOCAL_MACHINE|HKEY_USERS|HKLM|HKU|Hours|HScroll|Icon|IconSmall|ID|IDLast|If|IfEqual|IfExist|IfGreater|IfGreaterOrEqual|IfInString|IfLess|IfLessOrEqual|IfMsgBox|IfNotEqual|IfNotExist|IfNotInString|IfWinActive|IfWinExist|IfWinNotActive|IfWinNotExist|Ignore|ImageList|in|Integer|IntegerFast|Interrupt|is|italic|Join|Label|LastFound|LastFoundExist|Limit|Lines|List|ListBox|ListView|local|Lock|Logoff|Low|Lower|Lowercase|MainWindow|Margin|Maximize|MaximizeBox|MaxSize|Minimize|MinimizeBox|MinMax|MinSize|Minutes|MonthCal|Mouse|Move|Multi|NA|No|NoActivate|NoDefault|NoHide|NoIcon|NoMainWindow|norm|Normal|NoSort|NoSortHdr|NoStandard|Not|NoTab|NoTimers|Number|Off|Ok|On|OwnDialogs|Owner|Parse|Password|Picture|Pixel|Pos|Pow|Priority|ProcessName|Radio|Range|Read|ReadOnly|Realtime|Redraw|Region|REG_BINARY|REG_DWORD|REG_EXPAND_SZ|REG_MULTI_SZ|REG_SZ|Relative|Rename|Report|Resize|Restore|Retry|RGB|Screen|Seconds|Section|Serial|SetLabel|ShiftAltTab|Show|Single|Slider|SortDesc|Standard|static|Status|StatusBar|StatusCD|strike|Style|Submit|SysMenu|Tab2|TabStop|Text|Theme|Throw|Tile|ToggleCheck|ToggleEnable|ToolWindow|Top|Topmost|TransColor|Transparent|Tray|TreeView|Try|TryAgain|Type|UnCheck|underline|Unicode|Unlock|Until|UpDown|Upper|Uppercase|UseErrorLevel|Vis|VisFirst|Visible|VScroll|Wait|WaitClose|WantCtrlA|WantF2|WantReturn|While|Wrap|Xdigit|xm|xp|xs|Yes|ym|yp|ys)\b/i,
"function": /[^(); \t,\n+*\-=?>:\\\/<&%\[\]]+(?=\()/,
"punctuation": /[{}[\]():,]/
};
Prism.languages.autoit = {
"comment": [
/;.*/,
{
pattern: /(^[\t ]*)#(?:comments-start|cs)[\s\S]*?^[ \t]*#(?:ce|comments-end)/m,
lookbehind: true
}
],
"url": {
pattern: /(^[\t ]*#include\s+)(?:<[^\r\n>]+>|"[^\r\n"]+")/m,
lookbehind: true
},
"string": {
pattern: /(["'])(?:\1\1|(?!\1)[^\r\n])*\1/,
greedy: true,
inside: {
"variable": /([%$@])\w+\1/
}
},
"directive": {
pattern: /(^[\t ]*)#[\w-]+/m,
lookbehind: true,
alias: "keyword"
},
"function": /\b\w+(?=\()/,
"variable": /[$@]\w+/,
"keyword": /\b(?:Case|Const|Continue(?:Case|Loop)|Default|Dim|Do|Else(?:If)?|End(?:Func|If|Select|Switch|With)|Enum|Exit(?:Loop)?|For|Func|Global|If|In|Local|Next|Null|ReDim|Select|Static|Step|Switch|Then|To|Until|Volatile|WEnd|While|With)\b/i,
"number": /\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,
"boolean": /\b(?:False|True)\b/i,
"operator": /<[=>]?|[-+*\/=&>]=?|[?^]|\b(?:And|Not|Or)\b/i,
"punctuation": /[\[\]().,:]/
};
(function(Prism2) {
function replace(pattern, replacements) {
return pattern.replace(/<<(\d+)>>/g, function(m, index) {
return replacements[+index];
});
}
function re(pattern, replacements, flags) {
return RegExp(replace(pattern, replacements), flags || "");
}
var types = /bool|clip|float|int|string|val/.source;
var internals = [
/is(?:bool|clip|float|int|string)|defined|(?:(?:internal)?function|var)?exists?/.source,
/apply|assert|default|eval|import|nop|select|undefined/.source,
/opt_(?:allowfloataudio|avipadscanlines|dwchannelmask|enable_(?:b64a|planartopackedrgb|v210|y3_10_10|y3_10_16)|usewaveextensible|vdubplanarhack)|set(?:cachemode|maxcpu|memorymax|planarlegacyalignment|workingdir)/.source,
/hex(?:value)?|value/.source,
/abs|ceil|continued(?:denominator|numerator)?|exp|floor|fmod|frac|log(?:10)?|max|min|muldiv|pi|pow|rand|round|sign|spline|sqrt/.source,
/a?sinh?|a?cosh?|a?tan[2h]?/.source,
/(?:bit(?:and|not|x?or|[lr]?shift[aslu]?|sh[lr]|sa[lr]|[lr]rotatel?|ro[rl]|te?st|set(?:count)?|cl(?:ea)?r|ch(?:an)?ge?))/.source,
/average(?:[bgr]|chroma[uv]|luma)|(?:[rgb]|chroma[uv]|luma|rgb|[yuv](?=difference(?:fromprevious|tonext)))difference(?:fromprevious|tonext)?|[yuvrgb]plane(?:median|min|max|minmaxdifference)/.source,
/getprocessinfo|logmsg|script(?:dir(?:utf8)?|file(?:utf8)?|name(?:utf8)?)|setlogparams/.source,
/chr|(?:fill|find|left|mid|replace|rev|right)str|format|[lu]case|ord|str(?:cmpi?|fromutf8|len|toutf8)|time|trim(?:all|left|right)/.source,
/isversionorgreater|version(?:number|string)/.source,
/buildpixeltype|colorspacenametopixeltype/.source,
/addautoloaddir|on(?:cpu|cuda)|prefetch|setfiltermtmode/.source
].join("|");
var properties = [
/has(?:audio|video)/.source,
/height|width/.source,
/frame(?:count|rate)|framerate(?:denominator|numerator)/.source,
/getparity|is(?:field|frame)based/.source,
/bitspercomponent|componentsize|hasalpha|is(?:planar(?:rgba?)?|interleaved|rgb(?:24|32|48|64)?|y(?:8|u(?:va?|y2))?|yv(?:12|16|24|411)|420|422|444|packedrgb)|numcomponents|pixeltype/.source,
/audio(?:bits|channels|duration|length(?:[fs]|hi|lo)?|rate)|isaudio(?:float|int)/.source
].join("|");
var filters = [
/avi(?:file)?source|directshowsource|image(?:reader|source|sourceanim)|opendmlsource|segmented(?:avisource|directshowsource)|wavsource/.source,
/coloryuv|convertbacktoyuy2|convertto(?:RGB(?:24|32|48|64)|(?:planar)?RGBA?|Y8?|YV(?:12|16|24|411)|YUVA?(?:411|420|422|444)|YUY2)|fixluminance|gr[ae]yscale|invert|levels|limiter|mergea?rgb|merge(?:chroma|luma)|rgbadjust|show(?:alpha|blue|green|red)|swapuv|tweak|[uv]toy8?|ytouv/.source,
/(?:colorkey|reset)mask|layer|mask(?:hs)?|merge|overlay|subtract/.source,
/addborders|(?:bicubic|bilinear|blackman|gauss|lanczos4|lanczos|point|sinc|spline(?:16|36|64))resize|crop(?:bottom)?|flip(?:horizontal|vertical)|(?:horizontal|vertical)?reduceby2|letterbox|skewrows|turn(?:180|left|right)/.source,
/blur|fixbrokenchromaupsampling|generalconvolution|(?:spatial|temporal)soften|sharpen/.source,
/trim|(?:un)?alignedsplice|(?:assume|assumescaled|change|convert)FPS|(?:delete|duplicate)frame|dissolve|fade(?:in|io|out)[02]?|freezeframe|interleave|loop|reverse|select(?:even|odd|(?:range)?every)/.source,
/assume[bt]ff|assume(?:field|frame)based|bob|complementparity|doubleweave|peculiarblend|pulldown|separate(?:columns|fields|rows)|swapfields|weave(?:columns|rows)?/.source,
/amplify(?:db)?|assumesamplerate|audiodub(?:ex)?|audiotrim|convertaudioto(?:(?:8|16|24|32)bit|float)|converttomono|delayaudio|ensurevbrmp3sync|get(?:left|right)?channel|kill(?:audio|video)|mergechannels|mixaudio|monotostereo|normalize|resampleaudio|ssrc|supereq|timestretch/.source,
/animate|applyrange|conditional(?:filter|reader|select)|frameevaluate|scriptclip|tcp(?:server|source)|writefile(?:end|if|start)?/.source,
/imagewriter/.source,
/blackness|blankclip|colorbars(?:hd)?|compare|dumpfiltergraph|echo|histogram|info|messageclip|preroll|setgraphanalysis|show(?:framenumber|smpte|time)|showfiveversions|stack(?:horizontal|vertical)|subtitle|tone|version/.source
].join("|");
var allinternals = [internals, properties, filters].join("|");
Prism2.languages.avisynth = {
"comment": [
{
pattern: /(^|[^\\])\[\*(?:[^\[*]|\[(?!\*)|\*(?!\])|\[\*(?:[^\[*]|\[(?!\*)|\*(?!\]))*\*\])*\*\]/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\$])#.*/,
lookbehind: true,
greedy: true
}
],
"argument": {
pattern: re(/\b(?:<<0>>)\s+("?)\w+\1/.source, [types], "i"),
inside: {
"keyword": /^\w+/
}
},
"argument-label": {
pattern: /([,(][\s\\]*)\w+\s*=(?!=)/,
lookbehind: true,
inside: {
"argument-name": {
pattern: /^\w+/,
alias: "punctuation"
},
"punctuation": /=$/
}
},
"string": [
{
pattern: /"""[\s\S]*?"""/,
greedy: true
},
{
pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
greedy: true,
inside: {
"constant": {
pattern: /\b(?:DEFAULT_MT_MODE|(?:MAINSCRIPT|PROGRAM|SCRIPT)DIR|(?:MACHINE|USER)_(?:CLASSIC|PLUS)_PLUGINS)\b/
}
}
}
],
"variable": /\b(?:last)\b/i,
"boolean": /\b(?:false|no|true|yes)\b/i,
"keyword": /\b(?:catch|else|for|function|global|if|return|try|while|__END__)\b/i,
"constant": /\bMT_(?:MULTI_INSTANCE|NICE_FILTER|SERIALIZED|SPECIAL_MT)\b/,
"builtin-function": {
pattern: re(/\b(?:<<0>>)\b/.source, [allinternals], "i"),
alias: "function"
},
"type-cast": {
pattern: re(/\b(?:<<0>>)(?=\s*\()/.source, [types], "i"),
alias: "keyword"
},
"function": {
pattern: /\b[a-z_]\w*(?=\s*\()|(\.)[a-z_]\w*\b/i,
lookbehind: true
},
"line-continuation": {
pattern: /(^[ \t]*)\\|\\(?=[ \t]*$)/m,
lookbehind: true,
alias: "punctuation"
},
"number": /\B\$(?:[\da-f]{6}|[\da-f]{8})\b|(?:(?:\b|\B-)\d+(?:\.\d*)?\b|\B\.\d+\b)/i,
"operator": /\+\+?|[!=<>]=?|&&|\|\||[?:*/%-]/,
"punctuation": /[{}\[\]();,.]/
};
Prism2.languages.avs = Prism2.languages.avisynth;
})(Prism);
Prism.languages["avro-idl"] = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
greedy: true
},
"string": {
pattern: /(^|[^\\])"(?:[^\r\n"\\]|\\.)*"/,
lookbehind: true,
greedy: true
},
"annotation": {
pattern: /@(?:[$\w.-]|`[^\r\n`]+`)+/,
greedy: true,
alias: "function"
},
"function-identifier": {
pattern: /`[^\r\n`]+`(?=\s*\()/,
greedy: true,
alias: "function"
},
"identifier": {
pattern: /`[^\r\n`]+`/,
greedy: true
},
"class-name": {
pattern: /(\b(?:enum|error|protocol|record|throws)\b\s+)[$\w]+/,
lookbehind: true,
greedy: true
},
"keyword": /\b(?:array|boolean|bytes|date|decimal|double|enum|error|false|fixed|float|idl|import|int|local_timestamp_ms|long|map|null|oneway|protocol|record|schema|string|throws|time_ms|timestamp_ms|true|union|uuid|void)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"number": [
{
pattern: /(^|[^\w.])-?(?:(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|0x(?:[a-f0-9]+(?:\.[a-f0-9]*)?|\.[a-f0-9]+)(?:p[+-]?\d+)?)[dfl]?(?![\w.])/i,
lookbehind: true
},
/-?\b(?:Infinity|NaN)\b/
],
"operator": /=/,
"punctuation": /[()\[\]{}<>.:,;-]/
};
Prism.languages.avdl = Prism.languages["avro-idl"];
Prism.languages.awk = {
"hashbang": {
pattern: /^#!.*/,
greedy: true,
alias: "comment"
},
"comment": {
pattern: /#.*/,
greedy: true
},
"string": {
pattern: /(^|[^\\])"(?:[^\\"\r\n]|\\.)*"/,
lookbehind: true,
greedy: true
},
"regex": {
pattern: /((?:^|[^\w\s)])\s*)\/(?:[^\/\\\r\n]|\\.)*\//,
lookbehind: true,
greedy: true
},
"variable": /\$\w+/,
"keyword": /\b(?:BEGIN|BEGINFILE|END|ENDFILE|break|case|continue|default|delete|do|else|exit|for|function|getline|if|in|next|nextfile|printf?|return|switch|while)\b|@(?:include|load)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"number": /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[a-fA-F0-9]+)\b/,
"operator": /--|\+\+|!?~|>&|>>|<<|(?:\*\*|[<>!=+\-*/%^])=?|&&|\|[|&]|[?:]/,
"punctuation": /[()[\]{},;]/
};
Prism.languages.gawk = Prism.languages.awk;
(function(Prism2) {
var envVars = "\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b";
var commandAfterHeredoc = {
pattern: /(^(["']?)\w+\2)[ \t]+\S.*/,
lookbehind: true,
alias: "punctuation",
inside: null
};
var insideString = {
"bash": commandAfterHeredoc,
"environment": {
pattern: RegExp("\\$" + envVars),
alias: "constant"
},
"variable": [
{
pattern: /\$?\(\([\s\S]+?\)\)/,
greedy: true,
inside: {
"variable": [
{
pattern: /(^\$\(\([\s\S]+)\)\)/,
lookbehind: true
},
/^\$\(\(/
],
"number": /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,
"operator": /--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,
"punctuation": /\(\(?|\)\)?|,|;/
}
},
{
pattern: /\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,
greedy: true,
inside: {
"variable": /^\$\(|^`|\)$|`$/
}
},
{
pattern: /\$\{[^}]+\}/,
greedy: true,
inside: {
"operator": /:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,
"punctuation": /[\[\]]/,
"environment": {
pattern: RegExp("(\\{)" + envVars),
lookbehind: true,
alias: "constant"
}
}
},
/\$(?:\w+|[#?*!@$])/
],
"entity": /\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/
};
Prism2.languages.bash = {
"shebang": {
pattern: /^#!\s*\/.*/,
alias: "important"
},
"comment": {
pattern: /(^|[^"{\\$])#.*/,
lookbehind: true
},
"function-name": [
{
pattern: /(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,
lookbehind: true,
alias: "function"
},
{
pattern: /\b[\w-]+(?=\s*\(\s*\)\s*\{)/,
alias: "function"
}
],
"for-or-select": {
pattern: /(\b(?:for|select)\s+)\w+(?=\s+in\s)/,
alias: "variable",
lookbehind: true
},
"assign-left": {
pattern: /(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,
inside: {
"environment": {
pattern: RegExp("(^|[\\s;|&]|[<>]\\()" + envVars),
lookbehind: true,
alias: "constant"
}
},
alias: "variable",
lookbehind: true
},
"string": [
{
pattern: /((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,
lookbehind: true,
greedy: true,
inside: insideString
},
{
pattern: /((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,
lookbehind: true,
greedy: true,
inside: {
"bash": commandAfterHeredoc
}
},
{
pattern: /(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,
lookbehind: true,
greedy: true,
inside: insideString
},
{
pattern: /(^|[^$\\])'[^']*'/,
lookbehind: true,
greedy: true
},
{
pattern: /\$'(?:[^'\\]|\\[\s\S])*'/,
greedy: true,
inside: {
"entity": insideString.entity
}
}
],
"environment": {
pattern: RegExp("\\$?" + envVars),
alias: "constant"
},
"variable": insideString.variable,
"function": {
pattern: /(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,
lookbehind: true
},
"keyword": {
pattern: /(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,
lookbehind: true
},
"builtin": {
pattern: /(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,
lookbehind: true,
alias: "class-name"
},
"boolean": {
pattern: /(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,
lookbehind: true
},
"file-descriptor": {
pattern: /\B&\d\b/,
alias: "important"
},
"operator": {
pattern: /\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,
inside: {
"file-descriptor": {
pattern: /^\d/,
alias: "important"
}
}
},
"punctuation": /\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,
"number": {
pattern: /(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,
lookbehind: true
}
};
commandAfterHeredoc.inside = Prism2.languages.bash;
var toBeCopied = [
"comment",
"function-name",
"for-or-select",
"assign-left",
"string",
"environment",
"function",
"keyword",
"builtin",
"boolean",
"file-descriptor",
"operator",
"punctuation",
"number"
];
var inside = insideString.variable[1].inside;
for (var i = 0; i < toBeCopied.length; i++) {
inside[toBeCopied[i]] = Prism2.languages.bash[toBeCopied[i]];
}
Prism2.languages.shell = Prism2.languages.bash;
})(Prism);
Prism.languages.basic = {
"comment": {
pattern: /(?:!|REM\b).+/i,
inside: {
"keyword": /^REM/i
}
},
"string": {
pattern: /"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,
greedy: true
},
"number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
"keyword": /\b(?:AS|BEEP|BLOAD|BSAVE|CALL(?: ABSOLUTE)?|CASE|CHAIN|CHDIR|CLEAR|CLOSE|CLS|COM|COMMON|CONST|DATA|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DIM|DO|DOUBLE|ELSE|ELSEIF|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|FUNCTION|GET|GOSUB|GOTO|IF|INPUT|INTEGER|IOCTL|KEY|KILL|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|MKDIR|NAME|NEXT|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPTION BASE|OUT|POKE|PUT|READ|REDIM|REM|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SELECT CASE|SHARED|SHELL|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|SUB|SWAP|SYSTEM|THEN|TIMER|TO|TROFF|TRON|TYPE|UNLOCK|UNTIL|USING|VIEW PRINT|WAIT|WEND|WHILE|WRITE)(?:\$|\b)/i,
"function": /\b(?:ABS|ACCESS|ACOS|ANGLE|AREA|ARITHMETIC|ARRAY|ASIN|ASK|AT|ATN|BASE|BEGIN|BREAK|CAUSE|CEIL|CHR|CLIP|COLLATE|COLOR|CON|COS|COSH|COT|CSC|DATE|DATUM|DEBUG|DECIMAL|DEF|DEG|DEGREES|DELETE|DET|DEVICE|DISPLAY|DOT|ELAPSED|EPS|ERASABLE|EXLINE|EXP|EXTERNAL|EXTYPE|FILETYPE|FIXED|FP|GO|GRAPH|HANDLER|IDN|IMAGE|IN|INT|INTERNAL|IP|IS|KEYED|LBOUND|LCASE|LEFT|LEN|LENGTH|LET|LINE|LINES|LOG|LOG10|LOG2|LTRIM|MARGIN|MAT|MAX|MAXNUM|MID|MIN|MISSING|MOD|NATIVE|NUL|NUMERIC|OF|OPTION|ORD|ORGANIZATION|OUTIN|OUTPUT|PI|POINT|POINTER|POINTS|POS|PRINT|PROGRAM|PROMPT|RAD|RADIANS|RANDOMIZE|RECORD|RECSIZE|RECTYPE|RELATIVE|REMAINDER|REPEAT|REST|RETRY|REWRITE|RIGHT|RND|ROUND|RTRIM|SAME|SEC|SELECT|SEQUENTIAL|SET|SETTER|SGN|SIN|SINH|SIZE|SKIP|SQR|STANDARD|STATUS|STR|STREAM|STYLE|TAB|TAN|TANH|TEMPLATE|TEXT|THERE|TIME|TIMEOUT|TRACE|TRANSFORM|TRUNCATE|UBOUND|UCASE|USE|VAL|VARIABLE|VIEWPORT|WHEN|WINDOW|WITH|ZER|ZONEWIDTH)(?:\$|\b)/i,
"operator": /<[=>]?|>=?|[+\-*\/^=&]|\b(?:AND|EQV|IMP|NOT|OR|XOR)\b/i,
"punctuation": /[,;:()]/
};
(function(Prism2) {
var variable = /%%?[~:\w]+%?|!\S+!/;
var parameter = {
pattern: /\/[a-z?]+(?=[ :]|$):?|-[a-z]\b|--[a-z-]+\b/im,
alias: "attr-name",
inside: {
"punctuation": /:/
}
};
var string = /"(?:[\\"]"|[^"])*"(?!")/;
var number = /(?:\b|-)\d+\b/;
Prism2.languages.batch = {
"comment": [
/^::.*/m,
{
pattern: /((?:^|[&(])[ \t]*)rem\b(?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,
lookbehind: true
}
],
"label": {
pattern: /^:.*/m,
alias: "property"
},
"command": [
{
pattern: /((?:^|[&(])[ \t]*)for(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* \S+ in \([^)]+\) do/im,
lookbehind: true,
inside: {
"keyword": /\b(?:do|in)\b|^for\b/i,
"string": string,
"parameter": parameter,
"variable": variable,
"number": number,
"punctuation": /[()',]/
}
},
{
pattern: /((?:^|[&(])[ \t]*)if(?: \/[a-z?](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:not )?(?:cmdextversion \d+|defined \w+|errorlevel \d+|exist \S+|(?:"[^"]*"|(?!")(?:(?!==)\S)+)?(?:==| (?:equ|geq|gtr|leq|lss|neq) )(?:"[^"]*"|[^\s"]\S*))/im,
lookbehind: true,
inside: {
"keyword": /\b(?:cmdextversion|defined|errorlevel|exist|not)\b|^if\b/i,
"string": string,
"parameter": parameter,
"variable": variable,
"number": number,
"operator": /\^|==|\b(?:equ|geq|gtr|leq|lss|neq)\b/i
}
},
{
pattern: /((?:^|[&()])[ \t]*)else\b/im,
lookbehind: true,
inside: {
"keyword": /^else\b/i
}
},
{
pattern: /((?:^|[&(])[ \t]*)set(?: \/[a-z](?:[ :](?:"[^"]*"|[^\s"/]\S*))?)* (?:[^^&)\r\n]|\^(?:\r\n|[\s\S]))*/im,
lookbehind: true,
inside: {
"keyword": /^set\b/i,
"string": string,
"parameter": parameter,
"variable": [
variable,
/\w+(?=(?:[*\/%+\-&^|]|<<|>>)?=)/
],
"number": number,
"operator": /[*\/%+\-&^|]=?|<<=?|>>=?|[!~_=]/,
"punctuation": /[()',]/
}
},
{
pattern: /((?:^|[&(])[ \t]*@?)\w+\b(?:"(?:[\\"]"|[^"])*"(?!")|[^"^&)\r\n]|\^(?:\r\n|[\s\S]))*/m,
lookbehind: true,
inside: {
"keyword": /^\w+\b/,
"string": string,
"parameter": parameter,
"label": {
pattern: /(^\s*):\S+/m,
lookbehind: true,
alias: "property"
},
"variable": variable,
"number": number,
"operator": /\^/
}
}
],
"operator": /[&@]/,
"punctuation": /[()']/
};
})(Prism);
Prism.languages.bbcode = {
"tag": {
pattern: /\[\/?[^\s=\]]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))?(?:\s+[^\s=\]]+\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+))*\s*\]/,
inside: {
"tag": {
pattern: /^\[\/?[^\s=\]]+/,
inside: {
"punctuation": /^\[\/?/
}
},
"attr-value": {
pattern: /=\s*(?:"[^"]*"|'[^']*'|[^\s'"\]=]+)/,
inside: {
"punctuation": [
/^=/,
{
pattern: /^(\s*)["']|["']$/,
lookbehind: true
}
]
}
},
"punctuation": /\]/,
"attr-name": /[^\s=\]]+/
}
}
};
Prism.languages.shortcode = Prism.languages.bbcode;
Prism.languages.bicep = {
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"property": [
{
pattern: /([\r\n][ \t]*)[a-z_]\w*(?=[ \t]*:)/i,
lookbehind: true
},
{
pattern: /([\r\n][ \t]*)'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'(?=[ \t]*:)/,
lookbehind: true,
greedy: true
}
],
"string": [
{
pattern: /'''[^'][\s\S]*?'''/,
greedy: true
},
{
pattern: /(^|[^\\'])'(?:\\.|\$(?!\{)|[^'\\\r\n$])*'/,
lookbehind: true,
greedy: true
}
],
"interpolated-string": {
pattern: /(^|[^\\'])'(?:\\.|\$(?:(?!\{)|\{[^{}\r\n]*\})|[^'\\\r\n$])*'/,
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: /\$\{[^{}\r\n]*\}/,
inside: {
"expression": {
pattern: /(^\$\{)[\s\S]+(?=\}$)/,
lookbehind: true
},
"punctuation": /^\$\{|\}$/
}
},
"string": /[\s\S]+/
}
},
"datatype": {
pattern: /(\b(?:output|param)\b[ \t]+\w+[ \t]+)\w+\b/,
lookbehind: true,
alias: "class-name"
},
"boolean": /\b(?:false|true)\b/,
"keyword": /\b(?:existing|for|if|in|module|null|output|param|resource|targetScope|var)\b/,
"decorator": /@\w+\b/,
"function": /\b[a-z_]\w*(?=[ \t]*\()/i,
"number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
"operator": /--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.bicep["interpolated-string"].inside["interpolation"].inside["expression"].inside = Prism.languages.bicep;
Prism.languages.birb = Prism.languages.extend("clike", {
"string": {
pattern: /r?("|')(?:\\.|(?!\1)[^\\])*\1/,
greedy: true
},
"class-name": [
/\b[A-Z](?:[\d_]*[a-zA-Z]\w*)?\b/,
/\b(?:[A-Z]\w*|(?!(?:var|void)\b)[a-z]\w*)(?=\s+\w+\s*[;,=()])/
],
"keyword": /\b(?:assert|break|case|class|const|default|else|enum|final|follows|for|grab|if|nest|new|next|noSeeb|return|static|switch|throw|var|void|while)\b/,
"operator": /\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?|:/,
"variable": /\b[a-z_]\w*\b/
});
Prism.languages.insertBefore("birb", "function", {
"metadata": {
pattern: /<\w+>/,
greedy: true,
alias: "symbol"
}
});
Prism.languages.bison = Prism.languages.extend("c", {});
Prism.languages.insertBefore("bison", "comment", {
"bison": {
pattern: /^(?:[^%]|%(?!%))*%%[\s\S]*?%%/,
inside: {
"c": {
pattern: /%\{[\s\S]*?%\}|\{(?:\{[^}]*\}|[^{}])*\}/,
inside: {
"delimiter": {
pattern: /^%?\{|%?\}$/,
alias: "punctuation"
},
"bison-variable": {
pattern: /[$@](?:<[^\s>]+>)?[\w$]+/,
alias: "variable",
inside: {
"punctuation": /<|>/
}
},
rest: Prism.languages.c
}
},
"comment": Prism.languages.c.comment,
"string": Prism.languages.c.string,
"property": /\S+(?=:)/,
"keyword": /%\w+/,
"number": {
pattern: /(^|[^@])\b(?:0x[\da-f]+|\d+)/i,
lookbehind: true
},
"punctuation": /%[%?]|[|:;\[\]<>]/
}
}
});
Prism.languages.bnf = {
"string": {
pattern: /"[^\r\n"]*"|'[^\r\n']*'/
},
"definition": {
pattern: /<[^<>\r\n\t]+>(?=\s*::=)/,
alias: ["rule", "keyword"],
inside: {
"punctuation": /^<|>$/
}
},
"rule": {
pattern: /<[^<>\r\n\t]+>/,
inside: {
"punctuation": /^<|>$/
}
},
"operator": /::=|[|()[\]{}*+?]|\.{3}/
};
Prism.languages.rbnf = Prism.languages.bnf;
Prism.languages.brainfuck = {
"pointer": {
pattern: /<|>/,
alias: "keyword"
},
"increment": {
pattern: /\+/,
alias: "inserted"
},
"decrement": {
pattern: /-/,
alias: "deleted"
},
"branching": {
pattern: /\[|\]/,
alias: "important"
},
"operator": /[.,]/,
"comment": /\S+/
};
Prism.languages.brightscript = {
"comment": /(?:\brem|').*/i,
"directive-statement": {
pattern: /(^[\t ]*)#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if).*/im,
lookbehind: true,
alias: "property",
inside: {
"error-message": {
pattern: /(^#error).+/,
lookbehind: true
},
"directive": {
pattern: /^#(?:const|else(?:[\t ]+if)?|end[\t ]+if|error|if)/,
alias: "keyword"
},
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
},
"property": {
pattern: /([\r\n{,][\t ]*)(?:(?!\d)\w+|"(?:[^"\r\n]|"")*"(?!"))(?=[ \t]*:)/,
lookbehind: true,
greedy: true
},
"string": {
pattern: /"(?:[^"\r\n]|"")*"(?!")/,
greedy: true
},
"class-name": {
pattern: /(\bAs[\t ]+)\w+/i,
lookbehind: true
},
"keyword": /\b(?:As|Dim|Each|Else|Elseif|End|Exit|For|Function|Goto|If|In|Print|Return|Step|Stop|Sub|Then|To|While)\b/i,
"boolean": /\b(?:false|true)\b/i,
"function": /\b(?!\d)\w+(?=[\t ]*\()/,
"number": /(?:\b\d+(?:\.\d+)?(?:[ed][+-]\d+)?|&h[a-f\d]+)\b[%&!#]?/i,
"operator": /--|\+\+|>>=?|<<=?|<>|[-+*/\\<>]=?|[:^=?]|\b(?:and|mod|not|or)\b/i,
"punctuation": /[.,;()[\]{}]/,
"constant": /\b(?:LINE_NUM)\b/i
};
Prism.languages.brightscript["directive-statement"].inside.expression.inside = Prism.languages.brightscript;
Prism.languages.bro = {
"comment": {
pattern: /(^|[^\\$])#.*/,
lookbehind: true,
inside: {
"italic": /\b(?:FIXME|TODO|XXX)\b/
}
},
"string": {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"boolean": /\b[TF]\b/,
"function": {
pattern: /(\b(?:event|function|hook)[ \t]+)\w+(?:::\w+)?/,
lookbehind: true
},
"builtin": /(?:@(?:load(?:-(?:plugin|sigs))?|unload|prefixes|ifn?def|else|(?:end)?if|DIR|FILENAME))|(?:&?(?:add_func|create_expire|default|delete_func|encrypt|error_handler|expire_func|group|log|mergeable|optional|persistent|priority|raw_output|read_expire|redef|rotate_interval|rotate_size|synchronized|type_column|write_expire))/,
"constant": {
pattern: /(\bconst[ \t]+)\w+/i,
lookbehind: true
},
"keyword": /\b(?:add|addr|alarm|any|bool|break|const|continue|count|delete|double|else|enum|event|export|file|for|function|global|hook|if|in|int|interval|local|module|next|of|opaque|pattern|port|print|record|return|schedule|set|string|subnet|table|time|timeout|using|vector|when)\b/,
"operator": /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&|\|\|?|\?|\*|\/|~|\^|%/,
"number": /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.bsl = {
"comment": /\/\/.*/,
"string": [
{
pattern: /"(?:[^"]|"")*"(?!")/,
greedy: true
},
{
pattern: /'(?:[^'\r\n\\]|\\.)*'/
}
],
"keyword": [
{
pattern: /(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:пока|для|новый|прервать|попытка|исключение|вызватьисключение|иначе|конецпопытки|неопределено|функция|перем|возврат|конецфункции|если|иначеесли|процедура|конецпроцедуры|тогда|знач|экспорт|конецесли|из|каждого|истина|ложь|по|цикл|конеццикла|выполнить)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,
lookbehind: true
},
{
pattern: /\b(?:break|do|each|else|elseif|enddo|endfunction|endif|endprocedure|endtry|except|execute|export|false|for|function|if|in|new|null|procedure|raise|return|then|to|true|try|undefined|val|var|while)\b/i
}
],
"number": {
pattern: /(^(?=\d)|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:\d+(?:\.\d*)?|\.\d+)(?:E[+-]?\d+)?/i,
lookbehind: true
},
"operator": [
/[<>+\-*/]=?|[%=]/,
{
pattern: /(^|[^\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])(?:и|или|не)(?![\w\u0400-\u0484\u0487-\u052f\u1d2b\u1d78\u2de0-\u2dff\ua640-\ua69f\ufe2e\ufe2f])/i,
lookbehind: true
},
{
pattern: /\b(?:and|not|or)\b/i
}
],
"punctuation": /\(\.|\.\)|[()\[\]:;,.]/,
"directive": [
{
pattern: /^([ \t]*)&.*/m,
lookbehind: true,
greedy: true,
alias: "important"
},
{
pattern: /^([ \t]*)#.*/gm,
lookbehind: true,
greedy: true,
alias: "important"
}
]
};
Prism.languages.oscript = Prism.languages["bsl"];
Prism.languages.cfscript = Prism.languages.extend("clike", {
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
lookbehind: true,
inside: {
"annotation": {
pattern: /(?:^|[^.])@[\w\.]+/,
alias: "punctuation"
}
}
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"keyword": /\b(?:abstract|break|catch|component|continue|default|do|else|extends|final|finally|for|function|if|in|include|package|private|property|public|remote|required|rethrow|return|static|switch|throw|try|var|while|xml)\b(?!\s*=)/,
"operator": [
/\+\+|--|&&|\|\||::|=>|[!=]==|[-+*/%&|^!=<>]=?|\?(?:\.|:)?|:/,
/\b(?:and|contains|eq|equal|eqv|gt|gte|imp|is|lt|lte|mod|not|or|xor)\b/
],
"scope": {
pattern: /\b(?:application|arguments|cgi|client|cookie|local|session|super|this|variables)\b/,
alias: "global"
},
"type": {
pattern: /\b(?:any|array|binary|boolean|date|guid|numeric|query|string|struct|uuid|void|xml)\b/,
alias: "builtin"
}
});
Prism.languages.insertBefore("cfscript", "keyword", {
"function-variable": {
pattern: /[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,
alias: "function"
}
});
delete Prism.languages.cfscript["class-name"];
Prism.languages.cfc = Prism.languages["cfscript"];
Prism.languages.chaiscript = Prism.languages.extend("clike", {
"string": {
pattern: /(^|[^\\])'(?:[^'\\]|\\[\s\S])*'/,
lookbehind: true,
greedy: true
},
"class-name": [
{
pattern: /(\bclass\s+)\w+/,
lookbehind: true
},
{
pattern: /(\b(?:attr|def)\s+)\w+(?=\s*::)/,
lookbehind: true
}
],
"keyword": /\b(?:attr|auto|break|case|catch|class|continue|def|default|else|finally|for|fun|global|if|return|switch|this|try|var|while)\b/,
"number": [
Prism.languages.cpp.number,
/\b(?:Infinity|NaN)\b/
],
"operator": />>=?|<<=?|\|\||&&|:[:=]?|--|\+\+|[=!<>+\-*/%|&^]=?|[?~]|`[^`\r\n]{1,4}`/
});
Prism.languages.insertBefore("chaiscript", "operator", {
"parameter-type": {
pattern: /([,(]\s*)\w+(?=\s+\w)/,
lookbehind: true,
alias: "class-name"
}
});
Prism.languages.insertBefore("chaiscript", "string", {
"string-interpolation": {
pattern: /(^|[^\\])"(?:[^"$\\]|\\[\s\S]|\$(?!\{)|\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*"/,
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\}/,
lookbehind: true,
inside: {
"interpolation-expression": {
pattern: /(^\$\{)[\s\S]+(?=\}$)/,
lookbehind: true,
inside: Prism.languages.chaiscript
},
"interpolation-punctuation": {
pattern: /^\$\{|\}$/,
alias: "punctuation"
}
}
},
"string": /[\s\S]+/
}
}
});
Prism.languages.cil = {
"comment": /\/\/.*/,
"string": {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"directive": {
pattern: /(^|\W)\.[a-z]+(?=\s)/,
lookbehind: true,
alias: "class-name"
},
"variable": /\[[\w\.]+\]/,
"keyword": /\b(?:abstract|ansi|assembly|auto|autochar|beforefieldinit|bool|bstr|byvalstr|catch|char|cil|class|currency|date|decimal|default|enum|error|explicit|extends|extern|famandassem|family|famorassem|final(?:ly)?|float32|float64|hidebysig|u?int(?:8|16|32|64)?|iant|idispatch|implements|import|initonly|instance|interface|iunknown|literal|lpstr|lpstruct|lptstr|lpwstr|managed|method|native(?:Type)?|nested|newslot|object(?:ref)?|pinvokeimpl|private|privatescope|public|reqsecobj|rtspecialname|runtime|sealed|sequential|serializable|specialname|static|string|struct|syschar|tbstr|unicode|unmanagedexp|unsigned|value(?:type)?|variant|virtual|void)\b/,
"function": /\b(?:(?:constrained|no|readonly|tail|unaligned|volatile)\.)?(?:conv\.(?:[iu][1248]?|ovf\.[iu][1248]?(?:\.un)?|r\.un|r4|r8)|ldc\.(?:i4(?:\.\d+|\.[mM]1|\.s)?|i8|r4|r8)|ldelem(?:\.[iu][1248]?|\.r[48]|\.ref|a)?|ldind\.(?:[iu][1248]?|r[48]|ref)|stelem\.?(?:i[1248]?|r[48]|ref)?|stind\.(?:i[1248]?|r[48]|ref)?|end(?:fault|filter|finally)|ldarg(?:\.[0-3s]|a(?:\.s)?)?|ldloc(?:\.\d+|\.s)?|sub(?:\.ovf(?:\.un)?)?|mul(?:\.ovf(?:\.un)?)?|add(?:\.ovf(?:\.un)?)?|stloc(?:\.[0-3s])?|refany(?:type|val)|blt(?:\.un)?(?:\.s)?|ble(?:\.un)?(?:\.s)?|bgt(?:\.un)?(?:\.s)?|bge(?:\.un)?(?:\.s)?|unbox(?:\.any)?|init(?:blk|obj)|call(?:i|virt)?|brfalse(?:\.s)?|bne\.un(?:\.s)?|ldloca(?:\.s)?|brzero(?:\.s)?|brtrue(?:\.s)?|brnull(?:\.s)?|brinst(?:\.s)?|starg(?:\.s)?|leave(?:\.s)?|shr(?:\.un)?|rem(?:\.un)?|div(?:\.un)?|clt(?:\.un)?|alignment|castclass|ldvirtftn|beq(?:\.s)?|ckfinite|ldsflda|ldtoken|localloc|mkrefany|rethrow|cgt\.un|arglist|switch|stsfld|sizeof|newobj|newarr|ldsfld|ldnull|ldflda|isinst|throw|stobj|stfld|ldstr|ldobj|ldlen|ldftn|ldfld|cpobj|cpblk|break|br\.s|xor|shl|ret|pop|not|nop|neg|jmp|dup|cgt|ceq|box|and|or|br)\b/,
"boolean": /\b(?:false|true)\b/,
"number": /\b-?(?:0x[0-9a-f]+|\d+)(?:\.[0-9a-f]+)?\b/i,
"punctuation": /[{}[\];(),:=]|IL_[0-9A-Za-z]+/
};
Prism.languages.clojure = {
"comment": {
pattern: /;.*/,
greedy: true
},
"string": {
pattern: /"(?:[^"\\]|\\.)*"/,
greedy: true
},
"char": /\\\w+/,
"symbol": {
pattern: /(^|[\s()\[\]{},])::?[\w*+!?'<>=/.-]+/,
lookbehind: true
},
"keyword": {
pattern: /(\()(?:-|->|->>|\.|\.\.|\*|\/|\+|<|<=|=|==|>|>=|accessor|agent|agent-errors|aget|alength|all-ns|alter|and|append-child|apply|array-map|aset|aset-boolean|aset-byte|aset-char|aset-double|aset-float|aset-int|aset-long|aset-short|assert|assoc|await|await-for|bean|binding|bit-and|bit-not|bit-or|bit-shift-left|bit-shift-right|bit-xor|boolean|branch\?|butlast|byte|cast|char|children|class|clear-agent-errors|comment|commute|comp|comparator|complement|concat|cond|conj|cons|constantly|construct-proxy|contains\?|count|create-ns|create-struct|cycle|dec|declare|def|def-|definline|definterface|defmacro|defmethod|defmulti|defn|defn-|defonce|defproject|defprotocol|defrecord|defstruct|deftype|deref|difference|disj|dissoc|distinct|do|doall|doc|dorun|doseq|dosync|dotimes|doto|double|down|drop|drop-while|edit|end\?|ensure|eval|every\?|false\?|ffirst|file-seq|filter|find|find-doc|find-ns|find-var|first|float|flush|fn|fnseq|for|frest|gensym|get|get-proxy-class|hash-map|hash-set|identical\?|identity|if|if-let|if-not|import|in-ns|inc|index|insert-child|insert-left|insert-right|inspect-table|inspect-tree|instance\?|int|interleave|intersection|into|into-array|iterate|join|key|keys|keyword|keyword\?|last|lazy-cat|lazy-cons|left|lefts|let|line-seq|list|list\*|load|load-file|locking|long|loop|macroexpand|macroexpand-1|make-array|make-node|map|map-invert|map\?|mapcat|max|max-key|memfn|merge|merge-with|meta|min|min-key|monitor-enter|name|namespace|neg\?|new|newline|next|nil\?|node|not|not-any\?|not-every\?|not=|ns|ns-imports|ns-interns|ns-map|ns-name|ns-publics|ns-refers|ns-resolve|ns-unmap|nth|nthrest|or|parse|partial|path|peek|pop|pos\?|pr|pr-str|print|print-str|println|println-str|prn|prn-str|project|proxy|proxy-mappings|quot|quote|rand|rand-int|range|re-find|re-groups|re-matcher|re-matches|re-pattern|re-seq|read|read-line|recur|reduce|ref|ref-set|refer|rem|remove|remove-method|remove-ns|rename|rename-keys|repeat|replace|replicate|resolve|rest|resultset-seq|reverse|rfirst|right|rights|root|rrest|rseq|second|select|select-keys|send|send-off|seq|seq-zip|seq\?|set|set!|short|slurp|some|sort|sort-by|sorted-map|sorted-map-by|sorted-set|special-symbol\?|split-at|split-with|str|string\?|struct|struct-map|subs|subvec|symbol|symbol\?|sync|take|take-nth|take-while|test|throw|time|to-array|to-array-2d|tree-seq|true\?|try|union|up|update-proxy|val|vals|var|var-get|var-set|var\?|vector|vector-zip|vector\?|when|when-first|when-let|when-not|with-local-vars|with-meta|with-open|with-out-str|xml-seq|xml-zip|zero\?|zipmap|zipper)(?=[\s)]|$)/,
lookbehind: true
},
"boolean": /\b(?:false|nil|true)\b/,
"number": {
pattern: /(^|[^\w$@])(?:\d+(?:[/.]\d+)?(?:e[+-]?\d+)?|0x[a-f0-9]+|[1-9]\d?r[a-z0-9]+)[lmn]?(?![\w$@])/i,
lookbehind: true
},
"function": {
pattern: /((?:^|[^'])\()[\w*+!?'<>=/.-]+(?=[\s)]|$)/,
lookbehind: true
},
"operator": /[#@^`~]/,
"punctuation": /[{}\[\](),]/
};
Prism.languages.cmake = {
"comment": /#.*/,
"string": {
pattern: /"(?:[^\\"]|\\.)*"/,
greedy: true,
inside: {
"interpolation": {
pattern: /\$\{(?:[^{}$]|\$\{[^{}$]*\})*\}/,
inside: {
"punctuation": /\$\{|\}/,
"variable": /\w+/
}
}
}
},
"variable": /\b(?:CMAKE_\w+|\w+_(?:(?:BINARY|SOURCE)_DIR|DESCRIPTION|HOMEPAGE_URL|ROOT|VERSION(?:_MAJOR|_MINOR|_PATCH|_TWEAK)?)|(?:ANDROID|APPLE|BORLAND|BUILD_SHARED_LIBS|CACHE|CPACK_(?:ABSOLUTE_DESTINATION_FILES|COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY|ERROR_ON_ABSOLUTE_INSTALL_DESTINATION|INCLUDE_TOPLEVEL_DIRECTORY|INSTALL_DEFAULT_DIRECTORY_PERMISSIONS|INSTALL_SCRIPT|PACKAGING_INSTALL_PREFIX|SET_DESTDIR|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|CTEST_(?:BINARY_DIRECTORY|BUILD_COMMAND|BUILD_NAME|BZR_COMMAND|BZR_UPDATE_OPTIONS|CHANGE_ID|CHECKOUT_COMMAND|CONFIGURATION_TYPE|CONFIGURE_COMMAND|COVERAGE_COMMAND|COVERAGE_EXTRA_FLAGS|CURL_OPTIONS|CUSTOM_(?:COVERAGE_EXCLUDE|ERROR_EXCEPTION|ERROR_MATCH|ERROR_POST_CONTEXT|ERROR_PRE_CONTEXT|MAXIMUM_FAILED_TEST_OUTPUT_SIZE|MAXIMUM_NUMBER_OF_(?:ERRORS|WARNINGS)|MAXIMUM_PASSED_TEST_OUTPUT_SIZE|MEMCHECK_IGNORE|POST_MEMCHECK|POST_TEST|PRE_MEMCHECK|PRE_TEST|TESTS_IGNORE|WARNING_EXCEPTION|WARNING_MATCH)|CVS_CHECKOUT|CVS_COMMAND|CVS_UPDATE_OPTIONS|DROP_LOCATION|DROP_METHOD|DROP_SITE|DROP_SITE_CDASH|DROP_SITE_PASSWORD|DROP_SITE_USER|EXTRA_COVERAGE_GLOB|GIT_COMMAND|GIT_INIT_SUBMODULES|GIT_UPDATE_CUSTOM|GIT_UPDATE_OPTIONS|HG_COMMAND|HG_UPDATE_OPTIONS|LABELS_FOR_SUBPROJECTS|MEMORYCHECK_(?:COMMAND|COMMAND_OPTIONS|SANITIZER_OPTIONS|SUPPRESSIONS_FILE|TYPE)|NIGHTLY_START_TIME|P4_CLIENT|P4_COMMAND|P4_OPTIONS|P4_UPDATE_OPTIONS|RUN_CURRENT_SCRIPT|SCP_COMMAND|SITE|SOURCE_DIRECTORY|SUBMIT_URL|SVN_COMMAND|SVN_OPTIONS|SVN_UPDATE_OPTIONS|TEST_LOAD|TEST_TIMEOUT|TRIGGER_SITE|UPDATE_COMMAND|UPDATE_OPTIONS|UPDATE_VERSION_ONLY|USE_LAUNCHERS)|CYGWIN|ENV|EXECUTABLE_OUTPUT_PATH|GHS-MULTI|IOS|LIBRARY_OUTPUT_PATH|MINGW|MSVC(?:10|11|12|14|60|70|71|80|90|_IDE|_TOOLSET_VERSION|_VERSION)?|MSYS|PROJECT_NAME|UNIX|WIN32|WINCE|WINDOWS_PHONE|WINDOWS_STORE|XCODE))\b/,
"property": /\b(?:cxx_\w+|(?:ARCHIVE_OUTPUT_(?:DIRECTORY|NAME)|COMPILE_DEFINITIONS|COMPILE_PDB_NAME|COMPILE_PDB_OUTPUT_DIRECTORY|EXCLUDE_FROM_DEFAULT_BUILD|IMPORTED_(?:IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_LANGUAGES|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|NO_SONAME|OBJECTS|SONAME)|INTERPROCEDURAL_OPTIMIZATION|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_OUTPUT_NAME|LINK_FLAGS|LINK_INTERFACE_LIBRARIES|LINK_INTERFACE_MULTIPLICITY|LOCATION|MAP_IMPORTED_CONFIG|OSX_ARCHITECTURES|OUTPUT_NAME|PDB_NAME|PDB_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_DIRECTORY|RUNTIME_OUTPUT_NAME|STATIC_LIBRARY_FLAGS|VS_CSHARP|VS_DOTNET_REFERENCEPROP|VS_DOTNET_REFERENCE|VS_GLOBAL_SECTION_POST|VS_GLOBAL_SECTION_PRE|VS_GLOBAL|XCODE_ATTRIBUTE)_\w+|\w+_(?:CLANG_TIDY|COMPILER_LAUNCHER|CPPCHECK|CPPLINT|INCLUDE_WHAT_YOU_USE|OUTPUT_NAME|POSTFIX|VISIBILITY_PRESET)|ABSTRACT|ADDITIONAL_MAKE_CLEAN_FILES|ADVANCED|ALIASED_TARGET|ALLOW_DUPLICATE_CUSTOM_TARGETS|ANDROID_(?:ANT_ADDITIONAL_OPTIONS|API|API_MIN|ARCH|ASSETS_DIRECTORIES|GUI|JAR_DEPENDENCIES|NATIVE_LIB_DEPENDENCIES|NATIVE_LIB_DIRECTORIES|PROCESS_MAX|PROGUARD|PROGUARD_CONFIG_PATH|SECURE_PROPS_PATH|SKIP_ANT_STEP|STL_TYPE)|ARCHIVE_OUTPUT_DIRECTORY|ATTACHED_FILES|ATTACHED_FILES_ON_FAIL|AUTOGEN_(?:BUILD_DIR|ORIGIN_DEPENDS|PARALLEL|SOURCE_GROUP|TARGETS_FOLDER|TARGET_DEPENDS)|AUTOMOC|AUTOMOC_(?:COMPILER_PREDEFINES|DEPEND_FILTERS|EXECUTABLE|MACRO_NAMES|MOC_OPTIONS|SOURCE_GROUP|TARGETS_FOLDER)|AUTORCC|AUTORCC_EXECUTABLE|AUTORCC_OPTIONS|AUTORCC_SOURCE_GROUP|AUTOUIC|AUTOUIC_EXECUTABLE|AUTOUIC_OPTIONS|AUTOUIC_SEARCH_PATHS|BINARY_DIR|BUILDSYSTEM_TARGETS|BUILD_RPATH|BUILD_RPATH_USE_ORIGIN|BUILD_WITH_INSTALL_NAME_DIR|BUILD_WITH_INSTALL_RPATH|BUNDLE|BUNDLE_EXTENSION|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMMON_LANGUAGE_RUNTIME|COMPATIBLE_INTERFACE_(?:BOOL|NUMBER_MAX|NUMBER_MIN|STRING)|COMPILE_(?:DEFINITIONS|FEATURES|FLAGS|OPTIONS|PDB_NAME|PDB_OUTPUT_DIRECTORY)|COST|CPACK_DESKTOP_SHORTCUTS|CPACK_NEVER_OVERWRITE|CPACK_PERMANENT|CPACK_STARTUP_SHORTCUTS|CPACK_START_MENU_SHORTCUTS|CPACK_WIX_ACL|CROSSCOMPILING_EMULATOR|CUDA_EXTENSIONS|CUDA_PTX_COMPILATION|CUDA_RESOLVE_DEVICE_SYMBOLS|CUDA_SEPARABLE_COMPILATION|CUDA_STANDARD|CUDA_STANDARD_REQUIRED|CXX_EXTENSIONS|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_EXTENSIONS|C_STANDARD|C_STANDARD_REQUIRED|DEBUG_CONFIGURATIONS|DEFINE_SYMBOL|DEFINITIONS|DEPENDS|DEPLOYMENT_ADDITIONAL_FILES|DEPLOYMENT_REMOTE_DIRECTORY|DISABLED|DISABLED_FEATURES|ECLIPSE_EXTRA_CPROJECT_CONTENTS|ECLIPSE_EXTRA_NATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|ENABLE_EXPORTS|ENVIRONMENT|EXCLUDE_FROM_ALL|EXCLUDE_FROM_DEFAULT_BUILD|EXPORT_NAME|EXPORT_PROPERTIES|EXTERNAL_OBJECT|EchoString|FAIL_REGULAR_EXPRESSION|FIND_LIBRARY_USE_LIB32_PATHS|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_LIBX32_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|FIXTURES_CLEANUP|FIXTURES_REQUIRED|FIXTURES_SETUP|FOLDER|FRAMEWORK|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GENERATED|GENERATOR_FILE_NAME|GENERATOR_IS_MULTI_CONFIG|GHS_INTEGRITY_APP|GHS_NO_SOURCE_GROUP_FILE|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|GNUtoMS|HAS_CXX|HEADER_FILE_ONLY|HELPSTRING|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|IMPORTED|IMPORTED_(?:COMMON_LANGUAGE_RUNTIME|CONFIGURATIONS|GLOBAL|IMPLIB|LIBNAME|LINK_DEPENDENT_LIBRARIES|LINK_INTERFACE_(?:LANGUAGES|LIBRARIES|MULTIPLICITY)|LOCATION|NO_SONAME|OBJECTS|SONAME)|IMPORT_PREFIX|IMPORT_SUFFIX|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE_(?:AUTOUIC_OPTIONS|COMPILE_DEFINITIONS|COMPILE_FEATURES|COMPILE_OPTIONS|INCLUDE_DIRECTORIES|LINK_DEPENDS|LINK_DIRECTORIES|LINK_LIBRARIES|LINK_OPTIONS|POSITION_INDEPENDENT_CODE|SOURCES|SYSTEM_INCLUDE_DIRECTORIES)|INTERPROCEDURAL_OPTIMIZATION|IN_TRY_COMPILE|IOS_INSTALL_COMBINED|JOB_POOLS|JOB_POOL_COMPILE|JOB_POOL_LINK|KEEP_EXTENSION|LABELS|LANGUAGE|LIBRARY_OUTPUT_DIRECTORY|LINKER_LANGUAGE|LINK_(?:DEPENDS|DEPENDS_NO_SHARED|DIRECTORIES|FLAGS|INTERFACE_LIBRARIES|INTERFACE_MULTIPLICITY|LIBRARIES|OPTIONS|SEARCH_END_STATIC|SEARCH_START_STATIC|WHAT_YOU_USE)|LISTFILE_STACK|LOCATION|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_PACKAGE_LOCATION|MACOSX_RPATH|MACROS|MANUALLY_ADDED_DEPENDENCIES|MEASUREMENT|MODIFIED|NAME|NO_SONAME|NO_SYSTEM_FROM_IMPORTED|OBJECT_DEPENDS|OBJECT_OUTPUTS|OSX_ARCHITECTURES|OUTPUT_NAME|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PARENT_DIRECTORY|PASS_REGULAR_EXPRESSION|PDB_NAME|PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|POST_INSTALL_SCRIPT|PREDEFINED_TARGETS_FOLDER|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE_HEADER|PROCESSORS|PROCESSOR_AFFINITY|PROJECT_LABEL|PUBLIC_HEADER|REPORT_UNDEFINED_PROPERTIES|REQUIRED_FILES|RESOURCE|RESOURCE_LOCK|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|RULE_MESSAGES|RUNTIME_OUTPUT_DIRECTORY|RUN_SERIAL|SKIP_AUTOGEN|SKIP_AUTOMOC|SKIP_AUTORCC|SKIP_AUTOUIC|SKIP_BUILD_RPATH|SKIP_RETURN_CODE|SOURCES|SOURCE_DIR|SOVERSION|STATIC_LIBRARY_FLAGS|STATIC_LIBRARY_OPTIONS|STRINGS|SUBDIRECTORIES|SUFFIX|SYMBOLIC|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_MESSAGES|TARGET_SUPPORTS_SHARED_LIBS|TESTS|TEST_INCLUDE_FILE|TEST_INCLUDE_FILES|TIMEOUT|TIMEOUT_AFTER_MATCH|TYPE|USE_FOLDERS|VALUE|VARIABLES|VERSION|VISIBILITY_INLINES_HIDDEN|VS_(?:CONFIGURATION_TYPE|COPY_TO_OUT_DIR|DEBUGGER_(?:COMMAND|COMMAND_ARGUMENTS|ENVIRONMENT|WORKING_DIRECTORY)|DEPLOYMENT_CONTENT|DEPLOYMENT_LOCATION|DOTNET_REFERENCES|DOTNET_REFERENCES_COPY_LOCAL|INCLUDE_IN_VSIX|IOT_STARTUP_TASK|KEYWORD|RESOURCE_GENERATOR|SCC_AUXPATH|SCC_LOCALPATH|SCC_PROJECTNAME|SCC_PROVIDER|SDK_REFERENCES|SHADER_(?:DISABLE_OPTIMIZATIONS|ENABLE_DEBUG|ENTRYPOINT|FLAGS|MODEL|OBJECT_FILE_NAME|OUTPUT_HEADER_FILE|TYPE|VARIABLE_NAME)|STARTUP_PROJECT|TOOL_OVERRIDE|USER_PROPS|WINRT_COMPONENT|WINRT_EXTENSIONS|WINRT_REFERENCES|XAML_TYPE)|WILL_FAIL|WIN32_EXECUTABLE|WINDOWS_EXPORT_ALL_SYMBOLS|WORKING_DIRECTORY|WRAP_EXCLUDE|XCODE_(?:EMIT_EFFECTIVE_PLATFORM_NAME|EXPLICIT_FILE_TYPE|FILE_ATTRIBUTES|LAST_KNOWN_FILE_TYPE|PRODUCT_TYPE|SCHEME_(?:ADDRESS_SANITIZER|ADDRESS_SANITIZER_USE_AFTER_RETURN|ARGUMENTS|DISABLE_MAIN_THREAD_CHECKER|DYNAMIC_LIBRARY_LOADS|DYNAMIC_LINKER_API_USAGE|ENVIRONMENT|EXECUTABLE|GUARD_MALLOC|MAIN_THREAD_CHECKER_STOP|MALLOC_GUARD_EDGES|MALLOC_SCRIBBLE|MALLOC_STACK|THREAD_SANITIZER(?:_STOP)?|UNDEFINED_BEHAVIOUR_SANITIZER(?:_STOP)?|ZOMBIE_OBJECTS))|XCTEST)\b/,
"keyword": /\b(?:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|break|build_command|build_name|cmake_host_system_information|cmake_minimum_required|cmake_parse_arguments|cmake_policy|configure_file|continue|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|else|elseif|enable_language|enable_testing|endforeach|endfunction|endif|endmacro|endwhile|exec_program|execute_process|export|export_library_dependencies|file|find_file|find_library|find_package|find_path|find_program|fltk_wrap_ui|foreach|function|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|if|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|macro|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdir_depends|subdirs|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|while|write_file)(?=\s*\()\b/,
"boolean": /\b(?:FALSE|OFF|ON|TRUE)\b/,
"namespace": /\b(?:INTERFACE|PRIVATE|PROPERTIES|PUBLIC|SHARED|STATIC|TARGET_OBJECTS)\b/,
"operator": /\b(?:AND|DEFINED|EQUAL|GREATER|LESS|MATCHES|NOT|OR|STREQUAL|STRGREATER|STRLESS|VERSION_EQUAL|VERSION_GREATER|VERSION_LESS)\b/,
"inserted": {
pattern: /\b\w+::\w+\b/,
alias: "class-name"
},
"number": /\b\d+(?:\.\d+)*\b/,
"function": /\b[a-z_]\w*(?=\s*\()\b/i,
"punctuation": /[()>}]|\$[<{]/
};
Prism.languages.cobol = {
"comment": {
pattern: /\*>.*|(^[ \t]*)\*.*/m,
lookbehind: true,
greedy: true
},
"string": {
pattern: /[xzgn]?(?:"(?:[^\r\n"]|"")*"(?!")|'(?:[^\r\n']|'')*'(?!'))/i,
greedy: true
},
"level": {
pattern: /(^[ \t]*)\d+\b/m,
lookbehind: true,
greedy: true,
alias: "number"
},
"class-name": {
pattern: /(\bpic(?:ture)?\s+)(?:(?:[-\w$/,:*+<>]|\.(?!\s|$))(?:\(\d+\))?)+/i,
lookbehind: true,
inside: {
"number": {
pattern: /(\()\d+/,
lookbehind: true
},
"punctuation": /[()]/
}
},
"keyword": {
pattern: /(^|[^\w-])(?:ABORT|ACCEPT|ACCESS|ADD|ADDRESS|ADVANCING|AFTER|ALIGNED|ALL|ALPHABET|ALPHABETIC|ALPHABETIC-LOWER|ALPHABETIC-UPPER|ALPHANUMERIC|ALPHANUMERIC-EDITED|ALSO|ALTER|ALTERNATE|ANY|ARE|AREA|AREAS|AS|ASCENDING|ASCII|ASSIGN|ASSOCIATED-DATA|ASSOCIATED-DATA-LENGTH|AT|ATTRIBUTE|AUTHOR|AUTO|AUTO-SKIP|BACKGROUND-COLOR|BACKGROUND-COLOUR|BASIS|BEEP|BEFORE|BEGINNING|BELL|BINARY|BIT|BLANK|BLINK|BLOCK|BOTTOM|BOUNDS|BY|BYFUNCTION|BYTITLE|CALL|CANCEL|CAPABLE|CCSVERSION|CD|CF|CH|CHAINING|CHANGED|CHANNEL|CHARACTER|CHARACTERS|CLASS|CLASS-ID|CLOCK-UNITS|CLOSE|CLOSE-DISPOSITION|COBOL|CODE|CODE-SET|COL|COLLATING|COLUMN|COM-REG|COMMA|COMMITMENT|COMMON|COMMUNICATION|COMP|COMP-1|COMP-2|COMP-3|COMP-4|COMP-5|COMPUTATIONAL|COMPUTATIONAL-1|COMPUTATIONAL-2|COMPUTATIONAL-3|COMPUTATIONAL-4|COMPUTATIONAL-5|COMPUTE|CONFIGURATION|CONTAINS|CONTENT|CONTINUE|CONTROL|CONTROL-POINT|CONTROLS|CONVENTION|CONVERTING|COPY|CORR|CORRESPONDING|COUNT|CRUNCH|CURRENCY|CURSOR|DATA|DATA-BASE|DATE|DATE-COMPILED|DATE-WRITTEN|DAY|DAY-OF-WEEK|DBCS|DE|DEBUG-CONTENTS|DEBUG-ITEM|DEBUG-LINE|DEBUG-NAME|DEBUG-SUB-1|DEBUG-SUB-2|DEBUG-SUB-3|DEBUGGING|DECIMAL-POINT|DECLARATIVES|DEFAULT|DEFAULT-DISPLAY|DEFINITION|DELETE|DELIMITED|DELIMITER|DEPENDING|DESCENDING|DESTINATION|DETAIL|DFHRESP|DFHVALUE|DISABLE|DISK|DISPLAY|DISPLAY-1|DIVIDE|DIVISION|DONTCARE|DOUBLE|DOWN|DUPLICATES|DYNAMIC|EBCDIC|EGCS|EGI|ELSE|EMI|EMPTY-CHECK|ENABLE|END|END-ACCEPT|END-ADD|END-CALL|END-COMPUTE|END-DELETE|END-DIVIDE|END-EVALUATE|END-IF|END-MULTIPLY|END-OF-PAGE|END-PERFORM|END-READ|END-RECEIVE|END-RETURN|END-REWRITE|END-SEARCH|END-START|END-STRING|END-SUBTRACT|END-UNSTRING|END-WRITE|ENDING|ENTER|ENTRY|ENTRY-PROCEDURE|ENVIRONMENT|EOL|EOP|EOS|ERASE|ERROR|ESCAPE|ESI|EVALUATE|EVENT|EVERY|EXCEPTION|EXCLUSIVE|EXHIBIT|EXIT|EXPORT|EXTEND|EXTENDED|EXTERNAL|FD|FILE|FILE-CONTROL|FILLER|FINAL|FIRST|FOOTING|FOR|FOREGROUND-COLOR|FOREGROUND-COLOUR|FROM|FULL|FUNCTION|FUNCTION-POINTER|FUNCTIONNAME|GENERATE|GIVING|GLOBAL|GO|GOBACK|GRID|GROUP|HEADING|HIGH-VALUE|HIGH-VALUES|HIGHLIGHT|I-O|I-O-CONTROL|ID|IDENTIFICATION|IF|IMPLICIT|IMPORT|IN|INDEX|INDEXED|INDICATE|INITIAL|INITIALIZE|INITIATE|INPUT|INPUT-OUTPUT|INSPECT|INSTALLATION|INTEGER|INTO|INVALID|INVOKE|IS|JUST|JUSTIFIED|KANJI|KEPT|KEY|KEYBOARD|LABEL|LANGUAGE|LAST|LB|LD|LEADING|LEFT|LEFTLINE|LENGTH|LENGTH-CHECK|LIBACCESS|LIBPARAMETER|LIBRARY|LIMIT|LIMITS|LINAGE|LINAGE-COUNTER|LINE|LINE-COUNTER|LINES|LINKAGE|LIST|LOCAL|LOCAL-STORAGE|LOCK|LONG-DATE|LONG-TIME|LOW-VALUE|LOW-VALUES|LOWER|LOWLIGHT|MEMORY|MERGE|MESSAGE|MMDDYYYY|MODE|MODULES|MORE-LABELS|MOVE|MULTIPLE|MULTIPLY|NAMED|NATIONAL|NATIONAL-EDITED|NATIVE|NEGATIVE|NETWORK|NEXT|NO|NO-ECHO|NULL|NULLS|NUMBER|NUMERIC|NUMERIC-DATE|NUMERIC-EDITED|NUMERIC-TIME|OBJECT-COMPUTER|OCCURS|ODT|OF|OFF|OMITTED|ON|OPEN|OPTIONAL|ORDER|ORDERLY|ORGANIZATION|OTHER|OUTPUT|OVERFLOW|OVERLINE|OWN|PACKED-DECIMAL|PADDING|PAGE|PAGE-COUNTER|PASSWORD|PERFORM|PF|PH|PIC|PICTURE|PLUS|POINTER|PORT|POSITION|POSITIVE|PRINTER|PRINTING|PRIVATE|PROCEDURE|PROCEDURE-POINTER|PROCEDURES|PROCEED|PROCESS|PROGRAM|PROGRAM-ID|PROGRAM-LIBRARY|PROMPT|PURGE|QUEUE|QUOTE|QUOTES|RANDOM|RD|READ|READER|REAL|RECEIVE|RECEIVED|RECORD|RECORDING|RECORDS|RECURSIVE|REDEFINES|REEL|REF|REFERENCE|REFERENCES|RELATIVE|RELEASE|REMAINDER|REMARKS|REMOTE|REMOVAL|REMOVE|RENAMES|REPLACE|REPLACING|REPORT|REPORTING|REPORTS|REQUIRED|RERUN|RESERVE|RESET|RETURN|RETURN-CODE|RETURNING|REVERSE-VIDEO|REVERSED|REWIND|REWRITE|RF|RH|RIGHT|ROUNDED|RUN|SAME|SAVE|SCREEN|SD|SEARCH|SECTION|SECURE|SECURITY|SEGMENT|SEGMENT-LIMIT|SELECT|SEND|SENTENCE|SEPARATE|SEQUENCE|SEQUENTIAL|SET|SHARED|SHAREDBYALL|SHAREDBYRUNUNIT|SHARING|SHIFT-IN|SHIFT-OUT|SHORT-DATE|SIGN|SIZE|SORT|SORT-CONTROL|SORT-CORE-SIZE|SORT-FILE-SIZE|SORT-MERGE|SORT-MESSAGE|SORT-MODE-SIZE|SORT-RETURN|SOURCE|SOURCE-COMPUTER|SPACE|SPACES|SPECIAL-NAMES|STANDARD|STANDARD-1|STANDARD-2|START|STATUS|STOP|STRING|SUB-QUEUE-1|SUB-QUEUE-2|SUB-QUEUE-3|SUBTRACT|SUM|SUPPRESS|SYMBOL|SYMBOLIC|SYNC|SYNCHRONIZED|TABLE|TALLY|TALLYING|TAPE|TASK|TERMINAL|TERMINATE|TEST|TEXT|THEN|THREAD|THREAD-LOCAL|THROUGH|THRU|TIME|TIMER|TIMES|TITLE|TO|TODAYS-DATE|TODAYS-NAME|TOP|TRAILING|TRUNCATED|TYPE|TYPEDEF|UNDERLINE|UNIT|UNSTRING|UNTIL|UP|UPON|USAGE|USE|USING|VALUE|VALUES|VARYING|VIRTUAL|WAIT|WHEN|WHEN-COMPILED|WITH|WORDS|WORKING-STORAGE|WRITE|YEAR|YYYYDDD|YYYYMMDD|ZERO-FILL|ZEROES|ZEROS)(?![\w-])/i,
lookbehind: true
},
"boolean": {
pattern: /(^|[^\w-])(?:false|true)(?![\w-])/i,
lookbehind: true
},
"number": {
pattern: /(^|[^\w-])(?:[+-]?(?:(?:\d+(?:[.,]\d+)?|[.,]\d+)(?:e[+-]?\d+)?|zero))(?![\w-])/i,
lookbehind: true
},
"operator": [
/<>|[<>]=?|[=+*/&]/,
{
pattern: /(^|[^\w-])(?:-|and|equal|greater|less|not|or|than)(?![\w-])/i,
lookbehind: true
}
],
"punctuation": /[.:,()]/
};
(function(Prism2) {
var comment = /#(?!\{).+/;
var interpolation = {
pattern: /#\{[^}]+\}/,
alias: "variable"
};
Prism2.languages.coffeescript = Prism2.languages.extend("javascript", {
"comment": comment,
"string": [
{
pattern: /'(?:\\[\s\S]|[^\\'])*'/,
greedy: true
},
{
pattern: /"(?:\\[\s\S]|[^\\"])*"/,
greedy: true,
inside: {
"interpolation": interpolation
}
}
],
"keyword": /\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,
"class-member": {
pattern: /@(?!\d)\w+/,
alias: "variable"
}
});
Prism2.languages.insertBefore("coffeescript", "comment", {
"multiline-comment": {
pattern: /###[\s\S]+?###/,
alias: "comment"
},
"block-regex": {
pattern: /\/{3}[\s\S]*?\/{3}/,
alias: "regex",
inside: {
"comment": comment,
"interpolation": interpolation
}
}
});
Prism2.languages.insertBefore("coffeescript", "string", {
"inline-javascript": {
pattern: /`(?:\\[\s\S]|[^\\`])*`/,
inside: {
"delimiter": {
pattern: /^`|`$/,
alias: "punctuation"
},
"script": {
pattern: /[\s\S]+/,
alias: "language-javascript",
inside: Prism2.languages.javascript
}
}
},
"multiline-string": [
{
pattern: /'''[\s\S]*?'''/,
greedy: true,
alias: "string"
},
{
pattern: /"""[\s\S]*?"""/,
greedy: true,
alias: "string",
inside: {
interpolation
}
}
]
});
Prism2.languages.insertBefore("coffeescript", "keyword", {
"property": /(?!\d)\w+(?=\s*:(?!:))/
});
delete Prism2.languages.coffeescript["template-string"];
Prism2.languages.coffee = Prism2.languages.coffeescript;
})(Prism);
Prism.languages.concurnas = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*)/,
lookbehind: true,
greedy: true
},
"langext": {
pattern: /\b\w+\s*\|\|[\s\S]+?\|\|/,
greedy: true,
inside: {
"class-name": /^\w+/,
"string": {
pattern: /(^\s*\|\|)[\s\S]+(?=\|\|$)/,
lookbehind: true
},
"punctuation": /\|\|/
}
},
"function": {
pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/,
lookbehind: true
},
"keyword": /\b(?:abstract|actor|also|annotation|assert|async|await|bool|boolean|break|byte|case|catch|changed|char|class|closed|constant|continue|def|default|del|double|elif|else|enum|every|extends|false|finally|float|for|from|global|gpudef|gpukernel|if|import|in|init|inject|int|lambda|local|long|loop|match|new|nodefault|null|of|onchange|open|out|override|package|parfor|parforsync|post|pre|private|protected|provide|provider|public|return|shared|short|single|size_t|sizeof|super|sync|this|throw|trait|trans|transient|true|try|typedef|unchecked|using|val|var|void|while|with)\b/,
"boolean": /\b(?:false|true)\b/,
"number": /\b0b[01][01_]*L?\b|\b0x(?:[\da-f_]*\.)?[\da-f_p+-]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfls]?/i,
"punctuation": /[{}[\];(),.:]/,
"operator": /<==|>==|=>|->|<-|<>|&==|&<>|\?:?|\.\?|\+\+|--|[-+*/=<>]=?|[!^~]|\b(?:and|as|band|bor|bxor|comp|is|isnot|mod|or)\b=?/,
"annotation": {
pattern: /@(?:\w+:)?(?:\w+|\[[^\]]+\])?/,
alias: "builtin"
}
};
Prism.languages.insertBefore("concurnas", "langext", {
"regex-literal": {
pattern: /\br("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
lookbehind: true,
inside: Prism.languages.concurnas
},
"regex": /[\s\S]+/
}
},
"string-literal": {
pattern: /(?:\B|\bs)("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
lookbehind: true,
inside: Prism.languages.concurnas
},
"string": /[\s\S]+/
}
}
});
Prism.languages.conc = Prism.languages.concurnas;
(function(Prism2) {
function value(source) {
return RegExp(/([ \t])/.source + "(?:" + source + ")" + /(?=[\s;]|$)/.source, "i");
}
Prism2.languages.csp = {
"directive": {
pattern: /(^|[\s;])(?:base-uri|block-all-mixed-content|(?:child|connect|default|font|frame|img|manifest|media|object|prefetch|script|style|worker)-src|disown-opener|form-action|frame-(?:ancestors|options)|input-protection(?:-(?:clip|selectors))?|navigate-to|plugin-types|policy-uri|referrer|reflected-xss|report-(?:to|uri)|require-sri-for|sandbox|(?:script|style)-src-(?:attr|elem)|upgrade-insecure-requests)(?=[\s;]|$)/i,
lookbehind: true,
alias: "property"
},
"scheme": {
pattern: value(/[a-z][a-z0-9.+-]*:/.source),
lookbehind: true
},
"none": {
pattern: value(/'none'/.source),
lookbehind: true,
alias: "keyword"
},
"nonce": {
pattern: value(/'nonce-[-+/\w=]+'/.source),
lookbehind: true,
alias: "number"
},
"hash": {
pattern: value(/'sha(?:256|384|512)-[-+/\w=]+'/.source),
lookbehind: true,
alias: "number"
},
"host": {
pattern: value(
/[a-z][a-z0-9.+-]*:\/\/[^\s;,']*/.source + "|" + /\*[^\s;,']*/.source + "|" + /[a-z0-9-]+(?:\.[a-z0-9-]+)+(?::[\d*]+)?(?:\/[^\s;,']*)?/.source
),
lookbehind: true,
alias: "url",
inside: {
"important": /\*/
}
},
"keyword": [
{
pattern: value(/'unsafe-[a-z-]+'/.source),
lookbehind: true,
alias: "unsafe"
},
{
pattern: value(/'[a-z-]+'/.source),
lookbehind: true,
alias: "safe"
}
],
"punctuation": /;/
};
})(Prism);
(function(Prism2) {
var single_token_suffix = /(?:(?!\s)[\d$+<=a-zA-Z\x80-\uFFFF])+/.source;
var multi_token_infix = /[^{}@#]+/.source;
var multi_token_suffix = /\{[^}#@]*\}/.source;
var multi_token = multi_token_infix + multi_token_suffix;
var timer_units = /(?:h|hours|hrs|m|min|minutes)/.source;
var amount_group_impl = {
pattern: /\{[^{}]*\}/,
inside: {
"amount": {
pattern: /([\{|])[^{}|*%]+/,
lookbehind: true,
alias: "number"
},
"unit": {
pattern: /(%)[^}]+/,
lookbehind: true,
alias: "symbol"
},
"servings-scaler": {
pattern: /\*/,
alias: "operator"
},
"servings-alternative-separator": {
pattern: /\|/,
alias: "operator"
},
"unit-separator": {
pattern: /(?:%|(\*)%)/,
lookbehind: true,
alias: "operator"
},
"punctuation": /[{}]/
}
};
Prism2.languages.cooklang = {
"comment": {
pattern: /\[-[\s\S]*?-\]|--.*/,
greedy: true
},
"meta": {
pattern: />>.*:.*/,
inside: {
"property": {
pattern: /(>>\s*)[^\s:](?:[^:]*[^\s:])?/,
lookbehind: true
}
}
},
"cookware-group": {
pattern: new RegExp(
"#(?:" + multi_token + "|" + single_token_suffix + ")"
),
inside: {
"cookware": {
pattern: new RegExp(
"(^#)(?:" + multi_token_infix + ")"
),
lookbehind: true,
alias: "variable"
},
"cookware-keyword": {
pattern: /^#/,
alias: "keyword"
},
"quantity-group": {
pattern: new RegExp(/\{[^{}@#]*\}/),
inside: {
"quantity": {
pattern: new RegExp(/(^\{)/.source + multi_token_infix),
lookbehind: true,
alias: "number"
},
"punctuation": /[{}]/
}
}
}
},
"ingredient-group": {
pattern: new RegExp("@(?:" + multi_token + "|" + single_token_suffix + ")"),
inside: {
"ingredient": {
pattern: new RegExp("(^@)(?:" + multi_token_infix + ")"),
lookbehind: true,
alias: "variable"
},
"ingredient-keyword": {
pattern: /^@/,
alias: "keyword"
},
"amount-group": amount_group_impl
}
},
"timer-group": {
pattern: /~(?!\s)[^@#~{}]*\{[^{}]*\}/,
inside: {
"timer": {
pattern: /(^~)[^{]+/,
lookbehind: true,
alias: "variable"
},
"duration-group": {
pattern: /\{[^{}]*\}/,
inside: {
"punctuation": /[{}]/,
"unit": {
pattern: new RegExp(/(%\s*)/.source + timer_units + /\b/.source),
lookbehind: true,
alias: "symbol"
},
"operator": /%/,
"duration": {
pattern: /\d+/,
alias: "number"
}
}
},
"timer-keyword": {
pattern: /^~/,
alias: "keyword"
}
}
}
};
})(Prism);
(function(Prism2) {
var commentSource = /\(\*(?:[^(*]|\((?!\*)|\*(?!\))|<self>)*\*\)/.source;
for (var i = 0; i < 2; i++) {
commentSource = commentSource.replace(/<self>/g, function() {
return commentSource;
});
}
commentSource = commentSource.replace(/<self>/g, "[]");
Prism2.languages.coq = {
"comment": RegExp(commentSource),
"string": {
pattern: /"(?:[^"]|"")*"(?!")/,
greedy: true
},
"attribute": [
{
pattern: RegExp(
/#\[(?:[^\[\]("]|"(?:[^"]|"")*"(?!")|\((?!\*)|<comment>)*\]/.source.replace(/<comment>/g, function() {
return commentSource;
})
),
greedy: true,
alias: "attr-name",
inside: {
"comment": RegExp(commentSource),
"string": {
pattern: /"(?:[^"]|"")*"(?!")/,
greedy: true
},
"operator": /=/,
"punctuation": /^#\[|\]$|[,()]/
}
},
{
pattern: /\b(?:Cumulative|Global|Local|Monomorphic|NonCumulative|Polymorphic|Private|Program)\b/,
alias: "attr-name"
}
],
"keyword": /\b(?:Abort|About|Add|Admit|Admitted|All|Arguments|As|Assumptions|Axiom|Axioms|Back|BackTo|Backtrace|BinOp|BinOpSpec|BinRel|Bind|Blacklist|Canonical|Case|Cd|Check|Class|Classes|Close|CoFixpoint|CoInductive|Coercion|Coercions|Collection|Combined|Compute|Conjecture|Conjectures|Constant|Constants|Constraint|Constructors|Context|Corollary|Create|CstOp|Custom|Cut|Debug|Declare|Defined|Definition|Delimit|Dependencies|Dependent|Derive|Diffs|Drop|Elimination|End|Entry|Equality|Eval|Example|Existential|Existentials|Existing|Export|Extern|Extraction|Fact|Fail|Field|File|Firstorder|Fixpoint|Flags|Focus|From|Funclass|Function|Functional|GC|Generalizable|Goal|Grab|Grammar|Graph|Guarded|Haskell|Heap|Hide|Hint|HintDb|Hints|Hypotheses|Hypothesis|IF|Identity|Immediate|Implicit|Implicits|Import|Include|Induction|Inductive|Infix|Info|Initial|InjTyp|Inline|Inspect|Instance|Instances|Intro|Intros|Inversion|Inversion_clear|JSON|Language|Left|Lemma|Let|Lia|Libraries|Library|Load|LoadPath|Locate|Ltac|Ltac2|ML|Match|Method|Minimality|Module|Modules|Morphism|Next|NoInline|Notation|Number|OCaml|Obligation|Obligations|Opaque|Open|Optimize|Parameter|Parameters|Parametric|Path|Paths|Prenex|Preterm|Primitive|Print|Profile|Projections|Proof|Prop|PropBinOp|PropOp|PropUOp|Property|Proposition|Pwd|Qed|Quit|Rec|Record|Recursive|Redirect|Reduction|Register|Relation|Remark|Remove|Require|Reserved|Reset|Resolve|Restart|Rewrite|Right|Ring|Rings|SProp|Saturate|Save|Scheme|Scope|Scopes|Search|SearchHead|SearchPattern|SearchRewrite|Section|Separate|Set|Setoid|Show|Signatures|Solve|Solver|Sort|Sortclass|Sorted|Spec|Step|Strategies|Strategy|String|Structure|SubClass|Subgraph|SuchThat|Tactic|Term|TestCompile|Theorem|Time|Timeout|To|Transparent|Type|Typeclasses|Types|Typing|UnOp|UnOpSpec|Undelimit|Undo|Unfocus|Unfocused|Unfold|Universe|Universes|Unshelve|Variable|Variables|Variant|Verbose|View|Visibility|Zify|_|apply|as|at|by|cofix|else|end|exists|exists2|fix|for|forall|fun|if|in|let|match|measure|move|removed|return|struct|then|using|wf|where|with)\b/,
"number": /\b(?:0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]+)?(?:p[+-]?\d[\d_]*)?|\d[\d_]*(?:\.[\d_]+)?(?:e[+-]?\d[\d_]*)?)\b/i,
"punct": {
pattern: /@\{|\{\||\[=|:>/,
alias: "punctuation"
},
"operator": /\/\\|\\\/|\.{2,3}|:{1,2}=|\*\*|[-=]>|<(?:->?|[+:=>]|<:)|>(?:=|->)|\|[-|]?|[-!%&*+/<=>?@^~']/,
"punctuation": /\.\(|`\(|@\{|`\{|\{\||\[=|:>|[:.,;(){}\[\]]/
};
})(Prism);
(function(Prism2) {
Prism2.languages.ruby = Prism2.languages.extend("clike", {
"comment": {
pattern: /#.*|^=begin\s[\s\S]*?^=end/m,
greedy: true
},
"class-name": {
pattern: /(\b(?:class|module)\s+|\bcatch\s+\()[\w.\\]+|\b[A-Z_]\w*(?=\s*\.\s*new\b)/,
lookbehind: true,
inside: {
"punctuation": /[.\\]/
}
},
"keyword": /\b(?:BEGIN|END|alias|and|begin|break|case|class|def|define_method|defined|do|each|else|elsif|end|ensure|extend|for|if|in|include|module|new|next|nil|not|or|prepend|private|protected|public|raise|redo|require|rescue|retry|return|self|super|then|throw|undef|unless|until|when|while|yield)\b/,
"operator": /\.{2,3}|&\.|===|<?=>|[!=]?~|(?:&&|\|\||<<|>>|\*\*|[+\-*/%<>!^&|=])=?|[?:]/,
"punctuation": /[(){}[\].,;]/
});
Prism2.languages.insertBefore("ruby", "operator", {
"double-colon": {
pattern: /::/,
alias: "punctuation"
}
});
var interpolation = {
pattern: /((?:^|[^\\])(?:\\{2})*)#\{(?:[^{}]|\{[^{}]*\})*\}/,
lookbehind: true,
inside: {
"content": {
pattern: /^(#\{)[\s\S]+(?=\}$)/,
lookbehind: true,
inside: Prism2.languages.ruby
},
"delimiter": {
pattern: /^#\{|\}$/,
alias: "punctuation"
}
}
};
delete Prism2.languages.ruby.function;
var percentExpression = "(?:" + [
/([^a-zA-Z0-9\s{(\[<=])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,
/\((?:[^()\\]|\\[\s\S]|\((?:[^()\\]|\\[\s\S])*\))*\)/.source,
/\{(?:[^{}\\]|\\[\s\S]|\{(?:[^{}\\]|\\[\s\S])*\})*\}/.source,
/\[(?:[^\[\]\\]|\\[\s\S]|\[(?:[^\[\]\\]|\\[\s\S])*\])*\]/.source,
/<(?:[^<>\\]|\\[\s\S]|<(?:[^<>\\]|\\[\s\S])*>)*>/.source
].join("|") + ")";
var symbolName = /(?:"(?:\\.|[^"\\\r\n])*"|(?:\b[a-zA-Z_]\w*|[^\s\0-\x7F]+)[?!]?|\$.)/.source;
Prism2.languages.insertBefore("ruby", "keyword", {
"regex-literal": [
{
pattern: RegExp(/%r/.source + percentExpression + /[egimnosux]{0,6}/.source),
greedy: true,
inside: {
"interpolation": interpolation,
"regex": /[\s\S]+/
}
},
{
pattern: /(^|[^/])\/(?!\/)(?:\[[^\r\n\]]+\]|\\.|[^[/\\\r\n])+\/[egimnosux]{0,6}(?=\s*(?:$|[\r\n,.;})#]))/,
lookbehind: true,
greedy: true,
inside: {
"interpolation": interpolation,
"regex": /[\s\S]+/
}
}
],
"variable": /[@$]+[a-zA-Z_]\w*(?:[?!]|\b)/,
"symbol": [
{
pattern: RegExp(/(^|[^:]):/.source + symbolName),
lookbehind: true,
greedy: true
},
{
pattern: RegExp(/([\r\n{(,][ \t]*)/.source + symbolName + /(?=:(?!:))/.source),
lookbehind: true,
greedy: true
}
],
"method-definition": {
pattern: /(\bdef\s+)\w+(?:\s*\.\s*\w+)?/,
lookbehind: true,
inside: {
"function": /\b\w+$/,
"keyword": /^self\b/,
"class-name": /^\w+/,
"punctuation": /\./
}
}
});
Prism2.languages.insertBefore("ruby", "string", {
"string-literal": [
{
pattern: RegExp(/%[qQiIwWs]?/.source + percentExpression),
greedy: true,
inside: {
"interpolation": interpolation,
"string": /[\s\S]+/
}
},
{
pattern: /("|')(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|(?!\1)[^\\#\r\n])*\1/,
greedy: true,
inside: {
"interpolation": interpolation,
"string": /[\s\S]+/
}
},
{
pattern: /<<[-~]?([a-z_]\w*)[\r\n](?:.*[\r\n])*?[\t ]*\1/i,
alias: "heredoc-string",
greedy: true,
inside: {
"delimiter": {
pattern: /^<<[-~]?[a-z_]\w*|\b[a-z_]\w*$/i,
inside: {
"symbol": /\b\w+/,
"punctuation": /^<<[-~]?/
}
},
"interpolation": interpolation,
"string": /[\s\S]+/
}
},
{
pattern: /<<[-~]?'([a-z_]\w*)'[\r\n](?:.*[\r\n])*?[\t ]*\1/i,
alias: "heredoc-string",
greedy: true,
inside: {
"delimiter": {
pattern: /^<<[-~]?'[a-z_]\w*'|\b[a-z_]\w*$/i,
inside: {
"symbol": /\b\w+/,
"punctuation": /^<<[-~]?'|'$/
}
},
"string": /[\s\S]+/
}
}
],
"command-literal": [
{
pattern: RegExp(/%x/.source + percentExpression),
greedy: true,
inside: {
"interpolation": interpolation,
"command": {
pattern: /[\s\S]+/,
alias: "string"
}
}
},
{
pattern: /`(?:#\{[^}]+\}|#(?!\{)|\\(?:\r\n|[\s\S])|[^\\`#\r\n])*`/,
greedy: true,
inside: {
"interpolation": interpolation,
"command": {
pattern: /[\s\S]+/,
alias: "string"
}
}
}
]
});
delete Prism2.languages.ruby.string;
Prism2.languages.insertBefore("ruby", "number", {
"builtin": /\b(?:Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Fixnum|Float|Hash|IO|Integer|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|Stat|String|Struct|Symbol|TMS|Thread|ThreadGroup|Time|TrueClass)\b/,
"constant": /\b[A-Z][A-Z0-9_]*(?:[?!]|\b)/
});
Prism2.languages.rb = Prism2.languages.ruby;
})(Prism);
(function(Prism2) {
Prism2.languages.crystal = Prism2.languages.extend("ruby", {
"keyword": [
/\b(?:__DIR__|__END_LINE__|__FILE__|__LINE__|abstract|alias|annotation|as|asm|begin|break|case|class|def|do|else|elsif|end|ensure|enum|extend|for|fun|if|ifdef|include|instance_sizeof|lib|macro|module|next|of|out|pointerof|private|protected|ptr|require|rescue|return|select|self|sizeof|struct|super|then|type|typeof|undef|uninitialized|union|unless|until|when|while|with|yield)\b/,
{
pattern: /(\.\s*)(?:is_a|responds_to)\?/,
lookbehind: true
}
],
"number": /\b(?:0b[01_]*[01]|0o[0-7_]*[0-7]|0x[\da-fA-F_]*[\da-fA-F]|(?:\d(?:[\d_]*\d)?)(?:\.[\d_]*\d)?(?:[eE][+-]?[\d_]*\d)?)(?:_(?:[uif](?:8|16|32|64))?)?\b/,
"operator": [
/->/,
Prism2.languages.ruby.operator
],
"punctuation": /[(){}[\].,;\\]/
});
Prism2.languages.insertBefore("crystal", "string-literal", {
"attribute": {
pattern: /@\[.*?\]/,
inside: {
"delimiter": {
pattern: /^@\[|\]$/,
alias: "punctuation"
},
"attribute": {
pattern: /^(\s*)\w+/,
lookbehind: true,
alias: "class-name"
},
"args": {
pattern: /\S(?:[\s\S]*\S)?/,
inside: Prism2.languages.crystal
}
}
},
"expansion": {
pattern: /\{(?:\{.*?\}|%.*?%)\}/,
inside: {
"content": {
pattern: /^(\{.)[\s\S]+(?=.\}$)/,
lookbehind: true,
inside: Prism2.languages.crystal
},
"delimiter": {
pattern: /^\{[\{%]|[\}%]\}$/,
alias: "operator"
}
}
},
"char": {
pattern: /'(?:[^\\\r\n]{1,2}|\\(?:.|u(?:[A-Fa-f0-9]{1,4}|\{[A-Fa-f0-9]{1,6}\})))'/,
greedy: true
}
});
})(Prism);
(function(Prism2) {
var string = /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;
var selectorInside;
Prism2.languages.css.selector = {
pattern: Prism2.languages.css.selector.pattern,
lookbehind: true,
inside: selectorInside = {
"pseudo-element": /:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,
"pseudo-class": /:[-\w]+/,
"class": /\.[-\w]+/,
"id": /#[-\w]+/,
"attribute": {
pattern: RegExp(`\\[(?:[^[\\]"']|` + string.source + ")*\\]"),
greedy: true,
inside: {
"punctuation": /^\[|\]$/,
"case-sensitivity": {
pattern: /(\s)[si]$/i,
lookbehind: true,
alias: "keyword"
},
"namespace": {
pattern: /^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,
lookbehind: true,
inside: {
"punctuation": /\|$/
}
},
"attr-name": {
pattern: /^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,
lookbehind: true
},
"attr-value": [
string,
{
pattern: /(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,
lookbehind: true
}
],
"operator": /[|~*^$]?=/
}
},
"n-th": [
{
pattern: /(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,
lookbehind: true,
inside: {
"number": /[\dn]+/,
"operator": /[+-]/
}
},
{
pattern: /(\(\s*)(?:even|odd)(?=\s*\))/i,
lookbehind: true
}
],
"combinator": />|\+|~|\|\|/,
"punctuation": /[(),]/
}
};
Prism2.languages.css["atrule"].inside["selector-function-argument"].inside = selectorInside;
Prism2.languages.insertBefore("css", "property", {
"variable": {
pattern: /(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,
lookbehind: true
}
});
var unit = {
pattern: /(\b\d+)(?:%|[a-z]+(?![\w-]))/,
lookbehind: true
};
var number = {
pattern: /(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,
lookbehind: true
};
Prism2.languages.insertBefore("css", "function", {
"operator": {
pattern: /(\s)[+\-*\/](?=\s)/,
lookbehind: true
},
"hexcode": {
pattern: /\B#[\da-f]{3,8}\b/i,
alias: "color"
},
"color": [
{
pattern: /(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,
lookbehind: true
},
{
pattern: /\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,
inside: {
"unit": unit,
"number": number,
"function": /[\w-]+(?=\()/,
"punctuation": /[(),]/
}
}
],
"entity": /\\[\da-f]{1,8}/i,
"unit": unit,
"number": number
});
})(Prism);
Prism.languages.csv = {
"value": /[^\r\n,"]+|"(?:[^"]|"")*"(?!")/,
"punctuation": /,/
};
(function(Prism2) {
var stringEscape = /\\(?:(?!\2)|\2(?:[^()\r\n]|\([^()]*\)))/.source;
var stringTypes = /"""(?:[^\\"]|"(?!""\2)|<esc>)*"""/.source + "|" + /'''(?:[^\\']|'(?!''\2)|<esc>)*'''/.source + "|" + /"(?:[^\\\r\n"]|"(?!\2)|<esc>)*"/.source + "|" + /'(?:[^\\\r\n']|'(?!\2)|<esc>)*'/.source;
var stringLiteral = "(?:" + stringTypes.replace(/<esc>/g, stringEscape) + ")";
Prism2.languages.cue = {
"comment": {
pattern: /\/\/.*/,
greedy: true
},
"string-literal": {
pattern: RegExp(/(^|[^#"'\\])(#*)/.source + stringLiteral + /(?!["'])\2/.source),
lookbehind: true,
greedy: true,
inside: {
"escape": {
pattern: /(?=[\s\S]*["'](#*)$)\\\1(?:U[a-fA-F0-9]{1,8}|u[a-fA-F0-9]{1,4}|x[a-fA-F0-9]{1,2}|\d{2,3}|[^(])/,
greedy: true,
alias: "string"
},
"interpolation": {
pattern: /(?=[\s\S]*["'](#*)$)\\\1\([^()]*\)/,
greedy: true,
inside: {
"punctuation": /^\\#*\(|\)$/,
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
},
"string": /[\s\S]+/
}
},
"keyword": {
pattern: /(^|[^\w$])(?:for|if|import|in|let|null|package)(?![\w$])/,
lookbehind: true
},
"boolean": {
pattern: /(^|[^\w$])(?:false|true)(?![\w$])/,
lookbehind: true
},
"builtin": {
pattern: /(^|[^\w$])(?:bool|bytes|float|float(?:32|64)|u?int(?:8|16|32|64|128)?|number|rune|string)(?![\w$])/,
lookbehind: true
},
"attribute": {
pattern: /@[\w$]+(?=\s*\()/,
alias: "function"
},
"function": {
pattern: /(^|[^\w$])[a-z_$][\w$]*(?=\s*\()/i,
lookbehind: true
},
"number": {
pattern: /(^|[^\w$.])(?:0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|0[xX][0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*|(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[eE][+-]?\d+(?:_\d+)*)?(?:[KMGTP]i?)?)(?![\w$])/,
lookbehind: true
},
"operator": /\.{3}|_\|_|&&?|\|\|?|[=!]~|[<>=!]=?|[+\-*/?]/,
"punctuation": /[()[\]{},.:]/
};
Prism2.languages.cue["string-literal"].inside.interpolation.inside.expression.inside = Prism2.languages.cue;
})(Prism);
Prism.languages.cypher = {
"comment": /\/\/.*/,
"string": {
pattern: /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/,
greedy: true
},
"class-name": {
pattern: /(:\s*)(?:\w+|`(?:[^`\\\r\n])*`)(?=\s*[{):])/,
lookbehind: true,
greedy: true
},
"relationship": {
pattern: /(-\[\s*(?:\w+\s*|`(?:[^`\\\r\n])*`\s*)?:\s*|\|\s*:\s*)(?:\w+|`(?:[^`\\\r\n])*`)/,
lookbehind: true,
greedy: true,
alias: "property"
},
"identifier": {
pattern: /`(?:[^`\\\r\n])*`/,
greedy: true
},
"variable": /\$\w+/,
"keyword": /\b(?:ADD|ALL|AND|AS|ASC|ASCENDING|ASSERT|BY|CALL|CASE|COMMIT|CONSTRAINT|CONTAINS|CREATE|CSV|DELETE|DESC|DESCENDING|DETACH|DISTINCT|DO|DROP|ELSE|END|ENDS|EXISTS|FOR|FOREACH|IN|INDEX|IS|JOIN|KEY|LIMIT|LOAD|MANDATORY|MATCH|MERGE|NODE|NOT|OF|ON|OPTIONAL|OR|ORDER(?=\s+BY)|PERIODIC|REMOVE|REQUIRE|RETURN|SCALAR|SCAN|SET|SKIP|START|STARTS|THEN|UNION|UNIQUE|UNWIND|USING|WHEN|WHERE|WITH|XOR|YIELD)\b/i,
"function": /\b\w+\b(?=\s*\()/,
"boolean": /\b(?:false|null|true)\b/i,
"number": /\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?)\b/,
"operator": /:|<--?|--?>?|<>|=~?|[<>]=?|[+*/%^|]|\.\.\.?/,
"punctuation": /[()[\]{},;.]/
};
Prism.languages.d = Prism.languages.extend("clike", {
"comment": [
{
pattern: /^\s*#!.+/,
greedy: true
},
{
pattern: RegExp(/(^|[^\\])/.source + "(?:" + [
/\/\+(?:\/\+(?:[^+]|\+(?!\/))*\+\/|(?!\/\+)[\s\S])*?\+\//.source,
/\/\/.*/.source,
/\/\*[\s\S]*?\*\//.source
].join("|") + ")"),
lookbehind: true,
greedy: true
}
],
"string": [
{
pattern: RegExp([
/\b[rx]"(?:\\[\s\S]|[^\\"])*"[cwd]?/.source,
/\bq"(?:\[[\s\S]*?\]|\([\s\S]*?\)|<[\s\S]*?>|\{[\s\S]*?\})"/.source,
/\bq"((?!\d)\w+)$[\s\S]*?^\1"/.source,
/\bq"(.)[\s\S]*?\2"/.source,
/(["`])(?:\\[\s\S]|(?!\3)[^\\])*\3[cwd]?/.source
].join("|"), "m"),
greedy: true
},
{
pattern: /\bq\{(?:\{[^{}]*\}|[^{}])*\}/,
greedy: true,
alias: "token-string"
}
],
"keyword": /\$|\b(?:__(?:(?:DATE|EOF|FILE|FUNCTION|LINE|MODULE|PRETTY_FUNCTION|TIMESTAMP|TIME|VENDOR|VERSION)__|gshared|parameters|traits|vector)|abstract|alias|align|asm|assert|auto|body|bool|break|byte|case|cast|catch|cdouble|cent|cfloat|char|class|const|continue|creal|dchar|debug|default|delegate|delete|deprecated|do|double|dstring|else|enum|export|extern|false|final|finally|float|for|foreach|foreach_reverse|function|goto|idouble|if|ifloat|immutable|import|inout|int|interface|invariant|ireal|lazy|long|macro|mixin|module|new|nothrow|null|out|override|package|pragma|private|protected|ptrdiff_t|public|pure|real|ref|return|scope|shared|short|size_t|static|string|struct|super|switch|synchronized|template|this|throw|true|try|typedef|typeid|typeof|ubyte|ucent|uint|ulong|union|unittest|ushort|version|void|volatile|wchar|while|with|wstring)\b/,
"number": [
/\b0x\.?[a-f\d_]+(?:(?!\.\.)\.[a-f\d_]*)?(?:p[+-]?[a-f\d_]+)?[ulfi]{0,4}/i,
{
pattern: /((?:\.\.)?)(?:\b0b\.?|\b|\.)\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:e[+-]?\d[\d_]*)?[ulfi]{0,4}/i,
lookbehind: true
}
],
"operator": /\|[|=]?|&[&=]?|\+[+=]?|-[-=]?|\.?\.\.|=[>=]?|!(?:i[ns]\b|<>?=?|>=?|=)?|\bi[ns]\b|(?:<[<>]?|>>?>?|\^\^|[*\/%^~])=?/
});
Prism.languages.insertBefore("d", "string", {
"char": /'(?:\\(?:\W|\w+)|[^\\])'/
});
Prism.languages.insertBefore("d", "keyword", {
"property": /\B@\w*/
});
Prism.languages.insertBefore("d", "function", {
"register": {
pattern: /\b(?:[ABCD][LHX]|E?(?:BP|DI|SI|SP)|[BS]PL|[ECSDGF]S|CR[0234]|[DS]IL|DR[012367]|E[ABCD]X|X?MM[0-7]|R(?:1[0-5]|[89])[BWD]?|R[ABCD]X|R[BS]P|R[DS]I|TR[3-7]|XMM(?:1[0-5]|[89])|YMM(?:1[0-5]|\d))\b|\bST(?:\([0-7]\)|\b)/,
alias: "variable"
}
});
(function(Prism2) {
var keywords = [
/\b(?:async|sync|yield)\*/,
/\b(?:abstract|assert|async|await|break|case|catch|class|const|continue|covariant|default|deferred|do|dynamic|else|enum|export|extends|extension|external|factory|final|finally|for|get|hide|if|implements|import|in|interface|library|mixin|new|null|on|operator|part|rethrow|return|set|show|static|super|switch|sync|this|throw|try|typedef|var|void|while|with|yield)\b/
];
var packagePrefix = /(^|[^\w.])(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source;
var className = {
pattern: RegExp(packagePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),
lookbehind: true,
inside: {
"namespace": {
pattern: /^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,
inside: {
"punctuation": /\./
}
}
}
};
Prism2.languages.dart = Prism2.languages.extend("clike", {
"class-name": [
className,
{
pattern: RegExp(packagePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()])/.source),
lookbehind: true,
inside: className.inside
}
],
"keyword": keywords,
"operator": /\bis!|\b(?:as|is)\b|\+\+|--|&&|\|\||<<=?|>>=?|~(?:\/=?)?|[+\-*\/%&^|=!<>]=?|\?/
});
Prism2.languages.insertBefore("dart", "string", {
"string-literal": {
pattern: /r?(?:("""|''')[\s\S]*?\1|(["'])(?:\\.|(?!\2)[^\\\r\n])*\2(?!\2))/,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,
lookbehind: true,
inside: {
"punctuation": /^\$\{?|\}$/,
"expression": {
pattern: /[\s\S]+/,
inside: Prism2.languages.dart
}
}
},
"string": /[\s\S]+/
}
},
"string": void 0
});
Prism2.languages.insertBefore("dart", "class-name", {
"metadata": {
pattern: /@\w+/,
alias: "function"
}
});
Prism2.languages.insertBefore("dart", "class-name", {
"generics": {
pattern: /<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<(?:[\w\s,.&?]|<[\w\s,.&?]*>)*>)*>)*>/,
inside: {
"class-name": className,
"keyword": keywords,
"punctuation": /[<>(),.:]/,
"operator": /[?&|]/
}
}
});
})(Prism);
(function(Prism2) {
Prism2.languages.dataweave = {
"url": /\b[A-Za-z]+:\/\/[\w/:.?=&-]+|\burn:[\w:.?=&-]+/,
"property": {
pattern: /(?:\b\w+#)?(?:"(?:\\.|[^\\"\r\n])*"|\b\w+)(?=\s*[:@])/,
greedy: true
},
"string": {
pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
greedy: true
},
"mime-type": /\b(?:application|audio|image|multipart|text|video)\/[\w+-]+/,
"date": {
pattern: /\|[\w:+-]+\|/,
greedy: true
},
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"regex": {
pattern: /\/(?:[^\\\/\r\n]|\\[^\r\n])+\//,
greedy: true
},
"keyword": /\b(?:and|as|at|case|do|else|fun|if|input|is|match|not|ns|null|or|output|type|unless|update|using|var)\b/,
"function": /\b[A-Z_]\w*(?=\s*\()/i,
"number": /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
"punctuation": /[{}[\];(),.:@]/,
"operator": /<<|>>|->|[<>~=]=?|!=|--?-?|\+\+?|!|\?/,
"boolean": /\b(?:false|true)\b/
};
})(Prism);
Prism.languages.dax = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/).*)/,
lookbehind: true
},
"data-field": {
pattern: /'(?:[^']|'')*'(?!')(?:\[[ \w\xA0-\uFFFF]+\])?|\w+\[[ \w\xA0-\uFFFF]+\]/,
alias: "symbol"
},
"measure": {
pattern: /\[[ \w\xA0-\uFFFF]+\]/,
alias: "constant"
},
"string": {
pattern: /"(?:[^"]|"")*"(?!")/,
greedy: true
},
"function": /\b(?:ABS|ACOS|ACOSH|ACOT|ACOTH|ADDCOLUMNS|ADDMISSINGITEMS|ALL|ALLCROSSFILTERED|ALLEXCEPT|ALLNOBLANKROW|ALLSELECTED|AND|APPROXIMATEDISTINCTCOUNT|ASIN|ASINH|ATAN|ATANH|AVERAGE|AVERAGEA|AVERAGEX|BETA\.DIST|BETA\.INV|BLANK|CALCULATE|CALCULATETABLE|CALENDAR|CALENDARAUTO|CEILING|CHISQ\.DIST|CHISQ\.DIST\.RT|CHISQ\.INV|CHISQ\.INV\.RT|CLOSINGBALANCEMONTH|CLOSINGBALANCEQUARTER|CLOSINGBALANCEYEAR|COALESCE|COMBIN|COMBINA|COMBINEVALUES|CONCATENATE|CONCATENATEX|CONFIDENCE\.NORM|CONFIDENCE\.T|CONTAINS|CONTAINSROW|CONTAINSSTRING|CONTAINSSTRINGEXACT|CONVERT|COS|COSH|COT|COTH|COUNT|COUNTA|COUNTAX|COUNTBLANK|COUNTROWS|COUNTX|CROSSFILTER|CROSSJOIN|CURRENCY|CURRENTGROUP|CUSTOMDATA|DATATABLE|DATE|DATEADD|DATEDIFF|DATESBETWEEN|DATESINPERIOD|DATESMTD|DATESQTD|DATESYTD|DATEVALUE|DAY|DEGREES|DETAILROWS|DISTINCT|DISTINCTCOUNT|DISTINCTCOUNTNOBLANK|DIVIDE|EARLIER|EARLIEST|EDATE|ENDOFMONTH|ENDOFQUARTER|ENDOFYEAR|EOMONTH|ERROR|EVEN|EXACT|EXCEPT|EXP|EXPON\.DIST|FACT|FALSE|FILTER|FILTERS|FIND|FIRSTDATE|FIRSTNONBLANK|FIRSTNONBLANKVALUE|FIXED|FLOOR|FORMAT|GCD|GENERATE|GENERATEALL|GENERATESERIES|GEOMEAN|GEOMEANX|GROUPBY|HASONEFILTER|HASONEVALUE|HOUR|IF|IF\.EAGER|IFERROR|IGNORE|INT|INTERSECT|ISBLANK|ISCROSSFILTERED|ISEMPTY|ISERROR|ISEVEN|ISFILTERED|ISINSCOPE|ISLOGICAL|ISNONTEXT|ISNUMBER|ISO\.CEILING|ISODD|ISONORAFTER|ISSELECTEDMEASURE|ISSUBTOTAL|ISTEXT|KEEPFILTERS|KEYWORDMATCH|LASTDATE|LASTNONBLANK|LASTNONBLANKVALUE|LCM|LEFT|LEN|LN|LOG|LOG10|LOOKUPVALUE|LOWER|MAX|MAXA|MAXX|MEDIAN|MEDIANX|MID|MIN|MINA|MINUTE|MINX|MOD|MONTH|MROUND|NATURALINNERJOIN|NATURALLEFTOUTERJOIN|NEXTDAY|NEXTMONTH|NEXTQUARTER|NEXTYEAR|NONVISUAL|NORM\.DIST|NORM\.INV|NORM\.S\.DIST|NORM\.S\.INV|NOT|NOW|ODD|OPENINGBALANCEMONTH|OPENINGBALANCEQUARTER|OPENINGBALANCEYEAR|OR|PARALLELPERIOD|PATH|PATHCONTAINS|PATHITEM|PATHITEMREVERSE|PATHLENGTH|PERCENTILE\.EXC|PERCENTILE\.INC|PERCENTILEX\.EXC|PERCENTILEX\.INC|PERMUT|PI|POISSON\.DIST|POWER|PREVIOUSDAY|PREVIOUSMONTH|PREVIOUSQUARTER|PREVIOUSYEAR|PRODUCT|PRODUCTX|QUARTER|QUOTIENT|RADIANS|RAND|RANDBETWEEN|RANK\.EQ|RANKX|RELATED|RELATEDTABLE|REMOVEFILTERS|REPLACE|REPT|RIGHT|ROLLUP|ROLLUPADDISSUBTOTAL|ROLLUPGROUP|ROLLUPISSUBTOTAL|ROUND|ROUNDDOWN|ROUNDUP|ROW|SAMEPERIODLASTYEAR|SAMPLE|SEARCH|SECOND|SELECTCOLUMNS|SELECTEDMEASURE|SELECTEDMEASUREFORMATSTRING|SELECTEDMEASURENAME|SELECTEDVALUE|SIGN|SIN|SINH|SQRT|SQRTPI|STARTOFMONTH|STARTOFQUARTER|STARTOFYEAR|STDEV\.P|STDEV\.S|STDEVX\.P|STDEVX\.S|SUBSTITUTE|SUBSTITUTEWITHINDEX|SUM|SUMMARIZE|SUMMARIZECOLUMNS|SUMX|SWITCH|T\.DIST|T\.DIST\.2T|T\.DIST\.RT|T\.INV|T\.INV\.2T|TAN|TANH|TIME|TIMEVALUE|TODAY|TOPN|TOPNPERLEVEL|TOPNSKIP|TOTALMTD|TOTALQTD|TOTALYTD|TREATAS|TRIM|TRUE|TRUNC|UNICHAR|UNICODE|UNION|UPPER|USERELATIONSHIP|USERNAME|USEROBJECTID|USERPRINCIPALNAME|UTCNOW|UTCTODAY|VALUE|VALUES|VAR\.P|VAR\.S|VARX\.P|VARX\.S|WEEKDAY|WEEKNUM|XIRR|XNPV|YEAR|YEARFRAC)(?=\s*\()/i,
"keyword": /\b(?:DEFINE|EVALUATE|MEASURE|ORDER\s+BY|RETURN|VAR|START\s+AT|ASC|DESC)\b/i,
"boolean": {
pattern: /\b(?:FALSE|NULL|TRUE)\b/i,
alias: "constant"
},
"number": /\b\d+(?:\.\d*)?|\B\.\d+\b/,
"operator": /:=|[-+*\/=^]|&&?|\|\||<(?:=>?|<|>)?|>[>=]?|\b(?:IN|NOT)\b/i,
"punctuation": /[;\[\](){}`,.]/
};
Prism.languages.dhall = {
"comment": /--.*|\{-(?:[^-{]|-(?!\})|\{(?!-)|\{-(?:[^-{]|-(?!\})|\{(?!-))*-\})*-\}/,
"string": {
pattern: /"(?:[^"\\]|\\.)*"|''(?:[^']|'(?!')|'''|''\$\{)*''(?!'|\$)/,
greedy: true,
inside: {
"interpolation": {
pattern: /\$\{[^{}]*\}/,
inside: {
"expression": {
pattern: /(^\$\{)[\s\S]+(?=\}$)/,
lookbehind: true,
alias: "language-dhall",
inside: null
},
"punctuation": /\$\{|\}/
}
}
}
},
"label": {
pattern: /`[^`]*`/,
greedy: true
},
"url": {
pattern: /\bhttps?:\/\/[\w.:%!$&'*+;=@~-]+(?:\/[\w.:%!$&'*+;=@~-]*)*(?:\?[/?\w.:%!$&'*+;=@~-]*)?/,
greedy: true
},
"env": {
pattern: /\benv:(?:(?!\d)\w+|"(?:[^"\\=]|\\.)*")/,
greedy: true,
inside: {
"function": /^env/,
"operator": /^:/,
"variable": /[\s\S]+/
}
},
"hash": {
pattern: /\bsha256:[\da-fA-F]{64}\b/,
inside: {
"function": /sha256/,
"operator": /:/,
"number": /[\da-fA-F]{64}/
}
},
"keyword": /\b(?:as|assert|else|forall|if|in|let|merge|missing|then|toMap|using|with)\b|\u2200/,
"builtin": /\b(?:None|Some)\b/,
"boolean": /\b(?:False|True)\b/,
"number": /\bNaN\b|-?\bInfinity\b|[+-]?\b(?:0x[\da-fA-F]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/,
"operator": /\/\\|\/\/\\\\|&&|\|\||===|[!=]=|\/\/|->|\+\+|::|[+*#@=:?<>|\\\u2227\u2a53\u2261\u2afd\u03bb\u2192]/,
"punctuation": /\.\.|[{}\[\](),./]/,
"class-name": /\b[A-Z]\w*\b/
};
Prism.languages.dhall.string.inside.interpolation.inside.expression.inside = Prism.languages.dhall;
(function(Prism2) {
Prism2.languages.diff = {
"coord": [
/^(?:\*{3}|-{3}|\+{3}).*$/m,
/^@@.*@@$/m,
/^\d.*$/m
]
};
var PREFIXES = {
"deleted-sign": "-",
"deleted-arrow": "<",
"inserted-sign": "+",
"inserted-arrow": ">",
"unchanged": " ",
"diff": "!"
};
Object.keys(PREFIXES).forEach(function(name) {
var prefix = PREFIXES[name];
var alias = [];
if (!/^\w+$/.test(name)) {
alias.push(/\w+/.exec(name)[0]);
}
if (name === "diff") {
alias.push("bold");
}
Prism2.languages.diff[name] = {
pattern: RegExp("^(?:[" + prefix + "].*(?:\r\n?|\n|(?![\\s\\S])))+", "m"),
alias,
inside: {
"line": {
pattern: /(.)(?=[\s\S]).*(?:\r\n?|\n)?/,
lookbehind: true
},
"prefix": {
pattern: /[\s\S]/,
alias: /\w+/.exec(name)[0]
}
}
};
});
Object.defineProperty(Prism2.languages.diff, "PREFIXES", {
value: PREFIXES
});
})(Prism);
(function(Prism2) {
function getPlaceholder(language, index) {
return "___" + language.toUpperCase() + index + "___";
}
Object.defineProperties(Prism2.languages["markup-templating"] = {}, {
buildPlaceholders: {
value: function(env, language, placeholderPattern, replaceFilter) {
if (env.language !== language) {
return;
}
var tokenStack = env.tokenStack = [];
env.code = env.code.replace(placeholderPattern, function(match) {
if (typeof replaceFilter === "function" && !replaceFilter(match)) {
return match;
}
var i = tokenStack.length;
var placeholder;
while (env.code.indexOf(placeholder = getPlaceholder(language, i)) !== -1) {
++i;
}
tokenStack[i] = match;
return placeholder;
});
env.grammar = Prism2.languages.markup;
}
},
tokenizePlaceholders: {
value: function(env, language) {
if (env.language !== language || !env.tokenStack) {
return;
}
env.grammar = Prism2.languages[language];
var j = 0;
var keys = Object.keys(env.tokenStack);
function walkTokens(tokens) {
for (var i = 0; i < tokens.length; i++) {
if (j >= keys.length) {
break;
}
var token = tokens[i];
if (typeof token === "string" || token.content && typeof token.content === "string") {
var k = keys[j];
var t = env.tokenStack[k];
var s = typeof token === "string" ? token : token.content;
var placeholder = getPlaceholder(language, k);
var index = s.indexOf(placeholder);
if (index > -1) {
++j;
var before = s.substring(0, index);
var middle = new Prism2.Token(language, Prism2.tokenize(t, env.grammar), "language-" + language, t);
var after = s.substring(index + placeholder.length);
var replacement = [];
if (before) {
replacement.push.apply(replacement, walkTokens([before]));
}
replacement.push(middle);
if (after) {
replacement.push.apply(replacement, walkTokens([after]));
}
if (typeof token === "string") {
tokens.splice.apply(tokens, [i, 1].concat(replacement));
} else {
token.content = replacement;
}
}
} else if (token.content) {
walkTokens(token.content);
}
}
return tokens;
}
walkTokens(env.tokens);
}
}
});
})(Prism);
(function(Prism2) {
Prism2.languages.django = {
"comment": /^\{#[\s\S]*?#\}$/,
"tag": {
pattern: /(^\{%[+-]?\s*)\w+/,
lookbehind: true,
alias: "keyword"
},
"delimiter": {
pattern: /^\{[{%][+-]?|[+-]?[}%]\}$/,
alias: "punctuation"
},
"string": {
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"filter": {
pattern: /(\|)\w+/,
lookbehind: true,
alias: "function"
},
"test": {
pattern: /(\bis\s+(?:not\s+)?)(?!not\b)\w+/,
lookbehind: true,
alias: "function"
},
"function": /\b[a-z_]\w+(?=\s*\()/i,
"keyword": /\b(?:and|as|by|else|for|if|import|in|is|loop|not|or|recursive|with|without)\b/,
"operator": /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,
"number": /\b\d+(?:\.\d+)?\b/,
"boolean": /[Ff]alse|[Nn]one|[Tt]rue/,
"variable": /\b\w+\b/,
"punctuation": /[{}[\](),.:;]/
};
var pattern = /\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g;
var markupTemplating = Prism2.languages["markup-templating"];
Prism2.hooks.add("before-tokenize", function(env) {
markupTemplating.buildPlaceholders(env, "django", pattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
markupTemplating.tokenizePlaceholders(env, "django");
});
Prism2.languages.jinja2 = Prism2.languages.django;
Prism2.hooks.add("before-tokenize", function(env) {
markupTemplating.buildPlaceholders(env, "jinja2", pattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
markupTemplating.tokenizePlaceholders(env, "jinja2");
});
})(Prism);
Prism.languages["dns-zone-file"] = {
"comment": /;.*/,
"string": {
pattern: /"(?:\\.|[^"\\\r\n])*"/,
greedy: true
},
"variable": [
{
pattern: /(^\$ORIGIN[ \t]+)\S+/m,
lookbehind: true
},
{
pattern: /(^|\s)@(?=\s|$)/,
lookbehind: true
}
],
"keyword": /^\$(?:INCLUDE|ORIGIN|TTL)(?=\s|$)/m,
"class": {
pattern: /(^|\s)(?:CH|CS|HS|IN)(?=\s|$)/,
lookbehind: true,
alias: "keyword"
},
"type": {
pattern: /(^|\s)(?:A|A6|AAAA|AFSDB|APL|ATMA|CAA|CDNSKEY|CDS|CERT|CNAME|DHCID|DLV|DNAME|DNSKEY|DS|EID|GID|GPOS|HINFO|HIP|IPSECKEY|ISDN|KEY|KX|LOC|MAILA|MAILB|MB|MD|MF|MG|MINFO|MR|MX|NAPTR|NB|NBSTAT|NIMLOC|NINFO|NS|NSAP|NSAP-PTR|NSEC|NSEC3|NSEC3PARAM|NULL|NXT|OPENPGPKEY|PTR|PX|RKEY|RP|RRSIG|RT|SIG|SINK|SMIMEA|SOA|SPF|SRV|SSHFP|TA|TKEY|TLSA|TSIG|TXT|UID|UINFO|UNSPEC|URI|WKS|X25)(?=\s|$)/,
lookbehind: true,
alias: "keyword"
},
"punctuation": /[()]/
};
Prism.languages["dns-zone"] = Prism.languages["dns-zone-file"];
(function(Prism2) {
var spaceAfterBackSlash = /\\[\r\n](?:\s|\\[\r\n]|#.*(?!.))*(?![\s#]|\\[\r\n])/.source;
var space = /(?:[ \t]+(?![ \t])(?:<SP_BS>)?|<SP_BS>)/.source.replace(/<SP_BS>/g, function() {
return spaceAfterBackSlash;
});
var string = /"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"|'(?:[^'\\\r\n]|\\(?:\r\n|[\s\S]))*'/.source;
var option = /--[\w-]+=(?:<STR>|(?!["'])(?:[^\s\\]|\\.)+)/.source.replace(/<STR>/g, function() {
return string;
});
var stringRule = {
pattern: RegExp(string),
greedy: true
};
var commentRule = {
pattern: /(^[ \t]*)#.*/m,
lookbehind: true,
greedy: true
};
function re(source, flags) {
source = source.replace(/<OPT>/g, function() {
return option;
}).replace(/<SP>/g, function() {
return space;
});
return RegExp(source, flags);
}
Prism2.languages.docker = {
"instruction": {
pattern: /(^[ \t]*)(?:ADD|ARG|CMD|COPY|ENTRYPOINT|ENV|EXPOSE|FROM|HEALTHCHECK|LABEL|MAINTAINER|ONBUILD|RUN|SHELL|STOPSIGNAL|USER|VOLUME|WORKDIR)(?=\s)(?:\\.|[^\r\n\\])*(?:\\$(?:\s|#.*$)*(?![\s#])(?:\\.|[^\r\n\\])*)*/im,
lookbehind: true,
greedy: true,
inside: {
"options": {
pattern: re(/(^(?:ONBUILD<SP>)?\w+<SP>)<OPT>(?:<SP><OPT>)*/.source, "i"),
lookbehind: true,
greedy: true,
inside: {
"property": {
pattern: /(^|\s)--[\w-]+/,
lookbehind: true
},
"string": [
stringRule,
{
pattern: /(=)(?!["'])(?:[^\s\\]|\\.)+/,
lookbehind: true
}
],
"operator": /\\$/m,
"punctuation": /=/
}
},
"keyword": [
{
pattern: re(/(^(?:ONBUILD<SP>)?HEALTHCHECK<SP>(?:<OPT><SP>)*)(?:CMD|NONE)\b/.source, "i"),
lookbehind: true,
greedy: true
},
{
pattern: re(/(^(?:ONBUILD<SP>)?FROM<SP>(?:<OPT><SP>)*(?!--)[^ \t\\]+<SP>)AS/.source, "i"),
lookbehind: true,
greedy: true
},
{
pattern: re(/(^ONBUILD<SP>)\w+/.source, "i"),
lookbehind: true,
greedy: true
},
{
pattern: /^\w+/,
greedy: true
}
],
"comment": commentRule,
"string": stringRule,
"variable": /\$(?:\w+|\{[^{}"'\\]*\})/,
"operator": /\\$/m
}
},
"comment": commentRule
};
Prism2.languages.dockerfile = Prism2.languages.docker;
})(Prism);
(function(Prism2) {
var ID = "(?:" + [
/[a-zA-Z_\x80-\uFFFF][\w\x80-\uFFFF]*/.source,
/-?(?:\.\d+|\d+(?:\.\d*)?)/.source,
/"[^"\\]*(?:\\[\s\S][^"\\]*)*"/.source,
/<(?:[^<>]|(?!<!--)<(?:[^<>"']|"[^"]*"|'[^']*')+>|<!--(?:[^-]|-(?!->))*-->)*>/.source
].join("|") + ")";
var IDInside = {
"markup": {
pattern: /(^<)[\s\S]+(?=>$)/,
lookbehind: true,
alias: ["language-markup", "language-html", "language-xml"],
inside: Prism2.languages.markup
}
};
function withID(source, flags) {
return RegExp(source.replace(/<ID>/g, function() {
return ID;
}), flags);
}
Prism2.languages.dot = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\/|^#.*/m,
greedy: true
},
"graph-name": {
pattern: withID(/(\b(?:digraph|graph|subgraph)[ \t\r\n]+)<ID>/.source, "i"),
lookbehind: true,
greedy: true,
alias: "class-name",
inside: IDInside
},
"attr-value": {
pattern: withID(/(=[ \t\r\n]*)<ID>/.source),
lookbehind: true,
greedy: true,
inside: IDInside
},
"attr-name": {
pattern: withID(/([\[;, \t\r\n])<ID>(?=[ \t\r\n]*=)/.source),
lookbehind: true,
greedy: true,
inside: IDInside
},
"keyword": /\b(?:digraph|edge|graph|node|strict|subgraph)\b/i,
"compass-point": {
pattern: /(:[ \t\r\n]*)(?:[ewc_]|[ns][ew]?)(?![\w\x80-\uFFFF])/,
lookbehind: true,
alias: "builtin"
},
"node": {
pattern: withID(/(^|[^-.\w\x80-\uFFFF\\])<ID>/.source),
lookbehind: true,
greedy: true,
inside: IDInside
},
"operator": /[=:]|-[->]/,
"punctuation": /[\[\]{};,]/
};
Prism2.languages.gv = Prism2.languages.dot;
})(Prism);
Prism.languages.ebnf = {
"comment": /\(\*[\s\S]*?\*\)/,
"string": {
pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
greedy: true
},
"special": {
pattern: /\?[^?\r\n]*\?/,
greedy: true,
alias: "class-name"
},
"definition": {
pattern: /^([\t ]*)[a-z]\w*(?:[ \t]+[a-z]\w*)*(?=\s*=)/im,
lookbehind: true,
alias: ["rule", "keyword"]
},
"rule": /\b[a-z]\w*(?:[ \t]+[a-z]\w*)*\b/i,
"punctuation": /\([:/]|[:/]\)|[.,;()[\]{}]/,
"operator": /[-=|*/!]/
};
Prism.languages.editorconfig = {
"comment": /[;#].*/,
"section": {
pattern: /(^[ \t]*)\[.+\]/m,
lookbehind: true,
alias: "selector",
inside: {
"regex": /\\\\[\[\]{},!?.*]/,
"operator": /[!?]|\.\.|\*{1,2}/,
"punctuation": /[\[\]{},]/
}
},
"key": {
pattern: /(^[ \t]*)[^\s=]+(?=[ \t]*=)/m,
lookbehind: true,
alias: "attr-name"
},
"value": {
pattern: /=.*/,
alias: "attr-value",
inside: {
"punctuation": /^=/
}
}
};
Prism.languages.eiffel = {
"comment": /--.*/,
"string": [
{
pattern: /"([^[]*)\[[\s\S]*?\]\1"/,
greedy: true
},
{
pattern: /"([^{]*)\{[\s\S]*?\}\1"/,
greedy: true
},
{
pattern: /"(?:%(?:(?!\n)\s)*\n\s*%|%\S|[^%"\r\n])*"/,
greedy: true
}
],
"char": /'(?:%.|[^%'\r\n])+'/,
"keyword": /\b(?:across|agent|alias|all|and|as|assign|attached|attribute|check|class|convert|create|Current|debug|deferred|detachable|do|else|elseif|end|ensure|expanded|export|external|feature|from|frozen|if|implies|inherit|inspect|invariant|like|local|loop|not|note|obsolete|old|once|or|Precursor|redefine|rename|require|rescue|Result|retry|select|separate|some|then|undefine|until|variant|Void|when|xor)\b/i,
"boolean": /\b(?:False|True)\b/i,
"class-name": /\b[A-Z][\dA-Z_]*\b/,
"number": [
/\b0[xcb][\da-f](?:_*[\da-f])*\b/i,
/(?:\b\d(?:_*\d)*)?\.(?:(?:\d(?:_*\d)*)?e[+-]?)?\d(?:_*\d)*\b|\b\d(?:_*\d)*\b\.?/i
],
"punctuation": /:=|<<|>>|\(\||\|\)|->|\.(?=\w)|[{}[\];(),:?]/,
"operator": /\\\\|\|\.\.\||\.\.|\/[~\/=]?|[><]=?|[-+*^=~]/
};
(function(Prism2) {
Prism2.languages.ejs = {
"delimiter": {
pattern: /^<%[-_=]?|[-_]?%>$/,
alias: "punctuation"
},
"comment": /^#[\s\S]*/,
"language-javascript": {
pattern: /[\s\S]+/,
inside: Prism2.languages.javascript
}
};
Prism2.hooks.add("before-tokenize", function(env) {
var ejsPattern = /<%(?!%)[\s\S]+?%>/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "ejs", ejsPattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "ejs");
});
Prism2.languages.eta = Prism2.languages.ejs;
})(Prism);
Prism.languages.elixir = {
"doc": {
pattern: /@(?:doc|moduledoc)\s+(?:("""|''')[\s\S]*?\1|("|')(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2)/,
inside: {
"attribute": /^@\w+/,
"string": /['"][\s\S]+/
}
},
"comment": {
pattern: /#.*/,
greedy: true
},
"regex": {
pattern: /~[rR](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|[^\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[uismxfr]*/,
greedy: true
},
"string": [
{
pattern: /~[cCsSwW](?:("""|''')(?:\\[\s\S]|(?!\1)[^\\])+\1|([\/|"'])(?:\\.|(?!\2)[^\\\r\n])+\2|\((?:\\.|[^\\)\r\n])+\)|\[(?:\\.|[^\\\]\r\n])+\]|\{(?:\\.|#\{[^}]+\}|#(?!\{)|[^#\\}\r\n])+\}|<(?:\\.|[^\\>\r\n])+>)[csa]?/,
greedy: true,
inside: {}
},
{
pattern: /("""|''')[\s\S]*?\1/,
greedy: true,
inside: {}
},
{
pattern: /("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true,
inside: {}
}
],
"atom": {
pattern: /(^|[^:]):\w+/,
lookbehind: true,
alias: "symbol"
},
"module": {
pattern: /\b[A-Z]\w*\b/,
alias: "class-name"
},
"attr-name": /\b\w+\??:(?!:)/,
"argument": {
pattern: /(^|[^&])&\d+/,
lookbehind: true,
alias: "variable"
},
"attribute": {
pattern: /@\w+/,
alias: "variable"
},
"function": /\b[_a-zA-Z]\w*[?!]?(?:(?=\s*(?:\.\s*)?\()|(?=\/\d))/,
"number": /\b(?:0[box][a-f\d_]+|\d[\d_]*)(?:\.[\d_]+)?(?:e[+-]?[\d_]+)?\b/i,
"keyword": /\b(?:after|alias|and|case|catch|cond|def(?:callback|delegate|exception|impl|macro|module|n|np|p|protocol|struct)?|do|else|end|fn|for|if|import|not|or|quote|raise|require|rescue|try|unless|unquote|use|when)\b/,
"boolean": /\b(?:false|nil|true)\b/,
"operator": [
/\bin\b|&&?|\|[|>]?|\\\\|::|\.\.\.?|\+\+?|-[->]?|<[-=>]|>=|!==?|\B!|=(?:==?|[>~])?|[*\/^]/,
{
pattern: /([^<])<(?!<)/,
lookbehind: true
},
{
pattern: /([^>])>(?!>)/,
lookbehind: true
}
],
"punctuation": /<<|>>|[.,%\[\]{}()]/
};
Prism.languages.elixir.string.forEach(function(o) {
o.inside = {
"interpolation": {
pattern: /#\{[^}]+\}/,
inside: {
"delimiter": {
pattern: /^#\{|\}$/,
alias: "punctuation"
},
rest: Prism.languages.elixir
}
}
};
});
Prism.languages.elm = {
"comment": /--.*|\{-[\s\S]*?-\}/,
"char": {
pattern: /'(?:[^\\'\r\n]|\\(?:[abfnrtv\\']|\d+|x[0-9a-fA-F]+|u\{[0-9a-fA-F]+\}))'/,
greedy: true
},
"string": [
{
pattern: /"""[\s\S]*?"""/,
greedy: true
},
{
pattern: /"(?:[^\\"\r\n]|\\.)*"/,
greedy: true
}
],
"import-statement": {
pattern: /(^[\t ]*)import\s+[A-Z]\w*(?:\.[A-Z]\w*)*(?:\s+as\s+(?:[A-Z]\w*)(?:\.[A-Z]\w*)*)?(?:\s+exposing\s+)?/m,
lookbehind: true,
inside: {
"keyword": /\b(?:as|exposing|import)\b/
}
},
"keyword": /\b(?:alias|as|case|else|exposing|if|in|infixl|infixr|let|module|of|then|type)\b/,
"builtin": /\b(?:abs|acos|always|asin|atan|atan2|ceiling|clamp|compare|cos|curry|degrees|e|flip|floor|fromPolar|identity|isInfinite|isNaN|logBase|max|min|negate|never|not|pi|radians|rem|round|sin|sqrt|tan|toFloat|toPolar|toString|truncate|turns|uncurry|xor)\b/,
"number": /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0x[0-9a-f]+)\b/i,
"operator": /\s\.\s|[+\-/*=.$<>:&|^?%#@~!]{2,}|[+\-/*=$<>:&|^?%#@~!]/,
"hvariable": /\b(?:[A-Z]\w*\.)*[a-z]\w*\b/,
"constant": /\b(?:[A-Z]\w*\.)*[A-Z]\w*\b/,
"punctuation": /[{}[\]|(),.:]/
};
Prism.languages.lua = {
"comment": /^#!.+|--(?:\[(=*)\[[\s\S]*?\]\1\]|.*)/m,
"string": {
pattern: /(["'])(?:(?!\1)[^\\\r\n]|\\z(?:\r\n|\s)|\\(?:\r\n|[^z]))*\1|\[(=*)\[[\s\S]*?\]\2\]/,
greedy: true
},
"number": /\b0x[a-f\d]+(?:\.[a-f\d]*)?(?:p[+-]?\d+)?\b|\b\d+(?:\.\B|(?:\.\d*)?(?:e[+-]?\d+)?\b)|\B\.\d+(?:e[+-]?\d+)?\b/i,
"keyword": /\b(?:and|break|do|else|elseif|end|false|for|function|goto|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/,
"function": /(?!\d)\w+(?=\s*(?:[({]))/,
"operator": [
/[-+*%^&|#]|\/\/?|<[<=]?|>[>=]?|[=~]=?/,
{
pattern: /(^|[^.])\.\.(?!\.)/,
lookbehind: true
}
],
"punctuation": /[\[\](){},;]|\.+|:+/
};
(function(Prism2) {
Prism2.languages.etlua = {
"delimiter": {
pattern: /^<%[-=]?|-?%>$/,
alias: "punctuation"
},
"language-lua": {
pattern: /[\s\S]+/,
inside: Prism2.languages.lua
}
};
Prism2.hooks.add("before-tokenize", function(env) {
var pattern = /<%[\s\S]+?%>/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "etlua", pattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "etlua");
});
})(Prism);
(function(Prism2) {
Prism2.languages.erb = {
"delimiter": {
pattern: /^(\s*)<%=?|%>(?=\s*$)/,
lookbehind: true,
alias: "punctuation"
},
"ruby": {
pattern: /\s*\S[\s\S]*/,
alias: "language-ruby",
inside: Prism2.languages.ruby
}
};
Prism2.hooks.add("before-tokenize", function(env) {
var erbPattern = /<%=?(?:[^\r\n]|[\r\n](?!=begin)|[\r\n]=begin\s(?:[^\r\n]|[\r\n](?!=end))*[\r\n]=end)+?%>/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "erb", erbPattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "erb");
});
})(Prism);
Prism.languages.erlang = {
"comment": /%.+/,
"string": {
pattern: /"(?:\\.|[^\\"\r\n])*"/,
greedy: true
},
"quoted-function": {
pattern: /'(?:\\.|[^\\'\r\n])+'(?=\()/,
alias: "function"
},
"quoted-atom": {
pattern: /'(?:\\.|[^\\'\r\n])+'/,
alias: "atom"
},
"boolean": /\b(?:false|true)\b/,
"keyword": /\b(?:after|begin|case|catch|end|fun|if|of|receive|try|when)\b/,
"number": [
/\$\\?./,
/\b\d+#[a-z0-9]+/i,
/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i
],
"function": /\b[a-z][\w@]*(?=\()/,
"variable": {
pattern: /(^|[^@])(?:\b|\?)[A-Z_][\w@]*/,
lookbehind: true
},
"operator": [
/[=\/<>:]=|=[:\/]=|\+\+?|--?|[=*\/!]|\b(?:and|andalso|band|bnot|bor|bsl|bsr|bxor|div|not|or|orelse|rem|xor)\b/,
{
pattern: /(^|[^<])<(?!<)/,
lookbehind: true
},
{
pattern: /(^|[^>])>(?!>)/,
lookbehind: true
}
],
"atom": /\b[a-z][\w@]*/,
"punctuation": /[()[\]{}:;,.#|]|<<|>>/
};
Prism.languages["excel-formula"] = {
"comment": {
pattern: /(\bN\(\s*)"(?:[^"]|"")*"(?=\s*\))/i,
lookbehind: true,
greedy: true
},
"string": {
pattern: /"(?:[^"]|"")*"(?!")/,
greedy: true
},
"reference": {
pattern: /(?:'[^']*'|(?:[^\s()[\]{}<>*?"';,$&]*\[[^^\s()[\]{}<>*?"']+\])?\w+)!/,
greedy: true,
alias: "string",
inside: {
"operator": /!$/,
"punctuation": /'/,
"sheet": {
pattern: /[^[\]]+$/,
alias: "function"
},
"file": {
pattern: /\[[^[\]]+\]$/,
inside: {
"punctuation": /[[\]]/
}
},
"path": /[\s\S]+/
}
},
"function-name": {
pattern: /\b[A-Z]\w*(?=\()/i,
alias: "builtin"
},
"range": {
pattern: /\$?\b(?:[A-Z]+\$?\d+:\$?[A-Z]+\$?\d+|[A-Z]+:\$?[A-Z]+|\d+:\$?\d+)\b/i,
alias: "selector",
inside: {
"operator": /:/,
"cell": /\$?[A-Z]+\$?\d+/i,
"column": /\$?[A-Z]+/i,
"row": /\$?\d+/
}
},
"cell": {
pattern: /\b[A-Z]+\d+\b|\$[A-Za-z]+\$?\d+\b|\b[A-Za-z]+\$\d+\b/,
alias: "selector"
},
"number": /(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?\b/i,
"boolean": /\b(?:FALSE|TRUE)\b/i,
"operator": /[-+*/^%=&,]|<[=>]?|>=?/,
"punctuation": /[[\]();{}|]/
};
Prism.languages["xlsx"] = Prism.languages["xls"] = Prism.languages["excel-formula"];
Prism.languages.fsharp = Prism.languages.extend("clike", {
"comment": [
{
pattern: /(^|[^\\])\(\*(?!\))[\s\S]*?\*\)/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"string": {
pattern: /(?:"""[\s\S]*?"""|@"(?:""|[^"])*"|"(?:\\[\s\S]|[^\\"])*")B?/,
greedy: true
},
"class-name": {
pattern: /(\b(?:exception|inherit|interface|new|of|type)\s+|\w\s*:\s*|\s:\??>\s*)[.\w]+\b(?:\s*(?:->|\*)\s*[.\w]+\b)*(?!\s*[:.])/,
lookbehind: true,
inside: {
"operator": /->|\*/,
"punctuation": /\./
}
},
"keyword": /\b(?:let|return|use|yield)(?:!\B|\b)|\b(?:abstract|and|as|asr|assert|atomic|base|begin|break|checked|class|component|const|constraint|constructor|continue|default|delegate|do|done|downcast|downto|eager|elif|else|end|event|exception|extern|external|false|finally|fixed|for|fun|function|functor|global|if|in|include|inherit|inline|interface|internal|land|lazy|lor|lsl|lsr|lxor|match|member|method|mixin|mod|module|mutable|namespace|new|not|null|object|of|open|or|override|parallel|private|process|protected|public|pure|rec|sealed|select|sig|static|struct|tailcall|then|to|trait|true|try|type|upcast|val|virtual|void|volatile|when|while|with)\b/,
"number": [
/\b0x[\da-fA-F]+(?:LF|lf|un)?\b/,
/\b0b[01]+(?:uy|y)?\b/,
/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[fm]|e[+-]?\d+)?\b/i,
/\b\d+(?:[IlLsy]|UL|u[lsy]?)?\b/
],
"operator": /([<>~&^])\1\1|([*.:<>&])\2|<-|->|[!=:]=|<?\|{1,3}>?|\??(?:<=|>=|<>|[-+*/%=<>])\??|[!?^&]|~[+~-]|:>|:\?>?/
});
Prism.languages.insertBefore("fsharp", "keyword", {
"preprocessor": {
pattern: /(^[\t ]*)#.*/m,
lookbehind: true,
alias: "property",
inside: {
"directive": {
pattern: /(^#)\b(?:else|endif|if|light|line|nowarn)\b/,
lookbehind: true,
alias: "keyword"
}
}
}
});
Prism.languages.insertBefore("fsharp", "punctuation", {
"computation-expression": {
pattern: /\b[_a-z]\w*(?=\s*\{)/i,
alias: "keyword"
}
});
Prism.languages.insertBefore("fsharp", "string", {
"annotation": {
pattern: /\[<.+?>\]/,
greedy: true,
inside: {
"punctuation": /^\[<|>\]$/,
"class-name": {
pattern: /^\w+$|(^|;\s*)[A-Z]\w*(?=\()/,
lookbehind: true
},
"annotation-content": {
pattern: /[\s\S]+/,
inside: Prism.languages.fsharp
}
}
},
"char": {
pattern: /'(?:[^\\']|\\(?:.|\d{3}|x[a-fA-F\d]{2}|u[a-fA-F\d]{4}|U[a-fA-F\d]{8}))'B?/,
greedy: true
}
});
(function(Prism2) {
var comment_inside = {
"function": /\b(?:BUGS?|FIX(?:MES?)?|NOTES?|TODOS?|XX+|HACKS?|WARN(?:ING)?|\?{2,}|!{2,})\b/
};
var string_inside = {
"number": /\\[^\s']|%\w/
};
var factor = {
"comment": [
{
pattern: /(^|\s)(?:! .*|!$)/,
lookbehind: true,
inside: comment_inside
},
{
pattern: /(^|\s)\/\*\s[\s\S]*?\*\/(?=\s|$)/,
lookbehind: true,
greedy: true,
inside: comment_inside
},
{
pattern: /(^|\s)!\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,
lookbehind: true,
greedy: true,
inside: comment_inside
}
],
"number": [
{
pattern: /(^|\s)[+-]?\d+(?=\s|$)/,
lookbehind: true
},
{
pattern: /(^|\s)[+-]?0(?:b[01]+|o[0-7]+|d\d+|x[\dA-F]+)(?=\s|$)/i,
lookbehind: true
},
{
pattern: /(^|\s)[+-]?\d+\/\d+\.?(?=\s|$)/,
lookbehind: true
},
{
pattern: /(^|\s)\+?\d+\+\d+\/\d+(?=\s|$)/,
lookbehind: true
},
{
pattern: /(^|\s)-\d+-\d+\/\d+(?=\s|$)/,
lookbehind: true
},
{
pattern: /(^|\s)[+-]?(?:\d*\.\d+|\d+\.\d*|\d+)(?:e[+-]?\d+)?(?=\s|$)/i,
lookbehind: true
},
{
pattern: /(^|\s)NAN:\s+[\da-fA-F]+(?=\s|$)/,
lookbehind: true
},
{
pattern: /(^|\s)[+-]?0(?:b1\.[01]*|o1\.[0-7]*|d1\.\d*|x1\.[\dA-F]*)p\d+(?=\s|$)/i,
lookbehind: true
}
],
"regexp": {
pattern: /(^|\s)R\/\s(?:\\\S|[^\\/])*\/(?:[idmsr]*|[idmsr]+-[idmsr]+)(?=\s|$)/,
lookbehind: true,
alias: "number",
inside: {
"variable": /\\\S/,
"keyword": /[+?*\[\]^$(){}.|]/,
"operator": {
pattern: /(\/)[idmsr]+(?:-[idmsr]+)?/,
lookbehind: true
}
}
},
"boolean": {
pattern: /(^|\s)[tf](?=\s|$)/,
lookbehind: true
},
"custom-string": {
pattern: /(^|\s)[A-Z0-9\-]+"\s(?:\\\S|[^"\\])*"/,
lookbehind: true,
greedy: true,
alias: "string",
inside: {
"number": /\\\S|%\w|\//
}
},
"multiline-string": [
{
pattern: /(^|\s)STRING:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*;(?=\s|$)/,
lookbehind: true,
greedy: true,
alias: "string",
inside: {
"number": string_inside.number,
"semicolon-or-setlocal": {
pattern: /([\r\n][ \t]*);(?=\s|$)/,
lookbehind: true,
alias: "function"
}
}
},
{
pattern: /(^|\s)HEREDOC:\s+\S+(?:\n|\r\n).*(?:\n|\r\n)\s*\S+(?=\s|$)/,
lookbehind: true,
greedy: true,
alias: "string",
inside: string_inside
},
{
pattern: /(^|\s)\[(={0,6})\[\s[\s\S]*?\]\2\](?=\s|$)/,
lookbehind: true,
greedy: true,
alias: "string",
inside: string_inside
}
],
"special-using": {
pattern: /(^|\s)USING:(?:\s\S+)*(?=\s+;(?:\s|$))/,
lookbehind: true,
alias: "function",
inside: {
"string": {
pattern: /(\s)[^:\s]+/,
lookbehind: true
}
}
},
"stack-effect-delimiter": [
{
pattern: /(^|\s)(?:call|eval|execute)?\((?=\s)/,
lookbehind: true,
alias: "operator"
},
{
pattern: /(\s)--(?=\s)/,
lookbehind: true,
alias: "operator"
},
{
pattern: /(\s)\)(?=\s|$)/,
lookbehind: true,
alias: "operator"
}
],
"combinators": {
pattern: null,
lookbehind: true,
alias: "keyword"
},
"kernel-builtin": {
pattern: null,
lookbehind: true,
alias: "variable"
},
"sequences-builtin": {
pattern: null,
lookbehind: true,
alias: "variable"
},
"math-builtin": {
pattern: null,
lookbehind: true,
alias: "variable"
},
"constructor-word": {
pattern: /(^|\s)<(?!=+>|-+>)\S+>(?=\s|$)/,
lookbehind: true,
alias: "keyword"
},
"other-builtin-syntax": {
pattern: null,
lookbehind: true,
alias: "operator"
},
"conventionally-named-word": {
pattern: /(^|\s)(?!")(?:(?:change|new|set|with)-\S+|\$\S+|>[^>\s]+|[^:>\s]+>|[^>\s]+>[^>\s]+|\+[^+\s]+\+|[^?\s]+\?|\?[^?\s]+|[^>\s]+>>|>>[^>\s]+|[^<\s]+<<|\([^()\s]+\)|[^!\s]+!|[^*\s]\S*\*|[^.\s]\S*\.)(?=\s|$)/,
lookbehind: true,
alias: "keyword"
},
"colon-syntax": {
pattern: /(^|\s)(?:[A-Z0-9\-]+#?)?:{1,2}\s+(?:;\S+|(?!;)\S+)(?=\s|$)/,
lookbehind: true,
greedy: true,
alias: "function"
},
"semicolon-or-setlocal": {
pattern: /(\s)(?:;|:>)(?=\s|$)/,
lookbehind: true,
alias: "function"
},
"curly-brace-literal-delimiter": [
{
pattern: /(^|\s)[a-z]*\{(?=\s)/i,
lookbehind: true,
alias: "operator"
},
{
pattern: /(\s)\}(?=\s|$)/,
lookbehind: true,
alias: "operator"
}
],
"quotation-delimiter": [
{
pattern: /(^|\s)\[(?=\s)/,
lookbehind: true,
alias: "operator"
},
{
pattern: /(\s)\](?=\s|$)/,
lookbehind: true,
alias: "operator"
}
],
"normal-word": {
pattern: /(^|\s)[^"\s]\S*(?=\s|$)/,
lookbehind: true
},
"string": {
pattern: /"(?:\\\S|[^"\\])*"/,
greedy: true,
inside: string_inside
}
};
var escape = function(str) {
return (str + "").replace(/([.?*+\^$\[\]\\(){}|\-])/g, "\\$1");
};
var arrToWordsRegExp = function(arr) {
return new RegExp(
"(^|\\s)(?:" + arr.map(escape).join("|") + ")(?=\\s|$)"
);
};
var builtins = {
"kernel-builtin": [
"or",
"2nipd",
"4drop",
"tuck",
"wrapper",
"nip",
"wrapper?",
"callstack>array",
"die",
"dupd",
"callstack",
"callstack?",
"3dup",
"hashcode",
"pick",
"4nip",
"build",
">boolean",
"nipd",
"clone",
"5nip",
"eq?",
"?",
"=",
"swapd",
"2over",
"clear",
"2dup",
"get-retainstack",
"not",
"tuple?",
"dup",
"3nipd",
"call",
"-rotd",
"object",
"drop",
"assert=",
"assert?",
"-rot",
"execute",
"boa",
"get-callstack",
"curried?",
"3drop",
"pickd",
"overd",
"over",
"roll",
"3nip",
"swap",
"and",
"2nip",
"rotd",
"throw",
"(clone)",
"hashcode*",
"spin",
"reach",
"4dup",
"equal?",
"get-datastack",
"assert",
"2drop",
"<wrapper>",
"boolean?",
"identity-hashcode",
"identity-tuple?",
"null",
"composed?",
"new",
"5drop",
"rot",
"-roll",
"xor",
"identity-tuple",
"boolean"
],
"other-builtin-syntax": [
"=======",
"recursive",
"flushable",
">>",
"<<<<<<",
"M\\",
"B",
"PRIVATE>",
"\\",
"======",
"final",
"inline",
"delimiter",
"deprecated",
"<PRIVATE",
">>>>>>",
"<<<<<<<",
"parse-complex",
"malformed-complex",
"read-only",
">>>>>>>",
"call-next-method",
"<<",
"foldable",
"$",
"$[",
"${"
],
"sequences-builtin": [
"member-eq?",
"mismatch",
"append",
"assert-sequence=",
"longer",
"repetition",
"clone-like",
"3sequence",
"assert-sequence?",
"last-index-from",
"reversed",
"index-from",
"cut*",
"pad-tail",
"join-as",
"remove-eq!",
"concat-as",
"but-last",
"snip",
"nths",
"nth",
"sequence",
"longest",
"slice?",
"<slice>",
"remove-nth",
"tail-slice",
"empty?",
"tail*",
"member?",
"virtual-sequence?",
"set-length",
"drop-prefix",
"iota",
"unclip",
"bounds-error?",
"unclip-last-slice",
"non-negative-integer-expected",
"non-negative-integer-expected?",
"midpoint@",
"longer?",
"?set-nth",
"?first",
"rest-slice",
"prepend-as",
"prepend",
"fourth",
"sift",
"subseq-start",
"new-sequence",
"?last",
"like",
"first4",
"1sequence",
"reverse",
"slice",
"virtual@",
"repetition?",
"set-last",
"index",
"4sequence",
"max-length",
"set-second",
"immutable-sequence",
"first2",
"first3",
"supremum",
"unclip-slice",
"suffix!",
"insert-nth",
"tail",
"3append",
"short",
"suffix",
"concat",
"flip",
"immutable?",
"reverse!",
"2sequence",
"sum",
"delete-all",
"indices",
"snip-slice",
"<iota>",
"check-slice",
"sequence?",
"head",
"append-as",
"halves",
"sequence=",
"collapse-slice",
"?second",
"slice-error?",
"product",
"bounds-check?",
"bounds-check",
"immutable",
"virtual-exemplar",
"harvest",
"remove",
"pad-head",
"last",
"set-fourth",
"cartesian-product",
"remove-eq",
"shorten",
"shorter",
"reversed?",
"shorter?",
"shortest",
"head-slice",
"pop*",
"tail-slice*",
"but-last-slice",
"iota?",
"append!",
"cut-slice",
"new-resizable",
"head-slice*",
"sequence-hashcode",
"pop",
"set-nth",
"?nth",
"second",
"join",
"immutable-sequence?",
"<reversed>",
"3append-as",
"virtual-sequence",
"subseq?",
"remove-nth!",
"length",
"last-index",
"lengthen",
"assert-sequence",
"copy",
"move",
"third",
"first",
"tail?",
"set-first",
"prefix",
"bounds-error",
"<repetition>",
"exchange",
"surround",
"cut",
"min-length",
"set-third",
"push-all",
"head?",
"subseq-start-from",
"delete-slice",
"rest",
"sum-lengths",
"head*",
"infimum",
"remove!",
"glue",
"slice-error",
"subseq",
"push",
"replace-slice",
"subseq-as",
"unclip-last"
],
"math-builtin": [
"number=",
"next-power-of-2",
"?1+",
"fp-special?",
"imaginary-part",
"float>bits",
"number?",
"fp-infinity?",
"bignum?",
"fp-snan?",
"denominator",
"gcd",
"*",
"+",
"fp-bitwise=",
"-",
"u>=",
"/",
">=",
"bitand",
"power-of-2?",
"log2-expects-positive",
"neg?",
"<",
"log2",
">",
"integer?",
"number",
"bits>double",
"2/",
"zero?",
"bits>float",
"float?",
"shift",
"ratio?",
"rect>",
"even?",
"ratio",
"fp-sign",
"bitnot",
">fixnum",
"complex?",
"/i",
"integer>fixnum",
"/f",
"sgn",
">bignum",
"next-float",
"u<",
"u>",
"mod",
"recip",
"rational",
">float",
"2^",
"integer",
"fixnum?",
"neg",
"fixnum",
"sq",
"bignum",
">rect",
"bit?",
"fp-qnan?",
"simple-gcd",
"complex",
"<fp-nan>",
"real",
">fraction",
"double>bits",
"bitor",
"rem",
"fp-nan-payload",
"real-part",
"log2-expects-positive?",
"prev-float",
"align",
"unordered?",
"float",
"fp-nan?",
"abs",
"bitxor",
"integer>fixnum-strict",
"u<=",
"odd?",
"<=",
"/mod",
">integer",
"real?",
"rational?",
"numerator"
]
};
Object.keys(builtins).forEach(function(k) {
factor[k].pattern = arrToWordsRegExp(builtins[k]);
});
var combinators = [
"2bi",
"while",
"2tri",
"bi*",
"4dip",
"both?",
"same?",
"tri@",
"curry",
"prepose",
"3bi",
"?if",
"tri*",
"2keep",
"3keep",
"curried",
"2keepd",
"when",
"2bi*",
"2tri*",
"4keep",
"bi@",
"keepdd",
"do",
"unless*",
"tri-curry",
"if*",
"loop",
"bi-curry*",
"when*",
"2bi@",
"2tri@",
"with",
"2with",
"either?",
"bi",
"until",
"3dip",
"3curry",
"tri-curry*",
"tri-curry@",
"bi-curry",
"keepd",
"compose",
"2dip",
"if",
"3tri",
"unless",
"tuple",
"keep",
"2curry",
"tri",
"most",
"while*",
"dip",
"composed",
"bi-curry@",
"find-last-from",
"trim-head-slice",
"map-as",
"each-from",
"none?",
"trim-tail",
"partition",
"if-empty",
"accumulate*",
"reject!",
"find-from",
"accumulate-as",
"collector-for-as",
"reject",
"map",
"map-sum",
"accumulate!",
"2each-from",
"follow",
"supremum-by",
"map!",
"unless-empty",
"collector",
"padding",
"reduce-index",
"replicate-as",
"infimum-by",
"trim-tail-slice",
"count",
"find-index",
"filter",
"accumulate*!",
"reject-as",
"map-integers",
"map-find",
"reduce",
"selector",
"interleave",
"2map",
"filter-as",
"binary-reduce",
"map-index-as",
"find",
"produce",
"filter!",
"replicate",
"cartesian-map",
"cartesian-each",
"find-index-from",
"map-find-last",
"3map-as",
"3map",
"find-last",
"selector-as",
"2map-as",
"2map-reduce",
"accumulate",
"each",
"each-index",
"accumulate*-as",
"when-empty",
"all?",
"collector-as",
"push-either",
"new-like",
"collector-for",
"2selector",
"push-if",
"2all?",
"map-reduce",
"3each",
"any?",
"trim-slice",
"2reduce",
"change-nth",
"produce-as",
"2each",
"trim",
"trim-head",
"cartesian-find",
"map-index",
"if-zero",
"each-integer",
"unless-zero",
"(find-integer)",
"when-zero",
"find-last-integer",
"(all-integers?)",
"times",
"(each-integer)",
"find-integer",
"all-integers?",
"unless-negative",
"if-positive",
"when-positive",
"when-negative",
"unless-positive",
"if-negative",
"case",
"2cleave",
"cond>quot",
"case>quot",
"3cleave",
"wrong-values",
"to-fixed-point",
"alist>quot",
"cond",
"cleave",
"call-effect",
"recursive-hashcode",
"spread",
"deep-spread>quot",
"2||",
"0||",
"n||",
"0&&",
"2&&",
"3||",
"1||",
"1&&",
"n&&",
"3&&",
"smart-unless*",
"keep-inputs",
"reduce-outputs",
"smart-when*",
"cleave>array",
"smart-with",
"smart-apply",
"smart-if",
"inputs/outputs",
"output>sequence-n",
"map-outputs",
"map-reduce-outputs",
"dropping",
"output>array",
"smart-map-reduce",
"smart-2map-reduce",
"output>array-n",
"nullary",
"input<sequence",
"append-outputs",
"drop-inputs",
"inputs",
"smart-2reduce",
"drop-outputs",
"smart-reduce",
"preserving",
"smart-when",
"outputs",
"append-outputs-as",
"smart-unless",
"smart-if*",
"sum-outputs",
"input<sequence-unsafe",
"output>sequence"
];
factor.combinators.pattern = arrToWordsRegExp(combinators);
Prism2.languages.factor = factor;
})(Prism);
(function(Prism2) {
Prism2.languages["false"] = {
"comment": {
pattern: /\{[^}]*\}/
},
"string": {
pattern: /"[^"]*"/,
greedy: true
},
"character-code": {
pattern: /'(?:[^\r]|\r\n?)/,
alias: "number"
},
"assembler-code": {
pattern: /\d+`/,
alias: "important"
},
"number": /\d+/,
"operator": /[-!#$%&'*+,./:;=>?@\\^_`|~ßø]/,
"punctuation": /\[|\]/,
"variable": /[a-z]/,
"non-standard": {
pattern: /[()<BDO®]/,
alias: "bold"
}
};
})(Prism);
Prism.languages["firestore-security-rules"] = Prism.languages.extend("clike", {
"comment": /\/\/.*/,
"keyword": /\b(?:allow|function|if|match|null|return|rules_version|service)\b/,
"operator": /&&|\|\||[<>!=]=?|[-+*/%]|\b(?:in|is)\b/
});
delete Prism.languages["firestore-security-rules"]["class-name"];
Prism.languages.insertBefore("firestore-security-rules", "keyword", {
"path": {
pattern: /(^|[\s(),])(?:\/(?:[\w\xA0-\uFFFF]+|\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)))+/,
lookbehind: true,
greedy: true,
inside: {
"variable": {
pattern: /\{[\w\xA0-\uFFFF]+(?:=\*\*)?\}|\$\([\w\xA0-\uFFFF.]+\)/,
inside: {
"operator": /=/,
"keyword": /\*\*/,
"punctuation": /[.$(){}]/
}
},
"punctuation": /\//
}
},
"method": {
pattern: /(\ballow\s+)[a-z]+(?:\s*,\s*[a-z]+)*(?=\s*[:;])/,
lookbehind: true,
alias: "builtin",
inside: {
"punctuation": /,/
}
}
});
(function(Prism2) {
Prism2.languages.flow = Prism2.languages.extend("javascript", {});
Prism2.languages.insertBefore("flow", "keyword", {
"type": [
{
pattern: /\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,
alias: "class-name"
}
]
});
Prism2.languages.flow["function-variable"].pattern = /(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i;
delete Prism2.languages.flow["parameter"];
Prism2.languages.insertBefore("flow", "operator", {
"flow-punctuation": {
pattern: /\{\||\|\}/,
alias: "punctuation"
}
});
if (!Array.isArray(Prism2.languages.flow.keyword)) {
Prism2.languages.flow.keyword = [Prism2.languages.flow.keyword];
}
Prism2.languages.flow.keyword.unshift(
{
pattern: /(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,
lookbehind: true
},
{
pattern: /(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,
lookbehind: true
}
);
})(Prism);
Prism.languages.fortran = {
"quoted-number": {
pattern: /[BOZ](['"])[A-F0-9]+\1/i,
alias: "number"
},
"string": {
pattern: /(?:\b\w+_)?(['"])(?:\1\1|&(?:\r\n?|\n)(?:[ \t]*!.*(?:\r\n?|\n)|(?![ \t]*!))|(?!\1).)*(?:\1|&)/,
inside: {
"comment": {
pattern: /(&(?:\r\n?|\n)\s*)!.*/,
lookbehind: true
}
}
},
"comment": {
pattern: /!.*/,
greedy: true
},
"boolean": /\.(?:FALSE|TRUE)\.(?:_\w+)?/i,
"number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[ED][+-]?\d+)?(?:_\w+)?/i,
"keyword": [
/\b(?:CHARACTER|COMPLEX|DOUBLE ?PRECISION|INTEGER|LOGICAL|REAL)\b/i,
/\b(?:END ?)?(?:BLOCK ?DATA|DO|FILE|FORALL|FUNCTION|IF|INTERFACE|MODULE(?! PROCEDURE)|PROGRAM|SELECT|SUBROUTINE|TYPE|WHERE)\b/i,
/\b(?:ALLOCATABLE|ALLOCATE|BACKSPACE|CALL|CASE|CLOSE|COMMON|CONTAINS|CONTINUE|CYCLE|DATA|DEALLOCATE|DIMENSION|DO|END|EQUIVALENCE|EXIT|EXTERNAL|FORMAT|GO ?TO|IMPLICIT(?: NONE)?|INQUIRE|INTENT|INTRINSIC|MODULE PROCEDURE|NAMELIST|NULLIFY|OPEN|OPTIONAL|PARAMETER|POINTER|PRINT|PRIVATE|PUBLIC|READ|RETURN|REWIND|SAVE|SELECT|STOP|TARGET|WHILE|WRITE)\b/i,
/\b(?:ASSIGNMENT|DEFAULT|ELEMENTAL|ELSE|ELSEIF|ELSEWHERE|ENTRY|IN|INCLUDE|INOUT|KIND|NULL|ONLY|OPERATOR|OUT|PURE|RECURSIVE|RESULT|SEQUENCE|STAT|THEN|USE)\b/i
],
"operator": [
/\*\*|\/\/|=>|[=\/]=|[<>]=?|::|[+\-*=%]|\.[A-Z]+\./i,
{
pattern: /(^|(?!\().)\/(?!\))/,
lookbehind: true
}
],
"punctuation": /\(\/|\/\)|[(),;:&]/
};
(function(Prism2) {
var FTL_EXPR = /[^<()"']|\((?:<expr>)*\)|<(?!#--)|<#--(?:[^-]|-(?!->))*-->|"(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*'/.source;
for (var i = 0; i < 2; i++) {
FTL_EXPR = FTL_EXPR.replace(/<expr>/g, function() {
return FTL_EXPR;
});
}
FTL_EXPR = FTL_EXPR.replace(/<expr>/g, /[^\s\S]/.source);
var ftl = {
"comment": /<#--[\s\S]*?-->/,
"string": [
{
pattern: /\br("|')(?:(?!\1)[^\\]|\\.)*\1/,
greedy: true
},
{
pattern: RegExp(/("|')(?:(?!\1|\$\{)[^\\]|\\.|\$\{(?:(?!\})(?:<expr>))*\})*\1/.source.replace(/<expr>/g, function() {
return FTL_EXPR;
})),
greedy: true,
inside: {
"interpolation": {
pattern: RegExp(/((?:^|[^\\])(?:\\\\)*)\$\{(?:(?!\})(?:<expr>))*\}/.source.replace(/<expr>/g, function() {
return FTL_EXPR;
})),
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^\$\{|\}$/,
alias: "punctuation"
},
rest: null
}
}
}
}
],
"keyword": /\b(?:as)\b/,
"boolean": /\b(?:false|true)\b/,
"builtin-function": {
pattern: /((?:^|[^?])\?\s*)\w+/,
lookbehind: true,
alias: "function"
},
"function": /\b\w+(?=\s*\()/,
"number": /\b\d+(?:\.\d+)?\b/,
"operator": /\.\.[<*!]?|->|--|\+\+|&&|\|\||\?{1,2}|[-+*/%!=<>]=?|\b(?:gt|gte|lt|lte)\b/,
"punctuation": /[,;.:()[\]{}]/
};
ftl.string[1].inside.interpolation.inside.rest = ftl;
Prism2.languages.ftl = {
"ftl-comment": {
pattern: /^<#--[\s\S]*/,
alias: "comment"
},
"ftl-directive": {
pattern: /^<[\s\S]+>$/,
inside: {
"directive": {
pattern: /(^<\/?)[#@][a-z]\w*/i,
lookbehind: true,
alias: "keyword"
},
"punctuation": /^<\/?|\/?>$/,
"content": {
pattern: /\s*\S[\s\S]*/,
alias: "ftl",
inside: ftl
}
}
},
"ftl-interpolation": {
pattern: /^\$\{[\s\S]*\}$/,
inside: {
"punctuation": /^\$\{|\}$/,
"content": {
pattern: /\s*\S[\s\S]*/,
alias: "ftl",
inside: ftl
}
}
}
};
Prism2.hooks.add("before-tokenize", function(env) {
var pattern = RegExp(/<#--[\s\S]*?-->|<\/?[#@][a-zA-Z](?:<expr>)*?>|\$\{(?:<expr>)*?\}/.source.replace(/<expr>/g, function() {
return FTL_EXPR;
}), "gi");
Prism2.languages["markup-templating"].buildPlaceholders(env, "ftl", pattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "ftl");
});
})(Prism);
Prism.languages.gamemakerlanguage = Prism.languages.gml = Prism.languages.extend("clike", {
"keyword": /\b(?:break|case|continue|default|do|else|enum|exit|for|globalvar|if|repeat|return|switch|until|var|while)\b/,
"number": /(?:\b0x[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ulf]{0,4}/i,
"operator": /--|\+\+|[-+%/=]=?|!=|\*\*?=?|<[<=>]?|>[=>]?|&&?|\^\^?|\|\|?|~|\b(?:and|at|not|or|with|xor)\b/,
"constant": /\b(?:GM_build_date|GM_version|action_(?:continue|restart|reverse|stop)|all|gamespeed_(?:fps|microseconds)|global|local|noone|other|pi|pointer_(?:invalid|null)|self|timezone_(?:local|utc)|undefined|ev_(?:create|destroy|step|alarm|keyboard|mouse|collision|other|draw|draw_(?:begin|end|post|pre)|keypress|keyrelease|trigger|(?:left|middle|no|right)_button|(?:left|middle|right)_press|(?:left|middle|right)_release|mouse_(?:enter|leave|wheel_down|wheel_up)|global_(?:left|middle|right)_button|global_(?:left|middle|right)_press|global_(?:left|middle|right)_release|joystick(?:1|2)_(?:button1|button2|button3|button4|button5|button6|button7|button8|down|left|right|up)|outside|boundary|game_start|game_end|room_start|room_end|no_more_lives|animation_end|end_of_path|no_more_health|user\d|gui|gui_begin|gui_end|step_(?:begin|end|normal))|vk_(?:alt|anykey|backspace|control|delete|down|end|enter|escape|home|insert|left|nokey|pagedown|pageup|pause|printscreen|return|right|shift|space|tab|up|f\d|numpad\d|add|decimal|divide|lalt|lcontrol|lshift|multiply|ralt|rcontrol|rshift|subtract)|achievement_(?:filter_(?:all_players|favorites_only|friends_only)|friends_info|info|leaderboard_info|our_info|pic_loaded|show_(?:achievement|bank|friend_picker|leaderboard|profile|purchase_prompt|ui)|type_challenge|type_score_challenge)|asset_(?:font|object|path|room|script|shader|sound|sprite|tiles|timeline|unknown)|audio_(?:3d|falloff_(?:exponent_distance|exponent_distance_clamped|inverse_distance|inverse_distance_clamped|linear_distance|linear_distance_clamped|none)|mono|new_system|old_system|stereo)|bm_(?:add|complex|dest_alpha|dest_color|dest_colour|inv_dest_alpha|inv_dest_color|inv_dest_colour|inv_src_alpha|inv_src_color|inv_src_colour|max|normal|one|src_alpha|src_alpha_sat|src_color|src_colour|subtract|zero)|browser_(?:chrome|firefox|ie|ie_mobile|not_a_browser|opera|safari|safari_mobile|tizen|unknown|windows_store)|buffer_(?:bool|f16|f32|f64|fast|fixed|generalerror|grow|invalidtype|network|outofbounds|outofspace|s16|s32|s8|seek_end|seek_relative|seek_start|string|text|u16|u32|u64|u8|vbuffer|wrap)|c_(?:aqua|black|blue|dkgray|fuchsia|gray|green|lime|ltgray|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|cmpfunc_(?:always|equal|greater|greaterequal|less|lessequal|never|notequal)|cr_(?:appstart|arrow|beam|cross|default|drag|handpoint|hourglass|none|size_all|size_nesw|size_ns|size_nwse|size_we|uparrow)|cull_(?:clockwise|counterclockwise|noculling)|device_(?:emulator|tablet)|device_ios_(?:ipad|ipad_retina|iphone|iphone5|iphone6|iphone6plus|iphone_retina|unknown)|display_(?:landscape|landscape_flipped|portrait|portrait_flipped)|dll_(?:cdecl|cdel|stdcall)|ds_type_(?:grid|list|map|priority|queue|stack)|ef_(?:cloud|ellipse|explosion|firework|flare|rain|ring|smoke|smokeup|snow|spark|star)|fa_(?:archive|bottom|center|directory|hidden|left|middle|readonly|right|sysfile|top|volumeid)|fb_login_(?:default|fallback_to_webview|forcing_safari|forcing_webview|no_fallback_to_webview|use_system_account)|iap_(?:available|canceled|ev_consume|ev_product|ev_purchase|ev_restore|ev_storeload|failed|purchased|refunded|status_available|status_loading|status_processing|status_restoring|status_unavailable|status_uninitialised|storeload_failed|storeload_ok|unavailable)|leaderboard_type_(?:number|time_mins_secs)|lighttype_(?:dir|point)|matrix_(?:projection|view|world)|mb_(?:any|left|middle|none|right)|network_(?:config_(?:connect_timeout|disable_reliable_udp|enable_reliable_udp|use_non_blocking_socket)|socket_(?:bluetooth|tcp|udp)|type_(?:connect|data|disconnect|non_blocking_connect))|of_challenge_(?:lose|tie|win)|os_(?:android|ios|linux|macosx|ps3|ps4|psvita|unknown|uwp|win32|win8native|windows|winphone|xboxone)|phy_debug_render_(?:aabb|collision_pairs|coms|core_shapes|joints|obb|shapes)|phy_joint_(?:anchor_1_x|anchor_1_y|anchor_2_x|anchor_2_y|angle|angle_limits|damping_ratio|frequency|length_1|length_2|lower_angle_limit|max_force|max_length|max_motor_force|max_motor_torque|max_torque|motor_force|motor_speed|motor_torque|reaction_force_x|reaction_force_y|reaction_torque|speed|translation|upper_angle_limit)|phy_particle_data_flag_(?:category|color|colour|position|typeflags|velocity)|phy_particle_flag_(?:colormixing|colourmixing|elastic|powder|spring|tensile|viscous|wall|water|zombie)|phy_particle_group_flag_(?:rigid|solid)|pr_(?:linelist|linestrip|pointlist|trianglefan|trianglelist|trianglestrip)|ps_(?:distr|shape)_(?:diamond|ellipse|gaussian|invgaussian|line|linear|rectangle)|pt_shape_(?:circle|cloud|disk|explosion|flare|line|pixel|ring|smoke|snow|spark|sphere|square|star)|ty_(?:real|string)|gp_(?:face\d|axislh|axislv|axisrh|axisrv|padd|padl|padr|padu|select|shoulderl|shoulderlb|shoulderr|shoulderrb|start|stickl|stickr)|lb_disp_(?:none|numeric|time_ms|time_sec)|lb_sort_(?:ascending|descending|none)|ov_(?:achievements|community|friends|gamegroup|players|settings)|ugc_(?:filetype_(?:community|microtrans)|list_(?:Favorited|Followed|Published|Subscribed|UsedOrPlayed|VotedDown|VotedOn|VotedUp|WillVoteLater)|match_(?:AllGuides|Artwork|Collections|ControllerBindings|IntegratedGuides|Items|Items_Mtx|Items_ReadyToUse|Screenshots|UsableInGame|Videos|WebGuides)|query_(?:AcceptedForGameRankedByAcceptanceDate|CreatedByFriendsRankedByPublicationDate|FavoritedByFriendsRankedByPublicationDate|NotYetRated)|query_RankedBy(?:NumTimesReported|PublicationDate|TextSearch|TotalVotesAsc|Trend|Vote|VotesUp)|result_success|sortorder_CreationOrder(?:Asc|Desc)|sortorder_(?:ForModeration|LastUpdatedDesc|SubscriptionDateDesc|TitleAsc|VoteScoreDesc)|visibility_(?:friends_only|private|public))|vertex_usage_(?:binormal|blendindices|blendweight|color|colour|depth|fog|normal|position|psize|sample|tangent|texcoord|textcoord)|vertex_type_(?:float\d|color|colour|ubyte4)|input_type|layerelementtype_(?:background|instance|oldtilemap|particlesystem|sprite|tile|tilemap|undefined)|se_(?:chorus|compressor|echo|equalizer|flanger|gargle|none|reverb)|text_type|tile_(?:flip|index_mask|mirror|rotate)|(?:obj|rm|scr|spr)\w+)\b/,
"variable": /\b(?:alarm|application_surface|async_load|background_(?:alpha|blend|color|colour|foreground|height|hspeed|htiled|index|showcolor|showcolour|visible|vspeed|vtiled|width|x|xscale|y|yscale)|bbox_(?:bottom|left|right|top)|browser_(?:height|width)|caption_(?:health|lives|score)|current_(?:day|hour|minute|month|second|time|weekday|year)|cursor_sprite|debug_mode|delta_time|direction|display_aa|error_(?:last|occurred)|event_(?:action|number|object|type)|fps|fps_real|friction|game_(?:display|project|save)_(?:id|name)|gamemaker_(?:pro|registered|version)|gravity|gravity_direction|(?:h|v)speed|health|iap_data|id|image_(?:alpha|angle|blend|depth|index|number|speed|xscale|yscale)|instance_(?:count|id)|keyboard_(?:key|lastchar|lastkey|string)|layer|lives|mask_index|mouse_(?:button|lastbutton|x|y)|object_index|os_(?:browser|device|type|version)|path_(?:endaction|index|orientation|position|positionprevious|scale|speed)|persistent|phy_(?:rotation|(?:col_normal|collision|com|linear_velocity|position|speed)_(?:x|y)|angular_(?:damping|velocity)|position_(?:x|y)previous|speed|linear_damping|bullet|fixed_rotation|active|mass|inertia|dynamic|kinematic|sleeping|collision_points)|pointer_(?:invalid|null)|room|room_(?:caption|first|height|last|persistent|speed|width)|score|secure_mode|show_(?:health|lives|score)|solid|speed|sprite_(?:height|index|width|xoffset|yoffset)|temp_directory|timeline_(?:index|loop|position|running|speed)|transition_(?:color|kind|steps)|undefined|view_(?:angle|current|enabled|(?:h|v)(?:border|speed)|(?:h|w|x|y)port|(?:h|w|x|y)view|object|surface_id|visible)|visible|webgl_enabled|working_directory|(?:x|y)(?:previous|start)|x|y|argument(?:_relitive|_count|\d)|argument|global|local|other|self)\b/
});
Prism.languages.gap = {
"shell": {
pattern: /^gap>[\s\S]*?(?=^gap>|$(?![\s\S]))/m,
greedy: true,
inside: {
"gap": {
pattern: /^(gap>).+(?:(?:\r(?:\n|(?!\n))|\n)>.*)*/,
lookbehind: true,
inside: null
},
"punctuation": /^gap>/
}
},
"comment": {
pattern: /#.*/,
greedy: true
},
"string": {
pattern: /(^|[^\\'"])(?:'(?:[^\r\n\\']|\\.){1,10}'|"(?:[^\r\n\\"]|\\.)*"(?!")|"""[\s\S]*?""")/,
lookbehind: true,
greedy: true,
inside: {
"continuation": {
pattern: /([\r\n])>/,
lookbehind: true,
alias: "punctuation"
}
}
},
"keyword": /\b(?:Assert|Info|IsBound|QUIT|TryNextMethod|Unbind|and|atomic|break|continue|do|elif|else|end|fi|for|function|if|in|local|mod|not|od|or|quit|readonly|readwrite|rec|repeat|return|then|until|while)\b/,
"boolean": /\b(?:false|true)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"number": {
pattern: /(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,
lookbehind: true
},
"continuation": {
pattern: /([\r\n])>/,
lookbehind: true,
alias: "punctuation"
},
"operator": /->|[-+*/^~=!]|<>|[<>]=?|:=|\.\./,
"punctuation": /[()[\]{},;.:]/
};
Prism.languages.gap.shell.inside.gap.inside = Prism.languages.gap;
Prism.languages.gcode = {
"comment": /;.*|\B\(.*?\)\B/,
"string": {
pattern: /"(?:""|[^"])*"/,
greedy: true
},
"keyword": /\b[GM]\d+(?:\.\d+)?\b/,
"property": /\b[A-Z]/,
"checksum": {
pattern: /(\*)\d+/,
lookbehind: true,
alias: "number"
},
"punctuation": /[:*]/
};
Prism.languages.gdscript = {
"comment": /#.*/,
"string": {
pattern: /@?(?:("|')(?:(?!\1)[^\n\\]|\\[\s\S])*\1(?!"|')|"""(?:[^\\]|\\[\s\S])*?""")/,
greedy: true
},
"class-name": {
pattern: /(^(?:class|class_name|extends)[ \t]+|^export\([ \t]*|\bas[ \t]+|(?:\b(?:const|var)[ \t]|[,(])[ \t]*\w+[ \t]*:[ \t]*|->[ \t]*)[a-zA-Z_]\w*/m,
lookbehind: true
},
"keyword": /\b(?:and|as|assert|break|breakpoint|class|class_name|const|continue|elif|else|enum|export|extends|for|func|if|in|is|master|mastersync|match|not|null|onready|or|pass|preload|puppet|puppetsync|remote|remotesync|return|self|setget|signal|static|tool|var|while|yield)\b/,
"function": /\b[a-z_]\w*(?=[ \t]*\()/i,
"variable": /\$\w+/,
"number": [
/\b0b[01_]+\b|\b0x[\da-fA-F_]+\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.[\d_]+)(?:e[+-]?[\d_]+)?\b/,
/\b(?:INF|NAN|PI|TAU)\b/
],
"constant": /\b[A-Z][A-Z_\d]*\b/,
"boolean": /\b(?:false|true)\b/,
"operator": /->|:=|&&|\|\||<<|>>|[-+*/%&|!<>=]=?|[~^]/,
"punctuation": /[.:,;()[\]{}]/
};
Prism.languages.gedcom = {
"line-value": {
pattern: /(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?\w+ ).+/m,
lookbehind: true,
inside: {
"pointer": {
pattern: /^@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@$/,
alias: "variable"
}
}
},
"record": {
pattern: /(^[\t ]*\d+ +(?:@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@ +)?)\w+/m,
lookbehind: true,
alias: "tag"
},
"level": {
pattern: /(^[\t ]*)\d+/m,
lookbehind: true,
alias: "number"
},
"pointer": {
pattern: /@\w[\w!"$%&'()*+,\-./:;<=>?[\\\]^`{|}~\x80-\xfe #]*@/,
alias: "variable"
}
};
Prism.languages.gettext = {
"comment": [
{
pattern: /# .*/,
greedy: true,
alias: "translator-comment"
},
{
pattern: /#\..*/,
greedy: true,
alias: "extracted-comment"
},
{
pattern: /#:.*/,
greedy: true,
alias: "reference-comment"
},
{
pattern: /#,.*/,
greedy: true,
alias: "flag-comment"
},
{
pattern: /#\|.*/,
greedy: true,
alias: "previously-untranslated-comment"
},
{
pattern: /#.*/,
greedy: true
}
],
"string": {
pattern: /(^|[^\\])"(?:[^"\\]|\\.)*"/,
lookbehind: true,
greedy: true
},
"keyword": /^msg(?:ctxt|id|id_plural|str)\b/m,
"number": /\b\d+\b/,
"punctuation": /[\[\]]/
};
Prism.languages.po = Prism.languages.gettext;
(function(Prism2) {
var tableRow = /(?:\r?\n|\r)[ \t]*\|.+\|(?:(?!\|).)*/.source;
Prism2.languages.gherkin = {
"pystring": {
pattern: /("""|''')[\s\S]+?\1/,
alias: "string"
},
"comment": {
pattern: /(^[ \t]*)#.*/m,
lookbehind: true
},
"tag": {
pattern: /(^[ \t]*)@\S*/m,
lookbehind: true
},
"feature": {
pattern: /((?:^|\r?\n|\r)[ \t]*)(?:Ability|Ahoy matey!|Arwedd|Aspekt|Besigheid Behoefte|Business Need|Caracteristica|Característica|Egenskab|Egenskap|Eiginleiki|Feature|Fīča|Fitur|Fonctionnalité|Fonksyonalite|Funcionalidade|Funcionalitat|Functionalitate|Funcţionalitate|Funcționalitate|Functionaliteit|Fungsi|Funkcia|Funkcija|Funkcionalitāte|Funkcionalnost|Funkcja|Funksie|Funktionalität|Funktionalitéit|Funzionalità|Hwaet|Hwæt|Jellemző|Karakteristik|Lastnost|Mak|Mogucnost|laH|Mogućnost|Moznosti|Možnosti|OH HAI|Omadus|Ominaisuus|Osobina|Özellik|Potrzeba biznesowa|perbogh|poQbogh malja'|Požadavek|Požiadavka|Pretty much|Qap|Qu'meH 'ut|Savybė|Tính năng|Trajto|Vermoë|Vlastnosť|Właściwość|Značilnost|Δυνατότητα|Λειτουργία|Могућност|Мөмкинлек|Особина|Свойство|Үзенчәлеклелек|Функционал|Функционалност|Функция|Функціонал|תכונה|خاصية|خصوصیت|صلاحیت|کاروبار کی ضرورت|وِیژگی|रूप लेख|ਖਾਸੀਅਤ|ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|గుణము|ಹೆಚ್ಚಳ|ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก|기능|フィーチャ|功能|機能):(?:[^:\r\n]+(?:\r?\n|\r|$))*/,
lookbehind: true,
inside: {
"important": {
pattern: /(:)[^\r\n]+/,
lookbehind: true
},
"keyword": /[^:\r\n]+:/
}
},
"scenario": {
pattern: /(^[ \t]*)(?:Abstract Scenario|Abstrakt Scenario|Achtergrond|Aer|Ær|Agtergrond|All y'all|Antecedentes|Antecedents|Atburðarás|Atburðarásir|Awww, look mate|B4|Background|Baggrund|Bakgrund|Bakgrunn|Bakgrunnur|Beispiele|Beispiller|Bối cảnh|Cefndir|Cenario|Cenário|Cenario de Fundo|Cenário de Fundo|Cenarios|Cenários|Contesto|Context|Contexte|Contexto|Conto|Contoh|Contone|Dæmi|Dasar|Dead men tell no tales|Delineacao do Cenario|Delineação do Cenário|Dis is what went down|Dữ liệu|Dyagram Senaryo|Dyagram senaryo|Egzanp|Ejemplos|Eksempler|Ekzemploj|Enghreifftiau|Esbozo do escenario|Escenari|Escenario|Esempi|Esquema de l'escenari|Esquema del escenario|Esquema do Cenario|Esquema do Cenário|EXAMPLZ|Examples|Exempel|Exemple|Exemples|Exemplos|First off|Fono|Forgatókönyv|Forgatókönyv vázlat|Fundo|Geçmiş|Grundlage|Hannergrond|ghantoH|Háttér|Heave to|Istorik|Juhtumid|Keadaan|Khung kịch bản|Khung tình huống|Kịch bản|Koncept|Konsep skenario|Kontèks|Kontekst|Kontekstas|Konteksts|Kontext|Konturo de la scenaro|Latar Belakang|lut chovnatlh|lut|lutmey|Lýsing Atburðarásar|Lýsing Dæma|MISHUN SRSLY|MISHUN|Menggariskan Senario|mo'|Náčrt Scenára|Náčrt Scénáře|Náčrt Scenáru|Oris scenarija|Örnekler|Osnova|Osnova Scenára|Osnova scénáře|Osnutek|Ozadje|Paraugs|Pavyzdžiai|Példák|Piemēri|Plan du scénario|Plan du Scénario|Plan Senaryo|Plan senaryo|Plang vum Szenario|Pozadí|Pozadie|Pozadina|Príklady|Příklady|Primer|Primeri|Primjeri|Przykłady|Raamstsenaarium|Reckon it's like|Rerefons|Scenár|Scénář|Scenarie|Scenarij|Scenarijai|Scenarijaus šablonas|Scenariji|Scenārijs|Scenārijs pēc parauga|Scenarijus|Scenario|Scénario|Scenario Amlinellol|Scenario Outline|Scenario Template|Scenariomal|Scenariomall|Scenarios|Scenariu|Scenariusz|Scenaro|Schema dello scenario|Se ðe|Se the|Se þe|Senario|Senaryo Deskripsyon|Senaryo deskripsyon|Senaryo|Senaryo taslağı|Shiver me timbers|Situācija|Situai|Situasie Uiteensetting|Situasie|Skenario konsep|Skenario|Skica|Structura scenariu|Structură scenariu|Struktura scenarija|Stsenaarium|Swa hwaer swa|Swa|Swa hwær swa|Szablon scenariusza|Szenario|Szenariogrundriss|Tapaukset|Tapaus|Tapausaihio|Taust|Tausta|Template Keadaan|Template Senario|Template Situai|The thing of it is|Tình huống|Variantai|Voorbeelde|Voorbeelden|Wharrimean is|Yo-ho-ho|You'll wanna|Założenia|Παραδείγματα|Περιγραφή Σεναρίου|Σενάρια|Σενάριο|Υπόβαθρο|Кереш|Контекст|Концепт|Мисаллар|Мисоллар|Основа|Передумова|Позадина|Предистория|Предыстория|Приклади|Пример|Примери|Примеры|Рамка на сценарий|Скица|Структура сценарија|Структура сценария|Структура сценарію|Сценарий|Сценарий структураси|Сценарийның төзелеше|Сценарији|Сценарио|Сценарій|Тарих|Үрнәкләр|דוגמאות|רקע|תבנית תרחיש|תרחיש|الخلفية|الگوی سناریو|امثلة|پس منظر|زمینه|سناریو|سيناريو|سيناريو مخطط|مثالیں|منظر نامے کا خاکہ|منظرنامہ|نمونه ها|उदाहरण|परिदृश्य|परिदृश्य रूपरेखा|पृष्ठभूमि|ਉਦਾਹਰਨਾਂ|ਪਟਕਥਾ|ਪਟਕਥਾ ਢਾਂਚਾ|ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਿਛੋਕੜ|ఉదాహరణలు|కథనం|నేపథ్యం|సన్నివేశం|ಉದಾಹರಣೆಗಳು|ಕಥಾಸಾರಾಂಶ|ವಿವರಣೆ|ಹಿನ್ನೆಲೆ|โครงสร้างของเหตุการณ์|ชุดของตัวอย่าง|ชุดของเหตุการณ์|แนวคิด|สรุปเหตุการณ์|เหตุการณ์|배경|시나리오|시나리오 개요|예|サンプル|シナリオ|シナリオアウトライン|シナリオテンプレ|シナリオテンプレート|テンプレ|例|例子|剧本|剧本大纲|劇本|劇本大綱|场景|场景大纲|場景|場景大綱|背景):[^:\r\n]*/m,
lookbehind: true,
inside: {
"important": {
pattern: /(:)[^\r\n]*/,
lookbehind: true
},
"keyword": /[^:\r\n]+:/
}
},
"table-body": {
pattern: RegExp("(" + tableRow + ")(?:" + tableRow + ")+"),
lookbehind: true,
inside: {
"outline": {
pattern: /<[^>]+>/,
alias: "variable"
},
"td": {
pattern: /\s*[^\s|][^|]*/,
alias: "string"
},
"punctuation": /\|/
}
},
"table-head": {
pattern: RegExp(tableRow),
inside: {
"th": {
pattern: /\s*[^\s|][^|]*/,
alias: "variable"
},
"punctuation": /\|/
}
},
"atrule": {
pattern: /(^[ \t]+)(?:'a|'ach|'ej|7|a|A také|A taktiež|A tiež|A zároveň|Aber|Ac|Adott|Akkor|Ak|Aleshores|Ale|Ali|Allora|Alors|Als|Ama|Amennyiben|Amikor|Ampak|an|AN|Ananging|And y'all|And|Angenommen|Anrhegedig a|An|Apabila|Atès|Atesa|Atunci|Avast!|Aye|A|awer|Bagi|Banjur|Bet|Biết|Blimey!|Buh|But at the end of the day I reckon|But y'all|But|BUT|Cal|Când|Cand|Cando|Ce|Cuando|Če|Ða ðe|Ða|Dadas|Dada|Dados|Dado|DaH ghu' bejlu'|dann|Dann|Dano|Dan|Dar|Dat fiind|Data|Date fiind|Date|Dati fiind|Dati|Daţi fiind|Dați fiind|DEN|Dato|De|Den youse gotta|Dengan|Diberi|Diyelim ki|Donada|Donat|Donitaĵo|Do|Dun|Duota|Ðurh|Eeldades|Ef|Eğer ki|Entao|Então|Entón|E|En|Entonces|Epi|És|Etant donnée|Etant donné|Et|Étant données|Étant donnée|Étant donné|Etant données|Etant donnés|Étant donnés|Fakat|Gangway!|Gdy|Gegeben seien|Gegeben sei|Gegeven|Gegewe|ghu' noblu'|Gitt|Given y'all|Given|Givet|Givun|Ha|Cho|I CAN HAZ|In|Ir|It's just unbelievable|I|Ja|Jeśli|Jeżeli|Kad|Kada|Kadar|Kai|Kaj|Když|Keď|Kemudian|Ketika|Khi|Kiedy|Ko|Kuid|Kui|Kun|Lan|latlh|Le sa a|Let go and haul|Le|Lè sa a|Lè|Logo|Lorsqu'<|Lorsque|mä|Maar|Mais|Mając|Ma|Majd|Maka|Manawa|Mas|Men|Menawa|Mutta|Nalika|Nalikaning|Nanging|Når|När|Nato|Nhưng|Niin|Njuk|O zaman|Och|Og|Oletetaan|Ond|Onda|Oraz|Pak|Pero|Però|Podano|Pokiaľ|Pokud|Potem|Potom|Privzeto|Pryd|Quan|Quand|Quando|qaSDI'|Så|Sed|Se|Siis|Sipoze ke|Sipoze Ke|Sipoze|Si|Şi|Și|Soit|Stel|Tada|Tad|Takrat|Tak|Tapi|Ter|Tetapi|Tha the|Tha|Then y'all|Then|Thì|Thurh|Toda|Too right|Un|Und|ugeholl|Và|vaj|Vendar|Ve|wann|Wanneer|WEN|Wenn|When y'all|When|Wtedy|Wun|Y'know|Yeah nah|Yna|Youse know like when|Youse know when youse got|Y|Za predpokladu|Za předpokladu|Zadan|Zadani|Zadano|Zadate|Zadato|Zakładając|Zaradi|Zatati|Þa þe|Þa|Þá|Þegar|Þurh|Αλλά|Δεδομένου|Και|Όταν|Τότε|А також|Агар|Але|Али|Аммо|А|Әгәр|Әйтик|Әмма|Бирок|Ва|Вә|Дадено|Дано|Допустим|Если|Задате|Задати|Задато|И|І|К тому же|Када|Кад|Когато|Когда|Коли|Ләкин|Лекин|Нәтиҗәдә|Нехай|Но|Онда|Припустимо, що|Припустимо|Пусть|Также|Та|Тогда|Тоді|То|Унда|Һәм|Якщо|אבל|אזי|אז|בהינתן|וגם|כאשר|آنگاه|اذاً|اگر|اما|اور|با فرض|بالفرض|بفرض|پھر|تب|ثم|جب|عندما|فرض کیا|لكن|لیکن|متى|هنگامی|و|अगर|और|कदा|किन्तु|चूंकि|जब|तथा|तदा|तब|परन्तु|पर|यदि|ਅਤੇ|ਜਦੋਂ|ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|ਤਦ|ਪਰ|అప్పుడు|ఈ పరిస్థితిలో|కాని|చెప్పబడినది|మరియు|ಆದರೆ|ನಂತರ|ನೀಡಿದ|ಮತ್ತು|ಸ್ಥಿತಿಯನ್ನು|กำหนดให้|ดังนั้น|แต่|เมื่อ|และ|그러면<|그리고<|단<|만약<|만일<|먼저<|조건<|하지만<|かつ<|しかし<|ただし<|ならば<|もし<|並且<|但し<|但是<|假如<|假定<|假設<|假设<|前提<|同时<|同時<|并且<|当<|當<|而且<|那么<|那麼<)(?=[ \t])/m,
lookbehind: true
},
"string": {
pattern: /"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/,
inside: {
"outline": {
pattern: /<[^>]+>/,
alias: "variable"
}
}
},
"outline": {
pattern: /<[^>]+>/,
alias: "variable"
}
};
})(Prism);
Prism.languages.git = {
"comment": /^#.*/m,
"deleted": /^[-–].*/m,
"inserted": /^\+.*/m,
"string": /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
"command": {
pattern: /^.*\$ git .*$/m,
inside: {
"parameter": /\s--?\w+/
}
},
"coord": /^@@.*@@$/m,
"commit-sha1": /^commit \w{40}$/m
};
Prism.languages.glsl = Prism.languages.extend("c", {
"keyword": /\b(?:active|asm|atomic_uint|attribute|[ibdu]?vec[234]|bool|break|buffer|case|cast|centroid|class|coherent|common|const|continue|d?mat[234](?:x[234])?|default|discard|do|double|else|enum|extern|external|false|filter|fixed|flat|float|for|fvec[234]|goto|half|highp|hvec[234]|[iu]?sampler2DMS(?:Array)?|[iu]?sampler2DRect|[iu]?samplerBuffer|[iu]?samplerCube|[iu]?samplerCubeArray|[iu]?sampler[123]D|[iu]?sampler[12]DArray|[iu]?image2DMS(?:Array)?|[iu]?image2DRect|[iu]?imageBuffer|[iu]?imageCube|[iu]?imageCubeArray|[iu]?image[123]D|[iu]?image[12]DArray|if|in|inline|inout|input|int|interface|invariant|layout|long|lowp|mediump|namespace|noinline|noperspective|out|output|partition|patch|precise|precision|public|readonly|resource|restrict|return|sample|sampler[12]DArrayShadow|sampler[12]DShadow|sampler2DRectShadow|sampler3DRect|samplerCubeArrayShadow|samplerCubeShadow|shared|short|sizeof|smooth|static|struct|subroutine|superp|switch|template|this|true|typedef|uint|uniform|union|unsigned|using|varying|void|volatile|while|writeonly)\b/
});
Prism.languages.gn = {
"comment": {
pattern: /#.*/,
greedy: true
},
"string-literal": {
pattern: /(^|[^\\"])"(?:[^\r\n"\\]|\\.)*"/,
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:\{[\s\S]*?\}|[a-zA-Z_]\w*|0x[a-fA-F0-9]{2})/,
lookbehind: true,
inside: {
"number": /^\$0x[\s\S]{2}$/,
"variable": /^\$\w+$/,
"interpolation-punctuation": {
pattern: /^\$\{|\}$/,
alias: "punctuation"
},
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
},
"string": /[\s\S]+/
}
},
"keyword": /\b(?:else|if)\b/,
"boolean": /\b(?:false|true)\b/,
"builtin-function": {
pattern: /\b(?:assert|defined|foreach|import|pool|print|template|tool|toolchain)(?=\s*\()/i,
alias: "keyword"
},
"function": /\b[a-z_]\w*(?=\s*\()/i,
"constant": /\b(?:current_cpu|current_os|current_toolchain|default_toolchain|host_cpu|host_os|root_build_dir|root_gen_dir|root_out_dir|target_cpu|target_gen_dir|target_os|target_out_dir)\b/,
"number": /-?\b\d+\b/,
"operator": /[-+!=<>]=?|&&|\|\|/,
"punctuation": /[(){}[\],.]/
};
Prism.languages.gn["string-literal"].inside["interpolation"].inside["expression"].inside = Prism.languages.gn;
Prism.languages.gni = Prism.languages.gn;
Prism.languages["linker-script"] = {
"comment": {
pattern: /(^|\s)\/\*[\s\S]*?(?:$|\*\/)/,
lookbehind: true,
greedy: true
},
"identifier": {
pattern: /"[^"\r\n]*"/,
greedy: true
},
"location-counter": {
pattern: /\B\.\B/,
alias: "important"
},
"section": {
pattern: /(^|[^\w*])\.\w+\b/,
lookbehind: true,
alias: "keyword"
},
"function": /\b[A-Z][A-Z_]*(?=\s*\()/,
"number": /\b(?:0[xX][a-fA-F0-9]+|\d+)[KM]?\b/,
"operator": />>=?|<<=?|->|\+\+|--|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?/,
"punctuation": /[(){},;]/
};
Prism.languages["ld"] = Prism.languages["linker-script"];
Prism.languages.go = Prism.languages.extend("clike", {
"string": {
pattern: /(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,
lookbehind: true,
greedy: true
},
"keyword": /\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,
"boolean": /\b(?:_|false|iota|nil|true)\b/,
"number": [
/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,
/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,
/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i
],
"operator": /[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,
"builtin": /\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/
});
Prism.languages.insertBefore("go", "string", {
"char": {
pattern: /'(?:\\.|[^'\\\r\n]){0,10}'/,
greedy: true
}
});
delete Prism.languages.go["class-name"];
Prism.languages["go-mod"] = Prism.languages["go-module"] = {
"comment": {
pattern: /\/\/.*/,
greedy: true
},
"version": {
pattern: /(^|[\s()[\],])v\d+\.\d+\.\d+(?:[+-][-+.\w]*)?(?![^\s()[\],])/,
lookbehind: true,
alias: "number"
},
"go-version": {
pattern: /((?:^|\s)go\s+)\d+(?:\.\d+){1,2}/,
lookbehind: true,
alias: "number"
},
"keyword": {
pattern: /^([ \t]*)(?:exclude|go|module|replace|require|retract)\b/m,
lookbehind: true
},
"operator": /=>/,
"punctuation": /[()[\],]/
};
(function(Prism2) {
var interpolation = {
pattern: /((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^\$\{?|\}$/,
alias: "punctuation"
},
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
};
Prism2.languages.gradle = Prism2.languages.extend("clike", {
"string": {
pattern: /'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,
greedy: true
},
"keyword": /\b(?:apply|def|dependencies|else|if|implementation|import|plugin|plugins|project|repositories|repository|sourceSets|tasks|val)\b/,
"number": /\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,
"operator": {
pattern: /(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,
lookbehind: true
},
"punctuation": /\.+|[{}[\];(),:$]/
});
Prism2.languages.insertBefore("gradle", "string", {
"shebang": {
pattern: /#!.+/,
alias: "comment",
greedy: true
},
"interpolation-string": {
pattern: /"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,
greedy: true,
inside: {
"interpolation": interpolation,
"string": /[\s\S]+/
}
}
});
Prism2.languages.insertBefore("gradle", "punctuation", {
"spock-block": /\b(?:and|cleanup|expect|given|setup|then|when|where):/
});
Prism2.languages.insertBefore("gradle", "function", {
"annotation": {
pattern: /(^|[^.])@\w+/,
lookbehind: true,
alias: "punctuation"
}
});
interpolation.inside.expression.inside = Prism2.languages.gradle;
})(Prism);
Prism.languages.graphql = {
"comment": /#.*/,
"description": {
pattern: /(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,
greedy: true,
alias: "string",
inside: {
"language-markdown": {
pattern: /(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,
lookbehind: true,
inside: Prism.languages.markdown
}
}
},
"string": {
pattern: /"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,
greedy: true
},
"number": /(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
"boolean": /\b(?:false|true)\b/,
"variable": /\$[a-z_]\w*/i,
"directive": {
pattern: /@[a-z_]\w*/i,
alias: "function"
},
"attr-name": {
pattern: /\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,
greedy: true
},
"atom-input": {
pattern: /\b[A-Z]\w*Input\b/,
alias: "class-name"
},
"scalar": /\b(?:Boolean|Float|ID|Int|String)\b/,
"constant": /\b[A-Z][A-Z_\d]*\b/,
"class-name": {
pattern: /(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,
lookbehind: true
},
"fragment": {
pattern: /(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,
lookbehind: true,
alias: "function"
},
"definition-mutation": {
pattern: /(\bmutation\s+)[a-zA-Z_]\w*/,
lookbehind: true,
alias: "function"
},
"definition-query": {
pattern: /(\bquery\s+)[a-zA-Z_]\w*/,
lookbehind: true,
alias: "function"
},
"keyword": /\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,
"operator": /[!=|&]|\.{3}/,
"property-query": /\w+(?=\s*\()/,
"object": /\w+(?=\s*\{)/,
"punctuation": /[!(){}\[\]:=,]/,
"property": /\w+/
};
Prism.hooks.add("after-tokenize", function afterTokenizeGraphql(env) {
if (env.language !== "graphql") {
return;
}
var validTokens = env.tokens.filter(function(token) {
return typeof token !== "string" && token.type !== "comment" && token.type !== "scalar";
});
var currentIndex = 0;
function getToken(offset2) {
return validTokens[currentIndex + offset2];
}
function isTokenType(types, offset2) {
offset2 = offset2 || 0;
for (var i2 = 0; i2 < types.length; i2++) {
var token = getToken(i2 + offset2);
if (!token || token.type !== types[i2]) {
return false;
}
}
return true;
}
function findClosingBracket(open, close) {
var stackHeight = 1;
for (var i2 = currentIndex; i2 < validTokens.length; i2++) {
var token = validTokens[i2];
var content = token.content;
if (token.type === "punctuation" && typeof content === "string") {
if (open.test(content)) {
stackHeight++;
} else if (close.test(content)) {
stackHeight--;
if (stackHeight === 0) {
return i2;
}
}
}
}
return -1;
}
function addAlias(token, alias) {
var aliases = token.alias;
if (!aliases) {
token.alias = aliases = [];
} else if (!Array.isArray(aliases)) {
token.alias = aliases = [aliases];
}
aliases.push(alias);
}
for (; currentIndex < validTokens.length; ) {
var startToken = validTokens[currentIndex++];
if (startToken.type === "keyword" && startToken.content === "mutation") {
var inputVariables = [];
if (isTokenType(["definition-mutation", "punctuation"]) && getToken(1).content === "(") {
currentIndex += 2;
var definitionEnd = findClosingBracket(/^\($/, /^\)$/);
if (definitionEnd === -1) {
continue;
}
for (; currentIndex < definitionEnd; currentIndex++) {
var t = getToken(0);
if (t.type === "variable") {
addAlias(t, "variable-input");
inputVariables.push(t.content);
}
}
currentIndex = definitionEnd + 1;
}
if (isTokenType(["punctuation", "property-query"]) && getToken(0).content === "{") {
currentIndex++;
addAlias(getToken(0), "property-mutation");
if (inputVariables.length > 0) {
var mutationEnd = findClosingBracket(/^\{$/, /^\}$/);
if (mutationEnd === -1) {
continue;
}
for (var i = currentIndex; i < mutationEnd; i++) {
var varToken = validTokens[i];
if (varToken.type === "variable" && inputVariables.indexOf(varToken.content) >= 0) {
addAlias(varToken, "variable-input");
}
}
}
}
}
}
});
(function(Prism2) {
var interpolation = {
pattern: /((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^\$\{?|\}$/,
alias: "punctuation"
},
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
};
Prism2.languages.groovy = Prism2.languages.extend("clike", {
"string": {
pattern: /'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,
greedy: true
},
"keyword": /\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,
"number": /\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,
"operator": {
pattern: /(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,
lookbehind: true
},
"punctuation": /\.+|[{}[\];(),:$]/
});
Prism2.languages.insertBefore("groovy", "string", {
"shebang": {
pattern: /#!.+/,
alias: "comment",
greedy: true
},
"interpolation-string": {
pattern: /"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,
greedy: true,
inside: {
"interpolation": interpolation,
"string": /[\s\S]+/
}
}
});
Prism2.languages.insertBefore("groovy", "punctuation", {
"spock-block": /\b(?:and|cleanup|expect|given|setup|then|when|where):/
});
Prism2.languages.insertBefore("groovy", "function", {
"annotation": {
pattern: /(^|[^.])@\w+/,
lookbehind: true,
alias: "punctuation"
}
});
interpolation.inside.expression.inside = Prism2.languages.groovy;
})(Prism);
(function(Prism2) {
Prism2.languages.haml = {
"multiline-comment": {
pattern: /((?:^|\r?\n|\r)([\t ]*))(?:\/|-#).*(?:(?:\r?\n|\r)\2[\t ].+)*/,
lookbehind: true,
alias: "comment"
},
"multiline-code": [
{
pattern: /((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*,[\t ]*(?:(?:\r?\n|\r)\2[\t ].*,[\t ]*)*(?:(?:\r?\n|\r)\2[\t ].+)/,
lookbehind: true,
inside: Prism2.languages.ruby
},
{
pattern: /((?:^|\r?\n|\r)([\t ]*)(?:[~-]|[&!]?=)).*\|[\t ]*(?:(?:\r?\n|\r)\2[\t ].*\|[\t ]*)*/,
lookbehind: true,
inside: Prism2.languages.ruby
}
],
"filter": {
pattern: /((?:^|\r?\n|\r)([\t ]*)):[\w-]+(?:(?:\r?\n|\r)(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/,
lookbehind: true,
inside: {
"filter-name": {
pattern: /^:[\w-]+/,
alias: "symbol"
}
}
},
"markup": {
pattern: /((?:^|\r?\n|\r)[\t ]*)<.+/,
lookbehind: true,
inside: Prism2.languages.markup
},
"doctype": {
pattern: /((?:^|\r?\n|\r)[\t ]*)!!!(?: .+)?/,
lookbehind: true
},
"tag": {
pattern: /((?:^|\r?\n|\r)[\t ]*)[%.#][\w\-#.]*[\w\-](?:\([^)]+\)|\{(?:\{[^}]+\}|[^{}])+\}|\[[^\]]+\])*[\/<>]*/,
lookbehind: true,
inside: {
"attributes": [
{
pattern: /(^|[^#])\{(?:\{[^}]+\}|[^{}])+\}/,
lookbehind: true,
inside: Prism2.languages.ruby
},
{
pattern: /\([^)]+\)/,
inside: {
"attr-value": {
pattern: /(=\s*)(?:"(?:\\.|[^\\"\r\n])*"|[^)\s]+)/,
lookbehind: true
},
"attr-name": /[\w:-]+(?=\s*!?=|\s*[,)])/,
"punctuation": /[=(),]/
}
},
{
pattern: /\[[^\]]+\]/,
inside: Prism2.languages.ruby
}
],
"punctuation": /[<>]/
}
},
"code": {
pattern: /((?:^|\r?\n|\r)[\t ]*(?:[~-]|[&!]?=)).+/,
lookbehind: true,
inside: Prism2.languages.ruby
},
"interpolation": {
pattern: /#\{[^}]+\}/,
inside: {
"delimiter": {
pattern: /^#\{|\}$/,
alias: "punctuation"
},
"ruby": {
pattern: /[\s\S]+/,
inside: Prism2.languages.ruby
}
}
},
"punctuation": {
pattern: /((?:^|\r?\n|\r)[\t ]*)[~=\-&!]+/,
lookbehind: true
}
};
var filter_pattern = "((?:^|\\r?\\n|\\r)([\\t ]*)):{{filter_name}}(?:(?:\\r?\\n|\\r)(?:\\2[\\t ].+|\\s*?(?=\\r?\\n|\\r)))+";
var filters = [
"css",
{ filter: "coffee", language: "coffeescript" },
"erb",
"javascript",
"less",
"markdown",
"ruby",
"scss",
"textile"
];
var all_filters = {};
for (var i = 0, l = filters.length; i < l; i++) {
var filter = filters[i];
filter = typeof filter === "string" ? { filter, language: filter } : filter;
if (Prism2.languages[filter.language]) {
all_filters["filter-" + filter.filter] = {
pattern: RegExp(filter_pattern.replace("{{filter_name}}", function() {
return filter.filter;
})),
lookbehind: true,
inside: {
"filter-name": {
pattern: /^:[\w-]+/,
alias: "symbol"
},
"text": {
pattern: /[\s\S]+/,
alias: [filter.language, "language-" + filter.language],
inside: Prism2.languages[filter.language]
}
}
};
}
}
Prism2.languages.insertBefore("haml", "filter", all_filters);
})(Prism);
(function(Prism2) {
Prism2.languages.handlebars = {
"comment": /\{\{![\s\S]*?\}\}/,
"delimiter": {
pattern: /^\{\{\{?|\}\}\}?$/,
alias: "punctuation"
},
"string": /(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,
"number": /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,
"boolean": /\b(?:false|true)\b/,
"block": {
pattern: /^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,
lookbehind: true,
alias: "keyword"
},
"brackets": {
pattern: /\[[^\]]+\]/,
inside: {
punctuation: /\[|\]/,
variable: /[\s\S]+/
}
},
"punctuation": /[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,
"variable": /[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/
};
Prism2.hooks.add("before-tokenize", function(env) {
var handlebarsPattern = /\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "handlebars", handlebarsPattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "handlebars");
});
Prism2.languages.hbs = Prism2.languages.handlebars;
Prism2.languages.mustache = Prism2.languages.handlebars;
})(Prism);
Prism.languages.haskell = {
"comment": {
pattern: /(^|[^-!#$%*+=?&@|~.:<>^\\\/])(?:--(?:(?=.)[^-!#$%*+=?&@|~.:<>^\\\/].*|$)|\{-[\s\S]*?-\})/m,
lookbehind: true
},
"char": {
pattern: /'(?:[^\\']|\\(?:[abfnrtv\\"'&]|\^[A-Z@[\]^_]|ACK|BEL|BS|CAN|CR|DC1|DC2|DC3|DC4|DEL|DLE|EM|ENQ|EOT|ESC|ETB|ETX|FF|FS|GS|HT|LF|NAK|NUL|RS|SI|SO|SOH|SP|STX|SUB|SYN|US|VT|\d+|o[0-7]+|x[0-9a-fA-F]+))'/,
alias: "string"
},
"string": {
pattern: /"(?:[^\\"]|\\(?:\S|\s+\\))*"/,
greedy: true
},
"keyword": /\b(?:case|class|data|deriving|do|else|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b/,
"import-statement": {
pattern: /(^[\t ]*)import\s+(?:qualified\s+)?(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*(?:\s+as\s+(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,
lookbehind: true,
inside: {
"keyword": /\b(?:as|hiding|import|qualified)\b/,
"punctuation": /\./
}
},
"builtin": /\b(?:abs|acos|acosh|all|and|any|appendFile|approxRational|asTypeOf|asin|asinh|atan|atan2|atanh|basicIORun|break|catch|ceiling|chr|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|denominator|digitToInt|div|divMod|drop|dropWhile|either|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromDouble|fromEnum|fromInt|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|group|head|id|inRange|index|init|intToDigit|interact|ioError|isAlpha|isAlphaNum|isAscii|isControl|isDenormalized|isDigit|isHexDigit|isIEEE|isInfinite|isLower|isNaN|isNegativeZero|isOctDigit|isPrint|isSpace|isUpper|iterate|last|lcm|length|lex|lexDigits|lexLitChar|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|numerator|odd|or|ord|otherwise|pack|pi|pred|primExitWith|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|range|rangeSize|read|readDec|readFile|readFloat|readHex|readIO|readInt|readList|readLitChar|readLn|readOct|readParen|readSigned|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showInt|showList|showLitChar|showParen|showSigned|showString|shows|showsPrec|significand|signum|sin|sinh|snd|sort|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|threadToIOResult|toEnum|toInt|toInteger|toLower|toRational|toUpper|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\b/,
"number": /\b(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|0o[0-7]+|0x[0-9a-f]+)\b/i,
"operator": [
{
pattern: /`(?:[A-Z][\w']*\.)*[_a-z][\w']*`/,
greedy: true
},
{
pattern: /(\s)\.(?=\s)/,
lookbehind: true
},
/[-!#$%*+=?&@|~:<>^\\\/][-!#$%*+=?&@|~.:<>^\\\/]*|\.[-!#$%*+=?&@|~.:<>^\\\/]+/
],
"hvariable": {
pattern: /\b(?:[A-Z][\w']*\.)*[_a-z][\w']*/,
inside: {
"punctuation": /\./
}
},
"constant": {
pattern: /\b(?:[A-Z][\w']*\.)*[A-Z][\w']*/,
inside: {
"punctuation": /\./
}
},
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.hs = Prism.languages.haskell;
Prism.languages.haxe = Prism.languages.extend("clike", {
"string": {
pattern: /"(?:[^"\\]|\\[\s\S])*"/,
greedy: true
},
"class-name": [
{
pattern: /(\b(?:abstract|class|enum|extends|implements|interface|new|typedef)\s+)[A-Z_]\w*/,
lookbehind: true
},
/\b[A-Z]\w*/
],
"keyword": /\bthis\b|\b(?:abstract|as|break|case|cast|catch|class|continue|default|do|dynamic|else|enum|extends|extern|final|for|from|function|if|implements|import|in|inline|interface|macro|new|null|operator|overload|override|package|private|public|return|static|super|switch|throw|to|try|typedef|untyped|using|var|while)(?!\.)\b/,
"function": {
pattern: /\b[a-z_]\w*(?=\s*(?:<[^<>]*>\s*)?\()/i,
greedy: true
},
"operator": /\.{3}|\+\+|--|&&|\|\||->|=>|(?:<<?|>{1,3}|[-+*/%!=&|^])=?|[?:~]/
});
Prism.languages.insertBefore("haxe", "string", {
"string-interpolation": {
pattern: /'(?:[^'\\]|\\[\s\S])*'/,
greedy: true,
inside: {
"interpolation": {
pattern: /(^|[^\\])\$(?:\w+|\{[^{}]+\})/,
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^\$\{?|\}$/,
alias: "punctuation"
},
"expression": {
pattern: /[\s\S]+/,
inside: Prism.languages.haxe
}
}
},
"string": /[\s\S]+/
}
}
});
Prism.languages.insertBefore("haxe", "class-name", {
"regex": {
pattern: /~\/(?:[^\/\\\r\n]|\\.)+\/[a-z]*/,
greedy: true,
inside: {
"regex-flags": /\b[a-z]+$/,
"regex-source": {
pattern: /^(~\/)[\s\S]+(?=\/$)/,
lookbehind: true,
alias: "language-regex",
inside: Prism.languages.regex
},
"regex-delimiter": /^~\/|\/$/
}
}
});
Prism.languages.insertBefore("haxe", "keyword", {
"preprocessor": {
pattern: /#(?:else|elseif|end|if)\b.*/,
alias: "property"
},
"metadata": {
pattern: /@:?[\w.]+/,
alias: "symbol"
},
"reification": {
pattern: /\$(?:\w+|(?=\{))/,
alias: "important"
}
});
Prism.languages.hcl = {
"comment": /(?:\/\/|#).*|\/\*[\s\S]*?(?:\*\/|$)/,
"heredoc": {
pattern: /<<-?(\w+\b)[\s\S]*?^[ \t]*\1/m,
greedy: true,
alias: "string"
},
"keyword": [
{
pattern: /(?:data|resource)\s+(?:"(?:\\[\s\S]|[^\\"])*")(?=\s+"[\w-]+"\s+\{)/i,
inside: {
"type": {
pattern: /(resource|data|\s+)(?:"(?:\\[\s\S]|[^\\"])*")/i,
lookbehind: true,
alias: "variable"
}
}
},
{
pattern: /(?:backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+(?=\{)/i,
inside: {
"type": {
pattern: /(backend|module|output|provider|provisioner|variable)\s+(?:[\w-]+|"(?:\\[\s\S]|[^\\"])*")\s+/i,
lookbehind: true,
alias: "variable"
}
}
},
/[\w-]+(?=\s+\{)/
],
"property": [
/[-\w\.]+(?=\s*=(?!=))/,
/"(?:\\[\s\S]|[^\\"])+"(?=\s*[:=])/
],
"string": {
pattern: /"(?:[^\\$"]|\\[\s\S]|\$(?:(?=")|\$+(?!\$)|[^"${])|\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\})*"/,
greedy: true,
inside: {
"interpolation": {
pattern: /(^|[^$])\$\{(?:[^{}"]|"(?:[^\\"]|\\[\s\S])*")*\}/,
lookbehind: true,
inside: {
"type": {
pattern: /(\b(?:count|data|local|module|path|self|terraform|var)\b\.)[\w\*]+/i,
lookbehind: true,
alias: "variable"
},
"keyword": /\b(?:count|data|local|module|path|self|terraform|var)\b/i,
"function": /\w+(?=\()/,
"string": {
pattern: /"(?:\\[\s\S]|[^\\"])*"/,
greedy: true
},
"number": /\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,
"punctuation": /[!\$#%&'()*+,.\/;<=>@\[\\\]^`{|}~?:]/
}
}
}
},
"number": /\b0x[\da-f]+\b|\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,
"boolean": /\b(?:false|true)\b/i,
"punctuation": /[=\[\]{}]/
};
Prism.languages.hlsl = Prism.languages.extend("c", {
"class-name": [
Prism.languages.c["class-name"],
/\b(?:AppendStructuredBuffer|BlendState|Buffer|ByteAddressBuffer|CompileShader|ComputeShader|ConsumeStructuredBuffer|DepthStencilState|DepthStencilView|DomainShader|GeometryShader|Hullshader|InputPatch|LineStream|OutputPatch|PixelShader|PointStream|RWBuffer|RWByteAddressBuffer|RWStructuredBuffer|RWTexture(?:1D|1DArray|2D|2DArray|3D)|RasterizerState|RenderTargetView|SamplerComparisonState|SamplerState|StructuredBuffer|Texture(?:1D|1DArray|2D|2DArray|2DMS|2DMSArray|3D|Cube|CubeArray)|TriangleStream|VertexShader)\b/
],
"keyword": [
/\b(?:asm|asm_fragment|auto|break|case|catch|cbuffer|centroid|char|class|column_major|compile|compile_fragment|const|const_cast|continue|default|delete|discard|do|dynamic_cast|else|enum|explicit|export|extern|for|friend|fxgroup|goto|groupshared|if|in|inline|inout|interface|line|lineadj|linear|long|matrix|mutable|namespace|new|nointerpolation|noperspective|operator|out|packoffset|pass|pixelfragment|point|precise|private|protected|public|register|reinterpret_cast|return|row_major|sample|sampler|shared|short|signed|sizeof|snorm|stateblock|stateblock_state|static|static_cast|string|struct|switch|tbuffer|technique|technique10|technique11|template|texture|this|throw|triangle|triangleadj|try|typedef|typename|uniform|union|unorm|unsigned|using|vector|vertexfragment|virtual|void|volatile|while)\b/,
/\b(?:bool|double|dword|float|half|int|min(?:10float|12int|16(?:float|int|uint))|uint)(?:[1-4](?:x[1-4])?)?\b/
],
"number": /(?:(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?|\b0x[\da-fA-F]+)[fFhHlLuU]?\b/,
"boolean": /\b(?:false|true)\b/
});
Prism.languages.hoon = {
"comment": {
pattern: /::.*/,
greedy: true
},
"string": {
pattern: /"[^"]*"|'[^']*'/,
greedy: true
},
"constant": /%(?:\.[ny]|[\w-]+)/,
"class-name": /@(?:[a-z0-9-]*[a-z0-9])?|\*/i,
"function": /(?:\+[-+] {2})?(?:[a-z](?:[a-z0-9-]*[a-z0-9])?)/,
"keyword": /\.[\^\+\*=\?]|![><:\.=\?!]|=[>|:,\.\-\^<+;/~\*\?]|\?[>|:\.\-\^<\+&~=@!]|\|[\$_%:\.\-\^~\*=@\?]|\+[|\$\+\*]|:[_\-\^\+~\*]|%[_:\.\-\^\+~\*=]|\^[|:\.\-\+&~\*=\?]|\$[|_%:<>\-\^&~@=\?]|;[:<\+;\/~\*=]|~[>|\$_%<\+\/&=\?!]|--|==/
};
(function(Prism2) {
function headerValueOf(name) {
return RegExp("(^(?:" + name + "):[ ]*(?![ ]))[^]+", "i");
}
Prism2.languages.http = {
"request-line": {
pattern: /^(?:CONNECT|DELETE|GET|HEAD|OPTIONS|PATCH|POST|PRI|PUT|SEARCH|TRACE)\s(?:https?:\/\/|\/)\S*\sHTTP\/[\d.]+/m,
inside: {
"method": {
pattern: /^[A-Z]+\b/,
alias: "property"
},
"request-target": {
pattern: /^(\s)(?:https?:\/\/|\/)\S*(?=\s)/,
lookbehind: true,
alias: "url",
inside: Prism2.languages.uri
},
"http-version": {
pattern: /^(\s)HTTP\/[\d.]+/,
lookbehind: true,
alias: "property"
}
}
},
"response-status": {
pattern: /^HTTP\/[\d.]+ \d+ .+/m,
inside: {
"http-version": {
pattern: /^HTTP\/[\d.]+/,
alias: "property"
},
"status-code": {
pattern: /^(\s)\d+(?=\s)/,
lookbehind: true,
alias: "number"
},
"reason-phrase": {
pattern: /^(\s).+/,
lookbehind: true,
alias: "string"
}
}
},
"header": {
pattern: /^[\w-]+:.+(?:(?:\r\n?|\n)[ \t].+)*/m,
inside: {
"header-value": [
{
pattern: headerValueOf(/Content-Security-Policy/.source),
lookbehind: true,
alias: ["csp", "languages-csp"],
inside: Prism2.languages.csp
},
{
pattern: headerValueOf(/Public-Key-Pins(?:-Report-Only)?/.source),
lookbehind: true,
alias: ["hpkp", "languages-hpkp"],
inside: Prism2.languages.hpkp
},
{
pattern: headerValueOf(/Strict-Transport-Security/.source),
lookbehind: true,
alias: ["hsts", "languages-hsts"],
inside: Prism2.languages.hsts
},
{
pattern: headerValueOf(/[^:]+/.source),
lookbehind: true
}
],
"header-name": {
pattern: /^[^:]+/,
alias: "keyword"
},
"punctuation": /^:/
}
}
};
var langs = Prism2.languages;
var httpLanguages = {
"application/javascript": langs.javascript,
"application/json": langs.json || langs.javascript,
"application/xml": langs.xml,
"text/xml": langs.xml,
"text/html": langs.html,
"text/css": langs.css,
"text/plain": langs.plain
};
var suffixTypes = {
"application/json": true,
"application/xml": true
};
function getSuffixPattern(contentType2) {
var suffix = contentType2.replace(/^[a-z]+\//, "");
var suffixPattern = "\\w+/(?:[\\w.-]+\\+)+" + suffix + "(?![+\\w.-])";
return "(?:" + contentType2 + "|" + suffixPattern + ")";
}
var options;
for (var contentType in httpLanguages) {
if (httpLanguages[contentType]) {
options = options || {};
var pattern = suffixTypes[contentType] ? getSuffixPattern(contentType) : contentType;
options[contentType.replace(/\//g, "-")] = {
pattern: RegExp(
"(" + /content-type:\s*/.source + pattern + /(?:(?:\r\n?|\n)[\w-].*)*(?:\r(?:\n|(?!\n))|\n)/.source + ")" + /[^ \t\w-][\s\S]*/.source,
"i"
),
lookbehind: true,
inside: httpLanguages[contentType]
};
}
}
if (options) {
Prism2.languages.insertBefore("http", "header", options);
}
})(Prism);
Prism.languages.hpkp = {
"directive": {
pattern: /\b(?:includeSubDomains|max-age|pin-sha256|preload|report-to|report-uri|strict)(?=[\s;=]|$)/i,
alias: "property"
},
"operator": /=/,
"punctuation": /;/
};
Prism.languages.hsts = {
"directive": {
pattern: /\b(?:includeSubDomains|max-age|preload)(?=[\s;=]|$)/i,
alias: "property"
},
"operator": /=/,
"punctuation": /;/
};
Prism.languages.ichigojam = {
"comment": /(?:\B'|REM)(?:[^\n\r]*)/i,
"string": {
pattern: /"(?:""|[!#$%&'()*,\/:;<=>?^\w +\-.])*"/,
greedy: true
},
"number": /\B#[0-9A-F]+|\B`[01]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
"keyword": /\b(?:BEEP|BPS|CASE|CLEAR|CLK|CLO|CLP|CLS|CLT|CLV|CONT|COPY|ELSE|END|FILE|FILES|FOR|GOSUB|GOTO|GSB|IF|INPUT|KBD|LED|LET|LIST|LOAD|LOCATE|LRUN|NEW|NEXT|OUT|PLAY|POKE|PRINT|PWM|REM|RENUM|RESET|RETURN|RIGHT|RTN|RUN|SAVE|SCROLL|SLEEP|SRND|STEP|STOP|SUB|TEMPO|THEN|TO|UART|VIDEO|WAIT)(?:\$|\b)/i,
"function": /\b(?:ABS|ANA|ASC|BIN|BTN|DEC|END|FREE|HELP|HEX|I2CR|I2CW|IN|INKEY|LEN|LINE|PEEK|RND|SCR|SOUND|STR|TICK|USR|VER|VPEEK|ZER)(?:\$|\b)/i,
"label": /(?:\B@\S+)/,
"operator": /<[=>]?|>=?|\|\||&&|[+\-*\/=|&^~!]|\b(?:AND|NOT|OR)\b/i,
"punctuation": /[\[,;:()\]]/
};
Prism.languages.icon = {
"comment": /#.*/,
"string": {
pattern: /(["'])(?:(?!\1)[^\\\r\n_]|\\.|_(?!\1)(?:\r\n|[\s\S]))*\1/,
greedy: true
},
"number": /\b(?:\d+r[a-z\d]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b|\.\d+\b/i,
"builtin-keyword": {
pattern: /&(?:allocated|ascii|clock|collections|cset|current|date|dateline|digits|dump|e|error(?:number|text|value)?|errout|fail|features|file|host|input|lcase|letters|level|line|main|null|output|phi|pi|pos|progname|random|regions|source|storage|subject|time|trace|ucase|version)\b/,
alias: "variable"
},
"directive": {
pattern: /\$\w+/,
alias: "builtin"
},
"keyword": /\b(?:break|by|case|create|default|do|else|end|every|fail|global|if|initial|invocable|link|local|next|not|of|procedure|record|repeat|return|static|suspend|then|to|until|while)\b/,
"function": /\b(?!\d)\w+(?=\s*[({]|\s*!\s*\[)/,
"operator": /[+-]:(?!=)|(?:[\/?@^%&]|\+\+?|--?|==?=?|~==?=?|\*\*?|\|\|\|?|<(?:->?|<?=?)|>>?=?)(?::=)?|:(?:=:?)?|[!.\\|~]/,
"punctuation": /[\[\](){},;]/
};
(function(Prism2) {
function nested(source, level) {
if (level <= 0) {
return /[]/.source;
} else {
return source.replace(/<SELF>/g, function() {
return nested(source, level - 1);
});
}
}
var stringPattern = /'[{}:=,](?:[^']|'')*'(?!')/;
var escape = {
pattern: /''/,
greedy: true,
alias: "operator"
};
var string = {
pattern: stringPattern,
greedy: true,
inside: {
"escape": escape
}
};
var argumentSource = nested(
/\{(?:[^{}']|'(?![{},'])|''|<STR>|<SELF>)*\}/.source.replace(/<STR>/g, function() {
return stringPattern.source;
}),
8
);
var nestedMessage = {
pattern: RegExp(argumentSource),
inside: {
"message": {
pattern: /^(\{)[\s\S]+(?=\}$)/,
lookbehind: true,
inside: null
},
"message-delimiter": {
pattern: /./,
alias: "punctuation"
}
}
};
Prism2.languages["icu-message-format"] = {
"argument": {
pattern: RegExp(argumentSource),
greedy: true,
inside: {
"content": {
pattern: /^(\{)[\s\S]+(?=\}$)/,
lookbehind: true,
inside: {
"argument-name": {
pattern: /^(\s*)[^{}:=,\s]+/,
lookbehind: true
},
"choice-style": {
pattern: /^(\s*,\s*choice\s*,\s*)\S(?:[\s\S]*\S)?/,
lookbehind: true,
inside: {
"punctuation": /\|/,
"range": {
pattern: /^(\s*)[+-]?(?:\d+(?:\.\d*)?|\u221e)\s*[<#\u2264]/,
lookbehind: true,
inside: {
"operator": /[<#\u2264]/,
"number": /\S+/
}
},
rest: null
}
},
"plural-style": {
pattern: /^(\s*,\s*(?:plural|selectordinal)\s*,\s*)\S(?:[\s\S]*\S)?/,
lookbehind: true,
inside: {
"offset": /^offset:\s*\d+/,
"nested-message": nestedMessage,
"selector": {
pattern: /=\d+|[^{}:=,\s]+/,
inside: {
"keyword": /^(?:few|many|one|other|two|zero)$/
}
}
}
},
"select-style": {
pattern: /^(\s*,\s*select\s*,\s*)\S(?:[\s\S]*\S)?/,
lookbehind: true,
inside: {
"nested-message": nestedMessage,
"selector": {
pattern: /[^{}:=,\s]+/,
inside: {
"keyword": /^other$/
}
}
}
},
"keyword": /\b(?:choice|plural|select|selectordinal)\b/,
"arg-type": {
pattern: /\b(?:date|duration|number|ordinal|spellout|time)\b/,
alias: "keyword"
},
"arg-skeleton": {
pattern: /(,\s*)::[^{}:=,\s]+/,
lookbehind: true
},
"arg-style": {
pattern: /(,\s*)(?:currency|full|integer|long|medium|percent|short)(?=\s*$)/,
lookbehind: true
},
"arg-style-text": {
pattern: RegExp(/(^\s*,\s*(?=\S))/.source + nested(/(?:[^{}']|'[^']*'|\{(?:<SELF>)?\})+/.source, 8) + "$"),
lookbehind: true,
alias: "string"
},
"punctuation": /,/
}
},
"argument-delimiter": {
pattern: /./,
alias: "operator"
}
}
},
"escape": escape,
"string": string
};
nestedMessage.inside.message.inside = Prism2.languages["icu-message-format"];
Prism2.languages["icu-message-format"].argument.inside.content.inside["choice-style"].inside.rest = Prism2.languages["icu-message-format"];
})(Prism);
Prism.languages.idris = Prism.languages.extend("haskell", {
"comment": {
pattern: /(?:(?:--|\|\|\|).*$|\{-[\s\S]*?-\})/m
},
"keyword": /\b(?:Type|case|class|codata|constructor|corecord|data|do|dsl|else|export|if|implementation|implicit|import|impossible|in|infix|infixl|infixr|instance|interface|let|module|mutual|namespace|of|parameters|partial|postulate|private|proof|public|quoteGoal|record|rewrite|syntax|then|total|using|where|with)\b/,
"builtin": void 0
});
Prism.languages.insertBefore("idris", "keyword", {
"import-statement": {
pattern: /(^\s*import\s+)(?:[A-Z][\w']*)(?:\.[A-Z][\w']*)*/m,
lookbehind: true,
inside: {
"punctuation": /\./
}
}
});
Prism.languages.idr = Prism.languages.idris;
(function(Prism2) {
Prism2.languages.ignore = {
"comment": /^#.*/m,
"entry": {
pattern: /\S(?:.*(?:(?:\\ )|\S))?/,
alias: "string",
inside: {
"operator": /^!|\*\*?|\?/,
"regex": {
pattern: /(^|[^\\])\[[^\[\]]*\]/,
lookbehind: true
},
"punctuation": /\//
}
}
};
Prism2.languages.gitignore = Prism2.languages.ignore;
Prism2.languages.hgignore = Prism2.languages.ignore;
Prism2.languages.npmignore = Prism2.languages.ignore;
})(Prism);
Prism.languages.inform7 = {
"string": {
pattern: /"[^"]*"/,
inside: {
"substitution": {
pattern: /\[[^\[\]]+\]/,
inside: {
"delimiter": {
pattern: /\[|\]/,
alias: "punctuation"
}
}
}
}
},
"comment": {
pattern: /\[[^\[\]]+\]/,
greedy: true
},
"title": {
pattern: /^[ \t]*(?:book|chapter|part(?! of)|section|table|volume)\b.+/im,
alias: "important"
},
"number": {
pattern: /(^|[^-])(?:\b\d+(?:\.\d+)?(?:\^\d+)?(?:(?!\d)\w+)?|\b(?:eight|eleven|five|four|nine|one|seven|six|ten|three|twelve|two))\b(?!-)/i,
lookbehind: true
},
"verb": {
pattern: /(^|[^-])\b(?:answering|applying to|are|asking|attacking|be(?:ing)?|burning|buying|called|carries|carry(?! out)|carrying|climbing|closing|conceal(?:ing|s)?|consulting|contain(?:ing|s)?|cutting|drinking|dropping|eating|enclos(?:es?|ing)|entering|examining|exiting|getting|giving|going|ha(?:s|ve|ving)|hold(?:ing|s)?|impl(?:ies|y)|incorporat(?:es?|ing)|inserting|is|jumping|kissing|listening|locking|looking|mean(?:ing|s)?|opening|provid(?:es?|ing)|pulling|pushing|putting|relat(?:es?|ing)|removing|searching|see(?:ing|s)?|setting|showing|singing|sleeping|smelling|squeezing|support(?:ing|s)?|swearing|switching|taking|tasting|telling|thinking|throwing|touching|turning|tying|unlock(?:ing|s)?|var(?:ies|y|ying)|waiting|waking|waving|wear(?:ing|s)?)\b(?!-)/i,
lookbehind: true,
alias: "operator"
},
"keyword": {
pattern: /(^|[^-])\b(?:after|before|carry out|check|continue the action|definition(?= *:)|do nothing|else|end (?:if|the story|unless)|every turn|if|include|instead(?: of)?|let|move|no|now|otherwise|repeat|report|resume the story|rule for|running through|say(?:ing)?|stop the action|test|try(?:ing)?|understand|unless|use|when|while|yes)\b(?!-)/i,
lookbehind: true
},
"property": {
pattern: /(^|[^-])\b(?:adjacent(?! to)|carried|closed|concealed|contained|dark|described|edible|empty|enclosed|enterable|even|female|fixed in place|full|handled|held|improper-named|incorporated|inedible|invisible|lighted|lit|lock(?:able|ed)|male|marked for listing|mentioned|negative|neuter|non-(?:empty|full|recurring)|odd|opaque|open(?:able)?|plural-named|portable|positive|privately-named|proper-named|provided|publically-named|pushable between rooms|recurring|related|rubbing|scenery|seen|singular-named|supported|swinging|switch(?:able|ed(?: off| on)?)|touch(?:able|ed)|transparent|unconcealed|undescribed|unlit|unlocked|unmarked for listing|unmentioned|unopenable|untouchable|unvisited|variable|visible|visited|wearable|worn)\b(?!-)/i,
lookbehind: true,
alias: "symbol"
},
"position": {
pattern: /(^|[^-])\b(?:above|adjacent to|back side of|below|between|down|east|everywhere|front side|here|in|inside(?: from)?|north(?:east|west)?|nowhere|on(?: top of)?|other side|outside(?: from)?|parts? of|regionally in|south(?:east|west)?|through|up|west|within)\b(?!-)/i,
lookbehind: true,
alias: "keyword"
},
"type": {
pattern: /(^|[^-])\b(?:actions?|activit(?:ies|y)|actors?|animals?|backdrops?|containers?|devices?|directions?|doors?|holders?|kinds?|lists?|m[ae]n|nobody|nothing|nouns?|numbers?|objects?|people|persons?|player(?:'s holdall)?|regions?|relations?|rooms?|rule(?:book)?s?|scenes?|someone|something|supporters?|tables?|texts?|things?|time|vehicles?|wom[ae]n)\b(?!-)/i,
lookbehind: true,
alias: "variable"
},
"punctuation": /[.,:;(){}]/
};
Prism.languages.inform7["string"].inside["substitution"].inside.rest = Prism.languages.inform7;
Prism.languages.inform7["string"].inside["substitution"].inside.rest.text = {
pattern: /\S(?:\s*\S)*/,
alias: "comment"
};
Prism.languages.ini = {
"comment": {
pattern: /(^[ \f\t\v]*)[#;][^\n\r]*/m,
lookbehind: true
},
"section": {
pattern: /(^[ \f\t\v]*)\[[^\n\r\]]*\]?/m,
lookbehind: true,
inside: {
"section-name": {
pattern: /(^\[[ \f\t\v]*)[^ \f\t\v\]]+(?:[ \f\t\v]+[^ \f\t\v\]]+)*/,
lookbehind: true,
alias: "selector"
},
"punctuation": /\[|\]/
}
},
"key": {
pattern: /(^[ \f\t\v]*)[^ \f\n\r\t\v=]+(?:[ \f\t\v]+[^ \f\n\r\t\v=]+)*(?=[ \f\t\v]*=)/m,
lookbehind: true,
alias: "attr-name"
},
"value": {
pattern: /(=[ \f\t\v]*)[^ \f\n\r\t\v]+(?:[ \f\t\v]+[^ \f\n\r\t\v]+)*/,
lookbehind: true,
alias: "attr-value",
inside: {
"inner-value": {
pattern: /^("|').+(?=\1$)/,
lookbehind: true
}
}
},
"punctuation": /=/
};
Prism.languages.io = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\/\/.*|#.*)/,
lookbehind: true,
greedy: true
},
"triple-quoted-string": {
pattern: /"""(?:\\[\s\S]|(?!""")[^\\])*"""/,
greedy: true,
alias: "string"
},
"string": {
pattern: /"(?:\\.|[^\\\r\n"])*"/,
greedy: true
},
"keyword": /\b(?:activate|activeCoroCount|asString|block|break|call|catch|clone|collectGarbage|compileString|continue|do|doFile|doMessage|doString|else|elseif|exit|for|foreach|forward|getEnvironmentVariable|getSlot|hasSlot|if|ifFalse|ifNil|ifNilEval|ifTrue|isActive|isNil|isResumable|list|message|method|parent|pass|pause|perform|performWithArgList|print|println|proto|raise|raiseResumable|removeSlot|resend|resume|schedulerSleepSeconds|self|sender|setSchedulerSleepSeconds|setSlot|shallowCopy|slotNames|super|system|then|thisBlock|thisContext|try|type|uniqueId|updateSlot|wait|while|write|yield)\b/,
"builtin": /\b(?:Array|AudioDevice|AudioMixer|BigNum|Block|Box|Buffer|CFunction|CGI|Color|Curses|DBM|DNSResolver|DOConnection|DOProxy|DOServer|Date|Directory|Duration|DynLib|Error|Exception|FFT|File|Fnmatch|Font|Future|GL|GLE|GLScissor|GLU|GLUCylinder|GLUQuadric|GLUSphere|GLUT|Host|Image|Importer|LinkList|List|Lobby|Locals|MD5|MP3Decoder|MP3Encoder|Map|Message|Movie|Notification|Number|Object|OpenGL|Point|Protos|Random|Regex|SGML|SGMLElement|SGMLParser|SQLite|Sequence|Server|ShowMessage|SleepyCat|SleepyCatCursor|Socket|SocketManager|Sound|Soup|Store|String|Tree|UDPSender|UPDReceiver|URL|User|Warning|WeakLink)\b/,
"boolean": /\b(?:false|nil|true)\b/,
"number": /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e-?\d+)?/i,
"operator": /[=!*/%+\-^&|]=|>>?=?|<<?=?|:?:?=|\+\+?|--?|\*\*?|\/\/?|%|\|\|?|&&?|\b(?:and|not|or|return)\b|@@?|\?\??|\.\./,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.j = {
"comment": {
pattern: /\bNB\..*/,
greedy: true
},
"string": {
pattern: /'(?:''|[^'\r\n])*'/,
greedy: true
},
"keyword": /\b(?:(?:CR|LF|adverb|conjunction|def|define|dyad|monad|noun|verb)\b|(?:assert|break|case|catch[dt]?|continue|do|else|elseif|end|fcase|for|for_\w+|goto_\w+|if|label_\w+|return|select|throw|try|while|whilst)\.)/,
"verb": {
pattern: /(?!\^:|;\.|[=!][.:])(?:\{(?:\.|::?)?|p(?:\.\.?|:)|[=!\]]|[<>+*\-%$|,#][.:]?|[?^]\.?|[;\[]:?|[~}"i][.:]|[ACeEIjLor]\.|(?:[_\/\\qsux]|_?\d):)/,
alias: "keyword"
},
"number": /\b_?(?:(?!\d:)\d+(?:\.\d+)?(?:(?:ad|ar|[ejpx])_?\d+(?:\.\d+)?)*(?:b_?[\da-z]+(?:\.[\da-z]+)?)?|_\b(?!\.))/,
"adverb": {
pattern: /[~}]|[\/\\]\.?|[bfM]\.|t[.:]/,
alias: "builtin"
},
"operator": /[=a][.:]|_\./,
"conjunction": {
pattern: /&(?:\.:?|:)?|[.:@][.:]?|[!D][.:]|[;dHT]\.|`:?|[\^LS]:|"/,
alias: "variable"
},
"punctuation": /[()]/
};
(function(Prism2) {
var keywords = /\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/;
var classNamePrefix = /(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source;
var className = {
pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),
lookbehind: true,
inside: {
"namespace": {
pattern: /^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,
inside: {
"punctuation": /\./
}
},
"punctuation": /\./
}
};
Prism2.languages.java = Prism2.languages.extend("clike", {
"string": {
pattern: /(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,
lookbehind: true,
greedy: true
},
"class-name": [
className,
{
pattern: RegExp(/(^|[^\w.])/.source + classNamePrefix + /[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),
lookbehind: true,
inside: className.inside
},
{
pattern: RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source + classNamePrefix + /[A-Z]\w*\b/.source),
lookbehind: true,
inside: className.inside
}
],
"keyword": keywords,
"function": [
Prism2.languages.clike.function,
{
pattern: /(::\s*)[a-z_]\w*/,
lookbehind: true
}
],
"number": /\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,
"operator": {
pattern: /(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,
lookbehind: true
}
});
Prism2.languages.insertBefore("java", "string", {
"triple-quoted-string": {
pattern: /"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,
greedy: true,
alias: "string"
},
"char": {
pattern: /'(?:\\.|[^'\\\r\n]){1,6}'/,
greedy: true
}
});
Prism2.languages.insertBefore("java", "class-name", {
"annotation": {
pattern: /(^|[^.])@\w+(?:\s*\.\s*\w+)*/,
lookbehind: true,
alias: "punctuation"
},
"generics": {
pattern: /<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,
inside: {
"class-name": className,
"keyword": keywords,
"punctuation": /[<>(),.:]/,
"operator": /[?&|]/
}
},
"import": [
{
pattern: RegExp(/(\bimport\s+)/.source + classNamePrefix + /(?:[A-Z]\w*|\*)(?=\s*;)/.source),
lookbehind: true,
inside: {
"namespace": className.inside.namespace,
"punctuation": /\./,
"operator": /\*/,
"class-name": /\w+/
}
},
{
pattern: RegExp(/(\bimport\s+static\s+)/.source + classNamePrefix + /(?:\w+|\*)(?=\s*;)/.source),
lookbehind: true,
alias: "static",
inside: {
"namespace": className.inside.namespace,
"static": /\b\w+$/,
"punctuation": /\./,
"operator": /\*/,
"class-name": /\w+/
}
}
],
"namespace": {
pattern: RegExp(
/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g, function() {
return keywords.source;
})
),
lookbehind: true,
inside: {
"punctuation": /\./
}
}
});
})(Prism);
(function(Prism2) {
var comment = /\/\*[\s\S]*?\*\/|\/\/.*|#(?!\[).*/;
var constant = [
{
pattern: /\b(?:false|true)\b/i,
alias: "boolean"
},
{
pattern: /(::\s*)\b[a-z_]\w*\b(?!\s*\()/i,
greedy: true,
lookbehind: true
},
{
pattern: /(\b(?:case|const)\s+)\b[a-z_]\w*(?=\s*[;=])/i,
greedy: true,
lookbehind: true
},
/\b(?:null)\b/i,
/\b[A-Z_][A-Z0-9_]*\b(?!\s*\()/
];
var number = /\b0b[01]+(?:_[01]+)*\b|\b0o[0-7]+(?:_[0-7]+)*\b|\b0x[\da-f]+(?:_[\da-f]+)*\b|(?:\b\d+(?:_\d+)*\.?(?:\d+(?:_\d+)*)?|\B\.\d+)(?:e[+-]?\d+)?/i;
var operator = /<?=>|\?\?=?|\.{3}|\??->|[!=]=?=?|::|\*\*=?|--|\+\+|&&|\|\||<<|>>|[?~]|[/^|%*&<>.+-]=?/;
var punctuation = /[{}\[\](),:;]/;
Prism2.languages.php = {
"delimiter": {
pattern: /\?>$|^<\?(?:php(?=\s)|=)?/i,
alias: "important"
},
"comment": comment,
"variable": /\$+(?:\w+\b|(?=\{))/,
"package": {
pattern: /(namespace\s+|use\s+(?:function\s+)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,
lookbehind: true,
inside: {
"punctuation": /\\/
}
},
"class-name-definition": {
pattern: /(\b(?:class|enum|interface|trait)\s+)\b[a-z_]\w*(?!\\)\b/i,
lookbehind: true,
alias: "class-name"
},
"function-definition": {
pattern: /(\bfunction\s+)[a-z_]\w*(?=\s*\()/i,
lookbehind: true,
alias: "function"
},
"keyword": [
{
pattern: /(\(\s*)\b(?:array|bool|boolean|float|int|integer|object|string)\b(?=\s*\))/i,
alias: "type-casting",
greedy: true,
lookbehind: true
},
{
pattern: /([(,?]\s*)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|object|self|static|string)\b(?=\s*\$)/i,
alias: "type-hint",
greedy: true,
lookbehind: true
},
{
pattern: /(\)\s*:\s*(?:\?\s*)?)\b(?:array(?!\s*\()|bool|callable|(?:false|null)(?=\s*\|)|float|int|iterable|mixed|never|object|self|static|string|void)\b/i,
alias: "return-type",
greedy: true,
lookbehind: true
},
{
pattern: /\b(?:array(?!\s*\()|bool|float|int|iterable|mixed|object|string|void)\b/i,
alias: "type-declaration",
greedy: true
},
{
pattern: /(\|\s*)(?:false|null)\b|\b(?:false|null)(?=\s*\|)/i,
alias: "type-declaration",
greedy: true,
lookbehind: true
},
{
pattern: /\b(?:parent|self|static)(?=\s*::)/i,
alias: "static-context",
greedy: true
},
{
pattern: /(\byield\s+)from\b/i,
lookbehind: true
},
/\bclass\b/i,
{
pattern: /((?:^|[^\s>:]|(?:^|[^-])>|(?:^|[^:]):)\s*)\b(?:abstract|and|array|as|break|callable|case|catch|clone|const|continue|declare|default|die|do|echo|else|elseif|empty|enddeclare|endfor|endforeach|endif|endswitch|endwhile|enum|eval|exit|extends|final|finally|fn|for|foreach|function|global|goto|if|implements|include|include_once|instanceof|insteadof|interface|isset|list|match|namespace|never|new|or|parent|print|private|protected|public|readonly|require|require_once|return|self|static|switch|throw|trait|try|unset|use|var|while|xor|yield|__halt_compiler)\b/i,
lookbehind: true
}
],
"argument-name": {
pattern: /([(,]\s*)\b[a-z_]\w*(?=\s*:(?!:))/i,
lookbehind: true
},
"class-name": [
{
pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self|\s+static))\s+|\bcatch\s*\()\b[a-z_]\w*(?!\\)\b/i,
greedy: true,
lookbehind: true
},
{
pattern: /(\|\s*)\b[a-z_]\w*(?!\\)\b/i,
greedy: true,
lookbehind: true
},
{
pattern: /\b[a-z_]\w*(?!\\)\b(?=\s*\|)/i,
greedy: true
},
{
pattern: /(\|\s*)(?:\\?\b[a-z_]\w*)+\b/i,
alias: "class-name-fully-qualified",
greedy: true,
lookbehind: true,
inside: {
"punctuation": /\\/
}
},
{
pattern: /(?:\\?\b[a-z_]\w*)+\b(?=\s*\|)/i,
alias: "class-name-fully-qualified",
greedy: true,
inside: {
"punctuation": /\\/
}
},
{
pattern: /(\b(?:extends|implements|instanceof|new(?!\s+self\b|\s+static\b))\s+|\bcatch\s*\()(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,
alias: "class-name-fully-qualified",
greedy: true,
lookbehind: true,
inside: {
"punctuation": /\\/
}
},
{
pattern: /\b[a-z_]\w*(?=\s*\$)/i,
alias: "type-declaration",
greedy: true
},
{
pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,
alias: ["class-name-fully-qualified", "type-declaration"],
greedy: true,
inside: {
"punctuation": /\\/
}
},
{
pattern: /\b[a-z_]\w*(?=\s*::)/i,
alias: "static-context",
greedy: true
},
{
pattern: /(?:\\?\b[a-z_]\w*)+(?=\s*::)/i,
alias: ["class-name-fully-qualified", "static-context"],
greedy: true,
inside: {
"punctuation": /\\/
}
},
{
pattern: /([(,?]\s*)[a-z_]\w*(?=\s*\$)/i,
alias: "type-hint",
greedy: true,
lookbehind: true
},
{
pattern: /([(,?]\s*)(?:\\?\b[a-z_]\w*)+(?=\s*\$)/i,
alias: ["class-name-fully-qualified", "type-hint"],
greedy: true,
lookbehind: true,
inside: {
"punctuation": /\\/
}
},
{
pattern: /(\)\s*:\s*(?:\?\s*)?)\b[a-z_]\w*(?!\\)\b/i,
alias: "return-type",
greedy: true,
lookbehind: true
},
{
pattern: /(\)\s*:\s*(?:\?\s*)?)(?:\\?\b[a-z_]\w*)+\b(?!\\)/i,
alias: ["class-name-fully-qualified", "return-type"],
greedy: true,
lookbehind: true,
inside: {
"punctuation": /\\/
}
}
],
"constant": constant,
"function": {
pattern: /(^|[^\\\w])\\?[a-z_](?:[\w\\]*\w)?(?=\s*\()/i,
lookbehind: true,
inside: {
"punctuation": /\\/
}
},
"property": {
pattern: /(->\s*)\w+/,
lookbehind: true
},
"number": number,
"operator": operator,
"punctuation": punctuation
};
var string_interpolation = {
pattern: /\{\$(?:\{(?:\{[^{}]+\}|[^{}]+)\}|[^{}])+\}|(^|[^\\{])\$+(?:\w+(?:\[[^\r\n\[\]]+\]|->\w+)?)/,
lookbehind: true,
inside: Prism2.languages.php
};
var string = [
{
pattern: /<<<'([^']+)'[\r\n](?:.*[\r\n])*?\1;/,
alias: "nowdoc-string",
greedy: true,
inside: {
"delimiter": {
pattern: /^<<<'[^']+'|[a-z_]\w*;$/i,
alias: "symbol",
inside: {
"punctuation": /^<<<'?|[';]$/
}
}
}
},
{
pattern: /<<<(?:"([^"]+)"[\r\n](?:.*[\r\n])*?\1;|([a-z_]\w*)[\r\n](?:.*[\r\n])*?\2;)/i,
alias: "heredoc-string",
greedy: true,
inside: {
"delimiter": {
pattern: /^<<<(?:"[^"]+"|[a-z_]\w*)|[a-z_]\w*;$/i,
alias: "symbol",
inside: {
"punctuation": /^<<<"?|[";]$/
}
},
"interpolation": string_interpolation
}
},
{
pattern: /`(?:\\[\s\S]|[^\\`])*`/,
alias: "backtick-quoted-string",
greedy: true
},
{
pattern: /'(?:\\[\s\S]|[^\\'])*'/,
alias: "single-quoted-string",
greedy: true
},
{
pattern: /"(?:\\[\s\S]|[^\\"])*"/,
alias: "double-quoted-string",
greedy: true,
inside: {
"interpolation": string_interpolation
}
}
];
Prism2.languages.insertBefore("php", "variable", {
"string": string,
"attribute": {
pattern: /#\[(?:[^"'\/#]|\/(?![*/])|\/\/.*$|#(?!\[).*$|\/\*(?:[^*]|\*(?!\/))*\*\/|"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*')+\](?=\s*[a-z$#])/im,
greedy: true,
inside: {
"attribute-content": {
pattern: /^(#\[)[\s\S]+(?=\]$)/,
lookbehind: true,
inside: {
"comment": comment,
"string": string,
"attribute-class-name": [
{
pattern: /([^:]|^)\b[a-z_]\w*(?!\\)\b/i,
alias: "class-name",
greedy: true,
lookbehind: true
},
{
pattern: /([^:]|^)(?:\\?\b[a-z_]\w*)+/i,
alias: [
"class-name",
"class-name-fully-qualified"
],
greedy: true,
lookbehind: true,
inside: {
"punctuation": /\\/
}
}
],
"constant": constant,
"number": number,
"operator": operator,
"punctuation": punctuation
}
},
"delimiter": {
pattern: /^#\[|\]$/,
alias: "punctuation"
}
}
}
});
Prism2.hooks.add("before-tokenize", function(env) {
if (!/<\?/.test(env.code)) {
return;
}
var phpPattern = /<\?(?:[^"'/#]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|(?:\/\/|#(?!\[))(?:[^?\n\r]|\?(?!>))*(?=$|\?>|[\r\n])|#\[|\/\*(?:[^*]|\*(?!\/))*(?:\*\/|$))*?(?:\?>|$)/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "php", phpPattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "php");
});
})(Prism);
(function(Prism2) {
var javaDocLike = Prism2.languages.javadoclike = {
"parameter": {
pattern: /(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,
lookbehind: true
},
"keyword": {
pattern: /(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,
lookbehind: true
},
"punctuation": /[{}]/
};
function docCommentSupport(lang, callback) {
var tokenName = "doc-comment";
var grammar = Prism2.languages[lang];
if (!grammar) {
return;
}
var token = grammar[tokenName];
if (!token) {
var definition = {};
definition[tokenName] = {
pattern: /(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,
lookbehind: true,
alias: "comment"
};
grammar = Prism2.languages.insertBefore(lang, "comment", definition);
token = grammar[tokenName];
}
if (token instanceof RegExp) {
token = grammar[tokenName] = { pattern: token };
}
if (Array.isArray(token)) {
for (var i = 0, l = token.length; i < l; i++) {
if (token[i] instanceof RegExp) {
token[i] = { pattern: token[i] };
}
callback(token[i]);
}
} else {
callback(token);
}
}
function addSupport(languages, docLanguage) {
if (typeof languages === "string") {
languages = [languages];
}
languages.forEach(function(lang) {
docCommentSupport(lang, function(pattern) {
if (!pattern.inside) {
pattern.inside = {};
}
pattern.inside.rest = docLanguage;
});
});
}
Object.defineProperty(javaDocLike, "addSupport", { value: addSupport });
javaDocLike.addSupport(["java", "javascript", "php"], javaDocLike);
})(Prism);
(function(Prism2) {
var codeLinePattern = /(^(?:[\t ]*(?:\*\s*)*))[^*\s].*$/m;
var memberReference = /#\s*\w+(?:\s*\([^()]*\))?/.source;
var reference2 = /(?:\b[a-zA-Z]\w+\s*\.\s*)*\b[A-Z]\w*(?:\s*<mem>)?|<mem>/.source.replace(/<mem>/g, function() {
return memberReference;
});
Prism2.languages.javadoc = Prism2.languages.extend("javadoclike", {});
Prism2.languages.insertBefore("javadoc", "keyword", {
"reference": {
pattern: RegExp(/(@(?:exception|link|linkplain|see|throws|value)\s+(?:\*\s*)?)/.source + "(?:" + reference2 + ")"),
lookbehind: true,
inside: {
"function": {
pattern: /(#\s*)\w+(?=\s*\()/,
lookbehind: true
},
"field": {
pattern: /(#\s*)\w+/,
lookbehind: true
},
"namespace": {
pattern: /\b(?:[a-z]\w*\s*\.\s*)+/,
inside: {
"punctuation": /\./
}
},
"class-name": /\b[A-Z]\w*/,
"keyword": Prism2.languages.java.keyword,
"punctuation": /[#()[\],.]/
}
},
"class-name": {
pattern: /(@param\s+)<[A-Z]\w*>/,
lookbehind: true,
inside: {
"punctuation": /[.<>]/
}
},
"code-section": [
{
pattern: /(\{@code\s+(?!\s))(?:[^\s{}]|\s+(?![\s}])|\{(?:[^{}]|\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})*\})*\})+(?=\s*\})/,
lookbehind: true,
inside: {
"code": {
pattern: codeLinePattern,
lookbehind: true,
inside: Prism2.languages.java,
alias: "language-java"
}
}
},
{
pattern: /(<(code|pre|tt)>(?!<code>)\s*)\S(?:\S|\s+\S)*?(?=\s*<\/\2>)/,
lookbehind: true,
inside: {
"line": {
pattern: codeLinePattern,
lookbehind: true,
inside: {
"tag": Prism2.languages.markup.tag,
"entity": Prism2.languages.markup.entity,
"code": {
pattern: /.+/,
inside: Prism2.languages.java,
alias: "language-java"
}
}
}
}
}
],
"tag": Prism2.languages.markup.tag,
"entity": Prism2.languages.markup.entity
});
Prism2.languages.javadoclike.addSupport("java", Prism2.languages.javadoc);
})(Prism);
Prism.languages.javastacktrace = {
"summary": {
pattern: /^([\t ]*)(?:(?:Caused by:|Suppressed:|Exception in thread "[^"]*")[\t ]+)?[\w$.]+(?::.*)?$/m,
lookbehind: true,
inside: {
"keyword": {
pattern: /^([\t ]*)(?:(?:Caused by|Suppressed)(?=:)|Exception in thread)/m,
lookbehind: true
},
"string": {
pattern: /^(\s*)"[^"]*"/,
lookbehind: true
},
"exceptions": {
pattern: /^(:?\s*)[\w$.]+(?=:|$)/,
lookbehind: true,
inside: {
"class-name": /[\w$]+$/,
"namespace": /\b[a-z]\w*\b/,
"punctuation": /\./
}
},
"message": {
pattern: /(:\s*)\S.*/,
lookbehind: true,
alias: "string"
},
"punctuation": /:/
}
},
"stack-frame": {
pattern: /^([\t ]*)at (?:[\w$./]|@[\w$.+-]*\/)+(?:<init>)?\([^()]*\)/m,
lookbehind: true,
inside: {
"keyword": {
pattern: /^(\s*)at(?= )/,
lookbehind: true
},
"source": [
{
pattern: /(\()\w+\.\w+:\d+(?=\))/,
lookbehind: true,
inside: {
"file": /^\w+\.\w+/,
"punctuation": /:/,
"line-number": {
pattern: /\b\d+\b/,
alias: "number"
}
}
},
{
pattern: /(\()[^()]*(?=\))/,
lookbehind: true,
inside: {
"keyword": /^(?:Native Method|Unknown Source)$/
}
}
],
"class-name": /[\w$]+(?=\.(?:<init>|[\w$]+)\()/,
"function": /(?:<init>|[\w$]+)(?=\()/,
"class-loader": {
pattern: /(\s)[a-z]\w*(?:\.[a-z]\w*)*(?=\/[\w@$.]*\/)/,
lookbehind: true,
alias: "namespace",
inside: {
"punctuation": /\./
}
},
"module": {
pattern: /([\s/])[a-z]\w*(?:\.[a-z]\w*)*(?:@[\w$.+-]*)?(?=\/)/,
lookbehind: true,
inside: {
"version": {
pattern: /(@)[\s\S]+/,
lookbehind: true,
alias: "number"
},
"punctuation": /[@.]/
}
},
"namespace": {
pattern: /(?:\b[a-z]\w*\.)+/,
inside: {
"punctuation": /\./
}
},
"punctuation": /[()/.]/
}
},
"more": {
pattern: /^([\t ]*)\.{3} \d+ [a-z]+(?: [a-z]+)*/m,
lookbehind: true,
inside: {
"punctuation": /\.{3}/,
"number": /\d+/,
"keyword": /\b[a-z]+(?: [a-z]+)*\b/
}
}
};
Prism.languages.jexl = {
"string": /(["'])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
"transform": {
pattern: /(\|\s*)[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*/,
alias: "function",
lookbehind: true
},
"function": /[a-zA-Zа-яА-Я_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$][\wа-яА-Я\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF$]*\s*(?=\()/,
"number": /\b\d+(?:\.\d+)?\b|\B\.\d+\b/,
"operator": /[<>!]=?|-|\+|&&|==|\|\|?|\/\/?|[?:*^%]/,
"boolean": /\b(?:false|true)\b/,
"keyword": /\bin\b/,
"punctuation": /[{}[\](),.]/
};
Prism.languages.jolie = Prism.languages.extend("clike", {
"string": {
pattern: /(^|[^\\])"(?:\\[\s\S]|[^"\\])*"/,
lookbehind: true,
greedy: true
},
"class-name": {
pattern: /((?:\b(?:as|courier|embed|in|inputPort|outputPort|service)\b|@)[ \t]*)\w+/,
lookbehind: true
},
"keyword": /\b(?:as|cH|comp|concurrent|constants|courier|cset|csets|default|define|else|embed|embedded|execution|exit|extender|for|foreach|forward|from|global|if|import|in|include|init|inputPort|install|instanceof|interface|is_defined|linkIn|linkOut|main|new|nullProcess|outputPort|over|private|provide|public|scope|sequential|service|single|spawn|synchronized|this|throw|throws|type|undef|until|while|with)\b/,
"function": /\b[a-z_]\w*(?=[ \t]*[@(])/i,
"number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?l?/i,
"operator": /-[-=>]?|\+[+=]?|<[<=]?|[>=*!]=?|&&|\|\||[?\/%^@|]/,
"punctuation": /[()[\]{},;.:]/,
"builtin": /\b(?:Byte|any|bool|char|double|enum|float|int|length|long|ranges|regex|string|undefined|void)\b/
});
Prism.languages.insertBefore("jolie", "keyword", {
"aggregates": {
pattern: /(\bAggregates\s*:\s*)(?:\w+(?:\s+with\s+\w+)?\s*,\s*)*\w+(?:\s+with\s+\w+)?/,
lookbehind: true,
inside: {
"keyword": /\bwith\b/,
"class-name": /\w+/,
"punctuation": /,/
}
},
"redirects": {
pattern: /(\bRedirects\s*:\s*)(?:\w+\s*=>\s*\w+\s*,\s*)*(?:\w+\s*=>\s*\w+)/,
lookbehind: true,
inside: {
"punctuation": /,/,
"class-name": /\w+/,
"operator": /=>/
}
},
"property": {
pattern: /\b(?:Aggregates|[Ii]nterfaces|Java|Javascript|Jolie|[Ll]ocation|OneWay|[Pp]rotocol|Redirects|RequestResponse)\b(?=[ \t]*:)/
}
});
(function(Prism2) {
var interpolation = /\\\((?:[^()]|\([^()]*\))*\)/.source;
var string = RegExp(/(^|[^\\])"(?:[^"\r\n\\]|\\[^\r\n(]|__)*"/.source.replace(/__/g, function() {
return interpolation;
}));
var stringInterpolation = {
"interpolation": {
pattern: RegExp(/((?:^|[^\\])(?:\\{2})*)/.source + interpolation),
lookbehind: true,
inside: {
"content": {
pattern: /^(\\\()[\s\S]+(?=\)$)/,
lookbehind: true,
inside: null
},
"punctuation": /^\\\(|\)$/
}
}
};
var jq = Prism2.languages.jq = {
"comment": /#.*/,
"property": {
pattern: RegExp(string.source + /(?=\s*:(?!:))/.source),
lookbehind: true,
greedy: true,
inside: stringInterpolation
},
"string": {
pattern: string,
lookbehind: true,
greedy: true,
inside: stringInterpolation
},
"function": {
pattern: /(\bdef\s+)[a-z_]\w+/i,
lookbehind: true
},
"variable": /\B\$\w+/,
"property-literal": {
pattern: /\b[a-z_]\w*(?=\s*:(?!:))/i,
alias: "property"
},
"keyword": /\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,
"boolean": /\b(?:false|true)\b/,
"number": /(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,
"operator": [
{
pattern: /\|=?/,
alias: "pipe"
},
/\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/
],
"c-style-function": {
pattern: /\b[a-z_]\w*(?=\s*\()/i,
alias: "function"
},
"punctuation": /::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,
"dot": {
pattern: /\./,
alias: "important"
}
};
stringInterpolation.interpolation.inside.content.inside = jq;
})(Prism);
(function(Prism2) {
Prism2.languages.typescript = Prism2.languages.extend("javascript", {
"class-name": {
pattern: /(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,
lookbehind: true,
greedy: true,
inside: null
},
"builtin": /\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/
});
Prism2.languages.typescript.keyword.push(
/\b(?:abstract|declare|is|keyof|readonly|require)\b/,
/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,
/\btype\b(?=\s*(?:[\{*]|$))/
);
delete Prism2.languages.typescript["parameter"];
delete Prism2.languages.typescript["literal-property"];
var typeInside = Prism2.languages.extend("typescript", {});
delete typeInside["class-name"];
Prism2.languages.typescript["class-name"].inside = typeInside;
Prism2.languages.insertBefore("typescript", "function", {
"decorator": {
pattern: /@[$\w\xA0-\uFFFF]+/,
inside: {
"at": {
pattern: /^@/,
alias: "operator"
},
"function": /^[\s\S]+/
}
},
"generic-function": {
pattern: /#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,
greedy: true,
inside: {
"function": /^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,
"generic": {
pattern: /<[\s\S]+/,
alias: "class-name",
inside: typeInside
}
}
}
});
Prism2.languages.ts = Prism2.languages.typescript;
})(Prism);
(function(Prism2) {
var javascript = Prism2.languages.javascript;
var type = /\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source;
var parameterPrefix = "(@(?:arg|argument|param|property)\\s+(?:" + type + "\\s+)?)";
Prism2.languages.jsdoc = Prism2.languages.extend("javadoclike", {
"parameter": {
pattern: RegExp(parameterPrefix + /(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),
lookbehind: true,
inside: {
"punctuation": /\./
}
}
});
Prism2.languages.insertBefore("jsdoc", "keyword", {
"optional-parameter": {
pattern: RegExp(parameterPrefix + /\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),
lookbehind: true,
inside: {
"parameter": {
pattern: /(^\[)[$\w\xA0-\uFFFF\.]+/,
lookbehind: true,
inside: {
"punctuation": /\./
}
},
"code": {
pattern: /(=)[\s\S]*(?=\]$)/,
lookbehind: true,
inside: javascript,
alias: "language-javascript"
},
"punctuation": /[=[\]]/
}
},
"class-name": [
{
pattern: RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g, function() {
return type;
})),
lookbehind: true,
inside: {
"punctuation": /\./
}
},
{
pattern: RegExp("(@[a-z]+\\s+)" + type),
lookbehind: true,
inside: {
"string": javascript.string,
"number": javascript.number,
"boolean": javascript.boolean,
"keyword": Prism2.languages.typescript.keyword,
"operator": /=>|\.\.\.|[&|?:*]/,
"punctuation": /[.,;=<>{}()[\]]/
}
}
],
"example": {
pattern: /(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,
lookbehind: true,
inside: {
"code": {
pattern: /^([\t ]*(?:\*\s*)?)\S.*$/m,
lookbehind: true,
inside: javascript,
alias: "language-javascript"
}
}
}
});
Prism2.languages.javadoclike.addSupport("javascript", Prism2.languages.jsdoc);
})(Prism);
(function(Prism2) {
Prism2.languages.insertBefore("javascript", "function-variable", {
"method-variable": {
pattern: RegExp("(\\.\\s*)" + Prism2.languages.javascript["function-variable"].pattern.source),
lookbehind: true,
alias: ["function-variable", "method", "function", "property-access"]
}
});
Prism2.languages.insertBefore("javascript", "function", {
"method": {
pattern: RegExp("(\\.\\s*)" + Prism2.languages.javascript["function"].source),
lookbehind: true,
alias: ["function", "property-access"]
}
});
Prism2.languages.insertBefore("javascript", "constant", {
"known-class-name": [
{
pattern: /\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,
alias: "class-name"
},
{
pattern: /\b(?:[A-Z]\w*)Error\b/,
alias: "class-name"
}
]
});
function withId(source, flags) {
return RegExp(
source.replace(/<ID>/g, function() {
return /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source;
}),
flags
);
}
Prism2.languages.insertBefore("javascript", "keyword", {
"imports": {
pattern: withId(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),
lookbehind: true,
inside: Prism2.languages.javascript
},
"exports": {
pattern: withId(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),
lookbehind: true,
inside: Prism2.languages.javascript
}
});
Prism2.languages.javascript["keyword"].unshift(
{
pattern: /\b(?:as|default|export|from|import)\b/,
alias: "module"
},
{
pattern: /\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,
alias: "control-flow"
},
{
pattern: /\bnull\b/,
alias: ["null", "nil"]
},
{
pattern: /\bundefined\b/,
alias: "nil"
}
);
Prism2.languages.insertBefore("javascript", "operator", {
"spread": {
pattern: /\.{3}/,
alias: "operator"
},
"arrow": {
pattern: /=>/,
alias: "operator"
}
});
Prism2.languages.insertBefore("javascript", "punctuation", {
"property-access": {
pattern: withId(/(\.\s*)#?<ID>/.source),
lookbehind: true
},
"maybe-class-name": {
pattern: /(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,
lookbehind: true
},
"dom": {
pattern: /\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,
alias: "variable"
},
"console": {
pattern: /\bconsole(?=\s*\.)/,
alias: "class-name"
}
});
var maybeClassNameTokens = ["function", "function-variable", "method", "method-variable", "property-access"];
for (var i = 0; i < maybeClassNameTokens.length; i++) {
var token = maybeClassNameTokens[i];
var value = Prism2.languages.javascript[token];
if (Prism2.util.type(value) === "RegExp") {
value = Prism2.languages.javascript[token] = {
pattern: value
};
}
var inside = value.inside || {};
value.inside = inside;
inside["maybe-class-name"] = /^[A-Z][\s\S]*/;
}
})(Prism);
Prism.languages.json = {
"property": {
pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,
lookbehind: true,
greedy: true
},
"string": {
pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,
lookbehind: true,
greedy: true
},
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
greedy: true
},
"number": /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
"punctuation": /[{}[\],]/,
"operator": /:/,
"boolean": /\b(?:false|true)\b/,
"null": {
pattern: /\bnull\b/,
alias: "keyword"
}
};
Prism.languages.webmanifest = Prism.languages.json;
(function(Prism2) {
var string = /("|')(?:\\(?:\r\n?|\n|.)|(?!\1)[^\\\r\n])*\1/;
Prism2.languages.json5 = Prism2.languages.extend("json", {
"property": [
{
pattern: RegExp(string.source + "(?=\\s*:)"),
greedy: true
},
{
pattern: /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/,
alias: "unquoted"
}
],
"string": {
pattern: string,
greedy: true
},
"number": /[+-]?\b(?:NaN|Infinity|0x[a-fA-F\d]+)\b|[+-]?(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+\b)?/
});
})(Prism);
Prism.languages.jsonp = Prism.languages.extend("json", {
"punctuation": /[{}[\]();,.]/
});
Prism.languages.insertBefore("jsonp", "punctuation", {
"function": /(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*\()/
});
Prism.languages.jsstacktrace = {
"error-message": {
pattern: /^\S.*/m,
alias: "string"
},
"stack-frame": {
pattern: /(^[ \t]+)at[ \t].*/m,
lookbehind: true,
inside: {
"not-my-code": {
pattern: /^at[ \t]+(?!\s)(?:node\.js|<unknown>|.*(?:node_modules|\(<anonymous>\)|\(<unknown>|<anonymous>$|\(internal\/|\(node\.js)).*/m,
alias: "comment"
},
"filename": {
pattern: /(\bat\s+(?!\s)|\()(?:[a-zA-Z]:)?[^():]+(?=:)/,
lookbehind: true,
alias: "url"
},
"function": {
pattern: /(\bat\s+(?:new\s+)?)(?!\s)[_$a-zA-Z\xA0-\uFFFF<][.$\w\xA0-\uFFFF<>]*/,
lookbehind: true,
inside: {
"punctuation": /\./
}
},
"punctuation": /[()]/,
"keyword": /\b(?:at|new)\b/,
"alias": {
pattern: /\[(?:as\s+)?(?!\s)[_$a-zA-Z\xA0-\uFFFF][$\w\xA0-\uFFFF]*\]/,
alias: "variable"
},
"line-number": {
pattern: /:\d+(?::\d+)?\b/,
alias: "number",
inside: {
"punctuation": /:/
}
}
}
}
};
(function(Prism2) {
var templateString = Prism2.languages.javascript["template-string"];
var templateLiteralPattern = templateString.pattern.source;
var interpolationObject = templateString.inside["interpolation"];
var interpolationPunctuationObject = interpolationObject.inside["interpolation-punctuation"];
var interpolationPattern = interpolationObject.pattern.source;
function createTemplate(language, tag) {
if (!Prism2.languages[language]) {
return void 0;
}
return {
pattern: RegExp("((?:" + tag + ")\\s*)" + templateLiteralPattern),
lookbehind: true,
greedy: true,
inside: {
"template-punctuation": {
pattern: /^`|`$/,
alias: "string"
},
"embedded-code": {
pattern: /[\s\S]+/,
alias: language
}
}
};
}
Prism2.languages.javascript["template-string"] = [
createTemplate("css", /\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),
createTemplate("html", /\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),
createTemplate("svg", /\bsvg/.source),
createTemplate("markdown", /\b(?:markdown|md)/.source),
createTemplate("graphql", /\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),
createTemplate("sql", /\bsql/.source),
templateString
].filter(Boolean);
function getPlaceholder(counter, language) {
return "___" + language.toUpperCase() + "_" + counter + "___";
}
function tokenizeWithHooks(code, grammar, language) {
var env = {
code,
grammar,
language
};
Prism2.hooks.run("before-tokenize", env);
env.tokens = Prism2.tokenize(env.code, env.grammar);
Prism2.hooks.run("after-tokenize", env);
return env.tokens;
}
function tokenizeInterpolationExpression(expression) {
var tempGrammar = {};
tempGrammar["interpolation-punctuation"] = interpolationPunctuationObject;
var tokens = Prism2.tokenize(expression, tempGrammar);
if (tokens.length === 3) {
var args = [1, 1];
args.push.apply(args, tokenizeWithHooks(tokens[1], Prism2.languages.javascript, "javascript"));
tokens.splice.apply(tokens, args);
}
return new Prism2.Token("interpolation", tokens, interpolationObject.alias, expression);
}
function tokenizeEmbedded(code, grammar, language) {
var _tokens = Prism2.tokenize(code, {
"interpolation": {
pattern: RegExp(interpolationPattern),
lookbehind: true
}
});
var placeholderCounter = 0;
var placeholderMap = {};
var embeddedCode = _tokens.map(function(token) {
if (typeof token === "string") {
return token;
} else {
var interpolationExpression = token.content;
var placeholder;
while (code.indexOf(placeholder = getPlaceholder(placeholderCounter++, language)) !== -1) {
}
placeholderMap[placeholder] = interpolationExpression;
return placeholder;
}
}).join("");
var embeddedTokens = tokenizeWithHooks(embeddedCode, grammar, language);
var placeholders = Object.keys(placeholderMap);
placeholderCounter = 0;
function walkTokens(tokens) {
for (var i = 0; i < tokens.length; i++) {
if (placeholderCounter >= placeholders.length) {
return;
}
var token = tokens[i];
if (typeof token === "string" || typeof token.content === "string") {
var placeholder = placeholders[placeholderCounter];
var s = typeof token === "string" ? token : token.content;
var index = s.indexOf(placeholder);
if (index !== -1) {
++placeholderCounter;
var before = s.substring(0, index);
var middle = tokenizeInterpolationExpression(placeholderMap[placeholder]);
var after = s.substring(index + placeholder.length);
var replacement = [];
if (before) {
replacement.push(before);
}
replacement.push(middle);
if (after) {
var afterTokens = [after];
walkTokens(afterTokens);
replacement.push.apply(replacement, afterTokens);
}
if (typeof token === "string") {
tokens.splice.apply(tokens, [i, 1].concat(replacement));
i += replacement.length - 1;
} else {
token.content = replacement;
}
}
} else {
var content = token.content;
if (Array.isArray(content)) {
walkTokens(content);
} else {
walkTokens([content]);
}
}
}
}
walkTokens(embeddedTokens);
return new Prism2.Token(language, embeddedTokens, "language-" + language, code);
}
var supportedLanguages = {
"javascript": true,
"js": true,
"typescript": true,
"ts": true,
"jsx": true,
"tsx": true
};
Prism2.hooks.add("after-tokenize", function(env) {
if (!(env.language in supportedLanguages)) {
return;
}
function findTemplateStrings(tokens) {
for (var i = 0, l = tokens.length; i < l; i++) {
var token = tokens[i];
if (typeof token === "string") {
continue;
}
var content = token.content;
if (!Array.isArray(content)) {
if (typeof content !== "string") {
findTemplateStrings([content]);
}
continue;
}
if (token.type === "template-string") {
var embedded = content[1];
if (content.length === 3 && typeof embedded !== "string" && embedded.type === "embedded-code") {
var code = stringContent(embedded);
var alias = embedded.alias;
var language = Array.isArray(alias) ? alias[0] : alias;
var grammar = Prism2.languages[language];
if (!grammar) {
continue;
}
content[1] = tokenizeEmbedded(code, grammar, language);
}
} else {
findTemplateStrings(content);
}
}
}
findTemplateStrings(env.tokens);
});
function stringContent(value) {
if (typeof value === "string") {
return value;
} else if (Array.isArray(value)) {
return value.map(stringContent).join("");
} else {
return stringContent(value.content);
}
}
})(Prism);
Prism.languages.julia = {
"comment": {
pattern: /(^|[^\\])(?:#=(?:[^#=]|=(?!#)|#(?!=)|#=(?:[^#=]|=(?!#)|#(?!=))*=#)*=#|#.*)/,
lookbehind: true
},
"regex": {
pattern: /r"(?:\\.|[^"\\\r\n])*"[imsx]{0,4}/,
greedy: true
},
"string": {
pattern: /"""[\s\S]+?"""|(?:\b\w+)?"(?:\\.|[^"\\\r\n])*"|`(?:[^\\`\r\n]|\\.)*`/,
greedy: true
},
"char": {
pattern: /(^|[^\w'])'(?:\\[^\r\n][^'\r\n]*|[^\\\r\n])'/,
lookbehind: true,
greedy: true
},
"keyword": /\b(?:abstract|baremodule|begin|bitstype|break|catch|ccall|const|continue|do|else|elseif|end|export|finally|for|function|global|if|immutable|import|importall|in|let|local|macro|module|print|println|quote|return|struct|try|type|typealias|using|while)\b/,
"boolean": /\b(?:false|true)\b/,
"number": /(?:\b(?=\d)|\B(?=\.))(?:0[box])?(?:[\da-f]+(?:_[\da-f]+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[efp][+-]?\d+(?:_\d+)*)?j?/i,
"operator": /&&|\|\||[-+*^%÷⊻&$\\]=?|\/[\/=]?|!=?=?|\|[=>]?|<(?:<=?|[=:|])?|>(?:=|>>?=?)?|==?=?|[~≠≤≥'√∛]/,
"punctuation": /::?|[{}[\]();,.?]/,
"constant": /\b(?:(?:Inf|NaN)(?:16|32|64)?|im|pi)\b|[πℯ]/
};
Prism.languages.keepalived = {
"comment": {
pattern: /[#!].*/,
greedy: true
},
"string": {
pattern: /(^|[^\\])(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/,
lookbehind: true,
greedy: true
},
"ip": {
pattern: RegExp(
/\b(?:(?:(?:[\da-f]{1,4}:){7}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}:[\da-f]{1,4}|(?:[\da-f]{1,4}:){5}:(?:[\da-f]{1,4}:)?[\da-f]{1,4}|(?:[\da-f]{1,4}:){4}:(?:[\da-f]{1,4}:){0,2}[\da-f]{1,4}|(?:[\da-f]{1,4}:){3}:(?:[\da-f]{1,4}:){0,3}[\da-f]{1,4}|(?:[\da-f]{1,4}:){2}:(?:[\da-f]{1,4}:){0,4}[\da-f]{1,4}|(?:[\da-f]{1,4}:){6}<ipv4>|(?:[\da-f]{1,4}:){0,5}:<ipv4>|::(?:[\da-f]{1,4}:){0,5}<ipv4>|[\da-f]{1,4}::(?:[\da-f]{1,4}:){0,5}[\da-f]{1,4}|::(?:[\da-f]{1,4}:){0,6}[\da-f]{1,4}|(?:[\da-f]{1,4}:){1,7}:)(?:\/\d{1,3})?|<ipv4>(?:\/\d{1,2})?)\b/.source.replace(/<ipv4>/g, function() {
return /(?:(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d))/.source;
}),
"i"
),
alias: "number"
},
"path": {
pattern: /(\s)\/(?:[^\/\s]+\/)*[^\/\s]*|\b[a-zA-Z]:\\(?:[^\\\s]+\\)*[^\\\s]*/,
lookbehind: true,
alias: "string"
},
"variable": /\$\{?\w+\}?/,
"email": {
pattern: /[\w-]+@[\w-]+(?:\.[\w-]{2,3}){1,2}/,
alias: "string"
},
"conditional-configuration": {
pattern: /@\^?[\w-]+/,
alias: "variable"
},
"operator": /=/,
"property": /\b(?:BFD_CHECK|DNS_CHECK|FILE_CHECK|HTTP_GET|MISC_CHECK|NAME|PING_CHECK|SCRIPTS|SMTP_CHECK|SSL|SSL_GET|TCP_CHECK|UDP_CHECK|accept|advert_int|alpha|auth_pass|auth_type|authentication|bfd_cpu_affinity|bfd_instance|bfd_no_swap|bfd_priority|bfd_process_name|bfd_rlimit_rttime|bfd_rt_priority|bind_if|bind_port|bindto|ca|certificate|check_unicast_src|checker|checker_cpu_affinity|checker_log_all_failures|checker_no_swap|checker_priority|checker_rlimit_rttime|checker_rt_priority|child_wait_time|connect_ip|connect_port|connect_timeout|dbus_service_name|debug|default_interface|delay|delay_before_retry|delay_loop|digest|dont_track_primary|dynamic|dynamic_interfaces|enable_(?:dbus|script_security|sni|snmp_checker|snmp_rfc|snmp_rfcv2|snmp_rfcv3|snmp_vrrp|traps)|end|fall|fast_recovery|file|flag-[123]|fork_delay|full_command|fwmark|garp_group|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|global_defs|global_tracking|gna_interval|group|ha_suspend|hashed|helo_name|higher_prio_send_advert|hoplimit|http_protocol|hysteresis|idle_tx|include|inhibit_on_failure|init_fail|init_file|instance|interface|interfaces|interval|ip_family|ipvs_process_name|keepalived.conf|kernel_rx_buf_size|key|linkbeat_interfaces|linkbeat_use_polling|log_all_failures|log_unknown_vrids|lower_prio_no_advert|lthreshold|lvs_flush|lvs_flush_onstop|lvs_method|lvs_netlink_cmd_rcv_bufs|lvs_netlink_cmd_rcv_bufs_force|lvs_netlink_monitor_rcv_bufs|lvs_netlink_monitor_rcv_bufs_force|lvs_notify_fifo|lvs_notify_fifo_script|lvs_sched|lvs_sync_daemon|max_auto_priority|max_hops|mcast_src_ip|mh-fallback|mh-port|min_auto_priority_delay|min_rx|min_tx|misc_dynamic|misc_path|misc_timeout|multiplier|name|namespace_with_ipsets|native_ipv6|neighbor_ip|net_namespace|net_namespace_ipvs|nftables|nftables_counters|nftables_ifindex|nftables_priority|no_accept|no_checker_emails|no_email_faults|nopreempt|notification_email|notification_email_from|notify|notify_backup|notify_deleted|notify_down|notify_fault|notify_fifo|notify_fifo_script|notify_master|notify_master_rx_lower_pri|notify_priority_changes|notify_stop|notify_up|old_unicast_checksum|omega|ops|param_match|passive|password|path|persistence_engine|persistence_granularity|persistence_timeout|preempt|preempt_delay|priority|process|process_monitor_rcv_bufs|process_monitor_rcv_bufs_force|process_name|process_names|promote_secondaries|protocol|proxy_arp|proxy_arp_pvlan|quorum|quorum_down|quorum_max|quorum_up|random_seed|real_server|regex|regex_max_offset|regex_min_offset|regex_no_match|regex_options|regex_stack|reload_repeat|reload_time_file|require_reply|retry|rise|router_id|rs_init_notifies|script|script_user|sh-fallback|sh-port|shutdown_script|shutdown_script_timeout|skip_check_adv_addr|smtp_alert|smtp_alert_checker|smtp_alert_vrrp|smtp_connect_timeout|smtp_helo_name|smtp_server|snmp_socket|sorry_server|sorry_server_inhibit|sorry_server_lvs_method|source_ip|start|startup_script|startup_script_timeout|state|static_ipaddress|static_routes|static_rules|status_code|step|strict_mode|sync_group_tracking_weight|terminate_delay|timeout|track_bfd|track_file|track_group|track_interface|track_process|track_script|track_src_ip|ttl|type|umask|unicast_peer|unicast_src_ip|unicast_ttl|url|use_ipvlan|use_pid_dir|use_vmac|user|uthreshold|val[123]|version|virtual_ipaddress|virtual_ipaddress_excluded|virtual_router_id|virtual_routes|virtual_rules|virtual_server|virtual_server_group|virtualhost|vmac_xmit_base|vrrp|vrrp_(?:check_unicast_src|cpu_affinity|garp_interval|garp_lower_prio_delay|garp_lower_prio_repeat|garp_master_delay|garp_master_refresh|garp_master_refresh_repeat|garp_master_repeat|gna_interval|higher_prio_send_advert|instance|ipsets|iptables|lower_prio_no_advert|mcast_group4|mcast_group6|min_garp|netlink_cmd_rcv_bufs|netlink_cmd_rcv_bufs_force|netlink_monitor_rcv_bufs|netlink_monitor_rcv_bufs_force|no_swap|notify_fifo|notify_fifo_script|notify_priority_changes|priority|process_name|rlimit_rttime|rt_priority|rx_bufs_multiplier|rx_bufs_policy|script|skip_check_adv_addr|startup_delay|strict|sync_group|track_process|version)|warmup|weight)\b/,
"constant": /\b(?:A|AAAA|AH|BACKUP|CNAME|DR|MASTER|MX|NAT|NS|PASS|SCTP|SOA|TCP|TUN|TXT|UDP|dh|fo|lblc|lblcr|lc|mh|nq|ovf|rr|sed|sh|wlc|wrr)\b/,
"number": {
pattern: /(^|[^\w.-])-?\d+(?:\.\d+)?/,
lookbehind: true
},
"boolean": /\b(?:false|no|off|on|true|yes)\b/,
"punctuation": /[\{\}]/
};
Prism.languages.keyman = {
"comment": {
pattern: /\bc .*/i,
greedy: true
},
"string": {
pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
greedy: true
},
"virtual-key": {
pattern: /\[\s*(?:(?:ALT|CAPS|CTRL|LALT|LCTRL|NCAPS|RALT|RCTRL|SHIFT)\s+)*(?:[TKU]_[\w?]+|[A-E]\d\d?|"[^"\r\n]*"|'[^'\r\n]*')\s*\]/i,
greedy: true,
alias: "function"
},
"header-keyword": {
pattern: /&\w+/,
alias: "bold"
},
"header-statement": {
pattern: /\b(?:bitmap|bitmaps|caps always off|caps on only|copyright|hotkey|language|layout|message|name|shift frees caps|version)\b/i,
alias: "bold"
},
"rule-keyword": {
pattern: /\b(?:any|baselayout|beep|call|context|deadkey|dk|if|index|layer|notany|nul|outs|platform|reset|return|save|set|store|use)\b/i,
alias: "keyword"
},
"structural-keyword": {
pattern: /\b(?:ansi|begin|group|match|newcontext|nomatch|postkeystroke|readonly|unicode|using keys)\b/i,
alias: "keyword"
},
"compile-target": {
pattern: /\$(?:keyman|keymanonly|keymanweb|kmfl|weaver):/i,
alias: "property"
},
"number": /\b(?:U\+[\dA-F]+|d\d+|x[\da-f]+|\d+)\b/i,
"operator": /[+>\\$]|\.\./,
"punctuation": /[()=,]/
};
(function(Prism2) {
Prism2.languages.kotlin = Prism2.languages.extend("clike", {
"keyword": {
pattern: /(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,
lookbehind: true
},
"function": [
{
pattern: /(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,
greedy: true
},
{
pattern: /(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,
lookbehind: true,
greedy: true
}
],
"number": /\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,
"operator": /\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/
});
delete Prism2.languages.kotlin["class-name"];
var interpolationInside = {
"interpolation-punctuation": {
pattern: /^\$\{?|\}$/,
alias: "punctuation"
},
"expression": {
pattern: /[\s\S]+/,
inside: Prism2.languages.kotlin
}
};
Prism2.languages.insertBefore("kotlin", "string", {
"string-literal": [
{
pattern: /"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,
alias: "multiline",
inside: {
"interpolation": {
pattern: /\$(?:[a-z_]\w*|\{[^{}]*\})/i,
inside: interpolationInside
},
"string": /[\s\S]+/
}
},
{
pattern: /"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,
alias: "singleline",
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,
lookbehind: true,
inside: interpolationInside
},
"string": /[\s\S]+/
}
}
],
"char": {
pattern: /'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,
greedy: true
}
});
delete Prism2.languages.kotlin["string"];
Prism2.languages.insertBefore("kotlin", "keyword", {
"annotation": {
pattern: /\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,
alias: "builtin"
}
});
Prism2.languages.insertBefore("kotlin", "function", {
"label": {
pattern: /\b\w+@|@\w+\b/,
alias: "symbol"
}
});
Prism2.languages.kt = Prism2.languages.kotlin;
Prism2.languages.kts = Prism2.languages.kotlin;
})(Prism);
(function(Prism2) {
var nonId = /\s\x00-\x1f\x22-\x2f\x3a-\x3f\x5b-\x5e\x60\x7b-\x7e/.source;
function wrapId(pattern, flags) {
return RegExp(pattern.replace(/<nonId>/g, nonId), flags);
}
Prism2.languages.kumir = {
"comment": {
pattern: /\|.*/
},
"prolog": {
pattern: /#.*/,
greedy: true
},
"string": {
pattern: /"[^\n\r"]*"|'[^\n\r']*'/,
greedy: true
},
"boolean": {
pattern: wrapId(/(^|[<nonId>])(?:да|нет)(?=[<nonId>]|$)/.source),
lookbehind: true
},
"operator-word": {
pattern: wrapId(/(^|[<nonId>])(?:и|или|не)(?=[<nonId>]|$)/.source),
lookbehind: true,
alias: "keyword"
},
"system-variable": {
pattern: wrapId(/(^|[<nonId>])знач(?=[<nonId>]|$)/.source),
lookbehind: true,
alias: "keyword"
},
"type": [
{
pattern: wrapId(/(^|[<nonId>])(?:вещ|лит|лог|сим|цел)(?:\x20*таб)?(?=[<nonId>]|$)/.source),
lookbehind: true,
alias: "builtin"
},
{
pattern: wrapId(/(^|[<nonId>])(?:компл|сканкод|файл|цвет)(?=[<nonId>]|$)/.source),
lookbehind: true,
alias: "important"
}
],
"keyword": {
pattern: wrapId(/(^|[<nonId>])(?:алг|арг(?:\x20*рез)?|ввод|ВКЛЮЧИТЬ|вс[её]|выбор|вывод|выход|дано|для|до|дс|если|иначе|исп|использовать|кон(?:(?:\x20+|_)исп)?|кц(?:(?:\x20+|_)при)?|надо|нач|нс|нц|от|пауза|пока|при|раза?|рез|стоп|таб|то|утв|шаг)(?=[<nonId>]|$)/.source),
lookbehind: true
},
"name": {
pattern: wrapId(/(^|[<nonId>])[^\d<nonId>][^<nonId>]*(?:\x20+[^<nonId>]+)*(?=[<nonId>]|$)/.source),
lookbehind: true
},
"number": {
pattern: wrapId(/(^|[<nonId>])(?:\B\$[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?=[<nonId>]|$)/.source, "i"),
lookbehind: true
},
"punctuation": /:=|[(),:;\[\]]/,
"operator-char": {
pattern: /\*\*?|<[=>]?|>=?|[-+/=]/,
alias: "operator"
}
};
Prism2.languages.kum = Prism2.languages.kumir;
})(Prism);
Prism.languages.kusto = {
"comment": {
pattern: /\/\/.*/,
greedy: true
},
"string": {
pattern: /```[\s\S]*?```|[hH]?(?:"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\.)*'|@(?:"[^\r\n"]*"|'[^\r\n']*'))/,
greedy: true
},
"verb": {
pattern: /(\|\s*)[a-z][\w-]*/i,
lookbehind: true,
alias: "keyword"
},
"command": {
pattern: /\.[a-z][a-z\d-]*\b/,
alias: "keyword"
},
"class-name": /\b(?:bool|datetime|decimal|dynamic|guid|int|long|real|string|timespan)\b/,
"keyword": /\b(?:access|alias|and|anti|as|asc|auto|between|by|(?:contains|(?:ends|starts)with|has(?:perfix|suffix)?)(?:_cs)?|database|declare|desc|external|from|fullouter|has_all|in|ingestion|inline|inner|innerunique|into|(?:left|right)(?:anti(?:semi)?|inner|outer|semi)?|let|like|local|not|of|on|or|pattern|print|query_parameters|range|restrict|schema|set|step|table|tables|to|view|where|with|matches\s+regex|nulls\s+(?:first|last))(?![\w-])/,
"boolean": /\b(?:false|null|true)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/,
"datetime": [
{
pattern: /\b(?:(?:Fri|Friday|Mon|Monday|Sat|Saturday|Sun|Sunday|Thu|Thursday|Tue|Tuesday|Wed|Wednesday)\s*,\s*)?\d{1,2}(?:\s+|-)(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)(?:\s+|-)\d{2}\s+\d{2}:\d{2}(?::\d{2})?(?:\s*(?:\b(?:[A-Z]|(?:[ECMT][DS]|GM|U)T)|[+-]\d{4}))?\b/,
alias: "number"
},
{
pattern: /[+-]?\b(?:\d{4}-\d{2}-\d{2}(?:[ T]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)?|\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)Z?/,
alias: "number"
}
],
"number": /\b(?:0x[0-9A-Fa-f]+|\d+(?:\.\d+)?(?:[Ee][+-]?\d+)?)(?:(?:min|sec|[mnµ]s|[dhms]|microsecond|tick)\b)?|[+-]?\binf\b/,
"operator": /=>|[!=]~|[!=<>]=?|[-+*/%|]|\.\./,
"punctuation": /[()\[\]{},;.:]/
};
(function(Prism2) {
var funcPattern = /\\(?:[^a-z()[\]]|[a-z*]+)/i;
var insideEqu = {
"equation-command": {
pattern: funcPattern,
alias: "regex"
}
};
Prism2.languages.latex = {
"comment": /%.*/,
"cdata": {
pattern: /(\\begin\{((?:lstlisting|verbatim)\*?)\})[\s\S]*?(?=\\end\{\2\})/,
lookbehind: true
},
"equation": [
{
pattern: /\$\$(?:\\[\s\S]|[^\\$])+\$\$|\$(?:\\[\s\S]|[^\\$])+\$|\\\([\s\S]*?\\\)|\\\[[\s\S]*?\\\]/,
inside: insideEqu,
alias: "string"
},
{
pattern: /(\\begin\{((?:align|eqnarray|equation|gather|math|multline)\*?)\})[\s\S]*?(?=\\end\{\2\})/,
lookbehind: true,
inside: insideEqu,
alias: "string"
}
],
"keyword": {
pattern: /(\\(?:begin|cite|documentclass|end|label|ref|usepackage)(?:\[[^\]]+\])?\{)[^}]+(?=\})/,
lookbehind: true
},
"url": {
pattern: /(\\url\{)[^}]+(?=\})/,
lookbehind: true
},
"headline": {
pattern: /(\\(?:chapter|frametitle|paragraph|part|section|subparagraph|subsection|subsubparagraph|subsubsection|subsubsubparagraph)\*?(?:\[[^\]]+\])?\{)[^}]+(?=\})/,
lookbehind: true,
alias: "class-name"
},
"function": {
pattern: funcPattern,
alias: "selector"
},
"punctuation": /[[\]{}&]/
};
Prism2.languages.tex = Prism2.languages.latex;
Prism2.languages.context = Prism2.languages.latex;
})(Prism);
(function(Prism2) {
Prism2.languages.latte = {
"comment": /^\{\*[\s\S]*/,
"latte-tag": {
pattern: /(^\{(?:\/(?=[a-z]))?)(?:[=_]|[a-z]\w*\b(?!\())/i,
lookbehind: true,
alias: "important"
},
"delimiter": {
pattern: /^\{\/?|\}$/,
alias: "punctuation"
},
"php": {
pattern: /\S(?:[\s\S]*\S)?/,
alias: "language-php",
inside: Prism2.languages.php
}
};
var markupLatte = Prism2.languages.extend("markup", {});
Prism2.languages.insertBefore("inside", "attr-value", {
"n-attr": {
pattern: /n:[\w-]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+))?/,
inside: {
"attr-name": {
pattern: /^[^\s=]+/,
alias: "important"
},
"attr-value": {
pattern: /=[\s\S]+/,
inside: {
"punctuation": [
/^=/,
{
pattern: /^(\s*)["']|["']$/,
lookbehind: true
}
],
"php": {
pattern: /\S(?:[\s\S]*\S)?/,
inside: Prism2.languages.php
}
}
}
}
}
}, markupLatte.tag);
Prism2.hooks.add("before-tokenize", function(env) {
if (env.language !== "latte") {
return;
}
var lattePattern = /\{\*[\s\S]*?\*\}|\{[^'"\s{}*](?:[^"'/{}]|\/(?![*/])|("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|\/\*(?:[^*]|\*(?!\/))*\*\/)*\}/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "latte", lattePattern);
env.grammar = markupLatte;
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "latte");
});
})(Prism);
Prism.languages.less = Prism.languages.extend("css", {
"comment": [
/\/\*[\s\S]*?\*\//,
{
pattern: /(^|[^\\])\/\/.*/,
lookbehind: true
}
],
"atrule": {
pattern: /@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,
inside: {
"punctuation": /[:()]/
}
},
"selector": {
pattern: /(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,
inside: {
"variable": /@+[\w-]+/
}
},
"property": /(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,
"operator": /[+\-*\/]/
});
Prism.languages.insertBefore("less", "property", {
"variable": [
{
pattern: /@[\w-]+\s*:/,
inside: {
"punctuation": /:/
}
},
/@@?[\w-]+/
],
"mixin-usage": {
pattern: /([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,
lookbehind: true,
alias: "function"
}
});
(function(Prism2) {
Prism2.languages.scheme = {
"comment": /;.*|#;\s*(?:\((?:[^()]|\([^()]*\))*\)|\[(?:[^\[\]]|\[[^\[\]]*\])*\])|#\|(?:[^#|]|#(?!\|)|\|(?!#)|#\|(?:[^#|]|#(?!\|)|\|(?!#))*\|#)*\|#/,
"string": {
pattern: /"(?:[^"\\]|\\.)*"/,
greedy: true
},
"symbol": {
pattern: /'[^()\[\]#'\s]+/,
greedy: true
},
"char": {
pattern: /#\\(?:[ux][a-fA-F\d]+\b|[-a-zA-Z]+\b|[\uD800-\uDBFF][\uDC00-\uDFFF]|\S)/,
greedy: true
},
"lambda-parameter": [
{
pattern: /((?:^|[^'`#])[(\[]lambda\s+)(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)/,
lookbehind: true
},
{
pattern: /((?:^|[^'`#])[(\[]lambda\s+[(\[])[^()\[\]']+/,
lookbehind: true
}
],
"keyword": {
pattern: /((?:^|[^'`#])[(\[])(?:begin|case(?:-lambda)?|cond(?:-expand)?|define(?:-library|-macro|-record-type|-syntax|-values)?|defmacro|delay(?:-force)?|do|else|except|export|guard|if|import|include(?:-ci|-library-declarations)?|lambda|let(?:rec)?(?:-syntax|-values|\*)?|let\*-values|only|parameterize|prefix|(?:quasi-?)?quote|rename|set!|syntax-(?:case|rules)|unless|unquote(?:-splicing)?|when)(?=[()\[\]\s]|$)/,
lookbehind: true
},
"builtin": {
pattern: /((?:^|[^'`#])[(\[])(?:abs|and|append|apply|assoc|ass[qv]|binary-port\?|boolean=?\?|bytevector(?:-append|-copy|-copy!|-length|-u8-ref|-u8-set!|\?)?|caar|cadr|call-with-(?:current-continuation|port|values)|call\/cc|car|cdar|cddr|cdr|ceiling|char(?:->integer|-ready\?|\?|<\?|<=\?|=\?|>\?|>=\?)|close-(?:input-port|output-port|port)|complex\?|cons|current-(?:error|input|output)-port|denominator|dynamic-wind|eof-object\??|eq\?|equal\?|eqv\?|error|error-object(?:-irritants|-message|\?)|eval|even\?|exact(?:-integer-sqrt|-integer\?|\?)?|expt|features|file-error\?|floor(?:-quotient|-remainder|\/)?|flush-output-port|for-each|gcd|get-output-(?:bytevector|string)|inexact\??|input-port(?:-open\?|\?)|integer(?:->char|\?)|lcm|length|list(?:->string|->vector|-copy|-ref|-set!|-tail|\?)?|make-(?:bytevector|list|parameter|string|vector)|map|max|member|memq|memv|min|modulo|negative\?|newline|not|null\?|number(?:->string|\?)|numerator|odd\?|open-(?:input|output)-(?:bytevector|string)|or|output-port(?:-open\?|\?)|pair\?|peek-char|peek-u8|port\?|positive\?|procedure\?|quotient|raise|raise-continuable|rational\?|rationalize|read-(?:bytevector|bytevector!|char|error\?|line|string|u8)|real\?|remainder|reverse|round|set-c[ad]r!|square|string(?:->list|->number|->symbol|->utf8|->vector|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?|<\?|<=\?|=\?|>\?|>=\?)?|substring|symbol(?:->string|\?|=\?)|syntax-error|textual-port\?|truncate(?:-quotient|-remainder|\/)?|u8-ready\?|utf8->string|values|vector(?:->list|->string|-append|-copy|-copy!|-fill!|-for-each|-length|-map|-ref|-set!|\?)?|with-exception-handler|write-(?:bytevector|char|string|u8)|zero\?)(?=[()\[\]\s]|$)/,
lookbehind: true
},
"operator": {
pattern: /((?:^|[^'`#])[(\[])(?:[-+*%/]|[<>]=?|=>?)(?=[()\[\]\s]|$)/,
lookbehind: true
},
"number": {
pattern: RegExp(SortedBNF({
"<ureal dec>": /\d+(?:\/\d+)|(?:\d+(?:\.\d*)?|\.\d+)(?:[esfdl][+-]?\d+)?/.source,
"<real dec>": /[+-]?<ureal dec>|[+-](?:inf|nan)\.0/.source,
"<imaginary dec>": /[+-](?:<ureal dec>|(?:inf|nan)\.0)?i/.source,
"<complex dec>": /<real dec>(?:@<real dec>|<imaginary dec>)?|<imaginary dec>/.source,
"<num dec>": /(?:#d(?:#[ei])?|#[ei](?:#d)?)?<complex dec>/.source,
"<ureal box>": /[0-9a-f]+(?:\/[0-9a-f]+)?/.source,
"<real box>": /[+-]?<ureal box>|[+-](?:inf|nan)\.0/.source,
"<imaginary box>": /[+-](?:<ureal box>|(?:inf|nan)\.0)?i/.source,
"<complex box>": /<real box>(?:@<real box>|<imaginary box>)?|<imaginary box>/.source,
"<num box>": /#[box](?:#[ei])?|(?:#[ei])?#[box]<complex box>/.source,
"<number>": /(^|[()\[\]\s])(?:<num dec>|<num box>)(?=[()\[\]\s]|$)/.source
}), "i"),
lookbehind: true
},
"boolean": {
pattern: /(^|[()\[\]\s])#(?:[ft]|false|true)(?=[()\[\]\s]|$)/,
lookbehind: true
},
"function": {
pattern: /((?:^|[^'`#])[(\[])(?:[^|()\[\]'\s]+|\|(?:[^\\|]|\\.)*\|)(?=[()\[\]\s]|$)/,
lookbehind: true
},
"identifier": {
pattern: /(^|[()\[\]\s])\|(?:[^\\|]|\\.)*\|(?=[()\[\]\s]|$)/,
lookbehind: true,
greedy: true
},
"punctuation": /[()\[\]']/
};
function SortedBNF(grammar) {
for (var key in grammar) {
grammar[key] = grammar[key].replace(/<[\w\s]+>/g, function(key2) {
return "(?:" + grammar[key2].trim() + ")";
});
}
return grammar[key];
}
})(Prism);
(function(Prism2) {
var schemeExpression = /\((?:[^();"#\\]|\\[\s\S]|;.*(?!.)|"(?:[^"\\]|\\.)*"|#(?:\{(?:(?!#\})[\s\S])*#\}|[^{])|<expr>)*\)/.source;
var recursivenessLog2 = 5;
for (var i = 0; i < recursivenessLog2; i++) {
schemeExpression = schemeExpression.replace(/<expr>/g, function() {
return schemeExpression;
});
}
schemeExpression = schemeExpression.replace(/<expr>/g, /[^\s\S]/.source);
var lilypond = Prism2.languages.lilypond = {
"comment": /%(?:(?!\{).*|\{[\s\S]*?%\})/,
"embedded-scheme": {
pattern: RegExp(/(^|[=\s])#(?:"(?:[^"\\]|\\.)*"|[^\s()"]*(?:[^\s()]|<expr>))/.source.replace(/<expr>/g, function() {
return schemeExpression;
}), "m"),
lookbehind: true,
greedy: true,
inside: {
"scheme": {
pattern: /^(#)[\s\S]+$/,
lookbehind: true,
alias: "language-scheme",
inside: {
"embedded-lilypond": {
pattern: /#\{[\s\S]*?#\}/,
greedy: true,
inside: {
"punctuation": /^#\{|#\}$/,
"lilypond": {
pattern: /[\s\S]+/,
alias: "language-lilypond",
inside: null
}
}
},
rest: Prism2.languages.scheme
}
},
"punctuation": /#/
}
},
"string": {
pattern: /"(?:[^"\\]|\\.)*"/,
greedy: true
},
"class-name": {
pattern: /(\\new\s+)[\w-]+/,
lookbehind: true
},
"keyword": {
pattern: /\\[a-z][-\w]*/i,
inside: {
"punctuation": /^\\/
}
},
"operator": /[=|]|<<|>>/,
"punctuation": {
pattern: /(^|[a-z\d])(?:'+|,+|[_^]?-[_^]?(?:[-+^!>._]|(?=\d))|[_^]\.?|[.!])|[{}()[\]<>^~]|\\[()[\]<>\\!]|--|__/,
lookbehind: true
},
"number": /\b\d+(?:\/\d+)?\b/
};
lilypond["embedded-scheme"].inside["scheme"].inside["embedded-lilypond"].inside["lilypond"].inside = lilypond;
Prism2.languages.ly = lilypond;
})(Prism);
Prism.languages.liquid = {
"comment": {
pattern: /(^\{%\s*comment\s*%\})[\s\S]+(?=\{%\s*endcomment\s*%\}$)/,
lookbehind: true
},
"delimiter": {
pattern: /^\{(?:\{\{|[%\{])-?|-?(?:\}\}|[%\}])\}$/,
alias: "punctuation"
},
"string": {
pattern: /"[^"]*"|'[^']*'/,
greedy: true
},
"keyword": /\b(?:as|assign|break|(?:end)?(?:capture|case|comment|for|form|if|paginate|raw|style|tablerow|unless)|continue|cycle|decrement|echo|else|elsif|in|include|increment|limit|liquid|offset|range|render|reversed|section|when|with)\b/,
"object": /\b(?:address|all_country_option_tags|article|block|blog|cart|checkout|collection|color|country|country_option_tags|currency|current_page|current_tags|customer|customer_address|date|discount_allocation|discount_application|external_video|filter|filter_value|font|forloop|fulfillment|generic_file|gift_card|group|handle|image|line_item|link|linklist|localization|location|measurement|media|metafield|model|model_source|order|page|page_description|page_image|page_title|part|policy|product|product_option|recommendations|request|robots|routes|rule|script|search|selling_plan|selling_plan_allocation|selling_plan_group|shipping_method|shop|shop_locale|sitemap|store_availability|tax_line|template|theme|transaction|unit_price_measurement|user_agent|variant|video|video_source)\b/,
"function": [
{
pattern: /(\|\s*)\w+/,
lookbehind: true,
alias: "filter"
},
{
pattern: /(\.\s*)(?:first|last|size)/,
lookbehind: true
}
],
"boolean": /\b(?:false|nil|true)\b/,
"range": {
pattern: /\.\./,
alias: "operator"
},
"number": /\b\d+(?:\.\d+)?\b/,
"operator": /[!=]=|<>|[<>]=?|[|?:=-]|\b(?:and|contains(?=\s)|or)\b/,
"punctuation": /[.,\[\]()]/,
"empty": {
pattern: /\bempty\b/,
alias: "keyword"
}
};
Prism.hooks.add("before-tokenize", function(env) {
var liquidPattern = /\{%\s*comment\s*%\}[\s\S]*?\{%\s*endcomment\s*%\}|\{(?:%[\s\S]*?%|\{\{[\s\S]*?\}\}|\{[\s\S]*?\})\}/g;
var insideRaw = false;
Prism.languages["markup-templating"].buildPlaceholders(env, "liquid", liquidPattern, function(match) {
var tagMatch = /^\{%-?\s*(\w+)/.exec(match);
if (tagMatch) {
var tag = tagMatch[1];
if (tag === "raw" && !insideRaw) {
insideRaw = true;
return true;
} else if (tag === "endraw") {
insideRaw = false;
return true;
}
}
return !insideRaw;
});
});
Prism.hooks.add("after-tokenize", function(env) {
Prism.languages["markup-templating"].tokenizePlaceholders(env, "liquid");
});
(function(Prism2) {
function simple_form(name) {
return RegExp(/(\()/.source + "(?:" + name + ")" + /(?=[\s\)])/.source);
}
function primitive(pattern) {
return RegExp(/([\s([])/.source + "(?:" + pattern + ")" + /(?=[\s)])/.source);
}
var symbol = /(?!\d)[-+*/~!@$%^=<>{}\w]+/.source;
var marker = "&" + symbol;
var par = "(\\()";
var endpar = "(?=\\))";
var space = "(?=\\s)";
var nestedPar = /(?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\))*\))*\))*/.source;
var language = {
heading: {
pattern: /;;;.*/,
alias: ["comment", "title"]
},
comment: /;.*/,
string: {
pattern: /"(?:[^"\\]|\\.)*"/,
greedy: true,
inside: {
argument: /[-A-Z]+(?=[.,\s])/,
symbol: RegExp("`" + symbol + "'")
}
},
"quoted-symbol": {
pattern: RegExp("#?'" + symbol),
alias: ["variable", "symbol"]
},
"lisp-property": {
pattern: RegExp(":" + symbol),
alias: "property"
},
splice: {
pattern: RegExp(",@?" + symbol),
alias: ["symbol", "variable"]
},
keyword: [
{
pattern: RegExp(
par + "(?:and|(?:cl-)?letf|cl-loop|cond|cons|error|if|(?:lexical-)?let\\*?|message|not|null|or|provide|require|setq|unless|use-package|when|while)" + space
),
lookbehind: true
},
{
pattern: RegExp(
par + "(?:append|by|collect|concat|do|finally|for|in|return)" + space
),
lookbehind: true
}
],
declare: {
pattern: simple_form(/declare/.source),
lookbehind: true,
alias: "keyword"
},
interactive: {
pattern: simple_form(/interactive/.source),
lookbehind: true,
alias: "keyword"
},
boolean: {
pattern: primitive(/nil|t/.source),
lookbehind: true
},
number: {
pattern: primitive(/[-+]?\d+(?:\.\d*)?/.source),
lookbehind: true
},
defvar: {
pattern: RegExp(par + "def(?:const|custom|group|var)\\s+" + symbol),
lookbehind: true,
inside: {
keyword: /^def[a-z]+/,
variable: RegExp(symbol)
}
},
defun: {
pattern: RegExp(par + /(?:cl-)?(?:defmacro|defun\*?)\s+/.source + symbol + /\s+\(/.source + nestedPar + /\)/.source),
lookbehind: true,
greedy: true,
inside: {
keyword: /^(?:cl-)?def\S+/,
arguments: null,
function: {
pattern: RegExp("(^\\s)" + symbol),
lookbehind: true
},
punctuation: /[()]/
}
},
lambda: {
pattern: RegExp(par + "lambda\\s+\\(\\s*(?:&?" + symbol + "(?:\\s+&?" + symbol + ")*\\s*)?\\)"),
lookbehind: true,
greedy: true,
inside: {
keyword: /^lambda/,
arguments: null,
punctuation: /[()]/
}
},
car: {
pattern: RegExp(par + symbol),
lookbehind: true
},
punctuation: [
/(?:['`,]?\(|[)\[\]])/,
{
pattern: /(\s)\.(?=\s)/,
lookbehind: true
}
]
};
var arg = {
"lisp-marker": RegExp(marker),
"varform": {
pattern: RegExp(/\(/.source + symbol + /\s+(?=\S)/.source + nestedPar + /\)/.source),
inside: language
},
"argument": {
pattern: RegExp(/(^|[\s(])/.source + symbol),
lookbehind: true,
alias: "variable"
},
rest: language
};
var forms = "\\S+(?:\\s+\\S+)*";
var arglist = {
pattern: RegExp(par + nestedPar + endpar),
lookbehind: true,
inside: {
"rest-vars": {
pattern: RegExp("&(?:body|rest)\\s+" + forms),
inside: arg
},
"other-marker-vars": {
pattern: RegExp("&(?:aux|optional)\\s+" + forms),
inside: arg
},
keys: {
pattern: RegExp("&key\\s+" + forms + "(?:\\s+&allow-other-keys)?"),
inside: arg
},
argument: {
pattern: RegExp(symbol),
alias: "variable"
},
punctuation: /[()]/
}
};
language["lambda"].inside.arguments = arglist;
language["defun"].inside.arguments = Prism2.util.clone(arglist);
language["defun"].inside.arguments.inside.sublist = arglist;
Prism2.languages.lisp = language;
Prism2.languages.elisp = language;
Prism2.languages.emacs = language;
Prism2.languages["emacs-lisp"] = language;
})(Prism);
Prism.languages.livescript = {
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
lookbehind: true
},
{
pattern: /(^|[^\\])#.*/,
lookbehind: true
}
],
"interpolated-string": {
pattern: /(^|[^"])("""|")(?:\\[\s\S]|(?!\2)[^\\])*\2(?!")/,
lookbehind: true,
greedy: true,
inside: {
"variable": {
pattern: /(^|[^\\])#[a-z_](?:-?[a-z]|[\d_])*/m,
lookbehind: true
},
"interpolation": {
pattern: /(^|[^\\])#\{[^}]+\}/m,
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^#\{|\}$/,
alias: "variable"
}
}
},
"string": /[\s\S]+/
}
},
"string": [
{
pattern: /('''|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,
greedy: true
},
{
pattern: /<\[[\s\S]*?\]>/,
greedy: true
},
/\\[^\s,;\])}]+/
],
"regex": [
{
pattern: /\/\/(?:\[[^\r\n\]]*\]|\\.|(?!\/\/)[^\\\[])+\/\/[gimyu]{0,5}/,
greedy: true,
inside: {
"comment": {
pattern: /(^|[^\\])#.*/,
lookbehind: true
}
}
},
{
pattern: /\/(?:\[[^\r\n\]]*\]|\\.|[^/\\\r\n\[])+\/[gimyu]{0,5}/,
greedy: true
}
],
"keyword": {
pattern: /(^|(?!-).)\b(?:break|case|catch|class|const|continue|default|do|else|extends|fallthrough|finally|for(?: ever)?|function|if|implements|it|let|loop|new|null|otherwise|own|return|super|switch|that|then|this|throw|try|unless|until|var|void|when|while|yield)(?!-)\b/m,
lookbehind: true
},
"keyword-operator": {
pattern: /(^|[^-])\b(?:(?:delete|require|typeof)!|(?:and|by|delete|export|from|import(?: all)?|in|instanceof|is(?: not|nt)?|not|of|or|til|to|typeof|with|xor)(?!-)\b)/m,
lookbehind: true,
alias: "operator"
},
"boolean": {
pattern: /(^|[^-])\b(?:false|no|off|on|true|yes)(?!-)\b/m,
lookbehind: true
},
"argument": {
pattern: /(^|(?!\.&\.)[^&])&(?!&)\d*/m,
lookbehind: true,
alias: "variable"
},
"number": /\b(?:\d+~[\da-z]+|\d[\d_]*(?:\.\d[\d_]*)?(?:[a-z]\w*)?)/i,
"identifier": /[a-z_](?:-?[a-z]|[\d_])*/i,
"operator": [
{
pattern: /( )\.(?= )/,
lookbehind: true
},
/\.(?:[=~]|\.\.?)|\.(?:[&|^]|<<|>>>?)\.|:(?:=|:=?)|&&|\|[|>]|<(?:<<?<?|--?!?|~~?!?|[|=?])?|>[>=?]?|-(?:->?|>)?|\+\+?|@@?|%%?|\*\*?|!(?:~?=|--?>|~?~>)?|~(?:~?>|=)?|==?|\^\^?|[\/?]/
],
"punctuation": /[(){}\[\]|.,:;`]/
};
Prism.languages.livescript["interpolated-string"].inside["interpolation"].inside.rest = Prism.languages.livescript;
(function(Prism2) {
Prism2.languages.llvm = {
"comment": /;.*/,
"string": {
pattern: /"[^"]*"/,
greedy: true
},
"boolean": /\b(?:false|true)\b/,
"variable": /[%@!#](?:(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+|\d+)/i,
"label": /(?!\d)(?:[-$.\w]|\\[a-f\d]{2})+:/i,
"type": {
pattern: /\b(?:double|float|fp128|half|i[1-9]\d*|label|metadata|ppc_fp128|token|void|x86_fp80|x86_mmx)\b/,
alias: "class-name"
},
"keyword": /\b[a-z_][a-z_0-9]*\b/,
"number": /[+-]?\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-Fa-f]+\b|\b0xK[\dA-Fa-f]{20}\b|\b0x[ML][\dA-Fa-f]{32}\b|\b0xH[\dA-Fa-f]{4}\b/,
"punctuation": /[{}[\];(),.!*=<>]/
};
})(Prism);
Prism.languages.log = {
"string": {
pattern: /"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,
greedy: true
},
"exception": {
pattern: /(^|[^\w.])[a-z][\w.]*(?:Error|Exception):.*(?:(?:\r\n?|\n)[ \t]*(?:at[ \t].+|\.{3}.*|Caused by:.*))+(?:(?:\r\n?|\n)[ \t]*\.\.\. .*)?/,
lookbehind: true,
greedy: true,
alias: ["javastacktrace", "language-javastacktrace"],
inside: Prism.languages["javastacktrace"] || {
"keyword": /\bat\b/,
"function": /[a-z_][\w$]*(?=\()/,
"punctuation": /[.:()]/
}
},
"level": [
{
pattern: /\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,
alias: ["error", "important"]
},
{
pattern: /\b(?:WARN|WARNING|WRN)\b/,
alias: ["warning", "important"]
},
{
pattern: /\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,
alias: ["info", "keyword"]
},
{
pattern: /\b(?:DBG|DEBUG|FINE)\b/,
alias: ["debug", "keyword"]
},
{
pattern: /\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,
alias: ["trace", "comment"]
}
],
"property": {
pattern: /((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,
lookbehind: true
},
"separator": {
pattern: /(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,
lookbehind: true,
alias: "comment"
},
"url": /\b(?:file|ftp|https?):\/\/[^\s|,;'"]*[^\s|,;'">.]/,
"email": {
pattern: /(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,
lookbehind: true,
alias: "url"
},
"ip-address": {
pattern: /\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,
alias: "constant"
},
"mac-address": {
pattern: /\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,
alias: "constant"
},
"domain": {
pattern: /(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,
lookbehind: true,
alias: "constant"
},
"uuid": {
pattern: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,
alias: "constant"
},
"hash": {
pattern: /\b(?:[a-f0-9]{32}){1,2}\b/i,
alias: "constant"
},
"file-path": {
pattern: /\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,
lookbehind: true,
greedy: true,
alias: "string"
},
"date": {
pattern: RegExp(
/\b\d{4}[-/]\d{2}[-/]\d{2}(?:T(?=\d{1,2}:)|(?=\s\d{1,2}:))/.source + "|" + /\b\d{1,4}[-/ ](?:\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\d{2,4}T?\b/.source + "|" + /\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\s{1,2}\d{1,2}\b/.source,
"i"
),
alias: "number"
},
"time": {
pattern: /\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,
alias: "number"
},
"boolean": /\b(?:false|null|true)\b/i,
"number": {
pattern: /(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,
lookbehind: true
},
"operator": /[;:?<=>~/@!$%&+\-|^(){}*#]/,
"punctuation": /[\[\].,]/
};
Prism.languages.lolcode = {
"comment": [
/\bOBTW\s[\s\S]*?\sTLDR\b/,
/\bBTW.+/
],
"string": {
pattern: /"(?::.|[^":])*"/,
inside: {
"variable": /:\{[^}]+\}/,
"symbol": [
/:\([a-f\d]+\)/i,
/:\[[^\]]+\]/,
/:[)>o":]/
]
},
greedy: true
},
"number": /(?:\B-)?(?:\b\d+(?:\.\d*)?|\B\.\d+)/,
"symbol": {
pattern: /(^|\s)(?:A )?(?:BUKKIT|NOOB|NUMBAR|NUMBR|TROOF|YARN)(?=\s|,|$)/,
lookbehind: true,
inside: {
"keyword": /A(?=\s)/
}
},
"label": {
pattern: /((?:^|\s)(?:IM IN YR|IM OUTTA YR) )[a-zA-Z]\w*/,
lookbehind: true,
alias: "string"
},
"function": {
pattern: /((?:^|\s)(?:HOW IZ I|I IZ|IZ) )[a-zA-Z]\w*/,
lookbehind: true
},
"keyword": [
{
pattern: /(^|\s)(?:AN|FOUND YR|GIMMEH|GTFO|HAI|HAS A|HOW IZ I|I HAS A|I IZ|IF U SAY SO|IM IN YR|IM OUTTA YR|IS NOW(?: A)?|ITZ(?: A)?|IZ|KTHX|KTHXBYE|LIEK(?: A)?|MAEK|MEBBE|MKAY|NERFIN|NO WAI|O HAI IM|O RLY\?|OIC|OMG|OMGWTF|R|SMOOSH|SRS|TIL|UPPIN|VISIBLE|WILE|WTF\?|YA RLY|YR)(?=\s|,|$)/,
lookbehind: true
},
/'Z(?=\s|,|$)/
],
"boolean": {
pattern: /(^|\s)(?:FAIL|WIN)(?=\s|,|$)/,
lookbehind: true
},
"variable": {
pattern: /(^|\s)IT(?=\s|,|$)/,
lookbehind: true
},
"operator": {
pattern: /(^|\s)(?:NOT|BOTH SAEM|DIFFRINT|(?:ALL|ANY|BIGGR|BOTH|DIFF|EITHER|MOD|PRODUKT|QUOSHUNT|SMALLR|SUM|WON) OF)(?=\s|,|$)/,
lookbehind: true
},
"punctuation": /\.{3}|…|,|!/
};
Prism.languages.magma = {
"output": {
pattern: /^(>.*(?:\r(?:\n|(?!\n))|\n))(?!>)(?:.+|(?:\r(?:\n|(?!\n))|\n)(?!>).*)(?:(?:\r(?:\n|(?!\n))|\n)(?!>).*)*/m,
lookbehind: true,
greedy: true
},
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
greedy: true
},
"string": {
pattern: /(^|[^\\"])"(?:[^\r\n\\"]|\\.)*"/,
lookbehind: true,
greedy: true
},
"keyword": /\b(?:_|adj|and|assert|assert2|assert3|assigned|break|by|case|cat|catch|clear|cmpeq|cmpne|continue|declare|default|delete|diff|div|do|elif|else|end|eq|error|eval|exists|exit|for|forall|forward|fprintf|freeze|function|ge|gt|if|iload|import|in|intrinsic|is|join|le|load|local|lt|meet|mod|ne|not|notadj|notin|notsubset|or|print|printf|procedure|quit|random|read|readi|repeat|require|requirege|requirerange|restore|return|save|sdiff|select|subset|then|time|to|try|until|vprint|vprintf|vtime|when|where|while|xor)\b/,
"boolean": /\b(?:false|true)\b/,
"generator": {
pattern: /\b[a-z_]\w*(?=\s*<)/i,
alias: "class-name"
},
"function": /\b[a-z_]\w*(?=\s*\()/i,
"number": {
pattern: /(^|[^\w.]|\.\.)(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?:_[a-z]?)?(?=$|[^\w.]|\.\.)/,
lookbehind: true
},
"operator": /->|[-+*/^~!|#=]|:=|\.\./,
"punctuation": /[()[\]{}<>,;.:]/
};
Prism.languages.makefile = {
"comment": {
pattern: /(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,
lookbehind: true
},
"string": {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"builtin-target": {
pattern: /\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,
alias: "builtin"
},
"target": {
pattern: /^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,
alias: "symbol",
inside: {
"variable": /\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/
}
},
"variable": /\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,
"keyword": /-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,
"function": {
pattern: /(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,
lookbehind: true
},
"operator": /(?:::|[?:+!])?=|[|@]/,
"punctuation": /[:;(){}]/
};
(function(Prism2) {
var inner = /(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;
function createInline(pattern) {
pattern = pattern.replace(/<inner>/g, function() {
return inner;
});
return RegExp(/((?:^|[^\\])(?:\\{2})*)/.source + "(?:" + pattern + ")");
}
var tableCell = /(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source;
var tableRow = /\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g, function() {
return tableCell;
});
var tableLine = /\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;
Prism2.languages.markdown = Prism2.languages.extend("markup", {});
Prism2.languages.insertBefore("markdown", "prolog", {
"front-matter-block": {
pattern: /(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,
lookbehind: true,
greedy: true,
inside: {
"punctuation": /^---|---$/,
"front-matter": {
pattern: /\S+(?:\s+\S+)*/,
alias: ["yaml", "language-yaml"],
inside: Prism2.languages.yaml
}
}
},
"blockquote": {
pattern: /^>(?:[\t ]*>)*/m,
alias: "punctuation"
},
"table": {
pattern: RegExp("^" + tableRow + tableLine + "(?:" + tableRow + ")*", "m"),
inside: {
"table-data-rows": {
pattern: RegExp("^(" + tableRow + tableLine + ")(?:" + tableRow + ")*$"),
lookbehind: true,
inside: {
"table-data": {
pattern: RegExp(tableCell),
inside: Prism2.languages.markdown
},
"punctuation": /\|/
}
},
"table-line": {
pattern: RegExp("^(" + tableRow + ")" + tableLine + "$"),
lookbehind: true,
inside: {
"punctuation": /\||:?-{3,}:?/
}
},
"table-header-row": {
pattern: RegExp("^" + tableRow + "$"),
inside: {
"table-header": {
pattern: RegExp(tableCell),
alias: "important",
inside: Prism2.languages.markdown
},
"punctuation": /\|/
}
}
}
},
"code": [
{
pattern: /((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,
lookbehind: true,
alias: "keyword"
},
{
pattern: /^```[\s\S]*?^```$/m,
greedy: true,
inside: {
"code-block": {
pattern: /^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,
lookbehind: true
},
"code-language": {
pattern: /^(```).+/,
lookbehind: true
},
"punctuation": /```/
}
}
],
"title": [
{
pattern: /\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,
alias: "important",
inside: {
punctuation: /==+$|--+$/
}
},
{
pattern: /(^\s*)#.+/m,
lookbehind: true,
alias: "important",
inside: {
punctuation: /^#+|#+$/
}
}
],
"hr": {
pattern: /(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,
lookbehind: true,
alias: "punctuation"
},
"list": {
pattern: /(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,
lookbehind: true,
alias: "punctuation"
},
"url-reference": {
pattern: /!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,
inside: {
"variable": {
pattern: /^(!?\[)[^\]]+/,
lookbehind: true
},
"string": /(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,
"punctuation": /^[\[\]!:]|[<>]/
},
alias: "url"
},
"bold": {
pattern: createInline(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),
lookbehind: true,
greedy: true,
inside: {
"content": {
pattern: /(^..)[\s\S]+(?=..$)/,
lookbehind: true,
inside: {}
},
"punctuation": /\*\*|__/
}
},
"italic": {
pattern: createInline(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),
lookbehind: true,
greedy: true,
inside: {
"content": {
pattern: /(^.)[\s\S]+(?=.$)/,
lookbehind: true,
inside: {}
},
"punctuation": /[*_]/
}
},
"strike": {
pattern: createInline(/(~~?)(?:(?!~)<inner>)+\2/.source),
lookbehind: true,
greedy: true,
inside: {
"content": {
pattern: /(^~~?)[\s\S]+(?=\1$)/,
lookbehind: true,
inside: {}
},
"punctuation": /~~?/
}
},
"code-snippet": {
pattern: /(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,
lookbehind: true,
greedy: true,
alias: ["code", "keyword"]
},
"url": {
pattern: createInline(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),
lookbehind: true,
greedy: true,
inside: {
"operator": /^!/,
"content": {
pattern: /(^\[)[^\]]+(?=\])/,
lookbehind: true,
inside: {}
},
"variable": {
pattern: /(^\][ \t]?\[)[^\]]+(?=\]$)/,
lookbehind: true
},
"url": {
pattern: /(^\]\()[^\s)]+/,
lookbehind: true
},
"string": {
pattern: /(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,
lookbehind: true
}
}
}
});
["url", "bold", "italic", "strike"].forEach(function(token) {
["url", "bold", "italic", "strike", "code-snippet"].forEach(function(inside) {
if (token !== inside) {
Prism2.languages.markdown[token].inside.content.inside[inside] = Prism2.languages.markdown[inside];
}
});
});
Prism2.hooks.add("after-tokenize", function(env) {
if (env.language !== "markdown" && env.language !== "md") {
return;
}
function walkTokens(tokens) {
if (!tokens || typeof tokens === "string") {
return;
}
for (var i = 0, l = tokens.length; i < l; i++) {
var token = tokens[i];
if (token.type !== "code") {
walkTokens(token.content);
continue;
}
var codeLang = token.content[1];
var codeBlock = token.content[3];
if (codeLang && codeBlock && codeLang.type === "code-language" && codeBlock.type === "code-block" && typeof codeLang.content === "string") {
var lang = codeLang.content.replace(/\b#/g, "sharp").replace(/\b\+\+/g, "pp");
lang = (/[a-z][\w-]*/i.exec(lang) || [""])[0].toLowerCase();
var alias = "language-" + lang;
if (!codeBlock.alias) {
codeBlock.alias = [alias];
} else if (typeof codeBlock.alias === "string") {
codeBlock.alias = [codeBlock.alias, alias];
} else {
codeBlock.alias.push(alias);
}
}
}
}
walkTokens(env.tokens);
});
Prism2.hooks.add("wrap", function(env) {
if (env.type !== "code-block") {
return;
}
var codeLang = "";
for (var i = 0, l = env.classes.length; i < l; i++) {
var cls = env.classes[i];
var match = /language-(.+)/.exec(cls);
if (match) {
codeLang = match[1];
break;
}
}
var grammar = Prism2.languages[codeLang];
if (!grammar) {
if (codeLang && codeLang !== "none" && Prism2.plugins.autoloader) {
var id = "md-" + new Date().valueOf() + "-" + Math.floor(Math.random() * 1e16);
env.attributes["id"] = id;
Prism2.plugins.autoloader.loadLanguages(codeLang, function() {
var ele = document.getElementById(id);
if (ele) {
ele.innerHTML = Prism2.highlight(ele.textContent, Prism2.languages[codeLang], codeLang);
}
});
}
} else {
env.content = Prism2.highlight(textContent(env.content), grammar, codeLang);
}
});
var tagPattern = RegExp(Prism2.languages.markup.tag.pattern.source, "gi");
var KNOWN_ENTITY_NAMES = {
"amp": "&",
"lt": "<",
"gt": ">",
"quot": '"'
};
var fromCodePoint = String.fromCodePoint || String.fromCharCode;
function textContent(html) {
var text = html.replace(tagPattern, "");
text = text.replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi, function(m, code) {
code = code.toLowerCase();
if (code[0] === "#") {
var value;
if (code[1] === "x") {
value = parseInt(code.slice(2), 16);
} else {
value = Number(code.slice(1));
}
return fromCodePoint(value);
} else {
var known = KNOWN_ENTITY_NAMES[code];
if (known) {
return known;
}
return m;
}
});
return text;
}
Prism2.languages.md = Prism2.languages.markdown;
})(Prism);
(function(Prism2) {
var orgType = /\b(?:(?:col|row)?vector|matrix|scalar)\b/.source;
var type = /\bvoid\b|<org>|\b(?:complex|numeric|pointer(?:\s*\([^()]*\))?|real|string|(?:class|struct)\s+\w+|transmorphic)(?:\s*<org>)?/.source.replace(/<org>/g, orgType);
Prism2.languages.mata = {
"comment": {
pattern: /\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,
greedy: true
},
"string": {
pattern: /"[^"\r\n]*"|[‘`']".*?"[’`']/,
greedy: true
},
"class-name": {
pattern: /(\b(?:class|extends|struct)\s+)\w+(?=\s*(?:\{|\bextends\b))/,
lookbehind: true
},
"type": {
pattern: RegExp(type),
alias: "class-name",
inside: {
"punctuation": /[()]/,
"keyword": /\b(?:class|function|struct|void)\b/
}
},
"keyword": /\b(?:break|class|continue|do|else|end|extends|external|final|for|function|goto|if|pragma|private|protected|public|return|static|struct|unset|unused|version|virtual|while)\b/,
"constant": /\bNULL\b/,
"number": {
pattern: /(^|[^\w.])(?:\d+(?:\.\d+)?(?:e[+-]?\d+)?|\d[a-f0-9]*(?:\.[a-f0-9]+)?x[+-]?\d+)i?(?![\w.])/i,
lookbehind: true
},
"missing": {
pattern: /(^|[^\w.])(?:\.[a-z]?)(?![\w.])/,
lookbehind: true,
alias: "symbol"
},
"function": /\b[a-z_]\w*(?=\s*\()/i,
"operator": /\.\.|\+\+|--|&&|\|\||:?(?:[!=<>]=|[+\-*/^<>&|:])|[!?=\\#’`']/,
"punctuation": /[()[\]{},;.]/
};
})(Prism);
Prism.languages.matlab = {
"comment": [
/%\{[\s\S]*?\}%/,
/%.+/
],
"string": {
pattern: /\B'(?:''|[^'\r\n])*'/,
greedy: true
},
"number": /(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[eE][+-]?\d+)?(?:[ij])?|\b[ij]\b/,
"keyword": /\b(?:NaN|break|case|catch|continue|else|elseif|end|for|function|if|inf|otherwise|parfor|pause|pi|return|switch|try|while)\b/,
"function": /\b(?!\d)\w+(?=\s*\()/,
"operator": /\.?[*^\/\\']|[+\-:@]|[<>=~]=?|&&?|\|\|?/,
"punctuation": /\.{3}|[.,;\[\](){}!]/
};
(function(Prism2) {
var keywords = /\b(?:about|and|animate|as|at|attributes|by|case|catch|collect|continue|coordsys|do|else|exit|fn|for|from|function|global|if|in|local|macroscript|mapped|max|not|of|off|on|or|parameters|persistent|plugin|rcmenu|return|rollout|set|struct|then|throw|to|tool|try|undo|utility|when|where|while|with)\b/i;
Prism2.languages.maxscript = {
"comment": {
pattern: /\/\*[\s\S]*?(?:\*\/|$)|--.*/,
greedy: true
},
"string": {
pattern: /(^|[^"\\@])(?:"(?:[^"\\]|\\[\s\S])*"|@"[^"]*")/,
lookbehind: true,
greedy: true
},
"path": {
pattern: /\$(?:[\w/\\.*?]|'[^']*')*/,
greedy: true,
alias: "string"
},
"function-call": {
pattern: RegExp(
"((?:" + (/^/.source + "|" + /[;=<>+\-*/^({\[]/.source + "|" + /\b(?:and|by|case|catch|collect|do|else|if|in|not|or|return|then|to|try|where|while|with)\b/.source) + ")[ ]*)(?!" + keywords.source + ")" + /[a-z_]\w*\b/.source + "(?=[ ]*(?:" + ("(?!" + keywords.source + ")" + /[a-z_]/.source + "|" + /\d|-\.?\d/.source + "|" + /[({'"$@#?]/.source) + "))",
"im"
),
lookbehind: true,
greedy: true,
alias: "function"
},
"function-definition": {
pattern: /(\b(?:fn|function)\s+)\w+\b/i,
lookbehind: true,
alias: "function"
},
"argument": {
pattern: /\b[a-z_]\w*(?=:)/i,
alias: "attr-name"
},
"keyword": keywords,
"boolean": /\b(?:false|true)\b/,
"time": {
pattern: /(^|[^\w.])(?:(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?[msft])+|\d+:\d+(?:\.\d*)?)(?![\w.:])/,
lookbehind: true,
alias: "number"
},
"number": [
{
pattern: /(^|[^\w.])(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[eEdD][+-]\d+|[LP])?|0x[a-fA-F0-9]+)(?![\w.:])/,
lookbehind: true
},
/\b(?:e|pi)\b/
],
"constant": /\b(?:dontcollect|ok|silentValue|undefined|unsupplied)\b/,
"color": {
pattern: /\b(?:black|blue|brown|gray|green|orange|red|white|yellow)\b/i,
alias: "constant"
},
"operator": /[-+*/<>=!]=?|[&^?]|#(?!\()/,
"punctuation": /[()\[\]{}.:,;]|#(?=\()|\\$/m
};
})(Prism);
Prism.languages.mel = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
greedy: true
},
"code": {
pattern: /`(?:\\.|[^\\`])*`/,
greedy: true,
alias: "italic",
inside: {
"delimiter": {
pattern: /^`|`$/,
alias: "punctuation"
},
"statement": {
pattern: /[\s\S]+/,
inside: null
}
}
},
"string": {
pattern: /"(?:\\.|[^\\"\r\n])*"/,
greedy: true
},
"variable": /\$\w+/,
"number": /\b0x[\da-fA-F]+\b|\b\d+(?:\.\d*)?|\B\.\d+/,
"flag": {
pattern: /-[^\d\W]\w*/,
alias: "operator"
},
"keyword": /\b(?:break|case|continue|default|do|else|float|for|global|if|in|int|matrix|proc|return|string|switch|vector|while)\b/,
"function": {
pattern: /((?:^|[{;])[ \t]*)[a-z_]\w*\b(?!\s*(?:\.(?!\.)|[[{=]))|\b[a-z_]\w*(?=[ \t]*\()/im,
lookbehind: true,
greedy: true
},
"tensor-punctuation": {
pattern: /<<|>>/,
alias: "punctuation"
},
"operator": /\+[+=]?|-[-=]?|&&|\|\||[<>]=?|[*\/!=]=?|[%^]/,
"punctuation": /[.,:;?\[\](){}]/
};
Prism.languages.mel["code"].inside["statement"].inside = Prism.languages.mel;
Prism.languages.mermaid = {
"comment": {
pattern: /%%.*/,
greedy: true
},
"style": {
pattern: /^([ \t]*(?:classDef|linkStyle|style)[ \t]+[\w$-]+[ \t]+)\w.*[^\s;]/m,
lookbehind: true,
inside: {
"property": /\b\w[\w-]*(?=[ \t]*:)/,
"operator": /:/,
"punctuation": /,/
}
},
"inter-arrow-label": {
pattern: /([^<>ox.=-])(?:-[-.]|==)(?![<>ox.=-])[ \t]*(?:"[^"\r\n]*"|[^\s".=-](?:[^\r\n.=-]*[^\s.=-])?)[ \t]*(?:\.+->?|--+[->]|==+[=>])(?![<>ox.=-])/,
lookbehind: true,
greedy: true,
inside: {
"arrow": {
pattern: /(?:\.+->?|--+[->]|==+[=>])$/,
alias: "operator"
},
"label": {
pattern: /^([\s\S]{2}[ \t]*)\S(?:[\s\S]*\S)?/,
lookbehind: true,
alias: "property"
},
"arrow-head": {
pattern: /^\S+/,
alias: ["arrow", "operator"]
}
}
},
"arrow": [
{
pattern: /(^|[^{}|o.-])[|}][|o](?:--|\.\.)[|o][|{](?![{}|o.-])/,
lookbehind: true,
alias: "operator"
},
{
pattern: /(^|[^<>ox.=-])(?:[<ox](?:==+|--+|-\.*-)[>ox]?|(?:==+|--+|-\.*-)[>ox]|===+|---+|-\.+-)(?![<>ox.=-])/,
lookbehind: true,
alias: "operator"
},
{
pattern: /(^|[^<>()x-])(?:--?(?:>>|[x>)])(?![<>()x])|(?:<<|[x<(])--?(?!-))/,
lookbehind: true,
alias: "operator"
},
{
pattern: /(^|[^<>|*o.-])(?:[*o]--|--[*o]|<\|?(?:--|\.\.)|(?:--|\.\.)\|?>|--|\.\.)(?![<>|*o.-])/,
lookbehind: true,
alias: "operator"
}
],
"label": {
pattern: /(^|[^|<])\|(?:[^\r\n"|]|"[^"\r\n]*")+\|/,
lookbehind: true,
greedy: true,
alias: "property"
},
"text": {
pattern: /(?:[(\[{]+|\b>)(?:[^\r\n"()\[\]{}]|"[^"\r\n]*")+(?:[)\]}]+|>)/,
alias: "string"
},
"string": {
pattern: /"[^"\r\n]*"/,
greedy: true
},
"annotation": {
pattern: /<<(?:abstract|choice|enumeration|fork|interface|join|service)>>|\[\[(?:choice|fork|join)\]\]/i,
alias: "important"
},
"keyword": [
{
pattern: /(^[ \t]*)(?:action|callback|class|classDef|classDiagram|click|direction|erDiagram|flowchart|gantt|gitGraph|graph|journey|link|linkStyle|pie|requirementDiagram|sequenceDiagram|stateDiagram|stateDiagram-v2|style|subgraph)(?![\w$-])/m,
lookbehind: true,
greedy: true
},
{
pattern: /(^[ \t]*)(?:activate|alt|and|as|autonumber|deactivate|else|end(?:[ \t]+note)?|loop|opt|par|participant|rect|state|note[ \t]+(?:over|(?:left|right)[ \t]+of))(?![\w$-])/im,
lookbehind: true,
greedy: true
}
],
"entity": /#[a-z0-9]+;/,
"operator": {
pattern: /(\w[ \t]*)&(?=[ \t]*\w)|:::|:/,
lookbehind: true
},
"punctuation": /[(){};]/
};
Prism.languages.mizar = {
"comment": /::.+/,
"keyword": /@proof\b|\b(?:according|aggregate|all|and|antonym|are|as|associativity|assume|asymmetry|attr|be|begin|being|by|canceled|case|cases|clusters?|coherence|commutativity|compatibility|connectedness|consider|consistency|constructors|contradiction|correctness|def|deffunc|define|definitions?|defpred|do|does|end|environ|equals|ex|exactly|existence|for|from|func|given|hence|hereby|holds|idempotence|identity|iff?|implies|involutiveness|irreflexivity|is|it|let|means|mode|non|not|notations?|now|of|or|otherwise|over|per|pred|prefix|projectivity|proof|provided|qua|reconsider|redefine|reduce|reducibility|reflexivity|registrations?|requirements|reserve|sch|schemes?|section|selector|set|sethood|st|struct|such|suppose|symmetry|synonym|take|that|the|then|theorems?|thesis|thus|to|transitivity|uniqueness|vocabular(?:ies|y)|when|where|with|wrt)\b/,
"parameter": {
pattern: /\$(?:10|\d)/,
alias: "variable"
},
"variable": /\b\w+(?=:)/,
"number": /(?:\b|-)\d+\b/,
"operator": /\.\.\.|->|&|\.?=/,
"punctuation": /\(#|#\)|[,:;\[\](){}]/
};
(function(Prism2) {
var operators = [
"$eq",
"$gt",
"$gte",
"$in",
"$lt",
"$lte",
"$ne",
"$nin",
"$and",
"$not",
"$nor",
"$or",
"$exists",
"$type",
"$expr",
"$jsonSchema",
"$mod",
"$regex",
"$text",
"$where",
"$geoIntersects",
"$geoWithin",
"$near",
"$nearSphere",
"$all",
"$elemMatch",
"$size",
"$bitsAllClear",
"$bitsAllSet",
"$bitsAnyClear",
"$bitsAnySet",
"$comment",
"$elemMatch",
"$meta",
"$slice",
"$currentDate",
"$inc",
"$min",
"$max",
"$mul",
"$rename",
"$set",
"$setOnInsert",
"$unset",
"$addToSet",
"$pop",
"$pull",
"$push",
"$pullAll",
"$each",
"$position",
"$slice",
"$sort",
"$bit",
"$addFields",
"$bucket",
"$bucketAuto",
"$collStats",
"$count",
"$currentOp",
"$facet",
"$geoNear",
"$graphLookup",
"$group",
"$indexStats",
"$limit",
"$listLocalSessions",
"$listSessions",
"$lookup",
"$match",
"$merge",
"$out",
"$planCacheStats",
"$project",
"$redact",
"$replaceRoot",
"$replaceWith",
"$sample",
"$set",
"$skip",
"$sort",
"$sortByCount",
"$unionWith",
"$unset",
"$unwind",
"$setWindowFields",
"$abs",
"$accumulator",
"$acos",
"$acosh",
"$add",
"$addToSet",
"$allElementsTrue",
"$and",
"$anyElementTrue",
"$arrayElemAt",
"$arrayToObject",
"$asin",
"$asinh",
"$atan",
"$atan2",
"$atanh",
"$avg",
"$binarySize",
"$bsonSize",
"$ceil",
"$cmp",
"$concat",
"$concatArrays",
"$cond",
"$convert",
"$cos",
"$dateFromParts",
"$dateToParts",
"$dateFromString",
"$dateToString",
"$dayOfMonth",
"$dayOfWeek",
"$dayOfYear",
"$degreesToRadians",
"$divide",
"$eq",
"$exp",
"$filter",
"$first",
"$floor",
"$function",
"$gt",
"$gte",
"$hour",
"$ifNull",
"$in",
"$indexOfArray",
"$indexOfBytes",
"$indexOfCP",
"$isArray",
"$isNumber",
"$isoDayOfWeek",
"$isoWeek",
"$isoWeekYear",
"$last",
"$last",
"$let",
"$literal",
"$ln",
"$log",
"$log10",
"$lt",
"$lte",
"$ltrim",
"$map",
"$max",
"$mergeObjects",
"$meta",
"$min",
"$millisecond",
"$minute",
"$mod",
"$month",
"$multiply",
"$ne",
"$not",
"$objectToArray",
"$or",
"$pow",
"$push",
"$radiansToDegrees",
"$range",
"$reduce",
"$regexFind",
"$regexFindAll",
"$regexMatch",
"$replaceOne",
"$replaceAll",
"$reverseArray",
"$round",
"$rtrim",
"$second",
"$setDifference",
"$setEquals",
"$setIntersection",
"$setIsSubset",
"$setUnion",
"$size",
"$sin",
"$slice",
"$split",
"$sqrt",
"$stdDevPop",
"$stdDevSamp",
"$strcasecmp",
"$strLenBytes",
"$strLenCP",
"$substr",
"$substrBytes",
"$substrCP",
"$subtract",
"$sum",
"$switch",
"$tan",
"$toBool",
"$toDate",
"$toDecimal",
"$toDouble",
"$toInt",
"$toLong",
"$toObjectId",
"$toString",
"$toLower",
"$toUpper",
"$trim",
"$trunc",
"$type",
"$week",
"$year",
"$zip",
"$count",
"$dateAdd",
"$dateDiff",
"$dateSubtract",
"$dateTrunc",
"$getField",
"$rand",
"$sampleRate",
"$setField",
"$unsetField",
"$comment",
"$explain",
"$hint",
"$max",
"$maxTimeMS",
"$min",
"$orderby",
"$query",
"$returnKey",
"$showDiskLoc",
"$natural"
];
var builtinFunctions = [
"ObjectId",
"Code",
"BinData",
"DBRef",
"Timestamp",
"NumberLong",
"NumberDecimal",
"MaxKey",
"MinKey",
"RegExp",
"ISODate",
"UUID"
];
operators = operators.map(function(operator) {
return operator.replace("$", "\\$");
});
var operatorsSource = "(?:" + operators.join("|") + ")\\b";
Prism2.languages.mongodb = Prism2.languages.extend("javascript", {});
Prism2.languages.insertBefore("mongodb", "string", {
"property": {
pattern: /(?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)(?=\s*:)/,
greedy: true,
inside: {
"keyword": RegExp(`^(['"])?` + operatorsSource + "(?:\\1)?$")
}
}
});
Prism2.languages.mongodb.string.inside = {
url: {
pattern: /https?:\/\/[-\w@:%.+~#=]{1,256}\.[a-z0-9()]{1,6}\b[-\w()@:%+.~#?&/=]*/i,
greedy: true
},
entity: {
pattern: /\b(?:(?:[01]?\d\d?|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d\d?|2[0-4]\d|25[0-5])\b/,
greedy: true
}
};
Prism2.languages.insertBefore("mongodb", "constant", {
"builtin": {
pattern: RegExp("\\b(?:" + builtinFunctions.join("|") + ")\\b"),
alias: "keyword"
}
});
})(Prism);
Prism.languages.monkey = {
"comment": {
pattern: /^#Rem\s[\s\S]*?^#End|'.+/im,
greedy: true
},
"string": {
pattern: /"[^"\r\n]*"/,
greedy: true
},
"preprocessor": {
pattern: /(^[ \t]*)#.+/m,
lookbehind: true,
greedy: true,
alias: "property"
},
"function": /\b\w+(?=\()/,
"type-char": {
pattern: /\b[?%#$]/,
alias: "class-name"
},
"number": {
pattern: /((?:\.\.)?)(?:(?:\b|\B-\.?|\B\.)\d+(?:(?!\.\.)\.\d*)?|\$[\da-f]+)/i,
lookbehind: true
},
"keyword": /\b(?:Abstract|Array|Bool|Case|Catch|Class|Const|Continue|Default|Eachin|Else|ElseIf|End|EndIf|Exit|Extends|Extern|False|Field|Final|Float|For|Forever|Function|Global|If|Implements|Import|Inline|Int|Interface|Local|Method|Module|New|Next|Null|Object|Private|Property|Public|Repeat|Return|Select|Self|Step|Strict|String|Super|Then|Throw|To|True|Try|Until|Void|Wend|While)\b/i,
"operator": /\.\.|<[=>]?|>=?|:?=|(?:[+\-*\/&~|]|\b(?:Mod|Shl|Shr)\b)=?|\b(?:And|Not|Or)\b/i,
"punctuation": /[.,:;()\[\]]/
};
Prism.languages.moonscript = {
"comment": /--.*/,
"string": [
{
pattern: /'[^']*'|\[(=*)\[[\s\S]*?\]\1\]/,
greedy: true
},
{
pattern: /"[^"]*"/,
greedy: true,
inside: {
"interpolation": {
pattern: /#\{[^{}]*\}/,
inside: {
"moonscript": {
pattern: /(^#\{)[\s\S]+(?=\})/,
lookbehind: true,
inside: null
},
"interpolation-punctuation": {
pattern: /#\{|\}/,
alias: "punctuation"
}
}
}
}
}
],
"class-name": [
{
pattern: /(\b(?:class|extends)[ \t]+)\w+/,
lookbehind: true
},
/\b[A-Z]\w*/
],
"keyword": /\b(?:class|continue|do|else|elseif|export|extends|for|from|if|import|in|local|nil|return|self|super|switch|then|unless|using|when|while|with)\b/,
"variable": /@@?\w*/,
"property": {
pattern: /\b(?!\d)\w+(?=:)|(:)(?!\d)\w+/,
lookbehind: true
},
"function": {
pattern: /\b(?:_G|_VERSION|assert|collectgarbage|coroutine\.(?:create|resume|running|status|wrap|yield)|debug\.(?:debug|getfenv|gethook|getinfo|getlocal|getmetatable|getregistry|getupvalue|setfenv|sethook|setlocal|setmetatable|setupvalue|traceback)|dofile|error|getfenv|getmetatable|io\.(?:close|flush|input|lines|open|output|popen|read|stderr|stdin|stdout|tmpfile|type|write)|ipairs|load|loadfile|loadstring|math\.(?:abs|acos|asin|atan|atan2|ceil|cos|cosh|deg|exp|floor|fmod|frexp|ldexp|log|log10|max|min|modf|pi|pow|rad|random|randomseed|sin|sinh|sqrt|tan|tanh)|module|next|os\.(?:clock|date|difftime|execute|exit|getenv|remove|rename|setlocale|time|tmpname)|package\.(?:cpath|loaded|loadlib|path|preload|seeall)|pairs|pcall|print|rawequal|rawget|rawset|require|select|setfenv|setmetatable|string\.(?:byte|char|dump|find|format|gmatch|gsub|len|lower|match|rep|reverse|sub|upper)|table\.(?:concat|insert|maxn|remove|sort)|tonumber|tostring|type|unpack|xpcall)\b/,
inside: {
"punctuation": /\./
}
},
"boolean": /\b(?:false|true)\b/,
"number": /(?:\B\.\d+|\b\d+\.\d+|\b\d+(?=[eE]))(?:[eE][-+]?\d+)?\b|\b(?:0x[a-fA-F\d]+|\d+)(?:U?LL)?\b/,
"operator": /\.{3}|[-=]>|~=|(?:[-+*/%<>!=]|\.\.)=?|[:#^]|\b(?:and|or)\b=?|\b(?:not)\b/,
"punctuation": /[.,()[\]{}\\]/
};
Prism.languages.moonscript.string[1].inside.interpolation.inside.moonscript.inside = Prism.languages.moonscript;
Prism.languages.moon = Prism.languages.moonscript;
Prism.languages.n1ql = {
"comment": {
pattern: /\/\*[\s\S]*?(?:$|\*\/)|--.*/,
greedy: true
},
"string": {
pattern: /(["'])(?:\\[\s\S]|(?!\1)[^\\]|\1\1)*\1/,
greedy: true
},
"identifier": {
pattern: /`(?:\\[\s\S]|[^\\`]|``)*`/,
greedy: true
},
"parameter": /\$[\w.]+/,
"keyword": /\b(?:ADVISE|ALL|ALTER|ANALYZE|AS|ASC|AT|BEGIN|BINARY|BOOLEAN|BREAK|BUCKET|BUILD|BY|CALL|CAST|CLUSTER|COLLATE|COLLECTION|COMMIT|COMMITTED|CONNECT|CONTINUE|CORRELATE|CORRELATED|COVER|CREATE|CURRENT|DATABASE|DATASET|DATASTORE|DECLARE|DECREMENT|DELETE|DERIVED|DESC|DESCRIBE|DISTINCT|DO|DROP|EACH|ELEMENT|EXCEPT|EXCLUDE|EXECUTE|EXPLAIN|FETCH|FILTER|FLATTEN|FLUSH|FOLLOWING|FOR|FORCE|FROM|FTS|FUNCTION|GOLANG|GRANT|GROUP|GROUPS|GSI|HASH|HAVING|IF|IGNORE|ILIKE|INCLUDE|INCREMENT|INDEX|INFER|INLINE|INNER|INSERT|INTERSECT|INTO|IS|ISOLATION|JAVASCRIPT|JOIN|KEY|KEYS|KEYSPACE|KNOWN|LANGUAGE|LAST|LEFT|LET|LETTING|LEVEL|LIMIT|LSM|MAP|MAPPING|MATCHED|MATERIALIZED|MERGE|MINUS|MISSING|NAMESPACE|NEST|NL|NO|NTH_VALUE|NULL|NULLS|NUMBER|OBJECT|OFFSET|ON|OPTION|OPTIONS|ORDER|OTHERS|OUTER|OVER|PARSE|PARTITION|PASSWORD|PATH|POOL|PRECEDING|PREPARE|PRIMARY|PRIVATE|PRIVILEGE|PROBE|PROCEDURE|PUBLIC|RANGE|RAW|REALM|REDUCE|RENAME|RESPECT|RETURN|RETURNING|REVOKE|RIGHT|ROLE|ROLLBACK|ROW|ROWS|SATISFIES|SAVEPOINT|SCHEMA|SCOPE|SELECT|SELF|SEMI|SET|SHOW|SOME|START|STATISTICS|STRING|SYSTEM|TIES|TO|TRAN|TRANSACTION|TRIGGER|TRUNCATE|UNBOUNDED|UNDER|UNION|UNIQUE|UNKNOWN|UNNEST|UNSET|UPDATE|UPSERT|USE|USER|USING|VALIDATE|VALUE|VALUES|VIA|VIEW|WHERE|WHILE|WINDOW|WITH|WORK|XOR)\b/i,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"boolean": /\b(?:FALSE|TRUE)\b/i,
"number": /(?:\b\d+\.|\B\.)\d+e[+\-]?\d+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,
"operator": /[-+*\/%]|!=|==?|\|\||<[>=]?|>=?|\b(?:AND|ANY|ARRAY|BETWEEN|CASE|ELSE|END|EVERY|EXISTS|FIRST|IN|LIKE|NOT|OR|THEN|VALUED|WHEN|WITHIN)\b/i,
"punctuation": /[;[\](),.{}:]/
};
Prism.languages.n4js = Prism.languages.extend("javascript", {
"keyword": /\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/
});
Prism.languages.insertBefore("n4js", "constant", {
"annotation": {
pattern: /@+\w+/,
alias: "operator"
}
});
Prism.languages.n4jsd = Prism.languages.n4js;
Prism.languages["nand2tetris-hdl"] = {
"comment": /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
"keyword": /\b(?:BUILTIN|CHIP|CLOCKED|IN|OUT|PARTS)\b/,
"boolean": /\b(?:false|true)\b/,
"function": /\b[A-Za-z][A-Za-z0-9]*(?=\()/,
"number": /\b\d+\b/,
"operator": /=|\.\./,
"punctuation": /[{}[\];(),:]/
};
(function(Prism2) {
var expressionDef = /\{[^\r\n\[\]{}]*\}/;
var params = {
"quoted-string": {
pattern: /"(?:[^"\\]|\\.)*"/,
alias: "operator"
},
"command-param-id": {
pattern: /(\s)\w+:/,
lookbehind: true,
alias: "property"
},
"command-param-value": [
{
pattern: expressionDef,
alias: "selector"
},
{
pattern: /([\t ])\S+/,
lookbehind: true,
greedy: true,
alias: "operator"
},
{
pattern: /\S(?:.*\S)?/,
alias: "operator"
}
]
};
Prism2.languages.naniscript = {
"comment": {
pattern: /^([\t ]*);.*/m,
lookbehind: true
},
"define": {
pattern: /^>.+/m,
alias: "tag",
inside: {
"value": {
pattern: /(^>\w+[\t ]+)(?!\s)[^{}\r\n]+/,
lookbehind: true,
alias: "operator"
},
"key": {
pattern: /(^>)\w+/,
lookbehind: true
}
}
},
"label": {
pattern: /^([\t ]*)#[\t ]*\w+[\t ]*$/m,
lookbehind: true,
alias: "regex"
},
"command": {
pattern: /^([\t ]*)@\w+(?=[\t ]|$).*/m,
lookbehind: true,
alias: "function",
inside: {
"command-name": /^@\w+/,
"expression": {
pattern: expressionDef,
greedy: true,
alias: "selector"
},
"command-params": {
pattern: /\s*\S[\s\S]*/,
inside: params
}
}
},
"generic-text": {
pattern: /(^[ \t]*)[^#@>;\s].*/m,
lookbehind: true,
alias: "punctuation",
inside: {
"escaped-char": /\\[{}\[\]"]/,
"expression": {
pattern: expressionDef,
greedy: true,
alias: "selector"
},
"inline-command": {
pattern: /\[[\t ]*\w[^\r\n\[\]]*\]/,
greedy: true,
alias: "function",
inside: {
"command-params": {
pattern: /(^\[[\t ]*\w+\b)[\s\S]+(?=\]$)/,
lookbehind: true,
inside: params
},
"command-param-name": {
pattern: /^(\[[\t ]*)\w+/,
lookbehind: true,
alias: "name"
},
"start-stop-char": /[\[\]]/
}
}
}
}
};
Prism2.languages.nani = Prism2.languages["naniscript"];
Prism2.hooks.add("after-tokenize", function(env) {
var tokens = env.tokens;
tokens.forEach(function(token) {
if (typeof token !== "string" && token.type === "generic-text") {
var content = getTextContent(token);
if (!isBracketsBalanced(content)) {
token.type = "bad-line";
token.content = content;
}
}
});
});
function isBracketsBalanced(input) {
var brackets = "[]{}";
var stack = [];
for (var i = 0; i < input.length; i++) {
var bracket = input[i];
var bracketsIndex = brackets.indexOf(bracket);
if (bracketsIndex !== -1) {
if (bracketsIndex % 2 === 0) {
stack.push(bracketsIndex + 1);
} else if (stack.pop() !== bracketsIndex) {
return false;
}
}
}
return stack.length === 0;
}
function getTextContent(token) {
if (typeof token === "string") {
return token;
} else if (Array.isArray(token)) {
return token.map(getTextContent).join("");
} else {
return getTextContent(token.content);
}
}
})(Prism);
Prism.languages.nasm = {
"comment": /;.*$/m,
"string": /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
"label": {
pattern: /(^\s*)[A-Za-z._?$][\w.?$@~#]*:/m,
lookbehind: true,
alias: "function"
},
"keyword": [
/\[?BITS (?:16|32|64)\]?/,
{
pattern: /(^\s*)section\s*[a-z.]+:?/im,
lookbehind: true
},
/(?:extern|global)[^;\r\n]*/i,
/(?:CPU|DEFAULT|FLOAT).*$/m
],
"register": {
pattern: /\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s)\b/i,
alias: "variable"
},
"number": /(?:\b|(?=\$))(?:0[hx](?:\.[\da-f]+|[\da-f]+(?:\.[\da-f]+)?)(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,
"operator": /[\[\]*+\-\/%<>=&|$!]/
};
Prism.languages.neon = {
"comment": {
pattern: /#.*/,
greedy: true
},
"datetime": {
pattern: /(^|[[{(=:,\s])\d\d\d\d-\d\d?-\d\d?(?:(?:[Tt]| +)\d\d?:\d\d:\d\d(?:\.\d*)? *(?:Z|[-+]\d\d?(?::?\d\d)?)?)?(?=$|[\]}),\s])/,
lookbehind: true,
alias: "number"
},
"key": {
pattern: /(^|[[{(,\s])[^,:=[\]{}()'"\s]+(?=\s*:(?:$|[\]}),\s])|\s*=)/,
lookbehind: true,
alias: "property"
},
"number": {
pattern: /(^|[[{(=:,\s])[+-]?(?:0x[\da-fA-F]+|0o[0-7]+|0b[01]+|(?:\d+(?:\.\d*)?|\.?\d+)(?:[eE][+-]?\d+)?)(?=$|[\]}),:=\s])/,
lookbehind: true
},
"boolean": {
pattern: /(^|[[{(=:,\s])(?:false|no|true|yes)(?=$|[\]}),:=\s])/i,
lookbehind: true
},
"null": {
pattern: /(^|[[{(=:,\s])(?:null)(?=$|[\]}),:=\s])/i,
lookbehind: true,
alias: "keyword"
},
"string": {
pattern: /(^|[[{(=:,\s])(?:('''|""")\r?\n(?:(?:[^\r\n]|\r?\n(?![\t ]*\2))*\r?\n)?[\t ]*\2|'[^'\r\n]*'|"(?:\\.|[^\\"\r\n])*")/,
lookbehind: true,
greedy: true
},
"literal": {
pattern: /(^|[[{(=:,\s])(?:[^#"',:=[\]{}()\s`-]|[:-][^"',=[\]{}()\s])(?:[^,:=\]})(\s]|:(?![\s,\]})]|$)|[ \t]+[^#,:=\]})(\s])*/,
lookbehind: true,
alias: "string"
},
"punctuation": /[,:=[\]{}()-]/
};
Prism.languages.nevod = {
"comment": /\/\/.*|(?:\/\*[\s\S]*?(?:\*\/|$))/,
"string": {
pattern: /(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))!?\*?/,
greedy: true,
inside: {
"string-attrs": /!$|!\*$|\*$/
}
},
"namespace": {
pattern: /(@namespace\s+)[a-zA-Z0-9\-.]+(?=\s*\{)/,
lookbehind: true
},
"pattern": {
pattern: /(@pattern\s+)?#?[a-zA-Z0-9\-.]+(?:\s*\(\s*(?:~\s*)?[a-zA-Z0-9\-.]+\s*(?:,\s*(?:~\s*)?[a-zA-Z0-9\-.]*)*\))?(?=\s*=)/,
lookbehind: true,
inside: {
"pattern-name": {
pattern: /^#?[a-zA-Z0-9\-.]+/,
alias: "class-name"
},
"fields": {
pattern: /\(.*\)/,
inside: {
"field-name": {
pattern: /[a-zA-Z0-9\-.]+/,
alias: "variable"
},
"punctuation": /[,()]/,
"operator": {
pattern: /~/,
alias: "field-hidden-mark"
}
}
}
}
},
"search": {
pattern: /(@search\s+|#)[a-zA-Z0-9\-.]+(?:\.\*)?(?=\s*;)/,
alias: "function",
lookbehind: true
},
"keyword": /@(?:having|inside|namespace|outside|pattern|require|search|where)\b/,
"standard-pattern": {
pattern: /\b(?:Alpha|AlphaNum|Any|Blank|End|LineBreak|Num|NumAlpha|Punct|Space|Start|Symbol|Word|WordBreak)\b(?:\([a-zA-Z0-9\-.,\s+]*\))?/,
inside: {
"standard-pattern-name": {
pattern: /^[a-zA-Z0-9\-.]+/,
alias: "builtin"
},
"quantifier": {
pattern: /\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,
alias: "number"
},
"standard-pattern-attr": {
pattern: /[a-zA-Z0-9\-.]+/,
alias: "builtin"
},
"punctuation": /[,()]/
}
},
"quantifier": {
pattern: /\b\d+(?:\s*\+|\s*-\s*\d+)?(?!\w)/,
alias: "number"
},
"operator": [
{
pattern: /=/,
alias: "pattern-def"
},
{
pattern: /&/,
alias: "conjunction"
},
{
pattern: /~/,
alias: "exception"
},
{
pattern: /\?/,
alias: "optionality"
},
{
pattern: /[[\]]/,
alias: "repetition"
},
{
pattern: /[{}]/,
alias: "variation"
},
{
pattern: /[+_]/,
alias: "sequence"
},
{
pattern: /\.{2,3}/,
alias: "span"
}
],
"field-capture": [
{
pattern: /([a-zA-Z0-9\-.]+\s*\()\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+(?:\s*,\s*[a-zA-Z0-9\-.]+\s*:\s*[a-zA-Z0-9\-.]+)*(?=\s*\))/,
lookbehind: true,
inside: {
"field-name": {
pattern: /[a-zA-Z0-9\-.]+/,
alias: "variable"
},
"colon": /:/
}
},
{
pattern: /[a-zA-Z0-9\-.]+\s*:/,
inside: {
"field-name": {
pattern: /[a-zA-Z0-9\-.]+/,
alias: "variable"
},
"colon": /:/
}
}
],
"punctuation": /[:;,()]/,
"name": /[a-zA-Z0-9\-.]+/
};
(function(Prism2) {
var variable = /\$(?:\w[a-z\d]*(?:_[^\x00-\x1F\s"'\\()$]*)?|\{[^}\s"'\\]+\})/i;
Prism2.languages.nginx = {
"comment": {
pattern: /(^|[\s{};])#.*/,
lookbehind: true,
greedy: true
},
"directive": {
pattern: /(^|\s)\w(?:[^;{}"'\\\s]|\\.|"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\s+(?:#.*(?!.)|(?![#\s])))*?(?=\s*[;{])/,
lookbehind: true,
greedy: true,
inside: {
"string": {
pattern: /((?:^|[^\\])(?:\\\\)*)(?:"(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*')/,
lookbehind: true,
greedy: true,
inside: {
"escape": {
pattern: /\\["'\\nrt]/,
alias: "entity"
},
"variable": variable
}
},
"comment": {
pattern: /(\s)#.*/,
lookbehind: true,
greedy: true
},
"keyword": {
pattern: /^\S+/,
greedy: true
},
"boolean": {
pattern: /(\s)(?:off|on)(?!\S)/,
lookbehind: true
},
"number": {
pattern: /(\s)\d+[a-z]*(?!\S)/i,
lookbehind: true
},
"variable": variable
}
},
"punctuation": /[{};]/
};
})(Prism);
Prism.languages.nim = {
"comment": {
pattern: /#.*/,
greedy: true
},
"string": {
pattern: /(?:\b(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+)?(?:"""[\s\S]*?"""(?!")|"(?:\\[\s\S]|""|[^"\\])*")/,
greedy: true
},
"char": {
pattern: /'(?:\\(?:\d+|x[\da-fA-F]{0,2}|.)|[^'])'/,
greedy: true
},
"function": {
pattern: /(?:(?!\d)(?:\w|\\x[89a-fA-F][0-9a-fA-F])+|`[^`\r\n]+`)\*?(?:\[[^\]]+\])?(?=\s*\()/,
greedy: true,
inside: {
"operator": /\*$/
}
},
"identifier": {
pattern: /`[^`\r\n]+`/,
greedy: true,
inside: {
"punctuation": /`/
}
},
"number": /\b(?:0[xXoObB][\da-fA-F_]+|\d[\d_]*(?:(?!\.\.)\.[\d_]*)?(?:[eE][+-]?\d[\d_]*)?)(?:'?[iuf]\d*)?/,
"keyword": /\b(?:addr|as|asm|atomic|bind|block|break|case|cast|concept|const|continue|converter|defer|discard|distinct|do|elif|else|end|enum|except|export|finally|for|from|func|generic|if|import|include|interface|iterator|let|macro|method|mixin|nil|object|out|proc|ptr|raise|ref|return|static|template|try|tuple|type|using|var|when|while|with|without|yield)\b/,
"operator": {
pattern: /(^|[({\[](?=\.\.)|(?![({\[]\.).)(?:(?:[=+\-*\/<>@$~&%|!?^:\\]|\.\.|\.(?![)}\]]))+|\b(?:and|div|in|is|isnot|mod|not|notin|of|or|shl|shr|xor)\b)/m,
lookbehind: true
},
"punctuation": /[({\[]\.|\.[)}\]]|[`(){}\[\],:]/
};
Prism.languages.nix = {
"comment": {
pattern: /\/\*[\s\S]*?\*\/|#.*/,
greedy: true
},
"string": {
pattern: /"(?:[^"\\]|\\[\s\S])*"|''(?:(?!'')[\s\S]|''(?:'|\\|\$\{))*''/,
greedy: true,
inside: {
"interpolation": {
pattern: /(^|(?:^|(?!'').)[^\\])\$\{(?:[^{}]|\{[^}]*\})*\}/,
lookbehind: true,
inside: null
}
}
},
"url": [
/\b(?:[a-z]{3,7}:\/\/)[\w\-+%~\/.:#=?&]+/,
{
pattern: /([^\/])(?:[\w\-+%~.:#=?&]*(?!\/\/)[\w\-+%~\/.:#=?&])?(?!\/\/)\/[\w\-+%~\/.:#=?&]*/,
lookbehind: true
}
],
"antiquotation": {
pattern: /\$(?=\{)/,
alias: "important"
},
"number": /\b\d+\b/,
"keyword": /\b(?:assert|builtins|else|if|in|inherit|let|null|or|then|with)\b/,
"function": /\b(?:abort|add|all|any|attrNames|attrValues|baseNameOf|compareVersions|concatLists|currentSystem|deepSeq|derivation|dirOf|div|elem(?:At)?|fetch(?:Tarball|url)|filter(?:Source)?|fromJSON|genList|getAttr|getEnv|hasAttr|hashString|head|import|intersectAttrs|is(?:Attrs|Bool|Function|Int|List|Null|String)|length|lessThan|listToAttrs|map|mul|parseDrvName|pathExists|read(?:Dir|File)|removeAttrs|replaceStrings|seq|sort|stringLength|sub(?:string)?|tail|throw|to(?:File|JSON|Path|String|XML)|trace|typeOf)\b|\bfoldl'\B/,
"boolean": /\b(?:false|true)\b/,
"operator": /[=!<>]=?|\+\+?|\|\||&&|\/\/|->?|[?@]/,
"punctuation": /[{}()[\].,:;]/
};
Prism.languages.nix.string.inside.interpolation.inside = Prism.languages.nix;
Prism.languages.nsis = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|[#;].*)/,
lookbehind: true,
greedy: true
},
"string": {
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"keyword": {
pattern: /(^[\t ]*)(?:Abort|Add(?:BrandingImage|Size)|AdvSplash|Allow(?:RootDirInstall|SkipFiles)|AutoCloseWindow|BG(?:Font|Gradient|Image)|Banner|BrandingText|BringToFront|CRCCheck|Call(?:InstDLL)?|Caption|ChangeUI|CheckBitmap|ClearErrors|CompletedText|ComponentText|CopyFiles|Create(?:Directory|Font|ShortCut)|Delete(?:INISec|INIStr|RegKey|RegValue)?|Detail(?:Print|sButtonText)|Dialer|Dir(?:Text|Var|Verify)|EnableWindow|Enum(?:RegKey|RegValue)|Exch|Exec(?:Shell(?:Wait)?|Wait)?|ExpandEnvStrings|File(?:BufSize|Close|ErrorText|Open|Read|ReadByte|ReadUTF16LE|ReadWord|Seek|Write|WriteByte|WriteUTF16LE|WriteWord)?|Find(?:Close|First|Next|Window)|FlushINI|Get(?:CurInstType|CurrentAddress|DLLVersion(?:Local)?|DlgItem|ErrorLevel|FileTime(?:Local)?|FullPathName|Function(?:Address|End)?|InstDirError|LabelAddress|TempFileName)|Goto|HideWindow|Icon|If(?:Abort|Errors|FileExists|RebootFlag|Silent)|InitPluginsDir|InstProgressFlags|Inst(?:Type(?:GetText|SetText)?)|Install(?:ButtonText|Colors|Dir(?:RegKey)?)|Int(?:64|Ptr)?CmpU?|Int(?:64)?Fmt|Int(?:Ptr)?Op|IsWindow|Lang(?:DLL|String)|License(?:BkColor|Data|ForceSelection|LangString|Text)|LoadLanguageFile|LockWindow|Log(?:Set|Text)|Manifest(?:DPIAware|SupportedOS)|Math|MessageBox|MiscButtonText|NSISdl|Name|Nop|OutFile|PE(?:DllCharacteristics|SubsysVer)|Page(?:Callbacks)?|Pop|Push|Quit|RMDir|Read(?:EnvStr|INIStr|RegDWORD|RegStr)|Reboot|RegDLL|Rename|RequestExecutionLevel|ReserveFile|Return|SearchPath|Section(?:End|GetFlags|GetInstTypes|GetSize|GetText|Group|In|SetFlags|SetInstTypes|SetSize|SetText)?|SendMessage|Set(?:AutoClose|BrandingImage|Compress|Compressor(?:DictSize)?|CtlColors|CurInstType|DatablockOptimize|DateSave|Details(?:Print|View)|ErrorLevel|Errors|FileAttributes|Font|OutPath|Overwrite|PluginUnload|RebootFlag|RegView|ShellVarContext|Silent)|Show(?:InstDetails|UninstDetails|Window)|Silent(?:Install|UnInstall)|Sleep|SpaceTexts|Splash|StartMenu|Str(?:CmpS?|Cpy|Len)|SubCaption|System|UnRegDLL|Unicode|UninstPage|Uninstall(?:ButtonText|Caption|Icon|SubCaption|Text)|UserInfo|VI(?:AddVersionKey|FileVersion|ProductVersion)|VPatch|Var|WindowIcon|Write(?:INIStr|Reg(?:Bin|DWORD|ExpandStr|MultiStr|None|Str)|Uninstaller)|XPStyle|ns(?:Dialogs|Exec))\b/m,
lookbehind: true
},
"property": /\b(?:ARCHIVE|FILE_(?:ATTRIBUTE_ARCHIVE|ATTRIBUTE_NORMAL|ATTRIBUTE_OFFLINE|ATTRIBUTE_READONLY|ATTRIBUTE_SYSTEM|ATTRIBUTE_TEMPORARY)|HK(?:(?:CR|CU|LM)(?:32|64)?|DD|PD|U)|HKEY_(?:CLASSES_ROOT|CURRENT_CONFIG|CURRENT_USER|DYN_DATA|LOCAL_MACHINE|PERFORMANCE_DATA|USERS)|ID(?:ABORT|CANCEL|IGNORE|NO|OK|RETRY|YES)|MB_(?:ABORTRETRYIGNORE|DEFBUTTON1|DEFBUTTON2|DEFBUTTON3|DEFBUTTON4|ICONEXCLAMATION|ICONINFORMATION|ICONQUESTION|ICONSTOP|OK|OKCANCEL|RETRYCANCEL|RIGHT|RTLREADING|SETFOREGROUND|TOPMOST|USERICON|YESNO)|NORMAL|OFFLINE|READONLY|SHCTX|SHELL_CONTEXT|SYSTEM|TEMPORARY|admin|all|auto|both|colored|false|force|hide|highest|lastused|leave|listonly|none|normal|notset|off|on|open|print|show|silent|silentlog|smooth|textonly|true|user)\b/,
"constant": /\$\{[!\w\.:\^-]+\}|\$\([!\w\.:\^-]+\)/,
"variable": /\$\w[\w\.]*/,
"number": /\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,
"operator": /--?|\+\+?|<=?|>=?|==?=?|&&?|\|\|?|[?*\/~^%]/,
"punctuation": /[{}[\];(),.:]/,
"important": {
pattern: /(^[\t ]*)!(?:addincludedir|addplugindir|appendfile|cd|define|delfile|echo|else|endif|error|execute|finalize|getdllversion|gettlbversion|if|ifdef|ifmacrodef|ifmacrondef|ifndef|include|insertmacro|macro|macroend|makensis|packhdr|pragma|searchparse|searchreplace|system|tempfile|undef|verbose|warning)\b/im,
lookbehind: true
}
};
Prism.languages.objectivec = Prism.languages.extend("c", {
"string": {
pattern: /@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
greedy: true
},
"keyword": /\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,
"operator": /-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/
});
delete Prism.languages.objectivec["class-name"];
Prism.languages.objc = Prism.languages.objectivec;
Prism.languages.ocaml = {
"comment": {
pattern: /\(\*[\s\S]*?\*\)/,
greedy: true
},
"char": {
pattern: /'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,
greedy: true
},
"string": [
{
pattern: /"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,
greedy: true
},
{
pattern: /\{([a-z_]*)\|[\s\S]*?\|\1\}/,
greedy: true
}
],
"number": [
/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,
/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,
/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i
],
"directive": {
pattern: /\B#\w+/,
alias: "property"
},
"label": {
pattern: /\B~\w+/,
alias: "property"
},
"type-variable": {
pattern: /\B'\w+/,
alias: "function"
},
"variant": {
pattern: /`\w+/,
alias: "symbol"
},
"keyword": /\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,
"boolean": /\b(?:false|true)\b/,
"operator-like-punctuation": {
pattern: /\[[<>|]|[>|]\]|\{<|>\}/,
alias: "punctuation"
},
"operator": /\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,
"punctuation": /;;|::|[(){}\[\].,:;#]|\b_\b/
};
(function(Prism2) {
var escapes = /\\(?:["'\\abefnrtv]|0[0-7]{2}|U[\dA-Fa-f]{6}|u[\dA-Fa-f]{4}|x[\dA-Fa-f]{2})/;
Prism2.languages.odin = {
"comment": [
{
pattern: /\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:\*(?!\/)|[^*])*(?:\*\/|$))*(?:\*\/|$)/,
greedy: true
},
{
pattern: /#![^\n\r]*/,
greedy: true
},
{
pattern: /\/\/[^\n\r]*/,
greedy: true
}
],
"char": {
pattern: /'(?:\\(?:.|[0Uux][0-9A-Fa-f]{1,6})|[^\n\r'\\])'/,
greedy: true,
inside: {
"symbol": escapes
}
},
"string": [
{
pattern: /`[^`]*`/,
greedy: true
},
{
pattern: /"(?:\\.|[^\n\r"\\])*"/,
greedy: true,
inside: {
"symbol": escapes
}
}
],
"directive": {
pattern: /#\w+/,
alias: "property"
},
"number": /\b0(?:b[01_]+|d[\d_]+|h_*(?:(?:(?:[\dA-Fa-f]_*){8}){1,2}|(?:[\dA-Fa-f]_*){4})|o[0-7_]+|x[\dA-F_a-f]+|z[\dAB_ab]+)\b|(?:\b\d+(?:\.(?!\.)\d*)?|\B\.\d+)(?:[Ee][+-]?\d*)?[ijk]?(?!\w)/,
"discard": {
pattern: /\b_\b/,
alias: "keyword"
},
"procedure-definition": {
pattern: /\b\w+(?=[ \t]*(?::\s*){2}proc\b)/,
alias: "function"
},
"keyword": /\b(?:asm|auto_cast|bit_set|break|case|cast|context|continue|defer|distinct|do|dynamic|else|enum|fallthrough|for|foreign|if|import|in|map|matrix|not_in|or_else|or_return|package|proc|return|struct|switch|transmute|typeid|union|using|when|where)\b/,
"procedure-name": {
pattern: /\b\w+(?=[ \t]*\()/,
alias: "function"
},
"boolean": /\b(?:false|nil|true)\b/,
"constant-parameter-sign": {
pattern: /\$/,
alias: "important"
},
"undefined": {
pattern: /---/,
alias: "operator"
},
"arrow": {
pattern: /->/,
alias: "punctuation"
},
"operator": /\+\+|--|\.\.[<=]?|(?:&~|[-!*+/=~]|[%&<>|]{1,2})=?|[?^]/,
"punctuation": /[(),.:;@\[\]{}]/
};
})(Prism);
(function(Prism2) {
Prism2.languages.opencl = Prism2.languages.extend("c", {
"keyword": /\b(?:(?:__)?(?:constant|global|kernel|local|private|read_only|read_write|write_only)|__attribute__|auto|(?:bool|u?(?:char|int|long|short)|half|quad)(?:2|3|4|8|16)?|break|case|complex|const|continue|(?:double|float)(?:16(?:x(?:1|2|4|8|16))?|1x(?:1|2|4|8|16)|2(?:x(?:1|2|4|8|16))?|3|4(?:x(?:1|2|4|8|16))?|8(?:x(?:1|2|4|8|16))?)?|default|do|else|enum|extern|for|goto|if|imaginary|inline|packed|pipe|register|restrict|return|signed|sizeof|static|struct|switch|typedef|uniform|union|unsigned|void|volatile|while)\b/,
"number": /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[fuhl]{0,4}/i,
"boolean": /\b(?:false|true)\b/,
"constant-opencl-kernel": {
pattern: /\b(?:CHAR_(?:BIT|MAX|MIN)|CLK_(?:ADDRESS_(?:CLAMP(?:_TO_EDGE)?|NONE|REPEAT)|FILTER_(?:LINEAR|NEAREST)|(?:GLOBAL|LOCAL)_MEM_FENCE|NORMALIZED_COORDS_(?:FALSE|TRUE))|CL_(?:BGRA|(?:HALF_)?FLOAT|INTENSITY|LUMINANCE|A?R?G?B?[Ax]?|(?:(?:UN)?SIGNED|[US]NORM)_(?:INT(?:8|16|32))|UNORM_(?:INT_101010|SHORT_(?:555|565)))|(?:DBL|FLT|HALF)_(?:DIG|EPSILON|(?:MAX|MIN)(?:(?:_10)?_EXP)?|MANT_DIG)|FLT_RADIX|HUGE_VALF?|(?:INT|LONG|SCHAR|SHRT)_(?:MAX|MIN)|INFINITY|MAXFLOAT|M_(?:[12]_PI|2_SQRTPI|E|LN(?:2|10)|LOG(?:2|10)E?|PI(?:_[24])?|SQRT(?:1_2|2))(?:_F|_H)?|NAN|(?:UCHAR|UINT|ULONG|USHRT)_MAX)\b/,
alias: "constant"
}
});
Prism2.languages.insertBefore("opencl", "class-name", {
"builtin-type": {
pattern: /\b(?:_cl_(?:command_queue|context|device_id|event|kernel|mem|platform_id|program|sampler)|cl_(?:image_format|mem_fence_flags)|clk_event_t|event_t|image(?:1d_(?:array_|buffer_)?t|2d_(?:array_(?:depth_|msaa_depth_|msaa_)?|depth_|msaa_depth_|msaa_)?t|3d_t)|intptr_t|ndrange_t|ptrdiff_t|queue_t|reserve_id_t|sampler_t|size_t|uintptr_t)\b/,
alias: "keyword"
}
});
var attributes = {
"type-opencl-host": {
pattern: /\b(?:cl_(?:GLenum|GLint|GLuin|addressing_mode|bitfield|bool|buffer_create_type|build_status|channel_(?:order|type)|(?:u?(?:char|int|long|short)|double|float)(?:2|3|4|8|16)?|command_(?:queue(?:_info|_properties)?|type)|context(?:_info|_properties)?|device_(?:exec_capabilities|fp_config|id|info|local_mem_type|mem_cache_type|type)|(?:event|sampler)(?:_info)?|filter_mode|half|image_info|kernel(?:_info|_work_group_info)?|map_flags|mem(?:_flags|_info|_object_type)?|platform_(?:id|info)|profiling_info|program(?:_build_info|_info)?))\b/,
alias: "keyword"
},
"boolean-opencl-host": {
pattern: /\bCL_(?:FALSE|TRUE)\b/,
alias: "boolean"
},
"constant-opencl-host": {
pattern: /\bCL_(?:A|ABGR|ADDRESS_(?:CLAMP(?:_TO_EDGE)?|MIRRORED_REPEAT|NONE|REPEAT)|ARGB|BGRA|BLOCKING|BUFFER_CREATE_TYPE_REGION|BUILD_(?:ERROR|IN_PROGRESS|NONE|PROGRAM_FAILURE|SUCCESS)|COMMAND_(?:ACQUIRE_GL_OBJECTS|BARRIER|COPY_(?:BUFFER(?:_RECT|_TO_IMAGE)?|IMAGE(?:_TO_BUFFER)?)|FILL_(?:BUFFER|IMAGE)|MAP(?:_BUFFER|_IMAGE)|MARKER|MIGRATE(?:_SVM)?_MEM_OBJECTS|NATIVE_KERNEL|NDRANGE_KERNEL|READ_(?:BUFFER(?:_RECT)?|IMAGE)|RELEASE_GL_OBJECTS|SVM_(?:FREE|MAP|MEMCPY|MEMFILL|UNMAP)|TASK|UNMAP_MEM_OBJECT|USER|WRITE_(?:BUFFER(?:_RECT)?|IMAGE))|COMPILER_NOT_AVAILABLE|COMPILE_PROGRAM_FAILURE|COMPLETE|CONTEXT_(?:DEVICES|INTEROP_USER_SYNC|NUM_DEVICES|PLATFORM|PROPERTIES|REFERENCE_COUNT)|DEPTH(?:_STENCIL)?|DEVICE_(?:ADDRESS_BITS|AFFINITY_DOMAIN_(?:L[1-4]_CACHE|NEXT_PARTITIONABLE|NUMA)|AVAILABLE|BUILT_IN_KERNELS|COMPILER_AVAILABLE|DOUBLE_FP_CONFIG|ENDIAN_LITTLE|ERROR_CORRECTION_SUPPORT|EXECUTION_CAPABILITIES|EXTENSIONS|GLOBAL_(?:MEM_(?:CACHELINE_SIZE|CACHE_SIZE|CACHE_TYPE|SIZE)|VARIABLE_PREFERRED_TOTAL_SIZE)|HOST_UNIFIED_MEMORY|IL_VERSION|IMAGE(?:2D_MAX_(?:HEIGHT|WIDTH)|3D_MAX_(?:DEPTH|HEIGHT|WIDTH)|_BASE_ADDRESS_ALIGNMENT|_MAX_ARRAY_SIZE|_MAX_BUFFER_SIZE|_PITCH_ALIGNMENT|_SUPPORT)|LINKER_AVAILABLE|LOCAL_MEM_SIZE|LOCAL_MEM_TYPE|MAX_(?:CLOCK_FREQUENCY|COMPUTE_UNITS|CONSTANT_ARGS|CONSTANT_BUFFER_SIZE|GLOBAL_VARIABLE_SIZE|MEM_ALLOC_SIZE|NUM_SUB_GROUPS|ON_DEVICE_(?:EVENTS|QUEUES)|PARAMETER_SIZE|PIPE_ARGS|READ_IMAGE_ARGS|READ_WRITE_IMAGE_ARGS|SAMPLERS|WORK_GROUP_SIZE|WORK_ITEM_DIMENSIONS|WORK_ITEM_SIZES|WRITE_IMAGE_ARGS)|MEM_BASE_ADDR_ALIGN|MIN_DATA_TYPE_ALIGN_SIZE|NAME|NATIVE_VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT)|NOT_(?:AVAILABLE|FOUND)|OPENCL_C_VERSION|PARENT_DEVICE|PARTITION_(?:AFFINITY_DOMAIN|BY_AFFINITY_DOMAIN|BY_COUNTS|BY_COUNTS_LIST_END|EQUALLY|FAILED|MAX_SUB_DEVICES|PROPERTIES|TYPE)|PIPE_MAX_(?:ACTIVE_RESERVATIONS|PACKET_SIZE)|PLATFORM|PREFERRED_(?:GLOBAL_ATOMIC_ALIGNMENT|INTEROP_USER_SYNC|LOCAL_ATOMIC_ALIGNMENT|PLATFORM_ATOMIC_ALIGNMENT|VECTOR_WIDTH_(?:CHAR|DOUBLE|FLOAT|HALF|INT|LONG|SHORT))|PRINTF_BUFFER_SIZE|PROFILE|PROFILING_TIMER_RESOLUTION|QUEUE_(?:ON_(?:DEVICE_(?:MAX_SIZE|PREFERRED_SIZE|PROPERTIES)|HOST_PROPERTIES)|PROPERTIES)|REFERENCE_COUNT|SINGLE_FP_CONFIG|SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS|SVM_(?:ATOMICS|CAPABILITIES|COARSE_GRAIN_BUFFER|FINE_GRAIN_BUFFER|FINE_GRAIN_SYSTEM)|TYPE(?:_ACCELERATOR|_ALL|_CPU|_CUSTOM|_DEFAULT|_GPU)?|VENDOR(?:_ID)?|VERSION)|DRIVER_VERSION|EVENT_(?:COMMAND_(?:EXECUTION_STATUS|QUEUE|TYPE)|CONTEXT|REFERENCE_COUNT)|EXEC_(?:KERNEL|NATIVE_KERNEL|STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST)|FILTER_(?:LINEAR|NEAREST)|FLOAT|FP_(?:CORRECTLY_ROUNDED_DIVIDE_SQRT|DENORM|FMA|INF_NAN|ROUND_TO_INF|ROUND_TO_NEAREST|ROUND_TO_ZERO|SOFT_FLOAT)|GLOBAL|HALF_FLOAT|IMAGE_(?:ARRAY_SIZE|BUFFER|DEPTH|ELEMENT_SIZE|FORMAT|FORMAT_MISMATCH|FORMAT_NOT_SUPPORTED|HEIGHT|NUM_MIP_LEVELS|NUM_SAMPLES|ROW_PITCH|SLICE_PITCH|WIDTH)|INTENSITY|INVALID_(?:ARG_INDEX|ARG_SIZE|ARG_VALUE|BINARY|BUFFER_SIZE|BUILD_OPTIONS|COMMAND_QUEUE|COMPILER_OPTIONS|CONTEXT|DEVICE|DEVICE_PARTITION_COUNT|DEVICE_QUEUE|DEVICE_TYPE|EVENT|EVENT_WAIT_LIST|GLOBAL_OFFSET|GLOBAL_WORK_SIZE|GL_OBJECT|HOST_PTR|IMAGE_DESCRIPTOR|IMAGE_FORMAT_DESCRIPTOR|IMAGE_SIZE|KERNEL|KERNEL_ARGS|KERNEL_DEFINITION|KERNEL_NAME|LINKER_OPTIONS|MEM_OBJECT|MIP_LEVEL|OPERATION|PIPE_SIZE|PLATFORM|PROGRAM|PROGRAM_EXECUTABLE|PROPERTY|QUEUE_PROPERTIES|SAMPLER|VALUE|WORK_DIMENSION|WORK_GROUP_SIZE|WORK_ITEM_SIZE)|KERNEL_(?:ARG_(?:ACCESS_(?:NONE|QUALIFIER|READ_ONLY|READ_WRITE|WRITE_ONLY)|ADDRESS_(?:CONSTANT|GLOBAL|LOCAL|PRIVATE|QUALIFIER)|INFO_NOT_AVAILABLE|NAME|TYPE_(?:CONST|NAME|NONE|PIPE|QUALIFIER|RESTRICT|VOLATILE))|ATTRIBUTES|COMPILE_NUM_SUB_GROUPS|COMPILE_WORK_GROUP_SIZE|CONTEXT|EXEC_INFO_SVM_FINE_GRAIN_SYSTEM|EXEC_INFO_SVM_PTRS|FUNCTION_NAME|GLOBAL_WORK_SIZE|LOCAL_MEM_SIZE|LOCAL_SIZE_FOR_SUB_GROUP_COUNT|MAX_NUM_SUB_GROUPS|MAX_SUB_GROUP_SIZE_FOR_NDRANGE|NUM_ARGS|PREFERRED_WORK_GROUP_SIZE_MULTIPLE|PRIVATE_MEM_SIZE|PROGRAM|REFERENCE_COUNT|SUB_GROUP_COUNT_FOR_NDRANGE|WORK_GROUP_SIZE)|LINKER_NOT_AVAILABLE|LINK_PROGRAM_FAILURE|LOCAL|LUMINANCE|MAP_(?:FAILURE|READ|WRITE|WRITE_INVALIDATE_REGION)|MEM_(?:ALLOC_HOST_PTR|ASSOCIATED_MEMOBJECT|CONTEXT|COPY_HOST_PTR|COPY_OVERLAP|FLAGS|HOST_NO_ACCESS|HOST_PTR|HOST_READ_ONLY|HOST_WRITE_ONLY|KERNEL_READ_AND_WRITE|MAP_COUNT|OBJECT_(?:ALLOCATION_FAILURE|BUFFER|IMAGE1D|IMAGE1D_ARRAY|IMAGE1D_BUFFER|IMAGE2D|IMAGE2D_ARRAY|IMAGE3D|PIPE)|OFFSET|READ_ONLY|READ_WRITE|REFERENCE_COUNT|SIZE|SVM_ATOMICS|SVM_FINE_GRAIN_BUFFER|TYPE|USES_SVM_POINTER|USE_HOST_PTR|WRITE_ONLY)|MIGRATE_MEM_OBJECT_(?:CONTENT_UNDEFINED|HOST)|MISALIGNED_SUB_BUFFER_OFFSET|NONE|NON_BLOCKING|OUT_OF_(?:HOST_MEMORY|RESOURCES)|PIPE_(?:MAX_PACKETS|PACKET_SIZE)|PLATFORM_(?:EXTENSIONS|HOST_TIMER_RESOLUTION|NAME|PROFILE|VENDOR|VERSION)|PROFILING_(?:COMMAND_(?:COMPLETE|END|QUEUED|START|SUBMIT)|INFO_NOT_AVAILABLE)|PROGRAM_(?:BINARIES|BINARY_SIZES|BINARY_TYPE(?:_COMPILED_OBJECT|_EXECUTABLE|_LIBRARY|_NONE)?|BUILD_(?:GLOBAL_VARIABLE_TOTAL_SIZE|LOG|OPTIONS|STATUS)|CONTEXT|DEVICES|IL|KERNEL_NAMES|NUM_DEVICES|NUM_KERNELS|REFERENCE_COUNT|SOURCE)|QUEUED|QUEUE_(?:CONTEXT|DEVICE|DEVICE_DEFAULT|ON_DEVICE|ON_DEVICE_DEFAULT|OUT_OF_ORDER_EXEC_MODE_ENABLE|PROFILING_ENABLE|PROPERTIES|REFERENCE_COUNT|SIZE)|R|RA|READ_(?:ONLY|WRITE)_CACHE|RG|RGB|RGBA|RGBx|RGx|RUNNING|Rx|SAMPLER_(?:ADDRESSING_MODE|CONTEXT|FILTER_MODE|LOD_MAX|LOD_MIN|MIP_FILTER_MODE|NORMALIZED_COORDS|REFERENCE_COUNT)|(?:UN)?SIGNED_INT(?:8|16|32)|SNORM_INT(?:8|16)|SUBMITTED|SUCCESS|UNORM_INT(?:8|16|24|_101010|_101010_2)|UNORM_SHORT_(?:555|565)|VERSION_(?:1_0|1_1|1_2|2_0|2_1)|sBGRA|sRGB|sRGBA|sRGBx)\b/,
alias: "constant"
},
"function-opencl-host": {
pattern: /\bcl(?:BuildProgram|CloneKernel|CompileProgram|Create(?:Buffer|CommandQueue(?:WithProperties)?|Context|ContextFromType|Image|Image2D|Image3D|Kernel|KernelsInProgram|Pipe|ProgramWith(?:Binary|BuiltInKernels|IL|Source)|Sampler|SamplerWithProperties|SubBuffer|SubDevices|UserEvent)|Enqueue(?:(?:Barrier|Marker)(?:WithWaitList)?|Copy(?:Buffer(?:Rect|ToImage)?|Image(?:ToBuffer)?)|(?:Fill|Map)(?:Buffer|Image)|MigrateMemObjects|NDRangeKernel|NativeKernel|(?:Read|Write)(?:Buffer(?:Rect)?|Image)|SVM(?:Free|Map|MemFill|Memcpy|MigrateMem|Unmap)|Task|UnmapMemObject|WaitForEvents)|Finish|Flush|Get(?:CommandQueueInfo|ContextInfo|Device(?:AndHostTimer|IDs|Info)|Event(?:Profiling)?Info|ExtensionFunctionAddress(?:ForPlatform)?|HostTimer|ImageInfo|Kernel(?:ArgInfo|Info|SubGroupInfo|WorkGroupInfo)|MemObjectInfo|PipeInfo|Platform(?:IDs|Info)|Program(?:Build)?Info|SamplerInfo|SupportedImageFormats)|LinkProgram|(?:Release|Retain)(?:CommandQueue|Context|Device|Event|Kernel|MemObject|Program|Sampler)|SVM(?:Alloc|Free)|Set(?:CommandQueueProperty|DefaultDeviceCommandQueue|EventCallback|Kernel|Kernel(?:Arg(?:SVMPointer)?|ExecInfo)|MemObjectDestructorCallback|UserEventStatus)|Unload(?:Platform)?Compiler|WaitForEvents)\b/,
alias: "function"
}
};
Prism2.languages.insertBefore("c", "keyword", attributes);
if (Prism2.languages.cpp) {
attributes["type-opencl-host-cpp"] = {
pattern: /\b(?:Buffer|BufferGL|BufferRenderGL|CommandQueue|Context|Device|DeviceCommandQueue|EnqueueArgs|Event|Image|Image1D|Image1DArray|Image1DBuffer|Image2D|Image2DArray|Image2DGL|Image3D|Image3DGL|ImageFormat|ImageGL|Kernel|KernelFunctor|LocalSpaceArg|Memory|NDRange|Pipe|Platform|Program|SVMAllocator|SVMTraitAtomic|SVMTraitCoarse|SVMTraitFine|SVMTraitReadOnly|SVMTraitReadWrite|SVMTraitWriteOnly|Sampler|UserEvent)\b/,
alias: "keyword"
};
Prism2.languages.insertBefore("cpp", "keyword", attributes);
}
})(Prism);
Prism.languages.openqasm = {
"comment": /\/\*[\s\S]*?\*\/|\/\/.*/,
"string": {
pattern: /"[^"\r\n\t]*"|'[^'\r\n\t]*'/,
greedy: true
},
"keyword": /\b(?:CX|OPENQASM|U|barrier|boxas|boxto|break|const|continue|ctrl|def|defcal|defcalgrammar|delay|else|end|for|gate|gphase|if|in|include|inv|kernel|lengthof|let|measure|pow|reset|return|rotary|stretchinf|while)\b|#pragma\b/,
"class-name": /\b(?:angle|bit|bool|creg|fixed|float|int|length|qreg|qubit|stretch|uint)\b/,
"function": /\b(?:cos|exp|ln|popcount|rotl|rotr|sin|sqrt|tan)\b(?=\s*\()/,
"constant": /\b(?:euler|pi|tau)\b|π|𝜏|ℇ/,
"number": {
pattern: /(^|[^.\w$])(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?(?:dt|ns|us|µs|ms|s)?/i,
lookbehind: true
},
"operator": /->|>>=?|<<=?|&&|\|\||\+\+|--|[!=<>&|~^+\-*/%]=?|@/,
"punctuation": /[(){}\[\];,:.]/
};
Prism.languages.qasm = Prism.languages.openqasm;
Prism.languages.oz = {
"comment": {
pattern: /\/\*[\s\S]*?\*\/|%.*/,
greedy: true
},
"string": {
pattern: /"(?:[^"\\]|\\[\s\S])*"/,
greedy: true
},
"atom": {
pattern: /'(?:[^'\\]|\\[\s\S])*'/,
greedy: true,
alias: "builtin"
},
"keyword": /\$|\[\]|\b(?:_|at|attr|case|catch|choice|class|cond|declare|define|dis|else(?:case|if)?|end|export|fail|false|feat|finally|from|fun|functor|if|import|in|local|lock|meth|nil|not|of|or|prepare|proc|prop|raise|require|self|skip|then|thread|true|try|unit)\b/,
"function": [
/\b[a-z][A-Za-z\d]*(?=\()/,
{
pattern: /(\{)[A-Z][A-Za-z\d]*\b/,
lookbehind: true
}
],
"number": /\b(?:0[bx][\da-f]+|\d+(?:\.\d*)?(?:e~?\d+)?)\b|&(?:[^\\]|\\(?:\d{3}|.))/i,
"variable": /`(?:[^`\\]|\\.)+`/,
"attr-name": /\b\w+(?=[ \t]*:(?![:=]))/,
"operator": /:(?:=|::?)|<[-:=]?|=(?:=|<?:?)|>=?:?|\\=:?|!!?|[|#+\-*\/,~^@]|\b(?:andthen|div|mod|orelse)\b/,
"punctuation": /[\[\](){}.:;?]/
};
Prism.languages.parigp = {
"comment": /\/\*[\s\S]*?\*\/|\\\\.*/,
"string": {
pattern: /"(?:[^"\\\r\n]|\\.)*"/,
greedy: true
},
"keyword": function() {
var keywords = [
"breakpoint",
"break",
"dbg_down",
"dbg_err",
"dbg_up",
"dbg_x",
"forcomposite",
"fordiv",
"forell",
"forpart",
"forprime",
"forstep",
"forsubgroup",
"forvec",
"for",
"iferr",
"if",
"local",
"my",
"next",
"return",
"until",
"while"
];
keywords = keywords.map(function(keyword) {
return keyword.split("").join(" *");
}).join("|");
return RegExp("\\b(?:" + keywords + ")\\b");
}(),
"function": /\b\w(?:[\w ]*\w)?(?= *\()/,
"number": {
pattern: /((?:\. *\. *)?)(?:\b\d(?: *\d)*(?: *(?!\. *\.)\.(?: *\d)*)?|\. *\d(?: *\d)*)(?: *e *(?:[+-] *)?\d(?: *\d)*)?/i,
lookbehind: true
},
"operator": /\. *\.|[*\/!](?: *=)?|%(?: *=|(?: *#)?(?: *')*)?|\+(?: *[+=])?|-(?: *[-=>])?|<(?: *>|(?: *<)?(?: *=)?)?|>(?: *>)?(?: *=)?|=(?: *=){0,2}|\\(?: *\/)?(?: *=)?|&(?: *&)?|\| *\||['#~^]/,
"punctuation": /[\[\]{}().,:;|]/
};
(function(Prism2) {
var parser = Prism2.languages.parser = Prism2.languages.extend("markup", {
"keyword": {
pattern: /(^|[^^])(?:\^(?:case|eval|for|if|switch|throw)\b|@(?:BASE|CLASS|GET(?:_DEFAULT)?|OPTIONS|SET_DEFAULT|USE)\b)/,
lookbehind: true
},
"variable": {
pattern: /(^|[^^])\B\$(?:\w+|(?=[.{]))(?:(?:\.|::?)\w+)*(?:\.|::?)?/,
lookbehind: true,
inside: {
"punctuation": /\.|:+/
}
},
"function": {
pattern: /(^|[^^])\B[@^]\w+(?:(?:\.|::?)\w+)*(?:\.|::?)?/,
lookbehind: true,
inside: {
"keyword": {
pattern: /(^@)(?:GET_|SET_)/,
lookbehind: true
},
"punctuation": /\.|:+/
}
},
"escape": {
pattern: /\^(?:[$^;@()\[\]{}"':]|#[a-f\d]*)/i,
alias: "builtin"
},
"punctuation": /[\[\](){};]/
});
parser = Prism2.languages.insertBefore("parser", "keyword", {
"parser-comment": {
pattern: /(\s)#.*/,
lookbehind: true,
alias: "comment"
},
"expression": {
pattern: /(^|[^^])\((?:[^()]|\((?:[^()]|\((?:[^()])*\))*\))*\)/,
greedy: true,
lookbehind: true,
inside: {
"string": {
pattern: /(^|[^^])(["'])(?:(?!\2)[^^]|\^[\s\S])*\2/,
lookbehind: true
},
"keyword": parser.keyword,
"variable": parser.variable,
"function": parser.function,
"boolean": /\b(?:false|true)\b/,
"number": /\b(?:0x[a-f\d]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?)\b/i,
"escape": parser.escape,
"operator": /[~+*\/\\%]|!(?:\|\|?|=)?|&&?|\|\|?|==|<[<=]?|>[>=]?|-[fd]?|\b(?:def|eq|ge|gt|in|is|le|lt|ne)\b/,
"punctuation": parser.punctuation
}
}
});
Prism2.languages.insertBefore("inside", "punctuation", {
"expression": parser.expression,
"keyword": parser.keyword,
"variable": parser.variable,
"function": parser.function,
"escape": parser.escape,
"parser-punctuation": {
pattern: parser.punctuation,
alias: "punctuation"
}
}, parser["tag"].inside["attr-value"]);
})(Prism);
Prism.languages.pascal = {
"directive": {
pattern: /\{\$[\s\S]*?\}/,
greedy: true,
alias: ["marco", "property"]
},
"comment": {
pattern: /\(\*[\s\S]*?\*\)|\{[\s\S]*?\}|\/\/.*/,
greedy: true
},
"string": {
pattern: /(?:'(?:''|[^'\r\n])*'(?!')|#[&$%]?[a-f\d]+)+|\^[a-z]/i,
greedy: true
},
"asm": {
pattern: /(\basm\b)[\s\S]+?(?=\bend\s*[;[])/i,
lookbehind: true,
greedy: true,
inside: null
},
"keyword": [
{
pattern: /(^|[^&])\b(?:absolute|array|asm|begin|case|const|constructor|destructor|do|downto|else|end|file|for|function|goto|if|implementation|inherited|inline|interface|label|nil|object|of|operator|packed|procedure|program|record|reintroduce|repeat|self|set|string|then|to|type|unit|until|uses|var|while|with)\b/i,
lookbehind: true
},
{
pattern: /(^|[^&])\b(?:dispose|exit|false|new|true)\b/i,
lookbehind: true
},
{
pattern: /(^|[^&])\b(?:class|dispinterface|except|exports|finalization|finally|initialization|inline|library|on|out|packed|property|raise|resourcestring|threadvar|try)\b/i,
lookbehind: true
},
{
pattern: /(^|[^&])\b(?:absolute|abstract|alias|assembler|bitpacked|break|cdecl|continue|cppdecl|cvar|default|deprecated|dynamic|enumerator|experimental|export|external|far|far16|forward|generic|helper|implements|index|interrupt|iochecks|local|message|name|near|nodefault|noreturn|nostackframe|oldfpccall|otherwise|overload|override|pascal|platform|private|protected|public|published|read|register|reintroduce|result|safecall|saveregisters|softfloat|specialize|static|stdcall|stored|strict|unaligned|unimplemented|varargs|virtual|write)\b/i,
lookbehind: true
}
],
"number": [
/(?:[&%]\d+|\$[a-f\d]+)/i,
/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?/i
],
"operator": [
/\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=]/,
{
pattern: /(^|[^&])\b(?:and|as|div|exclude|in|include|is|mod|not|or|shl|shr|xor)\b/,
lookbehind: true
}
],
"punctuation": /\(\.|\.\)|[()\[\]:;,.]/
};
Prism.languages.pascal.asm.inside = Prism.languages.extend("pascal", {
"asm": void 0,
"keyword": void 0,
"operator": void 0
});
Prism.languages.objectpascal = Prism.languages.pascal;
(function(Prism2) {
var braces = /\((?:[^()]|\((?:[^()]|\([^()]*\))*\))*\)/.source;
var type = /(?:\b\w+(?:<braces>)?|<braces>)/.source.replace(/<braces>/g, function() {
return braces;
});
var pascaligo = Prism2.languages.pascaligo = {
"comment": /\(\*[\s\S]+?\*\)|\/\/.*/,
"string": {
pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1|\^[a-z]/i,
greedy: true
},
"class-name": [
{
pattern: RegExp(/(\btype\s+\w+\s+is\s+)<type>/.source.replace(/<type>/g, function() {
return type;
}), "i"),
lookbehind: true,
inside: null
},
{
pattern: RegExp(/<type>(?=\s+is\b)/.source.replace(/<type>/g, function() {
return type;
}), "i"),
inside: null
},
{
pattern: RegExp(/(:\s*)<type>/.source.replace(/<type>/g, function() {
return type;
})),
lookbehind: true,
inside: null
}
],
"keyword": {
pattern: /(^|[^&])\b(?:begin|block|case|const|else|end|fail|for|from|function|if|is|nil|of|remove|return|skip|then|type|var|while|with)\b/i,
lookbehind: true
},
"boolean": {
pattern: /(^|[^&])\b(?:False|True)\b/i,
lookbehind: true
},
"builtin": {
pattern: /(^|[^&])\b(?:bool|int|list|map|nat|record|string|unit)\b/i,
lookbehind: true
},
"function": /\b\w+(?=\s*\()/,
"number": [
/%[01]+|&[0-7]+|\$[a-f\d]+/i,
/\b\d+(?:\.\d+)?(?:e[+-]?\d+)?(?:mtz|n)?/i
],
"operator": /->|=\/=|\.\.|\*\*|:=|<[<=>]?|>[>=]?|[+\-*\/]=?|[@^=|]|\b(?:and|mod|or)\b/,
"punctuation": /\(\.|\.\)|[()\[\]:;,.{}]/
};
var classNameInside = ["comment", "keyword", "builtin", "operator", "punctuation"].reduce(function(accum, key) {
accum[key] = pascaligo[key];
return accum;
}, {});
pascaligo["class-name"].forEach(function(p) {
p.inside = classNameInside;
});
})(Prism);
Prism.languages.psl = {
"comment": {
pattern: /#.*/,
greedy: true
},
"string": {
pattern: /"(?:\\.|[^\\"])*"/,
greedy: true,
inside: {
"symbol": /\\[ntrbA-Z"\\]/
}
},
"heredoc-string": {
pattern: /<<<([a-zA-Z_]\w*)[\r\n](?:.*[\r\n])*?\1\b/,
alias: "string",
greedy: true
},
"keyword": /\b(?:__multi|__single|case|default|do|else|elsif|exit|export|for|foreach|function|if|last|line|local|next|requires|return|switch|until|while|word)\b/,
"constant": /\b(?:ALARM|CHART_ADD_GRAPH|CHART_DELETE_GRAPH|CHART_DESTROY|CHART_LOAD|CHART_PRINT|EOF|OFFLINE|OK|PSL_PROF_LOG|R_CHECK_HORIZ|R_CHECK_VERT|R_CLICKER|R_COLUMN|R_FRAME|R_ICON|R_LABEL|R_LABEL_CENTER|R_LIST_MULTIPLE|R_LIST_MULTIPLE_ND|R_LIST_SINGLE|R_LIST_SINGLE_ND|R_MENU|R_POPUP|R_POPUP_SCROLLED|R_RADIO_HORIZ|R_RADIO_VERT|R_ROW|R_SCALE_HORIZ|R_SCALE_VERT|R_SEP_HORIZ|R_SEP_VERT|R_SPINNER|R_TEXT_FIELD|R_TEXT_FIELD_LABEL|R_TOGGLE|TRIM_LEADING|TRIM_LEADING_AND_TRAILING|TRIM_REDUNDANT|TRIM_TRAILING|VOID|WARN)\b/,
"boolean": /\b(?:FALSE|False|NO|No|TRUE|True|YES|Yes|false|no|true|yes)\b/,
"variable": /\b(?:PslDebug|errno|exit_status)\b/,
"builtin": {
pattern: /\b(?:PslExecute|PslFunctionCall|PslFunctionExists|PslSetOptions|_snmp_debug|acos|add_diary|annotate|annotate_get|ascii_to_ebcdic|asctime|asin|atan|atexit|batch_set|blackout|cat|ceil|chan_exists|change_state|close|code_cvt|cond_signal|cond_wait|console_type|convert_base|convert_date|convert_locale_date|cos|cosh|create|date|dcget_text|destroy|destroy_lock|dget_text|difference|dump_hist|ebcdic_to_ascii|encrypt|event_archive|event_catalog_get|event_check|event_query|event_range_manage|event_range_query|event_report|event_schedule|event_trigger|event_trigger2|execute|exists|exp|fabs|file|floor|fmod|fopen|fseek|ftell|full_discovery|get|get_chan_info|get_ranges|get_text|get_vars|getenv|gethostinfo|getpid|getpname|grep|history|history_get_retention|in_transition|index|int|internal|intersection|is_var|isnumber|join|kill|length|lines|lock|lock_info|log|log10|loge|matchline|msg_check|msg_get_format|msg_get_severity|msg_printf|msg_sprintf|ntharg|nthargf|nthline|nthlinef|num_bytes|num_consoles|pconfig|popen|poplines|pow|print|printf|proc_exists|process|random|read|readln|refresh_parameters|remote_check|remote_close|remote_event_query|remote_event_trigger|remote_file_send|remote_open|remove|replace|rindex|sec_check_priv|sec_store_get|sec_store_set|set|set_alarm_ranges|set_locale|share|sin|sinh|sleep|snmp_agent_config|snmp_agent_start|snmp_agent_stop|snmp_close|snmp_config|snmp_get|snmp_get_next|snmp_h_get|snmp_h_get_next|snmp_h_set|snmp_open|snmp_set|snmp_trap_ignore|snmp_trap_listen|snmp_trap_raise_std_trap|snmp_trap_receive|snmp_trap_register_im|snmp_trap_send|snmp_walk|sopen|sort|splitline|sprintf|sqrt|srandom|str_repeat|strcasecmp|subset|substr|system|tail|tan|tanh|text_domain|time|tmpnam|tolower|toupper|trace_psl_process|trim|union|unique|unlock|unset|va_arg|va_start|write)\b/,
alias: "builtin-function"
},
"foreach-variable": {
pattern: /(\bforeach\s+(?:(?:\w+\b|"(?:\\.|[^\\"])*")\s+){0,2})[_a-zA-Z]\w*(?=\s*\()/,
lookbehind: true,
greedy: true
},
"function": /\b[_a-z]\w*\b(?=\s*\()/i,
"number": /\b(?:0x[0-9a-f]+|\d+(?:\.\d+)?)\b/i,
"operator": /--|\+\+|&&=?|\|\|=?|<<=?|>>=?|[=!]~|[-+*/%&|^!=<>]=?|\.|[:?]/,
"punctuation": /[(){}\[\];,]/
};
Prism.languages.pcaxis = {
"string": /"[^"]*"/,
"keyword": {
pattern: /((?:^|;)\s*)[-A-Z\d]+(?:\s*\[[-\w]+\])?(?:\s*\("[^"]*"(?:,\s*"[^"]*")*\))?(?=\s*=)/,
lookbehind: true,
greedy: true,
inside: {
"keyword": /^[-A-Z\d]+/,
"language": {
pattern: /^(\s*)\[[-\w]+\]/,
lookbehind: true,
inside: {
"punctuation": /^\[|\]$/,
"property": /[-\w]+/
}
},
"sub-key": {
pattern: /^(\s*)\S[\s\S]*/,
lookbehind: true,
inside: {
"parameter": {
pattern: /"[^"]*"/,
alias: "property"
},
"punctuation": /^\(|\)$|,/
}
}
}
},
"operator": /=/,
"tlist": {
pattern: /TLIST\s*\(\s*\w+(?:(?:\s*,\s*"[^"]*")+|\s*,\s*"[^"]*"-"[^"]*")?\s*\)/,
greedy: true,
inside: {
"function": /^TLIST/,
"property": {
pattern: /^(\s*\(\s*)\w+/,
lookbehind: true
},
"string": /"[^"]*"/,
"punctuation": /[(),]/,
"operator": /-/
}
},
"punctuation": /[;,]/,
"number": {
pattern: /(^|\s)\d+(?:\.\d+)?(?!\S)/,
lookbehind: true
},
"boolean": /NO|YES/
};
Prism.languages.px = Prism.languages.pcaxis;
Prism.languages.peoplecode = {
"comment": RegExp([
/\/\*[\s\S]*?\*\//.source,
/\bREM[^;]*;/.source,
/<\*(?:[^<*]|\*(?!>)|<(?!\*)|<\*(?:(?!\*>)[\s\S])*\*>)*\*>/.source,
/\/\+[\s\S]*?\+\//.source
].join("|")),
"string": {
pattern: /'(?:''|[^'\r\n])*'(?!')|"(?:""|[^"\r\n])*"(?!")/,
greedy: true
},
"variable": /%\w+/,
"function-definition": {
pattern: /((?:^|[^\w-])(?:function|method)\s+)\w+/i,
lookbehind: true,
alias: "function"
},
"class-name": {
pattern: /((?:^|[^-\w])(?:as|catch|class|component|create|extends|global|implements|instance|local|of|property|returns)\s+)\w+(?::\w+)*/i,
lookbehind: true,
inside: {
"punctuation": /:/
}
},
"keyword": /\b(?:abstract|alias|as|catch|class|component|constant|create|declare|else|end-(?:class|evaluate|for|function|get|if|method|set|try|while)|evaluate|extends|for|function|get|global|if|implements|import|instance|library|local|method|null|of|out|peopleCode|private|program|property|protected|readonly|ref|repeat|returns?|set|step|then|throw|to|try|until|value|when(?:-other)?|while)\b/i,
"operator-keyword": {
pattern: /\b(?:and|not|or)\b/i,
alias: "operator"
},
"function": /[_a-z]\w*(?=\s*\()/i,
"boolean": /\b(?:false|true)\b/i,
"number": /\b\d+(?:\.\d+)?\b/,
"operator": /<>|[<>]=?|!=|\*\*|[-+*/|=@]/,
"punctuation": /[:.;,()[\]]/
};
Prism.languages.pcode = Prism.languages.peoplecode;
(function(Prism2) {
var brackets = /(?:\((?:[^()\\]|\\[\s\S])*\)|\{(?:[^{}\\]|\\[\s\S])*\}|\[(?:[^[\]\\]|\\[\s\S])*\]|<(?:[^<>\\]|\\[\s\S])*>)/.source;
Prism2.languages.perl = {
"comment": [
{
pattern: /(^\s*)=\w[\s\S]*?=cut.*/m,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\$])#.*/,
lookbehind: true,
greedy: true
}
],
"string": [
{
pattern: RegExp(
/\b(?:q|qq|qw|qx)(?![a-zA-Z0-9])\s*/.source + "(?:" + [
/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,
/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,
brackets
].join("|") + ")"
),
greedy: true
},
{
pattern: /("|`)(?:(?!\1)[^\\]|\\[\s\S])*\1/,
greedy: true
},
{
pattern: /'(?:[^'\\\r\n]|\\.)*'/,
greedy: true
}
],
"regex": [
{
pattern: RegExp(
/\b(?:m|qr)(?![a-zA-Z0-9])\s*/.source + "(?:" + [
/([^a-zA-Z0-9\s{(\[<])(?:(?!\1)[^\\]|\\[\s\S])*\1/.source,
/([a-zA-Z0-9])(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,
brackets
].join("|") + ")" + /[msixpodualngc]*/.source
),
greedy: true
},
{
pattern: RegExp(
/(^|[^-])\b(?:s|tr|y)(?![a-zA-Z0-9])\s*/.source + "(?:" + [
/([^a-zA-Z0-9\s{(\[<])(?:(?!\2)[^\\]|\\[\s\S])*\2(?:(?!\2)[^\\]|\\[\s\S])*\2/.source,
/([a-zA-Z0-9])(?:(?!\3)[^\\]|\\[\s\S])*\3(?:(?!\3)[^\\]|\\[\s\S])*\3/.source,
brackets + /\s*/.source + brackets
].join("|") + ")" + /[msixpodualngcer]*/.source
),
lookbehind: true,
greedy: true
},
{
pattern: /\/(?:[^\/\\\r\n]|\\.)*\/[msixpodualngc]*(?=\s*(?:$|[\r\n,.;})&|\-+*~<>!?^]|(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|x|xor)\b))/,
greedy: true
}
],
"variable": [
/[&*$@%]\{\^[A-Z]+\}/,
/[&*$@%]\^[A-Z_]/,
/[&*$@%]#?(?=\{)/,
/[&*$@%]#?(?:(?:::)*'?(?!\d)[\w$]+(?![\w$]))+(?:::)*/,
/[&*$@%]\d+/,
/(?!%=)[$@%][!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~]/
],
"filehandle": {
pattern: /<(?![<=])\S*?>|\b_\b/,
alias: "symbol"
},
"v-string": {
pattern: /v\d+(?:\.\d+)*|\d+(?:\.\d+){2,}/,
alias: "string"
},
"function": {
pattern: /(\bsub[ \t]+)\w+/,
lookbehind: true
},
"keyword": /\b(?:any|break|continue|default|delete|die|do|else|elsif|eval|for|foreach|given|goto|if|last|local|my|next|our|package|print|redo|require|return|say|state|sub|switch|undef|unless|until|use|when|while)\b/,
"number": /\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)\b/,
"operator": /-[rwxoRWXOezsfdlpSbctugkTBMAC]\b|\+[+=]?|-[-=>]?|\*\*?=?|\/\/?=?|=[=~>]?|~[~=]?|\|\|?=?|&&?=?|<(?:=>?|<=?)?|>>?=?|![~=]?|[%^]=?|\.(?:=|\.\.?)?|[\\?]|\bx(?:=|\b)|\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\b/,
"punctuation": /[{}[\];(),:]/
};
})(Prism);
(function(Prism2) {
var typeExpression = /(?:\b[a-zA-Z]\w*|[|\\[\]])+/.source;
Prism2.languages.phpdoc = Prism2.languages.extend("javadoclike", {
"parameter": {
pattern: RegExp("(@(?:global|param|property(?:-read|-write)?|var)\\s+(?:" + typeExpression + "\\s+)?)\\$\\w+"),
lookbehind: true
}
});
Prism2.languages.insertBefore("phpdoc", "keyword", {
"class-name": [
{
pattern: RegExp("(@(?:global|package|param|property(?:-read|-write)?|return|subpackage|throws|var)\\s+)" + typeExpression),
lookbehind: true,
inside: {
"keyword": /\b(?:array|bool|boolean|callback|double|false|float|int|integer|mixed|null|object|resource|self|string|true|void)\b/,
"punctuation": /[|\\[\]()]/
}
}
]
});
Prism2.languages.javadoclike.addSupport("php", Prism2.languages.phpdoc);
})(Prism);
Prism.languages.insertBefore("php", "variable", {
"this": {
pattern: /\$this\b/,
alias: "keyword"
},
"global": /\$(?:GLOBALS|HTTP_RAW_POST_DATA|_(?:COOKIE|ENV|FILES|GET|POST|REQUEST|SERVER|SESSION)|argc|argv|http_response_header|php_errormsg)\b/,
"scope": {
pattern: /\b[\w\\]+::/,
inside: {
"keyword": /\b(?:parent|self|static)\b/,
"punctuation": /::|\\/
}
}
});
(function(Prism2) {
var variable = /\$\w+|%[a-z]+%/;
var arrowAttr = /\[[^[\]]*\]/.source;
var arrowDirection = /(?:[drlu]|do|down|le|left|ri|right|up)/.source;
var arrowBody = "(?:-+" + arrowDirection + "-+|\\.+" + arrowDirection + "\\.+|-+(?:" + arrowAttr + "-*)?|" + arrowAttr + "-+|\\.+(?:" + arrowAttr + "\\.*)?|" + arrowAttr + "\\.+)";
var arrowLeft = /(?:<{1,2}|\/{1,2}|\\{1,2}|<\||[#*^+}xo])/.source;
var arrowRight = /(?:>{1,2}|\/{1,2}|\\{1,2}|\|>|[#*^+{xo])/.source;
var arrowPrefix = /[[?]?[ox]?/.source;
var arrowSuffix = /[ox]?[\]?]?/.source;
var arrow2 = arrowPrefix + "(?:" + arrowBody + arrowRight + "|" + arrowLeft + arrowBody + "(?:" + arrowRight + ")?)" + arrowSuffix;
Prism2.languages["plant-uml"] = {
"comment": {
pattern: /(^[ \t]*)(?:'.*|\/'[\s\S]*?'\/)/m,
lookbehind: true,
greedy: true
},
"preprocessor": {
pattern: /(^[ \t]*)!.*/m,
lookbehind: true,
greedy: true,
alias: "property",
inside: {
"variable": variable
}
},
"delimiter": {
pattern: /(^[ \t]*)@(?:end|start)uml\b/m,
lookbehind: true,
greedy: true,
alias: "punctuation"
},
"arrow": {
pattern: RegExp(/(^|[^-.<>?|\\[\]ox])/.source + arrow2 + /(?![-.<>?|\\\]ox])/.source),
lookbehind: true,
greedy: true,
alias: "operator",
inside: {
"expression": {
pattern: /(\[)[^[\]]+(?=\])/,
lookbehind: true,
inside: null
},
"punctuation": /\[(?=$|\])|^\]/
}
},
"string": {
pattern: /"[^"]*"/,
greedy: true
},
"text": {
pattern: /(\[[ \t]*[\r\n]+(?![\r\n]))[^\]]*(?=\])/,
lookbehind: true,
greedy: true,
alias: "string"
},
"keyword": [
{
pattern: /^([ \t]*)(?:abstract\s+class|end\s+(?:box|fork|group|merge|note|ref|split|title)|(?:fork|split)(?:\s+again)?|activate|actor|agent|alt|annotation|artifact|autoactivate|autonumber|backward|binary|boundary|box|break|caption|card|case|circle|class|clock|cloud|collections|component|concise|control|create|critical|database|deactivate|destroy|detach|diamond|else|elseif|end|end[hr]note|endif|endswitch|endwhile|entity|enum|file|folder|footer|frame|group|[hr]?note|header|hexagon|hide|if|interface|label|legend|loop|map|namespace|network|newpage|node|nwdiag|object|opt|package|page|par|participant|person|queue|rectangle|ref|remove|repeat|restore|return|robust|scale|set|show|skinparam|stack|start|state|stop|storage|switch|title|together|usecase|usecase\/|while)(?=\s|$)/m,
lookbehind: true,
greedy: true
},
/\b(?:elseif|equals|not|while)(?=\s*\()/,
/\b(?:as|is|then)\b/
],
"divider": {
pattern: /^==.+==$/m,
greedy: true,
alias: "important"
},
"time": {
pattern: /@(?:\d+(?:[:/]\d+){2}|[+-]?\d+|:[a-z]\w*(?:[+-]\d+)?)\b/i,
greedy: true,
alias: "number"
},
"color": {
pattern: /#(?:[a-z_]+|[a-fA-F0-9]+)\b/,
alias: "symbol"
},
"variable": variable,
"punctuation": /[:,;()[\]{}]|\.{3}/
};
Prism2.languages["plant-uml"].arrow.inside.expression.inside = Prism2.languages["plant-uml"];
Prism2.languages["plantuml"] = Prism2.languages["plant-uml"];
})(Prism);
Prism.languages.plsql = Prism.languages.extend("sql", {
"comment": {
pattern: /\/\*[\s\S]*?\*\/|--.*/,
greedy: true
},
"keyword": /\b(?:A|ACCESSIBLE|ADD|AGENT|AGGREGATE|ALL|ALTER|AND|ANY|ARRAY|AS|ASC|AT|ATTRIBUTE|AUTHID|AVG|BEGIN|BETWEEN|BFILE_BASE|BINARY|BLOB_BASE|BLOCK|BODY|BOTH|BOUND|BULK|BY|BYTE|C|CALL|CALLING|CASCADE|CASE|CHAR|CHARACTER|CHARSET|CHARSETFORM|CHARSETID|CHAR_BASE|CHECK|CLOB_BASE|CLONE|CLOSE|CLUSTER|CLUSTERS|COLAUTH|COLLECT|COLUMNS|COMMENT|COMMIT|COMMITTED|COMPILED|COMPRESS|CONNECT|CONSTANT|CONSTRUCTOR|CONTEXT|CONTINUE|CONVERT|COUNT|CRASH|CREATE|CREDENTIAL|CURRENT|CURSOR|CUSTOMDATUM|DANGLING|DATA|DATE|DATE_BASE|DAY|DECLARE|DEFAULT|DEFINE|DELETE|DESC|DETERMINISTIC|DIRECTORY|DISTINCT|DOUBLE|DROP|DURATION|ELEMENT|ELSE|ELSIF|EMPTY|END|ESCAPE|EXCEPT|EXCEPTION|EXCEPTIONS|EXCLUSIVE|EXECUTE|EXISTS|EXIT|EXTERNAL|FETCH|FINAL|FIRST|FIXED|FLOAT|FOR|FORALL|FORCE|FROM|FUNCTION|GENERAL|GOTO|GRANT|GROUP|HASH|HAVING|HEAP|HIDDEN|HOUR|IDENTIFIED|IF|IMMEDIATE|IMMUTABLE|IN|INCLUDING|INDEX|INDEXES|INDICATOR|INDICES|INFINITE|INSERT|INSTANTIABLE|INT|INTERFACE|INTERSECT|INTERVAL|INTO|INVALIDATE|IS|ISOLATION|JAVA|LANGUAGE|LARGE|LEADING|LENGTH|LEVEL|LIBRARY|LIKE|LIKE2|LIKE4|LIKEC|LIMIT|LIMITED|LOCAL|LOCK|LONG|LOOP|MAP|MAX|MAXLEN|MEMBER|MERGE|MIN|MINUS|MINUTE|MOD|MODE|MODIFY|MONTH|MULTISET|MUTABLE|NAME|NAN|NATIONAL|NATIVE|NCHAR|NEW|NOCOMPRESS|NOCOPY|NOT|NOWAIT|NULL|NUMBER_BASE|OBJECT|OCICOLL|OCIDATE|OCIDATETIME|OCIDURATION|OCIINTERVAL|OCILOBLOCATOR|OCINUMBER|OCIRAW|OCIREF|OCIREFCURSOR|OCIROWID|OCISTRING|OCITYPE|OF|OLD|ON|ONLY|OPAQUE|OPEN|OPERATOR|OPTION|OR|ORACLE|ORADATA|ORDER|ORGANIZATION|ORLANY|ORLVARY|OTHERS|OUT|OVERLAPS|OVERRIDING|PACKAGE|PARALLEL_ENABLE|PARAMETER|PARAMETERS|PARENT|PARTITION|PASCAL|PERSISTABLE|PIPE|PIPELINED|PLUGGABLE|POLYMORPHIC|PRAGMA|PRECISION|PRIOR|PRIVATE|PROCEDURE|PUBLIC|RAISE|RANGE|RAW|READ|RECORD|REF|REFERENCE|RELIES_ON|REM|REMAINDER|RENAME|RESOURCE|RESULT|RESULT_CACHE|RETURN|RETURNING|REVERSE|REVOKE|ROLLBACK|ROW|SAMPLE|SAVE|SAVEPOINT|SB1|SB2|SB4|SECOND|SEGMENT|SELECT|SELF|SEPARATE|SEQUENCE|SERIALIZABLE|SET|SHARE|SHORT|SIZE|SIZE_T|SOME|SPARSE|SQL|SQLCODE|SQLDATA|SQLNAME|SQLSTATE|STANDARD|START|STATIC|STDDEV|STORED|STRING|STRUCT|STYLE|SUBMULTISET|SUBPARTITION|SUBSTITUTABLE|SUBTYPE|SUM|SYNONYM|TABAUTH|TABLE|TDO|THE|THEN|TIME|TIMESTAMP|TIMEZONE_ABBR|TIMEZONE_HOUR|TIMEZONE_MINUTE|TIMEZONE_REGION|TO|TRAILING|TRANSACTION|TRANSACTIONAL|TRUSTED|TYPE|UB1|UB2|UB4|UNDER|UNION|UNIQUE|UNPLUG|UNSIGNED|UNTRUSTED|UPDATE|USE|USING|VALIST|VALUE|VALUES|VARIABLE|VARIANCE|VARRAY|VARYING|VIEW|VIEWS|VOID|WHEN|WHERE|WHILE|WITH|WORK|WRAPPED|WRITE|YEAR|ZONE)\b/i,
"operator": /:=?|=>|[<>^~!]=|\.\.|\|\||\*\*|[-+*/%<>=@]/
});
Prism.languages.insertBefore("plsql", "operator", {
"label": {
pattern: /<<\s*\w+\s*>>/,
alias: "symbol"
}
});
Prism.languages.powerquery = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
lookbehind: true,
greedy: true
},
"quoted-identifier": {
pattern: /#"(?:[^"\r\n]|"")*"(?!")/,
greedy: true
},
"string": {
pattern: /(?:#!)?"(?:[^"\r\n]|"")*"(?!")/,
greedy: true
},
"constant": [
/\bDay\.(?:Friday|Monday|Saturday|Sunday|Thursday|Tuesday|Wednesday)\b/,
/\bTraceLevel\.(?:Critical|Error|Information|Verbose|Warning)\b/,
/\bOccurrence\.(?:All|First|Last)\b/,
/\bOrder\.(?:Ascending|Descending)\b/,
/\bRoundingMode\.(?:AwayFromZero|Down|ToEven|TowardZero|Up)\b/,
/\bMissingField\.(?:Error|Ignore|UseNull)\b/,
/\bQuoteStyle\.(?:Csv|None)\b/,
/\bJoinKind\.(?:FullOuter|Inner|LeftAnti|LeftOuter|RightAnti|RightOuter)\b/,
/\bGroupKind\.(?:Global|Local)\b/,
/\bExtraValues\.(?:Error|Ignore|List)\b/,
/\bJoinAlgorithm\.(?:Dynamic|LeftHash|LeftIndex|PairwiseHash|RightHash|RightIndex|SortMerge)\b/,
/\bJoinSide\.(?:Left|Right)\b/,
/\bPrecision\.(?:Decimal|Double)\b/,
/\bRelativePosition\.From(?:End|Start)\b/,
/\bTextEncoding\.(?:Ascii|BigEndianUnicode|Unicode|Utf16|Utf8|Windows)\b/,
/\b(?:Any|Binary|Date|DateTime|DateTimeZone|Duration|Function|Int16|Int32|Int64|Int8|List|Logical|None|Number|Record|Table|Text|Time)\.Type\b/,
/\bnull\b/
],
"boolean": /\b(?:false|true)\b/,
"keyword": /\b(?:and|as|each|else|error|if|in|is|let|meta|not|nullable|optional|or|otherwise|section|shared|then|try|type)\b|#(?:binary|date|datetime|datetimezone|duration|infinity|nan|sections|shared|table|time)\b/,
"function": {
pattern: /(^|[^#\w.])[a-z_][\w.]*(?=\s*\()/i,
lookbehind: true
},
"data-type": {
pattern: /\b(?:any|anynonnull|binary|date|datetime|datetimezone|duration|function|list|logical|none|number|record|table|text|time)\b/,
alias: "class-name"
},
"number": {
pattern: /\b0x[\da-f]+\b|(?:[+-]?(?:\b\d+\.)?\b\d+|[+-]\.\d+|(^|[^.])\B\.\d+)(?:e[+-]?\d+)?\b/i,
lookbehind: true
},
"operator": /[-+*\/&?@^]|<(?:=>?|>)?|>=?|=>?|\.\.\.?/,
"punctuation": /[,;\[\](){}]/
};
Prism.languages.pq = Prism.languages["powerquery"];
Prism.languages.mscript = Prism.languages["powerquery"];
(function(Prism2) {
var powershell = Prism2.languages.powershell = {
"comment": [
{
pattern: /(^|[^`])<#[\s\S]*?#>/,
lookbehind: true
},
{
pattern: /(^|[^`])#.*/,
lookbehind: true
}
],
"string": [
{
pattern: /"(?:`[\s\S]|[^`"])*"/,
greedy: true,
inside: null
},
{
pattern: /'(?:[^']|'')*'/,
greedy: true
}
],
"namespace": /\[[a-z](?:\[(?:\[[^\]]*\]|[^\[\]])*\]|[^\[\]])*\]/i,
"boolean": /\$(?:false|true)\b/i,
"variable": /\$\w+\b/,
"function": [
/\b(?:Add|Approve|Assert|Backup|Block|Checkpoint|Clear|Close|Compare|Complete|Compress|Confirm|Connect|Convert|ConvertFrom|ConvertTo|Copy|Debug|Deny|Disable|Disconnect|Dismount|Edit|Enable|Enter|Exit|Expand|Export|Find|ForEach|Format|Get|Grant|Group|Hide|Import|Initialize|Install|Invoke|Join|Limit|Lock|Measure|Merge|Move|New|Open|Optimize|Out|Ping|Pop|Protect|Publish|Push|Read|Receive|Redo|Register|Remove|Rename|Repair|Request|Reset|Resize|Resolve|Restart|Restore|Resume|Revoke|Save|Search|Select|Send|Set|Show|Skip|Sort|Split|Start|Step|Stop|Submit|Suspend|Switch|Sync|Tee|Test|Trace|Unblock|Undo|Uninstall|Unlock|Unprotect|Unpublish|Unregister|Update|Use|Wait|Watch|Where|Write)-[a-z]+\b/i,
/\b(?:ac|cat|chdir|clc|cli|clp|clv|compare|copy|cp|cpi|cpp|cvpa|dbp|del|diff|dir|ebp|echo|epal|epcsv|epsn|erase|fc|fl|ft|fw|gal|gbp|gc|gci|gcs|gdr|gi|gl|gm|gp|gps|group|gsv|gu|gv|gwmi|iex|ii|ipal|ipcsv|ipsn|irm|iwmi|iwr|kill|lp|ls|measure|mi|mount|move|mp|mv|nal|ndr|ni|nv|ogv|popd|ps|pushd|pwd|rbp|rd|rdr|ren|ri|rm|rmdir|rni|rnp|rp|rv|rvpa|rwmi|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spps|spsv|start|sv|swmi|tee|trcm|type|write)\b/i
],
"keyword": /\b(?:Begin|Break|Catch|Class|Continue|Data|Define|Do|DynamicParam|Else|ElseIf|End|Exit|Filter|Finally|For|ForEach|From|Function|If|InlineScript|Parallel|Param|Process|Return|Sequence|Switch|Throw|Trap|Try|Until|Using|Var|While|Workflow)\b/i,
"operator": {
pattern: /(^|\W)(?:!|-(?:b?(?:and|x?or)|as|(?:Not)?(?:Contains|In|Like|Match)|eq|ge|gt|is(?:Not)?|Join|le|lt|ne|not|Replace|sh[lr])\b|-[-=]?|\+[+=]?|[*\/%]=?)/i,
lookbehind: true
},
"punctuation": /[|{}[\];(),.]/
};
powershell.string[0].inside = {
"function": {
pattern: /(^|[^`])\$\((?:\$\([^\r\n()]*\)|(?!\$\()[^\r\n)])*\)/,
lookbehind: true,
inside: powershell
},
"boolean": powershell.boolean,
"variable": powershell.variable
};
})(Prism);
Prism.languages.processing = Prism.languages.extend("clike", {
"keyword": /\b(?:break|case|catch|class|continue|default|else|extends|final|for|if|implements|import|new|null|private|public|return|static|super|switch|this|try|void|while)\b/,
"function": /\b\w+(?=\s*\()/,
"operator": /<[<=]?|>[>=]?|&&?|\|\|?|[%?]|[!=+\-*\/]=?/
});
Prism.languages.insertBefore("processing", "number", {
"constant": /\b(?!XML\b)[A-Z][A-Z\d_]+\b/,
"type": {
pattern: /\b(?:boolean|byte|char|color|double|float|int|[A-Z]\w*)\b/,
alias: "class-name"
}
});
Prism.languages.prolog = {
"comment": {
pattern: /\/\*[\s\S]*?\*\/|%.*/,
greedy: true
},
"string": {
pattern: /(["'])(?:\1\1|\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1(?!\1)/,
greedy: true
},
"builtin": /\b(?:fx|fy|xf[xy]?|yfx?)\b/,
"function": /\b[a-z]\w*(?:(?=\()|\/\d+)/,
"number": /\b\d+(?:\.\d*)?/,
"operator": /[:\\=><\-?*@\/;+^|!$.]+|\b(?:is|mod|not|xor)\b/,
"punctuation": /[(){}\[\],]/
};
(function(Prism2) {
var aggregations = [
"sum",
"min",
"max",
"avg",
"group",
"stddev",
"stdvar",
"count",
"count_values",
"bottomk",
"topk",
"quantile"
];
var vectorMatching = [
"on",
"ignoring",
"group_right",
"group_left",
"by",
"without"
];
var offsetModifier = ["offset"];
var keywords = aggregations.concat(vectorMatching, offsetModifier);
Prism2.languages.promql = {
"comment": {
pattern: /(^[ \t]*)#.*/m,
lookbehind: true
},
"vector-match": {
pattern: new RegExp("((?:" + vectorMatching.join("|") + ")\\s*)\\([^)]*\\)"),
lookbehind: true,
inside: {
"label-key": {
pattern: /\b[^,]+\b/,
alias: "attr-name"
},
"punctuation": /[(),]/
}
},
"context-labels": {
pattern: /\{[^{}]*\}/,
inside: {
"label-key": {
pattern: /\b[a-z_]\w*(?=\s*(?:=|![=~]))/,
alias: "attr-name"
},
"label-value": {
pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
greedy: true,
alias: "attr-value"
},
"punctuation": /\{|\}|=~?|![=~]|,/
}
},
"context-range": [
{
pattern: /\[[\w\s:]+\]/,
inside: {
"punctuation": /\[|\]|:/,
"range-duration": {
pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i,
alias: "number"
}
}
},
{
pattern: /(\boffset\s+)\w+/,
lookbehind: true,
inside: {
"range-duration": {
pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i,
alias: "number"
}
}
}
],
"keyword": new RegExp("\\b(?:" + keywords.join("|") + ")\\b", "i"),
"function": /\b[a-z_]\w*(?=\s*\()/i,
"number": /[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i,
"operator": /[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|or|unless)\b/i,
"punctuation": /[{};()`,.[\]]/
};
})(Prism);
Prism.languages.properties = {
"comment": /^[ \t]*[#!].*$/m,
"value": {
pattern: /(^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?: *[=:] *(?! )| ))(?:\\(?:\r\n|[\s\S])|[^\\\r\n])+/m,
lookbehind: true,
alias: "attr-value"
},
"key": {
pattern: /^[ \t]*(?:\\(?:\r\n|[\s\S])|[^\\\s:=])+(?= *[=:]| )/m,
alias: "attr-name"
},
"punctuation": /[=:]/
};
(function(Prism2) {
var builtinTypes = /\b(?:bool|bytes|double|s?fixed(?:32|64)|float|[su]?int(?:32|64)|string)\b/;
Prism2.languages.protobuf = Prism2.languages.extend("clike", {
"class-name": [
{
pattern: /(\b(?:enum|extend|message|service)\s+)[A-Za-z_]\w*(?=\s*\{)/,
lookbehind: true
},
{
pattern: /(\b(?:rpc\s+\w+|returns)\s*\(\s*(?:stream\s+)?)\.?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*(?=\s*\))/,
lookbehind: true
}
],
"keyword": /\b(?:enum|extend|extensions|import|message|oneof|option|optional|package|public|repeated|required|reserved|returns|rpc(?=\s+\w)|service|stream|syntax|to)\b(?!\s*=\s*\d)/,
"function": /\b[a-z_]\w*(?=\s*\()/i
});
Prism2.languages.insertBefore("protobuf", "operator", {
"map": {
pattern: /\bmap<\s*[\w.]+\s*,\s*[\w.]+\s*>(?=\s+[a-z_]\w*\s*[=;])/i,
alias: "class-name",
inside: {
"punctuation": /[<>.,]/,
"builtin": builtinTypes
}
},
"builtin": builtinTypes,
"positional-class-name": {
pattern: /(?:\b|\B\.)[a-z_]\w*(?:\.[a-z_]\w*)*(?=\s+[a-z_]\w*\s*[=;])/i,
alias: "class-name",
inside: {
"punctuation": /\./
}
},
"annotation": {
pattern: /(\[\s*)[a-z_]\w*(?=\s*=)/i,
lookbehind: true
}
});
})(Prism);
(function(Prism2) {
Prism2.languages.pug = {
"comment": {
pattern: /(^([\t ]*))\/\/.*(?:(?:\r?\n|\r)\2[\t ].+)*/m,
lookbehind: true
},
"multiline-script": {
pattern: /(^([\t ]*)script\b.*\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
lookbehind: true,
inside: Prism2.languages.javascript
},
"filter": {
pattern: /(^([\t ]*)):.+(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
lookbehind: true,
inside: {
"filter-name": {
pattern: /^:[\w-]+/,
alias: "variable"
},
"text": /\S[\s\S]*/
}
},
"multiline-plain-text": {
pattern: /(^([\t ]*)[\w\-#.]+\.[\t ]*)(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/m,
lookbehind: true
},
"markup": {
pattern: /(^[\t ]*)<.+/m,
lookbehind: true,
inside: Prism2.languages.markup
},
"doctype": {
pattern: /((?:^|\n)[\t ]*)doctype(?: .+)?/,
lookbehind: true
},
"flow-control": {
pattern: /(^[\t ]*)(?:case|default|each|else|if|unless|when|while)\b(?: .+)?/m,
lookbehind: true,
inside: {
"each": {
pattern: /^each .+? in\b/,
inside: {
"keyword": /\b(?:each|in)\b/,
"punctuation": /,/
}
},
"branch": {
pattern: /^(?:case|default|else|if|unless|when|while)\b/,
alias: "keyword"
},
rest: Prism2.languages.javascript
}
},
"keyword": {
pattern: /(^[\t ]*)(?:append|block|extends|include|prepend)\b.+/m,
lookbehind: true
},
"mixin": [
{
pattern: /(^[\t ]*)mixin .+/m,
lookbehind: true,
inside: {
"keyword": /^mixin/,
"function": /\w+(?=\s*\(|\s*$)/,
"punctuation": /[(),.]/
}
},
{
pattern: /(^[\t ]*)\+.+/m,
lookbehind: true,
inside: {
"name": {
pattern: /^\+\w+/,
alias: "function"
},
rest: Prism2.languages.javascript
}
}
],
"script": {
pattern: /(^[\t ]*script(?:(?:&[^(]+)?\([^)]+\))*[\t ]).+/m,
lookbehind: true,
inside: Prism2.languages.javascript
},
"plain-text": {
pattern: /(^[\t ]*(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?[\t ]).+/m,
lookbehind: true
},
"tag": {
pattern: /(^[\t ]*)(?!-)[\w\-#.]*[\w\-](?:(?:&[^(]+)?\([^)]+\))*\/?:?/m,
lookbehind: true,
inside: {
"attributes": [
{
pattern: /&[^(]+\([^)]+\)/,
inside: Prism2.languages.javascript
},
{
pattern: /\([^)]+\)/,
inside: {
"attr-value": {
pattern: /(=\s*(?!\s))(?:\{[^}]*\}|[^,)\r\n]+)/,
lookbehind: true,
inside: Prism2.languages.javascript
},
"attr-name": /[\w-]+(?=\s*!?=|\s*[,)])/,
"punctuation": /[!=(),]+/
}
}
],
"punctuation": /:/,
"attr-id": /#[\w\-]+/,
"attr-class": /\.[\w\-]+/
}
},
"code": [
{
pattern: /(^[\t ]*(?:-|!?=)).+/m,
lookbehind: true,
inside: Prism2.languages.javascript
}
],
"punctuation": /[.\-!=|]+/
};
var filter_pattern = /(^([\t ]*)):<filter_name>(?:(?:\r?\n|\r(?!\n))(?:\2[\t ].+|\s*?(?=\r?\n|\r)))+/.source;
var filters = [
{ filter: "atpl", language: "twig" },
{ filter: "coffee", language: "coffeescript" },
"ejs",
"handlebars",
"less",
"livescript",
"markdown",
{ filter: "sass", language: "scss" },
"stylus"
];
var all_filters = {};
for (var i = 0, l = filters.length; i < l; i++) {
var filter = filters[i];
filter = typeof filter === "string" ? { filter, language: filter } : filter;
if (Prism2.languages[filter.language]) {
all_filters["filter-" + filter.filter] = {
pattern: RegExp(filter_pattern.replace("<filter_name>", function() {
return filter.filter;
}), "m"),
lookbehind: true,
inside: {
"filter-name": {
pattern: /^:[\w-]+/,
alias: "variable"
},
"text": {
pattern: /\S[\s\S]*/,
alias: [filter.language, "language-" + filter.language],
inside: Prism2.languages[filter.language]
}
}
};
}
}
Prism2.languages.insertBefore("pug", "filter", all_filters);
})(Prism);
(function(Prism2) {
Prism2.languages.puppet = {
"heredoc": [
{
pattern: /(@\("([^"\r\n\/):]+)"(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,
lookbehind: true,
alias: "string",
inside: {
"punctuation": /(?=\S).*\S(?= *$)/
}
},
{
pattern: /(@\(([^"\r\n\/):]+)(?:\/[nrts$uL]*)?\).*(?:\r?\n|\r))(?:.*(?:\r?\n|\r(?!\n)))*?[ \t]*(?:\|[ \t]*)?(?:-[ \t]*)?\2/,
lookbehind: true,
greedy: true,
alias: "string",
inside: {
"punctuation": /(?=\S).*\S(?= *$)/
}
},
{
pattern: /@\("?(?:[^"\r\n\/):]+)"?(?:\/[nrts$uL]*)?\)/,
alias: "string",
inside: {
"punctuation": {
pattern: /(\().+?(?=\))/,
lookbehind: true
}
}
}
],
"multiline-comment": {
pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
lookbehind: true,
greedy: true,
alias: "comment"
},
"regex": {
pattern: /((?:\bnode\s+|[~=\(\[\{,]\s*|[=+]>\s*|^\s*))\/(?:[^\/\\]|\\[\s\S])+\/(?:[imx]+\b|\B)/,
lookbehind: true,
greedy: true,
inside: {
"extended-regex": {
pattern: /^\/(?:[^\/\\]|\\[\s\S])+\/[im]*x[im]*$/,
inside: {
"comment": /#.*/
}
}
}
},
"comment": {
pattern: /(^|[^\\])#.*/,
lookbehind: true,
greedy: true
},
"string": {
pattern: /(["'])(?:\$\{(?:[^'"}]|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}|\$(?!\{)|(?!\1)[^\\$]|\\[\s\S])*\1/,
greedy: true,
inside: {
"double-quoted": {
pattern: /^"[\s\S]*"$/,
inside: {}
}
}
},
"variable": {
pattern: /\$(?:::)?\w+(?:::\w+)*/,
inside: {
"punctuation": /::/
}
},
"attr-name": /(?:\b\w+|\*)(?=\s*=>)/,
"function": [
{
pattern: /(\.)(?!\d)\w+/,
lookbehind: true
},
/\b(?:contain|debug|err|fail|include|info|notice|realize|require|tag|warning)\b|\b(?!\d)\w+(?=\()/
],
"number": /\b(?:0x[a-f\d]+|\d+(?:\.\d+)?(?:e-?\d+)?)\b/i,
"boolean": /\b(?:false|true)\b/,
"keyword": /\b(?:application|attr|case|class|consumes|default|define|else|elsif|function|if|import|inherits|node|private|produces|type|undef|unless)\b/,
"datatype": {
pattern: /\b(?:Any|Array|Boolean|Callable|Catalogentry|Class|Collection|Data|Default|Enum|Float|Hash|Integer|NotUndef|Numeric|Optional|Pattern|Regexp|Resource|Runtime|Scalar|String|Struct|Tuple|Type|Undef|Variant)\b/,
alias: "symbol"
},
"operator": /=[=~>]?|![=~]?|<(?:<\|?|[=~|-])?|>[>=]?|->?|~>|\|>?>?|[*\/%+?]|\b(?:and|in|or)\b/,
"punctuation": /[\[\]{}().,;]|:+/
};
var interpolation = [
{
pattern: /(^|[^\\])\$\{(?:[^'"{}]|\{[^}]*\}|(["'])(?:(?!\2)[^\\]|\\[\s\S])*\2)+\}/,
lookbehind: true,
inside: {
"short-variable": {
pattern: /(^\$\{)(?!\w+\()(?:::)?\w+(?:::\w+)*/,
lookbehind: true,
alias: "variable",
inside: {
"punctuation": /::/
}
},
"delimiter": {
pattern: /^\$/,
alias: "variable"
},
rest: Prism2.languages.puppet
}
},
{
pattern: /(^|[^\\])\$(?:::)?\w+(?:::\w+)*/,
lookbehind: true,
alias: "variable",
inside: {
"punctuation": /::/
}
}
];
Prism2.languages.puppet["heredoc"][0].inside.interpolation = interpolation;
Prism2.languages.puppet["string"].inside["double-quoted"].inside.interpolation = interpolation;
})(Prism);
(function(Prism2) {
Prism2.languages.pure = {
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
lookbehind: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true
},
/#!.+/
],
"inline-lang": {
pattern: /%<[\s\S]+?%>/,
greedy: true,
inside: {
"lang": {
pattern: /(^%< *)-\*-.+?-\*-/,
lookbehind: true,
alias: "comment"
},
"delimiter": {
pattern: /^%<.*|%>$/,
alias: "punctuation"
}
}
},
"string": {
pattern: /"(?:\\.|[^"\\\r\n])*"/,
greedy: true
},
"number": {
pattern: /((?:\.\.)?)(?:\b(?:inf|nan)\b|\b0x[\da-f]+|(?:\b(?:0b)?\d+(?:\.\d+)?|\B\.\d+)(?:e[+-]?\d+)?L?)/i,
lookbehind: true
},
"keyword": /\b(?:NULL|ans|break|bt|case|catch|cd|clear|const|def|del|dump|else|end|exit|extern|false|force|help|if|infix[lr]?|interface|let|ls|mem|namespace|nonfix|of|otherwise|outfix|override|postfix|prefix|private|public|pwd|quit|run|save|show|stats|then|throw|trace|true|type|underride|using|when|with)\b/,
"function": /\b(?:abs|add_(?:addr|constdef|(?:fundef|interface|macdef|typedef)(?:_at)?|vardef)|all|any|applp?|arity|bigintp?|blob(?:_crc|_size|p)?|boolp?|byte_c?string(?:_pointer)?|byte_(?:matrix|pointer)|calloc|cat|catmap|ceil|char[ps]?|check_ptrtag|chr|clear_sentry|clearsym|closurep?|cmatrixp?|cols?|colcat(?:map)?|colmap|colrev|colvector(?:p|seq)?|complex(?:_float_(?:matrix|pointer)|_matrix(?:_view)?|_pointer|p)?|conj|cookedp?|cst|cstring(?:_(?:dup|list|vector))?|curry3?|cyclen?|del_(?:constdef|fundef|interface|macdef|typedef|vardef)|delete|diag(?:mat)?|dim|dmatrixp?|do|double(?:_matrix(?:_view)?|_pointer|p)?|dowith3?|drop|dropwhile|eval(?:cmd)?|exactp|filter|fix|fixity|flip|float(?:_matrix|_pointer)|floor|fold[lr]1?|frac|free|funp?|functionp?|gcd|get(?:_(?:byte|constdef|double|float|fundef|int(?:64)?|interface(?:_typedef)?|long|macdef|pointer|ptrtag|sentry|short|string|typedef|vardef))?|globsym|hash|head|id|im|imatrixp?|index|inexactp|infp|init|insert|int(?:_matrix(?:_view)?|_pointer|p)?|int64_(?:matrix|pointer)|integerp?|iteraten?|iterwhile|join|keys?|lambdap?|last(?:err(?:pos)?)?|lcd|list[2p]?|listmap|make_ptrtag|malloc|map|matcat|matrixp?|max|member|min|nanp|nargs|nmatrixp?|null|numberp?|ord|pack(?:ed)?|pointer(?:_cast|_tag|_type|p)?|pow|pred|ptrtag|put(?:_(?:byte|double|float|int(?:64)?|long|pointer|short|string))?|rationalp?|re|realp?|realloc|recordp?|redim|reduce(?:_with)?|refp?|repeatn?|reverse|rlistp?|round|rows?|rowcat(?:map)?|rowmap|rowrev|rowvector(?:p|seq)?|same|scan[lr]1?|sentry|sgn|short_(?:matrix|pointer)|slice|smatrixp?|sort|split|str|strcat|stream|stride|string(?:_(?:dup|list|vector)|p)?|subdiag(?:mat)?|submat|subseq2?|substr|succ|supdiag(?:mat)?|symbolp?|tail|take|takewhile|thunkp?|transpose|trunc|tuplep?|typep|ubyte|uint(?:64)?|ulong|uncurry3?|unref|unzip3?|update|ushort|vals?|varp?|vector(?:p|seq)?|void|zip3?|zipwith3?)\b/,
"special": {
pattern: /\b__[a-z]+__\b/i,
alias: "builtin"
},
"operator": /(?:[!"#$%&'*+,\-.\/:<=>?@\\^`|~\u00a1-\u00bf\u00d7-\u00f7\u20d0-\u2bff]|\b_+\b)+|\b(?:and|div|mod|not|or)\b/,
"punctuation": /[(){}\[\];,|]/
};
var inlineLanguages = [
"c",
{ lang: "c++", alias: "cpp" },
"fortran"
];
var inlineLanguageRe = /%< *-\*- *<lang>\d* *-\*-[\s\S]+?%>/.source;
inlineLanguages.forEach(function(lang) {
var alias = lang;
if (typeof lang !== "string") {
alias = lang.alias;
lang = lang.lang;
}
if (Prism2.languages[alias]) {
var o = {};
o["inline-lang-" + alias] = {
pattern: RegExp(inlineLanguageRe.replace("<lang>", lang.replace(/([.+*?\/\\(){}\[\]])/g, "\\$1")), "i"),
inside: Prism2.util.clone(Prism2.languages.pure["inline-lang"].inside)
};
o["inline-lang-" + alias].inside.rest = Prism2.util.clone(Prism2.languages[alias]);
Prism2.languages.insertBefore("pure", "inline-lang", o);
}
});
if (Prism2.languages.c) {
Prism2.languages.pure["inline-lang"].inside.rest = Prism2.util.clone(Prism2.languages.c);
}
})(Prism);
Prism.languages.purebasic = Prism.languages.extend("clike", {
"comment": /;.*/,
"keyword": /\b(?:align|and|as|break|calldebugger|case|compilercase|compilerdefault|compilerelse|compilerelseif|compilerendif|compilerendselect|compilererror|compilerif|compilerselect|continue|data|datasection|debug|debuglevel|declare|declarec|declarecdll|declaredll|declaremodule|default|define|dim|disableasm|disabledebugger|disableexplicit|else|elseif|enableasm|enabledebugger|enableexplicit|end|enddatasection|enddeclaremodule|endenumeration|endif|endimport|endinterface|endmacro|endmodule|endprocedure|endselect|endstructure|endstructureunion|endwith|enumeration|extends|fakereturn|for|foreach|forever|global|gosub|goto|if|import|importc|includebinary|includefile|includepath|interface|macro|module|newlist|newmap|next|not|or|procedure|procedurec|procedurecdll|proceduredll|procedurereturn|protected|prototype|prototypec|read|redim|repeat|restore|return|runtime|select|shared|static|step|structure|structureunion|swap|threaded|to|until|wend|while|with|xincludefile|xor)\b/i,
"function": /\b\w+(?:\.\w+)?\s*(?=\()/,
"number": /(?:\$[\da-f]+|\b-?(?:\d+(?:\.\d+)?|\.\d+)(?:e[+-]?\d+)?)\b/i,
"operator": /(?:@\*?|\?|\*)\w+\$?|-[>-]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|?\||[~^%?*/@]/
});
Prism.languages.insertBefore("purebasic", "keyword", {
"tag": /#\w+\$?/,
"asm": {
pattern: /(^[\t ]*)!.*/m,
lookbehind: true,
alias: "tag",
inside: {
"comment": /;.*/,
"string": {
pattern: /(["'`])(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"label-reference-anonymous": {
pattern: /(!\s*j[a-z]+\s+)@[fb]/i,
lookbehind: true,
alias: "fasm-label"
},
"label-reference-addressed": {
pattern: /(!\s*j[a-z]+\s+)[A-Z._?$@][\w.?$@~#]*/i,
lookbehind: true,
alias: "fasm-label"
},
"keyword": [
/\b(?:extern|global)\b[^;\r\n]*/i,
/\b(?:CPU|DEFAULT|FLOAT)\b.*/
],
"function": {
pattern: /^([\t ]*!\s*)[\da-z]+(?=\s|$)/im,
lookbehind: true
},
"function-inline": {
pattern: /(:\s*)[\da-z]+(?=\s)/i,
lookbehind: true,
alias: "function"
},
"label": {
pattern: /^([\t ]*!\s*)[A-Za-z._?$@][\w.?$@~#]*(?=:)/m,
lookbehind: true,
alias: "fasm-label"
},
"register": /\b(?:st\d|[xyz]mm\d\d?|[cdt]r\d|r\d\d?[bwd]?|[er]?[abcd]x|[abcd][hl]|[er]?(?:bp|di|si|sp)|[cdefgs]s|mm\d+)\b/i,
"number": /(?:\b|-|(?=\$))(?:0[hx](?:[\da-f]*\.)?[\da-f]+(?:p[+-]?\d+)?|\d[\da-f]+[hx]|\$\d[\da-f]*|0[oq][0-7]+|[0-7]+[oq]|0[by][01]+|[01]+[by]|0[dt]\d+|(?:\d+(?:\.\d+)?|\.\d+)(?:\.?e[+-]?\d+)?[dt]?)\b/i,
"operator": /[\[\]*+\-/%<>=&|$!,.:]/
}
}
});
delete Prism.languages.purebasic["class-name"];
delete Prism.languages.purebasic["boolean"];
Prism.languages.pbfasm = Prism.languages["purebasic"];
Prism.languages.purescript = Prism.languages.extend("haskell", {
"keyword": /\b(?:ado|case|class|data|derive|do|else|forall|if|in|infixl|infixr|instance|let|module|newtype|of|primitive|then|type|where)\b|∀/,
"import-statement": {
pattern: /(^[\t ]*)import\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*(?:\s+as\s+[A-Z][\w']*(?:\.[A-Z][\w']*)*)?(?:\s+hiding\b)?/m,
lookbehind: true,
inside: {
"keyword": /\b(?:as|hiding|import)\b/,
"punctuation": /\./
}
},
"builtin": /\b(?:absurd|add|ap|append|apply|between|bind|bottom|clamp|compare|comparing|compose|conj|const|degree|discard|disj|div|eq|flap|flip|gcd|identity|ifM|join|lcm|liftA1|liftM1|map|max|mempty|min|mod|mul|negate|not|notEq|one|otherwise|recip|show|sub|top|unit|unless|unlessM|void|when|whenM|zero)\b/,
"operator": [
Prism.languages.haskell.operator[0],
Prism.languages.haskell.operator[2],
/[\xa2-\xa6\xa8\xa9\xac\xae-\xb1\xb4\xb8\xd7\xf7\u02c2-\u02c5\u02d2-\u02df\u02e5-\u02eb\u02ed\u02ef-\u02ff\u0375\u0384\u0385\u03f6\u0482\u058d-\u058f\u0606-\u0608\u060b\u060e\u060f\u06de\u06e9\u06fd\u06fe\u07f6\u07fe\u07ff\u09f2\u09f3\u09fa\u09fb\u0af1\u0b70\u0bf3-\u0bfa\u0c7f\u0d4f\u0d79\u0e3f\u0f01-\u0f03\u0f13\u0f15-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcc\u0fce\u0fcf\u0fd5-\u0fd8\u109e\u109f\u1390-\u1399\u166d\u17db\u1940\u19de-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u1fbd\u1fbf-\u1fc1\u1fcd-\u1fcf\u1fdd-\u1fdf\u1fed-\u1fef\u1ffd\u1ffe\u2044\u2052\u207a-\u207c\u208a-\u208c\u20a0-\u20bf\u2100\u2101\u2103-\u2106\u2108\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a\u213b\u2140-\u2144\u214a-\u214d\u214f\u218a\u218b\u2190-\u2307\u230c-\u2328\u232b-\u2426\u2440-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b73\u2b76-\u2b95\u2b97-\u2bff\u2ce5-\u2cea\u2e50\u2e51\u2e80-\u2e99\u2e9b-\u2ef3\u2f00-\u2fd5\u2ff0-\u2ffb\u3004\u3012\u3013\u3020\u3036\u3037\u303e\u303f\u309b\u309c\u3190\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3247\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua700-\ua716\ua720\ua721\ua789\ua78a\ua828-\ua82b\ua836-\ua839\uaa77-\uaa79\uab5b\uab6a\uab6b\ufb29\ufbb2-\ufbc1\ufdfc\ufdfd\ufe62\ufe64-\ufe66\ufe69\uff04\uff0b\uff1c-\uff1e\uff3e\uff40\uff5c\uff5e\uffe0-\uffe6\uffe8-\uffee\ufffc\ufffd]/
]
});
Prism.languages.purs = Prism.languages.purescript;
Prism.languages.python = {
"comment": {
pattern: /(^|[^\\])#.*/,
lookbehind: true,
greedy: true
},
"string-interpolation": {
pattern: /(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,
lookbehind: true,
inside: {
"format-spec": {
pattern: /(:)[^:(){}]+(?=\}$)/,
lookbehind: true
},
"conversion-option": {
pattern: /![sra](?=[:}]$)/,
alias: "punctuation"
},
rest: null
}
},
"string": /[\s\S]+/
}
},
"triple-quoted-string": {
pattern: /(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,
greedy: true,
alias: "string"
},
"string": {
pattern: /(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,
greedy: true
},
"function": {
pattern: /((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,
lookbehind: true
},
"class-name": {
pattern: /(\bclass\s+)\w+/i,
lookbehind: true
},
"decorator": {
pattern: /(^[\t ]*)@\w+(?:\.\w+)*/m,
lookbehind: true,
alias: ["annotation", "punctuation"],
inside: {
"punctuation": /\./
}
},
"keyword": /\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,
"builtin": /\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,
"boolean": /\b(?:False|None|True)\b/,
"number": /\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,
"operator": /[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.python["string-interpolation"].inside["interpolation"].inside.rest = Prism.languages.python;
Prism.languages.py = Prism.languages.python;
(function(Prism2) {
function replace(pattern, replacements) {
return pattern.replace(/<<(\d+)>>/g, function(m, index) {
return "(?:" + replacements[+index] + ")";
});
}
function re(pattern, replacements, flags) {
return RegExp(replace(pattern, replacements), flags || "");
}
function nested(pattern, depthLog2) {
for (var i = 0; i < depthLog2; i++) {
pattern = pattern.replace(/<<self>>/g, function() {
return "(?:" + pattern + ")";
});
}
return pattern.replace(/<<self>>/g, "[^\\s\\S]");
}
var keywordKinds = {
type: "Adj BigInt Bool Ctl Double false Int One Pauli PauliI PauliX PauliY PauliZ Qubit Range Result String true Unit Zero",
other: "Adjoint adjoint apply as auto body borrow borrowing Controlled controlled distribute elif else fail fixup for function if in internal intrinsic invert is let mutable namespace new newtype open operation repeat return self set until use using while within"
};
function keywordsToPattern(words) {
return "\\b(?:" + words.trim().replace(/ /g, "|") + ")\\b";
}
var keywords = RegExp(keywordsToPattern(keywordKinds.type + " " + keywordKinds.other));
var identifier = /\b[A-Za-z_]\w*\b/.source;
var qualifiedName = replace(/<<0>>(?:\s*\.\s*<<0>>)*/.source, [identifier]);
var typeInside = {
"keyword": keywords,
"punctuation": /[<>()?,.:[\]]/
};
var regularString = /"(?:\\.|[^\\"])*"/.source;
Prism2.languages.qsharp = Prism2.languages.extend("clike", {
"comment": /\/\/.*/,
"string": [
{
pattern: re(/(^|[^$\\])<<0>>/.source, [regularString]),
lookbehind: true,
greedy: true
}
],
"class-name": [
{
pattern: re(/(\b(?:as|open)\s+)<<0>>(?=\s*(?:;|as\b))/.source, [qualifiedName]),
lookbehind: true,
inside: typeInside
},
{
pattern: re(/(\bnamespace\s+)<<0>>(?=\s*\{)/.source, [qualifiedName]),
lookbehind: true,
inside: typeInside
}
],
"keyword": keywords,
"number": /(?:\b0(?:x[\da-f]+|b[01]+|o[0-7]+)|(?:\B\.\d+|\b\d+(?:\.\d*)?)(?:e[-+]?\d+)?)l?\b/i,
"operator": /\band=|\bor=|\band\b|\bnot\b|\bor\b|<[-=]|[-=]>|>>>=?|<<<=?|\^\^\^=?|\|\|\|=?|&&&=?|w\/=?|~~~|[*\/+\-^=!%]=?/,
"punctuation": /::|[{}[\];(),.:]/
});
Prism2.languages.insertBefore("qsharp", "number", {
"range": {
pattern: /\.\./,
alias: "operator"
}
});
var interpolationExpr = nested(replace(/\{(?:[^"{}]|<<0>>|<<self>>)*\}/.source, [regularString]), 2);
Prism2.languages.insertBefore("qsharp", "string", {
"interpolation-string": {
pattern: re(/\$"(?:\\.|<<0>>|[^\\"{])*"/.source, [interpolationExpr]),
greedy: true,
inside: {
"interpolation": {
pattern: re(/((?:^|[^\\])(?:\\\\)*)<<0>>/.source, [interpolationExpr]),
lookbehind: true,
inside: {
"punctuation": /^\{|\}$/,
"expression": {
pattern: /[\s\S]+/,
alias: "language-qsharp",
inside: Prism2.languages.qsharp
}
}
},
"string": /[\s\S]+/
}
}
});
})(Prism);
Prism.languages.qs = Prism.languages.qsharp;
Prism.languages.q = {
"string": /"(?:\\.|[^"\\\r\n])*"/,
"comment": [
{
pattern: /([\t )\]}])\/.*/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|\r?\n|\r)\/[\t ]*(?:(?:\r?\n|\r)(?:.*(?:\r?\n|\r(?!\n)))*?(?:\\(?=[\t ]*(?:\r?\n|\r))|$)|\S.*)/,
lookbehind: true,
greedy: true
},
{
pattern: /^\\[\t ]*(?:\r?\n|\r)[\s\S]+/m,
greedy: true
},
{
pattern: /^#!.+/m,
greedy: true
}
],
"symbol": /`(?::\S+|[\w.]*)/,
"datetime": {
pattern: /0N[mdzuvt]|0W[dtz]|\d{4}\.\d\d(?:m|\.\d\d(?:T(?:\d\d(?::\d\d(?::\d\d(?:[.:]\d\d\d)?)?)?)?)?[dz]?)|\d\d:\d\d(?::\d\d(?:[.:]\d\d\d)?)?[uvt]?/,
alias: "number"
},
"number": /\b(?![01]:)(?:0N[hje]?|0W[hj]?|0[wn]|0x[\da-fA-F]+|\d+(?:\.\d*)?(?:e[+-]?\d+)?[hjfeb]?)/,
"keyword": /\\\w+\b|\b(?:abs|acos|aj0?|all|and|any|asc|asin|asof|atan|attr|avgs?|binr?|by|ceiling|cols|cor|cos|count|cov|cross|csv|cut|delete|deltas|desc|dev|differ|distinct|div|do|dsave|ej|enlist|eval|except|exec|exit|exp|fby|fills|first|fkeys|flip|floor|from|get|getenv|group|gtime|hclose|hcount|hdel|hopen|hsym|iasc|identity|idesc|if|ij|in|insert|inter|inv|keys?|last|like|list|ljf?|load|log|lower|lsq|ltime|ltrim|mavg|maxs?|mcount|md5|mdev|med|meta|mins?|mmax|mmin|mmu|mod|msum|neg|next|not|null|or|over|parse|peach|pj|plist|prds?|prev|prior|rand|rank|ratios|raze|read0|read1|reciprocal|reval|reverse|rload|rotate|rsave|rtrim|save|scan|scov|sdev|select|set|setenv|show|signum|sin|sqrt|ssr?|string|sublist|sums?|sv|svar|system|tables|tan|til|trim|txf|type|uj|ungroup|union|update|upper|upsert|value|var|views?|vs|wavg|where|while|within|wj1?|wsum|ww|xasc|xbar|xcols?|xdesc|xexp|xgroup|xkey|xlog|xprev|xrank)\b/,
"adverb": {
pattern: /['\/\\]:?|\beach\b/,
alias: "function"
},
"verb": {
pattern: /(?:\B\.\B|\b[01]:|<[=>]?|>=?|[:+\-*%,!?~=|$&#@^]):?|\b_\b:?/,
alias: "operator"
},
"punctuation": /[(){}\[\];.]/
};
(function(Prism2) {
var jsString = /"(?:\\.|[^\\"\r\n])*"|'(?:\\.|[^\\'\r\n])*'/.source;
var jsComment = /\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))*\*\//.source;
var jsExpr = /(?:[^\\()[\]{}"'/]|<string>|\/(?![*/])|<comment>|\(<expr>*\)|\[<expr>*\]|\{<expr>*\}|\\[\s\S])/.source.replace(/<string>/g, function() {
return jsString;
}).replace(/<comment>/g, function() {
return jsComment;
});
for (var i = 0; i < 2; i++) {
jsExpr = jsExpr.replace(/<expr>/g, function() {
return jsExpr;
});
}
jsExpr = jsExpr.replace(/<expr>/g, "[^\\s\\S]");
Prism2.languages.qml = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
greedy: true
},
"javascript-function": {
pattern: RegExp(/((?:^|;)[ \t]*)function\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*\(<js>*\)\s*\{<js>*\}/.source.replace(/<js>/g, function() {
return jsExpr;
}), "m"),
lookbehind: true,
greedy: true,
alias: "language-javascript",
inside: Prism2.languages.javascript
},
"class-name": {
pattern: /((?:^|[:;])[ \t]*)(?!\d)\w+(?=[ \t]*\{|[ \t]+on\b)/m,
lookbehind: true
},
"property": [
{
pattern: /((?:^|[;{])[ \t]*)(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,
lookbehind: true
},
{
pattern: /((?:^|[;{])[ \t]*)property[ \t]+(?!\d)\w+(?:\.\w+)*[ \t]+(?!\d)\w+(?:\.\w+)*(?=[ \t]*:)/m,
lookbehind: true,
inside: {
"keyword": /^property/,
"property": /\w+(?:\.\w+)*/
}
}
],
"javascript-expression": {
pattern: RegExp(/(:[ \t]*)(?![\s;}[])(?:(?!$|[;}])<js>)+/.source.replace(/<js>/g, function() {
return jsExpr;
}), "m"),
lookbehind: true,
greedy: true,
alias: "language-javascript",
inside: Prism2.languages.javascript
},
"string": {
pattern: /"(?:\\.|[^\\"\r\n])*"/,
greedy: true
},
"keyword": /\b(?:as|import|on)\b/,
"punctuation": /[{}[\]:;,]/
};
})(Prism);
Prism.languages.qore = Prism.languages.extend("clike", {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:\/\/|#).*)/,
lookbehind: true
},
"string": {
pattern: /("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/,
greedy: true
},
"keyword": /\b(?:abstract|any|assert|binary|bool|boolean|break|byte|case|catch|char|class|code|const|continue|data|default|do|double|else|enum|extends|final|finally|float|for|goto|hash|if|implements|import|inherits|instanceof|int|interface|long|my|native|new|nothing|null|object|our|own|private|reference|rethrow|return|short|soft(?:bool|date|float|int|list|number|string)|static|strictfp|string|sub|super|switch|synchronized|this|throw|throws|transient|try|void|volatile|while)\b/,
"boolean": /\b(?:false|true)\b/i,
"function": /\$?\b(?!\d)\w+(?=\()/,
"number": /\b(?:0b[01]+|0x(?:[\da-f]*\.)?[\da-fp\-]+|(?:\d+(?:\.\d+)?|\.\d+)(?:e\d+)?[df]|(?:\d+(?:\.\d+)?|\.\d+))\b/i,
"operator": {
pattern: /(^|[^.])(?:\+[+=]?|-[-=]?|[!=](?:==?|~)?|>>?=?|<(?:=>?|<=?)?|&[&=]?|\|[|=]?|[*\/%^]=?|[~?])/,
lookbehind: true
},
"variable": /\$(?!\d)\w+\b/
});
Prism.languages.r = {
"comment": /#.*/,
"string": {
pattern: /(['"])(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"percent-operator": {
pattern: /%[^%\s]*%/,
alias: "operator"
},
"boolean": /\b(?:FALSE|TRUE)\b/,
"ellipsis": /\.\.(?:\.|\d+)/,
"number": [
/\b(?:Inf|NaN)\b/,
/(?:\b0x[\dA-Fa-f]+(?:\.\d*)?|\b\d+(?:\.\d*)?|\B\.\d+)(?:[EePp][+-]?\d+)?[iL]?/
],
"keyword": /\b(?:NA|NA_character_|NA_complex_|NA_integer_|NA_real_|NULL|break|else|for|function|if|in|next|repeat|while)\b/,
"operator": /->?>?|<(?:=|<?-)?|[>=!]=?|::?|&&?|\|\|?|[+*\/^$@~]/,
"punctuation": /[(){}\[\],;]/
};
Prism.languages.racket = Prism.languages.extend("scheme", {
"lambda-parameter": {
pattern: /([(\[]lambda\s+[(\[])[^()\[\]'\s]+/,
lookbehind: true
}
});
Prism.languages.insertBefore("racket", "string", {
"lang": {
pattern: /^#lang.+/m,
greedy: true,
alias: "keyword"
}
});
Prism.languages.rkt = Prism.languages.racket;
(function(Prism2) {
var commentLike = /\/(?![/*])|\/\/.*[\r\n]|\/\*[^*]*(?:\*(?!\/)[^*]*)*\*\//.source;
var stringLike = /@(?!")|"(?:[^\r\n\\"]|\\.)*"|@"(?:[^\\"]|""|\\[\s\S])*"(?!")/.source + "|" + /'(?:(?:[^\r\n'\\]|\\.|\\[Uux][\da-fA-F]{1,8})'|(?=[^\\](?!')))/.source;
function nested(pattern, depthLog2) {
for (var i = 0; i < depthLog2; i++) {
pattern = pattern.replace(/<self>/g, function() {
return "(?:" + pattern + ")";
});
}
return pattern.replace(/<self>/g, "[^\\s\\S]").replace(/<str>/g, "(?:" + stringLike + ")").replace(/<comment>/g, "(?:" + commentLike + ")");
}
var round2 = nested(/\((?:[^()'"@/]|<str>|<comment>|<self>)*\)/.source, 2);
var square = nested(/\[(?:[^\[\]'"@/]|<str>|<comment>|<self>)*\]/.source, 1);
var curly = nested(/\{(?:[^{}'"@/]|<str>|<comment>|<self>)*\}/.source, 2);
var angle = nested(/<(?:[^<>'"@/]|<comment>|<self>)*>/.source, 1);
var inlineCs = /@/.source + /(?:await\b\s*)?/.source + "(?:" + /(?!await\b)\w+\b/.source + "|" + round2 + ")(?:" + /[?!]?\.\w+\b/.source + "|(?:" + angle + ")?" + round2 + "|" + square + ")*" + /(?![?!\.(\[]|<(?!\/))/.source;
var tagAttrInlineCs = /@(?![\w()])/.source + "|" + inlineCs;
var tagAttrValue = "(?:" + /"[^"@]*"|'[^'@]*'|[^\s'"@>=]+(?=[\s>])/.source + `|["'][^"'@]*(?:(?:` + tagAttrInlineCs + `)[^"'@]*)+["'])`;
var tagAttrs = /(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*<tagAttrValue>|(?=[\s/>])))+)?/.source.replace(/<tagAttrValue>/, tagAttrValue);
var tagContent = /(?!\d)[^\s>\/=$<%]+/.source + tagAttrs + /\s*\/?>/.source;
var tagRegion = /\B@?/.source + "(?:" + /<([a-zA-Z][\w:]*)/.source + tagAttrs + /\s*>/.source + "(?:" + (/[^<]/.source + "|" + /<\/?(?!\1\b)/.source + tagContent + "|" + nested(
/<\1/.source + tagAttrs + /\s*>/.source + "(?:" + (/[^<]/.source + "|" + /<\/?(?!\1\b)/.source + tagContent + "|<self>") + ")*" + /<\/\1\s*>/.source,
2
)) + ")*" + /<\/\1\s*>/.source + "|" + /</.source + tagContent + ")";
Prism2.languages.cshtml = Prism2.languages.extend("markup", {});
var csharpWithHtml = Prism2.languages.insertBefore("csharp", "string", {
"html": {
pattern: RegExp(tagRegion),
greedy: true,
inside: Prism2.languages.cshtml
}
}, { csharp: Prism2.languages.extend("csharp", {}) });
var cs = {
pattern: /\S[\s\S]*/,
alias: "language-csharp",
inside: csharpWithHtml
};
var inlineValue = {
pattern: RegExp(/(^|[^@])/.source + inlineCs),
lookbehind: true,
greedy: true,
alias: "variable",
inside: {
"keyword": /^@/,
"csharp": cs
}
};
Prism2.languages.cshtml.tag.pattern = RegExp(/<\/?/.source + tagContent);
Prism2.languages.cshtml.tag.inside["attr-value"].pattern = RegExp(/=\s*/.source + tagAttrValue);
Prism2.languages.insertBefore("inside", "punctuation", { "value": inlineValue }, Prism2.languages.cshtml.tag.inside["attr-value"]);
Prism2.languages.insertBefore("cshtml", "prolog", {
"razor-comment": {
pattern: /@\*[\s\S]*?\*@/,
greedy: true,
alias: "comment"
},
"block": {
pattern: RegExp(
/(^|[^@])@/.source + "(?:" + [
curly,
/(?:code|functions)\s*/.source + curly,
/(?:for|foreach|lock|switch|using|while)\s*/.source + round2 + /\s*/.source + curly,
/do\s*/.source + curly + /\s*while\s*/.source + round2 + /(?:\s*;)?/.source,
/try\s*/.source + curly + /\s*catch\s*/.source + round2 + /\s*/.source + curly + /\s*finally\s*/.source + curly,
/if\s*/.source + round2 + /\s*/.source + curly + "(?:" + /\s*else/.source + "(?:" + /\s+if\s*/.source + round2 + ")?" + /\s*/.source + curly + ")*",
/helper\s+\w+\s*/.source + round2 + /\s*/.source + curly
].join("|") + ")"
),
lookbehind: true,
greedy: true,
inside: {
"keyword": /^@\w*/,
"csharp": cs
}
},
"directive": {
pattern: /^([ \t]*)@(?:addTagHelper|attribute|implements|inherits|inject|layout|model|namespace|page|preservewhitespace|removeTagHelper|section|tagHelperPrefix|using)(?=\s).*/m,
lookbehind: true,
greedy: true,
inside: {
"keyword": /^@\w+/,
"csharp": cs
}
},
"value": inlineValue,
"delegate-operator": {
pattern: /(^|[^@])@(?=<)/,
lookbehind: true,
alias: "operator"
}
});
Prism2.languages.razor = Prism2.languages.cshtml;
})(Prism);
(function(Prism2) {
var javascript = Prism2.util.clone(Prism2.languages.javascript);
var space = /(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source;
var braces = /(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source;
var spread = /(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;
function re(source, flags) {
source = source.replace(/<S>/g, function() {
return space;
}).replace(/<BRACES>/g, function() {
return braces;
}).replace(/<SPREAD>/g, function() {
return spread;
});
return RegExp(source, flags);
}
spread = re(spread).source;
Prism2.languages.jsx = Prism2.languages.extend("markup", javascript);
Prism2.languages.jsx.tag.pattern = re(
/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source
);
Prism2.languages.jsx.tag.inside["tag"].pattern = /^<\/?[^\s>\/]*/;
Prism2.languages.jsx.tag.inside["attr-value"].pattern = /=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/;
Prism2.languages.jsx.tag.inside["tag"].inside["class-name"] = /^[A-Z]\w*(?:\.[A-Z]\w*)*$/;
Prism2.languages.jsx.tag.inside["comment"] = javascript["comment"];
Prism2.languages.insertBefore("inside", "attr-name", {
"spread": {
pattern: re(/<SPREAD>/.source),
inside: Prism2.languages.jsx
}
}, Prism2.languages.jsx.tag);
Prism2.languages.insertBefore("inside", "special-attr", {
"script": {
pattern: re(/=<BRACES>/.source),
alias: "language-javascript",
inside: {
"script-punctuation": {
pattern: /^=(?=\{)/,
alias: "punctuation"
},
rest: Prism2.languages.jsx
}
}
}, Prism2.languages.jsx.tag);
var stringifyToken = function(token) {
if (!token) {
return "";
}
if (typeof token === "string") {
return token;
}
if (typeof token.content === "string") {
return token.content;
}
return token.content.map(stringifyToken).join("");
};
var walkTokens = function(tokens) {
var openedTags = [];
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
var notTagNorBrace = false;
if (typeof token !== "string") {
if (token.type === "tag" && token.content[0] && token.content[0].type === "tag") {
if (token.content[0].content[0].content === "</") {
if (openedTags.length > 0 && openedTags[openedTags.length - 1].tagName === stringifyToken(token.content[0].content[1])) {
openedTags.pop();
}
} else {
if (token.content[token.content.length - 1].content === "/>") {
} else {
openedTags.push({
tagName: stringifyToken(token.content[0].content[1]),
openedBraces: 0
});
}
}
} else if (openedTags.length > 0 && token.type === "punctuation" && token.content === "{") {
openedTags[openedTags.length - 1].openedBraces++;
} else if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces > 0 && token.type === "punctuation" && token.content === "}") {
openedTags[openedTags.length - 1].openedBraces--;
} else {
notTagNorBrace = true;
}
}
if (notTagNorBrace || typeof token === "string") {
if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces === 0) {
var plainText = stringifyToken(token);
if (i < tokens.length - 1 && (typeof tokens[i + 1] === "string" || tokens[i + 1].type === "plain-text")) {
plainText += stringifyToken(tokens[i + 1]);
tokens.splice(i + 1, 1);
}
if (i > 0 && (typeof tokens[i - 1] === "string" || tokens[i - 1].type === "plain-text")) {
plainText = stringifyToken(tokens[i - 1]) + plainText;
tokens.splice(i - 1, 1);
i--;
}
tokens[i] = new Prism2.Token("plain-text", plainText, null, plainText);
}
}
if (token.content && typeof token.content !== "string") {
walkTokens(token.content);
}
}
};
Prism2.hooks.add("after-tokenize", function(env) {
if (env.language !== "jsx" && env.language !== "tsx") {
return;
}
walkTokens(env.tokens);
});
})(Prism);
(function(Prism2) {
var typescript = Prism2.util.clone(Prism2.languages.typescript);
Prism2.languages.tsx = Prism2.languages.extend("jsx", typescript);
delete Prism2.languages.tsx["parameter"];
delete Prism2.languages.tsx["literal-property"];
var tag = Prism2.languages.tsx.tag;
tag.pattern = RegExp(/(^|[^\w$]|(?=<\/))/.source + "(?:" + tag.pattern.source + ")", tag.pattern.flags);
tag.lookbehind = true;
})(Prism);
Prism.languages.reason = Prism.languages.extend("clike", {
"string": {
pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,
greedy: true
},
"class-name": /\b[A-Z]\w*/,
"keyword": /\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,
"operator": /\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/
});
Prism.languages.insertBefore("reason", "class-name", {
"char": {
pattern: /'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,
greedy: true
},
"constructor": /\b[A-Z]\w*\b(?!\s*\.)/,
"label": {
pattern: /\b[a-z]\w*(?=::)/,
alias: "symbol"
}
});
delete Prism.languages.reason.function;
(function(Prism2) {
var specialEscape = {
pattern: /\\[\\(){}[\]^$+*?|.]/,
alias: "escape"
};
var escape = /\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/;
var charSet = {
pattern: /\.|\\[wsd]|\\p\{[^{}]+\}/i,
alias: "class-name"
};
var charSetWithoutDot = {
pattern: /\\[wsd]|\\p\{[^{}]+\}/i,
alias: "class-name"
};
var rangeChar = "(?:[^\\\\-]|" + escape.source + ")";
var range2 = RegExp(rangeChar + "-" + rangeChar);
var groupName = {
pattern: /(<|')[^<>']+(?=[>']$)/,
lookbehind: true,
alias: "variable"
};
Prism2.languages.regex = {
"char-class": {
pattern: /((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,
lookbehind: true,
inside: {
"char-class-negation": {
pattern: /(^\[)\^/,
lookbehind: true,
alias: "operator"
},
"char-class-punctuation": {
pattern: /^\[|\]$/,
alias: "punctuation"
},
"range": {
pattern: range2,
inside: {
"escape": escape,
"range-punctuation": {
pattern: /-/,
alias: "operator"
}
}
},
"special-escape": specialEscape,
"char-set": charSetWithoutDot,
"escape": escape
}
},
"special-escape": specialEscape,
"char-set": charSet,
"backreference": [
{
pattern: /\\(?![123][0-7]{2})[1-9]/,
alias: "keyword"
},
{
pattern: /\\k<[^<>']+>/,
alias: "keyword",
inside: {
"group-name": groupName
}
}
],
"anchor": {
pattern: /[$^]|\\[ABbGZz]/,
alias: "function"
},
"escape": escape,
"group": [
{
pattern: /\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,
alias: "punctuation",
inside: {
"group-name": groupName
}
},
{
pattern: /\)/,
alias: "punctuation"
}
],
"quantifier": {
pattern: /(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,
alias: "number"
},
"alternation": {
pattern: /\|/,
alias: "keyword"
}
};
})(Prism);
Prism.languages.rego = {
"comment": /#.*/,
"property": {
pattern: /(^|[^\\.])(?:"(?:\\.|[^\\"\r\n])*"|`[^`]*`|\b[a-z_]\w*\b)(?=\s*:(?!=))/i,
lookbehind: true,
greedy: true
},
"string": {
pattern: /(^|[^\\])"(?:\\.|[^\\"\r\n])*"|`[^`]*`/,
lookbehind: true,
greedy: true
},
"keyword": /\b(?:as|default|else|import|not|null|package|set(?=\s*\()|some|with)\b/,
"boolean": /\b(?:false|true)\b/,
"function": {
pattern: /\b[a-z_]\w*\b(?:\s*\.\s*\b[a-z_]\w*\b)*(?=\s*\()/i,
inside: {
"namespace": /\b\w+\b(?=\s*\.)/,
"punctuation": /\./
}
},
"number": /-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,
"operator": /[-+*/%|&]|[<>:=]=?|!=|\b_\b/,
"punctuation": /[,;.\[\]{}()]/
};
Prism.languages.renpy = {
"comment": {
pattern: /(^|[^\\])#.+/,
lookbehind: true
},
"string": {
pattern: /("""|''')[\s\S]+?\1|("|')(?:\\.|(?!\2)[^\\])*\2|(?:^#?(?:(?:[0-9a-fA-F]){3}|[0-9a-fA-F]{6})$)/m,
greedy: true
},
"function": /\b[a-z_]\w*(?=\()/i,
"property": /\b(?:Update|UpdateVersion|action|activate_sound|adv_nvl_transition|after_load_transition|align|alpha|alt|anchor|antialias|area|auto|background|bar_invert|bar_resizing|bar_vertical|black_color|bold|bottom_bar|bottom_gutter|bottom_margin|bottom_padding|box_reverse|box_wrap|can_update|caret|child|color|crop|default_afm_enable|default_afm_time|default_fullscreen|default_text_cps|developer|directory_name|drag_handle|drag_joined|drag_name|drag_raise|draggable|dragged|drop_shadow|drop_shadow_color|droppable|dropped|easein|easeout|edgescroll|end_game_transition|end_splash_transition|enter_replay_transition|enter_sound|enter_transition|enter_yesno_transition|executable_name|exit_replay_transition|exit_sound|exit_transition|exit_yesno_transition|fadein|fadeout|first_indent|first_spacing|fit_first|focus|focus_mask|font|foreground|game_main_transition|get_installed_packages|google_play_key|google_play_salt|ground|has_music|has_sound|has_voice|height|help|hinting|hover|hover_background|hover_color|hover_sound|hovered|hyperlink_functions|idle|idle_color|image_style|include_update|insensitive|insensitive_background|insensitive_color|inside|intra_transition|italic|justify|kerning|keyboard_focus|language|layer_clipping|layers|layout|left_bar|left_gutter|left_margin|left_padding|length|line_leading|line_overlap_split|line_spacing|linear|main_game_transition|main_menu_music|maximum|min_width|minimum|minwidth|modal|mouse|mousewheel|name|narrator_menu|newline_indent|nvl_adv_transition|offset|order_reverse|outlines|overlay_functions|pos|position|prefix|radius|range|rest_indent|right_bar|right_gutter|right_margin|right_padding|rotate|rotate_pad|ruby_style|sample_sound|save_directory|say_attribute_transition|screen_height|screen_width|scrollbars|selected_hover|selected_hover_color|selected_idle|selected_idle_color|selected_insensitive|show_side_image|show_two_window|side_spacing|side_xpos|side_ypos|size|size_group|slow_cps|slow_cps_multiplier|spacing|strikethrough|subpixel|text_align|text_style|text_xpos|text_y_fudge|text_ypos|thumb|thumb_offset|thumb_shadow|thumbnail_height|thumbnail_width|time|top_bar|top_gutter|top_margin|top_padding|translations|underline|unscrollable|update|value|version|version_name|version_tuple|vertical|width|window_hide_transition|window_icon|window_left_padding|window_show_transition|window_title|windows_icon|xadjustment|xalign|xanchor|xanchoraround|xaround|xcenter|xfill|xinitial|xmargin|xmaximum|xminimum|xoffset|xofsset|xpadding|xpos|xsize|xzoom|yadjustment|yalign|yanchor|yanchoraround|yaround|ycenter|yfill|yinitial|ymargin|ymaximum|yminimum|yoffset|ypadding|ypos|ysize|ysizexysize|yzoom|zoom|zorder)\b/,
"tag": /\b(?:bar|block|button|buttoscreenn|drag|draggroup|fixed|frame|grid|[hv]box|hotbar|hotspot|image|imagebutton|imagemap|input|key|label|menu|mm_menu_frame|mousearea|nvl|parallel|screen|self|side|tag|text|textbutton|timer|vbar|viewport|window)\b|\$/,
"keyword": /\b(?:None|add|adjustment|alignaround|allow|angle|animation|around|as|assert|behind|box_layout|break|build|cache|call|center|changed|child_size|choice|circles|class|clear|clicked|clipping|clockwise|config|contains|continue|corner1|corner2|counterclockwise|def|default|define|del|delay|disabled|disabled_text|dissolve|elif|else|event|except|exclude|exec|expression|fade|finally|for|from|function|global|gm_root|has|hide|id|if|import|in|init|is|jump|knot|lambda|left|less_rounded|mm_root|movie|music|null|on|onlayer|pass|pause|persistent|play|print|python|queue|raise|random|renpy|repeat|return|right|rounded_window|scene|scope|set|show|slow|slow_abortable|slow_done|sound|stop|store|style|style_group|substitute|suffix|theme|transform|transform_anchor|transpose|try|ui|unhovered|updater|use|voice|while|widget|widget_hover|widget_selected|widget_text|yield)\b/,
"boolean": /\b(?:[Ff]alse|[Tt]rue)\b/,
"number": /(?:\b(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?)|\B\.\d+)(?:e[+-]?\d+)?j?/i,
"operator": /[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:and|at|not|or|with)\b/,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.rpy = Prism.languages.renpy;
Prism.languages.rescript = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
greedy: true
},
"char": { pattern: /'(?:[^\r\n\\]|\\(?:.|\w+))'/, greedy: true },
"string": {
pattern: /"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,
greedy: true
},
"class-name": /\b[A-Z]\w*|@[a-z.]*|#[A-Za-z]\w*|#\d/,
"function": {
pattern: /[a-zA-Z]\w*(?=\()|(\.)[a-z]\w*/,
lookbehind: true
},
"number": /(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,
"boolean": /\b(?:false|true)\b/,
"attr-value": /[A-Za-z]\w*(?==)/,
"constant": {
pattern: /(\btype\s+)[a-z]\w*/,
lookbehind: true
},
"tag": {
pattern: /(<)[a-z]\w*|(?:<\/)[a-z]\w*/,
lookbehind: true,
inside: {
"operator": /<|>|\//
}
},
"keyword": /\b(?:and|as|assert|begin|bool|class|constraint|do|done|downto|else|end|exception|external|float|for|fun|function|if|in|include|inherit|initializer|int|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|string|switch|then|to|try|type|when|while|with)\b/,
"operator": /\.{3}|:[:=]?|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/,
"punctuation": /[(){}[\],;.]/
};
Prism.languages.insertBefore("rescript", "string", {
"template-string": {
pattern: /`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,
greedy: true,
inside: {
"template-punctuation": {
pattern: /^`|`$/,
alias: "string"
},
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,
lookbehind: true,
inside: {
"interpolation-punctuation": {
pattern: /^\$\{|\}$/,
alias: "tag"
},
rest: Prism.languages.rescript
}
},
"string": /[\s\S]+/
}
}
});
Prism.languages.res = Prism.languages.rescript;
Prism.languages.rest = {
"table": [
{
pattern: /(^[\t ]*)(?:\+[=-]+)+\+(?:\r?\n|\r)(?:\1[+|].+[+|](?:\r?\n|\r))+\1(?:\+[=-]+)+\+/m,
lookbehind: true,
inside: {
"punctuation": /\||(?:\+[=-]+)+\+/
}
},
{
pattern: /(^[\t ]*)=+ [ =]*=(?:(?:\r?\n|\r)\1.+)+(?:\r?\n|\r)\1=+ [ =]*=(?=(?:\r?\n|\r){2}|\s*$)/m,
lookbehind: true,
inside: {
"punctuation": /[=-]+/
}
}
],
"substitution-def": {
pattern: /(^[\t ]*\.\. )\|(?:[^|\s](?:[^|]*[^|\s])?)\| [^:]+::/m,
lookbehind: true,
inside: {
"substitution": {
pattern: /^\|(?:[^|\s]|[^|\s][^|]*[^|\s])\|/,
alias: "attr-value",
inside: {
"punctuation": /^\||\|$/
}
},
"directive": {
pattern: /( )(?! )[^:]+::/,
lookbehind: true,
alias: "function",
inside: {
"punctuation": /::$/
}
}
}
},
"link-target": [
{
pattern: /(^[\t ]*\.\. )\[[^\]]+\]/m,
lookbehind: true,
alias: "string",
inside: {
"punctuation": /^\[|\]$/
}
},
{
pattern: /(^[\t ]*\.\. )_(?:`[^`]+`|(?:[^:\\]|\\.)+):/m,
lookbehind: true,
alias: "string",
inside: {
"punctuation": /^_|:$/
}
}
],
"directive": {
pattern: /(^[\t ]*\.\. )[^:]+::/m,
lookbehind: true,
alias: "function",
inside: {
"punctuation": /::$/
}
},
"comment": {
pattern: /(^[\t ]*\.\.)(?:(?: .+)?(?:(?:\r?\n|\r).+)+| .+)(?=(?:\r?\n|\r){2}|$)/m,
lookbehind: true
},
"title": [
{
pattern: /^(([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+)(?:\r?\n|\r).+(?:\r?\n|\r)\1$/m,
inside: {
"punctuation": /^[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+|[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,
"important": /.+/
}
},
{
pattern: /(^|(?:\r?\n|\r){2}).+(?:\r?\n|\r)([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2+(?=\r?\n|\r|$)/,
lookbehind: true,
inside: {
"punctuation": /[!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]+$/,
"important": /.+/
}
}
],
"hr": {
pattern: /((?:\r?\n|\r){2})([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\2{3,}(?=(?:\r?\n|\r){2})/,
lookbehind: true,
alias: "punctuation"
},
"field": {
pattern: /(^[\t ]*):[^:\r\n]+:(?= )/m,
lookbehind: true,
alias: "attr-name"
},
"command-line-option": {
pattern: /(^[\t ]*)(?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?(?:, (?:[+-][a-z\d]|(?:--|\/)[a-z\d-]+)(?:[ =](?:[a-z][\w-]*|<[^<>]+>))?)*(?=(?:\r?\n|\r)? {2,}\S)/im,
lookbehind: true,
alias: "symbol"
},
"literal-block": {
pattern: /::(?:\r?\n|\r){2}([ \t]+)(?![ \t]).+(?:(?:\r?\n|\r)\1.+)*/,
inside: {
"literal-block-punctuation": {
pattern: /^::/,
alias: "punctuation"
}
}
},
"quoted-literal-block": {
pattern: /::(?:\r?\n|\r){2}([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~]).*(?:(?:\r?\n|\r)\1.*)*/,
inside: {
"literal-block-punctuation": {
pattern: /^(?:::|([!"#$%&'()*+,\-.\/:;<=>?@\[\\\]^_`{|}~])\1*)/m,
alias: "punctuation"
}
}
},
"list-bullet": {
pattern: /(^[\t ]*)(?:[*+\-•‣⁃]|\(?(?:\d+|[a-z]|[ivxdclm]+)\)|(?:\d+|[a-z]|[ivxdclm]+)\.)(?= )/im,
lookbehind: true,
alias: "punctuation"
},
"doctest-block": {
pattern: /(^[\t ]*)>>> .+(?:(?:\r?\n|\r).+)*/m,
lookbehind: true,
inside: {
"punctuation": /^>>>/
}
},
"inline": [
{
pattern: /(^|[\s\-:\/'"<(\[{])(?::[^:]+:`.*?`|`.*?`:[^:]+:|(\*\*?|``?|\|)(?!\s)(?:(?!\2).)*\S\2(?=[\s\-.,:;!?\\\/'")\]}]|$))/m,
lookbehind: true,
inside: {
"bold": {
pattern: /(^\*\*).+(?=\*\*$)/,
lookbehind: true
},
"italic": {
pattern: /(^\*).+(?=\*$)/,
lookbehind: true
},
"inline-literal": {
pattern: /(^``).+(?=``$)/,
lookbehind: true,
alias: "symbol"
},
"role": {
pattern: /^:[^:]+:|:[^:]+:$/,
alias: "function",
inside: {
"punctuation": /^:|:$/
}
},
"interpreted-text": {
pattern: /(^`).+(?=`$)/,
lookbehind: true,
alias: "attr-value"
},
"substitution": {
pattern: /(^\|).+(?=\|$)/,
lookbehind: true,
alias: "attr-value"
},
"punctuation": /\*\*?|``?|\|/
}
}
],
"link": [
{
pattern: /\[[^\[\]]+\]_(?=[\s\-.,:;!?\\\/'")\]}]|$)/,
alias: "string",
inside: {
"punctuation": /^\[|\]_$/
}
},
{
pattern: /(?:\b[a-z\d]+(?:[_.:+][a-z\d]+)*_?_|`[^`]+`_?_|_`[^`]+`)(?=[\s\-.,:;!?\\\/'")\]}]|$)/i,
alias: "string",
inside: {
"punctuation": /^_?`|`$|`?_?_$/
}
}
],
"punctuation": {
pattern: /(^[\t ]*)(?:\|(?= |$)|(?:---?|—|\.\.|__)(?= )|\.\.$)/m,
lookbehind: true
}
};
Prism.languages.rip = {
"comment": {
pattern: /#.*/,
greedy: true
},
"char": {
pattern: /\B`[^\s`'",.:;#\/\\()<>\[\]{}]\b/,
greedy: true
},
"string": {
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"regex": {
pattern: /(^|[^/])\/(?!\/)(?:\[[^\n\r\]]*\]|\\.|[^/\\\r\n\[])+\/(?=\s*(?:$|[\r\n,.;})]))/,
lookbehind: true,
greedy: true
},
"keyword": /(?:=>|->)|\b(?:case|catch|class|else|exit|finally|if|raise|return|switch|try)\b/,
"builtin": /@|\bSystem\b/,
"boolean": /\b(?:false|true)\b/,
"date": /\b\d{4}-\d{2}-\d{2}\b/,
"time": /\b\d{2}:\d{2}:\d{2}\b/,
"datetime": /\b\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\b/,
"symbol": /:[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/,
"number": /[+-]?\b(?:\d+\.\d+|\d+)\b/,
"punctuation": /(?:\.{2,3})|[`,.:;=\/\\()<>\[\]{}]/,
"reference": /[^\d\s`'",.:;#\/\\()<>\[\]{}][^\s`'",.:;#\/\\()<>\[\]{}]*/
};
Prism.languages.roboconf = {
"comment": /#.*/,
"keyword": {
"pattern": /(^|\s)(?:(?:external|import)\b|(?:facet|instance of)(?=[ \t]+[\w-]+[ \t]*\{))/,
lookbehind: true
},
"component": {
pattern: /[\w-]+(?=[ \t]*\{)/,
alias: "variable"
},
"property": /[\w.-]+(?=[ \t]*:)/,
"value": {
pattern: /(=[ \t]*(?![ \t]))[^,;]+/,
lookbehind: true,
alias: "attr-value"
},
"optional": {
pattern: /\(optional\)/,
alias: "builtin"
},
"wildcard": {
pattern: /(\.)\*/,
lookbehind: true,
alias: "operator"
},
"punctuation": /[{},.;:=]/
};
(function(Prism2) {
var comment = {
pattern: /(^[ \t]*| {2}|\t)#.*/m,
lookbehind: true,
greedy: true
};
var variable = {
pattern: /((?:^|[^\\])(?:\\{2})*)[$@&%]\{(?:[^{}\r\n]|\{[^{}\r\n]*\})*\}/,
lookbehind: true,
inside: {
"punctuation": /^[$@&%]\{|\}$/
}
};
function createSection(name, inside) {
var extendecInside = {};
extendecInside["section-header"] = {
pattern: /^ ?\*{3}.+?\*{3}/,
alias: "keyword"
};
for (var token in inside) {
extendecInside[token] = inside[token];
}
extendecInside["tag"] = {
pattern: /([\r\n](?: {2}|\t)[ \t]*)\[[-\w]+\]/,
lookbehind: true,
inside: {
"punctuation": /\[|\]/
}
};
extendecInside["variable"] = variable;
extendecInside["comment"] = comment;
return {
pattern: RegExp(/^ ?\*{3}[ \t]*<name>[ \t]*\*{3}(?:.|[\r\n](?!\*{3}))*/.source.replace(/<name>/g, function() {
return name;
}), "im"),
alias: "section",
inside: extendecInside
};
}
var docTag = {
pattern: /(\[Documentation\](?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,
lookbehind: true,
alias: "string"
};
var testNameLike = {
pattern: /([\r\n] ?)(?!#)(?:\S(?:[ \t]\S)*)+/,
lookbehind: true,
alias: "function",
inside: {
"variable": variable
}
};
var testPropertyLike = {
pattern: /([\r\n](?: {2}|\t)[ \t]*)(?!\[|\.{3}|#)(?:\S(?:[ \t]\S)*)+/,
lookbehind: true,
inside: {
"variable": variable
}
};
Prism2.languages["robotframework"] = {
"settings": createSection("Settings", {
"documentation": {
pattern: /([\r\n] ?Documentation(?: {2}|\t)[ \t]*)(?![ \t]|#)(?:.|(?:\r\n?|\n)[ \t]*\.{3})+/,
lookbehind: true,
alias: "string"
},
"property": {
pattern: /([\r\n] ?)(?!\.{3}|#)(?:\S(?:[ \t]\S)*)+/,
lookbehind: true
}
}),
"variables": createSection("Variables"),
"test-cases": createSection("Test Cases", {
"test-name": testNameLike,
"documentation": docTag,
"property": testPropertyLike
}),
"keywords": createSection("Keywords", {
"keyword-name": testNameLike,
"documentation": docTag,
"property": testPropertyLike
}),
"tasks": createSection("Tasks", {
"task-name": testNameLike,
"documentation": docTag,
"property": testPropertyLike
}),
"comment": comment
};
Prism2.languages.robot = Prism2.languages["robotframework"];
})(Prism);
(function(Prism2) {
var multilineComment = /\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source;
for (var i = 0; i < 2; i++) {
multilineComment = multilineComment.replace(/<self>/g, function() {
return multilineComment;
});
}
multilineComment = multilineComment.replace(/<self>/g, function() {
return /[^\s\S]/.source;
});
Prism2.languages.rust = {
"comment": [
{
pattern: RegExp(/(^|[^\\])/.source + multilineComment),
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"string": {
pattern: /b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,
greedy: true
},
"char": {
pattern: /b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,
greedy: true
},
"attribute": {
pattern: /#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,
greedy: true,
alias: "attr-name",
inside: {
"string": null
}
},
"closure-params": {
pattern: /([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,
lookbehind: true,
greedy: true,
inside: {
"closure-punctuation": {
pattern: /^\||\|$/,
alias: "punctuation"
},
rest: null
}
},
"lifetime-annotation": {
pattern: /'\w+/,
alias: "symbol"
},
"fragment-specifier": {
pattern: /(\$\w+:)[a-z]+/,
lookbehind: true,
alias: "punctuation"
},
"variable": /\$\w+/,
"function-definition": {
pattern: /(\bfn\s+)\w+/,
lookbehind: true,
alias: "function"
},
"type-definition": {
pattern: /(\b(?:enum|struct|trait|type|union)\s+)\w+/,
lookbehind: true,
alias: "class-name"
},
"module-declaration": [
{
pattern: /(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,
lookbehind: true,
alias: "namespace"
},
{
pattern: /(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,
lookbehind: true,
alias: "namespace",
inside: {
"punctuation": /::/
}
}
],
"keyword": [
/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,
/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/
],
"function": /\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,
"macro": {
pattern: /\b\w+!/,
alias: "property"
},
"constant": /\b[A-Z_][A-Z_\d]+\b/,
"class-name": /\b[A-Z]\w*\b/,
"namespace": {
pattern: /(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,
inside: {
"punctuation": /::/
}
},
"number": /\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,
"boolean": /\b(?:false|true)\b/,
"punctuation": /->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,
"operator": /[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/
};
Prism2.languages.rust["closure-params"].inside.rest = Prism2.languages.rust;
Prism2.languages.rust["attribute"].inside["string"] = Prism2.languages.rust["string"];
})(Prism);
(function(Prism2) {
var stringPattern = /(?:"(?:""|[^"])*"(?!")|'(?:''|[^'])*'(?!'))/.source;
var number = /\b(?:\d[\da-f]*x|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i;
var numericConstant = {
pattern: RegExp(stringPattern + "[bx]"),
alias: "number"
};
var macroVariable = {
pattern: /&[a-z_]\w*/i
};
var macroKeyword = {
pattern: /((?:^|\s|=|\())%(?:ABORT|BY|CMS|COPY|DISPLAY|DO|ELSE|END|EVAL|GLOBAL|GO|GOTO|IF|INC|INCLUDE|INDEX|INPUT|KTRIM|LENGTH|LET|LIST|LOCAL|PUT|QKTRIM|QSCAN|QSUBSTR|QSYSFUNC|QUPCASE|RETURN|RUN|SCAN|SUBSTR|SUPERQ|SYMDEL|SYMEXIST|SYMGLOBL|SYMLOCAL|SYSCALL|SYSEVALF|SYSEXEC|SYSFUNC|SYSGET|SYSRPUT|THEN|TO|TSO|UNQUOTE|UNTIL|UPCASE|WHILE|WINDOW)\b/i,
lookbehind: true,
alias: "keyword"
};
var step = {
pattern: /(^|\s)(?:proc\s+\w+|data(?!=)|quit|run)\b/i,
alias: "keyword",
lookbehind: true
};
var comment = [
/\/\*[\s\S]*?\*\//,
{
pattern: /(^[ \t]*|;\s*)\*[^;]*;/m,
lookbehind: true
}
];
var string = {
pattern: RegExp(stringPattern),
greedy: true
};
var punctuation = /[$%@.(){}\[\];,\\]/;
var func = {
pattern: /%?\b\w+(?=\()/,
alias: "keyword"
};
var args = {
"function": func,
"arg-value": {
pattern: /(=\s*)[A-Z\.]+/i,
lookbehind: true
},
"operator": /=/,
"macro-variable": macroVariable,
"arg": {
pattern: /[A-Z]+/i,
alias: "keyword"
},
"number": number,
"numeric-constant": numericConstant,
"punctuation": punctuation,
"string": string
};
var format2 = {
pattern: /\b(?:format|put)\b=?[\w'$.]+/i,
inside: {
"keyword": /^(?:format|put)(?==)/i,
"equals": /=/,
"format": {
pattern: /(?:\w|\$\d)+\.\d?/,
alias: "number"
}
}
};
var altformat = {
pattern: /\b(?:format|put)\s+[\w']+(?:\s+[$.\w]+)+(?=;)/i,
inside: {
"keyword": /^(?:format|put)/i,
"format": {
pattern: /[\w$]+\.\d?/,
alias: "number"
}
}
};
var globalStatements = {
pattern: /((?:^|\s)=?)(?:catname|checkpoint execute_always|dm|endsas|filename|footnote|%include|libname|%list|lock|missing|options|page|resetline|%run|sasfile|skip|sysecho|title\d?)\b/i,
lookbehind: true,
alias: "keyword"
};
var submitStatement = {
pattern: /(^|\s)(?:submit(?:\s+(?:load|norun|parseonly))?|endsubmit)\b/i,
lookbehind: true,
alias: "keyword"
};
var actionSets = /aStore|accessControl|aggregation|audio|autotune|bayesianNetClassifier|bioMedImage|boolRule|builtins|cardinality|cdm|clustering|conditionalRandomFields|configuration|copula|countreg|dataDiscovery|dataPreprocess|dataSciencePilot|dataStep|decisionTree|deduplication|deepLearn|deepNeural|deepRnn|ds2|ecm|entityRes|espCluster|explainModel|factmac|fastKnn|fcmpact|fedSql|freqTab|gVarCluster|gam|gleam|graphSemiSupLearn|hiddenMarkovModel|hyperGroup|ica|image|iml|kernalPca|langModel|ldaTopic|loadStreams|mbc|mixed|mlTools|modelPublishing|network|neuralNet|nmf|nonParametricBayes|nonlinear|optNetwork|optimization|panel|pca|percentile|phreg|pls|qkb|qlim|quantreg|recommend|regression|reinforcementLearn|robustPca|ruleMining|sampling|sandwich|sccasl|search(?:Analytics)?|sentimentAnalysis|sequence|session(?:Prop)?|severity|simSystem|simple|smartData|sparkEmbeddedProcess|sparseML|spatialreg|spc|stabilityMonitoring|svDataDescription|svm|table|text(?:Filters|Frequency|Mining|Parse|Rule(?:Develop|Score)|Topic|Util)|timeData|transpose|tsInfo|tsReconcile|uniTimeSeries|varReduce/.source;
var casActions = {
pattern: RegExp(/(^|\s)(?:action\s+)?(?:<act>)\.[a-z]+\b[^;]+/.source.replace(/<act>/g, function() {
return actionSets;
}), "i"),
lookbehind: true,
inside: {
"keyword": RegExp(/(?:<act>)\.[a-z]+\b/.source.replace(/<act>/g, function() {
return actionSets;
}), "i"),
"action": {
pattern: /(?:action)/i,
alias: "keyword"
},
"comment": comment,
"function": func,
"arg-value": args["arg-value"],
"operator": args.operator,
"argument": args.arg,
"number": number,
"numeric-constant": numericConstant,
"punctuation": punctuation,
"string": string
}
};
var keywords = {
pattern: /((?:^|\s)=?)(?:after|analysis|and|array|barchart|barwidth|begingraph|by|call|cas|cbarline|cfill|class(?:lev)?|close|column|computed?|contains|continue|data(?==)|define|delete|describe|document|do\s+over|do|dol|drop|dul|else|end(?:comp|source)?|entryTitle|eval(?:uate)?|exec(?:ute)?|exit|file(?:name)?|fill(?:attrs)?|flist|fnc|function(?:list)?|global|goto|group(?:by)?|headline|headskip|histogram|if|infile|keep|keylabel|keyword|label|layout|leave|legendlabel|length|libname|loadactionset|merge|midpoints|_?null_|name|noobs|nowd|ods|options|or|otherwise|out(?:put)?|over(?:lay)?|plot|print|put|raise|ranexp|rannor|rbreak|retain|return|select|session|sessref|set|source|statgraph|sum|summarize|table|temp|terminate|then\s+do|then|title\d?|to|var|when|where|xaxisopts|y2axisopts|yaxisopts)\b/i,
lookbehind: true
};
Prism2.languages.sas = {
"datalines": {
pattern: /^([ \t]*)(?:cards|(?:data)?lines);[\s\S]+?^[ \t]*;/im,
lookbehind: true,
alias: "string",
inside: {
"keyword": {
pattern: /^(?:cards|(?:data)?lines)/i
},
"punctuation": /;/
}
},
"proc-sql": {
pattern: /(^proc\s+(?:fed)?sql(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,
lookbehind: true,
inside: {
"sql": {
pattern: RegExp(/^[ \t]*(?:select|alter\s+table|(?:create|describe|drop)\s+(?:index|table(?:\s+constraints)?|view)|create\s+unique\s+index|insert\s+into|update)(?:<str>|[^;"'])+;/.source.replace(/<str>/g, function() {
return stringPattern;
}), "im"),
alias: "language-sql",
inside: Prism2.languages.sql
},
"global-statements": globalStatements,
"sql-statements": {
pattern: /(^|\s)(?:disconnect\s+from|begin|commit|exec(?:ute)?|reset|rollback|validate)\b/i,
lookbehind: true,
alias: "keyword"
},
"number": number,
"numeric-constant": numericConstant,
"punctuation": punctuation,
"string": string
}
},
"proc-groovy": {
pattern: /(^proc\s+groovy(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,
lookbehind: true,
inside: {
"comment": comment,
"groovy": {
pattern: RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:<str>|[^"'])+?(?=endsubmit;)/.source.replace(/<str>/g, function() {
return stringPattern;
}), "im"),
lookbehind: true,
alias: "language-groovy",
inside: Prism2.languages.groovy
},
"keyword": keywords,
"submit-statement": submitStatement,
"global-statements": globalStatements,
"number": number,
"numeric-constant": numericConstant,
"punctuation": punctuation,
"string": string
}
},
"proc-lua": {
pattern: /(^proc\s+lua(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|data|quit|run);|(?![\s\S]))/im,
lookbehind: true,
inside: {
"comment": comment,
"lua": {
pattern: RegExp(/(^[ \t]*submit(?:\s+(?:load|norun|parseonly))?)(?:<str>|[^"'])+?(?=endsubmit;)/.source.replace(/<str>/g, function() {
return stringPattern;
}), "im"),
lookbehind: true,
alias: "language-lua",
inside: Prism2.languages.lua
},
"keyword": keywords,
"submit-statement": submitStatement,
"global-statements": globalStatements,
"number": number,
"numeric-constant": numericConstant,
"punctuation": punctuation,
"string": string
}
},
"proc-cas": {
pattern: /(^proc\s+cas(?:\s+[\w|=]+)?;)[\s\S]+?(?=^(?:proc\s+\w+|quit|data);|(?![\s\S]))/im,
lookbehind: true,
inside: {
"comment": comment,
"statement-var": {
pattern: /((?:^|\s)=?)saveresult\s[^;]+/im,
lookbehind: true,
inside: {
"statement": {
pattern: /^saveresult\s+\S+/i,
inside: {
keyword: /^(?:saveresult)/i
}
},
rest: args
}
},
"cas-actions": casActions,
"statement": {
pattern: /((?:^|\s)=?)(?:default|(?:un)?set|on|output|upload)[^;]+/im,
lookbehind: true,
inside: args
},
"step": step,
"keyword": keywords,
"function": func,
"format": format2,
"altformat": altformat,
"global-statements": globalStatements,
"number": number,
"numeric-constant": numericConstant,
"punctuation": punctuation,
"string": string
}
},
"proc-args": {
pattern: RegExp(/(^proc\s+\w+\s+)(?!\s)(?:[^;"']|<str>)+;/.source.replace(/<str>/g, function() {
return stringPattern;
}), "im"),
lookbehind: true,
inside: args
},
"macro-keyword": macroKeyword,
"macro-variable": macroVariable,
"macro-string-functions": {
pattern: /((?:^|\s|=))%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)\(.*?(?:[^%]\))/i,
lookbehind: true,
inside: {
"function": {
pattern: /%(?:BQUOTE|NRBQUOTE|NRQUOTE|NRSTR|QUOTE|STR)/i,
alias: "keyword"
},
"macro-keyword": macroKeyword,
"macro-variable": macroVariable,
"escaped-char": {
pattern: /%['"()<>=¬^~;,#]/
},
"punctuation": punctuation
}
},
"macro-declaration": {
pattern: /^%macro[^;]+(?=;)/im,
inside: {
"keyword": /%macro/i
}
},
"macro-end": {
pattern: /^%mend[^;]+(?=;)/im,
inside: {
"keyword": /%mend/i
}
},
"macro": {
pattern: /%_\w+(?=\()/,
alias: "keyword"
},
"input": {
pattern: /\binput\s[-\w\s/*.$&]+;/i,
inside: {
"input": {
alias: "keyword",
pattern: /^input/i
},
"comment": comment,
"number": number,
"numeric-constant": numericConstant
}
},
"options-args": {
pattern: /(^options)[-'"|/\\<>*+=:()\w\s]*(?=;)/im,
lookbehind: true,
inside: args
},
"cas-actions": casActions,
"comment": comment,
"function": func,
"format": format2,
"altformat": altformat,
"numeric-constant": numericConstant,
"datetime": {
pattern: RegExp(stringPattern + "(?:dt?|t)"),
alias: "number"
},
"string": string,
"step": step,
"keyword": keywords,
"operator-keyword": {
pattern: /\b(?:eq|ge|gt|in|le|lt|ne|not)\b/i,
alias: "operator"
},
"number": number,
"operator": /\*\*?|\|\|?|!!?|¦¦?|<[>=]?|>[<=]?|[-+\/=&]|[~¬^]=?/,
"punctuation": punctuation
};
})(Prism);
(function(Prism2) {
Prism2.languages.sass = Prism2.languages.extend("css", {
"comment": {
pattern: /^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,
lookbehind: true,
greedy: true
}
});
Prism2.languages.insertBefore("sass", "atrule", {
"atrule-line": {
pattern: /^(?:[ \t]*)[@+=].+/m,
greedy: true,
inside: {
"atrule": /(?:@[\w-]+|[+=])/
}
}
});
delete Prism2.languages.sass.atrule;
var variable = /\$[-\w]+|#\{\$[-\w]+\}/;
var operator = [
/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,
{
pattern: /(\s)-(?=\s)/,
lookbehind: true
}
];
Prism2.languages.insertBefore("sass", "property", {
"variable-line": {
pattern: /^[ \t]*\$.+/m,
greedy: true,
inside: {
"punctuation": /:/,
"variable": variable,
"operator": operator
}
},
"property-line": {
pattern: /^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,
greedy: true,
inside: {
"property": [
/[^:\s]+(?=\s*:)/,
{
pattern: /(:)[^:\s]+/,
lookbehind: true
}
],
"punctuation": /:/,
"variable": variable,
"operator": operator,
"important": Prism2.languages.sass.important
}
}
});
delete Prism2.languages.sass.property;
delete Prism2.languages.sass.important;
Prism2.languages.insertBefore("sass", "punctuation", {
"selector": {
pattern: /^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,
lookbehind: true,
greedy: true
}
});
})(Prism);
Prism.languages.scss = Prism.languages.extend("css", {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
lookbehind: true
},
"atrule": {
pattern: /@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,
inside: {
"rule": /@[\w-]+/
}
},
"url": /(?:[-a-z]+-)?url(?=\()/i,
"selector": {
pattern: /(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,
inside: {
"parent": {
pattern: /&/,
alias: "important"
},
"placeholder": /%[-\w]+/,
"variable": /\$[-\w]+|#\{\$[-\w]+\}/
}
},
"property": {
pattern: /(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,
inside: {
"variable": /\$[-\w]+|#\{\$[-\w]+\}/
}
}
});
Prism.languages.insertBefore("scss", "atrule", {
"keyword": [
/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,
{
pattern: /( )(?:from|through)(?= )/,
lookbehind: true
}
]
});
Prism.languages.insertBefore("scss", "important", {
"variable": /\$[-\w]+|#\{\$[-\w]+\}/
});
Prism.languages.insertBefore("scss", "function", {
"module-modifier": {
pattern: /\b(?:as|hide|show|with)\b/i,
alias: "keyword"
},
"placeholder": {
pattern: /%[-\w]+/,
alias: "selector"
},
"statement": {
pattern: /\B!(?:default|optional)\b/i,
alias: "keyword"
},
"boolean": /\b(?:false|true)\b/,
"null": {
pattern: /\bnull\b/,
alias: "keyword"
},
"operator": {
pattern: /(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,
lookbehind: true
}
});
Prism.languages.scss["atrule"].inside.rest = Prism.languages.scss;
Prism.languages.scala = Prism.languages.extend("java", {
"triple-quoted-string": {
pattern: /"""[\s\S]*?"""/,
greedy: true,
alias: "string"
},
"string": {
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"keyword": /<-|=>|\b(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|null|object|override|package|private|protected|return|sealed|self|super|this|throw|trait|try|type|val|var|while|with|yield)\b/,
"number": /\b0x(?:[\da-f]*\.)?[\da-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e\d+)?[dfl]?/i,
"builtin": /\b(?:Any|AnyRef|AnyVal|Boolean|Byte|Char|Double|Float|Int|Long|Nothing|Short|String|Unit)\b/,
"symbol": /'[^\d\s\\]\w*/
});
Prism.languages.insertBefore("scala", "triple-quoted-string", {
"string-interpolation": {
pattern: /\b[a-z]\w*(?:"""(?:[^$]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*?"""|"(?:[^$"\r\n]|\$(?:[^{]|\{(?:[^{}]|\{[^{}]*\})*\}))*")/i,
greedy: true,
inside: {
"id": {
pattern: /^\w+/,
greedy: true,
alias: "function"
},
"escape": {
pattern: /\\\$"|\$[$"]/,
greedy: true,
alias: "symbol"
},
"interpolation": {
pattern: /\$(?:\w+|\{(?:[^{}]|\{[^{}]*\})*\})/,
greedy: true,
inside: {
"punctuation": /^\$\{?|\}$/,
"expression": {
pattern: /[\s\S]+/,
inside: Prism.languages.scala
}
}
},
"string": /[\s\S]+/
}
}
});
delete Prism.languages.scala["class-name"];
delete Prism.languages.scala["function"];
(function(Prism2) {
var strings = [
/"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/.source,
/'[^']*'/.source,
/\$'(?:[^'\\]|\\[\s\S])*'/.source,
/<<-?\s*(["']?)(\w+)\1\s[\s\S]*?[\r\n]\2/.source
].join("|");
Prism2.languages["shell-session"] = {
"command": {
pattern: RegExp(
/^/.source + "(?:" + (/[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+(?::[^\0-\x1F$#%*?"<>:;|]+)?/.source + "|" + /[/~.][^\0-\x1F$#%*?"<>@:;|]*/.source) + ")?" + /[$#%](?=\s)/.source + /(?:[^\\\r\n \t'"<$]|[ \t](?:(?!#)|#.*$)|\\(?:[^\r]|\r\n?)|\$(?!')|<(?!<)|<<str>>)+/.source.replace(/<<str>>/g, function() {
return strings;
}),
"m"
),
greedy: true,
inside: {
"info": {
pattern: /^[^#$%]+/,
alias: "punctuation",
inside: {
"user": /^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,
"punctuation": /:/,
"path": /[\s\S]+/
}
},
"bash": {
pattern: /(^[$#%]\s*)\S[\s\S]*/,
lookbehind: true,
alias: "language-bash",
inside: Prism2.languages.bash
},
"shell-symbol": {
pattern: /^[$#%]/,
alias: "important"
}
}
},
"output": /.(?:.*(?:[\r\n]|.$))*/
};
Prism2.languages["sh-session"] = Prism2.languages["shellsession"] = Prism2.languages["shell-session"];
})(Prism);
Prism.languages.smali = {
"comment": /#.*/,
"string": {
pattern: /"(?:[^\r\n\\"]|\\.)*"|'(?:[^\r\n\\']|\\(?:.|u[\da-fA-F]{4}))'/,
greedy: true
},
"class-name": {
pattern: /(^|[^L])L(?:(?:\w+|`[^`\r\n]*`)\/)*(?:[\w$]+|`[^`\r\n]*`)(?=\s*;)/,
lookbehind: true,
inside: {
"class-name": {
pattern: /(^L|\/)(?:[\w$]+|`[^`\r\n]*`)$/,
lookbehind: true
},
"namespace": {
pattern: /^(L)(?:(?:\w+|`[^`\r\n]*`)\/)+/,
lookbehind: true,
inside: {
"punctuation": /\//
}
},
"builtin": /^L/
}
},
"builtin": [
{
pattern: /([();\[])[BCDFIJSVZ]+/,
lookbehind: true
},
{
pattern: /([\w$>]:)[BCDFIJSVZ]/,
lookbehind: true
}
],
"keyword": [
{
pattern: /(\.end\s+)[\w-]+/,
lookbehind: true
},
{
pattern: /(^|[^\w.-])\.(?!\d)[\w-]+/,
lookbehind: true
},
{
pattern: /(^|[^\w.-])(?:abstract|annotation|bridge|constructor|enum|final|interface|private|protected|public|runtime|static|synthetic|system|transient)(?![\w.-])/,
lookbehind: true
}
],
"function": {
pattern: /(^|[^\w.-])(?:\w+|<[\w$-]+>)(?=\()/,
lookbehind: true
},
"field": {
pattern: /[\w$]+(?=:)/,
alias: "variable"
},
"register": {
pattern: /(^|[^\w.-])[vp]\d(?![\w.-])/,
lookbehind: true,
alias: "variable"
},
"boolean": {
pattern: /(^|[^\w.-])(?:false|true)(?![\w.-])/,
lookbehind: true
},
"number": {
pattern: /(^|[^/\w.-])-?(?:NAN|INFINITY|0x(?:[\dA-F]+(?:\.[\dA-F]*)?|\.[\dA-F]+)(?:p[+-]?[\dA-F]+)?|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?)[dflst]?(?![\w.-])/i,
lookbehind: true
},
"label": {
pattern: /(:)\w+/,
lookbehind: true,
alias: "property"
},
"operator": /->|\.\.|[\[=]/,
"punctuation": /[{}(),;:]/
};
Prism.languages.smalltalk = {
"comment": {
pattern: /"(?:""|[^"])*"/,
greedy: true
},
"char": {
pattern: /\$./,
greedy: true
},
"string": {
pattern: /'(?:''|[^'])*'/,
greedy: true
},
"symbol": /#[\da-z]+|#(?:-|([+\/\\*~<>=@%|&?!])\1?)|#(?=\()/i,
"block-arguments": {
pattern: /(\[\s*):[^\[|]*\|/,
lookbehind: true,
inside: {
"variable": /:[\da-z]+/i,
"punctuation": /\|/
}
},
"temporary-variables": {
pattern: /\|[^|]+\|/,
inside: {
"variable": /[\da-z]+/i,
"punctuation": /\|/
}
},
"keyword": /\b(?:new|nil|self|super)\b/,
"boolean": /\b(?:false|true)\b/,
"number": [
/\d+r-?[\dA-Z]+(?:\.[\dA-Z]+)?(?:e-?\d+)?/,
/\b\d+(?:\.\d+)?(?:e-?\d+)?/
],
"operator": /[<=]=?|:=|~[~=]|\/\/?|\\\\|>[>=]?|[!^+\-*&|,@]/,
"punctuation": /[.;:?\[\](){}]/
};
(function(Prism2) {
Prism2.languages.smarty = {
"comment": {
pattern: /^\{\*[\s\S]*?\*\}/,
greedy: true
},
"embedded-php": {
pattern: /^\{php\}[\s\S]*?\{\/php\}/,
greedy: true,
inside: {
"smarty": {
pattern: /^\{php\}|\{\/php\}$/,
inside: null
},
"php": {
pattern: /[\s\S]+/,
alias: "language-php",
inside: Prism2.languages.php
}
}
},
"string": [
{
pattern: /"(?:\\.|[^"\\\r\n])*"/,
greedy: true,
inside: {
"interpolation": {
pattern: /\{[^{}]*\}|`[^`]*`/,
inside: {
"interpolation-punctuation": {
pattern: /^[{`]|[`}]$/,
alias: "punctuation"
},
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
},
"variable": /\$\w+/
}
},
{
pattern: /'(?:\\.|[^'\\\r\n])*'/,
greedy: true
}
],
"keyword": {
pattern: /(^\{\/?)[a-z_]\w*\b(?!\()/i,
lookbehind: true,
greedy: true
},
"delimiter": {
pattern: /^\{\/?|\}$/,
greedy: true,
alias: "punctuation"
},
"number": /\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,
"variable": [
/\$(?!\d)\w+/,
/#(?!\d)\w+#/,
{
pattern: /(\.|->|\w\s*=)(?!\d)\w+\b(?!\()/,
lookbehind: true
},
{
pattern: /(\[)(?!\d)\w+(?=\])/,
lookbehind: true
}
],
"function": {
pattern: /(\|\s*)@?[a-z_]\w*|\b[a-z_]\w*(?=\()/i,
lookbehind: true
},
"attr-name": /\b[a-z_]\w*(?=\s*=)/i,
"boolean": /\b(?:false|no|off|on|true|yes)\b/,
"punctuation": /[\[\](){}.,:`]|->/,
"operator": [
/[+\-*\/%]|==?=?|[!<>]=?|&&|\|\|?/,
/\bis\s+(?:not\s+)?(?:div|even|odd)(?:\s+by)?\b/,
/\b(?:and|eq|gt?e|gt|lt?e|lt|mod|neq?|not|or)\b/
]
};
Prism2.languages.smarty["embedded-php"].inside.smarty.inside = Prism2.languages.smarty;
Prism2.languages.smarty.string[0].inside.interpolation.inside.expression.inside = Prism2.languages.smarty;
var string = /"(?:\\.|[^"\\\r\n])*"|'(?:\\.|[^'\\\r\n])*'/;
var smartyPattern = RegExp(
/\{\*[\s\S]*?\*\}/.source + "|" + /\{php\}[\s\S]*?\{\/php\}/.source + "|" + /\{(?:[^{}"']|<str>|\{(?:[^{}"']|<str>|\{(?:[^{}"']|<str>)*\})*\})*\}/.source.replace(/<str>/g, function() {
return string.source;
}),
"g"
);
Prism2.hooks.add("before-tokenize", function(env) {
var smartyLiteralStart = "{literal}";
var smartyLiteralEnd = "{/literal}";
var smartyLiteralMode = false;
Prism2.languages["markup-templating"].buildPlaceholders(env, "smarty", smartyPattern, function(match) {
if (match === smartyLiteralEnd) {
smartyLiteralMode = false;
}
if (!smartyLiteralMode) {
if (match === smartyLiteralStart) {
smartyLiteralMode = true;
}
return true;
}
return false;
});
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "smarty");
});
})(Prism);
(function(Prism2) {
var keywords = /\b(?:abstype|and|andalso|as|case|datatype|do|else|end|eqtype|exception|fn|fun|functor|handle|if|in|include|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|sharing|sig|signature|struct|structure|then|type|val|where|while|with|withtype)\b/i;
Prism2.languages.sml = {
"comment": /\(\*(?:[^*(]|\*(?!\))|\((?!\*)|\(\*(?:[^*(]|\*(?!\))|\((?!\*))*\*\))*\*\)/,
"string": {
pattern: /#?"(?:[^"\\]|\\.)*"/,
greedy: true
},
"class-name": [
{
pattern: RegExp(
/((?:^|[^:]):\s*)<TERMINAL>(?:\s*(?:(?:\*|->)\s*<TERMINAL>|,\s*<TERMINAL>(?:(?=<NOT-LAST>)|(?!<NOT-LAST>)\s+<LONG-ID>)))*/.source.replace(/<NOT-LAST>/g, function() {
return /\s*(?:[*,]|->)/.source;
}).replace(/<TERMINAL>/g, function() {
return /(?:'[\w']*|<LONG-ID>|\((?:[^()]|\([^()]*\))*\)|\{(?:[^{}]|\{[^{}]*\})*\})(?:\s+<LONG-ID>)*/.source;
}).replace(/<LONG-ID>/g, function() {
return /(?!<KEYWORD>)[a-z\d_][\w'.]*/.source;
}).replace(/<KEYWORD>/g, function() {
return keywords.source;
}),
"i"
),
lookbehind: true,
greedy: true,
inside: null
},
{
pattern: /((?:^|[^\w'])(?:datatype|exception|functor|signature|structure|type)\s+)[a-z_][\w'.]*/i,
lookbehind: true
}
],
"function": {
pattern: /((?:^|[^\w'])fun\s+)[a-z_][\w'.]*/i,
lookbehind: true
},
"keyword": keywords,
"variable": {
pattern: /(^|[^\w'])'[\w']*/,
lookbehind: true
},
"number": /~?\b(?:\d+(?:\.\d+)?(?:e~?\d+)?|0x[\da-f]+)\b/i,
"word": {
pattern: /\b0w(?:\d+|x[\da-f]+)\b/i,
alias: "constant"
},
"boolean": /\b(?:false|true)\b/i,
"operator": /\.\.\.|:[>=:]|=>?|->|[<>]=?|[!+\-*/^#|@~]/,
"punctuation": /[(){}\[\].:,;]/
};
Prism2.languages.sml["class-name"][0].inside = Prism2.languages.sml;
Prism2.languages.smlnj = Prism2.languages.sml;
})(Prism);
Prism.languages.solidity = Prism.languages.extend("clike", {
"class-name": {
pattern: /(\b(?:contract|enum|interface|library|new|struct|using)\s+)(?!\d)[\w$]+/,
lookbehind: true
},
"keyword": /\b(?:_|anonymous|as|assembly|assert|break|calldata|case|constant|constructor|continue|contract|default|delete|do|else|emit|enum|event|external|for|from|function|if|import|indexed|inherited|interface|internal|is|let|library|mapping|memory|modifier|new|payable|pragma|private|public|pure|require|returns?|revert|selfdestruct|solidity|storage|struct|suicide|switch|this|throw|using|var|view|while)\b/,
"operator": /=>|->|:=|=:|\*\*|\+\+|--|\|\||&&|<<=?|>>=?|[-+*/%^&|<>!=]=?|[~?]/
});
Prism.languages.insertBefore("solidity", "keyword", {
"builtin": /\b(?:address|bool|byte|u?int(?:8|16|24|32|40|48|56|64|72|80|88|96|104|112|120|128|136|144|152|160|168|176|184|192|200|208|216|224|232|240|248|256)?|string|bytes(?:[1-9]|[12]\d|3[0-2])?)\b/
});
Prism.languages.insertBefore("solidity", "number", {
"version": {
pattern: /([<>]=?|\^)\d+\.\d+\.\d+\b/,
lookbehind: true,
alias: "number"
}
});
Prism.languages.sol = Prism.languages.solidity;
(function(Prism2) {
var guid = {
pattern: /\{[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}\}/i,
alias: "constant",
inside: {
"punctuation": /[{}]/
}
};
Prism2.languages["solution-file"] = {
"comment": {
pattern: /#.*/,
greedy: true
},
"string": {
pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
greedy: true,
inside: {
"guid": guid
}
},
"object": {
pattern: /^([ \t]*)(?:([A-Z]\w*)\b(?=.*(?:\r\n?|\n)(?:\1[ \t].*(?:\r\n?|\n))*\1End\2(?=[ \t]*$))|End[A-Z]\w*(?=[ \t]*$))/m,
lookbehind: true,
greedy: true,
alias: "keyword"
},
"property": {
pattern: /^([ \t]*)(?!\s)[^\r\n"#=()]*[^\s"#=()](?=\s*=)/m,
lookbehind: true,
inside: {
"guid": guid
}
},
"guid": guid,
"number": /\b\d+(?:\.\d+)*\b/,
"boolean": /\b(?:FALSE|TRUE)\b/,
"operator": /=/,
"punctuation": /[(),]/
};
Prism2.languages["sln"] = Prism2.languages["solution-file"];
})(Prism);
(function(Prism2) {
var stringPattern = /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;
var numberPattern = /\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b|\b0x[\dA-F]+\b/;
Prism2.languages.soy = {
"comment": [
/\/\*[\s\S]*?\*\//,
{
pattern: /(\s)\/\/.*/,
lookbehind: true,
greedy: true
}
],
"command-arg": {
pattern: /(\{+\/?\s*(?:alias|call|delcall|delpackage|deltemplate|namespace|template)\s+)\.?[\w.]+/,
lookbehind: true,
alias: "string",
inside: {
"punctuation": /\./
}
},
"parameter": {
pattern: /(\{+\/?\s*@?param\??\s+)\.?[\w.]+/,
lookbehind: true,
alias: "variable"
},
"keyword": [
{
pattern: /(\{+\/?[^\S\r\n]*)(?:\\[nrt]|alias|call|case|css|default|delcall|delpackage|deltemplate|else(?:if)?|fallbackmsg|for(?:each)?|if(?:empty)?|lb|let|literal|msg|namespace|nil|@?param\??|rb|sp|switch|template|xid)/,
lookbehind: true
},
/\b(?:any|as|attributes|bool|css|float|html|in|int|js|list|map|null|number|string|uri)\b/
],
"delimiter": {
pattern: /^\{+\/?|\/?\}+$/,
alias: "punctuation"
},
"property": /\w+(?==)/,
"variable": {
pattern: /\$[^\W\d]\w*(?:\??(?:\.\w+|\[[^\]]+\]))*/,
inside: {
"string": {
pattern: stringPattern,
greedy: true
},
"number": numberPattern,
"punctuation": /[\[\].?]/
}
},
"string": {
pattern: stringPattern,
greedy: true
},
"function": [
/\w+(?=\()/,
{
pattern: /(\|[^\S\r\n]*)\w+/,
lookbehind: true
}
],
"boolean": /\b(?:false|true)\b/,
"number": numberPattern,
"operator": /\?:?|<=?|>=?|==?|!=|[+*/%-]|\b(?:and|not|or)\b/,
"punctuation": /[{}()\[\]|.,:]/
};
Prism2.hooks.add("before-tokenize", function(env) {
var soyPattern = /\{\{.+?\}\}|\{.+?\}|\s\/\/.*|\/\*[\s\S]*?\*\//g;
var soyLitteralStart = "{literal}";
var soyLitteralEnd = "{/literal}";
var soyLitteralMode = false;
Prism2.languages["markup-templating"].buildPlaceholders(env, "soy", soyPattern, function(match) {
if (match === soyLitteralEnd) {
soyLitteralMode = false;
}
if (!soyLitteralMode) {
if (match === soyLitteralStart) {
soyLitteralMode = true;
}
return true;
}
return false;
});
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "soy");
});
})(Prism);
Prism.languages.turtle = {
"comment": {
pattern: /#.*/,
greedy: true
},
"multiline-string": {
pattern: /"""(?:(?:""?)?(?:[^"\\]|\\.))*"""|'''(?:(?:''?)?(?:[^'\\]|\\.))*'''/,
greedy: true,
alias: "string",
inside: {
"comment": /#.*/
}
},
"string": {
pattern: /"(?:[^\\"\r\n]|\\.)*"|'(?:[^\\'\r\n]|\\.)*'/,
greedy: true
},
"url": {
pattern: /<(?:[^\x00-\x20<>"{}|^`\\]|\\(?:u[\da-fA-F]{4}|U[\da-fA-F]{8}))*>/,
greedy: true,
inside: {
"punctuation": /[<>]/
}
},
"function": {
pattern: /(?:(?![-.\d\xB7])[-.\w\xB7\xC0-\uFFFD]+)?:(?:(?![-.])(?:[-.:\w\xC0-\uFFFD]|%[\da-f]{2}|\\.)+)?/i,
inside: {
"local-name": {
pattern: /([^:]*:)[\s\S]+/,
lookbehind: true
},
"prefix": {
pattern: /[\s\S]+/,
inside: {
"punctuation": /:/
}
}
}
},
"number": /[+-]?\b\d+(?:\.\d*)?(?:e[+-]?\d+)?/i,
"punctuation": /[{}.,;()[\]]|\^\^/,
"boolean": /\b(?:false|true)\b/,
"keyword": [
/(?:\ba|@prefix|@base)\b|=/,
/\b(?:base|graph|prefix)\b/i
],
"tag": {
pattern: /@[a-z]+(?:-[a-z\d]+)*/i,
inside: {
"punctuation": /@/
}
}
};
Prism.languages.trig = Prism.languages["turtle"];
Prism.languages.sparql = Prism.languages.extend(
"turtle",
{
"boolean": /\b(?:false|true)\b/i,
"variable": {
pattern: /[?$]\w+/,
greedy: true
}
}
);
Prism.languages.insertBefore("sparql", "punctuation", {
"keyword": [
/\b(?:A|ADD|ALL|AS|ASC|ASK|BNODE|BY|CLEAR|CONSTRUCT|COPY|CREATE|DATA|DEFAULT|DELETE|DESC|DESCRIBE|DISTINCT|DROP|EXISTS|FILTER|FROM|GROUP|HAVING|INSERT|INTO|LIMIT|LOAD|MINUS|MOVE|NAMED|NOT|NOW|OFFSET|OPTIONAL|ORDER|RAND|REDUCED|SELECT|SEPARATOR|SERVICE|SILENT|STRUUID|UNION|USING|UUID|VALUES|WHERE)\b/i,
/\b(?:ABS|AVG|BIND|BOUND|CEIL|COALESCE|CONCAT|CONTAINS|COUNT|DATATYPE|DAY|ENCODE_FOR_URI|FLOOR|GROUP_CONCAT|HOURS|IF|IRI|isBLANK|isIRI|isLITERAL|isNUMERIC|isURI|LANG|LANGMATCHES|LCASE|MAX|MD5|MIN|MINUTES|MONTH|REGEX|REPLACE|ROUND|sameTerm|SAMPLE|SECONDS|SHA1|SHA256|SHA384|SHA512|STR|STRAFTER|STRBEFORE|STRDT|STRENDS|STRLANG|STRLEN|STRSTARTS|SUBSTR|SUM|TIMEZONE|TZ|UCASE|URI|YEAR)\b(?=\s*\()/i,
/\b(?:BASE|GRAPH|PREFIX)\b/i
]
});
Prism.languages.rq = Prism.languages.sparql;
Prism.languages["splunk-spl"] = {
"comment": /`comment\("(?:\\.|[^\\"])*"\)`/,
"string": {
pattern: /"(?:\\.|[^\\"])*"/,
greedy: true
},
"keyword": /\b(?:abstract|accum|addcoltotals|addinfo|addtotals|analyzefields|anomalies|anomalousvalue|anomalydetection|append|appendcols|appendcsv|appendlookup|appendpipe|arules|associate|audit|autoregress|bin|bucket|bucketdir|chart|cluster|cofilter|collect|concurrency|contingency|convert|correlate|datamodel|dbinspect|dedup|delete|delta|diff|erex|eval|eventcount|eventstats|extract|fieldformat|fields|fieldsummary|filldown|fillnull|findtypes|folderize|foreach|format|from|gauge|gentimes|geom|geomfilter|geostats|head|highlight|history|iconify|input|inputcsv|inputlookup|iplocation|join|kmeans|kv|kvform|loadjob|localize|localop|lookup|makecontinuous|makemv|makeresults|map|mcollect|metadata|metasearch|meventcollect|mstats|multikv|multisearch|mvcombine|mvexpand|nomv|outlier|outputcsv|outputlookup|outputtext|overlap|pivot|predict|rangemap|rare|regex|relevancy|reltime|rename|replace|rest|return|reverse|rex|rtorder|run|savedsearch|script|scrub|search|searchtxn|selfjoin|sendemail|set|setfields|sichart|sirare|sistats|sitimechart|sitop|sort|spath|stats|strcat|streamstats|table|tags|tail|timechart|timewrap|top|transaction|transpose|trendline|tscollect|tstats|typeahead|typelearner|typer|union|uniq|untable|where|x11|xmlkv|xmlunescape|xpath|xyseries)\b/i,
"operator-word": {
pattern: /\b(?:and|as|by|not|or|xor)\b/i,
alias: "operator"
},
"function": /\b\w+(?=\s*\()/,
"property": /\b\w+(?=\s*=(?!=))/,
"date": {
pattern: /\b\d{1,2}\/\d{1,2}\/\d{1,4}(?:(?::\d{1,2}){3})?\b/,
alias: "number"
},
"number": /\b\d+(?:\.\d+)?\b/,
"boolean": /\b(?:f|false|t|true)\b/i,
"operator": /[<>=]=?|[-+*/%|]/,
"punctuation": /[()[\],]/
};
Prism.languages.sqf = Prism.languages.extend("clike", {
"string": {
pattern: /"(?:(?:"")?[^"])*"(?!")|'(?:[^'])*'/,
greedy: true
},
"keyword": /\b(?:breakOut|breakTo|call|case|catch|default|do|echo|else|execFSM|execVM|exitWith|for|forEach|forEachMember|forEachMemberAgent|forEachMemberTeam|from|goto|if|nil|preprocessFile|preprocessFileLineNumbers|private|scopeName|spawn|step|switch|then|throw|to|try|while|with)\b/i,
"boolean": /\b(?:false|true)\b/i,
"function": /\b(?:abs|accTime|acos|action|actionIDs|actionKeys|actionKeysImages|actionKeysNames|actionKeysNamesArray|actionName|actionParams|activateAddons|activatedAddons|activateKey|add3DENConnection|add3DENEventHandler|add3DENLayer|addAction|addBackpack|addBackpackCargo|addBackpackCargoGlobal|addBackpackGlobal|addCamShake|addCuratorAddons|addCuratorCameraArea|addCuratorEditableObjects|addCuratorEditingArea|addCuratorPoints|addEditorObject|addEventHandler|addForce|addForceGeneratorRTD|addGoggles|addGroupIcon|addHandgunItem|addHeadgear|addItem|addItemCargo|addItemCargoGlobal|addItemPool|addItemToBackpack|addItemToUniform|addItemToVest|addLiveStats|addMagazine|addMagazineAmmoCargo|addMagazineCargo|addMagazineCargoGlobal|addMagazineGlobal|addMagazinePool|addMagazines|addMagazineTurret|addMenu|addMenuItem|addMissionEventHandler|addMPEventHandler|addMusicEventHandler|addOwnedMine|addPlayerScores|addPrimaryWeaponItem|addPublicVariableEventHandler|addRating|addResources|addScore|addScoreSide|addSecondaryWeaponItem|addSwitchableUnit|addTeamMember|addToRemainsCollector|addTorque|addUniform|addVehicle|addVest|addWaypoint|addWeapon|addWeaponCargo|addWeaponCargoGlobal|addWeaponGlobal|addWeaponItem|addWeaponPool|addWeaponTurret|admin|agent|agents|AGLToASL|aimedAtTarget|aimPos|airDensityCurveRTD|airDensityRTD|airplaneThrottle|airportSide|AISFinishHeal|alive|all3DENEntities|allAirports|allControls|allCurators|allCutLayers|allDead|allDeadMen|allDisplays|allGroups|allMapMarkers|allMines|allMissionObjects|allow3DMode|allowCrewInImmobile|allowCuratorLogicIgnoreAreas|allowDamage|allowDammage|allowFileOperations|allowFleeing|allowGetIn|allowSprint|allPlayers|allSimpleObjects|allSites|allTurrets|allUnits|allUnitsUAV|allVariables|ammo|ammoOnPylon|animate|animateBay|animateDoor|animatePylon|animateSource|animationNames|animationPhase|animationSourcePhase|animationState|append|apply|armoryPoints|arrayIntersect|asin|ASLToAGL|ASLToATL|assert|assignAsCargo|assignAsCargoIndex|assignAsCommander|assignAsDriver|assignAsGunner|assignAsTurret|assignCurator|assignedCargo|assignedCommander|assignedDriver|assignedGunner|assignedItems|assignedTarget|assignedTeam|assignedVehicle|assignedVehicleRole|assignItem|assignTeam|assignToAirport|atan|atan2|atg|ATLToASL|attachedObject|attachedObjects|attachedTo|attachObject|attachTo|attackEnabled|backpack|backpackCargo|backpackContainer|backpackItems|backpackMagazines|backpackSpaceFor|behaviour|benchmark|binocular|blufor|boundingBox|boundingBoxReal|boundingCenter|briefingName|buildingExit|buildingPos|buldozer_EnableRoadDiag|buldozer_IsEnabledRoadDiag|buldozer_LoadNewRoads|buldozer_reloadOperMap|buttonAction|buttonSetAction|cadetMode|callExtension|camCommand|camCommit|camCommitPrepared|camCommitted|camConstuctionSetParams|camCreate|camDestroy|cameraEffect|cameraEffectEnableHUD|cameraInterest|cameraOn|cameraView|campaignConfigFile|camPreload|camPreloaded|camPrepareBank|camPrepareDir|camPrepareDive|camPrepareFocus|camPrepareFov|camPrepareFovRange|camPreparePos|camPrepareRelPos|camPrepareTarget|camSetBank|camSetDir|camSetDive|camSetFocus|camSetFov|camSetFovRange|camSetPos|camSetRelPos|camSetTarget|camTarget|camUseNVG|canAdd|canAddItemToBackpack|canAddItemToUniform|canAddItemToVest|cancelSimpleTaskDestination|canFire|canMove|canSlingLoad|canStand|canSuspend|canTriggerDynamicSimulation|canUnloadInCombat|canVehicleCargo|captive|captiveNum|cbChecked|cbSetChecked|ceil|channelEnabled|cheatsEnabled|checkAIFeature|checkVisibility|civilian|className|clear3DENAttribute|clear3DENInventory|clearAllItemsFromBackpack|clearBackpackCargo|clearBackpackCargoGlobal|clearForcesRTD|clearGroupIcons|clearItemCargo|clearItemCargoGlobal|clearItemPool|clearMagazineCargo|clearMagazineCargoGlobal|clearMagazinePool|clearOverlay|clearRadio|clearVehicleInit|clearWeaponCargo|clearWeaponCargoGlobal|clearWeaponPool|clientOwner|closeDialog|closeDisplay|closeOverlay|collapseObjectTree|collect3DENHistory|collectiveRTD|combatMode|commandArtilleryFire|commandChat|commander|commandFire|commandFollow|commandFSM|commandGetOut|commandingMenu|commandMove|commandRadio|commandStop|commandSuppressiveFire|commandTarget|commandWatch|comment|commitOverlay|compile|compileFinal|completedFSM|composeText|configClasses|configFile|configHierarchy|configName|configNull|configProperties|configSourceAddonList|configSourceMod|configSourceModList|confirmSensorTarget|connectTerminalToUAV|controlNull|controlsGroupCtrl|copyFromClipboard|copyToClipboard|copyWaypoints|cos|count|countEnemy|countFriendly|countSide|countType|countUnknown|create3DENComposition|create3DENEntity|createAgent|createCenter|createDialog|createDiaryLink|createDiaryRecord|createDiarySubject|createDisplay|createGearDialog|createGroup|createGuardedPoint|createLocation|createMarker|createMarkerLocal|createMenu|createMine|createMissionDisplay|createMPCampaignDisplay|createSimpleObject|createSimpleTask|createSite|createSoundSource|createTask|createTeam|createTrigger|createUnit|createVehicle|createVehicleCrew|createVehicleLocal|crew|ctAddHeader|ctAddRow|ctClear|ctCurSel|ctData|ctFindHeaderRows|ctFindRowHeader|ctHeaderControls|ctHeaderCount|ctRemoveHeaders|ctRemoveRows|ctrlActivate|ctrlAddEventHandler|ctrlAngle|ctrlAutoScrollDelay|ctrlAutoScrollRewind|ctrlAutoScrollSpeed|ctrlChecked|ctrlClassName|ctrlCommit|ctrlCommitted|ctrlCreate|ctrlDelete|ctrlEnable|ctrlEnabled|ctrlFade|ctrlHTMLLoaded|ctrlIDC|ctrlIDD|ctrlMapAnimAdd|ctrlMapAnimClear|ctrlMapAnimCommit|ctrlMapAnimDone|ctrlMapCursor|ctrlMapMouseOver|ctrlMapScale|ctrlMapScreenToWorld|ctrlMapWorldToScreen|ctrlModel|ctrlModelDirAndUp|ctrlModelScale|ctrlParent|ctrlParentControlsGroup|ctrlPosition|ctrlRemoveAllEventHandlers|ctrlRemoveEventHandler|ctrlScale|ctrlSetActiveColor|ctrlSetAngle|ctrlSetAutoScrollDelay|ctrlSetAutoScrollRewind|ctrlSetAutoScrollSpeed|ctrlSetBackgroundColor|ctrlSetChecked|ctrlSetDisabledColor|ctrlSetEventHandler|ctrlSetFade|ctrlSetFocus|ctrlSetFont|ctrlSetFontH1|ctrlSetFontH1B|ctrlSetFontH2|ctrlSetFontH2B|ctrlSetFontH3|ctrlSetFontH3B|ctrlSetFontH4|ctrlSetFontH4B|ctrlSetFontH5|ctrlSetFontH5B|ctrlSetFontH6|ctrlSetFontH6B|ctrlSetFontHeight|ctrlSetFontHeightH1|ctrlSetFontHeightH2|ctrlSetFontHeightH3|ctrlSetFontHeightH4|ctrlSetFontHeightH5|ctrlSetFontHeightH6|ctrlSetFontHeightSecondary|ctrlSetFontP|ctrlSetFontPB|ctrlSetFontSecondary|ctrlSetForegroundColor|ctrlSetModel|ctrlSetModelDirAndUp|ctrlSetModelScale|ctrlSetPixelPrecision|ctrlSetPosition|ctrlSetScale|ctrlSetStructuredText|ctrlSetText|ctrlSetTextColor|ctrlSetTextColorSecondary|ctrlSetTextSecondary|ctrlSetTooltip|ctrlSetTooltipColorBox|ctrlSetTooltipColorShade|ctrlSetTooltipColorText|ctrlShow|ctrlShown|ctrlText|ctrlTextHeight|ctrlTextSecondary|ctrlTextWidth|ctrlType|ctrlVisible|ctRowControls|ctRowCount|ctSetCurSel|ctSetData|ctSetHeaderTemplate|ctSetRowTemplate|ctSetValue|ctValue|curatorAddons|curatorCamera|curatorCameraArea|curatorCameraAreaCeiling|curatorCoef|curatorEditableObjects|curatorEditingArea|curatorEditingAreaType|curatorMouseOver|curatorPoints|curatorRegisteredObjects|curatorSelected|curatorWaypointCost|current3DENOperation|currentChannel|currentCommand|currentMagazine|currentMagazineDetail|currentMagazineDetailTurret|currentMagazineTurret|currentMuzzle|currentNamespace|currentTask|currentTasks|currentThrowable|currentVisionMode|currentWaypoint|currentWeapon|currentWeaponMode|currentWeaponTurret|currentZeroing|cursorObject|cursorTarget|customChat|customRadio|cutFadeOut|cutObj|cutRsc|cutText|damage|date|dateToNumber|daytime|deActivateKey|debriefingText|debugFSM|debugLog|deg|delete3DENEntities|deleteAt|deleteCenter|deleteCollection|deleteEditorObject|deleteGroup|deleteGroupWhenEmpty|deleteIdentity|deleteLocation|deleteMarker|deleteMarkerLocal|deleteRange|deleteResources|deleteSite|deleteStatus|deleteTeam|deleteVehicle|deleteVehicleCrew|deleteWaypoint|detach|detectedMines|diag_activeMissionFSMs|diag_activeScripts|diag_activeSQFScripts|diag_activeSQSScripts|diag_captureFrame|diag_captureFrameToFile|diag_captureSlowFrame|diag_codePerformance|diag_drawMode|diag_dynamicSimulationEnd|diag_enable|diag_enabled|diag_fps|diag_fpsMin|diag_frameNo|diag_lightNewLoad|diag_list|diag_log|diag_logSlowFrame|diag_mergeConfigFile|diag_recordTurretLimits|diag_setLightNew|diag_tickTime|diag_toggle|dialog|diarySubjectExists|didJIP|didJIPOwner|difficulty|difficultyEnabled|difficultyEnabledRTD|difficultyOption|direction|directSay|disableAI|disableCollisionWith|disableConversation|disableDebriefingStats|disableMapIndicators|disableNVGEquipment|disableRemoteSensors|disableSerialization|disableTIEquipment|disableUAVConnectability|disableUserInput|displayAddEventHandler|displayCtrl|displayNull|displayParent|displayRemoveAllEventHandlers|displayRemoveEventHandler|displaySetEventHandler|dissolveTeam|distance|distance2D|distanceSqr|distributionRegion|do3DENAction|doArtilleryFire|doFire|doFollow|doFSM|doGetOut|doMove|doorPhase|doStop|doSuppressiveFire|doTarget|doWatch|drawArrow|drawEllipse|drawIcon|drawIcon3D|drawLine|drawLine3D|drawLink|drawLocation|drawPolygon|drawRectangle|drawTriangle|driver|drop|dynamicSimulationDistance|dynamicSimulationDistanceCoef|dynamicSimulationEnabled|dynamicSimulationSystemEnabled|east|edit3DENMissionAttributes|editObject|editorSetEventHandler|effectiveCommander|emptyPositions|enableAI|enableAIFeature|enableAimPrecision|enableAttack|enableAudioFeature|enableAutoStartUpRTD|enableAutoTrimRTD|enableCamShake|enableCaustics|enableChannel|enableCollisionWith|enableCopilot|enableDebriefingStats|enableDiagLegend|enableDynamicSimulation|enableDynamicSimulationSystem|enableEndDialog|enableEngineArtillery|enableEnvironment|enableFatigue|enableGunLights|enableInfoPanelComponent|enableIRLasers|enableMimics|enablePersonTurret|enableRadio|enableReload|enableRopeAttach|enableSatNormalOnDetail|enableSaving|enableSentences|enableSimulation|enableSimulationGlobal|enableStamina|enableStressDamage|enableTeamSwitch|enableTraffic|enableUAVConnectability|enableUAVWaypoints|enableVehicleCargo|enableVehicleSensor|enableWeaponDisassembly|endl|endLoadingScreen|endMission|engineOn|enginesIsOnRTD|enginesPowerRTD|enginesRpmRTD|enginesTorqueRTD|entities|environmentEnabled|estimatedEndServerTime|estimatedTimeLeft|evalObjectArgument|everyBackpack|everyContainer|exec|execEditorScript|exp|expectedDestination|exportJIPMessages|eyeDirection|eyePos|face|faction|fadeMusic|fadeRadio|fadeSound|fadeSpeech|failMission|fillWeaponsFromPool|find|findCover|findDisplay|findEditorObject|findEmptyPosition|findEmptyPositionReady|findIf|findNearestEnemy|finishMissionInit|finite|fire|fireAtTarget|firstBackpack|flag|flagAnimationPhase|flagOwner|flagSide|flagTexture|fleeing|floor|flyInHeight|flyInHeightASL|fog|fogForecast|fogParams|forceAddUniform|forceAtPositionRTD|forcedMap|forceEnd|forceFlagTexture|forceFollowRoad|forceGeneratorRTD|forceMap|forceRespawn|forceSpeed|forceWalk|forceWeaponFire|forceWeatherChange|forgetTarget|format|formation|formationDirection|formationLeader|formationMembers|formationPosition|formationTask|formatText|formLeader|freeLook|fromEditor|fuel|fullCrew|gearIDCAmmoCount|gearSlotAmmoCount|gearSlotData|get3DENActionState|get3DENAttribute|get3DENCamera|get3DENConnections|get3DENEntity|get3DENEntityID|get3DENGrid|get3DENIconsVisible|get3DENLayerEntities|get3DENLinesVisible|get3DENMissionAttribute|get3DENMouseOver|get3DENSelected|getAimingCoef|getAllEnvSoundControllers|getAllHitPointsDamage|getAllOwnedMines|getAllSoundControllers|getAmmoCargo|getAnimAimPrecision|getAnimSpeedCoef|getArray|getArtilleryAmmo|getArtilleryComputerSettings|getArtilleryETA|getAssignedCuratorLogic|getAssignedCuratorUnit|getBackpackCargo|getBleedingRemaining|getBurningValue|getCameraViewDirection|getCargoIndex|getCenterOfMass|getClientState|getClientStateNumber|getCompatiblePylonMagazines|getConnectedUAV|getContainerMaxLoad|getCursorObjectParams|getCustomAimCoef|getDammage|getDescription|getDir|getDirVisual|getDLCAssetsUsage|getDLCAssetsUsageByName|getDLCs|getDLCUsageTime|getEditorCamera|getEditorMode|getEditorObjectScope|getElevationOffset|getEngineTargetRpmRTD|getEnvSoundController|getFatigue|getFieldManualStartPage|getForcedFlagTexture|getFriend|getFSMVariable|getFuelCargo|getGroupIcon|getGroupIconParams|getGroupIcons|getHideFrom|getHit|getHitIndex|getHitPointDamage|getItemCargo|getMagazineCargo|getMarkerColor|getMarkerPos|getMarkerSize|getMarkerType|getMass|getMissionConfig|getMissionConfigValue|getMissionDLCs|getMissionLayerEntities|getMissionLayers|getModelInfo|getMousePosition|getMusicPlayedTime|getNumber|getObjectArgument|getObjectChildren|getObjectDLC|getObjectMaterials|getObjectProxy|getObjectTextures|getObjectType|getObjectViewDistance|getOxygenRemaining|getPersonUsedDLCs|getPilotCameraDirection|getPilotCameraPosition|getPilotCameraRotation|getPilotCameraTarget|getPlateNumber|getPlayerChannel|getPlayerScores|getPlayerUID|getPlayerUIDOld|getPos|getPosASL|getPosASLVisual|getPosASLW|getPosATL|getPosATLVisual|getPosVisual|getPosWorld|getPylonMagazines|getRelDir|getRelPos|getRemoteSensorsDisabled|getRepairCargo|getResolution|getRotorBrakeRTD|getShadowDistance|getShotParents|getSlingLoad|getSoundController|getSoundControllerResult|getSpeed|getStamina|getStatValue|getSuppression|getTerrainGrid|getTerrainHeightASL|getText|getTotalDLCUsageTime|getTrimOffsetRTD|getUnitLoadout|getUnitTrait|getUserMFDText|getUserMFDValue|getVariable|getVehicleCargo|getWeaponCargo|getWeaponSway|getWingsOrientationRTD|getWingsPositionRTD|getWPPos|glanceAt|globalChat|globalRadio|goggles|group|groupChat|groupFromNetId|groupIconSelectable|groupIconsVisible|groupId|groupOwner|groupRadio|groupSelectedUnits|groupSelectUnit|grpNull|gunner|gusts|halt|handgunItems|handgunMagazine|handgunWeapon|handsHit|hasInterface|hasPilotCamera|hasWeapon|hcAllGroups|hcGroupParams|hcLeader|hcRemoveAllGroups|hcRemoveGroup|hcSelected|hcSelectGroup|hcSetGroup|hcShowBar|hcShownBar|headgear|hideBody|hideObject|hideObjectGlobal|hideSelection|hint|hintC|hintCadet|hintSilent|hmd|hostMission|htmlLoad|HUDMovementLevels|humidity|image|importAllGroups|importance|in|inArea|inAreaArray|incapacitatedState|independent|inflame|inflamed|infoPanel|infoPanelComponentEnabled|infoPanelComponents|infoPanels|inGameUISetEventHandler|inheritsFrom|initAmbientLife|inPolygon|inputAction|inRangeOfArtillery|insertEditorObject|intersect|is3DEN|is3DENMultiplayer|isAbleToBreathe|isAgent|isAimPrecisionEnabled|isArray|isAutoHoverOn|isAutonomous|isAutoStartUpEnabledRTD|isAutotest|isAutoTrimOnRTD|isBleeding|isBurning|isClass|isCollisionLightOn|isCopilotEnabled|isDamageAllowed|isDedicated|isDLCAvailable|isEngineOn|isEqualTo|isEqualType|isEqualTypeAll|isEqualTypeAny|isEqualTypeArray|isEqualTypeParams|isFilePatchingEnabled|isFlashlightOn|isFlatEmpty|isForcedWalk|isFormationLeader|isGroupDeletedWhenEmpty|isHidden|isInRemainsCollector|isInstructorFigureEnabled|isIRLaserOn|isKeyActive|isKindOf|isLaserOn|isLightOn|isLocalized|isManualFire|isMarkedForCollection|isMultiplayer|isMultiplayerSolo|isNil|isNull|isNumber|isObjectHidden|isObjectRTD|isOnRoad|isPipEnabled|isPlayer|isRealTime|isRemoteExecuted|isRemoteExecutedJIP|isServer|isShowing3DIcons|isSimpleObject|isSprintAllowed|isStaminaEnabled|isSteamMission|isStreamFriendlyUIEnabled|isStressDamageEnabled|isText|isTouchingGround|isTurnedOut|isTutHintsEnabled|isUAVConnectable|isUAVConnected|isUIContext|isUniformAllowed|isVehicleCargo|isVehicleRadarOn|isVehicleSensorEnabled|isWalking|isWeaponDeployed|isWeaponRested|itemCargo|items|itemsWithMagazines|join|joinAs|joinAsSilent|joinSilent|joinString|kbAddDatabase|kbAddDatabaseTargets|kbAddTopic|kbHasTopic|kbReact|kbRemoveTopic|kbTell|kbWasSaid|keyImage|keyName|knowsAbout|land|landAt|landResult|language|laserTarget|lbAdd|lbClear|lbColor|lbColorRight|lbCurSel|lbData|lbDelete|lbIsSelected|lbPicture|lbPictureRight|lbSelection|lbSetColor|lbSetColorRight|lbSetCurSel|lbSetData|lbSetPicture|lbSetPictureColor|lbSetPictureColorDisabled|lbSetPictureColorSelected|lbSetPictureRight|lbSetPictureRightColor|lbSetPictureRightColorDisabled|lbSetPictureRightColorSelected|lbSetSelectColor|lbSetSelectColorRight|lbSetSelected|lbSetText|lbSetTextRight|lbSetTooltip|lbSetValue|lbSize|lbSort|lbSortByValue|lbText|lbTextRight|lbValue|leader|leaderboardDeInit|leaderboardGetRows|leaderboardInit|leaderboardRequestRowsFriends|leaderboardRequestRowsGlobal|leaderboardRequestRowsGlobalAroundUser|leaderboardsRequestUploadScore|leaderboardsRequestUploadScoreKeepBest|leaderboardState|leaveVehicle|libraryCredits|libraryDisclaimers|lifeState|lightAttachObject|lightDetachObject|lightIsOn|lightnings|limitSpeed|linearConversion|lineBreak|lineIntersects|lineIntersectsObjs|lineIntersectsSurfaces|lineIntersectsWith|linkItem|list|listObjects|listRemoteTargets|listVehicleSensors|ln|lnbAddArray|lnbAddColumn|lnbAddRow|lnbClear|lnbColor|lnbColorRight|lnbCurSelRow|lnbData|lnbDeleteColumn|lnbDeleteRow|lnbGetColumnsPosition|lnbPicture|lnbPictureRight|lnbSetColor|lnbSetColorRight|lnbSetColumnsPos|lnbSetCurSelRow|lnbSetData|lnbSetPicture|lnbSetPictureColor|lnbSetPictureColorRight|lnbSetPictureColorSelected|lnbSetPictureColorSelectedRight|lnbSetPictureRight|lnbSetText|lnbSetTextRight|lnbSetValue|lnbSize|lnbSort|lnbSortByValue|lnbText|lnbTextRight|lnbValue|load|loadAbs|loadBackpack|loadFile|loadGame|loadIdentity|loadMagazine|loadOverlay|loadStatus|loadUniform|loadVest|local|localize|locationNull|locationPosition|lock|lockCameraTo|lockCargo|lockDriver|locked|lockedCargo|lockedDriver|lockedTurret|lockIdentity|lockTurret|lockWP|log|logEntities|logNetwork|logNetworkTerminate|lookAt|lookAtPos|magazineCargo|magazines|magazinesAllTurrets|magazinesAmmo|magazinesAmmoCargo|magazinesAmmoFull|magazinesDetail|magazinesDetailBackpack|magazinesDetailUniform|magazinesDetailVest|magazinesTurret|magazineTurretAmmo|mapAnimAdd|mapAnimClear|mapAnimCommit|mapAnimDone|mapCenterOnCamera|mapGridPosition|markAsFinishedOnSteam|markerAlpha|markerBrush|markerColor|markerDir|markerPos|markerShape|markerSize|markerText|markerType|max|members|menuAction|menuAdd|menuChecked|menuClear|menuCollapse|menuData|menuDelete|menuEnable|menuEnabled|menuExpand|menuHover|menuPicture|menuSetAction|menuSetCheck|menuSetData|menuSetPicture|menuSetValue|menuShortcut|menuShortcutText|menuSize|menuSort|menuText|menuURL|menuValue|min|mineActive|mineDetectedBy|missionConfigFile|missionDifficulty|missionName|missionNamespace|missionStart|missionVersion|modelToWorld|modelToWorldVisual|modelToWorldVisualWorld|modelToWorldWorld|modParams|moonIntensity|moonPhase|morale|move|move3DENCamera|moveInAny|moveInCargo|moveInCommander|moveInDriver|moveInGunner|moveInTurret|moveObjectToEnd|moveOut|moveTime|moveTo|moveToCompleted|moveToFailed|musicVolume|name|nameSound|nearEntities|nearestBuilding|nearestLocation|nearestLocations|nearestLocationWithDubbing|nearestObject|nearestObjects|nearestTerrainObjects|nearObjects|nearObjectsReady|nearRoads|nearSupplies|nearTargets|needReload|netId|netObjNull|newOverlay|nextMenuItemIndex|nextWeatherChange|nMenuItems|numberOfEnginesRTD|numberToDate|objectCurators|objectFromNetId|objectParent|objNull|objStatus|onBriefingGear|onBriefingGroup|onBriefingNotes|onBriefingPlan|onBriefingTeamSwitch|onCommandModeChanged|onDoubleClick|onEachFrame|onGroupIconClick|onGroupIconOverEnter|onGroupIconOverLeave|onHCGroupSelectionChanged|onMapSingleClick|onPlayerConnected|onPlayerDisconnected|onPreloadFinished|onPreloadStarted|onShowNewObject|onTeamSwitch|openCuratorInterface|openDLCPage|openDSInterface|openMap|openSteamApp|openYoutubeVideo|opfor|orderGetIn|overcast|overcastForecast|owner|param|params|parseNumber|parseSimpleArray|parseText|parsingNamespace|particlesQuality|pi|pickWeaponPool|pitch|pixelGrid|pixelGridBase|pixelGridNoUIScale|pixelH|pixelW|playableSlotsNumber|playableUnits|playAction|playActionNow|player|playerRespawnTime|playerSide|playersNumber|playGesture|playMission|playMove|playMoveNow|playMusic|playScriptedMission|playSound|playSound3D|position|positionCameraToWorld|posScreenToWorld|posWorldToScreen|ppEffectAdjust|ppEffectCommit|ppEffectCommitted|ppEffectCreate|ppEffectDestroy|ppEffectEnable|ppEffectEnabled|ppEffectForceInNVG|precision|preloadCamera|preloadObject|preloadSound|preloadTitleObj|preloadTitleRsc|primaryWeapon|primaryWeaponItems|primaryWeaponMagazine|priority|processDiaryLink|processInitCommands|productVersion|profileName|profileNamespace|profileNameSteam|progressLoadingScreen|progressPosition|progressSetPosition|publicVariable|publicVariableClient|publicVariableServer|pushBack|pushBackUnique|putWeaponPool|queryItemsPool|queryMagazinePool|queryWeaponPool|rad|radioChannelAdd|radioChannelCreate|radioChannelRemove|radioChannelSetCallSign|radioChannelSetLabel|radioVolume|rain|rainbow|random|rank|rankId|rating|rectangular|registeredTasks|registerTask|reload|reloadEnabled|remoteControl|remoteExec|remoteExecCall|remoteExecutedOwner|remove3DENConnection|remove3DENEventHandler|remove3DENLayer|removeAction|removeAll3DENEventHandlers|removeAllActions|removeAllAssignedItems|removeAllContainers|removeAllCuratorAddons|removeAllCuratorCameraAreas|removeAllCuratorEditingAreas|removeAllEventHandlers|removeAllHandgunItems|removeAllItems|removeAllItemsWithMagazines|removeAllMissionEventHandlers|removeAllMPEventHandlers|removeAllMusicEventHandlers|removeAllOwnedMines|removeAllPrimaryWeaponItems|removeAllWeapons|removeBackpack|removeBackpackGlobal|removeCuratorAddons|removeCuratorCameraArea|removeCuratorEditableObjects|removeCuratorEditingArea|removeDrawIcon|removeDrawLinks|removeEventHandler|removeFromRemainsCollector|removeGoggles|removeGroupIcon|removeHandgunItem|removeHeadgear|removeItem|removeItemFromBackpack|removeItemFromUniform|removeItemFromVest|removeItems|removeMagazine|removeMagazineGlobal|removeMagazines|removeMagazinesTurret|removeMagazineTurret|removeMenuItem|removeMissionEventHandler|removeMPEventHandler|removeMusicEventHandler|removeOwnedMine|removePrimaryWeaponItem|removeSecondaryWeaponItem|removeSimpleTask|removeSwitchableUnit|removeTeamMember|removeUniform|removeVest|removeWeapon|removeWeaponAttachmentCargo|removeWeaponCargo|removeWeaponGlobal|removeWeaponTurret|reportRemoteTarget|requiredVersion|resetCamShake|resetSubgroupDirection|resistance|resize|resources|respawnVehicle|restartEditorCamera|reveal|revealMine|reverse|reversedMouseY|roadAt|roadsConnectedTo|roleDescription|ropeAttachedObjects|ropeAttachedTo|ropeAttachEnabled|ropeAttachTo|ropeCreate|ropeCut|ropeDestroy|ropeDetach|ropeEndPosition|ropeLength|ropes|ropeUnwind|ropeUnwound|rotorsForcesRTD|rotorsRpmRTD|round|runInitScript|safeZoneH|safeZoneW|safeZoneWAbs|safeZoneX|safeZoneXAbs|safeZoneY|save3DENInventory|saveGame|saveIdentity|saveJoysticks|saveOverlay|saveProfileNamespace|saveStatus|saveVar|savingEnabled|say|say2D|say3D|score|scoreSide|screenshot|screenToWorld|scriptDone|scriptName|scriptNull|scudState|secondaryWeapon|secondaryWeaponItems|secondaryWeaponMagazine|select|selectBestPlaces|selectDiarySubject|selectedEditorObjects|selectEditorObject|selectionNames|selectionPosition|selectLeader|selectMax|selectMin|selectNoPlayer|selectPlayer|selectRandom|selectRandomWeighted|selectWeapon|selectWeaponTurret|sendAUMessage|sendSimpleCommand|sendTask|sendTaskResult|sendUDPMessage|serverCommand|serverCommandAvailable|serverCommandExecutable|serverName|serverTime|set|set3DENAttribute|set3DENAttributes|set3DENGrid|set3DENIconsVisible|set3DENLayer|set3DENLinesVisible|set3DENLogicType|set3DENMissionAttribute|set3DENMissionAttributes|set3DENModelsVisible|set3DENObjectType|set3DENSelected|setAccTime|setActualCollectiveRTD|setAirplaneThrottle|setAirportSide|setAmmo|setAmmoCargo|setAmmoOnPylon|setAnimSpeedCoef|setAperture|setApertureNew|setArmoryPoints|setAttributes|setAutonomous|setBehaviour|setBleedingRemaining|setBrakesRTD|setCameraInterest|setCamShakeDefParams|setCamShakeParams|setCamUseTI|setCaptive|setCenterOfMass|setCollisionLight|setCombatMode|setCompassOscillation|setConvoySeparation|setCuratorCameraAreaCeiling|setCuratorCoef|setCuratorEditingAreaType|setCuratorWaypointCost|setCurrentChannel|setCurrentTask|setCurrentWaypoint|setCustomAimCoef|setCustomWeightRTD|setDamage|setDammage|setDate|setDebriefingText|setDefaultCamera|setDestination|setDetailMapBlendPars|setDir|setDirection|setDrawIcon|setDriveOnPath|setDropInterval|setDynamicSimulationDistance|setDynamicSimulationDistanceCoef|setEditorMode|setEditorObjectScope|setEffectCondition|setEngineRpmRTD|setFace|setFaceAnimation|setFatigue|setFeatureType|setFlagAnimationPhase|setFlagOwner|setFlagSide|setFlagTexture|setFog|setForceGeneratorRTD|setFormation|setFormationTask|setFormDir|setFriend|setFromEditor|setFSMVariable|setFuel|setFuelCargo|setGroupIcon|setGroupIconParams|setGroupIconsSelectable|setGroupIconsVisible|setGroupId|setGroupIdGlobal|setGroupOwner|setGusts|setHideBehind|setHit|setHitIndex|setHitPointDamage|setHorizonParallaxCoef|setHUDMovementLevels|setIdentity|setImportance|setInfoPanel|setLeader|setLightAmbient|setLightAttenuation|setLightBrightness|setLightColor|setLightDayLight|setLightFlareMaxDistance|setLightFlareSize|setLightIntensity|setLightnings|setLightUseFlare|setLocalWindParams|setMagazineTurretAmmo|setMarkerAlpha|setMarkerAlphaLocal|setMarkerBrush|setMarkerBrushLocal|setMarkerColor|setMarkerColorLocal|setMarkerDir|setMarkerDirLocal|setMarkerPos|setMarkerPosLocal|setMarkerShape|setMarkerShapeLocal|setMarkerSize|setMarkerSizeLocal|setMarkerText|setMarkerTextLocal|setMarkerType|setMarkerTypeLocal|setMass|setMimic|setMousePosition|setMusicEffect|setMusicEventHandler|setName|setNameSound|setObjectArguments|setObjectMaterial|setObjectMaterialGlobal|setObjectProxy|setObjectTexture|setObjectTextureGlobal|setObjectViewDistance|setOvercast|setOwner|setOxygenRemaining|setParticleCircle|setParticleClass|setParticleFire|setParticleParams|setParticleRandom|setPilotCameraDirection|setPilotCameraRotation|setPilotCameraTarget|setPilotLight|setPiPEffect|setPitch|setPlateNumber|setPlayable|setPlayerRespawnTime|setPos|setPosASL|setPosASL2|setPosASLW|setPosATL|setPosition|setPosWorld|setPylonLoadOut|setPylonsPriority|setRadioMsg|setRain|setRainbow|setRandomLip|setRank|setRectangular|setRepairCargo|setRotorBrakeRTD|setShadowDistance|setShotParents|setSide|setSimpleTaskAlwaysVisible|setSimpleTaskCustomData|setSimpleTaskDescription|setSimpleTaskDestination|setSimpleTaskTarget|setSimpleTaskType|setSimulWeatherLayers|setSize|setSkill|setSlingLoad|setSoundEffect|setSpeaker|setSpeech|setSpeedMode|setStamina|setStaminaScheme|setStatValue|setSuppression|setSystemOfUnits|setTargetAge|setTaskMarkerOffset|setTaskResult|setTaskState|setTerrainGrid|setText|setTimeMultiplier|setTitleEffect|setToneMapping|setToneMappingParams|setTrafficDensity|setTrafficDistance|setTrafficGap|setTrafficSpeed|setTriggerActivation|setTriggerArea|setTriggerStatements|setTriggerText|setTriggerTimeout|setTriggerType|setType|setUnconscious|setUnitAbility|setUnitLoadout|setUnitPos|setUnitPosWeak|setUnitRank|setUnitRecoilCoefficient|setUnitTrait|setUnloadInCombat|setUserActionText|setUserMFDText|setUserMFDValue|setVariable|setVectorDir|setVectorDirAndUp|setVectorUp|setVehicleAmmo|setVehicleAmmoDef|setVehicleArmor|setVehicleCargo|setVehicleId|setVehicleInit|setVehicleLock|setVehiclePosition|setVehicleRadar|setVehicleReceiveRemoteTargets|setVehicleReportOwnPosition|setVehicleReportRemoteTargets|setVehicleTIPars|setVehicleVarName|setVelocity|setVelocityModelSpace|setVelocityTransformation|setViewDistance|setVisibleIfTreeCollapsed|setWantedRpmRTD|setWaves|setWaypointBehaviour|setWaypointCombatMode|setWaypointCompletionRadius|setWaypointDescription|setWaypointForceBehaviour|setWaypointFormation|setWaypointHousePosition|setWaypointLoiterRadius|setWaypointLoiterType|setWaypointName|setWaypointPosition|setWaypointScript|setWaypointSpeed|setWaypointStatements|setWaypointTimeout|setWaypointType|setWaypointVisible|setWeaponReloadingTime|setWind|setWindDir|setWindForce|setWindStr|setWingForceScaleRTD|setWPPos|show3DIcons|showChat|showCinemaBorder|showCommandingMenu|showCompass|showCuratorCompass|showGPS|showHUD|showLegend|showMap|shownArtilleryComputer|shownChat|shownCompass|shownCuratorCompass|showNewEditorObject|shownGPS|shownHUD|shownMap|shownPad|shownRadio|shownScoretable|shownUAVFeed|shownWarrant|shownWatch|showPad|showRadio|showScoretable|showSubtitles|showUAVFeed|showWarrant|showWatch|showWaypoint|showWaypoints|side|sideAmbientLife|sideChat|sideEmpty|sideEnemy|sideFriendly|sideLogic|sideRadio|sideUnknown|simpleTasks|simulationEnabled|simulCloudDensity|simulCloudOcclusion|simulInClouds|simulWeatherSync|sin|size|sizeOf|skill|skillFinal|skipTime|sleep|sliderPosition|sliderRange|sliderSetPosition|sliderSetRange|sliderSetSpeed|sliderSpeed|slingLoadAssistantShown|soldierMagazines|someAmmo|sort|soundVolume|speaker|speed|speedMode|splitString|sqrt|squadParams|stance|startLoadingScreen|stop|stopEngineRTD|stopped|str|sunOrMoon|supportInfo|suppressFor|surfaceIsWater|surfaceNormal|surfaceType|swimInDepth|switchableUnits|switchAction|switchCamera|switchGesture|switchLight|switchMove|synchronizedObjects|synchronizedTriggers|synchronizedWaypoints|synchronizeObjectsAdd|synchronizeObjectsRemove|synchronizeTrigger|synchronizeWaypoint|systemChat|systemOfUnits|tan|targetKnowledge|targets|targetsAggregate|targetsQuery|taskAlwaysVisible|taskChildren|taskCompleted|taskCustomData|taskDescription|taskDestination|taskHint|taskMarkerOffset|taskNull|taskParent|taskResult|taskState|taskType|teamMember|teamMemberNull|teamName|teams|teamSwitch|teamSwitchEnabled|teamType|terminate|terrainIntersect|terrainIntersectASL|terrainIntersectAtASL|text|textLog|textLogFormat|tg|time|timeMultiplier|titleCut|titleFadeOut|titleObj|titleRsc|titleText|toArray|toFixed|toLower|toString|toUpper|triggerActivated|triggerActivation|triggerArea|triggerAttachedVehicle|triggerAttachObject|triggerAttachVehicle|triggerDynamicSimulation|triggerStatements|triggerText|triggerTimeout|triggerTimeoutCurrent|triggerType|turretLocal|turretOwner|turretUnit|tvAdd|tvClear|tvCollapse|tvCollapseAll|tvCount|tvCurSel|tvData|tvDelete|tvExpand|tvExpandAll|tvPicture|tvPictureRight|tvSetColor|tvSetCurSel|tvSetData|tvSetPicture|tvSetPictureColor|tvSetPictureColorDisabled|tvSetPictureColorSelected|tvSetPictureRight|tvSetPictureRightColor|tvSetPictureRightColorDisabled|tvSetPictureRightColorSelected|tvSetSelectColor|tvSetText|tvSetTooltip|tvSetValue|tvSort|tvSortByValue|tvText|tvTooltip|tvValue|type|typeName|typeOf|UAVControl|uiNamespace|uiSleep|unassignCurator|unassignItem|unassignTeam|unassignVehicle|underwater|uniform|uniformContainer|uniformItems|uniformMagazines|unitAddons|unitAimPosition|unitAimPositionVisual|unitBackpack|unitIsUAV|unitPos|unitReady|unitRecoilCoefficient|units|unitsBelowHeight|unlinkItem|unlockAchievement|unregisterTask|updateDrawIcon|updateMenuItem|updateObjectTree|useAIOperMapObstructionTest|useAISteeringComponent|useAudioTimeForMoves|userInputDisabled|vectorAdd|vectorCos|vectorCrossProduct|vectorDiff|vectorDir|vectorDirVisual|vectorDistance|vectorDistanceSqr|vectorDotProduct|vectorFromTo|vectorMagnitude|vectorMagnitudeSqr|vectorModelToWorld|vectorModelToWorldVisual|vectorMultiply|vectorNormalized|vectorUp|vectorUpVisual|vectorWorldToModel|vectorWorldToModelVisual|vehicle|vehicleCargoEnabled|vehicleChat|vehicleRadio|vehicleReceiveRemoteTargets|vehicleReportOwnPosition|vehicleReportRemoteTargets|vehicles|vehicleVarName|velocity|velocityModelSpace|verifySignature|vest|vestContainer|vestItems|vestMagazines|viewDistance|visibleCompass|visibleGPS|visibleMap|visiblePosition|visiblePositionASL|visibleScoretable|visibleWatch|waitUntil|waves|waypointAttachedObject|waypointAttachedVehicle|waypointAttachObject|waypointAttachVehicle|waypointBehaviour|waypointCombatMode|waypointCompletionRadius|waypointDescription|waypointForceBehaviour|waypointFormation|waypointHousePosition|waypointLoiterRadius|waypointLoiterType|waypointName|waypointPosition|waypoints|waypointScript|waypointsEnabledUAV|waypointShow|waypointSpeed|waypointStatements|waypointTimeout|waypointTimeoutCurrent|waypointType|waypointVisible|weaponAccessories|weaponAccessoriesCargo|weaponCargo|weaponDirection|weaponInertia|weaponLowered|weapons|weaponsItems|weaponsItemsCargo|weaponState|weaponsTurret|weightRTD|west|WFSideText|wind|windDir|windRTD|windStr|wingsForcesRTD|worldName|worldSize|worldToModel|worldToModelVisual|worldToScreen)\b/i,
"number": /(?:\$|\b0x)[\da-f]+\b|(?:\B\.\d+|\b\d+(?:\.\d+)?)(?:e[+-]?\d+)?\b/i,
"operator": /##|>>|&&|\|\||[!=<>]=?|[-+*/%#^]|\b(?:and|mod|not|or)\b/i,
"magic-variable": {
pattern: /\b(?:this|thisList|thisTrigger|_exception|_fnc_scriptName|_fnc_scriptNameParent|_forEachIndex|_this|_thisEventHandler|_thisFSM|_thisScript|_x)\b/i,
alias: "keyword"
},
"constant": /\bDIK(?:_[a-z\d]+)+\b/i
});
Prism.languages.insertBefore("sqf", "string", {
"macro": {
pattern: /(^[ \t]*)#[a-z](?:[^\r\n\\]|\\(?:\r\n|[\s\S]))*/im,
lookbehind: true,
greedy: true,
alias: "property",
inside: {
"directive": {
pattern: /#[a-z]+\b/i,
alias: "keyword"
},
"comment": Prism.languages.sqf.comment
}
}
});
delete Prism.languages.sqf["class-name"];
Prism.languages.squirrel = Prism.languages.extend("clike", {
"comment": [
Prism.languages.clike["comment"][0],
{
pattern: /(^|[^\\:])(?:\/\/|#).*/,
lookbehind: true,
greedy: true
}
],
"string": {
pattern: /(^|[^\\"'@])(?:@"(?:[^"]|"")*"(?!")|"(?:[^\\\r\n"]|\\.)*")/,
lookbehind: true,
greedy: true
},
"class-name": {
pattern: /(\b(?:class|enum|extends|instanceof)\s+)\w+(?:\.\w+)*/,
lookbehind: true,
inside: {
"punctuation": /\./
}
},
"keyword": /\b(?:__FILE__|__LINE__|base|break|case|catch|class|clone|const|constructor|continue|default|delete|else|enum|extends|for|foreach|function|if|in|instanceof|local|null|resume|return|static|switch|this|throw|try|typeof|while|yield)\b/,
"number": /\b(?:0x[0-9a-fA-F]+|\d+(?:\.(?:\d+|[eE][+-]?\d+))?)\b/,
"operator": /\+\+|--|<=>|<[-<]|>>>?|&&?|\|\|?|[-+*/%!=<>]=?|[~^]|::?/,
"punctuation": /[(){}\[\],;.]/
});
Prism.languages.insertBefore("squirrel", "string", {
"char": {
pattern: /(^|[^\\"'])'(?:[^\\']|\\(?:[xuU][0-9a-fA-F]{0,8}|[\s\S]))'/,
lookbehind: true,
greedy: true
}
});
Prism.languages.insertBefore("squirrel", "operator", {
"attribute-punctuation": {
pattern: /<\/|\/>/,
alias: "important"
},
"lambda": {
pattern: /@(?=\()/,
alias: "operator"
}
});
(function(Prism2) {
var higherOrderFunctions = /\b(?:algebra_solver|algebra_solver_newton|integrate_1d|integrate_ode|integrate_ode_bdf|integrate_ode_rk45|map_rect|ode_(?:adams|bdf|ckrk|rk45)(?:_tol)?|ode_adjoint_tol_ctl|reduce_sum|reduce_sum_static)\b/;
Prism2.languages.stan = {
"comment": /\/\/.*|\/\*[\s\S]*?\*\/|#(?!include).*/,
"string": {
pattern: /"[\x20\x21\x23-\x5B\x5D-\x7E]*"/,
greedy: true
},
"directive": {
pattern: /^([ \t]*)#include\b.*/m,
lookbehind: true,
alias: "property"
},
"function-arg": {
pattern: RegExp(
"(" + higherOrderFunctions.source + /\s*\(\s*/.source + ")" + /[a-zA-Z]\w*/.source
),
lookbehind: true,
alias: "function"
},
"constraint": {
pattern: /(\b(?:int|matrix|real|row_vector|vector)\s*)<[^<>]*>/,
lookbehind: true,
inside: {
"expression": {
pattern: /(=\s*)\S(?:\S|\s+(?!\s))*?(?=\s*(?:>$|,\s*\w+\s*=))/,
lookbehind: true,
inside: null
},
"property": /\b[a-z]\w*(?=\s*=)/i,
"operator": /=/,
"punctuation": /^<|>$|,/
}
},
"keyword": [
{
pattern: /\bdata(?=\s*\{)|\b(?:functions|generated|model|parameters|quantities|transformed)\b/,
alias: "program-block"
},
/\b(?:array|break|cholesky_factor_corr|cholesky_factor_cov|complex|continue|corr_matrix|cov_matrix|data|else|for|if|in|increment_log_prob|int|matrix|ordered|positive_ordered|print|real|reject|return|row_vector|simplex|target|unit_vector|vector|void|while)\b/,
higherOrderFunctions
],
"function": /\b[a-z]\w*(?=\s*\()/i,
"number": /(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:E[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,
"boolean": /\b(?:false|true)\b/,
"operator": /<-|\.[*/]=?|\|\|?|&&|[!=<>+\-*/]=?|['^%~?:]/,
"punctuation": /[()\[\]{},;]/
};
Prism2.languages.stan.constraint.inside.expression.inside = Prism2.languages.stan;
})(Prism);
Prism.languages.stata = {
"comment": [
{
pattern: /(^[ \t]*)\*.*/m,
lookbehind: true,
greedy: true
},
{
pattern: /(^|\s)\/\/.*|\/\*[\s\S]*?\*\//,
lookbehind: true,
greedy: true
}
],
"string-literal": {
pattern: /"[^"\r\n]*"|[‘`']".*?"[’`']/,
greedy: true,
inside: {
"interpolation": {
pattern: /\$\{[^{}]*\}|[‘`']\w[^’`'\r\n]*[’`']/,
inside: {
"punctuation": /^\$\{|\}$/,
"expression": {
pattern: /[\s\S]+/,
inside: null
}
}
},
"string": /[\s\S]+/
}
},
"mata": {
pattern: /(^[ \t]*mata[ \t]*:)[\s\S]+?(?=^end\b)/m,
lookbehind: true,
greedy: true,
alias: "language-mata",
inside: Prism.languages.mata
},
"java": {
pattern: /(^[ \t]*java[ \t]*:)[\s\S]+?(?=^end\b)/m,
lookbehind: true,
greedy: true,
alias: "language-java",
inside: Prism.languages.java
},
"python": {
pattern: /(^[ \t]*python[ \t]*:)[\s\S]+?(?=^end\b)/m,
lookbehind: true,
greedy: true,
alias: "language-python",
inside: Prism.languages.python
},
"command": {
pattern: /(^[ \t]*(?:\.[ \t]+)?(?:(?:bayes|bootstrap|by|bysort|capture|collect|fmm|fp|frame|jackknife|mfp|mi|nestreg|noisily|permute|quietly|rolling|simulate|statsby|stepwise|svy|version|xi)\b[^:\r\n]*:[ \t]*|(?:capture|noisily|quietly|version)[ \t]+)?)[a-zA-Z]\w*/m,
lookbehind: true,
greedy: true,
alias: "keyword"
},
"variable": /\$\w+|[‘`']\w[^’`'\r\n]*[’`']/,
"keyword": /\b(?:bayes|bootstrap|by|bysort|capture|clear|collect|fmm|fp|frame|if|in|jackknife|mi[ \t]+estimate|mfp|nestreg|noisily|of|permute|quietly|rolling|simulate|sort|statsby|stepwise|svy|varlist|version|xi)\b/,
"boolean": /\b(?:off|on)\b/,
"number": /\b\d+(?:\.\d+)?\b|\B\.\d+/,
"function": /\b[a-z_]\w*(?=\()/i,
"operator": /\+\+|--|##?|[<>!=~]=?|[+\-*^&|/]/,
"punctuation": /[(){}[\],:]/
};
Prism.languages.stata["string-literal"].inside.interpolation.inside.expression.inside = Prism.languages.stata;
Prism.languages.iecst = {
"comment": [
{
pattern: /(^|[^\\])(?:\/\*[\s\S]*?(?:\*\/|$)|\(\*[\s\S]*?(?:\*\)|$)|\{[\s\S]*?(?:\}|$))/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"string": {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"keyword": [
/\b(?:END_)?(?:PROGRAM|CONFIGURATION|INTERFACE|FUNCTION_BLOCK|FUNCTION|ACTION|TRANSITION|TYPE|STRUCT|(?:INITIAL_)?STEP|NAMESPACE|LIBRARY|CHANNEL|FOLDER|RESOURCE|VAR_(?:ACCESS|CONFIG|EXTERNAL|GLOBAL|INPUT|IN_OUT|OUTPUT|TEMP)|VAR|METHOD|PROPERTY)\b/i,
/\b(?:AT|BY|(?:END_)?(?:CASE|FOR|IF|REPEAT|WHILE)|CONSTANT|CONTINUE|DO|ELSE|ELSIF|EXIT|EXTENDS|FROM|GET|GOTO|IMPLEMENTS|JMP|NON_RETAIN|OF|PRIVATE|PROTECTED|PUBLIC|RETAIN|RETURN|SET|TASK|THEN|TO|UNTIL|USING|WITH|__CATCH|__ENDTRY|__FINALLY|__TRY)\b/
],
"class-name": /\b(?:ANY|ARRAY|BOOL|BYTE|U?(?:D|L|S)?INT|(?:D|L)?WORD|DATE(?:_AND_TIME)?|DT|L?REAL|POINTER|STRING|TIME(?:_OF_DAY)?|TOD)\b/,
"address": {
pattern: /%[IQM][XBWDL][\d.]*|%[IQ][\d.]*/,
alias: "symbol"
},
"number": /\b(?:16#[\da-f]+|2#[01_]+|0x[\da-f]+)\b|\b(?:D|DT|T|TOD)#[\d_shmd:]*|\b[A-Z]*#[\d.,_]*|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
"boolean": /\b(?:FALSE|NULL|TRUE)\b/,
"operator": /S?R?:?=>?|&&?|\*\*?|<[=>]?|>=?|[-:^/+#]|\b(?:AND|EQ|EXPT|GE|GT|LE|LT|MOD|NE|NOT|OR|XOR)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"punctuation": /[()[\].,;]/
};
(function(Prism2) {
var unit = {
pattern: /(\b\d+)(?:%|[a-z]+)/,
lookbehind: true
};
var number = {
pattern: /(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,
lookbehind: true
};
var inside = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
lookbehind: true
},
"url": {
pattern: /\burl\((["']?).*?\1\)/i,
greedy: true
},
"string": {
pattern: /("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,
greedy: true
},
"interpolation": null,
"func": null,
"important": /\B!(?:important|optional)\b/i,
"keyword": {
pattern: /(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,
lookbehind: true
},
"hexcode": /#[\da-f]{3,6}/i,
"color": [
/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,
{
pattern: /\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,
inside: {
"unit": unit,
"number": number,
"function": /[\w-]+(?=\()/,
"punctuation": /[(),]/
}
}
],
"entity": /\\[\da-f]{1,8}/i,
"unit": unit,
"boolean": /\b(?:false|true)\b/,
"operator": [
/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/
],
"number": number,
"punctuation": /[{}()\[\];:,]/
};
inside["interpolation"] = {
pattern: /\{[^\r\n}:]+\}/,
alias: "variable",
inside: {
"delimiter": {
pattern: /^\{|\}$/,
alias: "punctuation"
},
rest: inside
}
};
inside["func"] = {
pattern: /[\w-]+\([^)]*\).*/,
inside: {
"function": /^[^(]+/,
rest: inside
}
};
Prism2.languages.stylus = {
"atrule-declaration": {
pattern: /(^[ \t]*)@.+/m,
lookbehind: true,
inside: {
"atrule": /^@[\w-]+/,
rest: inside
}
},
"variable-declaration": {
pattern: /(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,
lookbehind: true,
inside: {
"variable": /^\S+/,
rest: inside
}
},
"statement": {
pattern: /(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,
lookbehind: true,
inside: {
"keyword": /^\S+/,
rest: inside
}
},
"property-declaration": {
pattern: /((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,
lookbehind: true,
inside: {
"property": {
pattern: /^[^\s:]+/,
inside: {
"interpolation": inside.interpolation
}
},
rest: inside
}
},
"selector": {
pattern: /(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,
lookbehind: true,
inside: {
"interpolation": inside.interpolation,
"comment": inside.comment,
"punctuation": /[{},]/
}
},
"func": inside.func,
"string": inside.string,
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,
lookbehind: true,
greedy: true
},
"interpolation": inside.interpolation,
"punctuation": /[{}()\[\];:.]/
};
})(Prism);
Prism.languages.supercollider = {
"comment": {
pattern: /\/\/.*|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\//,
greedy: true
},
"string": {
pattern: /(^|[^\\])"(?:[^"\\]|\\[\s\S])*"/,
lookbehind: true,
greedy: true
},
"char": {
pattern: /\$(?:[^\\\r\n]|\\.)/,
greedy: true
},
"symbol": {
pattern: /(^|[^\\])'(?:[^'\\]|\\[\s\S])*'|\\\w+/,
lookbehind: true,
greedy: true
},
"keyword": /\b(?:_|arg|classvar|const|nil|var|while)\b/,
"boolean": /\b(?:false|true)\b/,
"label": {
pattern: /\b[a-z_]\w*(?=\s*:)/,
alias: "property"
},
"number": /\b(?:inf|pi|0x[0-9a-fA-F]+|\d+(?:\.\d+)?(?:[eE][+-]?\d+)?(?:pi)?|\d+r[0-9a-zA-Z]+(?:\.[0-9a-zA-Z]+)?|\d+[sb]{1,4}\d*)\b/,
"class-name": /\b[A-Z]\w*\b/,
"operator": /\.{2,3}|#(?![[{])|&&|[!=]==?|\+>>|\+{1,3}|-[->]|=>|>>|\?\?|@\|?@|\|(?:@|[!=]=)?\||!\?|<[!=>]|\*{1,2}|<{2,3}\*?|[-!%&/<>?@|=`]/,
"punctuation": /[{}()[\].:,;]|#[[{]/
};
Prism.languages.sclang = Prism.languages.supercollider;
Prism.languages.swift = {
"comment": {
pattern: /(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,
lookbehind: true,
greedy: true
},
"string-literal": [
{
pattern: RegExp(
/(^|[^"#])/.source + "(?:" + /"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source + "|" + /"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source + ")" + /(?!["#])/.source
),
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: /(\\\()(?:[^()]|\([^()]*\))*(?=\))/,
lookbehind: true,
inside: null
},
"interpolation-punctuation": {
pattern: /^\)|\\\($/,
alias: "punctuation"
},
"punctuation": /\\(?=[\r\n])/,
"string": /[\s\S]+/
}
},
{
pattern: RegExp(
/(^|[^"#])(#+)/.source + "(?:" + /"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source + "|" + /"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source + ")\\2"
),
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: /(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,
lookbehind: true,
inside: null
},
"interpolation-punctuation": {
pattern: /^\)|\\#+\($/,
alias: "punctuation"
},
"string": /[\s\S]+/
}
}
],
"directive": {
pattern: RegExp(
/#/.source + "(?:" + (/(?:elseif|if)\b/.source + "(?:[ ]*" + /(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source + ")+") + "|" + /(?:else|endif)\b/.source + ")"
),
alias: "property",
inside: {
"directive-name": /^#\w+/,
"boolean": /\b(?:false|true)\b/,
"number": /\b\d+(?:\.\d+)*\b/,
"operator": /!|&&|\|\||[<>]=?/,
"punctuation": /[(),]/
}
},
"literal": {
pattern: /#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,
alias: "constant"
},
"other-directive": {
pattern: /#\w+\b/,
alias: "property"
},
"attribute": {
pattern: /@\w+/,
alias: "atrule"
},
"function-definition": {
pattern: /(\bfunc\s+)\w+/,
lookbehind: true,
alias: "function"
},
"label": {
pattern: /\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,
lookbehind: true,
alias: "important"
},
"keyword": /\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,
"boolean": /\b(?:false|true)\b/,
"nil": {
pattern: /\bnil\b/,
alias: "constant"
},
"short-argument": /\$\d+\b/,
"omit": {
pattern: /\b_\b/,
alias: "keyword"
},
"number": /\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,
"class-name": /\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"constant": /\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,
"operator": /[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,
"punctuation": /[{}[\]();,.:\\]/
};
Prism.languages.swift["string-literal"].forEach(function(rule) {
rule.inside["interpolation"].inside = Prism.languages.swift;
});
(function(Prism2) {
var comment = {
pattern: /^[;#].*/m,
greedy: true
};
var quotesSource = /"(?:[^\r\n"\\]|\\(?:[^\r]|\r\n?))*"(?!\S)/.source;
Prism2.languages.systemd = {
"comment": comment,
"section": {
pattern: /^\[[^\n\r\[\]]*\](?=[ \t]*$)/m,
greedy: true,
inside: {
"punctuation": /^\[|\]$/,
"section-name": {
pattern: /[\s\S]+/,
alias: "selector"
}
}
},
"key": {
pattern: /^[^\s=]+(?=[ \t]*=)/m,
greedy: true,
alias: "attr-name"
},
"value": {
pattern: RegExp(
/(=[ \t]*(?!\s))/.source + "(?:" + quotesSource + '|(?=[^"\r\n]))(?:' + (/[^\s\\]/.source + '|[ ]+(?:(?![ "])|' + quotesSource + ")|" + /\\[\r\n]+(?:[#;].*[\r\n]+)*(?![#;])/.source) + ")*"
),
lookbehind: true,
greedy: true,
alias: "attr-value",
inside: {
"comment": comment,
"quoted": {
pattern: RegExp(/(^|\s)/.source + quotesSource),
lookbehind: true,
greedy: true
},
"punctuation": /\\$/m,
"boolean": {
pattern: /^(?:false|no|off|on|true|yes)$/,
greedy: true
}
}
},
"punctuation": /=/
};
})(Prism);
(function(Prism2) {
function createBlock(prefix, inside, contentAlias) {
return {
pattern: RegExp("<#" + prefix + "[\\s\\S]*?#>"),
alias: "block",
inside: {
"delimiter": {
pattern: RegExp("^<#" + prefix + "|#>$"),
alias: "important"
},
"content": {
pattern: /[\s\S]+/,
inside,
alias: contentAlias
}
}
};
}
function createT4(insideLang) {
var grammar = Prism2.languages[insideLang];
var className = "language-" + insideLang;
return {
"block": {
pattern: /<#[\s\S]+?#>/,
inside: {
"directive": createBlock("@", {
"attr-value": {
pattern: /=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+)/,
inside: {
"punctuation": /^=|^["']|["']$/
}
},
"keyword": /\b\w+(?=\s)/,
"attr-name": /\b\w+/
}),
"expression": createBlock("=", grammar, className),
"class-feature": createBlock("\\+", grammar, className),
"standard": createBlock("", grammar, className)
}
}
};
}
Prism2.languages["t4-templating"] = Object.defineProperty({}, "createT4", { value: createT4 });
})(Prism);
Prism.languages.t4 = Prism.languages["t4-cs"] = Prism.languages["t4-templating"].createT4("csharp");
Prism.languages.vbnet = Prism.languages.extend("basic", {
"comment": [
{
pattern: /(?:!|REM\b).+/i,
inside: {
"keyword": /^REM/i
}
},
{
pattern: /(^|[^\\:])'.*/,
lookbehind: true,
greedy: true
}
],
"string": {
pattern: /(^|[^"])"(?:""|[^"])*"(?!")/,
lookbehind: true,
greedy: true
},
"keyword": /(?:\b(?:ADDHANDLER|ADDRESSOF|ALIAS|AND|ANDALSO|AS|BEEP|BLOAD|BOOLEAN|BSAVE|BYREF|BYTE|BYVAL|CALL(?: ABSOLUTE)?|CASE|CATCH|CBOOL|CBYTE|CCHAR|CDATE|CDBL|CDEC|CHAIN|CHAR|CHDIR|CINT|CLASS|CLEAR|CLNG|CLOSE|CLS|COBJ|COM|COMMON|CONST|CONTINUE|CSBYTE|CSHORT|CSNG|CSTR|CTYPE|CUINT|CULNG|CUSHORT|DATA|DATE|DECIMAL|DECLARE|DEF(?: FN| SEG|DBL|INT|LNG|SNG|STR)|DEFAULT|DELEGATE|DIM|DIRECTCAST|DO|DOUBLE|ELSE|ELSEIF|END|ENUM|ENVIRON|ERASE|ERROR|EVENT|EXIT|FALSE|FIELD|FILES|FINALLY|FOR(?: EACH)?|FRIEND|FUNCTION|GET|GETTYPE|GETXMLNAMESPACE|GLOBAL|GOSUB|GOTO|HANDLES|IF|IMPLEMENTS|IMPORTS|IN|INHERITS|INPUT|INTEGER|INTERFACE|IOCTL|IS|ISNOT|KEY|KILL|LET|LIB|LIKE|LINE INPUT|LOCATE|LOCK|LONG|LOOP|LSET|ME|MKDIR|MOD|MODULE|MUSTINHERIT|MUSTOVERRIDE|MYBASE|MYCLASS|NAME|NAMESPACE|NARROWING|NEW|NEXT|NOT|NOTHING|NOTINHERITABLE|NOTOVERRIDABLE|OBJECT|OF|OFF|ON(?: COM| ERROR| KEY| TIMER)?|OPEN|OPERATOR|OPTION(?: BASE)?|OPTIONAL|OR|ORELSE|OUT|OVERLOADS|OVERRIDABLE|OVERRIDES|PARAMARRAY|PARTIAL|POKE|PRIVATE|PROPERTY|PROTECTED|PUBLIC|PUT|RAISEEVENT|READ|READONLY|REDIM|REM|REMOVEHANDLER|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SBYTE|SELECT(?: CASE)?|SET|SHADOWS|SHARED|SHELL|SHORT|SINGLE|SLEEP|STATIC|STEP|STOP|STRING|STRUCTURE|SUB|SWAP|SYNCLOCK|SYSTEM|THEN|THROW|TIMER|TO|TROFF|TRON|TRUE|TRY|TRYCAST|TYPE|TYPEOF|UINTEGER|ULONG|UNLOCK|UNTIL|USHORT|USING|VIEW PRINT|WAIT|WEND|WHEN|WHILE|WIDENING|WITH|WITHEVENTS|WRITE|WRITEONLY|XOR)|\B(?:#CONST|#ELSE|#ELSEIF|#END|#IF))(?:\$|\b)/i,
"punctuation": /[,;:(){}]/
});
Prism.languages["t4-vb"] = Prism.languages["t4-templating"].createT4("vbnet");
(function(Prism2) {
var anchorOrAlias = /[*&][^\s[\]{},]+/;
var tag = /!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/;
var properties = "(?:" + tag.source + "(?:[ ]+" + anchorOrAlias.source + ")?|" + anchorOrAlias.source + "(?:[ ]+" + tag.source + ")?)";
var plainKey = /(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g, function() {
return /[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source;
});
var string = /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;
function createValuePattern(value, flags) {
flags = (flags || "").replace(/m/g, "") + "m";
var pattern = /([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g, function() {
return properties;
}).replace(/<<value>>/g, function() {
return value;
});
return RegExp(pattern, flags);
}
Prism2.languages.yaml = {
"scalar": {
pattern: RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g, function() {
return properties;
})),
lookbehind: true,
alias: "string"
},
"comment": /#.*/,
"key": {
pattern: RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g, function() {
return properties;
}).replace(/<<key>>/g, function() {
return "(?:" + plainKey + "|" + string + ")";
})),
lookbehind: true,
greedy: true,
alias: "atrule"
},
"directive": {
pattern: /(^[ \t]*)%.+/m,
lookbehind: true,
alias: "important"
},
"datetime": {
pattern: createValuePattern(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),
lookbehind: true,
alias: "number"
},
"boolean": {
pattern: createValuePattern(/false|true/.source, "i"),
lookbehind: true,
alias: "important"
},
"null": {
pattern: createValuePattern(/null|~/.source, "i"),
lookbehind: true,
alias: "important"
},
"string": {
pattern: createValuePattern(string),
lookbehind: true,
greedy: true
},
"number": {
pattern: createValuePattern(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source, "i"),
lookbehind: true
},
"tag": tag,
"important": anchorOrAlias,
"punctuation": /---|[:[\]{}\-,|>?]|\.\.\./
};
Prism2.languages.yml = Prism2.languages.yaml;
})(Prism);
Prism.languages.tap = {
"fail": /not ok[^#{\n\r]*/,
"pass": /ok[^#{\n\r]*/,
"pragma": /pragma [+-][a-z]+/,
"bailout": /bail out!.*/i,
"version": /TAP version \d+/i,
"plan": /\b\d+\.\.\d+(?: +#.*)?/,
"subtest": {
pattern: /# Subtest(?:: .*)?/,
greedy: true
},
"punctuation": /[{}]/,
"directive": /#.*/,
"yamlish": {
pattern: /(^[ \t]*)---[\s\S]*?[\r\n][ \t]*\.\.\.$/m,
lookbehind: true,
inside: Prism.languages.yaml,
alias: "language-yaml"
}
};
Prism.languages.tcl = {
"comment": {
pattern: /(^|[^\\])#.*/,
lookbehind: true
},
"string": {
pattern: /"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*"/,
greedy: true
},
"variable": [
{
pattern: /(\$)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/,
lookbehind: true
},
{
pattern: /(\$)\{[^}]+\}/,
lookbehind: true
},
{
pattern: /(^[\t ]*set[ \t]+)(?:::)?(?:[a-zA-Z0-9]+::)*\w+/m,
lookbehind: true
}
],
"function": {
pattern: /(^[\t ]*proc[ \t]+)\S+/m,
lookbehind: true
},
"builtin": [
{
pattern: /(^[\t ]*)(?:break|class|continue|error|eval|exit|for|foreach|if|proc|return|switch|while)\b/m,
lookbehind: true
},
/\b(?:else|elseif)\b/
],
"scope": {
pattern: /(^[\t ]*)(?:global|upvar|variable)\b/m,
lookbehind: true,
alias: "constant"
},
"keyword": {
pattern: /(^[\t ]*|\[)(?:Safe_Base|Tcl|after|append|apply|array|auto_(?:execok|import|load|mkindex|qualify|reset)|automkindex_old|bgerror|binary|catch|cd|chan|clock|close|concat|dde|dict|encoding|eof|exec|expr|fblocked|fconfigure|fcopy|file(?:event|name)?|flush|gets|glob|history|http|incr|info|interp|join|lappend|lassign|lindex|linsert|list|llength|load|lrange|lrepeat|lreplace|lreverse|lsearch|lset|lsort|math(?:func|op)|memory|msgcat|namespace|open|package|parray|pid|pkg_mkIndex|platform|puts|pwd|re_syntax|read|refchan|regexp|registry|regsub|rename|scan|seek|set|socket|source|split|string|subst|tcl(?:_endOfWord|_findLibrary|startOf(?:Next|Previous)Word|test|vars|wordBreak(?:After|Before))|tell|time|tm|trace|unknown|unload|unset|update|uplevel|vwait)\b/m,
lookbehind: true
},
"operator": /!=?|\*\*?|==|&&?|\|\|?|<[=<]?|>[=>]?|[-+~\/%?^]|\b(?:eq|in|ne|ni)\b/,
"punctuation": /[{}()\[\]]/
};
(function(Prism2) {
Prism2.languages.tt2 = Prism2.languages.extend("clike", {
"comment": /#.*|\[%#[\s\S]*?%\]/,
"keyword": /\b(?:BLOCK|CALL|CASE|CATCH|CLEAR|DEBUG|DEFAULT|ELSE|ELSIF|END|FILTER|FINAL|FOREACH|GET|IF|IN|INCLUDE|INSERT|LAST|MACRO|META|NEXT|PERL|PROCESS|RAWPERL|RETURN|SET|STOP|SWITCH|TAGS|THROW|TRY|UNLESS|USE|WHILE|WRAPPER)\b/,
"punctuation": /[[\]{},()]/
});
Prism2.languages.insertBefore("tt2", "number", {
"operator": /=[>=]?|!=?|<=?|>=?|&&|\|\|?|\b(?:and|not|or)\b/,
"variable": {
pattern: /\b[a-z]\w*(?:\s*\.\s*(?:\d+|\$?[a-z]\w*))*\b/i
}
});
Prism2.languages.insertBefore("tt2", "keyword", {
"delimiter": {
pattern: /^(?:\[%|%%)-?|-?%\]$/,
alias: "punctuation"
}
});
Prism2.languages.insertBefore("tt2", "string", {
"single-quoted-string": {
pattern: /'[^\\']*(?:\\[\s\S][^\\']*)*'/,
greedy: true,
alias: "string"
},
"double-quoted-string": {
pattern: /"[^\\"]*(?:\\[\s\S][^\\"]*)*"/,
greedy: true,
alias: "string",
inside: {
"variable": {
pattern: /\$(?:[a-z]\w*(?:\.(?:\d+|\$?[a-z]\w*))*)/i
}
}
}
});
delete Prism2.languages.tt2.string;
Prism2.hooks.add("before-tokenize", function(env) {
var tt2Pattern = /\[%[\s\S]+?%\]/g;
Prism2.languages["markup-templating"].buildPlaceholders(env, "tt2", tt2Pattern);
});
Prism2.hooks.add("after-tokenize", function(env) {
Prism2.languages["markup-templating"].tokenizePlaceholders(env, "tt2");
});
})(Prism);
(function(Prism2) {
var modifierRegex = /\([^|()\n]+\)|\[[^\]\n]+\]|\{[^}\n]+\}/.source;
var parenthesesRegex = /\)|\((?![^|()\n]+\))/.source;
function withModifier(source, flags) {
return RegExp(
source.replace(/<MOD>/g, function() {
return "(?:" + modifierRegex + ")";
}).replace(/<PAR>/g, function() {
return "(?:" + parenthesesRegex + ")";
}),
flags || ""
);
}
var modifierTokens = {
"css": {
pattern: /\{[^{}]+\}/,
inside: {
rest: Prism2.languages.css
}
},
"class-id": {
pattern: /(\()[^()]+(?=\))/,
lookbehind: true,
alias: "attr-value"
},
"lang": {
pattern: /(\[)[^\[\]]+(?=\])/,
lookbehind: true,
alias: "attr-value"
},
"punctuation": /[\\\/]\d+|\S/
};
var textile = Prism2.languages.textile = Prism2.languages.extend("markup", {
"phrase": {
pattern: /(^|\r|\n)\S[\s\S]*?(?=$|\r?\n\r?\n|\r\r)/,
lookbehind: true,
inside: {
"block-tag": {
pattern: withModifier(/^[a-z]\w*(?:<MOD>|<PAR>|[<>=])*\./.source),
inside: {
"modifier": {
pattern: withModifier(/(^[a-z]\w*)(?:<MOD>|<PAR>|[<>=])+(?=\.)/.source),
lookbehind: true,
inside: modifierTokens
},
"tag": /^[a-z]\w*/,
"punctuation": /\.$/
}
},
"list": {
pattern: withModifier(/^[*#]+<MOD>*\s+\S.*/.source, "m"),
inside: {
"modifier": {
pattern: withModifier(/(^[*#]+)<MOD>+/.source),
lookbehind: true,
inside: modifierTokens
},
"punctuation": /^[*#]+/
}
},
"table": {
pattern: withModifier(/^(?:(?:<MOD>|<PAR>|[<>=^~])+\.\s*)?(?:\|(?:(?:<MOD>|<PAR>|[<>=^~_]|[\\/]\d+)+\.|(?!(?:<MOD>|<PAR>|[<>=^~_]|[\\/]\d+)+\.))[^|]*)+\|/.source, "m"),
inside: {
"modifier": {
pattern: withModifier(/(^|\|(?:\r?\n|\r)?)(?:<MOD>|<PAR>|[<>=^~_]|[\\/]\d+)+(?=\.)/.source),
lookbehind: true,
inside: modifierTokens
},
"punctuation": /\||^\./
}
},
"inline": {
pattern: withModifier(/(^|[^a-zA-Z\d])(\*\*|__|\?\?|[*_%@+\-^~])<MOD>*.+?\2(?![a-zA-Z\d])/.source),
lookbehind: true,
inside: {
"bold": {
pattern: withModifier(/(^(\*\*?)<MOD>*).+?(?=\2)/.source),
lookbehind: true
},
"italic": {
pattern: withModifier(/(^(__?)<MOD>*).+?(?=\2)/.source),
lookbehind: true
},
"cite": {
pattern: withModifier(/(^\?\?<MOD>*).+?(?=\?\?)/.source),
lookbehind: true,
alias: "string"
},
"code": {
pattern: withModifier(/(^@<MOD>*).+?(?=@)/.source),
lookbehind: true,
alias: "keyword"
},
"inserted": {
pattern: withModifier(/(^\+<MOD>*).+?(?=\+)/.source),
lookbehind: true
},
"deleted": {
pattern: withModifier(/(^-<MOD>*).+?(?=-)/.source),
lookbehind: true
},
"span": {
pattern: withModifier(/(^%<MOD>*).+?(?=%)/.source),
lookbehind: true
},
"modifier": {
pattern: withModifier(/(^\*\*|__|\?\?|[*_%@+\-^~])<MOD>+/.source),
lookbehind: true,
inside: modifierTokens
},
"punctuation": /[*_%?@+\-^~]+/
}
},
"link-ref": {
pattern: /^\[[^\]]+\]\S+$/m,
inside: {
"string": {
pattern: /(^\[)[^\]]+(?=\])/,
lookbehind: true
},
"url": {
pattern: /(^\])\S+$/,
lookbehind: true
},
"punctuation": /[\[\]]/
}
},
"link": {
pattern: withModifier(/"<MOD>*[^"]+":.+?(?=[^\w/]?(?:\s|$))/.source),
inside: {
"text": {
pattern: withModifier(/(^"<MOD>*)[^"]+(?=")/.source),
lookbehind: true
},
"modifier": {
pattern: withModifier(/(^")<MOD>+/.source),
lookbehind: true,
inside: modifierTokens
},
"url": {
pattern: /(:).+/,
lookbehind: true
},
"punctuation": /[":]/
}
},
"image": {
pattern: withModifier(/!(?:<MOD>|<PAR>|[<>=])*(?![<>=])[^!\s()]+(?:\([^)]+\))?!(?::.+?(?=[^\w/]?(?:\s|$)))?/.source),
inside: {
"source": {
pattern: withModifier(/(^!(?:<MOD>|<PAR>|[<>=])*)(?![<>=])[^!\s()]+(?:\([^)]+\))?(?=!)/.source),
lookbehind: true,
alias: "url"
},
"modifier": {
pattern: withModifier(/(^!)(?:<MOD>|<PAR>|[<>=])+/.source),
lookbehind: true,
inside: modifierTokens
},
"url": {
pattern: /(:).+/,
lookbehind: true
},
"punctuation": /[!:]/
}
},
"footnote": {
pattern: /\b\[\d+\]/,
alias: "comment",
inside: {
"punctuation": /\[|\]/
}
},
"acronym": {
pattern: /\b[A-Z\d]+\([^)]+\)/,
inside: {
"comment": {
pattern: /(\()[^()]+(?=\))/,
lookbehind: true
},
"punctuation": /[()]/
}
},
"mark": {
pattern: /\b\((?:C|R|TM)\)/,
alias: "comment",
inside: {
"punctuation": /[()]/
}
}
}
}
});
var phraseInside = textile["phrase"].inside;
var nestedPatterns = {
"inline": phraseInside["inline"],
"link": phraseInside["link"],
"image": phraseInside["image"],
"footnote": phraseInside["footnote"],
"acronym": phraseInside["acronym"],
"mark": phraseInside["mark"]
};
textile.tag.pattern = /<\/?(?!\d)[a-z0-9]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/i;
var phraseInlineInside = phraseInside["inline"].inside;
phraseInlineInside["bold"].inside = nestedPatterns;
phraseInlineInside["italic"].inside = nestedPatterns;
phraseInlineInside["inserted"].inside = nestedPatterns;
phraseInlineInside["deleted"].inside = nestedPatterns;
phraseInlineInside["span"].inside = nestedPatterns;
var phraseTableInside = phraseInside["table"].inside;
phraseTableInside["inline"] = nestedPatterns["inline"];
phraseTableInside["link"] = nestedPatterns["link"];
phraseTableInside["image"] = nestedPatterns["image"];
phraseTableInside["footnote"] = nestedPatterns["footnote"];
phraseTableInside["acronym"] = nestedPatterns["acronym"];
phraseTableInside["mark"] = nestedPatterns["mark"];
})(Prism);
(function(Prism2) {
var key = /(?:[\w-]+|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*")/.source;
function insertKey(pattern) {
return pattern.replace(/__/g, function() {
return key;
});
}
Prism2.languages.toml = {
"comment": {
pattern: /#.*/,
greedy: true
},
"table": {
pattern: RegExp(insertKey(/(^[\t ]*\[\s*(?:\[\s*)?)__(?:\s*\.\s*__)*(?=\s*\])/.source), "m"),
lookbehind: true,
greedy: true,
alias: "class-name"
},
"key": {
pattern: RegExp(insertKey(/(^[\t ]*|[{,]\s*)__(?:\s*\.\s*__)*(?=\s*=)/.source), "m"),
lookbehind: true,
greedy: true,
alias: "property"
},
"string": {
pattern: /"""(?:\\[\s\S]|[^\\])*?"""|'''[\s\S]*?'''|'[^'\n\r]*'|"(?:\\.|[^\\"\r\n])*"/,
greedy: true
},
"date": [
{
pattern: /\b\d{4}-\d{2}-\d{2}(?:[T\s]\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})?)?\b/i,
alias: "number"
},
{
pattern: /\b\d{2}:\d{2}:\d{2}(?:\.\d+)?\b/,
alias: "number"
}
],
"number": /(?:\b0(?:x[\da-zA-Z]+(?:_[\da-zA-Z]+)*|o[0-7]+(?:_[0-7]+)*|b[10]+(?:_[10]+)*))\b|[-+]?\b\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?\b|[-+]?\b(?:inf|nan)\b/,
"boolean": /\b(?:false|true)\b/,
"punctuation": /[.,=[\]{}]/
};
})(Prism);
(function(Prism2) {
Prism2.languages.tremor = {
"comment": {
pattern: /(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,
lookbehind: true
},
"interpolated-string": null,
"extractor": {
pattern: /\b[a-z_]\w*\|(?:[^\r\n\\|]|\\(?:\r\n|[\s\S]))*\|/i,
greedy: true,
inside: {
"regex": {
pattern: /(^re)\|[\s\S]+/,
lookbehind: true
},
"function": /^\w+/,
"value": /\|[\s\S]+/
}
},
"identifier": {
pattern: /`[^`]*`/,
greedy: true
},
"function": /\b[a-z_]\w*(?=\s*(?:::\s*<|\())\b/,
"keyword": /\b(?:args|as|by|case|config|connect|connector|const|copy|create|default|define|deploy|drop|each|emit|end|erase|event|flow|fn|for|from|group|having|insert|into|intrinsic|let|links|match|merge|mod|move|of|operator|patch|pipeline|recur|script|select|set|sliding|state|stream|to|tumbling|update|use|when|where|window|with)\b/,
"boolean": /\b(?:false|null|true)\b/i,
"number": /\b(?:0b[01_]*|0x[0-9a-fA-F_]*|\d[\d_]*(?:\.\d[\d_]*)?(?:[Ee][+-]?[\d_]+)?)\b/,
"pattern-punctuation": {
pattern: /%(?=[({[])/,
alias: "punctuation"
},
"operator": /[-+*\/%~!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?>?=?|(?:absent|and|not|or|present|xor)\b/,
"punctuation": /::|[;\[\]()\{\},.:]/
};
var interpolationPattern = /#\{(?:[^"{}]|\{[^{}]*\}|"(?:[^"\\\r\n]|\\(?:\r\n|[\s\S]))*")*\}/.source;
Prism2.languages.tremor["interpolated-string"] = {
pattern: RegExp(
/(^|[^\\])/.source + '(?:"""(?:' + /[^"\\#]|\\[\s\S]|"(?!"")|#(?!\{)/.source + "|" + interpolationPattern + ')*"""|"(?:' + /[^"\\\r\n#]|\\(?:\r\n|[\s\S])|#(?!\{)/.source + "|" + interpolationPattern + ')*")'
),
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: RegExp(interpolationPattern),
inside: {
"punctuation": /^#\{|\}$/,
"expression": {
pattern: /[\s\S]+/,
inside: Prism2.languages.tremor
}
}
},
"string": /[\s\S]+/
}
};
Prism2.languages.troy = Prism2.languages["tremor"];
Prism2.languages.trickle = Prism2.languages["tremor"];
})(Prism);
Prism.languages.twig = {
"comment": /^\{#[\s\S]*?#\}$/,
"tag-name": {
pattern: /(^\{%-?\s*)\w+/,
lookbehind: true,
alias: "keyword"
},
"delimiter": {
pattern: /^\{[{%]-?|-?[%}]\}$/,
alias: "punctuation"
},
"string": {
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
inside: {
"punctuation": /^['"]|['"]$/
}
},
"keyword": /\b(?:even|if|odd)\b/,
"boolean": /\b(?:false|null|true)\b/,
"number": /\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,
"operator": [
{
pattern: /(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,
lookbehind: true
},
/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/
],
"punctuation": /[()\[\]{}:.,]/
};
Prism.hooks.add("before-tokenize", function(env) {
if (env.language !== "twig") {
return;
}
var pattern = /\{(?:#[\s\S]*?#|%[\s\S]*?%|\{[\s\S]*?\})\}/g;
Prism.languages["markup-templating"].buildPlaceholders(env, "twig", pattern);
});
Prism.hooks.add("after-tokenize", function(env) {
Prism.languages["markup-templating"].tokenizePlaceholders(env, "twig");
});
(function(Prism2) {
var keywords = /\b(?:ACT|ACTIFSUB|CARRAY|CASE|CLEARGIF|COA|COA_INT|CONSTANTS|CONTENT|CUR|EDITPANEL|EFFECT|EXT|FILE|FLUIDTEMPLATE|FORM|FRAME|FRAMESET|GIFBUILDER|GMENU|GMENU_FOLDOUT|GMENU_LAYERS|GP|HMENU|HRULER|HTML|IENV|IFSUB|IMAGE|IMGMENU|IMGMENUITEM|IMGTEXT|IMG_RESOURCE|INCLUDE_TYPOSCRIPT|JSMENU|JSMENUITEM|LLL|LOAD_REGISTER|NO|PAGE|RECORDS|RESTORE_REGISTER|TEMPLATE|TEXT|TMENU|TMENUITEM|TMENU_LAYERS|USER|USER_INT|_GIFBUILDER|global|globalString|globalVar)\b/;
Prism2.languages.typoscript = {
"comment": [
{
pattern: /(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,
lookbehind: true
},
{
pattern: /(^|[^\\:= \t]|(?:^|[^= \t])[ \t]+)\/\/.*/,
lookbehind: true,
greedy: true
},
{
pattern: /(^|[^"'])#.*/,
lookbehind: true,
greedy: true
}
],
"function": [
{
pattern: /<INCLUDE_TYPOSCRIPT:\s*source\s*=\s*(?:"[^"\r\n]*"|'[^'\r\n]*')\s*>/,
inside: {
"string": {
pattern: /"[^"\r\n]*"|'[^'\r\n]*'/,
inside: {
"keyword": keywords
}
},
"keyword": {
pattern: /INCLUDE_TYPOSCRIPT/
}
}
},
{
pattern: /@import\s*(?:"[^"\r\n]*"|'[^'\r\n]*')/,
inside: {
"string": /"[^"\r\n]*"|'[^'\r\n]*'/
}
}
],
"string": {
pattern: /^([^=]*=[< ]?)(?:(?!\]\n).)*/,
lookbehind: true,
inside: {
"function": /\{\$.*\}/,
"keyword": keywords,
"number": /^\d+$/,
"punctuation": /[,|:]/
}
},
"keyword": keywords,
"number": {
pattern: /\b\d+\s*[.{=]/,
inside: {
"operator": /[.{=]/
}
},
"tag": {
pattern: /\.?[-\w\\]+\.?/,
inside: {
"punctuation": /\./
}
},
"punctuation": /[{}[\];(),.:|]/,
"operator": /[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/
};
Prism2.languages.tsconfig = Prism2.languages.typoscript;
})(Prism);
Prism.languages.unrealscript = {
"comment": /\/\/.*|\/\*[\s\S]*?\*\//,
"string": {
pattern: /(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
greedy: true
},
"category": {
pattern: /(\b(?:(?:autoexpand|hide|show)categories|var)\s*\()[^()]+(?=\))/,
lookbehind: true,
greedy: true,
alias: "property"
},
"metadata": {
pattern: /(\w\s*)<\s*\w+\s*=[^<>|=\r\n]+(?:\|\s*\w+\s*=[^<>|=\r\n]+)*>/,
lookbehind: true,
greedy: true,
inside: {
"property": /\b\w+(?=\s*=)/,
"operator": /=/,
"punctuation": /[<>|]/
}
},
"macro": {
pattern: /`\w+/,
alias: "property"
},
"class-name": {
pattern: /(\b(?:class|enum|extends|interface|state(?:\(\))?|struct|within)\s+)\w+/,
lookbehind: true
},
"keyword": /\b(?:abstract|actor|array|auto|autoexpandcategories|bool|break|byte|case|class|classgroup|client|coerce|collapsecategories|config|const|continue|default|defaultproperties|delegate|dependson|deprecated|do|dontcollapsecategories|editconst|editinlinenew|else|enum|event|exec|export|extends|final|float|for|forcescriptorder|foreach|function|goto|guid|hidecategories|hidedropdown|if|ignores|implements|inherits|input|int|interface|iterator|latent|local|material|name|native|nativereplication|noexport|nontransient|noteditinlinenew|notplaceable|operator|optional|out|pawn|perobjectconfig|perobjectlocalized|placeable|postoperator|preoperator|private|protected|reliable|replication|return|server|showcategories|simulated|singular|state|static|string|struct|structdefault|structdefaultproperties|switch|texture|transient|travel|unreliable|until|var|vector|while|within)\b/,
"function": /\b[a-z_]\w*(?=\s*\()/i,
"boolean": /\b(?:false|true)\b/,
"number": /\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,
"operator": />>|<<|--|\+\+|\*\*|[-+*/~!=<>$@]=?|&&?|\|\|?|\^\^?|[?:%]|\b(?:ClockwiseFrom|Cross|Dot)\b/,
"punctuation": /[()[\]{};,.]/
};
Prism.languages.uc = Prism.languages.uscript = Prism.languages.unrealscript;
Prism.languages.uorazor = {
"comment-hash": {
pattern: /#.*/,
alias: "comment",
greedy: true
},
"comment-slash": {
pattern: /\/\/.*/,
alias: "comment",
greedy: true
},
"string": {
pattern: /("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,
inside: {
"punctuation": /^['"]|['"]$/
},
greedy: true
},
"source-layers": {
pattern: /\b(?:arms|backpack|blue|bracelet|cancel|clear|cloak|criminal|earrings|enemy|facialhair|friend|friendly|gloves|gray|grey|ground|hair|head|innerlegs|innertorso|innocent|lefthand|middletorso|murderer|neck|nonfriendly|onehandedsecondary|outerlegs|outertorso|pants|red|righthand|ring|self|shirt|shoes|talisman|waist)\b/i,
alias: "function"
},
"source-commands": {
pattern: /\b(?:alliance|attack|cast|clearall|clearignore|clearjournal|clearlist|clearsysmsg|createlist|createtimer|dclick|dclicktype|dclickvar|dress|dressconfig|drop|droprelloc|emote|getlabel|guild|gumpclose|gumpresponse|hotkey|ignore|lasttarget|lift|lifttype|menu|menuresponse|msg|org|organize|organizer|overhead|pause|poplist|potion|promptresponse|pushlist|removelist|removetimer|rename|restock|say|scav|scavenger|script|setability|setlasttarget|setskill|settimer|setvar|sysmsg|target|targetloc|targetrelloc|targettype|undress|unignore|unsetvar|useobject|useonce|useskill|usetype|virtue|wait|waitforgump|waitformenu|waitforprompt|waitforstat|waitforsysmsg|waitfortarget|walk|wfsysmsg|wft|whisper|yell)\b/,
alias: "function"
},
"tag-name": {
pattern: /(^\{%-?\s*)\w+/,
lookbehind: true,
alias: "keyword"
},
"delimiter": {
pattern: /^\{[{%]-?|-?[%}]\}$/,
alias: "punctuation"
},
"function": /\b(?:atlist|close|closest|count|counter|counttype|dead|dex|diffhits|diffmana|diffstam|diffweight|find|findbuff|finddebuff|findlayer|findtype|findtypelist|followers|gumpexists|hidden|hits|hp|hue|human|humanoid|ingump|inlist|insysmessage|insysmsg|int|invul|lhandempty|list|listexists|mana|maxhits|maxhp|maxmana|maxstam|maxweight|monster|mounted|name|next|noto|paralyzed|poisoned|position|prev|previous|queued|rand|random|rhandempty|skill|stam|str|targetexists|timer|timerexists|varexist|warmode|weight)\b/,
"keyword": /\b(?:and|as|break|continue|else|elseif|endfor|endif|endwhile|for|if|loop|not|or|replay|stop|while)\b/,
"boolean": /\b(?:false|null|true)\b/,
"number": /\b0x[\dA-Fa-f]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][-+]?\d+)?/,
"operator": [
{
pattern: /(\s)(?:and|b-and|b-or|b-xor|ends with|in|is|matches|not|or|same as|starts with)(?=\s)/,
lookbehind: true
},
/[=<>]=?|!=|\*\*?|\/\/?|\?:?|[-+~%|]/
],
"punctuation": /[()\[\]{}:.,]/
};
Prism.languages.uri = {
"scheme": {
pattern: /^[a-z][a-z0-9+.-]*:/im,
greedy: true,
inside: {
"scheme-delimiter": /:$/
}
},
"fragment": {
pattern: /#[\w\-.~!$&'()*+,;=%:@/?]*/,
inside: {
"fragment-delimiter": /^#/
}
},
"query": {
pattern: /\?[\w\-.~!$&'()*+,;=%:@/?]*/,
inside: {
"query-delimiter": {
pattern: /^\?/,
greedy: true
},
"pair-delimiter": /[&;]/,
"pair": {
pattern: /^[^=][\s\S]*/,
inside: {
"key": /^[^=]+/,
"value": {
pattern: /(^=)[\s\S]+/,
lookbehind: true
}
}
}
}
},
"authority": {
pattern: RegExp(
/^\/\//.source + /(?:[\w\-.~!$&'()*+,;=%:]*@)?/.source + ("(?:" + /\[(?:[0-9a-fA-F:.]{2,48}|v[0-9a-fA-F]+\.[\w\-.~!$&'()*+,;=]+)\]/.source + "|" + /[\w\-.~!$&'()*+,;=%]*/.source + ")") + /(?::\d*)?/.source,
"m"
),
inside: {
"authority-delimiter": /^\/\//,
"user-info-segment": {
pattern: /^[\w\-.~!$&'()*+,;=%:]*@/,
inside: {
"user-info-delimiter": /@$/,
"user-info": /^[\w\-.~!$&'()*+,;=%:]+/
}
},
"port-segment": {
pattern: /:\d*$/,
inside: {
"port-delimiter": /^:/,
"port": /^\d+/
}
},
"host": {
pattern: /[\s\S]+/,
inside: {
"ip-literal": {
pattern: /^\[[\s\S]+\]$/,
inside: {
"ip-literal-delimiter": /^\[|\]$/,
"ipv-future": /^v[\s\S]+/,
"ipv6-address": /^[\s\S]+/
}
},
"ipv4-address": /^(?:(?:[03-9]\d?|[12]\d{0,2})\.){3}(?:[03-9]\d?|[12]\d{0,2})$/
}
}
}
},
"path": {
pattern: /^[\w\-.~!$&'()*+,;=%:@/]+/m,
inside: {
"path-separator": /\//
}
}
};
Prism.languages.url = Prism.languages.uri;
(function(Prism2) {
var interpolationExpr = {
pattern: /[\s\S]+/,
inside: null
};
Prism2.languages.v = Prism2.languages.extend("clike", {
"string": {
pattern: /r?(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
alias: "quoted-string",
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)\$(?:\{[^{}]*\}|\w+(?:\.\w+(?:\([^\(\)]*\))?|\[[^\[\]]+\])*)/,
lookbehind: true,
inside: {
"interpolation-variable": {
pattern: /^\$\w[\s\S]*$/,
alias: "variable"
},
"interpolation-punctuation": {
pattern: /^\$\{|\}$/,
alias: "punctuation"
},
"interpolation-expression": interpolationExpr
}
}
}
},
"class-name": {
pattern: /(\b(?:enum|interface|struct|type)\s+)(?:C\.)?\w+/,
lookbehind: true
},
"keyword": /(?:\b(?:__global|as|asm|assert|atomic|break|chan|const|continue|defer|else|embed|enum|fn|for|go(?:to)?|if|import|in|interface|is|lock|match|module|mut|none|or|pub|return|rlock|select|shared|sizeof|static|struct|type(?:of)?|union|unsafe)|\$(?:else|for|if)|#(?:flag|include))\b/,
"number": /\b(?:0x[a-f\d]+(?:_[a-f\d]+)*|0b[01]+(?:_[01]+)*|0o[0-7]+(?:_[0-7]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?)\b/i,
"operator": /~|\?|[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\.?/,
"builtin": /\b(?:any(?:_float|_int)?|bool|byte(?:ptr)?|charptr|f(?:32|64)|i(?:8|16|64|128|nt)|rune|size_t|string|u(?:16|32|64|128)|voidptr)\b/
});
interpolationExpr.inside = Prism2.languages.v;
Prism2.languages.insertBefore("v", "string", {
"char": {
pattern: /`(?:\\`|\\?[^`]{1,2})`/,
alias: "rune"
}
});
Prism2.languages.insertBefore("v", "operator", {
"attribute": {
pattern: /(^[\t ]*)\[(?:deprecated|direct_array_access|flag|inline|live|ref_only|typedef|unsafe_fn|windows_stdcall)\]/m,
lookbehind: true,
alias: "annotation",
inside: {
"punctuation": /[\[\]]/,
"keyword": /\w+/
}
},
"generic": {
pattern: /<\w+>(?=\s*[\)\{])/,
inside: {
"punctuation": /[<>]/,
"class-name": /\w+/
}
}
});
Prism2.languages.insertBefore("v", "function", {
"generic-function": {
pattern: /\b\w+\s*<\w+>(?=\()/,
inside: {
"function": /^\w+/,
"generic": {
pattern: /<\w+>/,
inside: Prism2.languages.v.generic.inside
}
}
}
});
})(Prism);
Prism.languages.vala = Prism.languages.extend("clike", {
"class-name": [
{
pattern: /\b[A-Z]\w*(?:\.\w+)*\b(?=(?:\?\s+|\*?\s+\*?)\w)/,
inside: {
punctuation: /\./
}
},
{
pattern: /(\[)[A-Z]\w*(?:\.\w+)*\b/,
lookbehind: true,
inside: {
punctuation: /\./
}
},
{
pattern: /(\b(?:class|interface)\s+[A-Z]\w*(?:\.\w+)*\s*:\s*)[A-Z]\w*(?:\.\w+)*\b/,
lookbehind: true,
inside: {
punctuation: /\./
}
},
{
pattern: /((?:\b(?:class|enum|interface|new|struct)\s+)|(?:catch\s+\())[A-Z]\w*(?:\.\w+)*\b/,
lookbehind: true,
inside: {
punctuation: /\./
}
}
],
"keyword": /\b(?:abstract|as|assert|async|base|bool|break|case|catch|char|class|const|construct|continue|default|delegate|delete|do|double|dynamic|else|ensures|enum|errordomain|extern|finally|float|for|foreach|get|if|in|inline|int|int16|int32|int64|int8|interface|internal|is|lock|long|namespace|new|null|out|override|owned|params|private|protected|public|ref|requires|return|set|short|signal|sizeof|size_t|ssize_t|static|string|struct|switch|this|throw|throws|try|typeof|uchar|uint|uint16|uint32|uint64|uint8|ulong|unichar|unowned|ushort|using|value|var|virtual|void|volatile|weak|while|yield)\b/i,
"function": /\b\w+(?=\s*\()/,
"number": /(?:\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)(?:f|u?l?)?/i,
"operator": /\+\+|--|&&|\|\||<<=?|>>=?|=>|->|~|[+\-*\/%&^|=!<>]=?|\?\??|\.\.\./,
"punctuation": /[{}[\];(),.:]/,
"constant": /\b[A-Z0-9_]+\b/
});
Prism.languages.insertBefore("vala", "string", {
"raw-string": {
pattern: /"""[\s\S]*?"""/,
greedy: true,
alias: "string"
},
"template-string": {
pattern: /@"[\s\S]*?"/,
greedy: true,
inside: {
"interpolation": {
pattern: /\$(?:\([^)]*\)|[a-zA-Z]\w*)/,
inside: {
"delimiter": {
pattern: /^\$\(?|\)$/,
alias: "punctuation"
},
rest: Prism.languages.vala
}
},
"string": /[\s\S]+/
}
}
});
Prism.languages.insertBefore("vala", "keyword", {
"regex": {
pattern: /\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[imsx]{0,4}(?=\s*(?:$|[\r\n,.;})\]]))/,
greedy: true,
inside: {
"regex-source": {
pattern: /^(\/)[\s\S]+(?=\/[a-z]*$)/,
lookbehind: true,
alias: "language-regex",
inside: Prism.languages.regex
},
"regex-delimiter": /^\//,
"regex-flags": /^[a-z]+$/
}
}
});
(function(Prism2) {
Prism2.languages.velocity = Prism2.languages.extend("markup", {});
var velocity = {
"variable": {
pattern: /(^|[^\\](?:\\\\)*)\$!?(?:[a-z][\w-]*(?:\([^)]*\))?(?:\.[a-z][\w-]*(?:\([^)]*\))?|\[[^\]]+\])*|\{[^}]+\})/i,
lookbehind: true,
inside: {}
},
"string": {
pattern: /"[^"]*"|'[^']*'/,
greedy: true
},
"number": /\b\d+\b/,
"boolean": /\b(?:false|true)\b/,
"operator": /[=!<>]=?|[+*/%-]|&&|\|\||\.\.|\b(?:eq|g[et]|l[et]|n(?:e|ot))\b/,
"punctuation": /[(){}[\]:,.]/
};
velocity.variable.inside = {
"string": velocity["string"],
"function": {
pattern: /([^\w-])[a-z][\w-]*(?=\()/,
lookbehind: true
},
"number": velocity["number"],
"boolean": velocity["boolean"],
"punctuation": velocity["punctuation"]
};
Prism2.languages.insertBefore("velocity", "comment", {
"unparsed": {
pattern: /(^|[^\\])#\[\[[\s\S]*?\]\]#/,
lookbehind: true,
greedy: true,
inside: {
"punctuation": /^#\[\[|\]\]#$/
}
},
"velocity-comment": [
{
pattern: /(^|[^\\])#\*[\s\S]*?\*#/,
lookbehind: true,
greedy: true,
alias: "comment"
},
{
pattern: /(^|[^\\])##.*/,
lookbehind: true,
greedy: true,
alias: "comment"
}
],
"directive": {
pattern: /(^|[^\\](?:\\\\)*)#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})(?:\s*\((?:[^()]|\([^()]*\))*\))?/i,
lookbehind: true,
inside: {
"keyword": {
pattern: /^#@?(?:[a-z][\w-]*|\{[a-z][\w-]*\})|\bin\b/,
inside: {
"punctuation": /[{}]/
}
},
rest: velocity
}
},
"variable": velocity["variable"]
});
Prism2.languages.velocity["tag"].inside["attr-value"].inside.rest = Prism2.languages.velocity;
})(Prism);
Prism.languages.verilog = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
greedy: true
},
"string": {
pattern: /"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,
greedy: true
},
"kernel-function": {
pattern: /\B\$\w+\b/,
alias: "property"
},
"constant": /\B`\w+\b/,
"function": /\b\w+(?=\()/,
"keyword": /\b(?:alias|and|assert|assign|assume|automatic|before|begin|bind|bins|binsof|bit|break|buf|bufif0|bufif1|byte|case|casex|casez|cell|chandle|class|clocking|cmos|config|const|constraint|context|continue|cover|covergroup|coverpoint|cross|deassign|default|defparam|design|disable|dist|do|edge|else|end|endcase|endclass|endclocking|endconfig|endfunction|endgenerate|endgroup|endinterface|endmodule|endpackage|endprimitive|endprogram|endproperty|endsequence|endspecify|endtable|endtask|enum|event|expect|export|extends|extern|final|first_match|for|force|foreach|forever|fork|forkjoin|function|generate|genvar|highz0|highz1|if|iff|ifnone|ignore_bins|illegal_bins|import|incdir|include|initial|inout|input|inside|instance|int|integer|interface|intersect|join|join_any|join_none|large|liblist|library|local|localparam|logic|longint|macromodule|matches|medium|modport|module|nand|negedge|new|nmos|nor|noshowcancelled|not|notif0|notif1|null|or|output|package|packed|parameter|pmos|posedge|primitive|priority|program|property|protected|pull0|pull1|pulldown|pullup|pulsestyle_ondetect|pulsestyle_onevent|pure|rand|randc|randcase|randsequence|rcmos|real|realtime|ref|reg|release|repeat|return|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|sequence|shortint|shortreal|showcancelled|signed|small|solve|specify|specparam|static|string|strong0|strong1|struct|super|supply0|supply1|table|tagged|task|this|throughout|time|timeprecision|timeunit|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|type|typedef|union|unique|unsigned|use|uwire|var|vectored|virtual|void|wait|wait_order|wand|weak0|weak1|while|wildcard|wire|with|within|wor|xnor|xor)\b/,
"important": /\b(?:always|always_comb|always_ff|always_latch)\b(?: *@)?/,
"number": /\B##?\d+|(?:\b\d+)?'[odbh] ?[\da-fzx_?]+|\b(?:\d*[._])?\d+(?:e[-+]?\d+)?/i,
"operator": /[-+{}^~%*\/?=!<>&|]+/,
"punctuation": /[[\];(),.:]/
};
Prism.languages.vhdl = {
"comment": /--.+/,
"vhdl-vectors": {
"pattern": /\b[oxb]"[\da-f_]+"|"[01uxzwlh-]+"/i,
"alias": "number"
},
"quoted-function": {
pattern: /"\S+?"(?=\()/,
alias: "function"
},
"string": /"(?:[^\\"\r\n]|\\(?:\r\n|[\s\S]))*"/,
"attribute": {
pattern: /\b'\w+/,
alias: "attr-name"
},
"keyword": /\b(?:access|after|alias|all|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|new|next|null|of|on|open|others|out|package|port|postponed|private|procedure|process|pure|range|record|register|reject|report|return|select|severity|shared|signal|subtype|then|to|transport|type|unaffected|units|until|use|variable|view|wait|when|while|with)\b/i,
"boolean": /\b(?:false|true)\b/i,
"function": /\w+(?=\()/,
"number": /'[01uxzwlh-]'|\b(?:\d+#[\da-f_.]+#|\d[\d_.]*)(?:e[-+]?\d+)?/i,
"operator": /[<>]=?|:=|[-+*/&=]|\b(?:abs|and|mod|nand|nor|not|or|rem|rol|ror|sla|sll|sra|srl|xnor|xor)\b/i,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.vim = {
"string": /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\r\n]|'')*'/,
"comment": /".*/,
"function": /\b\w+(?=\()/,
"keyword": /\b(?:N|Next|P|Print|X|XMLent|XMLns|ab|abbreviate|abc|abclear|abo|aboveleft|al|all|ar|arga|argadd|argd|argdelete|argdo|arge|argedit|argg|argglobal|argl|arglocal|args|argu|argument|as|ascii|b|bN|bNext|ba|bad|badd|ball|bd|bdelete|be|bel|belowright|bf|bfirst|bl|blast|bm|bmodified|bn|bnext|bo|botright|bp|bprevious|br|brea|break|breaka|breakadd|breakd|breakdel|breakl|breaklist|brewind|bro|browse|bufdo|buffer|buffers|bun|bunload|bw|bwipeout|c|cN|cNext|cNfcNfile|ca|cabbrev|cabc|cabclear|cad|caddb|caddbuffer|caddexpr|caddf|caddfile|cal|call|cat|catch|cb|cbuffer|cc|ccl|cclose|cd|ce|center|cex|cexpr|cf|cfile|cfir|cfirst|cg|cgetb|cgetbuffer|cgete|cgetexpr|cgetfile|change|changes|chd|chdir|che|checkpath|checkt|checktime|cl|cla|clast|clist|clo|close|cmapc|cmapclear|cn|cnew|cnewer|cnext|cnf|cnfile|cnorea|cnoreabbrev|co|col|colder|colo|colorscheme|comc|comclear|comp|compiler|con|conf|confirm|continue|cope|copen|copy|cp|cpf|cpfile|cprevious|cq|cquit|cr|crewind|cu|cuna|cunabbrev|cunmap|cw|cwindow|d|debugg|debuggreedy|delc|delcommand|delete|delf|delfunction|delm|delmarks|di|diffg|diffget|diffoff|diffpatch|diffpu|diffput|diffsplit|diffthis|diffu|diffupdate|dig|digraphs|display|dj|djump|dl|dlist|dr|drop|ds|dsearch|dsp|dsplit|e|earlier|echoe|echoerr|echom|echomsg|echon|edit|el|else|elsei|elseif|em|emenu|en|endf|endfo|endfor|endfun|endfunction|endif|endt|endtry|endw|endwhile|ene|enew|ex|exi|exit|exu|exusage|f|file|files|filetype|fin|fina|finally|find|fini|finish|fir|first|fix|fixdel|fo|fold|foldc|foldclose|foldd|folddoc|folddoclosed|folddoopen|foldo|foldopen|for|fu|fun|function|go|goto|gr|grep|grepa|grepadd|h|ha|hardcopy|help|helpf|helpfind|helpg|helpgrep|helpt|helptags|hid|hide|his|history|ia|iabbrev|iabc|iabclear|if|ij|ijump|il|ilist|imapc|imapclear|in|inorea|inoreabbrev|isearch|isp|isplit|iu|iuna|iunabbrev|iunmap|j|join|ju|jumps|k|kee|keepalt|keepj|keepjumps|keepmarks|l|lN|lNext|lNf|lNfile|la|lad|laddb|laddbuffer|laddexpr|laddf|laddfile|lan|language|last|later|lb|lbuffer|lc|lcd|lch|lchdir|lcl|lclose|left|lefta|leftabove|let|lex|lexpr|lf|lfile|lfir|lfirst|lg|lgetb|lgetbuffer|lgete|lgetexpr|lgetfile|lgr|lgrep|lgrepa|lgrepadd|lh|lhelpgrep|list|ll|lla|llast|lli|llist|lm|lmak|lmake|lmap|lmapc|lmapclear|ln|lne|lnew|lnewer|lnext|lnf|lnfile|lnoremap|lo|loadview|loc|lockmarks|lockv|lockvar|lol|lolder|lop|lopen|lp|lpf|lpfile|lprevious|lr|lrewind|ls|lt|ltag|lu|lunmap|lv|lvimgrep|lvimgrepa|lvimgrepadd|lw|lwindow|m|ma|mak|make|mark|marks|mat|match|menut|menutranslate|mk|mkexrc|mks|mksession|mksp|mkspell|mkv|mkvie|mkview|mkvimrc|mod|mode|move|mz|mzf|mzfile|mzscheme|n|nbkey|new|next|nmapc|nmapclear|noh|nohlsearch|norea|noreabbrev|nu|number|nun|nunmap|o|omapc|omapclear|on|only|open|opt|options|ou|ounmap|p|pc|pclose|pe|ped|pedit|perl|perld|perldo|po|pop|popu|popup|pp|ppop|pre|preserve|prev|previous|print|prof|profd|profdel|profile|promptf|promptfind|promptr|promptrepl|ps|psearch|ptN|ptNext|pta|ptag|ptf|ptfirst|ptj|ptjump|ptl|ptlast|ptn|ptnext|ptp|ptprevious|ptr|ptrewind|pts|ptselect|pu|put|pw|pwd|py|pyf|pyfile|python|q|qa|qall|quit|quita|quitall|r|read|rec|recover|red|redi|redir|redo|redr|redraw|redraws|redrawstatus|reg|registers|res|resize|ret|retab|retu|return|rew|rewind|ri|right|rightb|rightbelow|ru|rub|ruby|rubyd|rubydo|rubyf|rubyfile|runtime|rv|rviminfo|sN|sNext|sa|sal|sall|san|sandbox|sargument|sav|saveas|sb|sbN|sbNext|sba|sball|sbf|sbfirst|sbl|sblast|sbm|sbmodified|sbn|sbnext|sbp|sbprevious|sbr|sbrewind|sbuffer|scrip|scripte|scriptencoding|scriptnames|se|set|setf|setfiletype|setg|setglobal|setl|setlocal|sf|sfind|sfir|sfirst|sh|shell|sign|sil|silent|sim|simalt|sl|sla|slast|sleep|sm|smagic|smap|smapc|smapclear|sme|smenu|sn|snext|sni|sniff|sno|snomagic|snor|snoremap|snoreme|snoremenu|so|sor|sort|source|sp|spe|spelld|spelldump|spellgood|spelli|spellinfo|spellr|spellrepall|spellu|spellundo|spellw|spellwrong|split|spr|sprevious|sre|srewind|st|sta|stag|star|startg|startgreplace|startinsert|startr|startreplace|stj|stjump|stop|stopi|stopinsert|sts|stselect|sun|sunhide|sunm|sunmap|sus|suspend|sv|sview|syncbind|t|tN|tNext|ta|tab|tabN|tabNext|tabc|tabclose|tabd|tabdo|tabe|tabedit|tabf|tabfind|tabfir|tabfirst|tabl|tablast|tabm|tabmove|tabn|tabnew|tabnext|tabo|tabonly|tabp|tabprevious|tabr|tabrewind|tabs|tag|tags|tc|tcl|tcld|tcldo|tclf|tclfile|te|tearoff|tf|tfirst|th|throw|tj|tjump|tl|tlast|tm|tmenu|tn|tnext|to|topleft|tp|tprevious|tr|trewind|try|ts|tselect|tu|tunmenu|u|una|unabbreviate|undo|undoj|undojoin|undol|undolist|unh|unhide|unlet|unlo|unlockvar|unm|unmap|up|update|ve|verb|verbose|version|vert|vertical|vi|vie|view|vim|vimgrep|vimgrepa|vimgrepadd|visual|viu|viusage|vmapc|vmapclear|vne|vnew|vs|vsplit|vu|vunmap|w|wN|wNext|wa|wall|wh|while|win|winc|wincmd|windo|winp|winpos|winsize|wn|wnext|wp|wprevious|wq|wqa|wqall|write|ws|wsverb|wv|wviminfo|x|xa|xall|xit|xm|xmap|xmapc|xmapclear|xme|xmenu|xn|xnoremap|xnoreme|xnoremenu|xu|xunmap|y|yank)\b/,
"builtin": /\b(?:acd|ai|akm|aleph|allowrevins|altkeymap|ambiwidth|ambw|anti|antialias|arab|arabic|arabicshape|ari|arshape|autochdir|autocmd|autoindent|autoread|autowrite|autowriteall|aw|awa|background|backspace|backup|backupcopy|backupdir|backupext|backupskip|balloondelay|ballooneval|balloonexpr|bdir|bdlay|beval|bex|bexpr|bg|bh|bin|binary|biosk|bioskey|bk|bkc|bomb|breakat|brk|browsedir|bs|bsdir|bsk|bt|bufhidden|buflisted|buftype|casemap|ccv|cdpath|cedit|cfu|ch|charconvert|ci|cin|cindent|cink|cinkeys|cino|cinoptions|cinw|cinwords|clipboard|cmdheight|cmdwinheight|cmp|cms|columns|com|comments|commentstring|compatible|complete|completefunc|completeopt|consk|conskey|copyindent|cot|cpo|cpoptions|cpt|cscopepathcomp|cscopeprg|cscopequickfix|cscopetag|cscopetagorder|cscopeverbose|cspc|csprg|csqf|cst|csto|csverb|cuc|cul|cursorcolumn|cursorline|cwh|debug|deco|def|define|delcombine|dex|dg|dict|dictionary|diff|diffexpr|diffopt|digraph|dip|dir|directory|dy|ea|ead|eadirection|eb|ed|edcompatible|ef|efm|ei|ek|enc|encoding|endofline|eol|ep|equalalways|equalprg|errorbells|errorfile|errorformat|esckeys|et|eventignore|expandtab|exrc|fcl|fcs|fdc|fde|fdi|fdl|fdls|fdm|fdn|fdo|fdt|fen|fenc|fencs|fex|ff|ffs|fileencoding|fileencodings|fileformat|fileformats|fillchars|fk|fkmap|flp|fml|fmr|foldcolumn|foldenable|foldexpr|foldignore|foldlevel|foldlevelstart|foldmarker|foldmethod|foldminlines|foldnestmax|foldtext|formatexpr|formatlistpat|formatoptions|formatprg|fp|fs|fsync|ft|gcr|gd|gdefault|gfm|gfn|gfs|gfw|ghr|gp|grepformat|grepprg|gtl|gtt|guicursor|guifont|guifontset|guifontwide|guiheadroom|guioptions|guipty|guitablabel|guitabtooltip|helpfile|helpheight|helplang|hf|hh|hi|hidden|highlight|hk|hkmap|hkmapp|hkp|hl|hlg|hls|hlsearch|ic|icon|iconstring|ignorecase|im|imactivatekey|imak|imc|imcmdline|imd|imdisable|imi|iminsert|ims|imsearch|inc|include|includeexpr|incsearch|inde|indentexpr|indentkeys|indk|inex|inf|infercase|insertmode|invacd|invai|invakm|invallowrevins|invaltkeymap|invanti|invantialias|invar|invarab|invarabic|invarabicshape|invari|invarshape|invautochdir|invautoindent|invautoread|invautowrite|invautowriteall|invaw|invawa|invbackup|invballooneval|invbeval|invbin|invbinary|invbiosk|invbioskey|invbk|invbl|invbomb|invbuflisted|invcf|invci|invcin|invcindent|invcompatible|invconfirm|invconsk|invconskey|invcopyindent|invcp|invcscopetag|invcscopeverbose|invcst|invcsverb|invcuc|invcul|invcursorcolumn|invcursorline|invdeco|invdelcombine|invdg|invdiff|invdigraph|invdisable|invea|inveb|inved|invedcompatible|invek|invendofline|inveol|invequalalways|inverrorbells|invesckeys|invet|invex|invexpandtab|invexrc|invfen|invfk|invfkmap|invfoldenable|invgd|invgdefault|invguipty|invhid|invhidden|invhk|invhkmap|invhkmapp|invhkp|invhls|invhlsearch|invic|invicon|invignorecase|invim|invimc|invimcmdline|invimd|invincsearch|invinf|invinfercase|invinsertmode|invis|invjoinspaces|invjs|invlazyredraw|invlbr|invlinebreak|invlisp|invlist|invloadplugins|invlpl|invlz|invma|invmacatsui|invmagic|invmh|invml|invmod|invmodeline|invmodifiable|invmodified|invmore|invmousef|invmousefocus|invmousehide|invnu|invnumber|invodev|invopendevice|invpaste|invpi|invpreserveindent|invpreviewwindow|invprompt|invpvw|invreadonly|invremap|invrestorescreen|invrevins|invri|invrightleft|invrightleftcmd|invrl|invrlc|invro|invrs|invru|invruler|invsb|invsc|invscb|invscrollbind|invscs|invsecure|invsft|invshellslash|invshelltemp|invshiftround|invshortname|invshowcmd|invshowfulltag|invshowmatch|invshowmode|invsi|invsm|invsmartcase|invsmartindent|invsmarttab|invsmd|invsn|invsol|invspell|invsplitbelow|invsplitright|invspr|invsr|invssl|invsta|invstartofline|invstmp|invswapfile|invswf|invta|invtagbsearch|invtagrelative|invtagstack|invtbi|invtbidi|invtbs|invtermbidi|invterse|invtextauto|invtextmode|invtf|invtgst|invtildeop|invtimeout|invtitle|invto|invtop|invtr|invttimeout|invttybuiltin|invttyfast|invtx|invvb|invvisualbell|invwa|invwarn|invwb|invweirdinvert|invwfh|invwfw|invwildmenu|invwinfixheight|invwinfixwidth|invwiv|invwmnu|invwrap|invwrapscan|invwrite|invwriteany|invwritebackup|invws|isf|isfname|isi|isident|isk|iskeyword|isprint|joinspaces|js|key|keymap|keymodel|keywordprg|km|kmp|kp|langmap|langmenu|laststatus|lazyredraw|lbr|lcs|linebreak|lines|linespace|lisp|lispwords|listchars|loadplugins|lpl|lsp|lz|macatsui|magic|makeef|makeprg|matchpairs|matchtime|maxcombine|maxfuncdepth|maxmapdepth|maxmem|maxmempattern|maxmemtot|mco|mef|menuitems|mfd|mh|mis|mkspellmem|ml|mls|mm|mmd|mmp|mmt|modeline|modelines|modifiable|modified|more|mouse|mousef|mousefocus|mousehide|mousem|mousemodel|mouses|mouseshape|mouset|mousetime|mp|mps|msm|mzq|mzquantum|nf|noacd|noai|noakm|noallowrevins|noaltkeymap|noanti|noantialias|noar|noarab|noarabic|noarabicshape|noari|noarshape|noautochdir|noautoindent|noautoread|noautowrite|noautowriteall|noaw|noawa|nobackup|noballooneval|nobeval|nobin|nobinary|nobiosk|nobioskey|nobk|nobl|nobomb|nobuflisted|nocf|noci|nocin|nocindent|nocompatible|noconfirm|noconsk|noconskey|nocopyindent|nocp|nocscopetag|nocscopeverbose|nocst|nocsverb|nocuc|nocul|nocursorcolumn|nocursorline|nodeco|nodelcombine|nodg|nodiff|nodigraph|nodisable|noea|noeb|noed|noedcompatible|noek|noendofline|noeol|noequalalways|noerrorbells|noesckeys|noet|noex|noexpandtab|noexrc|nofen|nofk|nofkmap|nofoldenable|nogd|nogdefault|noguipty|nohid|nohidden|nohk|nohkmap|nohkmapp|nohkp|nohls|noic|noicon|noignorecase|noim|noimc|noimcmdline|noimd|noincsearch|noinf|noinfercase|noinsertmode|nois|nojoinspaces|nojs|nolazyredraw|nolbr|nolinebreak|nolisp|nolist|noloadplugins|nolpl|nolz|noma|nomacatsui|nomagic|nomh|noml|nomod|nomodeline|nomodifiable|nomodified|nomore|nomousef|nomousefocus|nomousehide|nonu|nonumber|noodev|noopendevice|nopaste|nopi|nopreserveindent|nopreviewwindow|noprompt|nopvw|noreadonly|noremap|norestorescreen|norevins|nori|norightleft|norightleftcmd|norl|norlc|noro|nors|noru|noruler|nosb|nosc|noscb|noscrollbind|noscs|nosecure|nosft|noshellslash|noshelltemp|noshiftround|noshortname|noshowcmd|noshowfulltag|noshowmatch|noshowmode|nosi|nosm|nosmartcase|nosmartindent|nosmarttab|nosmd|nosn|nosol|nospell|nosplitbelow|nosplitright|nospr|nosr|nossl|nosta|nostartofline|nostmp|noswapfile|noswf|nota|notagbsearch|notagrelative|notagstack|notbi|notbidi|notbs|notermbidi|noterse|notextauto|notextmode|notf|notgst|notildeop|notimeout|notitle|noto|notop|notr|nottimeout|nottybuiltin|nottyfast|notx|novb|novisualbell|nowa|nowarn|nowb|noweirdinvert|nowfh|nowfw|nowildmenu|nowinfixheight|nowinfixwidth|nowiv|nowmnu|nowrap|nowrapscan|nowrite|nowriteany|nowritebackup|nows|nrformats|numberwidth|nuw|odev|oft|ofu|omnifunc|opendevice|operatorfunc|opfunc|osfiletype|pa|para|paragraphs|paste|pastetoggle|patchexpr|patchmode|path|pdev|penc|pex|pexpr|pfn|ph|pheader|pi|pm|pmbcs|pmbfn|popt|preserveindent|previewheight|previewwindow|printdevice|printencoding|printexpr|printfont|printheader|printmbcharset|printmbfont|printoptions|prompt|pt|pumheight|pvh|pvw|qe|quoteescape|readonly|remap|report|restorescreen|revins|rightleft|rightleftcmd|rl|rlc|ro|rs|rtp|ruf|ruler|rulerformat|runtimepath|sbo|sc|scb|scr|scroll|scrollbind|scrolljump|scrolloff|scrollopt|scs|sect|sections|secure|sel|selection|selectmode|sessionoptions|sft|shcf|shellcmdflag|shellpipe|shellquote|shellredir|shellslash|shelltemp|shelltype|shellxquote|shiftround|shiftwidth|shm|shortmess|shortname|showbreak|showcmd|showfulltag|showmatch|showmode|showtabline|shq|si|sidescroll|sidescrolloff|siso|sj|slm|smartcase|smartindent|smarttab|smc|smd|softtabstop|sol|spc|spell|spellcapcheck|spellfile|spelllang|spellsuggest|spf|spl|splitbelow|splitright|sps|sr|srr|ss|ssl|ssop|stal|startofline|statusline|stl|stmp|su|sua|suffixes|suffixesadd|sw|swapfile|swapsync|swb|swf|switchbuf|sws|sxq|syn|synmaxcol|syntax|t_AB|t_AF|t_AL|t_CS|t_CV|t_Ce|t_Co|t_Cs|t_DL|t_EI|t_F1|t_F2|t_F3|t_F4|t_F5|t_F6|t_F7|t_F8|t_F9|t_IE|t_IS|t_K1|t_K3|t_K4|t_K5|t_K6|t_K7|t_K8|t_K9|t_KA|t_KB|t_KC|t_KD|t_KE|t_KF|t_KG|t_KH|t_KI|t_KJ|t_KK|t_KL|t_RI|t_RV|t_SI|t_Sb|t_Sf|t_WP|t_WS|t_ZH|t_ZR|t_al|t_bc|t_cd|t_ce|t_cl|t_cm|t_cs|t_da|t_db|t_dl|t_fs|t_k1|t_k2|t_k3|t_k4|t_k5|t_k6|t_k7|t_k8|t_k9|t_kB|t_kD|t_kI|t_kN|t_kP|t_kb|t_kd|t_ke|t_kh|t_kl|t_kr|t_ks|t_ku|t_le|t_mb|t_md|t_me|t_mr|t_ms|t_nd|t_op|t_se|t_so|t_sr|t_te|t_ti|t_ts|t_ue|t_us|t_ut|t_vb|t_ve|t_vi|t_vs|t_xs|tabline|tabpagemax|tabstop|tagbsearch|taglength|tagrelative|tagstack|tal|tb|tbi|tbidi|tbis|tbs|tenc|term|termbidi|termencoding|terse|textauto|textmode|textwidth|tgst|thesaurus|tildeop|timeout|timeoutlen|title|titlelen|titleold|titlestring|toolbar|toolbariconsize|top|tpm|tsl|tsr|ttimeout|ttimeoutlen|ttm|tty|ttybuiltin|ttyfast|ttym|ttymouse|ttyscroll|ttytype|tw|tx|uc|ul|undolevels|updatecount|updatetime|ut|vb|vbs|vdir|verbosefile|vfile|viewdir|viewoptions|viminfo|virtualedit|visualbell|vop|wak|warn|wb|wc|wcm|wd|weirdinvert|wfh|wfw|whichwrap|wi|wig|wildchar|wildcharm|wildignore|wildmenu|wildmode|wildoptions|wim|winaltkeys|window|winfixheight|winfixwidth|winheight|winminheight|winminwidth|winwidth|wiv|wiw|wm|wmh|wmnu|wmw|wop|wrap|wrapmargin|wrapscan|writeany|writebackup|writedelay|ww)\b/,
"number": /\b(?:0x[\da-f]+|\d+(?:\.\d+)?)\b/i,
"operator": /\|\||&&|[-+.]=?|[=!](?:[=~][#?]?)?|[<>]=?[#?]?|[*\/%?]|\b(?:is(?:not)?)\b/,
"punctuation": /[{}[\](),;:]/
};
Prism.languages["visual-basic"] = {
"comment": {
pattern: /(?:['‘’]|REM\b)(?:[^\r\n_]|_(?:\r\n?|\n)?)*/i,
inside: {
"keyword": /^REM/i
}
},
"directive": {
pattern: /#(?:Const|Else|ElseIf|End|ExternalChecksum|ExternalSource|If|Region)(?:\b_[ \t]*(?:\r\n?|\n)|.)+/i,
alias: "property",
greedy: true
},
"string": {
pattern: /\$?["“”](?:["“”]{2}|[^"“”])*["“”]C?/i,
greedy: true
},
"date": {
pattern: /#[ \t]*(?:\d+([/-])\d+\1\d+(?:[ \t]+(?:\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?))?|\d+[ \t]*(?:AM|PM)|\d+:\d+(?::\d+)?(?:[ \t]*(?:AM|PM))?)[ \t]*#/i,
alias: "number"
},
"number": /(?:(?:\b\d+(?:\.\d+)?|\.\d+)(?:E[+-]?\d+)?|&[HO][\dA-F]+)(?:[FRD]|U?[ILS])?/i,
"boolean": /\b(?:False|Nothing|True)\b/i,
"keyword": /\b(?:AddHandler|AddressOf|Alias|And(?:Also)?|As|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|C(?:Bool|Byte|Char|Date|Dbl|Dec|Int|Lng|Obj|SByte|Short|Sng|Str|Type|UInt|ULng|UShort)|Char|Class|Const|Continue|Currency|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else(?:If)?|End(?:If)?|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get(?:Type|XMLNamespace)?|Global|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|IsNot|Let|Lib|Like|Long|Loop|Me|Mod|Module|Must(?:Inherit|Override)|My(?:Base|Class)|Namespace|Narrowing|New|Next|Not(?:Inheritable|Overridable)?|Object|Of|On|Operator|Option(?:al)?|Or(?:Else)?|Out|Overloads|Overridable|Overrides|ParamArray|Partial|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|SByte|Select|Set|Shadows|Shared|short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TryCast|Type|TypeOf|U(?:Integer|Long|Short)|Until|Using|Variant|Wend|When|While|Widening|With(?:Events)?|WriteOnly|Xor)\b/i,
"operator": /[+\-*/\\^<=>&#@$%!]|\b_(?=[ \t]*[\r\n])/,
"punctuation": /[{}().,:?]/
};
Prism.languages.vb = Prism.languages["visual-basic"];
Prism.languages.vba = Prism.languages["visual-basic"];
Prism.languages.warpscript = {
"comment": /#.*|\/\/.*|\/\*[\s\S]*?\*\//,
"string": {
pattern: /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'|<'(?:[^\\']|'(?!>)|\\.)*'>/,
greedy: true
},
"variable": /\$\S+/,
"macro": {
pattern: /@\S+/,
alias: "property"
},
"keyword": /\b(?:BREAK|CHECKMACRO|CONTINUE|CUDF|DEFINED|DEFINEDMACRO|EVAL|FAIL|FOR|FOREACH|FORSTEP|IFT|IFTE|MSGFAIL|NRETURN|RETHROW|RETURN|SWITCH|TRY|UDF|UNTIL|WHILE)\b/,
"number": /[+-]?\b(?:NaN|Infinity|\d+(?:\.\d*)?(?:[Ee][+-]?\d+)?|0x[\da-fA-F]+|0b[01]+)\b/,
"boolean": /\b(?:F|T|false|true)\b/,
"punctuation": /<%|%>|[{}[\]()]/,
"operator": /==|&&?|\|\|?|\*\*?|>>>?|<<|[<>!~]=?|[-/%^]|\+!?|\b(?:AND|NOT|OR)\b/
};
Prism.languages.wasm = {
"comment": [
/\(;[\s\S]*?;\)/,
{
pattern: /;;.*/,
greedy: true
}
],
"string": {
pattern: /"(?:\\[\s\S]|[^"\\])*"/,
greedy: true
},
"keyword": [
{
pattern: /\b(?:align|offset)=/,
inside: {
"operator": /=/
}
},
{
pattern: /\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,
inside: {
"punctuation": /\./
}
},
/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/
],
"variable": /\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,
"number": /[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,
"punctuation": /[()]/
};
(function(Prism2) {
var id = /(?:\B-|\b_|\b)[A-Za-z][\w-]*(?![\w-])/.source;
var type = "(?:" + /\b(?:unsigned\s+)?long\s+long(?![\w-])/.source + "|" + /\b(?:unrestricted|unsigned)\s+[a-z]+(?![\w-])/.source + "|" + /(?!(?:unrestricted|unsigned)\b)/.source + id + /(?:\s*<(?:[^<>]|<[^<>]*>)*>)?/.source + ")" + /(?:\s*\?)?/.source;
var typeInside = {};
Prism2.languages["web-idl"] = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?\*\//,
greedy: true
},
"string": {
pattern: /"[^"]*"/,
greedy: true
},
"namespace": {
pattern: RegExp(/(\bnamespace\s+)/.source + id),
lookbehind: true
},
"class-name": [
{
pattern: /(^|[^\w-])(?:iterable|maplike|setlike)\s*<(?:[^<>]|<[^<>]*>)*>/,
lookbehind: true,
inside: typeInside
},
{
pattern: RegExp(/(\b(?:attribute|const|deleter|getter|optional|setter)\s+)/.source + type),
lookbehind: true,
inside: typeInside
},
{
pattern: RegExp("(" + /\bcallback\s+/.source + id + /\s*=\s*/.source + ")" + type),
lookbehind: true,
inside: typeInside
},
{
pattern: RegExp(/(\btypedef\b\s*)/.source + type),
lookbehind: true,
inside: typeInside
},
{
pattern: RegExp(/(\b(?:callback|dictionary|enum|interface(?:\s+mixin)?)\s+)(?!(?:interface|mixin)\b)/.source + id),
lookbehind: true
},
{
pattern: RegExp(/(:\s*)/.source + id),
lookbehind: true
},
RegExp(id + /(?=\s+(?:implements|includes)\b)/.source),
{
pattern: RegExp(/(\b(?:implements|includes)\s+)/.source + id),
lookbehind: true
},
{
pattern: RegExp(type + "(?=" + /\s*(?:\.{3}\s*)?/.source + id + /\s*[(),;=]/.source + ")"),
inside: typeInside
}
],
"builtin": /\b(?:ArrayBuffer|BigInt64Array|BigUint64Array|ByteString|DOMString|DataView|Float32Array|Float64Array|FrozenArray|Int16Array|Int32Array|Int8Array|ObservableArray|Promise|USVString|Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray)\b/,
"keyword": [
/\b(?:async|attribute|callback|const|constructor|deleter|dictionary|enum|getter|implements|includes|inherit|interface|mixin|namespace|null|optional|or|partial|readonly|required|setter|static|stringifier|typedef|unrestricted)\b/,
/\b(?:any|bigint|boolean|byte|double|float|iterable|long|maplike|object|octet|record|sequence|setlike|short|symbol|undefined|unsigned|void)\b/
],
"boolean": /\b(?:false|true)\b/,
"number": {
pattern: /(^|[^\w-])-?(?:0x[0-9a-f]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|NaN|Infinity)(?![\w-])/i,
lookbehind: true
},
"operator": /\.{3}|[=:?<>-]/,
"punctuation": /[(){}[\].,;]/
};
for (var key in Prism2.languages["web-idl"]) {
if (key !== "class-name") {
typeInside[key] = Prism2.languages["web-idl"][key];
}
}
Prism2.languages["webidl"] = Prism2.languages["web-idl"];
})(Prism);
Prism.languages.wgsl = {
"comment": {
pattern: /\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,
greedy: true
},
"builtin-attribute": {
pattern: /(@)builtin\(.*?\)/,
lookbehind: true,
inside: {
"attribute": {
pattern: /^builtin/,
alias: "attr-name"
},
"punctuation": /[(),]/,
"built-in-values": {
pattern: /\b(?:frag_depth|front_facing|global_invocation_id|instance_index|local_invocation_id|local_invocation_index|num_workgroups|position|sample_index|sample_mask|vertex_index|workgroup_id)\b/,
alias: "attr-value"
}
}
},
"attributes": {
pattern: /(@)(?:align|binding|compute|const|fragment|group|id|interpolate|invariant|location|size|vertex|workgroup_size)/i,
lookbehind: true,
alias: "attr-name"
},
"functions": {
pattern: /\b(fn\s+)[_a-zA-Z]\w*(?=[(<])/,
lookbehind: true,
alias: "function"
},
"keyword": /\b(?:bitcast|break|case|const|continue|continuing|default|discard|else|enable|fallthrough|fn|for|function|if|let|loop|private|return|storage|struct|switch|type|uniform|var|while|workgroup)\b/,
"builtin": /\b(?:abs|acos|acosh|all|any|array|asin|asinh|atan|atan2|atanh|atomic|atomicAdd|atomicAnd|atomicCompareExchangeWeak|atomicExchange|atomicLoad|atomicMax|atomicMin|atomicOr|atomicStore|atomicSub|atomicXor|bool|ceil|clamp|cos|cosh|countLeadingZeros|countOneBits|countTrailingZeros|cross|degrees|determinant|distance|dot|dpdx|dpdxCoarse|dpdxFine|dpdy|dpdyCoarse|dpdyFine|exp|exp2|extractBits|f32|f64|faceForward|firstLeadingBit|floor|fma|fract|frexp|fwidth|fwidthCoarse|fwidthFine|i32|i64|insertBits|inverseSqrt|ldexp|length|log|log2|mat[2-4]x[2-4]|max|min|mix|modf|normalize|override|pack2x16float|pack2x16snorm|pack2x16unorm|pack4x8snorm|pack4x8unorm|pow|ptr|quantizeToF16|radians|reflect|refract|reverseBits|round|sampler|sampler_comparison|select|shiftLeft|shiftRight|sign|sin|sinh|smoothstep|sqrt|staticAssert|step|storageBarrier|tan|tanh|textureDimensions|textureGather|textureGatherCompare|textureLoad|textureNumLayers|textureNumLevels|textureNumSamples|textureSample|textureSampleBias|textureSampleCompare|textureSampleCompareLevel|textureSampleGrad|textureSampleLevel|textureStore|texture_1d|texture_2d|texture_2d_array|texture_3d|texture_cube|texture_cube_array|texture_depth_2d|texture_depth_2d_array|texture_depth_cube|texture_depth_cube_array|texture_depth_multisampled_2d|texture_multisampled_2d|texture_storage_1d|texture_storage_2d|texture_storage_2d_array|texture_storage_3d|transpose|trunc|u32|u64|unpack2x16float|unpack2x16snorm|unpack2x16unorm|unpack4x8snorm|unpack4x8unorm|vec[2-4]|workgroupBarrier)\b/,
"function-calls": {
pattern: /\b[_a-z]\w*(?=\()/i,
alias: "function"
},
"class-name": /\b(?:[A-Z][A-Za-z0-9]*)\b/,
"bool-literal": {
pattern: /\b(?:false|true)\b/,
alias: "boolean"
},
"hex-int-literal": {
pattern: /\b0[xX][0-9a-fA-F]+[iu]?\b(?![.pP])/,
alias: "number"
},
"hex-float-literal": {
pattern: /\b0[xX][0-9a-fA-F]*(?:\.[0-9a-fA-F]*)?(?:[pP][+-]?\d+[fh]?)?/,
alias: "number"
},
"decimal-float-literal": [
{ pattern: /\d*\.\d+(?:[eE](?:\+|-)?\d+)?[fh]?/, alias: "number" },
{ pattern: /\d+\.\d*(?:[eE](?:\+|-)?\d+)?[fh]?/, alias: "number" },
{ pattern: /\d+[eE](?:\+|-)?\d+[fh]?/, alias: "number" },
{ pattern: /\b\d+[fh]\b/, alias: "number" }
],
"int-literal": {
pattern: /\b\d+[iu]?\b/,
alias: "number"
},
"operator": [
{ pattern: /(?:\^|~|\|(?!\|)|\|\||&&|<<|>>|!)(?!=)/ },
{ pattern: /&(?![&=])/ },
{ pattern: /(?:\+=|-=|\*=|\/=|%=|\^=|&=|\|=|<<=|>>=)/ },
{ pattern: /(^|[^<>=!])=(?![=>])/, lookbehind: true },
{ pattern: /(?:==|!=|<=|\+\+|--|(^|[^=])>=)/, lookbehind: true },
{ pattern: /(?:(?:[+%]|(?:\*(?!\w)))(?!=))|(?:-(?!>))|(?:\/(?!\/))/ },
{ pattern: /->/ }
],
"punctuation": /[@(){}[\],;<>:.]/
};
Prism.languages.wiki = Prism.languages.extend("markup", {
"block-comment": {
pattern: /(^|[^\\])\/\*[\s\S]*?\*\//,
lookbehind: true,
alias: "comment"
},
"heading": {
pattern: /^(=+)[^=\r\n].*?\1/m,
inside: {
"punctuation": /^=+|=+$/,
"important": /.+/
}
},
"emphasis": {
pattern: /('{2,5}).+?\1/,
inside: {
"bold-italic": {
pattern: /(''''').+?(?=\1)/,
lookbehind: true,
alias: ["bold", "italic"]
},
"bold": {
pattern: /(''')[^'](?:.*?[^'])?(?=\1)/,
lookbehind: true
},
"italic": {
pattern: /('')[^'](?:.*?[^'])?(?=\1)/,
lookbehind: true
},
"punctuation": /^''+|''+$/
}
},
"hr": {
pattern: /^-{4,}/m,
alias: "punctuation"
},
"url": [
/ISBN +(?:97[89][ -]?)?(?:\d[ -]?){9}[\dx]\b|(?:PMID|RFC) +\d+/i,
/\[\[.+?\]\]|\[.+?\]/
],
"variable": [
/__[A-Z]+__/,
/\{{3}.+?\}{3}/,
/\{\{.+?\}\}/
],
"symbol": [
/^#redirect/im,
/~{3,5}/
],
"table-tag": {
pattern: /((?:^|[|!])[|!])[^|\r\n]+\|(?!\|)/m,
lookbehind: true,
inside: {
"table-bar": {
pattern: /\|$/,
alias: "punctuation"
},
rest: Prism.languages.markup["tag"].inside
}
},
"punctuation": /^(?:\{\||\|\}|\|-|[*#:;!|])|\|\||!!/m
});
Prism.languages.insertBefore("wiki", "tag", {
"nowiki": {
pattern: /<(nowiki|pre|source)\b[^>]*>[\s\S]*?<\/\1>/i,
inside: {
"tag": {
pattern: /<(?:nowiki|pre|source)\b[^>]*>|<\/(?:nowiki|pre|source)>/i,
inside: Prism.languages.markup["tag"].inside
}
}
}
});
Prism.languages.wolfram = {
"comment": /\(\*(?:\(\*(?:[^*]|\*(?!\)))*\*\)|(?!\(\*)[\s\S])*?\*\)/,
"string": {
pattern: /"(?:\\.|[^"\\\r\n])*"/,
greedy: true
},
"keyword": /\b(?:Abs|AbsArg|Accuracy|Block|Do|For|Function|If|Manipulate|Module|Nest|NestList|None|Return|Switch|Table|Which|While)\b/,
"context": {
pattern: /\b\w+`+\w*/,
alias: "class-name"
},
"blank": {
pattern: /\b\w+_\b/,
alias: "regex"
},
"global-variable": {
pattern: /\$\w+/,
alias: "variable"
},
"boolean": /\b(?:False|True)\b/,
"number": /(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,
"operator": /\/\.|;|=\.|\^=|\^:=|:=|<<|>>|<\||\|>|:>|\|->|->|<-|@@@|@@|@|\/@|=!=|===|==|=|\+|-|\[\/-+%=\]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,
"punctuation": /[{}[\];(),.:]/
};
Prism.languages.mathematica = Prism.languages.wolfram;
Prism.languages.wl = Prism.languages.wolfram;
Prism.languages.nb = Prism.languages.wolfram;
Prism.languages.wren = {
"comment": [
{
pattern: /\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|\/\*(?:[^*/]|\*(?!\/)|\/(?!\*))*\*\/)*\*\/)*\*\//,
greedy: true
},
{
pattern: /(^|[^\\:])\/\/.*/,
lookbehind: true,
greedy: true
}
],
"triple-quoted-string": {
pattern: /"""[\s\S]*?"""/,
greedy: true,
alias: "string"
},
"string-literal": null,
"hashbang": {
pattern: /^#!\/.+/,
greedy: true,
alias: "comment"
},
"attribute": {
pattern: /#!?[ \t\u3000]*\w+/,
alias: "keyword"
},
"class-name": [
{
pattern: /(\bclass\s+)\w+/,
lookbehind: true
},
/\b[A-Z][a-z\d_]*\b/
],
"constant": /\b[A-Z][A-Z\d_]*\b/,
"null": {
pattern: /\bnull\b/,
alias: "keyword"
},
"keyword": /\b(?:as|break|class|construct|continue|else|for|foreign|if|import|in|is|return|static|super|this|var|while)\b/,
"boolean": /\b(?:false|true)\b/,
"number": /\b(?:0x[\da-f]+|\d+(?:\.\d+)?(?:e[+-]?\d+)?)\b/i,
"function": /\b[a-z_]\w*(?=\s*[({])/i,
"operator": /<<|>>|[=!<>]=?|&&|\|\||[-+*/%~^&|?:]|\.{2,3}/,
"punctuation": /[\[\](){}.,;]/
};
Prism.languages.wren["string-literal"] = {
pattern: /(^|[^\\"])"(?:[^\\"%]|\\[\s\S]|%(?!\()|%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\))*"/,
lookbehind: true,
greedy: true,
inside: {
"interpolation": {
pattern: /((?:^|[^\\])(?:\\{2})*)%\((?:[^()]|\((?:[^()]|\([^)]*\))*\))*\)/,
lookbehind: true,
inside: {
"expression": {
pattern: /^(%\()[\s\S]+(?=\)$)/,
lookbehind: true,
inside: Prism.languages.wren
},
"interpolation-punctuation": {
pattern: /^%\(|\)$/,
alias: "punctuation"
}
}
},
"string": /[\s\S]+/
}
};
(function(Prism2) {
Prism2.languages.xeora = Prism2.languages.extend("markup", {
"constant": {
pattern: /\$(?:DomainContents|PageRenderDuration)\$/,
inside: {
"punctuation": {
pattern: /\$/
}
}
},
"variable": {
pattern: /\$@?(?:#+|[-+*~=^])?[\w.]+\$/,
inside: {
"punctuation": {
pattern: /[$.]/
},
"operator": {
pattern: /#+|[-+*~=^@]/
}
}
},
"function-inline": {
pattern: /\$F:[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\$/,
inside: {
"variable": {
pattern: /(?:[,|])@?(?:#+|[-+*~=^])?[\w.]+/,
inside: {
"punctuation": {
pattern: /[,.|]/
},
"operator": {
pattern: /#+|[-+*~=^@]/
}
}
},
"punctuation": {
pattern: /\$\w:|[$:?.,|]/
}
},
alias: "function"
},
"function-block": {
pattern: /\$XF:\{[-\w.]+\?[-\w.]+(?:,(?:(?:@[-#]*\w+\.[\w+.]\.*)*\|)*(?:(?:[\w+]|[-#*.~^]+[\w+]|=\S)(?:[^$=]|=+[^=])*=*|(?:@[-#]*\w+\.[\w+.]\.*)+(?:(?:[\w+]|[-#*~^][-#*.~^]*[\w+]|=\S)(?:[^$=]|=+[^=])*=*)?)?)?\}:XF\$/,
inside: {
"punctuation": {
pattern: /[$:{}?.,|]/
}
},
alias: "function"
},
"directive-inline": {
pattern: /\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\/\w.]+\$/,
inside: {
"punctuation": {
pattern: /\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,
inside: {
"tag": {
pattern: /#\d/
}
}
}
},
alias: "function"
},
"directive-block-open": {
pattern: /\$\w+:\{|\$\w(?:#\d+\+?)?(?:\[[-\w.]+\])?:[-\w.]+:\{(?:![A-Z]+)?/,
inside: {
"punctuation": {
pattern: /\$(?:\w:|C(?:\[|#\d))?|[:{[\]]/,
inside: {
"tag": {
pattern: /#\d/
}
}
},
"attribute": {
pattern: /![A-Z]+$/,
inside: {
"punctuation": {
pattern: /!/
}
},
alias: "keyword"
}
},
alias: "function"
},
"directive-block-separator": {
pattern: /\}:[-\w.]+:\{/,
inside: {
"punctuation": {
pattern: /[:{}]/
}
},
alias: "function"
},
"directive-block-close": {
pattern: /\}:[-\w.]+\$/,
inside: {
"punctuation": {
pattern: /[:{}$]/
}
},
alias: "function"
}
});
Prism2.languages.insertBefore("inside", "punctuation", {
"variable": Prism2.languages.xeora["function-inline"].inside["variable"]
}, Prism2.languages.xeora["function-block"]);
Prism2.languages.xeoracube = Prism2.languages.xeora;
})(Prism);
(function(Prism2) {
function insertDocComment(lang, docComment) {
if (Prism2.languages[lang]) {
Prism2.languages.insertBefore(lang, "comment", {
"doc-comment": docComment
});
}
}
var tag = Prism2.languages.markup.tag;
var slashDocComment = {
pattern: /\/\/\/.*/,
greedy: true,
alias: "comment",
inside: {
"tag": tag
}
};
var tickDocComment = {
pattern: /'''.*/,
greedy: true,
alias: "comment",
inside: {
"tag": tag
}
};
insertDocComment("csharp", slashDocComment);
insertDocComment("fsharp", slashDocComment);
insertDocComment("vbnet", tickDocComment);
})(Prism);
Prism.languages.xojo = {
"comment": {
pattern: /(?:'|\/\/|Rem\b).+/i,
greedy: true
},
"string": {
pattern: /"(?:""|[^"])*"/,
greedy: true
},
"number": [
/(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:E[+-]?\d+)?/i,
/&[bchou][a-z\d]+/i
],
"directive": {
pattern: /#(?:Else|ElseIf|Endif|If|Pragma)\b/i,
alias: "property"
},
"keyword": /\b(?:AddHandler|App|Array|As(?:signs)?|Auto|Boolean|Break|By(?:Ref|Val)|Byte|Call|Case|Catch|CFStringRef|CGFloat|Class|Color|Const|Continue|CString|Currency|CurrentMethodName|Declare|Delegate|Dim|Do(?:uble|wnTo)?|Each|Else(?:If)?|End|Enumeration|Event|Exception|Exit|Extends|False|Finally|For|Function|Get|GetTypeInfo|Global|GOTO|If|Implements|In|Inherits|Int(?:8|16|32|64|eger|erface)?|Lib|Loop|Me|Module|Next|Nil|Object|Optional|OSType|ParamArray|Private|Property|Protected|PString|Ptr|Raise(?:Event)?|ReDim|RemoveHandler|Return|Select(?:or)?|Self|Set|Shared|Short|Single|Soft|Static|Step|String|Sub|Super|Text|Then|To|True|Try|Ubound|UInt(?:8|16|32|64|eger)?|Until|Using|Var(?:iant)?|Wend|While|WindowPtr|WString)\b/i,
"operator": /<[=>]?|>=?|[+\-*\/\\^=]|\b(?:AddressOf|And|Ctype|IsA?|Mod|New|Not|Or|WeakAddressOf|Xor)\b/i,
"punctuation": /[.,;:()]/
};
(function(Prism2) {
Prism2.languages.xquery = Prism2.languages.extend("markup", {
"xquery-comment": {
pattern: /\(:[\s\S]*?:\)/,
greedy: true,
alias: "comment"
},
"string": {
pattern: /(["'])(?:\1\1|(?!\1)[\s\S])*\1/,
greedy: true
},
"extension": {
pattern: /\(#.+?#\)/,
alias: "symbol"
},
"variable": /\$[-\w:]+/,
"axis": {
pattern: /(^|[^-])(?:ancestor(?:-or-self)?|attribute|child|descendant(?:-or-self)?|following(?:-sibling)?|parent|preceding(?:-sibling)?|self)(?=::)/,
lookbehind: true,
alias: "operator"
},
"keyword-operator": {
pattern: /(^|[^:-])\b(?:and|castable as|div|eq|except|ge|gt|idiv|instance of|intersect|is|le|lt|mod|ne|or|union)\b(?=$|[^:-])/,
lookbehind: true,
alias: "operator"
},
"keyword": {
pattern: /(^|[^:-])\b(?:as|ascending|at|base-uri|boundary-space|case|cast as|collation|construction|copy-namespaces|declare|default|descending|else|empty (?:greatest|least)|encoding|every|external|for|function|if|import|in|inherit|lax|let|map|module|namespace|no-inherit|no-preserve|option|order(?: by|ed|ing)?|preserve|return|satisfies|schema|some|stable|strict|strip|then|to|treat as|typeswitch|unordered|validate|variable|version|where|xquery)\b(?=$|[^:-])/,
lookbehind: true
},
"function": /[\w-]+(?::[\w-]+)*(?=\s*\()/,
"xquery-element": {
pattern: /(element\s+)[\w-]+(?::[\w-]+)*/,
lookbehind: true,
alias: "tag"
},
"xquery-attribute": {
pattern: /(attribute\s+)[\w-]+(?::[\w-]+)*/,
lookbehind: true,
alias: "attr-name"
},
"builtin": {
pattern: /(^|[^:-])\b(?:attribute|comment|document|element|processing-instruction|text|xs:(?:ENTITIES|ENTITY|ID|IDREFS?|NCName|NMTOKENS?|NOTATION|Name|QName|anyAtomicType|anyType|anyURI|base64Binary|boolean|byte|date|dateTime|dayTimeDuration|decimal|double|duration|float|gDay|gMonth|gMonthDay|gYear|gYearMonth|hexBinary|int|integer|language|long|negativeInteger|nonNegativeInteger|nonPositiveInteger|normalizedString|positiveInteger|short|string|time|token|unsigned(?:Byte|Int|Long|Short)|untyped(?:Atomic)?|yearMonthDuration))\b(?=$|[^:-])/,
lookbehind: true
},
"number": /\b\d+(?:\.\d+)?(?:E[+-]?\d+)?/,
"operator": [
/[+*=?|@]|\.\.?|:=|!=|<[=<]?|>[=>]?/,
{
pattern: /(\s)-(?=\s)/,
lookbehind: true
}
],
"punctuation": /[[\](){},;:/]/
});
Prism2.languages.xquery.tag.pattern = /<\/?(?!\d)[^\s>\/=$<%]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+))?)*\s*\/?>/;
Prism2.languages.xquery["tag"].inside["attr-value"].pattern = /=(?:("|')(?:\\[\s\S]|\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}|(?!\1)[^\\])*\1|[^\s'">=]+)/;
Prism2.languages.xquery["tag"].inside["attr-value"].inside["punctuation"] = /^="|"$/;
Prism2.languages.xquery["tag"].inside["attr-value"].inside["expression"] = {
pattern: /\{(?!\{)(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}/,
inside: Prism2.languages.xquery,
alias: "language-xquery"
};
var stringifyToken = function(token) {
if (typeof token === "string") {
return token;
}
if (typeof token.content === "string") {
return token.content;
}
return token.content.map(stringifyToken).join("");
};
var walkTokens = function(tokens) {
var openedTags = [];
for (var i = 0; i < tokens.length; i++) {
var token = tokens[i];
var notTagNorBrace = false;
if (typeof token !== "string") {
if (token.type === "tag" && token.content[0] && token.content[0].type === "tag") {
if (token.content[0].content[0].content === "</") {
if (openedTags.length > 0 && openedTags[openedTags.length - 1].tagName === stringifyToken(token.content[0].content[1])) {
openedTags.pop();
}
} else {
if (token.content[token.content.length - 1].content === "/>") {
} else {
openedTags.push({
tagName: stringifyToken(token.content[0].content[1]),
openedBraces: 0
});
}
}
} else if (openedTags.length > 0 && token.type === "punctuation" && token.content === "{" && (!tokens[i + 1] || tokens[i + 1].type !== "punctuation" || tokens[i + 1].content !== "{") && (!tokens[i - 1] || tokens[i - 1].type !== "plain-text" || tokens[i - 1].content !== "{")) {
openedTags[openedTags.length - 1].openedBraces++;
} else if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces > 0 && token.type === "punctuation" && token.content === "}") {
openedTags[openedTags.length - 1].openedBraces--;
} else if (token.type !== "comment") {
notTagNorBrace = true;
}
}
if (notTagNorBrace || typeof token === "string") {
if (openedTags.length > 0 && openedTags[openedTags.length - 1].openedBraces === 0) {
var plainText = stringifyToken(token);
if (i < tokens.length - 1 && (typeof tokens[i + 1] === "string" || tokens[i + 1].type === "plain-text")) {
plainText += stringifyToken(tokens[i + 1]);
tokens.splice(i + 1, 1);
}
if (i > 0 && (typeof tokens[i - 1] === "string" || tokens[i - 1].type === "plain-text")) {
plainText = stringifyToken(tokens[i - 1]) + plainText;
tokens.splice(i - 1, 1);
i--;
}
if (/^\s+$/.test(plainText)) {
tokens[i] = plainText;
} else {
tokens[i] = new Prism2.Token("plain-text", plainText, null, plainText);
}
}
}
if (token.content && typeof token.content !== "string") {
walkTokens(token.content);
}
}
};
Prism2.hooks.add("after-tokenize", function(env) {
if (env.language !== "xquery") {
return;
}
walkTokens(env.tokens);
});
})(Prism);
Prism.languages.yang = {
"comment": /\/\*[\s\S]*?\*\/|\/\/.*/,
"string": {
pattern: /"(?:[^\\"]|\\.)*"|'[^']*'/,
greedy: true
},
"keyword": {
pattern: /(^|[{};\r\n][ \t]*)[a-z_][\w.-]*/i,
lookbehind: true
},
"namespace": {
pattern: /(\s)[a-z_][\w.-]*(?=:)/i,
lookbehind: true
},
"boolean": /\b(?:false|true)\b/,
"operator": /\+/,
"punctuation": /[{};:]/
};
(function(Prism2) {
function literal(str) {
return function() {
return str;
};
}
var keyword = /\b(?:align|allowzero|and|anyframe|anytype|asm|async|await|break|cancel|catch|comptime|const|continue|defer|else|enum|errdefer|error|export|extern|fn|for|if|inline|linksection|nakedcc|noalias|nosuspend|null|or|orelse|packed|promise|pub|resume|return|stdcallcc|struct|suspend|switch|test|threadlocal|try|undefined|union|unreachable|usingnamespace|var|volatile|while)\b/;
var IDENTIFIER = "\\b(?!" + keyword.source + ")(?!\\d)\\w+\\b";
var ALIGN = /align\s*\((?:[^()]|\([^()]*\))*\)/.source;
var PREFIX_TYPE_OP = /(?:\?|\bpromise->|(?:\[[^[\]]*\]|\*(?!\*)|\*\*)(?:\s*<ALIGN>|\s*const\b|\s*volatile\b|\s*allowzero\b)*)/.source.replace(/<ALIGN>/g, literal(ALIGN));
var SUFFIX_EXPR = /(?:\bpromise\b|(?:\berror\.)?<ID>(?:\.<ID>)*(?!\s+<ID>))/.source.replace(/<ID>/g, literal(IDENTIFIER));
var TYPE = "(?!\\s)(?:!?\\s*(?:" + PREFIX_TYPE_OP + "\\s*)*" + SUFFIX_EXPR + ")+";
Prism2.languages.zig = {
"comment": [
{
pattern: /\/\/[/!].*/,
alias: "doc-comment"
},
/\/{2}.*/
],
"string": [
{
pattern: /(^|[^\\@])c?"(?:[^"\\\r\n]|\\.)*"/,
lookbehind: true,
greedy: true
},
{
pattern: /([\r\n])([ \t]+c?\\{2}).*(?:(?:\r\n?|\n)\2.*)*/,
lookbehind: true,
greedy: true
}
],
"char": {
pattern: /(^|[^\\])'(?:[^'\\\r\n]|[\uD800-\uDFFF]{2}|\\(?:.|x[a-fA-F\d]{2}|u\{[a-fA-F\d]{1,6}\}))'/,
lookbehind: true,
greedy: true
},
"builtin": /\B@(?!\d)\w+(?=\s*\()/,
"label": {
pattern: /(\b(?:break|continue)\s*:\s*)\w+\b|\b(?!\d)\w+\b(?=\s*:\s*(?:\{|while\b))/,
lookbehind: true
},
"class-name": [
/\b(?!\d)\w+(?=\s*=\s*(?:(?:extern|packed)\s+)?(?:enum|struct|union)\s*[({])/,
{
pattern: RegExp(/(:\s*)<TYPE>(?=\s*(?:<ALIGN>\s*)?[=;,)])|<TYPE>(?=\s*(?:<ALIGN>\s*)?\{)/.source.replace(/<TYPE>/g, literal(TYPE)).replace(/<ALIGN>/g, literal(ALIGN))),
lookbehind: true,
inside: null
},
{
pattern: RegExp(/(\)\s*)<TYPE>(?=\s*(?:<ALIGN>\s*)?;)/.source.replace(/<TYPE>/g, literal(TYPE)).replace(/<ALIGN>/g, literal(ALIGN))),
lookbehind: true,
inside: null
}
],
"builtin-type": {
pattern: /\b(?:anyerror|bool|c_u?(?:int|long|longlong|short)|c_longdouble|c_void|comptime_(?:float|int)|f(?:16|32|64|128)|[iu](?:8|16|32|64|128|size)|noreturn|type|void)\b/,
alias: "keyword"
},
"keyword": keyword,
"function": /\b(?!\d)\w+(?=\s*\()/,
"number": /\b(?:0b[01]+|0o[0-7]+|0x[a-fA-F\d]+(?:\.[a-fA-F\d]*)?(?:[pP][+-]?[a-fA-F\d]+)?|\d+(?:\.\d*)?(?:[eE][+-]?\d+)?)\b/,
"boolean": /\b(?:false|true)\b/,
"operator": /\.[*?]|\.{2,3}|[-=]>|\*\*|\+\+|\|\||(?:<<|>>|[-+*]%|[-+*/%^&|<>!=])=?|[?~]/,
"punctuation": /[.:,;(){}[\]]/
};
Prism2.languages.zig["class-name"].forEach(function(obj) {
if (obj.inside === null) {
obj.inside = Prism2.languages.zig;
}
});
})(Prism);
(function() {
if (typeof Prism === "undefined" || typeof document === "undefined") {
return;
}
var PLUGIN_NAME = "line-numbers";
var NEW_LINE_EXP = /\n(?!$)/g;
var config = Prism.plugins.lineNumbers = {
getLine: function(element, number) {
if (element.tagName !== "PRE" || !element.classList.contains(PLUGIN_NAME)) {
return;
}
var lineNumberRows = element.querySelector(".line-numbers-rows");
if (!lineNumberRows) {
return;
}
var lineNumberStart = parseInt(element.getAttribute("data-start"), 10) || 1;
var lineNumberEnd = lineNumberStart + (lineNumberRows.children.length - 1);
if (number < lineNumberStart) {
number = lineNumberStart;
}
if (number > lineNumberEnd) {
number = lineNumberEnd;
}
var lineIndex = number - lineNumberStart;
return lineNumberRows.children[lineIndex];
},
resize: function(element) {
resizeElements([element]);
},
assumeViewportIndependence: true
};
function resizeElements(elements) {
elements = elements.filter(function(e) {
var codeStyles = getStyles(e);
var whiteSpace = codeStyles["white-space"];
return whiteSpace === "pre-wrap" || whiteSpace === "pre-line";
});
if (elements.length == 0) {
return;
}
var infos = elements.map(function(element) {
var codeElement = element.querySelector("code");
var lineNumbersWrapper = element.querySelector(".line-numbers-rows");
if (!codeElement || !lineNumbersWrapper) {
return void 0;
}
var lineNumberSizer = element.querySelector(".line-numbers-sizer");
var codeLines = codeElement.textContent.split(NEW_LINE_EXP);
if (!lineNumberSizer) {
lineNumberSizer = document.createElement("span");
lineNumberSizer.className = "line-numbers-sizer";
codeElement.appendChild(lineNumberSizer);
}
lineNumberSizer.innerHTML = "0";
lineNumberSizer.style.display = "block";
var oneLinerHeight = lineNumberSizer.getBoundingClientRect().height;
lineNumberSizer.innerHTML = "";
return {
element,
lines: codeLines,
lineHeights: [],
oneLinerHeight,
sizer: lineNumberSizer
};
}).filter(Boolean);
infos.forEach(function(info) {
var lineNumberSizer = info.sizer;
var lines = info.lines;
var lineHeights = info.lineHeights;
var oneLinerHeight = info.oneLinerHeight;
lineHeights[lines.length - 1] = void 0;
lines.forEach(function(line, index) {
if (line && line.length > 1) {
var e = lineNumberSizer.appendChild(document.createElement("span"));
e.style.display = "block";
e.textContent = line;
} else {
lineHeights[index] = oneLinerHeight;
}
});
});
infos.forEach(function(info) {
var lineNumberSizer = info.sizer;
var lineHeights = info.lineHeights;
var childIndex = 0;
for (var i = 0; i < lineHeights.length; i++) {
if (lineHeights[i] === void 0) {
lineHeights[i] = lineNumberSizer.children[childIndex++].getBoundingClientRect().height;
}
}
});
infos.forEach(function(info) {
var lineNumberSizer = info.sizer;
var wrapper = info.element.querySelector(".line-numbers-rows");
lineNumberSizer.style.display = "none";
lineNumberSizer.innerHTML = "";
info.lineHeights.forEach(function(height, lineNumber) {
wrapper.children[lineNumber].style.height = height + "px";
});
});
}
function getStyles(element) {
if (!element) {
return null;
}
return window.getComputedStyle ? getComputedStyle(element) : element.currentStyle || null;
}
var lastWidth = void 0;
window.addEventListener("resize", function() {
if (config.assumeViewportIndependence && lastWidth === window.innerWidth) {
return;
}
lastWidth = window.innerWidth;
resizeElements(Array.prototype.slice.call(document.querySelectorAll("pre." + PLUGIN_NAME)));
});
Prism.hooks.add("complete", function(env) {
if (!env.code) {
return;
}
var code = env.element;
var pre = code.parentNode;
if (!pre || !/pre/i.test(pre.nodeName)) {
return;
}
if (code.querySelector(".line-numbers-rows")) {
return;
}
if (!Prism.util.isActive(code, PLUGIN_NAME)) {
return;
}
code.classList.remove(PLUGIN_NAME);
pre.classList.add(PLUGIN_NAME);
var match = env.code.match(NEW_LINE_EXP);
var linesNum = match ? match.length + 1 : 1;
var lineNumbersWrapper;
var lines = new Array(linesNum + 1).join("<span></span>");
lineNumbersWrapper = document.createElement("span");
lineNumbersWrapper.setAttribute("aria-hidden", "true");
lineNumbersWrapper.className = "line-numbers-rows";
lineNumbersWrapper.innerHTML = lines;
if (pre.hasAttribute("data-start")) {
pre.style.counterReset = "linenumber " + (parseInt(pre.getAttribute("data-start"), 10) - 1);
}
env.element.appendChild(lineNumbersWrapper);
resizeElements([pre]);
Prism.hooks.run("line-numbers", env);
});
Prism.hooks.add("line-numbers", function(env) {
env.plugins = env.plugins || {};
env.plugins.lineNumbers = true;
});
})();
(function() {
if (typeof Prism === "undefined" || typeof document === "undefined") {
return;
}
if (!Element.prototype.matches) {
Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
}
var LOADING_MESSAGE = "Loading\u2026";
var FAILURE_MESSAGE = function(status, message) {
return "\u2716 Error " + status + " while fetching file: " + message;
};
var FAILURE_EMPTY_MESSAGE = "\u2716 Error: File does not exist or is empty";
var EXTENSIONS = {
"js": "javascript",
"py": "python",
"rb": "ruby",
"ps1": "powershell",
"psm1": "powershell",
"sh": "bash",
"bat": "batch",
"h": "c",
"tex": "latex"
};
var STATUS_ATTR = "data-src-status";
var STATUS_LOADING = "loading";
var STATUS_LOADED = "loaded";
var STATUS_FAILED = "failed";
var SELECTOR = "pre[data-src]:not([" + STATUS_ATTR + '="' + STATUS_LOADED + '"]):not([' + STATUS_ATTR + '="' + STATUS_LOADING + '"])';
function loadFile(src, success, error) {
var xhr = new XMLHttpRequest();
xhr.open("GET", src, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status < 400 && xhr.responseText) {
success(xhr.responseText);
} else {
if (xhr.status >= 400) {
error(FAILURE_MESSAGE(xhr.status, xhr.statusText));
} else {
error(FAILURE_EMPTY_MESSAGE);
}
}
}
};
xhr.send(null);
}
function parseRange(range2) {
var m = /^\s*(\d+)\s*(?:(,)\s*(?:(\d+)\s*)?)?$/.exec(range2 || "");
if (m) {
var start2 = Number(m[1]);
var comma = m[2];
var end2 = m[3];
if (!comma) {
return [start2, start2];
}
if (!end2) {
return [start2, void 0];
}
return [start2, Number(end2)];
}
return void 0;
}
Prism.hooks.add("before-highlightall", function(env) {
env.selector += ", " + SELECTOR;
});
Prism.hooks.add("before-sanity-check", function(env) {
var pre = env.element;
if (pre.matches(SELECTOR)) {
env.code = "";
pre.setAttribute(STATUS_ATTR, STATUS_LOADING);
var code = pre.appendChild(document.createElement("CODE"));
code.textContent = LOADING_MESSAGE;
var src = pre.getAttribute("data-src");
var language = env.language;
if (language === "none") {
var extension = (/\.(\w+)$/.exec(src) || [, "none"])[1];
language = EXTENSIONS[extension] || extension;
}
Prism.util.setLanguage(code, language);
Prism.util.setLanguage(pre, language);
var autoloader = Prism.plugins.autoloader;
if (autoloader) {
autoloader.loadLanguages(language);
}
loadFile(
src,
function(text) {
pre.setAttribute(STATUS_ATTR, STATUS_LOADED);
var range2 = parseRange(pre.getAttribute("data-range"));
if (range2) {
var lines = text.split(/\r\n?|\n/g);
var start2 = range2[0];
var end2 = range2[1] == null ? lines.length : range2[1];
if (start2 < 0) {
start2 += lines.length;
}
start2 = Math.max(0, Math.min(start2 - 1, lines.length));
if (end2 < 0) {
end2 += lines.length;
}
end2 = Math.max(0, Math.min(end2, lines.length));
text = lines.slice(start2, end2).join("\n");
if (!pre.hasAttribute("data-start")) {
pre.setAttribute("data-start", String(start2 + 1));
}
}
code.textContent = text;
Prism.highlightElement(code);
},
function(error) {
pre.setAttribute(STATUS_ATTR, STATUS_FAILED);
code.textContent = error;
}
);
}
});
Prism.plugins.fileHighlight = {
highlight: function highlight(container) {
var elements = (container || document).querySelectorAll(SELECTOR);
for (var i = 0, element; element = elements[i++]; ) {
Prism.highlightElement(element);
}
}
};
var logged = false;
Prism.fileHighlight = function() {
if (!logged) {
console.warn("Prism.fileHighlight is deprecated. Use `Prism.plugins.fileHighlight.highlight` instead.");
logged = true;
}
Prism.plugins.fileHighlight.highlight.apply(this, arguments);
};
})();
}
});
// vendor/topbar.js
var require_topbar = __commonJS({
"vendor/topbar.js"(exports, module) {
(function(window2, document2) {
"use strict";
(function() {
var lastTime = 0;
var vendors = ["ms", "moz", "webkit", "o"];
for (var x = 0; x < vendors.length && !window2.requestAnimationFrame; ++x) {
window2.requestAnimationFrame = window2[vendors[x] + "RequestAnimationFrame"];
window2.cancelAnimationFrame = window2[vendors[x] + "CancelAnimationFrame"] || window2[vendors[x] + "CancelRequestAnimationFrame"];
}
if (!window2.requestAnimationFrame)
window2.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window2.setTimeout(function() {
callback(currTime + timeToCall);
}, timeToCall);
lastTime = currTime + timeToCall;
return id;
};
if (!window2.cancelAnimationFrame)
window2.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
})();
var canvas, progressTimerId, fadeTimerId, currentProgress, showing, addEvent = function(elem, type, handler) {
if (elem.addEventListener)
elem.addEventListener(type, handler, false);
else if (elem.attachEvent)
elem.attachEvent("on" + type, handler);
else
elem["on" + type] = handler;
}, options = {
autoRun: true,
barThickness: 3,
barColors: {
0: "rgba(26, 188, 156, .9)",
".25": "rgba(52, 152, 219, .9)",
".50": "rgba(241, 196, 15, .9)",
".75": "rgba(230, 126, 34, .9)",
"1.0": "rgba(211, 84, 0, .9)"
},
shadowBlur: 10,
shadowColor: "rgba(0, 0, 0, .6)",
className: null
}, repaint = function() {
canvas.width = window2.innerWidth;
canvas.height = options.barThickness * 5;
var ctx = canvas.getContext("2d");
ctx.shadowBlur = options.shadowBlur;
ctx.shadowColor = options.shadowColor;
var lineGradient = ctx.createLinearGradient(0, 0, canvas.width, 0);
for (var stop in options.barColors)
lineGradient.addColorStop(stop, options.barColors[stop]);
ctx.lineWidth = options.barThickness;
ctx.beginPath();
ctx.moveTo(0, options.barThickness / 2);
ctx.lineTo(
Math.ceil(currentProgress * canvas.width),
options.barThickness / 2
);
ctx.strokeStyle = lineGradient;
ctx.stroke();
}, createCanvas = function() {
canvas = document2.createElement("canvas");
var style = canvas.style;
style.position = "fixed";
style.top = style.left = style.right = style.margin = style.padding = 0;
style.zIndex = 100001;
style.display = "none";
if (options.className)
canvas.classList.add(options.className);
document2.body.appendChild(canvas);
addEvent(window2, "resize", repaint);
}, topbar2 = {
config: function(opts) {
for (var key in opts)
if (options.hasOwnProperty(key))
options[key] = opts[key];
},
show: function() {
if (showing)
return;
showing = true;
if (fadeTimerId !== null)
window2.cancelAnimationFrame(fadeTimerId);
if (!canvas)
createCanvas();
canvas.style.opacity = 1;
canvas.style.display = "block";
topbar2.progress(0);
if (options.autoRun) {
(function loop() {
progressTimerId = window2.requestAnimationFrame(loop);
topbar2.progress(
"+" + 0.05 * Math.pow(1 - Math.sqrt(currentProgress), 2)
);
})();
}
},
progress: function(to) {
if (typeof to === "undefined")
return currentProgress;
if (typeof to === "string") {
to = (to.indexOf("+") >= 0 || to.indexOf("-") >= 0 ? currentProgress : 0) + parseFloat(to);
}
currentProgress = to > 1 ? 1 : to;
repaint();
return currentProgress;
},
hide: function() {
if (!showing)
return;
showing = false;
if (progressTimerId != null) {
window2.cancelAnimationFrame(progressTimerId);
progressTimerId = null;
}
(function loop() {
if (topbar2.progress("+.1") >= 1) {
canvas.style.opacity -= 0.05;
if (canvas.style.opacity <= 0.05) {
canvas.style.display = "none";
fadeTimerId = null;
return;
}
}
fadeTimerId = window2.requestAnimationFrame(loop);
})();
}
};
if (typeof module === "object" && typeof module.exports === "object") {
module.exports = topbar2;
} else if (typeof define === "function" && define.amd) {
define(function() {
return topbar2;
});
} else {
this.topbar = topbar2;
}
}).call(exports, window, document);
}
});
// js/app.js
var import_jquery3 = __toESM(require_jquery());
// node_modules/@popperjs/core/lib/index.js
var lib_exports = {};
__export(lib_exports, {
afterMain: () => afterMain,
afterRead: () => afterRead,
afterWrite: () => afterWrite,
applyStyles: () => applyStyles_default,
arrow: () => arrow_default,
auto: () => auto,
basePlacements: () => basePlacements,
beforeMain: () => beforeMain,
beforeRead: () => beforeRead,
beforeWrite: () => beforeWrite,
bottom: () => bottom,
clippingParents: () => clippingParents,
computeStyles: () => computeStyles_default,
createPopper: () => createPopper3,
createPopperBase: () => createPopper,
createPopperLite: () => createPopper2,
detectOverflow: () => detectOverflow,
end: () => end,
eventListeners: () => eventListeners_default,
flip: () => flip_default,
hide: () => hide_default,
left: () => left,
main: () => main,
modifierPhases: () => modifierPhases,
offset: () => offset_default,
placements: () => placements,
popper: () => popper,
popperGenerator: () => popperGenerator,
popperOffsets: () => popperOffsets_default,
preventOverflow: () => preventOverflow_default,
read: () => read,
reference: () => reference,
right: () => right,
start: () => start,
top: () => top,
variationPlacements: () => variationPlacements,
viewport: () => viewport,
write: () => write
});
// node_modules/@popperjs/core/lib/enums.js
var top = "top";
var bottom = "bottom";
var right = "right";
var left = "left";
var auto = "auto";
var basePlacements = [top, bottom, right, left];
var start = "start";
var end = "end";
var clippingParents = "clippingParents";
var viewport = "viewport";
var popper = "popper";
var reference = "reference";
var variationPlacements = /* @__PURE__ */ basePlacements.reduce(function(acc, placement) {
return acc.concat([placement + "-" + start, placement + "-" + end]);
}, []);
var placements = /* @__PURE__ */ [].concat(basePlacements, [auto]).reduce(function(acc, placement) {
return acc.concat([placement, placement + "-" + start, placement + "-" + end]);
}, []);
var beforeRead = "beforeRead";
var read = "read";
var afterRead = "afterRead";
var beforeMain = "beforeMain";
var main = "main";
var afterMain = "afterMain";
var beforeWrite = "beforeWrite";
var write = "write";
var afterWrite = "afterWrite";
var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];
// node_modules/@popperjs/core/lib/dom-utils/getNodeName.js
function getNodeName(element) {
return element ? (element.nodeName || "").toLowerCase() : null;
}
// node_modules/@popperjs/core/lib/dom-utils/getWindow.js
function getWindow(node) {
if (node == null) {
return window;
}
if (node.toString() !== "[object Window]") {
var ownerDocument = node.ownerDocument;
return ownerDocument ? ownerDocument.defaultView || window : window;
}
return node;
}
// node_modules/@popperjs/core/lib/dom-utils/instanceOf.js
function isElement(node) {
var OwnElement = getWindow(node).Element;
return node instanceof OwnElement || node instanceof Element;
}
function isHTMLElement(node) {
var OwnElement = getWindow(node).HTMLElement;
return node instanceof OwnElement || node instanceof HTMLElement;
}
function isShadowRoot(node) {
if (typeof ShadowRoot === "undefined") {
return false;
}
var OwnElement = getWindow(node).ShadowRoot;
return node instanceof OwnElement || node instanceof ShadowRoot;
}
// node_modules/@popperjs/core/lib/modifiers/applyStyles.js
function applyStyles(_ref) {
var state = _ref.state;
Object.keys(state.elements).forEach(function(name) {
var style = state.styles[name] || {};
var attributes = state.attributes[name] || {};
var element = state.elements[name];
if (!isHTMLElement(element) || !getNodeName(element)) {
return;
}
Object.assign(element.style, style);
Object.keys(attributes).forEach(function(name2) {
var value = attributes[name2];
if (value === false) {
element.removeAttribute(name2);
} else {
element.setAttribute(name2, value === true ? "" : value);
}
});
});
}
function effect(_ref2) {
var state = _ref2.state;
var initialStyles = {
popper: {
position: state.options.strategy,
left: "0",
top: "0",
margin: "0"
},
arrow: {
position: "absolute"
},
reference: {}
};
Object.assign(state.elements.popper.style, initialStyles.popper);
state.styles = initialStyles;
if (state.elements.arrow) {
Object.assign(state.elements.arrow.style, initialStyles.arrow);
}
return function() {
Object.keys(state.elements).forEach(function(name) {
var element = state.elements[name];
var attributes = state.attributes[name] || {};
var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]);
var style = styleProperties.reduce(function(style2, property) {
style2[property] = "";
return style2;
}, {});
if (!isHTMLElement(element) || !getNodeName(element)) {
return;
}
Object.assign(element.style, style);
Object.keys(attributes).forEach(function(attribute) {
element.removeAttribute(attribute);
});
});
};
}
var applyStyles_default = {
name: "applyStyles",
enabled: true,
phase: "write",
fn: applyStyles,
effect,
requires: ["computeStyles"]
};
// node_modules/@popperjs/core/lib/utils/getBasePlacement.js
function getBasePlacement(placement) {
return placement.split("-")[0];
}
// node_modules/@popperjs/core/lib/utils/math.js
var max = Math.max;
var min = Math.min;
var round = Math.round;
// node_modules/@popperjs/core/lib/utils/userAgent.js
function getUAString() {
var uaData = navigator.userAgentData;
if (uaData != null && uaData.brands) {
return uaData.brands.map(function(item) {
return item.brand + "/" + item.version;
}).join(" ");
}
return navigator.userAgent;
}
// node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js
function isLayoutViewport() {
return !/^((?!chrome|android).)*safari/i.test(getUAString());
}
// node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js
function getBoundingClientRect(element, includeScale, isFixedStrategy) {
if (includeScale === void 0) {
includeScale = false;
}
if (isFixedStrategy === void 0) {
isFixedStrategy = false;
}
var clientRect = element.getBoundingClientRect();
var scaleX = 1;
var scaleY = 1;
if (includeScale && isHTMLElement(element)) {
scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;
scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;
}
var _ref = isElement(element) ? getWindow(element) : window, visualViewport = _ref.visualViewport;
var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;
var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;
var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;
var width = clientRect.width / scaleX;
var height = clientRect.height / scaleY;
return {
width,
height,
top: y,
right: x + width,
bottom: y + height,
left: x,
x,
y
};
}
// node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js
function getLayoutRect(element) {
var clientRect = getBoundingClientRect(element);
var width = element.offsetWidth;
var height = element.offsetHeight;
if (Math.abs(clientRect.width - width) <= 1) {
width = clientRect.width;
}
if (Math.abs(clientRect.height - height) <= 1) {
height = clientRect.height;
}
return {
x: element.offsetLeft,
y: element.offsetTop,
width,
height
};
}
// node_modules/@popperjs/core/lib/dom-utils/contains.js
function contains(parent, child) {
var rootNode = child.getRootNode && child.getRootNode();
if (parent.contains(child)) {
return true;
} else if (rootNode && isShadowRoot(rootNode)) {
var next = child;
do {
if (next && parent.isSameNode(next)) {
return true;
}
next = next.parentNode || next.host;
} while (next);
}
return false;
}
// node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js
function getComputedStyle2(element) {
return getWindow(element).getComputedStyle(element);
}
// node_modules/@popperjs/core/lib/dom-utils/isTableElement.js
function isTableElement(element) {
return ["table", "td", "th"].indexOf(getNodeName(element)) >= 0;
}
// node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js
function getDocumentElement(element) {
return ((isElement(element) ? element.ownerDocument : element.document) || window.document).documentElement;
}
// node_modules/@popperjs/core/lib/dom-utils/getParentNode.js
function getParentNode(element) {
if (getNodeName(element) === "html") {
return element;
}
return element.assignedSlot || element.parentNode || (isShadowRoot(element) ? element.host : null) || getDocumentElement(element);
}
// node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js
function getTrueOffsetParent(element) {
if (!isHTMLElement(element) || getComputedStyle2(element).position === "fixed") {
return null;
}
return element.offsetParent;
}
function getContainingBlock(element) {
var isFirefox = /firefox/i.test(getUAString());
var isIE = /Trident/i.test(getUAString());
if (isIE && isHTMLElement(element)) {
var elementCss = getComputedStyle2(element);
if (elementCss.position === "fixed") {
return null;
}
}
var currentNode = getParentNode(element);
if (isShadowRoot(currentNode)) {
currentNode = currentNode.host;
}
while (isHTMLElement(currentNode) && ["html", "body"].indexOf(getNodeName(currentNode)) < 0) {
var css = getComputedStyle2(currentNode);
if (css.transform !== "none" || css.perspective !== "none" || css.contain === "paint" || ["transform", "perspective"].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === "filter" || isFirefox && css.filter && css.filter !== "none") {
return currentNode;
} else {
currentNode = currentNode.parentNode;
}
}
return null;
}
function getOffsetParent(element) {
var window2 = getWindow(element);
var offsetParent = getTrueOffsetParent(element);
while (offsetParent && isTableElement(offsetParent) && getComputedStyle2(offsetParent).position === "static") {
offsetParent = getTrueOffsetParent(offsetParent);
}
if (offsetParent && (getNodeName(offsetParent) === "html" || getNodeName(offsetParent) === "body" && getComputedStyle2(offsetParent).position === "static")) {
return window2;
}
return offsetParent || getContainingBlock(element) || window2;
}
// node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js
function getMainAxisFromPlacement(placement) {
return ["top", "bottom"].indexOf(placement) >= 0 ? "x" : "y";
}
// node_modules/@popperjs/core/lib/utils/within.js
function within(min2, value, max2) {
return max(min2, min(value, max2));
}
function withinMaxClamp(min2, value, max2) {
var v = within(min2, value, max2);
return v > max2 ? max2 : v;
}
// node_modules/@popperjs/core/lib/utils/getFreshSideObject.js
function getFreshSideObject() {
return {
top: 0,
right: 0,
bottom: 0,
left: 0
};
}
// node_modules/@popperjs/core/lib/utils/mergePaddingObject.js
function mergePaddingObject(paddingObject) {
return Object.assign({}, getFreshSideObject(), paddingObject);
}
// node_modules/@popperjs/core/lib/utils/expandToHashMap.js
function expandToHashMap(value, keys) {
return keys.reduce(function(hashMap, key) {
hashMap[key] = value;
return hashMap;
}, {});
}
// node_modules/@popperjs/core/lib/modifiers/arrow.js
var toPaddingObject = function toPaddingObject2(padding, state) {
padding = typeof padding === "function" ? padding(Object.assign({}, state.rects, {
placement: state.placement
})) : padding;
return mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
};
function arrow(_ref) {
var _state$modifiersData$;
var state = _ref.state, name = _ref.name, options = _ref.options;
var arrowElement = state.elements.arrow;
var popperOffsets2 = state.modifiersData.popperOffsets;
var basePlacement = getBasePlacement(state.placement);
var axis = getMainAxisFromPlacement(basePlacement);
var isVertical = [left, right].indexOf(basePlacement) >= 0;
var len = isVertical ? "height" : "width";
if (!arrowElement || !popperOffsets2) {
return;
}
var paddingObject = toPaddingObject(options.padding, state);
var arrowRect = getLayoutRect(arrowElement);
var minProp = axis === "y" ? top : left;
var maxProp = axis === "y" ? bottom : right;
var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets2[axis] - state.rects.popper[len];
var startDiff = popperOffsets2[axis] - state.rects.reference[axis];
var arrowOffsetParent = getOffsetParent(arrowElement);
var clientSize = arrowOffsetParent ? axis === "y" ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;
var centerToReference = endDiff / 2 - startDiff / 2;
var min2 = paddingObject[minProp];
var max2 = clientSize - arrowRect[len] - paddingObject[maxProp];
var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;
var offset2 = within(min2, center, max2);
var axisProp = axis;
state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset2, _state$modifiersData$.centerOffset = offset2 - center, _state$modifiersData$);
}
function effect2(_ref2) {
var state = _ref2.state, options = _ref2.options;
var _options$element = options.element, arrowElement = _options$element === void 0 ? "[data-popper-arrow]" : _options$element;
if (arrowElement == null) {
return;
}
if (typeof arrowElement === "string") {
arrowElement = state.elements.popper.querySelector(arrowElement);
if (!arrowElement) {
return;
}
}
if (true) {
if (!isHTMLElement(arrowElement)) {
console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', "To use an SVG arrow, wrap it in an HTMLElement that will be used as", "the arrow."].join(" "));
}
}
if (!contains(state.elements.popper, arrowElement)) {
if (true) {
console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', "element."].join(" "));
}
return;
}
state.elements.arrow = arrowElement;
}
var arrow_default = {
name: "arrow",
enabled: true,
phase: "main",
fn: arrow,
effect: effect2,
requires: ["popperOffsets"],
requiresIfExists: ["preventOverflow"]
};
// node_modules/@popperjs/core/lib/utils/getVariation.js
function getVariation(placement) {
return placement.split("-")[1];
}
// node_modules/@popperjs/core/lib/modifiers/computeStyles.js
var unsetSides = {
top: "auto",
right: "auto",
bottom: "auto",
left: "auto"
};
function roundOffsetsByDPR(_ref) {
var x = _ref.x, y = _ref.y;
var win = window;
var dpr = win.devicePixelRatio || 1;
return {
x: round(x * dpr) / dpr || 0,
y: round(y * dpr) / dpr || 0
};
}
function mapToStyles(_ref2) {
var _Object$assign2;
var popper2 = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, variation = _ref2.variation, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets, isFixed = _ref2.isFixed;
var _offsets$x = offsets.x, x = _offsets$x === void 0 ? 0 : _offsets$x, _offsets$y = offsets.y, y = _offsets$y === void 0 ? 0 : _offsets$y;
var _ref3 = typeof roundOffsets === "function" ? roundOffsets({
x,
y
}) : {
x,
y
};
x = _ref3.x;
y = _ref3.y;
var hasX = offsets.hasOwnProperty("x");
var hasY = offsets.hasOwnProperty("y");
var sideX = left;
var sideY = top;
var win = window;
if (adaptive) {
var offsetParent = getOffsetParent(popper2);
var heightProp = "clientHeight";
var widthProp = "clientWidth";
if (offsetParent === getWindow(popper2)) {
offsetParent = getDocumentElement(popper2);
if (getComputedStyle2(offsetParent).position !== "static" && position === "absolute") {
heightProp = "scrollHeight";
widthProp = "scrollWidth";
}
}
offsetParent = offsetParent;
if (placement === top || (placement === left || placement === right) && variation === end) {
sideY = bottom;
var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : offsetParent[heightProp];
y -= offsetY - popperRect.height;
y *= gpuAcceleration ? 1 : -1;
}
if (placement === left || (placement === top || placement === bottom) && variation === end) {
sideX = right;
var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : offsetParent[widthProp];
x -= offsetX - popperRect.width;
x *= gpuAcceleration ? 1 : -1;
}
}
var commonStyles = Object.assign({
position
}, adaptive && unsetSides);
var _ref4 = roundOffsets === true ? roundOffsetsByDPR({
x,
y
}) : {
x,
y
};
x = _ref4.x;
y = _ref4.y;
if (gpuAcceleration) {
var _Object$assign;
return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? "0" : "", _Object$assign[sideX] = hasX ? "0" : "", _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign));
}
return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : "", _Object$assign2[sideX] = hasX ? x + "px" : "", _Object$assign2.transform = "", _Object$assign2));
}
function computeStyles(_ref5) {
var state = _ref5.state, options = _ref5.options;
var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;
if (true) {
var transitionProperty = getComputedStyle2(state.elements.popper).transitionProperty || "";
if (adaptive && ["transform", "top", "right", "bottom", "left"].some(function(property) {
return transitionProperty.indexOf(property) >= 0;
})) {
console.warn(["Popper: Detected CSS transitions on at least one of the following", 'CSS properties: "transform", "top", "right", "bottom", "left".', "\n\n", 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', "for smooth transitions, or remove these properties from the CSS", "transition declaration on the popper element if only transitioning", "opacity or background-color for example.", "\n\n", "We recommend using the popper element as a wrapper around an inner", "element that can have any CSS property transitioned for animations."].join(" "));
}
}
var commonStyles = {
placement: getBasePlacement(state.placement),
variation: getVariation(state.placement),
popper: state.elements.popper,
popperRect: state.rects.popper,
gpuAcceleration,
isFixed: state.options.strategy === "fixed"
};
if (state.modifiersData.popperOffsets != null) {
state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {
offsets: state.modifiersData.popperOffsets,
position: state.options.strategy,
adaptive,
roundOffsets
})));
}
if (state.modifiersData.arrow != null) {
state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {
offsets: state.modifiersData.arrow,
position: "absolute",
adaptive: false,
roundOffsets
})));
}
state.attributes.popper = Object.assign({}, state.attributes.popper, {
"data-popper-placement": state.placement
});
}
var computeStyles_default = {
name: "computeStyles",
enabled: true,
phase: "beforeWrite",
fn: computeStyles,
data: {}
};
// node_modules/@popperjs/core/lib/modifiers/eventListeners.js
var passive = {
passive: true
};
function effect3(_ref) {
var state = _ref.state, instance = _ref.instance, options = _ref.options;
var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize;
var window2 = getWindow(state.elements.popper);
var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);
if (scroll) {
scrollParents.forEach(function(scrollParent) {
scrollParent.addEventListener("scroll", instance.update, passive);
});
}
if (resize) {
window2.addEventListener("resize", instance.update, passive);
}
return function() {
if (scroll) {
scrollParents.forEach(function(scrollParent) {
scrollParent.removeEventListener("scroll", instance.update, passive);
});
}
if (resize) {
window2.removeEventListener("resize", instance.update, passive);
}
};
}
var eventListeners_default = {
name: "eventListeners",
enabled: true,
phase: "write",
fn: function fn() {
},
effect: effect3,
data: {}
};
// node_modules/@popperjs/core/lib/utils/getOppositePlacement.js
var hash = {
left: "right",
right: "left",
bottom: "top",
top: "bottom"
};
function getOppositePlacement(placement) {
return placement.replace(/left|right|bottom|top/g, function(matched) {
return hash[matched];
});
}
// node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js
var hash2 = {
start: "end",
end: "start"
};
function getOppositeVariationPlacement(placement) {
return placement.replace(/start|end/g, function(matched) {
return hash2[matched];
});
}
// node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js
function getWindowScroll(node) {
var win = getWindow(node);
var scrollLeft = win.pageXOffset;
var scrollTop = win.pageYOffset;
return {
scrollLeft,
scrollTop
};
}
// node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js
function getWindowScrollBarX(element) {
return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;
}
// node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js
function getViewportRect(element, strategy) {
var win = getWindow(element);
var html = getDocumentElement(element);
var visualViewport = win.visualViewport;
var width = html.clientWidth;
var height = html.clientHeight;
var x = 0;
var y = 0;
if (visualViewport) {
width = visualViewport.width;
height = visualViewport.height;
var layoutViewport = isLayoutViewport();
if (layoutViewport || !layoutViewport && strategy === "fixed") {
x = visualViewport.offsetLeft;
y = visualViewport.offsetTop;
}
}
return {
width,
height,
x: x + getWindowScrollBarX(element),
y
};
}
// node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js
function getDocumentRect(element) {
var _element$ownerDocumen;
var html = getDocumentElement(element);
var winScroll = getWindowScroll(element);
var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;
var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);
var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);
var x = -winScroll.scrollLeft + getWindowScrollBarX(element);
var y = -winScroll.scrollTop;
if (getComputedStyle2(body || html).direction === "rtl") {
x += max(html.clientWidth, body ? body.clientWidth : 0) - width;
}
return {
width,
height,
x,
y
};
}
// node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js
function isScrollParent(element) {
var _getComputedStyle = getComputedStyle2(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY;
return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);
}
// node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js
function getScrollParent(node) {
if (["html", "body", "#document"].indexOf(getNodeName(node)) >= 0) {
return node.ownerDocument.body;
}
if (isHTMLElement(node) && isScrollParent(node)) {
return node;
}
return getScrollParent(getParentNode(node));
}
// node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js
function listScrollParents(element, list) {
var _element$ownerDocumen;
if (list === void 0) {
list = [];
}
var scrollParent = getScrollParent(element);
var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);
var win = getWindow(scrollParent);
var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;
var updatedList = list.concat(target);
return isBody ? updatedList : updatedList.concat(listScrollParents(getParentNode(target)));
}
// node_modules/@popperjs/core/lib/utils/rectToClientRect.js
function rectToClientRect(rect) {
return Object.assign({}, rect, {
left: rect.x,
top: rect.y,
right: rect.x + rect.width,
bottom: rect.y + rect.height
});
}
// node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js
function getInnerBoundingClientRect(element, strategy) {
var rect = getBoundingClientRect(element, false, strategy === "fixed");
rect.top = rect.top + element.clientTop;
rect.left = rect.left + element.clientLeft;
rect.bottom = rect.top + element.clientHeight;
rect.right = rect.left + element.clientWidth;
rect.width = element.clientWidth;
rect.height = element.clientHeight;
rect.x = rect.left;
rect.y = rect.top;
return rect;
}
function getClientRectFromMixedType(element, clippingParent, strategy) {
return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));
}
function getClippingParents(element) {
var clippingParents2 = listScrollParents(getParentNode(element));
var canEscapeClipping = ["absolute", "fixed"].indexOf(getComputedStyle2(element).position) >= 0;
var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;
if (!isElement(clipperElement)) {
return [];
}
return clippingParents2.filter(function(clippingParent) {
return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== "body";
});
}
function getClippingRect(element, boundary, rootBoundary, strategy) {
var mainClippingParents = boundary === "clippingParents" ? getClippingParents(element) : [].concat(boundary);
var clippingParents2 = [].concat(mainClippingParents, [rootBoundary]);
var firstClippingParent = clippingParents2[0];
var clippingRect = clippingParents2.reduce(function(accRect, clippingParent) {
var rect = getClientRectFromMixedType(element, clippingParent, strategy);
accRect.top = max(rect.top, accRect.top);
accRect.right = min(rect.right, accRect.right);
accRect.bottom = min(rect.bottom, accRect.bottom);
accRect.left = max(rect.left, accRect.left);
return accRect;
}, getClientRectFromMixedType(element, firstClippingParent, strategy));
clippingRect.width = clippingRect.right - clippingRect.left;
clippingRect.height = clippingRect.bottom - clippingRect.top;
clippingRect.x = clippingRect.left;
clippingRect.y = clippingRect.top;
return clippingRect;
}
// node_modules/@popperjs/core/lib/utils/computeOffsets.js
function computeOffsets(_ref) {
var reference2 = _ref.reference, element = _ref.element, placement = _ref.placement;
var basePlacement = placement ? getBasePlacement(placement) : null;
var variation = placement ? getVariation(placement) : null;
var commonX = reference2.x + reference2.width / 2 - element.width / 2;
var commonY = reference2.y + reference2.height / 2 - element.height / 2;
var offsets;
switch (basePlacement) {
case top:
offsets = {
x: commonX,
y: reference2.y - element.height
};
break;
case bottom:
offsets = {
x: commonX,
y: reference2.y + reference2.height
};
break;
case right:
offsets = {
x: reference2.x + reference2.width,
y: commonY
};
break;
case left:
offsets = {
x: reference2.x - element.width,
y: commonY
};
break;
default:
offsets = {
x: reference2.x,
y: reference2.y
};
}
var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;
if (mainAxis != null) {
var len = mainAxis === "y" ? "height" : "width";
switch (variation) {
case start:
offsets[mainAxis] = offsets[mainAxis] - (reference2[len] / 2 - element[len] / 2);
break;
case end:
offsets[mainAxis] = offsets[mainAxis] + (reference2[len] / 2 - element[len] / 2);
break;
default:
}
}
return offsets;
}
// node_modules/@popperjs/core/lib/utils/detectOverflow.js
function detectOverflow(state, options) {
if (options === void 0) {
options = {};
}
var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$strategy = _options.strategy, strategy = _options$strategy === void 0 ? state.strategy : _options$strategy, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding;
var paddingObject = mergePaddingObject(typeof padding !== "number" ? padding : expandToHashMap(padding, basePlacements));
var altContext = elementContext === popper ? reference : popper;
var popperRect = state.rects.popper;
var element = state.elements[altBoundary ? altContext : elementContext];
var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);
var referenceClientRect = getBoundingClientRect(state.elements.reference);
var popperOffsets2 = computeOffsets({
reference: referenceClientRect,
element: popperRect,
strategy: "absolute",
placement
});
var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets2));
var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect;
var overflowOffsets = {
top: clippingClientRect.top - elementClientRect.top + paddingObject.top,
bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,
left: clippingClientRect.left - elementClientRect.left + paddingObject.left,
right: elementClientRect.right - clippingClientRect.right + paddingObject.right
};
var offsetData = state.modifiersData.offset;
if (elementContext === popper && offsetData) {
var offset2 = offsetData[placement];
Object.keys(overflowOffsets).forEach(function(key) {
var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;
var axis = [top, bottom].indexOf(key) >= 0 ? "y" : "x";
overflowOffsets[key] += offset2[axis] * multiply;
});
}
return overflowOffsets;
}
// node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js
function computeAutoPlacement(state, options) {
if (options === void 0) {
options = {};
}
var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;
var variation = getVariation(placement);
var placements2 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function(placement2) {
return getVariation(placement2) === variation;
}) : basePlacements;
var allowedPlacements = placements2.filter(function(placement2) {
return allowedAutoPlacements.indexOf(placement2) >= 0;
});
if (allowedPlacements.length === 0) {
allowedPlacements = placements2;
if (true) {
console.error(["Popper: The `allowedAutoPlacements` option did not allow any", "placements. Ensure the `placement` option matches the variation", "of the allowed placements.", 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(" "));
}
}
var overflows = allowedPlacements.reduce(function(acc, placement2) {
acc[placement2] = detectOverflow(state, {
placement: placement2,
boundary,
rootBoundary,
padding
})[getBasePlacement(placement2)];
return acc;
}, {});
return Object.keys(overflows).sort(function(a, b) {
return overflows[a] - overflows[b];
});
}
// node_modules/@popperjs/core/lib/modifiers/flip.js
function getExpandedFallbackPlacements(placement) {
if (getBasePlacement(placement) === auto) {
return [];
}
var oppositePlacement = getOppositePlacement(placement);
return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];
}
function flip(_ref) {
var state = _ref.state, options = _ref.options, name = _ref.name;
if (state.modifiersData[name]._skip) {
return;
}
var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements;
var preferredPlacement = state.options.placement;
var basePlacement = getBasePlacement(preferredPlacement);
var isBasePlacement = basePlacement === preferredPlacement;
var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));
var placements2 = [preferredPlacement].concat(fallbackPlacements).reduce(function(acc, placement2) {
return acc.concat(getBasePlacement(placement2) === auto ? computeAutoPlacement(state, {
placement: placement2,
boundary,
rootBoundary,
padding,
flipVariations,
allowedAutoPlacements
}) : placement2);
}, []);
var referenceRect = state.rects.reference;
var popperRect = state.rects.popper;
var checksMap = /* @__PURE__ */ new Map();
var makeFallbackChecks = true;
var firstFittingPlacement = placements2[0];
for (var i = 0; i < placements2.length; i++) {
var placement = placements2[i];
var _basePlacement = getBasePlacement(placement);
var isStartVariation = getVariation(placement) === start;
var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;
var len = isVertical ? "width" : "height";
var overflow = detectOverflow(state, {
placement,
boundary,
rootBoundary,
altBoundary,
padding
});
var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;
if (referenceRect[len] > popperRect[len]) {
mainVariationSide = getOppositePlacement(mainVariationSide);
}
var altVariationSide = getOppositePlacement(mainVariationSide);
var checks = [];
if (checkMainAxis) {
checks.push(overflow[_basePlacement] <= 0);
}
if (checkAltAxis) {
checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);
}
if (checks.every(function(check) {
return check;
})) {
firstFittingPlacement = placement;
makeFallbackChecks = false;
break;
}
checksMap.set(placement, checks);
}
if (makeFallbackChecks) {
var numberOfChecks = flipVariations ? 3 : 1;
var _loop = function _loop2(_i2) {
var fittingPlacement = placements2.find(function(placement2) {
var checks2 = checksMap.get(placement2);
if (checks2) {
return checks2.slice(0, _i2).every(function(check) {
return check;
});
}
});
if (fittingPlacement) {
firstFittingPlacement = fittingPlacement;
return "break";
}
};
for (var _i = numberOfChecks; _i > 0; _i--) {
var _ret = _loop(_i);
if (_ret === "break")
break;
}
}
if (state.placement !== firstFittingPlacement) {
state.modifiersData[name]._skip = true;
state.placement = firstFittingPlacement;
state.reset = true;
}
}
var flip_default = {
name: "flip",
enabled: true,
phase: "main",
fn: flip,
requiresIfExists: ["offset"],
data: {
_skip: false
}
};
// node_modules/@popperjs/core/lib/modifiers/hide.js
function getSideOffsets(overflow, rect, preventedOffsets) {
if (preventedOffsets === void 0) {
preventedOffsets = {
x: 0,
y: 0
};
}
return {
top: overflow.top - rect.height - preventedOffsets.y,
right: overflow.right - rect.width + preventedOffsets.x,
bottom: overflow.bottom - rect.height + preventedOffsets.y,
left: overflow.left - rect.width - preventedOffsets.x
};
}
function isAnySideFullyClipped(overflow) {
return [top, right, bottom, left].some(function(side) {
return overflow[side] >= 0;
});
}
function hide(_ref) {
var state = _ref.state, name = _ref.name;
var referenceRect = state.rects.reference;
var popperRect = state.rects.popper;
var preventedOffsets = state.modifiersData.preventOverflow;
var referenceOverflow = detectOverflow(state, {
elementContext: "reference"
});
var popperAltOverflow = detectOverflow(state, {
altBoundary: true
});
var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);
var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);
var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);
var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);
state.modifiersData[name] = {
referenceClippingOffsets,
popperEscapeOffsets,
isReferenceHidden,
hasPopperEscaped
};
state.attributes.popper = Object.assign({}, state.attributes.popper, {
"data-popper-reference-hidden": isReferenceHidden,
"data-popper-escaped": hasPopperEscaped
});
}
var hide_default = {
name: "hide",
enabled: true,
phase: "main",
requiresIfExists: ["preventOverflow"],
fn: hide
};
// node_modules/@popperjs/core/lib/modifiers/offset.js
function distanceAndSkiddingToXY(placement, rects, offset2) {
var basePlacement = getBasePlacement(placement);
var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;
var _ref = typeof offset2 === "function" ? offset2(Object.assign({}, rects, {
placement
})) : offset2, skidding = _ref[0], distance = _ref[1];
skidding = skidding || 0;
distance = (distance || 0) * invertDistance;
return [left, right].indexOf(basePlacement) >= 0 ? {
x: distance,
y: skidding
} : {
x: skidding,
y: distance
};
}
function offset(_ref2) {
var state = _ref2.state, options = _ref2.options, name = _ref2.name;
var _options$offset = options.offset, offset2 = _options$offset === void 0 ? [0, 0] : _options$offset;
var data = placements.reduce(function(acc, placement) {
acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset2);
return acc;
}, {});
var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y;
if (state.modifiersData.popperOffsets != null) {
state.modifiersData.popperOffsets.x += x;
state.modifiersData.popperOffsets.y += y;
}
state.modifiersData[name] = data;
}
var offset_default = {
name: "offset",
enabled: true,
phase: "main",
requires: ["popperOffsets"],
fn: offset
};
// node_modules/@popperjs/core/lib/modifiers/popperOffsets.js
function popperOffsets(_ref) {
var state = _ref.state, name = _ref.name;
state.modifiersData[name] = computeOffsets({
reference: state.rects.reference,
element: state.rects.popper,
strategy: "absolute",
placement: state.placement
});
}
var popperOffsets_default = {
name: "popperOffsets",
enabled: true,
phase: "read",
fn: popperOffsets,
data: {}
};
// node_modules/@popperjs/core/lib/utils/getAltAxis.js
function getAltAxis(axis) {
return axis === "x" ? "y" : "x";
}
// node_modules/@popperjs/core/lib/modifiers/preventOverflow.js
function preventOverflow(_ref) {
var state = _ref.state, options = _ref.options, name = _ref.name;
var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;
var overflow = detectOverflow(state, {
boundary,
rootBoundary,
padding,
altBoundary
});
var basePlacement = getBasePlacement(state.placement);
var variation = getVariation(state.placement);
var isBasePlacement = !variation;
var mainAxis = getMainAxisFromPlacement(basePlacement);
var altAxis = getAltAxis(mainAxis);
var popperOffsets2 = state.modifiersData.popperOffsets;
var referenceRect = state.rects.reference;
var popperRect = state.rects.popper;
var tetherOffsetValue = typeof tetherOffset === "function" ? tetherOffset(Object.assign({}, state.rects, {
placement: state.placement
})) : tetherOffset;
var normalizedTetherOffsetValue = typeof tetherOffsetValue === "number" ? {
mainAxis: tetherOffsetValue,
altAxis: tetherOffsetValue
} : Object.assign({
mainAxis: 0,
altAxis: 0
}, tetherOffsetValue);
var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;
var data = {
x: 0,
y: 0
};
if (!popperOffsets2) {
return;
}
if (checkMainAxis) {
var _offsetModifierState$;
var mainSide = mainAxis === "y" ? top : left;
var altSide = mainAxis === "y" ? bottom : right;
var len = mainAxis === "y" ? "height" : "width";
var offset2 = popperOffsets2[mainAxis];
var min2 = offset2 + overflow[mainSide];
var max2 = offset2 - overflow[altSide];
var additive = tether ? -popperRect[len] / 2 : 0;
var minLen = variation === start ? referenceRect[len] : popperRect[len];
var maxLen = variation === start ? -popperRect[len] : -referenceRect[len];
var arrowElement = state.elements.arrow;
var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {
width: 0,
height: 0
};
var arrowPaddingObject = state.modifiersData["arrow#persistent"] ? state.modifiersData["arrow#persistent"].padding : getFreshSideObject();
var arrowPaddingMin = arrowPaddingObject[mainSide];
var arrowPaddingMax = arrowPaddingObject[altSide];
var arrowLen = within(0, referenceRect[len], arrowRect[len]);
var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;
var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;
var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);
var clientOffset = arrowOffsetParent ? mainAxis === "y" ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;
var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;
var tetherMin = offset2 + minOffset - offsetModifierValue - clientOffset;
var tetherMax = offset2 + maxOffset - offsetModifierValue;
var preventedOffset = within(tether ? min(min2, tetherMin) : min2, offset2, tether ? max(max2, tetherMax) : max2);
popperOffsets2[mainAxis] = preventedOffset;
data[mainAxis] = preventedOffset - offset2;
}
if (checkAltAxis) {
var _offsetModifierState$2;
var _mainSide = mainAxis === "x" ? top : left;
var _altSide = mainAxis === "x" ? bottom : right;
var _offset = popperOffsets2[altAxis];
var _len = altAxis === "y" ? "height" : "width";
var _min = _offset + overflow[_mainSide];
var _max = _offset - overflow[_altSide];
var isOriginSide = [top, left].indexOf(basePlacement) !== -1;
var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;
var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;
var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;
var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);
popperOffsets2[altAxis] = _preventedOffset;
data[altAxis] = _preventedOffset - _offset;
}
state.modifiersData[name] = data;
}
var preventOverflow_default = {
name: "preventOverflow",
enabled: true,
phase: "main",
fn: preventOverflow,
requiresIfExists: ["offset"]
};
// node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js
function getHTMLElementScroll(element) {
return {
scrollLeft: element.scrollLeft,
scrollTop: element.scrollTop
};
}
// node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js
function getNodeScroll(node) {
if (node === getWindow(node) || !isHTMLElement(node)) {
return getWindowScroll(node);
} else {
return getHTMLElementScroll(node);
}
}
// node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js
function isElementScaled(element) {
var rect = element.getBoundingClientRect();
var scaleX = round(rect.width) / element.offsetWidth || 1;
var scaleY = round(rect.height) / element.offsetHeight || 1;
return scaleX !== 1 || scaleY !== 1;
}
function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {
if (isFixed === void 0) {
isFixed = false;
}
var isOffsetParentAnElement = isHTMLElement(offsetParent);
var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);
var documentElement = getDocumentElement(offsetParent);
var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);
var scroll = {
scrollLeft: 0,
scrollTop: 0
};
var offsets = {
x: 0,
y: 0
};
if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {
if (getNodeName(offsetParent) !== "body" || isScrollParent(documentElement)) {
scroll = getNodeScroll(offsetParent);
}
if (isHTMLElement(offsetParent)) {
offsets = getBoundingClientRect(offsetParent, true);
offsets.x += offsetParent.clientLeft;
offsets.y += offsetParent.clientTop;
} else if (documentElement) {
offsets.x = getWindowScrollBarX(documentElement);
}
}
return {
x: rect.left + scroll.scrollLeft - offsets.x,
y: rect.top + scroll.scrollTop - offsets.y,
width: rect.width,
height: rect.height
};
}
// node_modules/@popperjs/core/lib/utils/orderModifiers.js
function order(modifiers) {
var map = /* @__PURE__ */ new Map();
var visited = /* @__PURE__ */ new Set();
var result = [];
modifiers.forEach(function(modifier) {
map.set(modifier.name, modifier);
});
function sort(modifier) {
visited.add(modifier.name);
var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);
requires.forEach(function(dep) {
if (!visited.has(dep)) {
var depModifier = map.get(dep);
if (depModifier) {
sort(depModifier);
}
}
});
result.push(modifier);
}
modifiers.forEach(function(modifier) {
if (!visited.has(modifier.name)) {
sort(modifier);
}
});
return result;
}
function orderModifiers(modifiers) {
var orderedModifiers = order(modifiers);
return modifierPhases.reduce(function(acc, phase) {
return acc.concat(orderedModifiers.filter(function(modifier) {
return modifier.phase === phase;
}));
}, []);
}
// node_modules/@popperjs/core/lib/utils/debounce.js
function debounce(fn2) {
var pending;
return function() {
if (!pending) {
pending = new Promise(function(resolve) {
Promise.resolve().then(function() {
pending = void 0;
resolve(fn2());
});
});
}
return pending;
};
}
// node_modules/@popperjs/core/lib/utils/format.js
function format(str) {
for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
args[_key - 1] = arguments[_key];
}
return [].concat(args).reduce(function(p, c) {
return p.replace(/%s/, c);
}, str);
}
// node_modules/@popperjs/core/lib/utils/validateModifiers.js
var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s';
var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available';
var VALID_PROPERTIES = ["name", "enabled", "phase", "fn", "effect", "requires", "options"];
function validateModifiers(modifiers) {
modifiers.forEach(function(modifier) {
[].concat(Object.keys(modifier), VALID_PROPERTIES).filter(function(value, index, self2) {
return self2.indexOf(value) === index;
}).forEach(function(key) {
switch (key) {
case "name":
if (typeof modifier.name !== "string") {
console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', '"' + String(modifier.name) + '"'));
}
break;
case "enabled":
if (typeof modifier.enabled !== "boolean") {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', '"' + String(modifier.enabled) + '"'));
}
break;
case "phase":
if (modifierPhases.indexOf(modifier.phase) < 0) {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(", "), '"' + String(modifier.phase) + '"'));
}
break;
case "fn":
if (typeof modifier.fn !== "function") {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', '"' + String(modifier.fn) + '"'));
}
break;
case "effect":
if (modifier.effect != null && typeof modifier.effect !== "function") {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', '"' + String(modifier.fn) + '"'));
}
break;
case "requires":
if (modifier.requires != null && !Array.isArray(modifier.requires)) {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', '"' + String(modifier.requires) + '"'));
}
break;
case "requiresIfExists":
if (!Array.isArray(modifier.requiresIfExists)) {
console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', '"' + String(modifier.requiresIfExists) + '"'));
}
break;
case "options":
case "data":
break;
default:
console.error('PopperJS: an invalid property has been provided to the "' + modifier.name + '" modifier, valid properties are ' + VALID_PROPERTIES.map(function(s) {
return '"' + s + '"';
}).join(", ") + '; but "' + key + '" was provided.');
}
modifier.requires && modifier.requires.forEach(function(requirement) {
if (modifiers.find(function(mod) {
return mod.name === requirement;
}) == null) {
console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement));
}
});
});
});
}
// node_modules/@popperjs/core/lib/utils/uniqueBy.js
function uniqueBy(arr, fn2) {
var identifiers = /* @__PURE__ */ new Set();
return arr.filter(function(item) {
var identifier = fn2(item);
if (!identifiers.has(identifier)) {
identifiers.add(identifier);
return true;
}
});
}
// node_modules/@popperjs/core/lib/utils/mergeByName.js
function mergeByName(modifiers) {
var merged = modifiers.reduce(function(merged2, current) {
var existing = merged2[current.name];
merged2[current.name] = existing ? Object.assign({}, existing, current, {
options: Object.assign({}, existing.options, current.options),
data: Object.assign({}, existing.data, current.data)
}) : current;
return merged2;
}, {});
return Object.keys(merged).map(function(key) {
return merged[key];
});
}
// node_modules/@popperjs/core/lib/createPopper.js
var INVALID_ELEMENT_ERROR = "Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.";
var INFINITE_LOOP_ERROR = "Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.";
var DEFAULT_OPTIONS = {
placement: "bottom",
modifiers: [],
strategy: "absolute"
};
function areValidElements() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return !args.some(function(element) {
return !(element && typeof element.getBoundingClientRect === "function");
});
}
function popperGenerator(generatorOptions) {
if (generatorOptions === void 0) {
generatorOptions = {};
}
var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers3 = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;
return function createPopper4(reference2, popper2, options) {
if (options === void 0) {
options = defaultOptions;
}
var state = {
placement: "bottom",
orderedModifiers: [],
options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),
modifiersData: {},
elements: {
reference: reference2,
popper: popper2
},
attributes: {},
styles: {}
};
var effectCleanupFns = [];
var isDestroyed = false;
var instance = {
state,
setOptions: function setOptions(setOptionsAction) {
var options2 = typeof setOptionsAction === "function" ? setOptionsAction(state.options) : setOptionsAction;
cleanupModifierEffects();
state.options = Object.assign({}, defaultOptions, state.options, options2);
state.scrollParents = {
reference: isElement(reference2) ? listScrollParents(reference2) : reference2.contextElement ? listScrollParents(reference2.contextElement) : [],
popper: listScrollParents(popper2)
};
var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers3, state.options.modifiers)));
state.orderedModifiers = orderedModifiers.filter(function(m) {
return m.enabled;
});
if (true) {
var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function(_ref) {
var name = _ref.name;
return name;
});
validateModifiers(modifiers);
if (getBasePlacement(state.options.placement) === auto) {
var flipModifier = state.orderedModifiers.find(function(_ref2) {
var name = _ref2.name;
return name === "flip";
});
if (!flipModifier) {
console.error(['Popper: "auto" placements require the "flip" modifier be', "present and enabled to work."].join(" "));
}
}
var _getComputedStyle = getComputedStyle2(popper2), marginTop = _getComputedStyle.marginTop, marginRight = _getComputedStyle.marginRight, marginBottom = _getComputedStyle.marginBottom, marginLeft = _getComputedStyle.marginLeft;
if ([marginTop, marginRight, marginBottom, marginLeft].some(function(margin) {
return parseFloat(margin);
})) {
console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', "between the popper and its reference element or boundary.", "To replicate margin, use the `offset` modifier, as well as", "the `padding` option in the `preventOverflow` and `flip`", "modifiers."].join(" "));
}
}
runModifierEffects();
return instance.update();
},
forceUpdate: function forceUpdate() {
if (isDestroyed) {
return;
}
var _state$elements = state.elements, reference3 = _state$elements.reference, popper3 = _state$elements.popper;
if (!areValidElements(reference3, popper3)) {
if (true) {
console.error(INVALID_ELEMENT_ERROR);
}
return;
}
state.rects = {
reference: getCompositeRect(reference3, getOffsetParent(popper3), state.options.strategy === "fixed"),
popper: getLayoutRect(popper3)
};
state.reset = false;
state.placement = state.options.placement;
state.orderedModifiers.forEach(function(modifier) {
return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);
});
var __debug_loops__ = 0;
for (var index = 0; index < state.orderedModifiers.length; index++) {
if (true) {
__debug_loops__ += 1;
if (__debug_loops__ > 100) {
console.error(INFINITE_LOOP_ERROR);
break;
}
}
if (state.reset === true) {
state.reset = false;
index = -1;
continue;
}
var _state$orderedModifie = state.orderedModifiers[index], fn2 = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name;
if (typeof fn2 === "function") {
state = fn2({
state,
options: _options,
name,
instance
}) || state;
}
}
},
update: debounce(function() {
return new Promise(function(resolve) {
instance.forceUpdate();
resolve(state);
});
}),
destroy: function destroy() {
cleanupModifierEffects();
isDestroyed = true;
}
};
if (!areValidElements(reference2, popper2)) {
if (true) {
console.error(INVALID_ELEMENT_ERROR);
}
return instance;
}
instance.setOptions(options).then(function(state2) {
if (!isDestroyed && options.onFirstUpdate) {
options.onFirstUpdate(state2);
}
});
function runModifierEffects() {
state.orderedModifiers.forEach(function(_ref3) {
var name = _ref3.name, _ref3$options = _ref3.options, options2 = _ref3$options === void 0 ? {} : _ref3$options, effect4 = _ref3.effect;
if (typeof effect4 === "function") {
var cleanupFn = effect4({
state,
name,
instance,
options: options2
});
var noopFn = function noopFn2() {
};
effectCleanupFns.push(cleanupFn || noopFn);
}
});
}
function cleanupModifierEffects() {
effectCleanupFns.forEach(function(fn2) {
return fn2();
});
effectCleanupFns = [];
}
return instance;
};
}
var createPopper = /* @__PURE__ */ popperGenerator();
// node_modules/@popperjs/core/lib/popper-lite.js
var defaultModifiers = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default];
var createPopper2 = /* @__PURE__ */ popperGenerator({
defaultModifiers
});
// node_modules/@popperjs/core/lib/popper.js
var defaultModifiers2 = [eventListeners_default, popperOffsets_default, computeStyles_default, applyStyles_default, offset_default, flip_default, preventOverflow_default, arrow_default, hide_default];
var createPopper3 = /* @__PURE__ */ popperGenerator({
defaultModifiers: defaultModifiers2
});
// node_modules/bootstrap/dist/js/bootstrap.esm.js
var MAX_UID = 1e6;
var MILLISECONDS_MULTIPLIER = 1e3;
var TRANSITION_END = "transitionend";
var toType = (object) => {
if (object === null || object === void 0) {
return `${object}`;
}
return Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase();
};
var getUID = (prefix) => {
do {
prefix += Math.floor(Math.random() * MAX_UID);
} while (document.getElementById(prefix));
return prefix;
};
var getSelector = (element) => {
let selector = element.getAttribute("data-bs-target");
if (!selector || selector === "#") {
let hrefAttribute = element.getAttribute("href");
if (!hrefAttribute || !hrefAttribute.includes("#") && !hrefAttribute.startsWith(".")) {
return null;
}
if (hrefAttribute.includes("#") && !hrefAttribute.startsWith("#")) {
hrefAttribute = `#${hrefAttribute.split("#")[1]}`;
}
selector = hrefAttribute && hrefAttribute !== "#" ? hrefAttribute.trim() : null;
}
return selector;
};
var getSelectorFromElement = (element) => {
const selector = getSelector(element);
if (selector) {
return document.querySelector(selector) ? selector : null;
}
return null;
};
var getElementFromSelector = (element) => {
const selector = getSelector(element);
return selector ? document.querySelector(selector) : null;
};
var getTransitionDurationFromElement = (element) => {
if (!element) {
return 0;
}
let {
transitionDuration,
transitionDelay
} = window.getComputedStyle(element);
const floatTransitionDuration = Number.parseFloat(transitionDuration);
const floatTransitionDelay = Number.parseFloat(transitionDelay);
if (!floatTransitionDuration && !floatTransitionDelay) {
return 0;
}
transitionDuration = transitionDuration.split(",")[0];
transitionDelay = transitionDelay.split(",")[0];
return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;
};
var triggerTransitionEnd = (element) => {
element.dispatchEvent(new Event(TRANSITION_END));
};
var isElement2 = (object) => {
if (!object || typeof object !== "object") {
return false;
}
if (typeof object.jquery !== "undefined") {
object = object[0];
}
return typeof object.nodeType !== "undefined";
};
var getElement = (object) => {
if (isElement2(object)) {
return object.jquery ? object[0] : object;
}
if (typeof object === "string" && object.length > 0) {
return document.querySelector(object);
}
return null;
};
var isVisible = (element) => {
if (!isElement2(element) || element.getClientRects().length === 0) {
return false;
}
const elementIsVisible = getComputedStyle(element).getPropertyValue("visibility") === "visible";
const closedDetails = element.closest("details:not([open])");
if (!closedDetails) {
return elementIsVisible;
}
if (closedDetails !== element) {
const summary = element.closest("summary");
if (summary && summary.parentNode !== closedDetails) {
return false;
}
if (summary === null) {
return false;
}
}
return elementIsVisible;
};
var isDisabled = (element) => {
if (!element || element.nodeType !== Node.ELEMENT_NODE) {
return true;
}
if (element.classList.contains("disabled")) {
return true;
}
if (typeof element.disabled !== "undefined") {
return element.disabled;
}
return element.hasAttribute("disabled") && element.getAttribute("disabled") !== "false";
};
var findShadowRoot = (element) => {
if (!document.documentElement.attachShadow) {
return null;
}
if (typeof element.getRootNode === "function") {
const root = element.getRootNode();
return root instanceof ShadowRoot ? root : null;
}
if (element instanceof ShadowRoot) {
return element;
}
if (!element.parentNode) {
return null;
}
return findShadowRoot(element.parentNode);
};
var noop = () => {
};
var reflow = (element) => {
element.offsetHeight;
};
var getjQuery = () => {
if (window.jQuery && !document.body.hasAttribute("data-bs-no-jquery")) {
return window.jQuery;
}
return null;
};
var DOMContentLoadedCallbacks = [];
var onDOMContentLoaded = (callback) => {
if (document.readyState === "loading") {
if (!DOMContentLoadedCallbacks.length) {
document.addEventListener("DOMContentLoaded", () => {
for (const callback2 of DOMContentLoadedCallbacks) {
callback2();
}
});
}
DOMContentLoadedCallbacks.push(callback);
} else {
callback();
}
};
var isRTL = () => document.documentElement.dir === "rtl";
var defineJQueryPlugin = (plugin) => {
onDOMContentLoaded(() => {
const $4 = getjQuery();
if ($4) {
const name = plugin.NAME;
const JQUERY_NO_CONFLICT = $4.fn[name];
$4.fn[name] = plugin.jQueryInterface;
$4.fn[name].Constructor = plugin;
$4.fn[name].noConflict = () => {
$4.fn[name] = JQUERY_NO_CONFLICT;
return plugin.jQueryInterface;
};
}
});
};
var execute = (callback) => {
if (typeof callback === "function") {
callback();
}
};
var executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {
if (!waitForTransition) {
execute(callback);
return;
}
const durationPadding = 5;
const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;
let called = false;
const handler = ({
target
}) => {
if (target !== transitionElement) {
return;
}
called = true;
transitionElement.removeEventListener(TRANSITION_END, handler);
execute(callback);
};
transitionElement.addEventListener(TRANSITION_END, handler);
setTimeout(() => {
if (!called) {
triggerTransitionEnd(transitionElement);
}
}, emulatedDuration);
};
var getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {
const listLength = list.length;
let index = list.indexOf(activeElement);
if (index === -1) {
return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];
}
index += shouldGetNext ? 1 : -1;
if (isCycleAllowed) {
index = (index + listLength) % listLength;
}
return list[Math.max(0, Math.min(index, listLength - 1))];
};
var namespaceRegex = /[^.]*(?=\..*)\.|.*/;
var stripNameRegex = /\..*/;
var stripUidRegex = /::\d+$/;
var eventRegistry = {};
var uidEvent = 1;
var customEvents = {
mouseenter: "mouseover",
mouseleave: "mouseout"
};
var nativeEvents = /* @__PURE__ */ new Set(["click", "dblclick", "mouseup", "mousedown", "contextmenu", "mousewheel", "DOMMouseScroll", "mouseover", "mouseout", "mousemove", "selectstart", "selectend", "keydown", "keypress", "keyup", "orientationchange", "touchstart", "touchmove", "touchend", "touchcancel", "pointerdown", "pointermove", "pointerup", "pointerleave", "pointercancel", "gesturestart", "gesturechange", "gestureend", "focus", "blur", "change", "reset", "select", "submit", "focusin", "focusout", "load", "unload", "beforeunload", "resize", "move", "DOMContentLoaded", "readystatechange", "error", "abort", "scroll"]);
function makeEventUid(element, uid) {
return uid && `${uid}::${uidEvent++}` || element.uidEvent || uidEvent++;
}
function getElementEvents(element) {
const uid = makeEventUid(element);
element.uidEvent = uid;
eventRegistry[uid] = eventRegistry[uid] || {};
return eventRegistry[uid];
}
function bootstrapHandler(element, fn2) {
return function handler(event) {
hydrateObj(event, {
delegateTarget: element
});
if (handler.oneOff) {
EventHandler.off(element, event.type, fn2);
}
return fn2.apply(element, [event]);
};
}
function bootstrapDelegationHandler(element, selector, fn2) {
return function handler(event) {
const domElements = element.querySelectorAll(selector);
for (let {
target
} = event; target && target !== this; target = target.parentNode) {
for (const domElement of domElements) {
if (domElement !== target) {
continue;
}
hydrateObj(event, {
delegateTarget: target
});
if (handler.oneOff) {
EventHandler.off(element, event.type, selector, fn2);
}
return fn2.apply(target, [event]);
}
}
};
}
function findHandler(events, callable, delegationSelector = null) {
return Object.values(events).find((event) => event.callable === callable && event.delegationSelector === delegationSelector);
}
function normalizeParameters(originalTypeEvent, handler, delegationFunction) {
const isDelegated = typeof handler === "string";
const callable = isDelegated ? delegationFunction : handler || delegationFunction;
let typeEvent = getTypeEvent(originalTypeEvent);
if (!nativeEvents.has(typeEvent)) {
typeEvent = originalTypeEvent;
}
return [isDelegated, callable, typeEvent];
}
function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {
if (typeof originalTypeEvent !== "string" || !element) {
return;
}
let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
if (originalTypeEvent in customEvents) {
const wrapFunction = (fn3) => {
return function(event) {
if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {
return fn3.call(this, event);
}
};
};
callable = wrapFunction(callable);
}
const events = getElementEvents(element);
const handlers = events[typeEvent] || (events[typeEvent] = {});
const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);
if (previousFunction) {
previousFunction.oneOff = previousFunction.oneOff && oneOff;
return;
}
const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ""));
const fn2 = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);
fn2.delegationSelector = isDelegated ? handler : null;
fn2.callable = callable;
fn2.oneOff = oneOff;
fn2.uidEvent = uid;
handlers[uid] = fn2;
element.addEventListener(typeEvent, fn2, isDelegated);
}
function removeHandler(element, events, typeEvent, handler, delegationSelector) {
const fn2 = findHandler(events[typeEvent], handler, delegationSelector);
if (!fn2) {
return;
}
element.removeEventListener(typeEvent, fn2, Boolean(delegationSelector));
delete events[typeEvent][fn2.uidEvent];
}
function removeNamespacedHandlers(element, events, typeEvent, namespace) {
const storeElementEvent = events[typeEvent] || {};
for (const handlerKey of Object.keys(storeElementEvent)) {
if (handlerKey.includes(namespace)) {
const event = storeElementEvent[handlerKey];
removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
}
}
}
function getTypeEvent(event) {
event = event.replace(stripNameRegex, "");
return customEvents[event] || event;
}
var EventHandler = {
on(element, event, handler, delegationFunction) {
addHandler(element, event, handler, delegationFunction, false);
},
one(element, event, handler, delegationFunction) {
addHandler(element, event, handler, delegationFunction, true);
},
off(element, originalTypeEvent, handler, delegationFunction) {
if (typeof originalTypeEvent !== "string" || !element) {
return;
}
const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);
const inNamespace = typeEvent !== originalTypeEvent;
const events = getElementEvents(element);
const storeElementEvent = events[typeEvent] || {};
const isNamespace = originalTypeEvent.startsWith(".");
if (typeof callable !== "undefined") {
if (!Object.keys(storeElementEvent).length) {
return;
}
removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);
return;
}
if (isNamespace) {
for (const elementEvent of Object.keys(events)) {
removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));
}
}
for (const keyHandlers of Object.keys(storeElementEvent)) {
const handlerKey = keyHandlers.replace(stripUidRegex, "");
if (!inNamespace || originalTypeEvent.includes(handlerKey)) {
const event = storeElementEvent[keyHandlers];
removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);
}
}
},
trigger(element, event, args) {
if (typeof event !== "string" || !element) {
return null;
}
const $4 = getjQuery();
const typeEvent = getTypeEvent(event);
const inNamespace = event !== typeEvent;
let jQueryEvent = null;
let bubbles = true;
let nativeDispatch = true;
let defaultPrevented = false;
if (inNamespace && $4) {
jQueryEvent = $4.Event(event, args);
$4(element).trigger(jQueryEvent);
bubbles = !jQueryEvent.isPropagationStopped();
nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();
defaultPrevented = jQueryEvent.isDefaultPrevented();
}
let evt = new Event(event, {
bubbles,
cancelable: true
});
evt = hydrateObj(evt, args);
if (defaultPrevented) {
evt.preventDefault();
}
if (nativeDispatch) {
element.dispatchEvent(evt);
}
if (evt.defaultPrevented && jQueryEvent) {
jQueryEvent.preventDefault();
}
return evt;
}
};
function hydrateObj(obj, meta) {
for (const [key, value] of Object.entries(meta || {})) {
try {
obj[key] = value;
} catch (_unused) {
Object.defineProperty(obj, key, {
configurable: true,
get() {
return value;
}
});
}
}
return obj;
}
var elementMap = /* @__PURE__ */ new Map();
var Data = {
set(element, key, instance) {
if (!elementMap.has(element)) {
elementMap.set(element, /* @__PURE__ */ new Map());
}
const instanceMap = elementMap.get(element);
if (!instanceMap.has(key) && instanceMap.size !== 0) {
console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);
return;
}
instanceMap.set(key, instance);
},
get(element, key) {
if (elementMap.has(element)) {
return elementMap.get(element).get(key) || null;
}
return null;
},
remove(element, key) {
if (!elementMap.has(element)) {
return;
}
const instanceMap = elementMap.get(element);
instanceMap.delete(key);
if (instanceMap.size === 0) {
elementMap.delete(element);
}
}
};
function normalizeData(value) {
if (value === "true") {
return true;
}
if (value === "false") {
return false;
}
if (value === Number(value).toString()) {
return Number(value);
}
if (value === "" || value === "null") {
return null;
}
if (typeof value !== "string") {
return value;
}
try {
return JSON.parse(decodeURIComponent(value));
} catch (_unused) {
return value;
}
}
function normalizeDataKey(key) {
return key.replace(/[A-Z]/g, (chr) => `-${chr.toLowerCase()}`);
}
var Manipulator = {
setDataAttribute(element, key, value) {
element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);
},
removeDataAttribute(element, key) {
element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);
},
getDataAttributes(element) {
if (!element) {
return {};
}
const attributes = {};
const bsKeys = Object.keys(element.dataset).filter((key) => key.startsWith("bs") && !key.startsWith("bsConfig"));
for (const key of bsKeys) {
let pureKey = key.replace(/^bs/, "");
pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);
attributes[pureKey] = normalizeData(element.dataset[key]);
}
return attributes;
},
getDataAttribute(element, key) {
return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));
}
};
var Config = class {
static get Default() {
return {};
}
static get DefaultType() {
return {};
}
static get NAME() {
throw new Error('You have to implement the static method "NAME", for each component!');
}
_getConfig(config) {
config = this._mergeConfigObj(config);
config = this._configAfterMerge(config);
this._typeCheckConfig(config);
return config;
}
_configAfterMerge(config) {
return config;
}
_mergeConfigObj(config, element) {
const jsonConfig = isElement2(element) ? Manipulator.getDataAttribute(element, "config") : {};
return __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, this.constructor.Default), typeof jsonConfig === "object" ? jsonConfig : {}), isElement2(element) ? Manipulator.getDataAttributes(element) : {}), typeof config === "object" ? config : {});
}
_typeCheckConfig(config, configTypes = this.constructor.DefaultType) {
for (const property of Object.keys(configTypes)) {
const expectedTypes = configTypes[property];
const value = config[property];
const valueType = isElement2(value) ? "element" : toType(value);
if (!new RegExp(expectedTypes).test(valueType)) {
throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`);
}
}
}
};
var VERSION = "5.2.3";
var BaseComponent = class extends Config {
constructor(element, config) {
super();
element = getElement(element);
if (!element) {
return;
}
this._element = element;
this._config = this._getConfig(config);
Data.set(this._element, this.constructor.DATA_KEY, this);
}
dispose() {
Data.remove(this._element, this.constructor.DATA_KEY);
EventHandler.off(this._element, this.constructor.EVENT_KEY);
for (const propertyName of Object.getOwnPropertyNames(this)) {
this[propertyName] = null;
}
}
_queueCallback(callback, element, isAnimated = true) {
executeAfterTransition(callback, element, isAnimated);
}
_getConfig(config) {
config = this._mergeConfigObj(config, this._element);
config = this._configAfterMerge(config);
this._typeCheckConfig(config);
return config;
}
static getInstance(element) {
return Data.get(getElement(element), this.DATA_KEY);
}
static getOrCreateInstance(element, config = {}) {
return this.getInstance(element) || new this(element, typeof config === "object" ? config : null);
}
static get VERSION() {
return VERSION;
}
static get DATA_KEY() {
return `bs.${this.NAME}`;
}
static get EVENT_KEY() {
return `.${this.DATA_KEY}`;
}
static eventName(name) {
return `${name}${this.EVENT_KEY}`;
}
};
var enableDismissTrigger = (component, method = "hide") => {
const clickEvent = `click.dismiss${component.EVENT_KEY}`;
const name = component.NAME;
EventHandler.on(document, clickEvent, `[data-bs-dismiss="${name}"]`, function(event) {
if (["A", "AREA"].includes(this.tagName)) {
event.preventDefault();
}
if (isDisabled(this)) {
return;
}
const target = getElementFromSelector(this) || this.closest(`.${name}`);
const instance = component.getOrCreateInstance(target);
instance[method]();
});
};
var NAME$f = "alert";
var DATA_KEY$a = "bs.alert";
var EVENT_KEY$b = `.${DATA_KEY$a}`;
var EVENT_CLOSE = `close${EVENT_KEY$b}`;
var EVENT_CLOSED = `closed${EVENT_KEY$b}`;
var CLASS_NAME_FADE$5 = "fade";
var CLASS_NAME_SHOW$8 = "show";
var Alert = class extends BaseComponent {
static get NAME() {
return NAME$f;
}
close() {
const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE);
if (closeEvent.defaultPrevented) {
return;
}
this._element.classList.remove(CLASS_NAME_SHOW$8);
const isAnimated = this._element.classList.contains(CLASS_NAME_FADE$5);
this._queueCallback(() => this._destroyElement(), this._element, isAnimated);
}
_destroyElement() {
this._element.remove();
EventHandler.trigger(this._element, EVENT_CLOSED);
this.dispose();
}
static jQueryInterface(config) {
return this.each(function() {
const data = Alert.getOrCreateInstance(this);
if (typeof config !== "string") {
return;
}
if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
throw new TypeError(`No method named "${config}"`);
}
data[config](this);
});
}
};
enableDismissTrigger(Alert, "close");
defineJQueryPlugin(Alert);
var NAME$e = "button";
var DATA_KEY$9 = "bs.button";
var EVENT_KEY$a = `.${DATA_KEY$9}`;
var DATA_API_KEY$6 = ".data-api";
var CLASS_NAME_ACTIVE$3 = "active";
var SELECTOR_DATA_TOGGLE$5 = '[data-bs-toggle="button"]';
var EVENT_CLICK_DATA_API$6 = `click${EVENT_KEY$a}${DATA_API_KEY$6}`;
var Button = class extends BaseComponent {
static get NAME() {
return NAME$e;
}
toggle() {
this._element.setAttribute("aria-pressed", this._element.classList.toggle(CLASS_NAME_ACTIVE$3));
}
static jQueryInterface(config) {
return this.each(function() {
const data = Button.getOrCreateInstance(this);
if (config === "toggle") {
data[config]();
}
});
}
};
EventHandler.on(document, EVENT_CLICK_DATA_API$6, SELECTOR_DATA_TOGGLE$5, (event) => {
event.preventDefault();
const button = event.target.closest(SELECTOR_DATA_TOGGLE$5);
const data = Button.getOrCreateInstance(button);
data.toggle();
});
defineJQueryPlugin(Button);
var SelectorEngine = {
find(selector, element = document.documentElement) {
return [].concat(...Element.prototype.querySelectorAll.call(element, selector));
},
findOne(selector, element = document.documentElement) {
return Element.prototype.querySelector.call(element, selector);
},
children(element, selector) {
return [].concat(...element.children).filter((child) => child.matches(selector));
},
parents(element, selector) {
const parents = [];
let ancestor = element.parentNode.closest(selector);
while (ancestor) {
parents.push(ancestor);
ancestor = ancestor.parentNode.closest(selector);
}
return parents;
},
prev(element, selector) {
let previous = element.previousElementSibling;
while (previous) {
if (previous.matches(selector)) {
return [previous];
}
previous = previous.previousElementSibling;
}
return [];
},
next(element, selector) {
let next = element.nextElementSibling;
while (next) {
if (next.matches(selector)) {
return [next];
}
next = next.nextElementSibling;
}
return [];
},
focusableChildren(element) {
const focusables = ["a", "button", "input", "textarea", "select", "details", "[tabindex]", '[contenteditable="true"]'].map((selector) => `${selector}:not([tabindex^="-"])`).join(",");
return this.find(focusables, element).filter((el) => !isDisabled(el) && isVisible(el));
}
};
var NAME$d = "swipe";
var EVENT_KEY$9 = ".bs.swipe";
var EVENT_TOUCHSTART = `touchstart${EVENT_KEY$9}`;
var EVENT_TOUCHMOVE = `touchmove${EVENT_KEY$9}`;
var EVENT_TOUCHEND = `touchend${EVENT_KEY$9}`;
var EVENT_POINTERDOWN = `pointerdown${EVENT_KEY$9}`;
var EVENT_POINTERUP = `pointerup${EVENT_KEY$9}`;
var POINTER_TYPE_TOUCH = "touch";
var POINTER_TYPE_PEN = "pen";
var CLASS_NAME_POINTER_EVENT = "pointer-event";
var SWIPE_THRESHOLD = 40;
var Default$c = {
endCallback: null,
leftCallback: null,
rightCallback: null
};
var DefaultType$c = {
endCallback: "(function|null)",
leftCallback: "(function|null)",
rightCallback: "(function|null)"
};
var Swipe = class extends Config {
constructor(element, config) {
super();
this._element = element;
if (!element || !Swipe.isSupported()) {
return;
}
this._config = this._getConfig(config);
this._deltaX = 0;
this._supportPointerEvents = Boolean(window.PointerEvent);
this._initEvents();
}
static get Default() {
return Default$c;
}
static get DefaultType() {
return DefaultType$c;
}
static get NAME() {
return NAME$d;
}
dispose() {
EventHandler.off(this._element, EVENT_KEY$9);
}
_start(event) {
if (!this._supportPointerEvents) {
this._deltaX = event.touches[0].clientX;
return;
}
if (this._eventIsPointerPenTouch(event)) {
this._deltaX = event.clientX;
}
}
_end(event) {
if (this._eventIsPointerPenTouch(event)) {
this._deltaX = event.clientX - this._deltaX;
}
this._handleSwipe();
execute(this._config.endCallback);
}
_move(event) {
this._deltaX = event.touches && event.touches.length > 1 ? 0 : event.touches[0].clientX - this._deltaX;
}
_handleSwipe() {
const absDeltaX = Math.abs(this._deltaX);
if (absDeltaX <= SWIPE_THRESHOLD) {
return;
}
const direction = absDeltaX / this._deltaX;
this._deltaX = 0;
if (!direction) {
return;
}
execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback);
}
_initEvents() {
if (this._supportPointerEvents) {
EventHandler.on(this._element, EVENT_POINTERDOWN, (event) => this._start(event));
EventHandler.on(this._element, EVENT_POINTERUP, (event) => this._end(event));
this._element.classList.add(CLASS_NAME_POINTER_EVENT);
} else {
EventHandler.on(this._element, EVENT_TOUCHSTART, (event) => this._start(event));
EventHandler.on(this._element, EVENT_TOUCHMOVE, (event) => this._move(event));
EventHandler.on(this._element, EVENT_TOUCHEND, (event) => this._end(event));
}
}
_eventIsPointerPenTouch(event) {
return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH);
}
static isSupported() {
return "ontouchstart" in document.documentElement || navigator.maxTouchPoints > 0;
}
};
var NAME$c = "carousel";
var DATA_KEY$8 = "bs.carousel";
var EVENT_KEY$8 = `.${DATA_KEY$8}`;
var DATA_API_KEY$5 = ".data-api";
var ARROW_LEFT_KEY$1 = "ArrowLeft";
var ARROW_RIGHT_KEY$1 = "ArrowRight";
var TOUCHEVENT_COMPAT_WAIT = 500;
var ORDER_NEXT = "next";
var ORDER_PREV = "prev";
var DIRECTION_LEFT = "left";
var DIRECTION_RIGHT = "right";
var EVENT_SLIDE = `slide${EVENT_KEY$8}`;
var EVENT_SLID = `slid${EVENT_KEY$8}`;
var EVENT_KEYDOWN$1 = `keydown${EVENT_KEY$8}`;
var EVENT_MOUSEENTER$1 = `mouseenter${EVENT_KEY$8}`;
var EVENT_MOUSELEAVE$1 = `mouseleave${EVENT_KEY$8}`;
var EVENT_DRAG_START = `dragstart${EVENT_KEY$8}`;
var EVENT_LOAD_DATA_API$3 = `load${EVENT_KEY$8}${DATA_API_KEY$5}`;
var EVENT_CLICK_DATA_API$5 = `click${EVENT_KEY$8}${DATA_API_KEY$5}`;
var CLASS_NAME_CAROUSEL = "carousel";
var CLASS_NAME_ACTIVE$2 = "active";
var CLASS_NAME_SLIDE = "slide";
var CLASS_NAME_END = "carousel-item-end";
var CLASS_NAME_START = "carousel-item-start";
var CLASS_NAME_NEXT = "carousel-item-next";
var CLASS_NAME_PREV = "carousel-item-prev";
var SELECTOR_ACTIVE = ".active";
var SELECTOR_ITEM = ".carousel-item";
var SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM;
var SELECTOR_ITEM_IMG = ".carousel-item img";
var SELECTOR_INDICATORS = ".carousel-indicators";
var SELECTOR_DATA_SLIDE = "[data-bs-slide], [data-bs-slide-to]";
var SELECTOR_DATA_RIDE = '[data-bs-ride="carousel"]';
var KEY_TO_DIRECTION = {
[ARROW_LEFT_KEY$1]: DIRECTION_RIGHT,
[ARROW_RIGHT_KEY$1]: DIRECTION_LEFT
};
var Default$b = {
interval: 5e3,
keyboard: true,
pause: "hover",
ride: false,
touch: true,
wrap: true
};
var DefaultType$b = {
interval: "(number|boolean)",
keyboard: "boolean",
pause: "(string|boolean)",
ride: "(boolean|string)",
touch: "boolean",
wrap: "boolean"
};
var Carousel = class extends BaseComponent {
constructor(element, config) {
super(element, config);
this._interval = null;
this._activeElement = null;
this._isSliding = false;
this.touchTimeout = null;
this._swipeHelper = null;
this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element);
this._addEventListeners();
if (this._config.ride === CLASS_NAME_CAROUSEL) {
this.cycle();
}
}
static get Default() {
return Default$b;
}
static get DefaultType() {
return DefaultType$b;
}
static get NAME() {
return NAME$c;
}
next() {
this._slide(ORDER_NEXT);
}
nextWhenVisible() {
if (!document.hidden && isVisible(this._element)) {
this.next();
}
}
prev() {
this._slide(ORDER_PREV);
}
pause() {
if (this._isSliding) {
triggerTransitionEnd(this._element);
}
this._clearInterval();
}
cycle() {
this._clearInterval();
this._updateInterval();
this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval);
}
_maybeEnableCycle() {
if (!this._config.ride) {
return;
}
if (this._isSliding) {
EventHandler.one(this._element, EVENT_SLID, () => this.cycle());
return;
}
this.cycle();
}
to(index) {
const items = this._getItems();
if (index > items.length - 1 || index < 0) {
return;
}
if (this._isSliding) {
EventHandler.one(this._element, EVENT_SLID, () => this.to(index));
return;
}
const activeIndex = this._getItemIndex(this._getActive());
if (activeIndex === index) {
return;
}
const order2 = index > activeIndex ? ORDER_NEXT : ORDER_PREV;
this._slide(order2, items[index]);
}
dispose() {
if (this._swipeHelper) {
this._swipeHelper.dispose();
}
super.dispose();
}
_configAfterMerge(config) {
config.defaultInterval = config.interval;
return config;
}
_addEventListeners() {
if (this._config.keyboard) {
EventHandler.on(this._element, EVENT_KEYDOWN$1, (event) => this._keydown(event));
}
if (this._config.pause === "hover") {
EventHandler.on(this._element, EVENT_MOUSEENTER$1, () => this.pause());
EventHandler.on(this._element, EVENT_MOUSELEAVE$1, () => this._maybeEnableCycle());
}
if (this._config.touch && Swipe.isSupported()) {
this._addTouchEventListeners();
}
}
_addTouchEventListeners() {
for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {
EventHandler.on(img, EVENT_DRAG_START, (event) => event.preventDefault());
}
const endCallBack = () => {
if (this._config.pause !== "hover") {
return;
}
this.pause();
if (this.touchTimeout) {
clearTimeout(this.touchTimeout);
}
this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval);
};
const swipeConfig = {
leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),
rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),
endCallback: endCallBack
};
this._swipeHelper = new Swipe(this._element, swipeConfig);
}
_keydown(event) {
if (/input|textarea/i.test(event.target.tagName)) {
return;
}
const direction = KEY_TO_DIRECTION[event.key];
if (direction) {
event.preventDefault();
this._slide(this._directionToOrder(direction));
}
}
_getItemIndex(element) {
return this._getItems().indexOf(element);
}
_setActiveIndicatorElement(index) {
if (!this._indicatorsElement) {
return;
}
const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement);
activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2);
activeIndicator.removeAttribute("aria-current");
const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to="${index}"]`, this._indicatorsElement);
if (newActiveIndicator) {
newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2);
newActiveIndicator.setAttribute("aria-current", "true");
}
}
_updateInterval() {
const element = this._activeElement || this._getActive();
if (!element) {
return;
}
const elementInterval = Number.parseInt(element.getAttribute("data-bs-interval"), 10);
this._config.interval = elementInterval || this._config.defaultInterval;
}
_slide(order2, element = null) {
if (this._isSliding) {
return;
}
const activeElement = this._getActive();
const isNext = order2 === ORDER_NEXT;
const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap);
if (nextElement === activeElement) {
return;
}
const nextElementIndex = this._getItemIndex(nextElement);
const triggerEvent = (eventName) => {
return EventHandler.trigger(this._element, eventName, {
relatedTarget: nextElement,
direction: this._orderToDirection(order2),
from: this._getItemIndex(activeElement),
to: nextElementIndex
});
};
const slideEvent = triggerEvent(EVENT_SLIDE);
if (slideEvent.defaultPrevented) {
return;
}
if (!activeElement || !nextElement) {
return;
}
const isCycling = Boolean(this._interval);
this.pause();
this._isSliding = true;
this._setActiveIndicatorElement(nextElementIndex);
this._activeElement = nextElement;
const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END;
const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV;
nextElement.classList.add(orderClassName);
reflow(nextElement);
activeElement.classList.add(directionalClassName);
nextElement.classList.add(directionalClassName);
const completeCallBack = () => {
nextElement.classList.remove(directionalClassName, orderClassName);
nextElement.classList.add(CLASS_NAME_ACTIVE$2);
activeElement.classList.remove(CLASS_NAME_ACTIVE$2, orderClassName, directionalClassName);
this._isSliding = false;
triggerEvent(EVENT_SLID);
};
this._queueCallback(completeCallBack, activeElement, this._isAnimated());
if (isCycling) {
this.cycle();
}
}
_isAnimated() {
return this._element.classList.contains(CLASS_NAME_SLIDE);
}
_getActive() {
return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element);
}
_getItems() {
return SelectorEngine.find(SELECTOR_ITEM, this._element);
}
_clearInterval() {
if (this._interval) {
clearInterval(this._interval);
this._interval = null;
}
}
_directionToOrder(direction) {
if (isRTL()) {
return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT;
}
return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV;
}
_orderToDirection(order2) {
if (isRTL()) {
return order2 === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT;
}
return order2 === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT;
}
static jQueryInterface(config) {
return this.each(function() {
const data = Carousel.getOrCreateInstance(this, config);
if (typeof config === "number") {
data.to(config);
return;
}
if (typeof config === "string") {
if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
throw new TypeError(`No method named "${config}"`);
}
data[config]();
}
});
}
};
EventHandler.on(document, EVENT_CLICK_DATA_API$5, SELECTOR_DATA_SLIDE, function(event) {
const target = getElementFromSelector(this);
if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {
return;
}
event.preventDefault();
const carousel = Carousel.getOrCreateInstance(target);
const slideIndex = this.getAttribute("data-bs-slide-to");
if (slideIndex) {
carousel.to(slideIndex);
carousel._maybeEnableCycle();
return;
}
if (Manipulator.getDataAttribute(this, "slide") === "next") {
carousel.next();
carousel._maybeEnableCycle();
return;
}
carousel.prev();
carousel._maybeEnableCycle();
});
EventHandler.on(window, EVENT_LOAD_DATA_API$3, () => {
const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE);
for (const carousel of carousels) {
Carousel.getOrCreateInstance(carousel);
}
});
defineJQueryPlugin(Carousel);
var NAME$b = "collapse";
var DATA_KEY$7 = "bs.collapse";
var EVENT_KEY$7 = `.${DATA_KEY$7}`;
var DATA_API_KEY$4 = ".data-api";
var EVENT_SHOW$6 = `show${EVENT_KEY$7}`;
var EVENT_SHOWN$6 = `shown${EVENT_KEY$7}`;
var EVENT_HIDE$6 = `hide${EVENT_KEY$7}`;
var EVENT_HIDDEN$6 = `hidden${EVENT_KEY$7}`;
var EVENT_CLICK_DATA_API$4 = `click${EVENT_KEY$7}${DATA_API_KEY$4}`;
var CLASS_NAME_SHOW$7 = "show";
var CLASS_NAME_COLLAPSE = "collapse";
var CLASS_NAME_COLLAPSING = "collapsing";
var CLASS_NAME_COLLAPSED = "collapsed";
var CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`;
var CLASS_NAME_HORIZONTAL = "collapse-horizontal";
var WIDTH = "width";
var HEIGHT = "height";
var SELECTOR_ACTIVES = ".collapse.show, .collapse.collapsing";
var SELECTOR_DATA_TOGGLE$4 = '[data-bs-toggle="collapse"]';
var Default$a = {
parent: null,
toggle: true
};
var DefaultType$a = {
parent: "(null|element)",
toggle: "boolean"
};
var Collapse = class extends BaseComponent {
constructor(element, config) {
super(element, config);
this._isTransitioning = false;
this._triggerArray = [];
const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);
for (const elem of toggleList) {
const selector = getSelectorFromElement(elem);
const filterElement = SelectorEngine.find(selector).filter((foundElement) => foundElement === this._element);
if (selector !== null && filterElement.length) {
this._triggerArray.push(elem);
}
}
this._initializeChildren();
if (!this._config.parent) {
this._addAriaAndCollapsedClass(this._triggerArray, this._isShown());
}
if (this._config.toggle) {
this.toggle();
}
}
static get Default() {
return Default$a;
}
static get DefaultType() {
return DefaultType$a;
}
static get NAME() {
return NAME$b;
}
toggle() {
if (this._isShown()) {
this.hide();
} else {
this.show();
}
}
show() {
if (this._isTransitioning || this._isShown()) {
return;
}
let activeChildren = [];
if (this._config.parent) {
activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES).filter((element) => element !== this._element).map((element) => Collapse.getOrCreateInstance(element, {
toggle: false
}));
}
if (activeChildren.length && activeChildren[0]._isTransitioning) {
return;
}
const startEvent = EventHandler.trigger(this._element, EVENT_SHOW$6);
if (startEvent.defaultPrevented) {
return;
}
for (const activeInstance of activeChildren) {
activeInstance.hide();
}
const dimension = this._getDimension();
this._element.classList.remove(CLASS_NAME_COLLAPSE);
this._element.classList.add(CLASS_NAME_COLLAPSING);
this._element.style[dimension] = 0;
this._addAriaAndCollapsedClass(this._triggerArray, true);
this._isTransitioning = true;
const complete = () => {
this._isTransitioning = false;
this._element.classList.remove(CLASS_NAME_COLLAPSING);
this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
this._element.style[dimension] = "";
EventHandler.trigger(this._element, EVENT_SHOWN$6);
};
const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1);
const scrollSize = `scroll${capitalizedDimension}`;
this._queueCallback(complete, this._element, true);
this._element.style[dimension] = `${this._element[scrollSize]}px`;
}
hide() {
if (this._isTransitioning || !this._isShown()) {
return;
}
const startEvent = EventHandler.trigger(this._element, EVENT_HIDE$6);
if (startEvent.defaultPrevented) {
return;
}
const dimension = this._getDimension();
this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`;
reflow(this._element);
this._element.classList.add(CLASS_NAME_COLLAPSING);
this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW$7);
for (const trigger of this._triggerArray) {
const element = getElementFromSelector(trigger);
if (element && !this._isShown(element)) {
this._addAriaAndCollapsedClass([trigger], false);
}
}
this._isTransitioning = true;
const complete = () => {
this._isTransitioning = false;
this._element.classList.remove(CLASS_NAME_COLLAPSING);
this._element.classList.add(CLASS_NAME_COLLAPSE);
EventHandler.trigger(this._element, EVENT_HIDDEN$6);
};
this._element.style[dimension] = "";
this._queueCallback(complete, this._element, true);
}
_isShown(element = this._element) {
return element.classList.contains(CLASS_NAME_SHOW$7);
}
_configAfterMerge(config) {
config.toggle = Boolean(config.toggle);
config.parent = getElement(config.parent);
return config;
}
_getDimension() {
return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT;
}
_initializeChildren() {
if (!this._config.parent) {
return;
}
const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);
for (const element of children) {
const selected = getElementFromSelector(element);
if (selected) {
this._addAriaAndCollapsedClass([element], this._isShown(selected));
}
}
}
_getFirstLevelChildren(selector) {
const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent);
return SelectorEngine.find(selector, this._config.parent).filter((element) => !children.includes(element));
}
_addAriaAndCollapsedClass(triggerArray, isOpen) {
if (!triggerArray.length) {
return;
}
for (const element of triggerArray) {
element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen);
element.setAttribute("aria-expanded", isOpen);
}
}
static jQueryInterface(config) {
const _config = {};
if (typeof config === "string" && /show|hide/.test(config)) {
_config.toggle = false;
}
return this.each(function() {
const data = Collapse.getOrCreateInstance(this, _config);
if (typeof config === "string") {
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config]();
}
});
}
};
EventHandler.on(document, EVENT_CLICK_DATA_API$4, SELECTOR_DATA_TOGGLE$4, function(event) {
if (event.target.tagName === "A" || event.delegateTarget && event.delegateTarget.tagName === "A") {
event.preventDefault();
}
const selector = getSelectorFromElement(this);
const selectorElements = SelectorEngine.find(selector);
for (const element of selectorElements) {
Collapse.getOrCreateInstance(element, {
toggle: false
}).toggle();
}
});
defineJQueryPlugin(Collapse);
var NAME$a = "dropdown";
var DATA_KEY$6 = "bs.dropdown";
var EVENT_KEY$6 = `.${DATA_KEY$6}`;
var DATA_API_KEY$3 = ".data-api";
var ESCAPE_KEY$2 = "Escape";
var TAB_KEY$1 = "Tab";
var ARROW_UP_KEY$1 = "ArrowUp";
var ARROW_DOWN_KEY$1 = "ArrowDown";
var RIGHT_MOUSE_BUTTON = 2;
var EVENT_HIDE$5 = `hide${EVENT_KEY$6}`;
var EVENT_HIDDEN$5 = `hidden${EVENT_KEY$6}`;
var EVENT_SHOW$5 = `show${EVENT_KEY$6}`;
var EVENT_SHOWN$5 = `shown${EVENT_KEY$6}`;
var EVENT_CLICK_DATA_API$3 = `click${EVENT_KEY$6}${DATA_API_KEY$3}`;
var EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY$6}${DATA_API_KEY$3}`;
var EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY$6}${DATA_API_KEY$3}`;
var CLASS_NAME_SHOW$6 = "show";
var CLASS_NAME_DROPUP = "dropup";
var CLASS_NAME_DROPEND = "dropend";
var CLASS_NAME_DROPSTART = "dropstart";
var CLASS_NAME_DROPUP_CENTER = "dropup-center";
var CLASS_NAME_DROPDOWN_CENTER = "dropdown-center";
var SELECTOR_DATA_TOGGLE$3 = '[data-bs-toggle="dropdown"]:not(.disabled):not(:disabled)';
var SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE$3}.${CLASS_NAME_SHOW$6}`;
var SELECTOR_MENU = ".dropdown-menu";
var SELECTOR_NAVBAR = ".navbar";
var SELECTOR_NAVBAR_NAV = ".navbar-nav";
var SELECTOR_VISIBLE_ITEMS = ".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)";
var PLACEMENT_TOP = isRTL() ? "top-end" : "top-start";
var PLACEMENT_TOPEND = isRTL() ? "top-start" : "top-end";
var PLACEMENT_BOTTOM = isRTL() ? "bottom-end" : "bottom-start";
var PLACEMENT_BOTTOMEND = isRTL() ? "bottom-start" : "bottom-end";
var PLACEMENT_RIGHT = isRTL() ? "left-start" : "right-start";
var PLACEMENT_LEFT = isRTL() ? "right-start" : "left-start";
var PLACEMENT_TOPCENTER = "top";
var PLACEMENT_BOTTOMCENTER = "bottom";
var Default$9 = {
autoClose: true,
boundary: "clippingParents",
display: "dynamic",
offset: [0, 2],
popperConfig: null,
reference: "toggle"
};
var DefaultType$9 = {
autoClose: "(boolean|string)",
boundary: "(string|element)",
display: "string",
offset: "(array|string|function)",
popperConfig: "(null|object|function)",
reference: "(string|element|object)"
};
var Dropdown = class extends BaseComponent {
constructor(element, config) {
super(element, config);
this._popper = null;
this._parent = this._element.parentNode;
this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] || SelectorEngine.prev(this._element, SELECTOR_MENU)[0] || SelectorEngine.findOne(SELECTOR_MENU, this._parent);
this._inNavbar = this._detectNavbar();
}
static get Default() {
return Default$9;
}
static get DefaultType() {
return DefaultType$9;
}
static get NAME() {
return NAME$a;
}
toggle() {
return this._isShown() ? this.hide() : this.show();
}
show() {
if (isDisabled(this._element) || this._isShown()) {
return;
}
const relatedTarget = {
relatedTarget: this._element
};
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$5, relatedTarget);
if (showEvent.defaultPrevented) {
return;
}
this._createPopper();
if ("ontouchstart" in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {
for (const element of [].concat(...document.body.children)) {
EventHandler.on(element, "mouseover", noop);
}
}
this._element.focus();
this._element.setAttribute("aria-expanded", true);
this._menu.classList.add(CLASS_NAME_SHOW$6);
this._element.classList.add(CLASS_NAME_SHOW$6);
EventHandler.trigger(this._element, EVENT_SHOWN$5, relatedTarget);
}
hide() {
if (isDisabled(this._element) || !this._isShown()) {
return;
}
const relatedTarget = {
relatedTarget: this._element
};
this._completeHide(relatedTarget);
}
dispose() {
if (this._popper) {
this._popper.destroy();
}
super.dispose();
}
update() {
this._inNavbar = this._detectNavbar();
if (this._popper) {
this._popper.update();
}
}
_completeHide(relatedTarget) {
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$5, relatedTarget);
if (hideEvent.defaultPrevented) {
return;
}
if ("ontouchstart" in document.documentElement) {
for (const element of [].concat(...document.body.children)) {
EventHandler.off(element, "mouseover", noop);
}
}
if (this._popper) {
this._popper.destroy();
}
this._menu.classList.remove(CLASS_NAME_SHOW$6);
this._element.classList.remove(CLASS_NAME_SHOW$6);
this._element.setAttribute("aria-expanded", "false");
Manipulator.removeDataAttribute(this._menu, "popper");
EventHandler.trigger(this._element, EVENT_HIDDEN$5, relatedTarget);
}
_getConfig(config) {
config = super._getConfig(config);
if (typeof config.reference === "object" && !isElement2(config.reference) && typeof config.reference.getBoundingClientRect !== "function") {
throw new TypeError(`${NAME$a.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.`);
}
return config;
}
_createPopper() {
if (typeof lib_exports === "undefined") {
throw new TypeError("Bootstrap's dropdowns require Popper (https://popper.js.org)");
}
let referenceElement = this._element;
if (this._config.reference === "parent") {
referenceElement = this._parent;
} else if (isElement2(this._config.reference)) {
referenceElement = getElement(this._config.reference);
} else if (typeof this._config.reference === "object") {
referenceElement = this._config.reference;
}
const popperConfig = this._getPopperConfig();
this._popper = createPopper3(referenceElement, this._menu, popperConfig);
}
_isShown() {
return this._menu.classList.contains(CLASS_NAME_SHOW$6);
}
_getPlacement() {
const parentDropdown = this._parent;
if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {
return PLACEMENT_RIGHT;
}
if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {
return PLACEMENT_LEFT;
}
if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {
return PLACEMENT_TOPCENTER;
}
if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {
return PLACEMENT_BOTTOMCENTER;
}
const isEnd = getComputedStyle(this._menu).getPropertyValue("--bs-position").trim() === "end";
if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {
return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP;
}
return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM;
}
_detectNavbar() {
return this._element.closest(SELECTOR_NAVBAR) !== null;
}
_getOffset() {
const {
offset: offset2
} = this._config;
if (typeof offset2 === "string") {
return offset2.split(",").map((value) => Number.parseInt(value, 10));
}
if (typeof offset2 === "function") {
return (popperData) => offset2(popperData, this._element);
}
return offset2;
}
_getPopperConfig() {
const defaultBsPopperConfig = {
placement: this._getPlacement(),
modifiers: [{
name: "preventOverflow",
options: {
boundary: this._config.boundary
}
}, {
name: "offset",
options: {
offset: this._getOffset()
}
}]
};
if (this._inNavbar || this._config.display === "static") {
Manipulator.setDataAttribute(this._menu, "popper", "static");
defaultBsPopperConfig.modifiers = [{
name: "applyStyles",
enabled: false
}];
}
return __spreadValues(__spreadValues({}, defaultBsPopperConfig), typeof this._config.popperConfig === "function" ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig);
}
_selectMenuItem({
key,
target
}) {
const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter((element) => isVisible(element));
if (!items.length) {
return;
}
getNextActiveElement(items, target, key === ARROW_DOWN_KEY$1, !items.includes(target)).focus();
}
static jQueryInterface(config) {
return this.each(function() {
const data = Dropdown.getOrCreateInstance(this, config);
if (typeof config !== "string") {
return;
}
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config]();
});
}
static clearMenus(event) {
if (event.button === RIGHT_MOUSE_BUTTON || event.type === "keyup" && event.key !== TAB_KEY$1) {
return;
}
const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);
for (const toggle of openToggles) {
const context = Dropdown.getInstance(toggle);
if (!context || context._config.autoClose === false) {
continue;
}
const composedPath = event.composedPath();
const isMenuTarget = composedPath.includes(context._menu);
if (composedPath.includes(context._element) || context._config.autoClose === "inside" && !isMenuTarget || context._config.autoClose === "outside" && isMenuTarget) {
continue;
}
if (context._menu.contains(event.target) && (event.type === "keyup" && event.key === TAB_KEY$1 || /input|select|option|textarea|form/i.test(event.target.tagName))) {
continue;
}
const relatedTarget = {
relatedTarget: context._element
};
if (event.type === "click") {
relatedTarget.clickEvent = event;
}
context._completeHide(relatedTarget);
}
}
static dataApiKeydownHandler(event) {
const isInput = /input|textarea/i.test(event.target.tagName);
const isEscapeEvent = event.key === ESCAPE_KEY$2;
const isUpOrDownEvent = [ARROW_UP_KEY$1, ARROW_DOWN_KEY$1].includes(event.key);
if (!isUpOrDownEvent && !isEscapeEvent) {
return;
}
if (isInput && !isEscapeEvent) {
return;
}
event.preventDefault();
const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE$3) ? this : SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.next(this, SELECTOR_DATA_TOGGLE$3)[0] || SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3, event.delegateTarget.parentNode);
const instance = Dropdown.getOrCreateInstance(getToggleButton);
if (isUpOrDownEvent) {
event.stopPropagation();
instance.show();
instance._selectMenuItem(event);
return;
}
if (instance._isShown()) {
event.stopPropagation();
instance.hide();
getToggleButton.focus();
}
}
};
EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE$3, Dropdown.dataApiKeydownHandler);
EventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler);
EventHandler.on(document, EVENT_CLICK_DATA_API$3, Dropdown.clearMenus);
EventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus);
EventHandler.on(document, EVENT_CLICK_DATA_API$3, SELECTOR_DATA_TOGGLE$3, function(event) {
event.preventDefault();
Dropdown.getOrCreateInstance(this).toggle();
});
defineJQueryPlugin(Dropdown);
var SELECTOR_FIXED_CONTENT = ".fixed-top, .fixed-bottom, .is-fixed, .sticky-top";
var SELECTOR_STICKY_CONTENT = ".sticky-top";
var PROPERTY_PADDING = "padding-right";
var PROPERTY_MARGIN = "margin-right";
var ScrollBarHelper = class {
constructor() {
this._element = document.body;
}
getWidth() {
const documentWidth = document.documentElement.clientWidth;
return Math.abs(window.innerWidth - documentWidth);
}
hide() {
const width = this.getWidth();
this._disableOverFlow();
this._setElementAttributes(this._element, PROPERTY_PADDING, (calculatedValue) => calculatedValue + width);
this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, (calculatedValue) => calculatedValue + width);
this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, (calculatedValue) => calculatedValue - width);
}
reset() {
this._resetElementAttributes(this._element, "overflow");
this._resetElementAttributes(this._element, PROPERTY_PADDING);
this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);
this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);
}
isOverflowing() {
return this.getWidth() > 0;
}
_disableOverFlow() {
this._saveInitialAttribute(this._element, "overflow");
this._element.style.overflow = "hidden";
}
_setElementAttributes(selector, styleProperty, callback) {
const scrollbarWidth = this.getWidth();
const manipulationCallBack = (element) => {
if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {
return;
}
this._saveInitialAttribute(element, styleProperty);
const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);
element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);
};
this._applyManipulationCallback(selector, manipulationCallBack);
}
_saveInitialAttribute(element, styleProperty) {
const actualValue = element.style.getPropertyValue(styleProperty);
if (actualValue) {
Manipulator.setDataAttribute(element, styleProperty, actualValue);
}
}
_resetElementAttributes(selector, styleProperty) {
const manipulationCallBack = (element) => {
const value = Manipulator.getDataAttribute(element, styleProperty);
if (value === null) {
element.style.removeProperty(styleProperty);
return;
}
Manipulator.removeDataAttribute(element, styleProperty);
element.style.setProperty(styleProperty, value);
};
this._applyManipulationCallback(selector, manipulationCallBack);
}
_applyManipulationCallback(selector, callBack) {
if (isElement2(selector)) {
callBack(selector);
return;
}
for (const sel of SelectorEngine.find(selector, this._element)) {
callBack(sel);
}
}
};
var NAME$9 = "backdrop";
var CLASS_NAME_FADE$4 = "fade";
var CLASS_NAME_SHOW$5 = "show";
var EVENT_MOUSEDOWN = `mousedown.bs.${NAME$9}`;
var Default$8 = {
className: "modal-backdrop",
clickCallback: null,
isAnimated: false,
isVisible: true,
rootElement: "body"
};
var DefaultType$8 = {
className: "string",
clickCallback: "(function|null)",
isAnimated: "boolean",
isVisible: "boolean",
rootElement: "(element|string)"
};
var Backdrop = class extends Config {
constructor(config) {
super();
this._config = this._getConfig(config);
this._isAppended = false;
this._element = null;
}
static get Default() {
return Default$8;
}
static get DefaultType() {
return DefaultType$8;
}
static get NAME() {
return NAME$9;
}
show(callback) {
if (!this._config.isVisible) {
execute(callback);
return;
}
this._append();
const element = this._getElement();
if (this._config.isAnimated) {
reflow(element);
}
element.classList.add(CLASS_NAME_SHOW$5);
this._emulateAnimation(() => {
execute(callback);
});
}
hide(callback) {
if (!this._config.isVisible) {
execute(callback);
return;
}
this._getElement().classList.remove(CLASS_NAME_SHOW$5);
this._emulateAnimation(() => {
this.dispose();
execute(callback);
});
}
dispose() {
if (!this._isAppended) {
return;
}
EventHandler.off(this._element, EVENT_MOUSEDOWN);
this._element.remove();
this._isAppended = false;
}
_getElement() {
if (!this._element) {
const backdrop = document.createElement("div");
backdrop.className = this._config.className;
if (this._config.isAnimated) {
backdrop.classList.add(CLASS_NAME_FADE$4);
}
this._element = backdrop;
}
return this._element;
}
_configAfterMerge(config) {
config.rootElement = getElement(config.rootElement);
return config;
}
_append() {
if (this._isAppended) {
return;
}
const element = this._getElement();
this._config.rootElement.append(element);
EventHandler.on(element, EVENT_MOUSEDOWN, () => {
execute(this._config.clickCallback);
});
this._isAppended = true;
}
_emulateAnimation(callback) {
executeAfterTransition(callback, this._getElement(), this._config.isAnimated);
}
};
var NAME$8 = "focustrap";
var DATA_KEY$5 = "bs.focustrap";
var EVENT_KEY$5 = `.${DATA_KEY$5}`;
var EVENT_FOCUSIN$2 = `focusin${EVENT_KEY$5}`;
var EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY$5}`;
var TAB_KEY = "Tab";
var TAB_NAV_FORWARD = "forward";
var TAB_NAV_BACKWARD = "backward";
var Default$7 = {
autofocus: true,
trapElement: null
};
var DefaultType$7 = {
autofocus: "boolean",
trapElement: "element"
};
var FocusTrap = class extends Config {
constructor(config) {
super();
this._config = this._getConfig(config);
this._isActive = false;
this._lastTabNavDirection = null;
}
static get Default() {
return Default$7;
}
static get DefaultType() {
return DefaultType$7;
}
static get NAME() {
return NAME$8;
}
activate() {
if (this._isActive) {
return;
}
if (this._config.autofocus) {
this._config.trapElement.focus();
}
EventHandler.off(document, EVENT_KEY$5);
EventHandler.on(document, EVENT_FOCUSIN$2, (event) => this._handleFocusin(event));
EventHandler.on(document, EVENT_KEYDOWN_TAB, (event) => this._handleKeydown(event));
this._isActive = true;
}
deactivate() {
if (!this._isActive) {
return;
}
this._isActive = false;
EventHandler.off(document, EVENT_KEY$5);
}
_handleFocusin(event) {
const {
trapElement
} = this._config;
if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {
return;
}
const elements = SelectorEngine.focusableChildren(trapElement);
if (elements.length === 0) {
trapElement.focus();
} else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {
elements[elements.length - 1].focus();
} else {
elements[0].focus();
}
}
_handleKeydown(event) {
if (event.key !== TAB_KEY) {
return;
}
this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;
}
};
var NAME$7 = "modal";
var DATA_KEY$4 = "bs.modal";
var EVENT_KEY$4 = `.${DATA_KEY$4}`;
var DATA_API_KEY$2 = ".data-api";
var ESCAPE_KEY$1 = "Escape";
var EVENT_HIDE$4 = `hide${EVENT_KEY$4}`;
var EVENT_HIDE_PREVENTED$1 = `hidePrevented${EVENT_KEY$4}`;
var EVENT_HIDDEN$4 = `hidden${EVENT_KEY$4}`;
var EVENT_SHOW$4 = `show${EVENT_KEY$4}`;
var EVENT_SHOWN$4 = `shown${EVENT_KEY$4}`;
var EVENT_RESIZE$1 = `resize${EVENT_KEY$4}`;
var EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY$4}`;
var EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY$4}`;
var EVENT_KEYDOWN_DISMISS$1 = `keydown.dismiss${EVENT_KEY$4}`;
var EVENT_CLICK_DATA_API$2 = `click${EVENT_KEY$4}${DATA_API_KEY$2}`;
var CLASS_NAME_OPEN = "modal-open";
var CLASS_NAME_FADE$3 = "fade";
var CLASS_NAME_SHOW$4 = "show";
var CLASS_NAME_STATIC = "modal-static";
var OPEN_SELECTOR$1 = ".modal.show";
var SELECTOR_DIALOG = ".modal-dialog";
var SELECTOR_MODAL_BODY = ".modal-body";
var SELECTOR_DATA_TOGGLE$2 = '[data-bs-toggle="modal"]';
var Default$6 = {
backdrop: true,
focus: true,
keyboard: true
};
var DefaultType$6 = {
backdrop: "(boolean|string)",
focus: "boolean",
keyboard: "boolean"
};
var Modal = class extends BaseComponent {
constructor(element, config) {
super(element, config);
this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);
this._backdrop = this._initializeBackDrop();
this._focustrap = this._initializeFocusTrap();
this._isShown = false;
this._isTransitioning = false;
this._scrollBar = new ScrollBarHelper();
this._addEventListeners();
}
static get Default() {
return Default$6;
}
static get DefaultType() {
return DefaultType$6;
}
static get NAME() {
return NAME$7;
}
toggle(relatedTarget) {
return this._isShown ? this.hide() : this.show(relatedTarget);
}
show(relatedTarget) {
if (this._isShown || this._isTransitioning) {
return;
}
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$4, {
relatedTarget
});
if (showEvent.defaultPrevented) {
return;
}
this._isShown = true;
this._isTransitioning = true;
this._scrollBar.hide();
document.body.classList.add(CLASS_NAME_OPEN);
this._adjustDialog();
this._backdrop.show(() => this._showElement(relatedTarget));
}
hide() {
if (!this._isShown || this._isTransitioning) {
return;
}
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$4);
if (hideEvent.defaultPrevented) {
return;
}
this._isShown = false;
this._isTransitioning = true;
this._focustrap.deactivate();
this._element.classList.remove(CLASS_NAME_SHOW$4);
this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());
}
dispose() {
for (const htmlElement of [window, this._dialog]) {
EventHandler.off(htmlElement, EVENT_KEY$4);
}
this._backdrop.dispose();
this._focustrap.deactivate();
super.dispose();
}
handleUpdate() {
this._adjustDialog();
}
_initializeBackDrop() {
return new Backdrop({
isVisible: Boolean(this._config.backdrop),
isAnimated: this._isAnimated()
});
}
_initializeFocusTrap() {
return new FocusTrap({
trapElement: this._element
});
}
_showElement(relatedTarget) {
if (!document.body.contains(this._element)) {
document.body.append(this._element);
}
this._element.style.display = "block";
this._element.removeAttribute("aria-hidden");
this._element.setAttribute("aria-modal", true);
this._element.setAttribute("role", "dialog");
this._element.scrollTop = 0;
const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);
if (modalBody) {
modalBody.scrollTop = 0;
}
reflow(this._element);
this._element.classList.add(CLASS_NAME_SHOW$4);
const transitionComplete = () => {
if (this._config.focus) {
this._focustrap.activate();
}
this._isTransitioning = false;
EventHandler.trigger(this._element, EVENT_SHOWN$4, {
relatedTarget
});
};
this._queueCallback(transitionComplete, this._dialog, this._isAnimated());
}
_addEventListeners() {
EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS$1, (event) => {
if (event.key !== ESCAPE_KEY$1) {
return;
}
if (this._config.keyboard) {
event.preventDefault();
this.hide();
return;
}
this._triggerBackdropTransition();
});
EventHandler.on(window, EVENT_RESIZE$1, () => {
if (this._isShown && !this._isTransitioning) {
this._adjustDialog();
}
});
EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, (event) => {
EventHandler.one(this._element, EVENT_CLICK_DISMISS, (event2) => {
if (this._element !== event.target || this._element !== event2.target) {
return;
}
if (this._config.backdrop === "static") {
this._triggerBackdropTransition();
return;
}
if (this._config.backdrop) {
this.hide();
}
});
});
}
_hideModal() {
this._element.style.display = "none";
this._element.setAttribute("aria-hidden", true);
this._element.removeAttribute("aria-modal");
this._element.removeAttribute("role");
this._isTransitioning = false;
this._backdrop.hide(() => {
document.body.classList.remove(CLASS_NAME_OPEN);
this._resetAdjustments();
this._scrollBar.reset();
EventHandler.trigger(this._element, EVENT_HIDDEN$4);
});
}
_isAnimated() {
return this._element.classList.contains(CLASS_NAME_FADE$3);
}
_triggerBackdropTransition() {
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED$1);
if (hideEvent.defaultPrevented) {
return;
}
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
const initialOverflowY = this._element.style.overflowY;
if (initialOverflowY === "hidden" || this._element.classList.contains(CLASS_NAME_STATIC)) {
return;
}
if (!isModalOverflowing) {
this._element.style.overflowY = "hidden";
}
this._element.classList.add(CLASS_NAME_STATIC);
this._queueCallback(() => {
this._element.classList.remove(CLASS_NAME_STATIC);
this._queueCallback(() => {
this._element.style.overflowY = initialOverflowY;
}, this._dialog);
}, this._dialog);
this._element.focus();
}
_adjustDialog() {
const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;
const scrollbarWidth = this._scrollBar.getWidth();
const isBodyOverflowing = scrollbarWidth > 0;
if (isBodyOverflowing && !isModalOverflowing) {
const property = isRTL() ? "paddingLeft" : "paddingRight";
this._element.style[property] = `${scrollbarWidth}px`;
}
if (!isBodyOverflowing && isModalOverflowing) {
const property = isRTL() ? "paddingRight" : "paddingLeft";
this._element.style[property] = `${scrollbarWidth}px`;
}
}
_resetAdjustments() {
this._element.style.paddingLeft = "";
this._element.style.paddingRight = "";
}
static jQueryInterface(config, relatedTarget) {
return this.each(function() {
const data = Modal.getOrCreateInstance(this, config);
if (typeof config !== "string") {
return;
}
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config](relatedTarget);
});
}
};
EventHandler.on(document, EVENT_CLICK_DATA_API$2, SELECTOR_DATA_TOGGLE$2, function(event) {
const target = getElementFromSelector(this);
if (["A", "AREA"].includes(this.tagName)) {
event.preventDefault();
}
EventHandler.one(target, EVENT_SHOW$4, (showEvent) => {
if (showEvent.defaultPrevented) {
return;
}
EventHandler.one(target, EVENT_HIDDEN$4, () => {
if (isVisible(this)) {
this.focus();
}
});
});
const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR$1);
if (alreadyOpen) {
Modal.getInstance(alreadyOpen).hide();
}
const data = Modal.getOrCreateInstance(target);
data.toggle(this);
});
enableDismissTrigger(Modal);
defineJQueryPlugin(Modal);
var NAME$6 = "offcanvas";
var DATA_KEY$3 = "bs.offcanvas";
var EVENT_KEY$3 = `.${DATA_KEY$3}`;
var DATA_API_KEY$1 = ".data-api";
var EVENT_LOAD_DATA_API$2 = `load${EVENT_KEY$3}${DATA_API_KEY$1}`;
var ESCAPE_KEY = "Escape";
var CLASS_NAME_SHOW$3 = "show";
var CLASS_NAME_SHOWING$1 = "showing";
var CLASS_NAME_HIDING = "hiding";
var CLASS_NAME_BACKDROP = "offcanvas-backdrop";
var OPEN_SELECTOR = ".offcanvas.show";
var EVENT_SHOW$3 = `show${EVENT_KEY$3}`;
var EVENT_SHOWN$3 = `shown${EVENT_KEY$3}`;
var EVENT_HIDE$3 = `hide${EVENT_KEY$3}`;
var EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY$3}`;
var EVENT_HIDDEN$3 = `hidden${EVENT_KEY$3}`;
var EVENT_RESIZE = `resize${EVENT_KEY$3}`;
var EVENT_CLICK_DATA_API$1 = `click${EVENT_KEY$3}${DATA_API_KEY$1}`;
var EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY$3}`;
var SELECTOR_DATA_TOGGLE$1 = '[data-bs-toggle="offcanvas"]';
var Default$5 = {
backdrop: true,
keyboard: true,
scroll: false
};
var DefaultType$5 = {
backdrop: "(boolean|string)",
keyboard: "boolean",
scroll: "boolean"
};
var Offcanvas = class extends BaseComponent {
constructor(element, config) {
super(element, config);
this._isShown = false;
this._backdrop = this._initializeBackDrop();
this._focustrap = this._initializeFocusTrap();
this._addEventListeners();
}
static get Default() {
return Default$5;
}
static get DefaultType() {
return DefaultType$5;
}
static get NAME() {
return NAME$6;
}
toggle(relatedTarget) {
return this._isShown ? this.hide() : this.show(relatedTarget);
}
show(relatedTarget) {
if (this._isShown) {
return;
}
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW$3, {
relatedTarget
});
if (showEvent.defaultPrevented) {
return;
}
this._isShown = true;
this._backdrop.show();
if (!this._config.scroll) {
new ScrollBarHelper().hide();
}
this._element.setAttribute("aria-modal", true);
this._element.setAttribute("role", "dialog");
this._element.classList.add(CLASS_NAME_SHOWING$1);
const completeCallBack = () => {
if (!this._config.scroll || this._config.backdrop) {
this._focustrap.activate();
}
this._element.classList.add(CLASS_NAME_SHOW$3);
this._element.classList.remove(CLASS_NAME_SHOWING$1);
EventHandler.trigger(this._element, EVENT_SHOWN$3, {
relatedTarget
});
};
this._queueCallback(completeCallBack, this._element, true);
}
hide() {
if (!this._isShown) {
return;
}
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE$3);
if (hideEvent.defaultPrevented) {
return;
}
this._focustrap.deactivate();
this._element.blur();
this._isShown = false;
this._element.classList.add(CLASS_NAME_HIDING);
this._backdrop.hide();
const completeCallback = () => {
this._element.classList.remove(CLASS_NAME_SHOW$3, CLASS_NAME_HIDING);
this._element.removeAttribute("aria-modal");
this._element.removeAttribute("role");
if (!this._config.scroll) {
new ScrollBarHelper().reset();
}
EventHandler.trigger(this._element, EVENT_HIDDEN$3);
};
this._queueCallback(completeCallback, this._element, true);
}
dispose() {
this._backdrop.dispose();
this._focustrap.deactivate();
super.dispose();
}
_initializeBackDrop() {
const clickCallback = () => {
if (this._config.backdrop === "static") {
EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
return;
}
this.hide();
};
const isVisible2 = Boolean(this._config.backdrop);
return new Backdrop({
className: CLASS_NAME_BACKDROP,
isVisible: isVisible2,
isAnimated: true,
rootElement: this._element.parentNode,
clickCallback: isVisible2 ? clickCallback : null
});
}
_initializeFocusTrap() {
return new FocusTrap({
trapElement: this._element
});
}
_addEventListeners() {
EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, (event) => {
if (event.key !== ESCAPE_KEY) {
return;
}
if (!this._config.keyboard) {
EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);
return;
}
this.hide();
});
}
static jQueryInterface(config) {
return this.each(function() {
const data = Offcanvas.getOrCreateInstance(this, config);
if (typeof config !== "string") {
return;
}
if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
throw new TypeError(`No method named "${config}"`);
}
data[config](this);
});
}
};
EventHandler.on(document, EVENT_CLICK_DATA_API$1, SELECTOR_DATA_TOGGLE$1, function(event) {
const target = getElementFromSelector(this);
if (["A", "AREA"].includes(this.tagName)) {
event.preventDefault();
}
if (isDisabled(this)) {
return;
}
EventHandler.one(target, EVENT_HIDDEN$3, () => {
if (isVisible(this)) {
this.focus();
}
});
const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);
if (alreadyOpen && alreadyOpen !== target) {
Offcanvas.getInstance(alreadyOpen).hide();
}
const data = Offcanvas.getOrCreateInstance(target);
data.toggle(this);
});
EventHandler.on(window, EVENT_LOAD_DATA_API$2, () => {
for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {
Offcanvas.getOrCreateInstance(selector).show();
}
});
EventHandler.on(window, EVENT_RESIZE, () => {
for (const element of SelectorEngine.find("[aria-modal][class*=show][class*=offcanvas-]")) {
if (getComputedStyle(element).position !== "fixed") {
Offcanvas.getOrCreateInstance(element).hide();
}
}
});
enableDismissTrigger(Offcanvas);
defineJQueryPlugin(Offcanvas);
var uriAttributes = /* @__PURE__ */ new Set(["background", "cite", "href", "itemtype", "longdesc", "poster", "src", "xlink:href"]);
var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i;
var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i;
var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i;
var allowedAttribute = (attribute, allowedAttributeList) => {
const attributeName = attribute.nodeName.toLowerCase();
if (allowedAttributeList.includes(attributeName)) {
if (uriAttributes.has(attributeName)) {
return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue) || DATA_URL_PATTERN.test(attribute.nodeValue));
}
return true;
}
return allowedAttributeList.filter((attributeRegex) => attributeRegex instanceof RegExp).some((regex) => regex.test(attributeName));
};
var DefaultAllowlist = {
"*": ["class", "dir", "id", "lang", "role", ARIA_ATTRIBUTE_PATTERN],
a: ["target", "href", "title", "rel"],
area: [],
b: [],
br: [],
col: [],
code: [],
div: [],
em: [],
hr: [],
h1: [],
h2: [],
h3: [],
h4: [],
h5: [],
h6: [],
i: [],
img: ["src", "srcset", "alt", "title", "width", "height"],
li: [],
ol: [],
p: [],
pre: [],
s: [],
small: [],
span: [],
sub: [],
sup: [],
strong: [],
u: [],
ul: []
};
function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {
if (!unsafeHtml.length) {
return unsafeHtml;
}
if (sanitizeFunction && typeof sanitizeFunction === "function") {
return sanitizeFunction(unsafeHtml);
}
const domParser = new window.DOMParser();
const createdDocument = domParser.parseFromString(unsafeHtml, "text/html");
const elements = [].concat(...createdDocument.body.querySelectorAll("*"));
for (const element of elements) {
const elementName = element.nodeName.toLowerCase();
if (!Object.keys(allowList).includes(elementName)) {
element.remove();
continue;
}
const attributeList = [].concat(...element.attributes);
const allowedAttributes = [].concat(allowList["*"] || [], allowList[elementName] || []);
for (const attribute of attributeList) {
if (!allowedAttribute(attribute, allowedAttributes)) {
element.removeAttribute(attribute.nodeName);
}
}
}
return createdDocument.body.innerHTML;
}
var NAME$5 = "TemplateFactory";
var Default$4 = {
allowList: DefaultAllowlist,
content: {},
extraClass: "",
html: false,
sanitize: true,
sanitizeFn: null,
template: "<div></div>"
};
var DefaultType$4 = {
allowList: "object",
content: "object",
extraClass: "(string|function)",
html: "boolean",
sanitize: "boolean",
sanitizeFn: "(null|function)",
template: "string"
};
var DefaultContentType = {
entry: "(string|element|function|null)",
selector: "(string|element)"
};
var TemplateFactory = class extends Config {
constructor(config) {
super();
this._config = this._getConfig(config);
}
static get Default() {
return Default$4;
}
static get DefaultType() {
return DefaultType$4;
}
static get NAME() {
return NAME$5;
}
getContent() {
return Object.values(this._config.content).map((config) => this._resolvePossibleFunction(config)).filter(Boolean);
}
hasContent() {
return this.getContent().length > 0;
}
changeContent(content) {
this._checkContent(content);
this._config.content = __spreadValues(__spreadValues({}, this._config.content), content);
return this;
}
toHtml() {
const templateWrapper = document.createElement("div");
templateWrapper.innerHTML = this._maybeSanitize(this._config.template);
for (const [selector, text] of Object.entries(this._config.content)) {
this._setContent(templateWrapper, text, selector);
}
const template = templateWrapper.children[0];
const extraClass = this._resolvePossibleFunction(this._config.extraClass);
if (extraClass) {
template.classList.add(...extraClass.split(" "));
}
return template;
}
_typeCheckConfig(config) {
super._typeCheckConfig(config);
this._checkContent(config.content);
}
_checkContent(arg) {
for (const [selector, content] of Object.entries(arg)) {
super._typeCheckConfig({
selector,
entry: content
}, DefaultContentType);
}
}
_setContent(template, content, selector) {
const templateElement = SelectorEngine.findOne(selector, template);
if (!templateElement) {
return;
}
content = this._resolvePossibleFunction(content);
if (!content) {
templateElement.remove();
return;
}
if (isElement2(content)) {
this._putElementInTemplate(getElement(content), templateElement);
return;
}
if (this._config.html) {
templateElement.innerHTML = this._maybeSanitize(content);
return;
}
templateElement.textContent = content;
}
_maybeSanitize(arg) {
return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg;
}
_resolvePossibleFunction(arg) {
return typeof arg === "function" ? arg(this) : arg;
}
_putElementInTemplate(element, templateElement) {
if (this._config.html) {
templateElement.innerHTML = "";
templateElement.append(element);
return;
}
templateElement.textContent = element.textContent;
}
};
var NAME$4 = "tooltip";
var DISALLOWED_ATTRIBUTES = /* @__PURE__ */ new Set(["sanitize", "allowList", "sanitizeFn"]);
var CLASS_NAME_FADE$2 = "fade";
var CLASS_NAME_MODAL = "modal";
var CLASS_NAME_SHOW$2 = "show";
var SELECTOR_TOOLTIP_INNER = ".tooltip-inner";
var SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`;
var EVENT_MODAL_HIDE = "hide.bs.modal";
var TRIGGER_HOVER = "hover";
var TRIGGER_FOCUS = "focus";
var TRIGGER_CLICK = "click";
var TRIGGER_MANUAL = "manual";
var EVENT_HIDE$2 = "hide";
var EVENT_HIDDEN$2 = "hidden";
var EVENT_SHOW$2 = "show";
var EVENT_SHOWN$2 = "shown";
var EVENT_INSERTED = "inserted";
var EVENT_CLICK$1 = "click";
var EVENT_FOCUSIN$1 = "focusin";
var EVENT_FOCUSOUT$1 = "focusout";
var EVENT_MOUSEENTER = "mouseenter";
var EVENT_MOUSELEAVE = "mouseleave";
var AttachmentMap = {
AUTO: "auto",
TOP: "top",
RIGHT: isRTL() ? "left" : "right",
BOTTOM: "bottom",
LEFT: isRTL() ? "right" : "left"
};
var Default$3 = {
allowList: DefaultAllowlist,
animation: true,
boundary: "clippingParents",
container: false,
customClass: "",
delay: 0,
fallbackPlacements: ["top", "right", "bottom", "left"],
html: false,
offset: [0, 0],
placement: "top",
popperConfig: null,
sanitize: true,
sanitizeFn: null,
selector: false,
template: '<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
title: "",
trigger: "hover focus"
};
var DefaultType$3 = {
allowList: "object",
animation: "boolean",
boundary: "(string|element)",
container: "(string|element|boolean)",
customClass: "(string|function)",
delay: "(number|object)",
fallbackPlacements: "array",
html: "boolean",
offset: "(array|string|function)",
placement: "(string|function)",
popperConfig: "(null|object|function)",
sanitize: "boolean",
sanitizeFn: "(null|function)",
selector: "(string|boolean)",
template: "string",
title: "(string|element|function)",
trigger: "string"
};
var Tooltip = class extends BaseComponent {
constructor(element, config) {
if (typeof lib_exports === "undefined") {
throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");
}
super(element, config);
this._isEnabled = true;
this._timeout = 0;
this._isHovered = null;
this._activeTrigger = {};
this._popper = null;
this._templateFactory = null;
this._newContent = null;
this.tip = null;
this._setListeners();
if (!this._config.selector) {
this._fixTitle();
}
}
static get Default() {
return Default$3;
}
static get DefaultType() {
return DefaultType$3;
}
static get NAME() {
return NAME$4;
}
enable() {
this._isEnabled = true;
}
disable() {
this._isEnabled = false;
}
toggleEnabled() {
this._isEnabled = !this._isEnabled;
}
toggle() {
if (!this._isEnabled) {
return;
}
this._activeTrigger.click = !this._activeTrigger.click;
if (this._isShown()) {
this._leave();
return;
}
this._enter();
}
dispose() {
clearTimeout(this._timeout);
EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
if (this._element.getAttribute("data-bs-original-title")) {
this._element.setAttribute("title", this._element.getAttribute("data-bs-original-title"));
}
this._disposePopper();
super.dispose();
}
show() {
if (this._element.style.display === "none") {
throw new Error("Please use show on visible elements");
}
if (!(this._isWithContent() && this._isEnabled)) {
return;
}
const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW$2));
const shadowRoot = findShadowRoot(this._element);
const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element);
if (showEvent.defaultPrevented || !isInTheDom) {
return;
}
this._disposePopper();
const tip = this._getTipElement();
this._element.setAttribute("aria-describedby", tip.getAttribute("id"));
const {
container
} = this._config;
if (!this._element.ownerDocument.documentElement.contains(this.tip)) {
container.append(tip);
EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED));
}
this._popper = this._createPopper(tip);
tip.classList.add(CLASS_NAME_SHOW$2);
if ("ontouchstart" in document.documentElement) {
for (const element of [].concat(...document.body.children)) {
EventHandler.on(element, "mouseover", noop);
}
}
const complete = () => {
EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN$2));
if (this._isHovered === false) {
this._leave();
}
this._isHovered = false;
};
this._queueCallback(complete, this.tip, this._isAnimated());
}
hide() {
if (!this._isShown()) {
return;
}
const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE$2));
if (hideEvent.defaultPrevented) {
return;
}
const tip = this._getTipElement();
tip.classList.remove(CLASS_NAME_SHOW$2);
if ("ontouchstart" in document.documentElement) {
for (const element of [].concat(...document.body.children)) {
EventHandler.off(element, "mouseover", noop);
}
}
this._activeTrigger[TRIGGER_CLICK] = false;
this._activeTrigger[TRIGGER_FOCUS] = false;
this._activeTrigger[TRIGGER_HOVER] = false;
this._isHovered = null;
const complete = () => {
if (this._isWithActiveTrigger()) {
return;
}
if (!this._isHovered) {
this._disposePopper();
}
this._element.removeAttribute("aria-describedby");
EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN$2));
};
this._queueCallback(complete, this.tip, this._isAnimated());
}
update() {
if (this._popper) {
this._popper.update();
}
}
_isWithContent() {
return Boolean(this._getTitle());
}
_getTipElement() {
if (!this.tip) {
this.tip = this._createTipElement(this._newContent || this._getContentForTemplate());
}
return this.tip;
}
_createTipElement(content) {
const tip = this._getTemplateFactory(content).toHtml();
if (!tip) {
return null;
}
tip.classList.remove(CLASS_NAME_FADE$2, CLASS_NAME_SHOW$2);
tip.classList.add(`bs-${this.constructor.NAME}-auto`);
const tipId = getUID(this.constructor.NAME).toString();
tip.setAttribute("id", tipId);
if (this._isAnimated()) {
tip.classList.add(CLASS_NAME_FADE$2);
}
return tip;
}
setContent(content) {
this._newContent = content;
if (this._isShown()) {
this._disposePopper();
this.show();
}
}
_getTemplateFactory(content) {
if (this._templateFactory) {
this._templateFactory.changeContent(content);
} else {
this._templateFactory = new TemplateFactory(__spreadProps(__spreadValues({}, this._config), {
content,
extraClass: this._resolvePossibleFunction(this._config.customClass)
}));
}
return this._templateFactory;
}
_getContentForTemplate() {
return {
[SELECTOR_TOOLTIP_INNER]: this._getTitle()
};
}
_getTitle() {
return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute("data-bs-original-title");
}
_initializeOnDelegatedTarget(event) {
return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig());
}
_isAnimated() {
return this._config.animation || this.tip && this.tip.classList.contains(CLASS_NAME_FADE$2);
}
_isShown() {
return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW$2);
}
_createPopper(tip) {
const placement = typeof this._config.placement === "function" ? this._config.placement.call(this, tip, this._element) : this._config.placement;
const attachment = AttachmentMap[placement.toUpperCase()];
return createPopper3(this._element, tip, this._getPopperConfig(attachment));
}
_getOffset() {
const {
offset: offset2
} = this._config;
if (typeof offset2 === "string") {
return offset2.split(",").map((value) => Number.parseInt(value, 10));
}
if (typeof offset2 === "function") {
return (popperData) => offset2(popperData, this._element);
}
return offset2;
}
_resolvePossibleFunction(arg) {
return typeof arg === "function" ? arg.call(this._element) : arg;
}
_getPopperConfig(attachment) {
const defaultBsPopperConfig = {
placement: attachment,
modifiers: [{
name: "flip",
options: {
fallbackPlacements: this._config.fallbackPlacements
}
}, {
name: "offset",
options: {
offset: this._getOffset()
}
}, {
name: "preventOverflow",
options: {
boundary: this._config.boundary
}
}, {
name: "arrow",
options: {
element: `.${this.constructor.NAME}-arrow`
}
}, {
name: "preSetPlacement",
enabled: true,
phase: "beforeMain",
fn: (data) => {
this._getTipElement().setAttribute("data-popper-placement", data.state.placement);
}
}]
};
return __spreadValues(__spreadValues({}, defaultBsPopperConfig), typeof this._config.popperConfig === "function" ? this._config.popperConfig(defaultBsPopperConfig) : this._config.popperConfig);
}
_setListeners() {
const triggers = this._config.trigger.split(" ");
for (const trigger of triggers) {
if (trigger === "click") {
EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK$1), this._config.selector, (event) => {
const context = this._initializeOnDelegatedTarget(event);
context.toggle();
});
} else if (trigger !== TRIGGER_MANUAL) {
const eventIn = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSEENTER) : this.constructor.eventName(EVENT_FOCUSIN$1);
const eventOut = trigger === TRIGGER_HOVER ? this.constructor.eventName(EVENT_MOUSELEAVE) : this.constructor.eventName(EVENT_FOCUSOUT$1);
EventHandler.on(this._element, eventIn, this._config.selector, (event) => {
const context = this._initializeOnDelegatedTarget(event);
context._activeTrigger[event.type === "focusin" ? TRIGGER_FOCUS : TRIGGER_HOVER] = true;
context._enter();
});
EventHandler.on(this._element, eventOut, this._config.selector, (event) => {
const context = this._initializeOnDelegatedTarget(event);
context._activeTrigger[event.type === "focusout" ? TRIGGER_FOCUS : TRIGGER_HOVER] = context._element.contains(event.relatedTarget);
context._leave();
});
}
}
this._hideModalHandler = () => {
if (this._element) {
this.hide();
}
};
EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler);
}
_fixTitle() {
const title = this._element.getAttribute("title");
if (!title) {
return;
}
if (!this._element.getAttribute("aria-label") && !this._element.textContent.trim()) {
this._element.setAttribute("aria-label", title);
}
this._element.setAttribute("data-bs-original-title", title);
this._element.removeAttribute("title");
}
_enter() {
if (this._isShown() || this._isHovered) {
this._isHovered = true;
return;
}
this._isHovered = true;
this._setTimeout(() => {
if (this._isHovered) {
this.show();
}
}, this._config.delay.show);
}
_leave() {
if (this._isWithActiveTrigger()) {
return;
}
this._isHovered = false;
this._setTimeout(() => {
if (!this._isHovered) {
this.hide();
}
}, this._config.delay.hide);
}
_setTimeout(handler, timeout) {
clearTimeout(this._timeout);
this._timeout = setTimeout(handler, timeout);
}
_isWithActiveTrigger() {
return Object.values(this._activeTrigger).includes(true);
}
_getConfig(config) {
const dataAttributes = Manipulator.getDataAttributes(this._element);
for (const dataAttribute of Object.keys(dataAttributes)) {
if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {
delete dataAttributes[dataAttribute];
}
}
config = __spreadValues(__spreadValues({}, dataAttributes), typeof config === "object" && config ? config : {});
config = this._mergeConfigObj(config);
config = this._configAfterMerge(config);
this._typeCheckConfig(config);
return config;
}
_configAfterMerge(config) {
config.container = config.container === false ? document.body : getElement(config.container);
if (typeof config.delay === "number") {
config.delay = {
show: config.delay,
hide: config.delay
};
}
if (typeof config.title === "number") {
config.title = config.title.toString();
}
if (typeof config.content === "number") {
config.content = config.content.toString();
}
return config;
}
_getDelegateConfig() {
const config = {};
for (const key in this._config) {
if (this.constructor.Default[key] !== this._config[key]) {
config[key] = this._config[key];
}
}
config.selector = false;
config.trigger = "manual";
return config;
}
_disposePopper() {
if (this._popper) {
this._popper.destroy();
this._popper = null;
}
if (this.tip) {
this.tip.remove();
this.tip = null;
}
}
static jQueryInterface(config) {
return this.each(function() {
const data = Tooltip.getOrCreateInstance(this, config);
if (typeof config !== "string") {
return;
}
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config]();
});
}
};
defineJQueryPlugin(Tooltip);
var NAME$3 = "popover";
var SELECTOR_TITLE = ".popover-header";
var SELECTOR_CONTENT = ".popover-body";
var Default$2 = __spreadProps(__spreadValues({}, Tooltip.Default), {
content: "",
offset: [0, 8],
placement: "right",
template: '<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>',
trigger: "click"
});
var DefaultType$2 = __spreadProps(__spreadValues({}, Tooltip.DefaultType), {
content: "(null|string|element|function)"
});
var Popover = class extends Tooltip {
static get Default() {
return Default$2;
}
static get DefaultType() {
return DefaultType$2;
}
static get NAME() {
return NAME$3;
}
_isWithContent() {
return this._getTitle() || this._getContent();
}
_getContentForTemplate() {
return {
[SELECTOR_TITLE]: this._getTitle(),
[SELECTOR_CONTENT]: this._getContent()
};
}
_getContent() {
return this._resolvePossibleFunction(this._config.content);
}
static jQueryInterface(config) {
return this.each(function() {
const data = Popover.getOrCreateInstance(this, config);
if (typeof config !== "string") {
return;
}
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config]();
});
}
};
defineJQueryPlugin(Popover);
var NAME$2 = "scrollspy";
var DATA_KEY$2 = "bs.scrollspy";
var EVENT_KEY$2 = `.${DATA_KEY$2}`;
var DATA_API_KEY = ".data-api";
var EVENT_ACTIVATE = `activate${EVENT_KEY$2}`;
var EVENT_CLICK = `click${EVENT_KEY$2}`;
var EVENT_LOAD_DATA_API$1 = `load${EVENT_KEY$2}${DATA_API_KEY}`;
var CLASS_NAME_DROPDOWN_ITEM = "dropdown-item";
var CLASS_NAME_ACTIVE$1 = "active";
var SELECTOR_DATA_SPY = '[data-bs-spy="scroll"]';
var SELECTOR_TARGET_LINKS = "[href]";
var SELECTOR_NAV_LIST_GROUP = ".nav, .list-group";
var SELECTOR_NAV_LINKS = ".nav-link";
var SELECTOR_NAV_ITEMS = ".nav-item";
var SELECTOR_LIST_ITEMS = ".list-group-item";
var SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`;
var SELECTOR_DROPDOWN = ".dropdown";
var SELECTOR_DROPDOWN_TOGGLE$1 = ".dropdown-toggle";
var Default$1 = {
offset: null,
rootMargin: "0px 0px -25%",
smoothScroll: false,
target: null,
threshold: [0.1, 0.5, 1]
};
var DefaultType$1 = {
offset: "(number|null)",
rootMargin: "string",
smoothScroll: "boolean",
target: "element",
threshold: "array"
};
var ScrollSpy = class extends BaseComponent {
constructor(element, config) {
super(element, config);
this._targetLinks = /* @__PURE__ */ new Map();
this._observableSections = /* @__PURE__ */ new Map();
this._rootElement = getComputedStyle(this._element).overflowY === "visible" ? null : this._element;
this._activeTarget = null;
this._observer = null;
this._previousScrollData = {
visibleEntryTop: 0,
parentScrollTop: 0
};
this.refresh();
}
static get Default() {
return Default$1;
}
static get DefaultType() {
return DefaultType$1;
}
static get NAME() {
return NAME$2;
}
refresh() {
this._initializeTargetsAndObservables();
this._maybeEnableSmoothScroll();
if (this._observer) {
this._observer.disconnect();
} else {
this._observer = this._getNewObserver();
}
for (const section of this._observableSections.values()) {
this._observer.observe(section);
}
}
dispose() {
this._observer.disconnect();
super.dispose();
}
_configAfterMerge(config) {
config.target = getElement(config.target) || document.body;
config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin;
if (typeof config.threshold === "string") {
config.threshold = config.threshold.split(",").map((value) => Number.parseFloat(value));
}
return config;
}
_maybeEnableSmoothScroll() {
if (!this._config.smoothScroll) {
return;
}
EventHandler.off(this._config.target, EVENT_CLICK);
EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, (event) => {
const observableSection = this._observableSections.get(event.target.hash);
if (observableSection) {
event.preventDefault();
const root = this._rootElement || window;
const height = observableSection.offsetTop - this._element.offsetTop;
if (root.scrollTo) {
root.scrollTo({
top: height,
behavior: "smooth"
});
return;
}
root.scrollTop = height;
}
});
}
_getNewObserver() {
const options = {
root: this._rootElement,
threshold: this._config.threshold,
rootMargin: this._config.rootMargin
};
return new IntersectionObserver((entries) => this._observerCallback(entries), options);
}
_observerCallback(entries) {
const targetElement = (entry) => this._targetLinks.get(`#${entry.target.id}`);
const activate = (entry) => {
this._previousScrollData.visibleEntryTop = entry.target.offsetTop;
this._process(targetElement(entry));
};
const parentScrollTop = (this._rootElement || document.documentElement).scrollTop;
const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop;
this._previousScrollData.parentScrollTop = parentScrollTop;
for (const entry of entries) {
if (!entry.isIntersecting) {
this._activeTarget = null;
this._clearActiveClass(targetElement(entry));
continue;
}
const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop;
if (userScrollsDown && entryIsLowerThanPrevious) {
activate(entry);
if (!parentScrollTop) {
return;
}
continue;
}
if (!userScrollsDown && !entryIsLowerThanPrevious) {
activate(entry);
}
}
}
_initializeTargetsAndObservables() {
this._targetLinks = /* @__PURE__ */ new Map();
this._observableSections = /* @__PURE__ */ new Map();
const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target);
for (const anchor of targetLinks) {
if (!anchor.hash || isDisabled(anchor)) {
continue;
}
const observableSection = SelectorEngine.findOne(anchor.hash, this._element);
if (isVisible(observableSection)) {
this._targetLinks.set(anchor.hash, anchor);
this._observableSections.set(anchor.hash, observableSection);
}
}
}
_process(target) {
if (this._activeTarget === target) {
return;
}
this._clearActiveClass(this._config.target);
this._activeTarget = target;
target.classList.add(CLASS_NAME_ACTIVE$1);
this._activateParents(target);
EventHandler.trigger(this._element, EVENT_ACTIVATE, {
relatedTarget: target
});
}
_activateParents(target) {
if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {
SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1, target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);
return;
}
for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {
for (const item of SelectorEngine.prev(listGroup, SELECTOR_LINK_ITEMS)) {
item.classList.add(CLASS_NAME_ACTIVE$1);
}
}
}
_clearActiveClass(parent) {
parent.classList.remove(CLASS_NAME_ACTIVE$1);
const activeNodes = SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`, parent);
for (const node of activeNodes) {
node.classList.remove(CLASS_NAME_ACTIVE$1);
}
}
static jQueryInterface(config) {
return this.each(function() {
const data = ScrollSpy.getOrCreateInstance(this, config);
if (typeof config !== "string") {
return;
}
if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
throw new TypeError(`No method named "${config}"`);
}
data[config]();
});
}
};
EventHandler.on(window, EVENT_LOAD_DATA_API$1, () => {
for (const spy of SelectorEngine.find(SELECTOR_DATA_SPY)) {
ScrollSpy.getOrCreateInstance(spy);
}
});
defineJQueryPlugin(ScrollSpy);
var NAME$1 = "tab";
var DATA_KEY$1 = "bs.tab";
var EVENT_KEY$1 = `.${DATA_KEY$1}`;
var EVENT_HIDE$1 = `hide${EVENT_KEY$1}`;
var EVENT_HIDDEN$1 = `hidden${EVENT_KEY$1}`;
var EVENT_SHOW$1 = `show${EVENT_KEY$1}`;
var EVENT_SHOWN$1 = `shown${EVENT_KEY$1}`;
var EVENT_CLICK_DATA_API = `click${EVENT_KEY$1}`;
var EVENT_KEYDOWN = `keydown${EVENT_KEY$1}`;
var EVENT_LOAD_DATA_API = `load${EVENT_KEY$1}`;
var ARROW_LEFT_KEY = "ArrowLeft";
var ARROW_RIGHT_KEY = "ArrowRight";
var ARROW_UP_KEY = "ArrowUp";
var ARROW_DOWN_KEY = "ArrowDown";
var CLASS_NAME_ACTIVE = "active";
var CLASS_NAME_FADE$1 = "fade";
var CLASS_NAME_SHOW$1 = "show";
var CLASS_DROPDOWN = "dropdown";
var SELECTOR_DROPDOWN_TOGGLE = ".dropdown-toggle";
var SELECTOR_DROPDOWN_MENU = ".dropdown-menu";
var NOT_SELECTOR_DROPDOWN_TOGGLE = ":not(.dropdown-toggle)";
var SELECTOR_TAB_PANEL = '.list-group, .nav, [role="tablist"]';
var SELECTOR_OUTER = ".nav-item, .list-group-item";
var SELECTOR_INNER = `.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`;
var SELECTOR_DATA_TOGGLE = '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]';
var SELECTOR_INNER_ELEM = `${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`;
var SELECTOR_DATA_TOGGLE_ACTIVE = `.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;
var Tab = class extends BaseComponent {
constructor(element) {
super(element);
this._parent = this._element.closest(SELECTOR_TAB_PANEL);
if (!this._parent) {
return;
}
this._setInitialAttributes(this._parent, this._getChildren());
EventHandler.on(this._element, EVENT_KEYDOWN, (event) => this._keydown(event));
}
static get NAME() {
return NAME$1;
}
show() {
const innerElem = this._element;
if (this._elemIsActive(innerElem)) {
return;
}
const active = this._getActiveElem();
const hideEvent = active ? EventHandler.trigger(active, EVENT_HIDE$1, {
relatedTarget: innerElem
}) : null;
const showEvent = EventHandler.trigger(innerElem, EVENT_SHOW$1, {
relatedTarget: active
});
if (showEvent.defaultPrevented || hideEvent && hideEvent.defaultPrevented) {
return;
}
this._deactivate(active, innerElem);
this._activate(innerElem, active);
}
_activate(element, relatedElem) {
if (!element) {
return;
}
element.classList.add(CLASS_NAME_ACTIVE);
this._activate(getElementFromSelector(element));
const complete = () => {
if (element.getAttribute("role") !== "tab") {
element.classList.add(CLASS_NAME_SHOW$1);
return;
}
element.removeAttribute("tabindex");
element.setAttribute("aria-selected", true);
this._toggleDropDown(element, true);
EventHandler.trigger(element, EVENT_SHOWN$1, {
relatedTarget: relatedElem
});
};
this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
}
_deactivate(element, relatedElem) {
if (!element) {
return;
}
element.classList.remove(CLASS_NAME_ACTIVE);
element.blur();
this._deactivate(getElementFromSelector(element));
const complete = () => {
if (element.getAttribute("role") !== "tab") {
element.classList.remove(CLASS_NAME_SHOW$1);
return;
}
element.setAttribute("aria-selected", false);
element.setAttribute("tabindex", "-1");
this._toggleDropDown(element, false);
EventHandler.trigger(element, EVENT_HIDDEN$1, {
relatedTarget: relatedElem
});
};
this._queueCallback(complete, element, element.classList.contains(CLASS_NAME_FADE$1));
}
_keydown(event) {
if (![ARROW_LEFT_KEY, ARROW_RIGHT_KEY, ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)) {
return;
}
event.stopPropagation();
event.preventDefault();
const isNext = [ARROW_RIGHT_KEY, ARROW_DOWN_KEY].includes(event.key);
const nextActiveElement = getNextActiveElement(this._getChildren().filter((element) => !isDisabled(element)), event.target, isNext, true);
if (nextActiveElement) {
nextActiveElement.focus({
preventScroll: true
});
Tab.getOrCreateInstance(nextActiveElement).show();
}
}
_getChildren() {
return SelectorEngine.find(SELECTOR_INNER_ELEM, this._parent);
}
_getActiveElem() {
return this._getChildren().find((child) => this._elemIsActive(child)) || null;
}
_setInitialAttributes(parent, children) {
this._setAttributeIfNotExists(parent, "role", "tablist");
for (const child of children) {
this._setInitialAttributesOnChild(child);
}
}
_setInitialAttributesOnChild(child) {
child = this._getInnerElement(child);
const isActive = this._elemIsActive(child);
const outerElem = this._getOuterElement(child);
child.setAttribute("aria-selected", isActive);
if (outerElem !== child) {
this._setAttributeIfNotExists(outerElem, "role", "presentation");
}
if (!isActive) {
child.setAttribute("tabindex", "-1");
}
this._setAttributeIfNotExists(child, "role", "tab");
this._setInitialAttributesOnTargetPanel(child);
}
_setInitialAttributesOnTargetPanel(child) {
const target = getElementFromSelector(child);
if (!target) {
return;
}
this._setAttributeIfNotExists(target, "role", "tabpanel");
if (child.id) {
this._setAttributeIfNotExists(target, "aria-labelledby", `#${child.id}`);
}
}
_toggleDropDown(element, open) {
const outerElem = this._getOuterElement(element);
if (!outerElem.classList.contains(CLASS_DROPDOWN)) {
return;
}
const toggle = (selector, className) => {
const element2 = SelectorEngine.findOne(selector, outerElem);
if (element2) {
element2.classList.toggle(className, open);
}
};
toggle(SELECTOR_DROPDOWN_TOGGLE, CLASS_NAME_ACTIVE);
toggle(SELECTOR_DROPDOWN_MENU, CLASS_NAME_SHOW$1);
outerElem.setAttribute("aria-expanded", open);
}
_setAttributeIfNotExists(element, attribute, value) {
if (!element.hasAttribute(attribute)) {
element.setAttribute(attribute, value);
}
}
_elemIsActive(elem) {
return elem.classList.contains(CLASS_NAME_ACTIVE);
}
_getInnerElement(elem) {
return elem.matches(SELECTOR_INNER_ELEM) ? elem : SelectorEngine.findOne(SELECTOR_INNER_ELEM, elem);
}
_getOuterElement(elem) {
return elem.closest(SELECTOR_OUTER) || elem;
}
static jQueryInterface(config) {
return this.each(function() {
const data = Tab.getOrCreateInstance(this);
if (typeof config !== "string") {
return;
}
if (data[config] === void 0 || config.startsWith("_") || config === "constructor") {
throw new TypeError(`No method named "${config}"`);
}
data[config]();
});
}
};
EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function(event) {
if (["A", "AREA"].includes(this.tagName)) {
event.preventDefault();
}
if (isDisabled(this)) {
return;
}
Tab.getOrCreateInstance(this).show();
});
EventHandler.on(window, EVENT_LOAD_DATA_API, () => {
for (const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE)) {
Tab.getOrCreateInstance(element);
}
});
defineJQueryPlugin(Tab);
var NAME = "toast";
var DATA_KEY = "bs.toast";
var EVENT_KEY = `.${DATA_KEY}`;
var EVENT_MOUSEOVER = `mouseover${EVENT_KEY}`;
var EVENT_MOUSEOUT = `mouseout${EVENT_KEY}`;
var EVENT_FOCUSIN = `focusin${EVENT_KEY}`;
var EVENT_FOCUSOUT = `focusout${EVENT_KEY}`;
var EVENT_HIDE = `hide${EVENT_KEY}`;
var EVENT_HIDDEN = `hidden${EVENT_KEY}`;
var EVENT_SHOW = `show${EVENT_KEY}`;
var EVENT_SHOWN = `shown${EVENT_KEY}`;
var CLASS_NAME_FADE = "fade";
var CLASS_NAME_HIDE = "hide";
var CLASS_NAME_SHOW = "show";
var CLASS_NAME_SHOWING = "showing";
var DefaultType = {
animation: "boolean",
autohide: "boolean",
delay: "number"
};
var Default = {
animation: true,
autohide: true,
delay: 5e3
};
var Toast = class extends BaseComponent {
constructor(element, config) {
super(element, config);
this._timeout = null;
this._hasMouseInteraction = false;
this._hasKeyboardInteraction = false;
this._setListeners();
}
static get Default() {
return Default;
}
static get DefaultType() {
return DefaultType;
}
static get NAME() {
return NAME;
}
show() {
const showEvent = EventHandler.trigger(this._element, EVENT_SHOW);
if (showEvent.defaultPrevented) {
return;
}
this._clearTimeout();
if (this._config.animation) {
this._element.classList.add(CLASS_NAME_FADE);
}
const complete = () => {
this._element.classList.remove(CLASS_NAME_SHOWING);
EventHandler.trigger(this._element, EVENT_SHOWN);
this._maybeScheduleHide();
};
this._element.classList.remove(CLASS_NAME_HIDE);
reflow(this._element);
this._element.classList.add(CLASS_NAME_SHOW, CLASS_NAME_SHOWING);
this._queueCallback(complete, this._element, this._config.animation);
}
hide() {
if (!this.isShown()) {
return;
}
const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);
if (hideEvent.defaultPrevented) {
return;
}
const complete = () => {
this._element.classList.add(CLASS_NAME_HIDE);
this._element.classList.remove(CLASS_NAME_SHOWING, CLASS_NAME_SHOW);
EventHandler.trigger(this._element, EVENT_HIDDEN);
};
this._element.classList.add(CLASS_NAME_SHOWING);
this._queueCallback(complete, this._element, this._config.animation);
}
dispose() {
this._clearTimeout();
if (this.isShown()) {
this._element.classList.remove(CLASS_NAME_SHOW);
}
super.dispose();
}
isShown() {
return this._element.classList.contains(CLASS_NAME_SHOW);
}
_maybeScheduleHide() {
if (!this._config.autohide) {
return;
}
if (this._hasMouseInteraction || this._hasKeyboardInteraction) {
return;
}
this._timeout = setTimeout(() => {
this.hide();
}, this._config.delay);
}
_onInteraction(event, isInteracting) {
switch (event.type) {
case "mouseover":
case "mouseout": {
this._hasMouseInteraction = isInteracting;
break;
}
case "focusin":
case "focusout": {
this._hasKeyboardInteraction = isInteracting;
break;
}
}
if (isInteracting) {
this._clearTimeout();
return;
}
const nextElement = event.relatedTarget;
if (this._element === nextElement || this._element.contains(nextElement)) {
return;
}
this._maybeScheduleHide();
}
_setListeners() {
EventHandler.on(this._element, EVENT_MOUSEOVER, (event) => this._onInteraction(event, true));
EventHandler.on(this._element, EVENT_MOUSEOUT, (event) => this._onInteraction(event, false));
EventHandler.on(this._element, EVENT_FOCUSIN, (event) => this._onInteraction(event, true));
EventHandler.on(this._element, EVENT_FOCUSOUT, (event) => this._onInteraction(event, false));
}
_clearTimeout() {
clearTimeout(this._timeout);
this._timeout = null;
}
static jQueryInterface(config) {
return this.each(function() {
const data = Toast.getOrCreateInstance(this, config);
if (typeof config === "string") {
if (typeof data[config] === "undefined") {
throw new TypeError(`No method named "${config}"`);
}
data[config](this);
}
});
}
};
enableDismissTrigger(Toast);
defineJQueryPlugin(Toast);
// js/app.js
var import_prism = __toESM(require_prism());
// js/repository.js
var import_jquery = __toESM(require_jquery());
(0, import_jquery.default)(function() {
(0, import_jquery.default)("select.tree").change(function() {
document.location = this.value;
});
});
// js/kmx_anim.js
var import_jquery2 = __toESM(require_jquery());
// js/kmx_colors.js
var kmx_colors = {
"kmx-black": "#1e1f1d",
"kmx-blue": "#5a60f9",
"kmx-blue1": "#6f72f9",
"kmx-blue2": "#9c99fd",
"kmx-blue3": "#5a60f9",
"kmx-blue4": "#6f72f9",
"kmx-blue5": "#9c99fd",
"index": [
"kmx-black",
"kmx-blue",
"kmx-blue1",
"kmx-blue2",
"kmx-blue3",
"kmx-blue4",
"kmx-blue5",
"kmx-cyan",
"kmx-cyan1",
"kmx-green",
"kmx-green1",
"kmx-orange",
"kmx-orange1",
"kmx-orange2",
"kmx-pink",
"kmx-white",
"kmx-white1",
"kmx-white2",
"kmx-yellow",
"kmx-yellow1",
"kmx-yellow2",
"kmx-yellow3"
],
"kmx-cyan": "#d4f3f6",
"kmx-cyan1": "#d4f3f6",
"kmx-green": "#c4ed3a",
"kmx-green1": "#c4ed3a",
"kmx-orange": "#f8681c",
"kmx-orange1": "#fa7734",
"kmx-orange2": "#ffa532",
"kmx-pink": "#fc9ef9",
"kmx-white": "#f5f8f4",
"kmx-white1": "#fff9f2",
"kmx-white2": "#ffffff",
"kmx-yellow": "#ecfe49",
"kmx-yellow1": "#fff43e",
"kmx-yellow2": "#ecfe49",
"kmx-yellow3": "#fff43e"
};
var kmx_colors_default = kmx_colors;
// js/kmx_anim.js
function getRandomInt(max2) {
return Math.floor(Math.random() * max2);
}
(0, import_jquery2.default)(function() {
setInterval(function() {
const i = getRandomInt(kmx_colors_default.index.length);
const name = kmx_colors_default.index[i];
const color = kmx_colors_default[name];
const x = (getRandomInt(99) - 48) * 2e-3;
(0, import_jquery2.default)("a").css("text-shadow", "0 0 0");
(0, import_jquery2.default)("a:hover").css("text-shadow", x + "em 0 0 " + color);
}, 200);
});
// ../deps/phoenix_html/priv/static/phoenix_html.js
(function() {
var PolyfillEvent = eventConstructor();
function eventConstructor() {
if (typeof window.CustomEvent === "function")
return window.CustomEvent;
function CustomEvent2(event, params) {
params = params || { bubbles: false, cancelable: false, detail: void 0 };
var evt = document.createEvent("CustomEvent");
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
return evt;
}
CustomEvent2.prototype = window.Event.prototype;
return CustomEvent2;
}
function buildHiddenInput(name, value) {
var input = document.createElement("input");
input.type = "hidden";
input.name = name;
input.value = value;
return input;
}
function handleClick(element, targetModifierKey) {
var to = element.getAttribute("data-to"), method = buildHiddenInput("_method", element.getAttribute("data-method")), csrf = buildHiddenInput("_csrf_token", element.getAttribute("data-csrf")), form = document.createElement("form"), target = element.getAttribute("target");
form.method = element.getAttribute("data-method") === "get" ? "get" : "post";
form.action = to;
form.style.display = "hidden";
if (target)
form.target = target;
else if (targetModifierKey)
form.target = "_blank";
form.appendChild(csrf);
form.appendChild(method);
document.body.appendChild(form);
form.submit();
}
window.addEventListener("click", function(e) {
var element = e.target;
if (e.defaultPrevented)
return;
while (element && element.getAttribute) {
var phoenixLinkEvent = new PolyfillEvent("phoenix.link.click", {
"bubbles": true,
"cancelable": true
});
if (!element.dispatchEvent(phoenixLinkEvent)) {
e.preventDefault();
e.stopImmediatePropagation();
return false;
}
if (element.getAttribute("data-method")) {
handleClick(element, e.metaKey || e.shiftKey);
e.preventDefault();
return false;
} else {
element = element.parentNode;
}
}
}, false);
window.addEventListener("phoenix.link.click", function(e) {
var message = e.target.getAttribute("data-confirm");
if (message && !window.confirm(message)) {
e.preventDefault();
}
}, false);
})();
// ../deps/phoenix/priv/static/phoenix.esm.js
var closure = (value) => {
if (typeof value === "function") {
return value;
} else {
let closure22 = function() {
return value;
};
return closure22;
}
};
var globalSelf = typeof self !== "undefined" ? self : null;
var phxWindow = typeof window !== "undefined" ? window : null;
var global2 = globalSelf || phxWindow || void 0;
var DEFAULT_VSN = "2.0.0";
var SOCKET_STATES = { connecting: 0, open: 1, closing: 2, closed: 3 };
var DEFAULT_TIMEOUT = 1e4;
var WS_CLOSE_NORMAL = 1e3;
var CHANNEL_STATES = {
closed: "closed",
errored: "errored",
joined: "joined",
joining: "joining",
leaving: "leaving"
};
var CHANNEL_EVENTS = {
close: "phx_close",
error: "phx_error",
join: "phx_join",
reply: "phx_reply",
leave: "phx_leave"
};
var TRANSPORTS = {
longpoll: "longpoll",
websocket: "websocket"
};
var XHR_STATES = {
complete: 4
};
var Push = class {
constructor(channel, event, payload, timeout) {
this.channel = channel;
this.event = event;
this.payload = payload || function() {
return {};
};
this.receivedResp = null;
this.timeout = timeout;
this.timeoutTimer = null;
this.recHooks = [];
this.sent = false;
}
resend(timeout) {
this.timeout = timeout;
this.reset();
this.send();
}
send() {
if (this.hasReceived("timeout")) {
return;
}
this.startTimeout();
this.sent = true;
this.channel.socket.push({
topic: this.channel.topic,
event: this.event,
payload: this.payload(),
ref: this.ref,
join_ref: this.channel.joinRef()
});
}
receive(status, callback) {
if (this.hasReceived(status)) {
callback(this.receivedResp.response);
}
this.recHooks.push({ status, callback });
return this;
}
reset() {
this.cancelRefEvent();
this.ref = null;
this.refEvent = null;
this.receivedResp = null;
this.sent = false;
}
matchReceive({ status, response, _ref }) {
this.recHooks.filter((h) => h.status === status).forEach((h) => h.callback(response));
}
cancelRefEvent() {
if (!this.refEvent) {
return;
}
this.channel.off(this.refEvent);
}
cancelTimeout() {
clearTimeout(this.timeoutTimer);
this.timeoutTimer = null;
}
startTimeout() {
if (this.timeoutTimer) {
this.cancelTimeout();
}
this.ref = this.channel.socket.makeRef();
this.refEvent = this.channel.replyEventName(this.ref);
this.channel.on(this.refEvent, (payload) => {
this.cancelRefEvent();
this.cancelTimeout();
this.receivedResp = payload;
this.matchReceive(payload);
});
this.timeoutTimer = setTimeout(() => {
this.trigger("timeout", {});
}, this.timeout);
}
hasReceived(status) {
return this.receivedResp && this.receivedResp.status === status;
}
trigger(status, response) {
this.channel.trigger(this.refEvent, { status, response });
}
};
var Timer = class {
constructor(callback, timerCalc) {
this.callback = callback;
this.timerCalc = timerCalc;
this.timer = null;
this.tries = 0;
}
reset() {
this.tries = 0;
clearTimeout(this.timer);
}
scheduleTimeout() {
clearTimeout(this.timer);
this.timer = setTimeout(() => {
this.tries = this.tries + 1;
this.callback();
}, this.timerCalc(this.tries + 1));
}
};
var Channel = class {
constructor(topic, params, socket) {
this.state = CHANNEL_STATES.closed;
this.topic = topic;
this.params = closure(params || {});
this.socket = socket;
this.bindings = [];
this.bindingRef = 0;
this.timeout = this.socket.timeout;
this.joinedOnce = false;
this.joinPush = new Push(this, CHANNEL_EVENTS.join, this.params, this.timeout);
this.pushBuffer = [];
this.stateChangeRefs = [];
this.rejoinTimer = new Timer(() => {
if (this.socket.isConnected()) {
this.rejoin();
}
}, this.socket.rejoinAfterMs);
this.stateChangeRefs.push(this.socket.onError(() => this.rejoinTimer.reset()));
this.stateChangeRefs.push(this.socket.onOpen(() => {
this.rejoinTimer.reset();
if (this.isErrored()) {
this.rejoin();
}
}));
this.joinPush.receive("ok", () => {
this.state = CHANNEL_STATES.joined;
this.rejoinTimer.reset();
this.pushBuffer.forEach((pushEvent) => pushEvent.send());
this.pushBuffer = [];
});
this.joinPush.receive("error", () => {
this.state = CHANNEL_STATES.errored;
if (this.socket.isConnected()) {
this.rejoinTimer.scheduleTimeout();
}
});
this.onClose(() => {
this.rejoinTimer.reset();
if (this.socket.hasLogger())
this.socket.log("channel", `close ${this.topic} ${this.joinRef()}`);
this.state = CHANNEL_STATES.closed;
this.socket.remove(this);
});
this.onError((reason) => {
if (this.socket.hasLogger())
this.socket.log("channel", `error ${this.topic}`, reason);
if (this.isJoining()) {
this.joinPush.reset();
}
this.state = CHANNEL_STATES.errored;
if (this.socket.isConnected()) {
this.rejoinTimer.scheduleTimeout();
}
});
this.joinPush.receive("timeout", () => {
if (this.socket.hasLogger())
this.socket.log("channel", `timeout ${this.topic} (${this.joinRef()})`, this.joinPush.timeout);
let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), this.timeout);
leavePush.send();
this.state = CHANNEL_STATES.errored;
this.joinPush.reset();
if (this.socket.isConnected()) {
this.rejoinTimer.scheduleTimeout();
}
});
this.on(CHANNEL_EVENTS.reply, (payload, ref) => {
this.trigger(this.replyEventName(ref), payload);
});
}
join(timeout = this.timeout) {
if (this.joinedOnce) {
throw new Error("tried to join multiple times. 'join' can only be called a single time per channel instance");
} else {
this.timeout = timeout;
this.joinedOnce = true;
this.rejoin();
return this.joinPush;
}
}
onClose(callback) {
this.on(CHANNEL_EVENTS.close, callback);
}
onError(callback) {
return this.on(CHANNEL_EVENTS.error, (reason) => callback(reason));
}
on(event, callback) {
let ref = this.bindingRef++;
this.bindings.push({ event, ref, callback });
return ref;
}
off(event, ref) {
this.bindings = this.bindings.filter((bind) => {
return !(bind.event === event && (typeof ref === "undefined" || ref === bind.ref));
});
}
canPush() {
return this.socket.isConnected() && this.isJoined();
}
push(event, payload, timeout = this.timeout) {
payload = payload || {};
if (!this.joinedOnce) {
throw new Error(`tried to push '${event}' to '${this.topic}' before joining. Use channel.join() before pushing events`);
}
let pushEvent = new Push(this, event, function() {
return payload;
}, timeout);
if (this.canPush()) {
pushEvent.send();
} else {
pushEvent.startTimeout();
this.pushBuffer.push(pushEvent);
}
return pushEvent;
}
leave(timeout = this.timeout) {
this.rejoinTimer.reset();
this.joinPush.cancelTimeout();
this.state = CHANNEL_STATES.leaving;
let onClose = () => {
if (this.socket.hasLogger())
this.socket.log("channel", `leave ${this.topic}`);
this.trigger(CHANNEL_EVENTS.close, "leave");
};
let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), timeout);
leavePush.receive("ok", () => onClose()).receive("timeout", () => onClose());
leavePush.send();
if (!this.canPush()) {
leavePush.trigger("ok", {});
}
return leavePush;
}
onMessage(_event, payload, _ref) {
return payload;
}
isMember(topic, event, payload, joinRef) {
if (this.topic !== topic) {
return false;
}
if (joinRef && joinRef !== this.joinRef()) {
if (this.socket.hasLogger())
this.socket.log("channel", "dropping outdated message", { topic, event, payload, joinRef });
return false;
} else {
return true;
}
}
joinRef() {
return this.joinPush.ref;
}
rejoin(timeout = this.timeout) {
if (this.isLeaving()) {
return;
}
this.socket.leaveOpenTopic(this.topic);
this.state = CHANNEL_STATES.joining;
this.joinPush.resend(timeout);
}
trigger(event, payload, ref, joinRef) {
let handledPayload = this.onMessage(event, payload, ref, joinRef);
if (payload && !handledPayload) {
throw new Error("channel onMessage callbacks must return the payload, modified or unmodified");
}
let eventBindings = this.bindings.filter((bind) => bind.event === event);
for (let i = 0; i < eventBindings.length; i++) {
let bind = eventBindings[i];
bind.callback(handledPayload, ref, joinRef || this.joinRef());
}
}
replyEventName(ref) {
return `chan_reply_${ref}`;
}
isClosed() {
return this.state === CHANNEL_STATES.closed;
}
isErrored() {
return this.state === CHANNEL_STATES.errored;
}
isJoined() {
return this.state === CHANNEL_STATES.joined;
}
isJoining() {
return this.state === CHANNEL_STATES.joining;
}
isLeaving() {
return this.state === CHANNEL_STATES.leaving;
}
};
var Ajax = class {
static request(method, endPoint, accept, body, timeout, ontimeout, callback) {
if (global2.XDomainRequest) {
let req = new global2.XDomainRequest();
this.xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback);
} else {
let req = new global2.XMLHttpRequest();
this.xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback);
}
}
static xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback) {
req.timeout = timeout;
req.open(method, endPoint);
req.onload = () => {
let response = this.parseJSON(req.responseText);
callback && callback(response);
};
if (ontimeout) {
req.ontimeout = ontimeout;
}
req.onprogress = () => {
};
req.send(body);
}
static xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback) {
req.open(method, endPoint, true);
req.timeout = timeout;
req.setRequestHeader("Content-Type", accept);
req.onerror = () => {
callback && callback(null);
};
req.onreadystatechange = () => {
if (req.readyState === XHR_STATES.complete && callback) {
let response = this.parseJSON(req.responseText);
callback(response);
}
};
if (ontimeout) {
req.ontimeout = ontimeout;
}
req.send(body);
}
static parseJSON(resp) {
if (!resp || resp === "") {
return null;
}
try {
return JSON.parse(resp);
} catch (e) {
console && console.log("failed to parse JSON response", resp);
return null;
}
}
static serialize(obj, parentKey) {
let queryStr = [];
for (var key in obj) {
if (!Object.prototype.hasOwnProperty.call(obj, key)) {
continue;
}
let paramKey = parentKey ? `${parentKey}[${key}]` : key;
let paramVal = obj[key];
if (typeof paramVal === "object") {
queryStr.push(this.serialize(paramVal, paramKey));
} else {
queryStr.push(encodeURIComponent(paramKey) + "=" + encodeURIComponent(paramVal));
}
}
return queryStr.join("&");
}
static appendParams(url, params) {
if (Object.keys(params).length === 0) {
return url;
}
let prefix = url.match(/\?/) ? "&" : "?";
return `${url}${prefix}${this.serialize(params)}`;
}
};
var LongPoll = class {
constructor(endPoint) {
this.endPoint = null;
this.token = null;
this.skipHeartbeat = true;
this.onopen = function() {
};
this.onerror = function() {
};
this.onmessage = function() {
};
this.onclose = function() {
};
this.pollEndpoint = this.normalizeEndpoint(endPoint);
this.readyState = SOCKET_STATES.connecting;
this.poll();
}
normalizeEndpoint(endPoint) {
return endPoint.replace("ws://", "http://").replace("wss://", "https://").replace(new RegExp("(.*)/" + TRANSPORTS.websocket), "$1/" + TRANSPORTS.longpoll);
}
endpointURL() {
return Ajax.appendParams(this.pollEndpoint, { token: this.token });
}
closeAndRetry() {
this.close();
this.readyState = SOCKET_STATES.connecting;
}
ontimeout() {
this.onerror("timeout");
this.closeAndRetry();
}
poll() {
if (!(this.readyState === SOCKET_STATES.open || this.readyState === SOCKET_STATES.connecting)) {
return;
}
Ajax.request("GET", this.endpointURL(), "application/json", null, this.timeout, this.ontimeout.bind(this), (resp) => {
if (resp) {
var { status, token, messages } = resp;
this.token = token;
} else {
status = 0;
}
switch (status) {
case 200:
messages.forEach((msg) => {
setTimeout(() => {
this.onmessage({ data: msg });
}, 0);
});
this.poll();
break;
case 204:
this.poll();
break;
case 410:
this.readyState = SOCKET_STATES.open;
this.onopen();
this.poll();
break;
case 403:
this.onerror();
this.close();
break;
case 0:
case 500:
this.onerror();
this.closeAndRetry();
break;
default:
throw new Error(`unhandled poll status ${status}`);
}
});
}
send(body) {
Ajax.request("POST", this.endpointURL(), "application/json", body, this.timeout, this.onerror.bind(this, "timeout"), (resp) => {
if (!resp || resp.status !== 200) {
this.onerror(resp && resp.status);
this.closeAndRetry();
}
});
}
close(_code, _reason) {
this.readyState = SOCKET_STATES.closed;
this.onclose();
}
};
var serializer_default = {
HEADER_LENGTH: 1,
META_LENGTH: 4,
KINDS: { push: 0, reply: 1, broadcast: 2 },
encode(msg, callback) {
if (msg.payload.constructor === ArrayBuffer) {
return callback(this.binaryEncode(msg));
} else {
let payload = [msg.join_ref, msg.ref, msg.topic, msg.event, msg.payload];
return callback(JSON.stringify(payload));
}
},
decode(rawPayload, callback) {
if (rawPayload.constructor === ArrayBuffer) {
return callback(this.binaryDecode(rawPayload));
} else {
let [join_ref, ref, topic, event, payload] = JSON.parse(rawPayload);
return callback({ join_ref, ref, topic, event, payload });
}
},
binaryEncode(message) {
let { join_ref, ref, event, topic, payload } = message;
let metaLength = this.META_LENGTH + join_ref.length + ref.length + topic.length + event.length;
let header = new ArrayBuffer(this.HEADER_LENGTH + metaLength);
let view = new DataView(header);
let offset2 = 0;
view.setUint8(offset2++, this.KINDS.push);
view.setUint8(offset2++, join_ref.length);
view.setUint8(offset2++, ref.length);
view.setUint8(offset2++, topic.length);
view.setUint8(offset2++, event.length);
Array.from(join_ref, (char) => view.setUint8(offset2++, char.charCodeAt(0)));
Array.from(ref, (char) => view.setUint8(offset2++, char.charCodeAt(0)));
Array.from(topic, (char) => view.setUint8(offset2++, char.charCodeAt(0)));
Array.from(event, (char) => view.setUint8(offset2++, char.charCodeAt(0)));
var combined = new Uint8Array(header.byteLength + payload.byteLength);
combined.set(new Uint8Array(header), 0);
combined.set(new Uint8Array(payload), header.byteLength);
return combined.buffer;
},
binaryDecode(buffer) {
let view = new DataView(buffer);
let kind = view.getUint8(0);
let decoder = new TextDecoder();
switch (kind) {
case this.KINDS.push:
return this.decodePush(buffer, view, decoder);
case this.KINDS.reply:
return this.decodeReply(buffer, view, decoder);
case this.KINDS.broadcast:
return this.decodeBroadcast(buffer, view, decoder);
}
},
decodePush(buffer, view, decoder) {
let joinRefSize = view.getUint8(1);
let topicSize = view.getUint8(2);
let eventSize = view.getUint8(3);
let offset2 = this.HEADER_LENGTH + this.META_LENGTH - 1;
let joinRef = decoder.decode(buffer.slice(offset2, offset2 + joinRefSize));
offset2 = offset2 + joinRefSize;
let topic = decoder.decode(buffer.slice(offset2, offset2 + topicSize));
offset2 = offset2 + topicSize;
let event = decoder.decode(buffer.slice(offset2, offset2 + eventSize));
offset2 = offset2 + eventSize;
let data = buffer.slice(offset2, buffer.byteLength);
return { join_ref: joinRef, ref: null, topic, event, payload: data };
},
decodeReply(buffer, view, decoder) {
let joinRefSize = view.getUint8(1);
let refSize = view.getUint8(2);
let topicSize = view.getUint8(3);
let eventSize = view.getUint8(4);
let offset2 = this.HEADER_LENGTH + this.META_LENGTH;
let joinRef = decoder.decode(buffer.slice(offset2, offset2 + joinRefSize));
offset2 = offset2 + joinRefSize;
let ref = decoder.decode(buffer.slice(offset2, offset2 + refSize));
offset2 = offset2 + refSize;
let topic = decoder.decode(buffer.slice(offset2, offset2 + topicSize));
offset2 = offset2 + topicSize;
let event = decoder.decode(buffer.slice(offset2, offset2 + eventSize));
offset2 = offset2 + eventSize;
let data = buffer.slice(offset2, buffer.byteLength);
let payload = { status: event, response: data };
return { join_ref: joinRef, ref, topic, event: CHANNEL_EVENTS.reply, payload };
},
decodeBroadcast(buffer, view, decoder) {
let topicSize = view.getUint8(1);
let eventSize = view.getUint8(2);
let offset2 = this.HEADER_LENGTH + 2;
let topic = decoder.decode(buffer.slice(offset2, offset2 + topicSize));
offset2 = offset2 + topicSize;
let event = decoder.decode(buffer.slice(offset2, offset2 + eventSize));
offset2 = offset2 + eventSize;
let data = buffer.slice(offset2, buffer.byteLength);
return { join_ref: null, ref: null, topic, event, payload: data };
}
};
var Socket = class {
constructor(endPoint, opts = {}) {
this.stateChangeCallbacks = { open: [], close: [], error: [], message: [] };
this.channels = [];
this.sendBuffer = [];
this.ref = 0;
this.timeout = opts.timeout || DEFAULT_TIMEOUT;
this.transport = opts.transport || global2.WebSocket || LongPoll;
this.establishedConnections = 0;
this.defaultEncoder = serializer_default.encode.bind(serializer_default);
this.defaultDecoder = serializer_default.decode.bind(serializer_default);
this.closeWasClean = false;
this.binaryType = opts.binaryType || "arraybuffer";
this.connectClock = 1;
if (this.transport !== LongPoll) {
this.encode = opts.encode || this.defaultEncoder;
this.decode = opts.decode || this.defaultDecoder;
} else {
this.encode = this.defaultEncoder;
this.decode = this.defaultDecoder;
}
let awaitingConnectionOnPageShow = null;
if (phxWindow && phxWindow.addEventListener) {
phxWindow.addEventListener("pagehide", (_e) => {
if (this.conn) {
this.disconnect();
awaitingConnectionOnPageShow = this.connectClock;
}
});
phxWindow.addEventListener("pageshow", (_e) => {
if (awaitingConnectionOnPageShow === this.connectClock) {
awaitingConnectionOnPageShow = null;
this.connect();
}
});
}
this.heartbeatIntervalMs = opts.heartbeatIntervalMs || 3e4;
this.rejoinAfterMs = (tries) => {
if (opts.rejoinAfterMs) {
return opts.rejoinAfterMs(tries);
} else {
return [1e3, 2e3, 5e3][tries - 1] || 1e4;
}
};
this.reconnectAfterMs = (tries) => {
if (opts.reconnectAfterMs) {
return opts.reconnectAfterMs(tries);
} else {
return [10, 50, 100, 150, 200, 250, 500, 1e3, 2e3][tries - 1] || 5e3;
}
};
this.logger = opts.logger || null;
this.longpollerTimeout = opts.longpollerTimeout || 2e4;
this.params = closure(opts.params || {});
this.endPoint = `${endPoint}/${TRANSPORTS.websocket}`;
this.vsn = opts.vsn || DEFAULT_VSN;
this.heartbeatTimer = null;
this.pendingHeartbeatRef = null;
this.reconnectTimer = new Timer(() => {
this.teardown(() => this.connect());
}, this.reconnectAfterMs);
}
replaceTransport(newTransport) {
this.disconnect();
this.transport = newTransport;
}
protocol() {
return location.protocol.match(/^https/) ? "wss" : "ws";
}
endPointURL() {
let uri = Ajax.appendParams(Ajax.appendParams(this.endPoint, this.params()), { vsn: this.vsn });
if (uri.charAt(0) !== "/") {
return uri;
}
if (uri.charAt(1) === "/") {
return `${this.protocol()}:${uri}`;
}
return `${this.protocol()}://${location.host}${uri}`;
}
disconnect(callback, code, reason) {
this.connectClock++;
this.closeWasClean = true;
this.reconnectTimer.reset();
this.teardown(callback, code, reason);
}
connect(params) {
this.connectClock++;
if (params) {
console && console.log("passing params to connect is deprecated. Instead pass :params to the Socket constructor");
this.params = closure(params);
}
if (this.conn) {
return;
}
this.closeWasClean = false;
this.conn = new this.transport(this.endPointURL());
this.conn.binaryType = this.binaryType;
this.conn.timeout = this.longpollerTimeout;
this.conn.onopen = () => this.onConnOpen();
this.conn.onerror = (error) => this.onConnError(error);
this.conn.onmessage = (event) => this.onConnMessage(event);
this.conn.onclose = (event) => this.onConnClose(event);
}
log(kind, msg, data) {
this.logger(kind, msg, data);
}
hasLogger() {
return this.logger !== null;
}
onOpen(callback) {
let ref = this.makeRef();
this.stateChangeCallbacks.open.push([ref, callback]);
return ref;
}
onClose(callback) {
let ref = this.makeRef();
this.stateChangeCallbacks.close.push([ref, callback]);
return ref;
}
onError(callback) {
let ref = this.makeRef();
this.stateChangeCallbacks.error.push([ref, callback]);
return ref;
}
onMessage(callback) {
let ref = this.makeRef();
this.stateChangeCallbacks.message.push([ref, callback]);
return ref;
}
onConnOpen() {
if (this.hasLogger())
this.log("transport", `connected to ${this.endPointURL()}`);
this.closeWasClean = false;
this.establishedConnections++;
this.flushSendBuffer();
this.reconnectTimer.reset();
this.resetHeartbeat();
this.stateChangeCallbacks.open.forEach(([, callback]) => callback());
}
heartbeatTimeout() {
if (this.pendingHeartbeatRef) {
this.pendingHeartbeatRef = null;
if (this.hasLogger()) {
this.log("transport", "heartbeat timeout. Attempting to re-establish connection");
}
this.abnormalClose("heartbeat timeout");
}
}
resetHeartbeat() {
if (this.conn && this.conn.skipHeartbeat) {
return;
}
this.pendingHeartbeatRef = null;
clearTimeout(this.heartbeatTimer);
setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs);
}
teardown(callback, code, reason) {
if (!this.conn) {
return callback && callback();
}
this.waitForBufferDone(() => {
if (this.conn) {
if (code) {
this.conn.close(code, reason || "");
} else {
this.conn.close();
}
}
this.waitForSocketClosed(() => {
if (this.conn) {
this.conn.onclose = function() {
};
this.conn = null;
}
callback && callback();
});
});
}
waitForBufferDone(callback, tries = 1) {
if (tries === 5 || !this.conn || !this.conn.bufferedAmount) {
callback();
return;
}
setTimeout(() => {
this.waitForBufferDone(callback, tries + 1);
}, 150 * tries);
}
waitForSocketClosed(callback, tries = 1) {
if (tries === 5 || !this.conn || this.conn.readyState === SOCKET_STATES.closed) {
callback();
return;
}
setTimeout(() => {
this.waitForSocketClosed(callback, tries + 1);
}, 150 * tries);
}
onConnClose(event) {
let closeCode = event && event.code;
if (this.hasLogger())
this.log("transport", "close", event);
this.triggerChanError();
clearTimeout(this.heartbeatTimer);
if (!this.closeWasClean && closeCode !== 1e3) {
this.reconnectTimer.scheduleTimeout();
}
this.stateChangeCallbacks.close.forEach(([, callback]) => callback(event));
}
onConnError(error) {
if (this.hasLogger())
this.log("transport", error);
let transportBefore = this.transport;
let establishedBefore = this.establishedConnections;
this.stateChangeCallbacks.error.forEach(([, callback]) => {
callback(error, transportBefore, establishedBefore);
});
if (transportBefore === this.transport || establishedBefore > 0) {
this.triggerChanError();
}
}
triggerChanError() {
this.channels.forEach((channel) => {
if (!(channel.isErrored() || channel.isLeaving() || channel.isClosed())) {
channel.trigger(CHANNEL_EVENTS.error);
}
});
}
connectionState() {
switch (this.conn && this.conn.readyState) {
case SOCKET_STATES.connecting:
return "connecting";
case SOCKET_STATES.open:
return "open";
case SOCKET_STATES.closing:
return "closing";
default:
return "closed";
}
}
isConnected() {
return this.connectionState() === "open";
}
remove(channel) {
this.off(channel.stateChangeRefs);
this.channels = this.channels.filter((c) => c.joinRef() !== channel.joinRef());
}
off(refs) {
for (let key in this.stateChangeCallbacks) {
this.stateChangeCallbacks[key] = this.stateChangeCallbacks[key].filter(([ref]) => {
return refs.indexOf(ref) === -1;
});
}
}
channel(topic, chanParams = {}) {
let chan = new Channel(topic, chanParams, this);
this.channels.push(chan);
return chan;
}
push(data) {
if (this.hasLogger()) {
let { topic, event, payload, ref, join_ref } = data;
this.log("push", `${topic} ${event} (${join_ref}, ${ref})`, payload);
}
if (this.isConnected()) {
this.encode(data, (result) => this.conn.send(result));
} else {
this.sendBuffer.push(() => this.encode(data, (result) => this.conn.send(result)));
}
}
makeRef() {
let newRef = this.ref + 1;
if (newRef === this.ref) {
this.ref = 0;
} else {
this.ref = newRef;
}
return this.ref.toString();
}
sendHeartbeat() {
if (this.pendingHeartbeatRef && !this.isConnected()) {
return;
}
this.pendingHeartbeatRef = this.makeRef();
this.push({ topic: "phoenix", event: "heartbeat", payload: {}, ref: this.pendingHeartbeatRef });
this.heartbeatTimer = setTimeout(() => this.heartbeatTimeout(), this.heartbeatIntervalMs);
}
abnormalClose(reason) {
this.closeWasClean = false;
if (this.isConnected()) {
this.conn.close(WS_CLOSE_NORMAL, reason);
}
}
flushSendBuffer() {
if (this.isConnected() && this.sendBuffer.length > 0) {
this.sendBuffer.forEach((callback) => callback());
this.sendBuffer = [];
}
}
onConnMessage(rawMessage) {
this.decode(rawMessage.data, (msg) => {
let { topic, event, payload, ref, join_ref } = msg;
if (ref && ref === this.pendingHeartbeatRef) {
clearTimeout(this.heartbeatTimer);
this.pendingHeartbeatRef = null;
setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs);
}
if (this.hasLogger())
this.log("receive", `${payload.status || ""} ${topic} ${event} ${ref && "(" + ref + ")" || ""}`, payload);
for (let i = 0; i < this.channels.length; i++) {
const channel = this.channels[i];
if (!channel.isMember(topic, event, payload, join_ref)) {
continue;
}
channel.trigger(event, payload, ref, join_ref);
}
for (let i = 0; i < this.stateChangeCallbacks.message.length; i++) {
let [, callback] = this.stateChangeCallbacks.message[i];
callback(msg);
}
});
}
leaveOpenTopic(topic) {
let dupChannel = this.channels.find((c) => c.topic === topic && (c.isJoined() || c.isJoining()));
if (dupChannel) {
if (this.hasLogger())
this.log("transport", `leaving duplicate topic "${topic}"`);
dupChannel.leave();
}
}
};
// ../deps/phoenix_live_view/priv/static/phoenix_live_view.esm.js
var CONSECUTIVE_RELOADS = "consecutive-reloads";
var MAX_RELOADS = 10;
var RELOAD_JITTER_MIN = 1e3;
var RELOAD_JITTER_MAX = 3e3;
var FAILSAFE_JITTER = 3e4;
var PHX_EVENT_CLASSES = [
"phx-click-loading",
"phx-change-loading",
"phx-submit-loading",
"phx-keydown-loading",
"phx-keyup-loading",
"phx-blur-loading",
"phx-focus-loading"
];
var PHX_COMPONENT = "data-phx-component";
var PHX_LIVE_LINK = "data-phx-link";
var PHX_TRACK_STATIC = "track-static";
var PHX_LINK_STATE = "data-phx-link-state";
var PHX_REF = "data-phx-ref";
var PHX_REF_SRC = "data-phx-ref-src";
var PHX_TRACK_UPLOADS = "track-uploads";
var PHX_UPLOAD_REF = "data-phx-upload-ref";
var PHX_PREFLIGHTED_REFS = "data-phx-preflighted-refs";
var PHX_DONE_REFS = "data-phx-done-refs";
var PHX_DROP_TARGET = "drop-target";
var PHX_ACTIVE_ENTRY_REFS = "data-phx-active-refs";
var PHX_LIVE_FILE_UPDATED = "phx:live-file:updated";
var PHX_SKIP = "data-phx-skip";
var PHX_PRUNE = "data-phx-prune";
var PHX_PAGE_LOADING = "page-loading";
var PHX_CONNECTED_CLASS = "phx-connected";
var PHX_DISCONNECTED_CLASS = "phx-loading";
var PHX_NO_FEEDBACK_CLASS = "phx-no-feedback";
var PHX_ERROR_CLASS = "phx-error";
var PHX_PARENT_ID = "data-phx-parent-id";
var PHX_MAIN = "data-phx-main";
var PHX_ROOT_ID = "data-phx-root-id";
var PHX_TRIGGER_ACTION = "trigger-action";
var PHX_FEEDBACK_FOR = "feedback-for";
var PHX_HAS_FOCUSED = "phx-has-focused";
var FOCUSABLE_INPUTS = ["text", "textarea", "number", "email", "password", "search", "tel", "url", "date", "time", "datetime-local", "color", "range"];
var CHECKABLE_INPUTS = ["checkbox", "radio"];
var PHX_HAS_SUBMITTED = "phx-has-submitted";
var PHX_SESSION = "data-phx-session";
var PHX_VIEW_SELECTOR = `[${PHX_SESSION}]`;
var PHX_STICKY = "data-phx-sticky";
var PHX_STATIC = "data-phx-static";
var PHX_READONLY = "data-phx-readonly";
var PHX_DISABLED = "data-phx-disabled";
var PHX_DISABLE_WITH = "disable-with";
var PHX_DISABLE_WITH_RESTORE = "data-phx-disable-with-restore";
var PHX_HOOK = "hook";
var PHX_DEBOUNCE = "debounce";
var PHX_THROTTLE = "throttle";
var PHX_UPDATE = "update";
var PHX_KEY = "key";
var PHX_PRIVATE = "phxPrivate";
var PHX_AUTO_RECOVER = "auto-recover";
var PHX_LV_DEBUG = "phx:live-socket:debug";
var PHX_LV_PROFILE = "phx:live-socket:profiling";
var PHX_LV_LATENCY_SIM = "phx:live-socket:latency-sim";
var PHX_PROGRESS = "progress";
var LOADER_TIMEOUT = 1;
var BEFORE_UNLOAD_LOADER_TIMEOUT = 200;
var BINDING_PREFIX = "phx-";
var PUSH_TIMEOUT = 3e4;
var DEBOUNCE_TRIGGER = "debounce-trigger";
var THROTTLED = "throttled";
var DEBOUNCE_PREV_KEY = "debounce-prev-key";
var DEFAULTS = {
debounce: 300,
throttle: 300
};
var DYNAMICS = "d";
var STATIC = "s";
var COMPONENTS = "c";
var EVENTS = "e";
var REPLY = "r";
var TITLE = "t";
var TEMPLATES = "p";
var EntryUploader = class {
constructor(entry, chunkSize, liveSocket2) {
this.liveSocket = liveSocket2;
this.entry = entry;
this.offset = 0;
this.chunkSize = chunkSize;
this.chunkTimer = null;
this.uploadChannel = liveSocket2.channel(`lvu:${entry.ref}`, { token: entry.metadata() });
}
error(reason) {
clearTimeout(this.chunkTimer);
this.uploadChannel.leave();
this.entry.error(reason);
}
upload() {
this.uploadChannel.onError((reason) => this.error(reason));
this.uploadChannel.join().receive("ok", (_data) => this.readNextChunk()).receive("error", (reason) => this.error(reason));
}
isDone() {
return this.offset >= this.entry.file.size;
}
readNextChunk() {
let reader = new window.FileReader();
let blob = this.entry.file.slice(this.offset, this.chunkSize + this.offset);
reader.onload = (e) => {
if (e.target.error === null) {
this.offset += e.target.result.byteLength;
this.pushChunk(e.target.result);
} else {
return logError("Read error: " + e.target.error);
}
};
reader.readAsArrayBuffer(blob);
}
pushChunk(chunk) {
if (!this.uploadChannel.isJoined()) {
return;
}
this.uploadChannel.push("chunk", chunk).receive("ok", () => {
this.entry.progress(this.offset / this.entry.file.size * 100);
if (!this.isDone()) {
this.chunkTimer = setTimeout(() => this.readNextChunk(), this.liveSocket.getLatencySim() || 0);
}
});
}
};
var logError = (msg, obj) => console.error && console.error(msg, obj);
var isCid = (cid) => {
let type = typeof cid;
return type === "number" || type === "string" && /^(0|[1-9]\d*)$/.test(cid);
};
function detectDuplicateIds() {
let ids = /* @__PURE__ */ new Set();
let elems = document.querySelectorAll("*[id]");
for (let i = 0, len = elems.length; i < len; i++) {
if (ids.has(elems[i].id)) {
console.error(`Multiple IDs detected: ${elems[i].id}. Ensure unique element ids.`);
} else {
ids.add(elems[i].id);
}
}
}
var debug = (view, kind, msg, obj) => {
if (view.liveSocket.isDebugEnabled()) {
console.log(`${view.id} ${kind}: ${msg} - `, obj);
}
};
var closure2 = (val) => typeof val === "function" ? val : function() {
return val;
};
var clone = (obj) => {
return JSON.parse(JSON.stringify(obj));
};
var closestPhxBinding = (el, binding, borderEl) => {
do {
if (el.matches(`[${binding}]`)) {
return el;
}
el = el.parentElement || el.parentNode;
} while (el !== null && el.nodeType === 1 && !(borderEl && borderEl.isSameNode(el) || el.matches(PHX_VIEW_SELECTOR)));
return null;
};
var isObject = (obj) => {
return obj !== null && typeof obj === "object" && !(obj instanceof Array);
};
var isEqualObj = (obj1, obj2) => JSON.stringify(obj1) === JSON.stringify(obj2);
var isEmpty = (obj) => {
for (let x in obj) {
return false;
}
return true;
};
var maybe = (el, callback) => el && callback(el);
var channelUploader = function(entries, onError, resp, liveSocket2) {
entries.forEach((entry) => {
let entryUploader = new EntryUploader(entry, resp.config.chunk_size, liveSocket2);
entryUploader.upload();
});
};
var Browser = {
canPushState() {
return typeof history.pushState !== "undefined";
},
dropLocal(localStorage, namespace, subkey) {
return localStorage.removeItem(this.localKey(namespace, subkey));
},
updateLocal(localStorage, namespace, subkey, initial, func) {
let current = this.getLocal(localStorage, namespace, subkey);
let key = this.localKey(namespace, subkey);
let newVal = current === null ? initial : func(current);
localStorage.setItem(key, JSON.stringify(newVal));
return newVal;
},
getLocal(localStorage, namespace, subkey) {
return JSON.parse(localStorage.getItem(this.localKey(namespace, subkey)));
},
updateCurrentState(callback) {
if (!this.canPushState()) {
return;
}
history.replaceState(callback(history.state || {}), "", window.location.href);
},
pushState(kind, meta, to) {
if (this.canPushState()) {
if (to !== window.location.href) {
if (meta.type == "redirect" && meta.scroll) {
let currentState = history.state || {};
currentState.scroll = meta.scroll;
history.replaceState(currentState, "", window.location.href);
}
delete meta.scroll;
history[kind + "State"](meta, "", to || null);
let hashEl = this.getHashTargetEl(window.location.hash);
if (hashEl) {
hashEl.scrollIntoView();
} else if (meta.type === "redirect") {
window.scroll(0, 0);
}
}
} else {
this.redirect(to);
}
},
setCookie(name, value) {
document.cookie = `${name}=${value}`;
},
getCookie(name) {
return document.cookie.replace(new RegExp(`(?:(?:^|.*;s*)${name}s*=s*([^;]*).*$)|^.*$`), "$1");
},
redirect(toURL, flash) {
if (flash) {
Browser.setCookie("__phoenix_flash__", flash + "; max-age=60000; path=/");
}
window.location = toURL;
},
localKey(namespace, subkey) {
return `${namespace}-${subkey}`;
},
getHashTargetEl(maybeHash) {
let hash3 = maybeHash.toString().substring(1);
if (hash3 === "") {
return;
}
return document.getElementById(hash3) || document.querySelector(`a[name="${hash3}"]`);
}
};
var browser_default = Browser;
var DOM = {
byId(id) {
return document.getElementById(id) || logError(`no id found for ${id}`);
},
removeClass(el, className) {
el.classList.remove(className);
if (el.classList.length === 0) {
el.removeAttribute("class");
}
},
all(node, query, callback) {
if (!node) {
return [];
}
let array = Array.from(node.querySelectorAll(query));
return callback ? array.forEach(callback) : array;
},
childNodeLength(html) {
let template = document.createElement("template");
template.innerHTML = html;
return template.content.childElementCount;
},
isUploadInput(el) {
return el.type === "file" && el.getAttribute(PHX_UPLOAD_REF) !== null;
},
findUploadInputs(node) {
return this.all(node, `input[type="file"][${PHX_UPLOAD_REF}]`);
},
findComponentNodeList(node, cid) {
return this.filterWithinSameLiveView(this.all(node, `[${PHX_COMPONENT}="${cid}"]`), node);
},
isPhxDestroyed(node) {
return node.id && DOM.private(node, "destroyed") ? true : false;
},
markPhxChildDestroyed(el) {
if (this.isPhxChild(el)) {
el.setAttribute(PHX_SESSION, "");
}
this.putPrivate(el, "destroyed", true);
},
findPhxChildrenInFragment(html, parentId) {
let template = document.createElement("template");
template.innerHTML = html;
return this.findPhxChildren(template.content, parentId);
},
isIgnored(el, phxUpdate) {
return (el.getAttribute(phxUpdate) || el.getAttribute("data-phx-update")) === "ignore";
},
isPhxUpdate(el, phxUpdate, updateTypes) {
return el.getAttribute && updateTypes.indexOf(el.getAttribute(phxUpdate)) >= 0;
},
findPhxSticky(el) {
return this.all(el, `[${PHX_STICKY}]`);
},
findPhxChildren(el, parentId) {
return this.all(el, `${PHX_VIEW_SELECTOR}[${PHX_PARENT_ID}="${parentId}"]`);
},
findParentCIDs(node, cids) {
let initial = new Set(cids);
return cids.reduce((acc, cid) => {
let selector = `[${PHX_COMPONENT}="${cid}"] [${PHX_COMPONENT}]`;
this.filterWithinSameLiveView(this.all(node, selector), node).map((el) => parseInt(el.getAttribute(PHX_COMPONENT))).forEach((childCID) => acc.delete(childCID));
return acc;
}, initial);
},
filterWithinSameLiveView(nodes, parent) {
if (parent.querySelector(PHX_VIEW_SELECTOR)) {
return nodes.filter((el) => this.withinSameLiveView(el, parent));
} else {
return nodes;
}
},
withinSameLiveView(node, parent) {
while (node = node.parentNode) {
if (node.isSameNode(parent)) {
return true;
}
if (node.getAttribute(PHX_SESSION) !== null) {
return false;
}
}
},
private(el, key) {
return el[PHX_PRIVATE] && el[PHX_PRIVATE][key];
},
deletePrivate(el, key) {
el[PHX_PRIVATE] && delete el[PHX_PRIVATE][key];
},
putPrivate(el, key, value) {
if (!el[PHX_PRIVATE]) {
el[PHX_PRIVATE] = {};
}
el[PHX_PRIVATE][key] = value;
},
updatePrivate(el, key, defaultVal, updateFunc) {
let existing = this.private(el, key);
if (existing === void 0) {
this.putPrivate(el, key, updateFunc(defaultVal));
} else {
this.putPrivate(el, key, updateFunc(existing));
}
},
copyPrivates(target, source) {
if (source[PHX_PRIVATE]) {
target[PHX_PRIVATE] = source[PHX_PRIVATE];
}
},
putTitle(str) {
let titleEl = document.querySelector("title");
let { prefix, suffix } = titleEl.dataset;
document.title = `${prefix || ""}${str}${suffix || ""}`;
},
debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, callback) {
let debounce2 = el.getAttribute(phxDebounce);
let throttle = el.getAttribute(phxThrottle);
if (debounce2 === "") {
debounce2 = defaultDebounce;
}
if (throttle === "") {
throttle = defaultThrottle;
}
let value = debounce2 || throttle;
switch (value) {
case null:
return callback();
case "blur":
if (this.once(el, "debounce-blur")) {
el.addEventListener("blur", () => callback());
}
return;
default:
let timeout = parseInt(value);
let trigger = () => throttle ? this.deletePrivate(el, THROTTLED) : callback();
let currentCycle = this.incCycle(el, DEBOUNCE_TRIGGER, trigger);
if (isNaN(timeout)) {
return logError(`invalid throttle/debounce value: ${value}`);
}
if (throttle) {
let newKeyDown = false;
if (event.type === "keydown") {
let prevKey = this.private(el, DEBOUNCE_PREV_KEY);
this.putPrivate(el, DEBOUNCE_PREV_KEY, event.key);
newKeyDown = prevKey !== event.key;
}
if (!newKeyDown && this.private(el, THROTTLED)) {
return false;
} else {
callback();
this.putPrivate(el, THROTTLED, true);
setTimeout(() => this.triggerCycle(el, DEBOUNCE_TRIGGER), timeout);
}
} else {
setTimeout(() => this.triggerCycle(el, DEBOUNCE_TRIGGER, currentCycle), timeout);
}
let form = el.form;
if (form && this.once(form, "bind-debounce")) {
form.addEventListener("submit", () => {
Array.from(new FormData(form).entries(), ([name]) => {
let input = form.querySelector(`[name="${name}"]`);
this.incCycle(input, DEBOUNCE_TRIGGER);
this.deletePrivate(input, THROTTLED);
});
});
}
if (this.once(el, "bind-debounce")) {
el.addEventListener("blur", () => this.triggerCycle(el, DEBOUNCE_TRIGGER));
}
}
},
triggerCycle(el, key, currentCycle) {
let [cycle, trigger] = this.private(el, key);
if (!currentCycle) {
currentCycle = cycle;
}
if (currentCycle === cycle) {
this.incCycle(el, key);
trigger();
}
},
once(el, key) {
if (this.private(el, key) === true) {
return false;
}
this.putPrivate(el, key, true);
return true;
},
incCycle(el, key, trigger = function() {
}) {
let [currentCycle] = this.private(el, key) || [0, trigger];
currentCycle++;
this.putPrivate(el, key, [currentCycle, trigger]);
return currentCycle;
},
discardError(container, el, phxFeedbackFor) {
let field = el.getAttribute && el.getAttribute(phxFeedbackFor);
let input = field && container.querySelector(`[id="${field}"], [name="${field}"]`);
if (!input) {
return;
}
if (!(this.private(input, PHX_HAS_FOCUSED) || this.private(input.form, PHX_HAS_SUBMITTED))) {
el.classList.add(PHX_NO_FEEDBACK_CLASS);
}
},
showError(inputEl, phxFeedbackFor) {
if (inputEl.id || inputEl.name) {
this.all(inputEl.form, `[${phxFeedbackFor}="${inputEl.id}"], [${phxFeedbackFor}="${inputEl.name}"]`, (el) => {
this.removeClass(el, PHX_NO_FEEDBACK_CLASS);
});
}
},
isPhxChild(node) {
return node.getAttribute && node.getAttribute(PHX_PARENT_ID);
},
isPhxSticky(node) {
return node.getAttribute && node.getAttribute(PHX_STICKY) !== null;
},
firstPhxChild(el) {
return this.isPhxChild(el) ? el : this.all(el, `[${PHX_PARENT_ID}]`)[0];
},
dispatchEvent(target, eventString, detail = {}) {
let event = new CustomEvent(eventString, { bubbles: true, cancelable: true, detail });
target.dispatchEvent(event);
},
cloneNode(node, html) {
if (typeof html === "undefined") {
return node.cloneNode(true);
} else {
let cloned = node.cloneNode(false);
cloned.innerHTML = html;
return cloned;
}
},
mergeAttrs(target, source, opts = {}) {
let exclude = opts.exclude || [];
let isIgnored = opts.isIgnored;
let sourceAttrs = source.attributes;
for (let i = sourceAttrs.length - 1; i >= 0; i--) {
let name = sourceAttrs[i].name;
if (exclude.indexOf(name) < 0) {
target.setAttribute(name, source.getAttribute(name));
}
}
let targetAttrs = target.attributes;
for (let i = targetAttrs.length - 1; i >= 0; i--) {
let name = targetAttrs[i].name;
if (isIgnored) {
if (name.startsWith("data-") && !source.hasAttribute(name)) {
target.removeAttribute(name);
}
} else {
if (!source.hasAttribute(name)) {
target.removeAttribute(name);
}
}
}
},
mergeFocusedInput(target, source) {
if (!(target instanceof HTMLSelectElement)) {
DOM.mergeAttrs(target, source, { except: ["value"] });
}
if (source.readOnly) {
target.setAttribute("readonly", true);
} else {
target.removeAttribute("readonly");
}
},
hasSelectionRange(el) {
return el.setSelectionRange && (el.type === "text" || el.type === "textarea");
},
restoreFocus(focused, selectionStart, selectionEnd) {
if (!DOM.isTextualInput(focused)) {
return;
}
let wasFocused = focused.matches(":focus");
if (focused.readOnly) {
focused.blur();
}
if (!wasFocused) {
focused.focus();
}
if (this.hasSelectionRange(focused)) {
focused.setSelectionRange(selectionStart, selectionEnd);
}
},
isFormInput(el) {
return /^(?:input|select|textarea)$/i.test(el.tagName) && el.type !== "button";
},
syncAttrsToProps(el) {
if (el instanceof HTMLInputElement && CHECKABLE_INPUTS.indexOf(el.type.toLocaleLowerCase()) >= 0) {
el.checked = el.getAttribute("checked") !== null;
}
},
isTextualInput(el) {
return FOCUSABLE_INPUTS.indexOf(el.type) >= 0;
},
isNowTriggerFormExternal(el, phxTriggerExternal) {
return el.getAttribute && el.getAttribute(phxTriggerExternal) !== null;
},
syncPendingRef(fromEl, toEl, disableWith) {
let ref = fromEl.getAttribute(PHX_REF);
if (ref === null) {
return true;
}
let refSrc = fromEl.getAttribute(PHX_REF_SRC);
if (DOM.isFormInput(fromEl) || fromEl.getAttribute(disableWith) !== null) {
if (DOM.isUploadInput(fromEl)) {
DOM.mergeAttrs(fromEl, toEl, { isIgnored: true });
}
DOM.putPrivate(fromEl, PHX_REF, toEl);
return false;
} else {
PHX_EVENT_CLASSES.forEach((className) => {
fromEl.classList.contains(className) && toEl.classList.add(className);
});
toEl.setAttribute(PHX_REF, ref);
toEl.setAttribute(PHX_REF_SRC, refSrc);
return true;
}
},
cleanChildNodes(container, phxUpdate) {
if (DOM.isPhxUpdate(container, phxUpdate, ["append", "prepend"])) {
let toRemove = [];
container.childNodes.forEach((childNode) => {
if (!childNode.id) {
let isEmptyTextNode = childNode.nodeType === Node.TEXT_NODE && childNode.nodeValue.trim() === "";
if (!isEmptyTextNode) {
logError(`only HTML element tags with an id are allowed inside containers with phx-update.
removing illegal node: "${(childNode.outerHTML || childNode.nodeValue).trim()}"
`);
}
toRemove.push(childNode);
}
});
toRemove.forEach((childNode) => childNode.remove());
}
},
replaceRootContainer(container, tagName, attrs) {
let retainedAttrs = /* @__PURE__ */ new Set(["id", PHX_SESSION, PHX_STATIC, PHX_MAIN, PHX_ROOT_ID]);
if (container.tagName.toLowerCase() === tagName.toLowerCase()) {
Array.from(container.attributes).filter((attr) => !retainedAttrs.has(attr.name.toLowerCase())).forEach((attr) => container.removeAttribute(attr.name));
Object.keys(attrs).filter((name) => !retainedAttrs.has(name.toLowerCase())).forEach((attr) => container.setAttribute(attr, attrs[attr]));
return container;
} else {
let newContainer = document.createElement(tagName);
Object.keys(attrs).forEach((attr) => newContainer.setAttribute(attr, attrs[attr]));
retainedAttrs.forEach((attr) => newContainer.setAttribute(attr, container.getAttribute(attr)));
newContainer.innerHTML = container.innerHTML;
container.replaceWith(newContainer);
return newContainer;
}
},
getSticky(el, name, defaultVal) {
let op = (DOM.private(el, "sticky") || []).find(([existingName]) => name === existingName);
if (op) {
let [_name, _op, stashedResult] = op;
return stashedResult;
} else {
return typeof defaultVal === "function" ? defaultVal() : defaultVal;
}
},
deleteSticky(el, name) {
this.updatePrivate(el, "sticky", [], (ops) => {
return ops.filter(([existingName, _]) => existingName !== name);
});
},
putSticky(el, name, op) {
let stashedResult = op(el);
this.updatePrivate(el, "sticky", [], (ops) => {
let existingIndex = ops.findIndex(([existingName]) => name === existingName);
if (existingIndex >= 0) {
ops[existingIndex] = [name, op, stashedResult];
} else {
ops.push([name, op, stashedResult]);
}
return ops;
});
},
applyStickyOperations(el) {
let ops = DOM.private(el, "sticky");
if (!ops) {
return;
}
ops.forEach(([name, op, _stashed]) => this.putSticky(el, name, op));
}
};
var dom_default = DOM;
var UploadEntry = class {
static isActive(fileEl, file) {
let isNew = file._phxRef === void 0;
let activeRefs = fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(",");
let isActive = activeRefs.indexOf(LiveUploader.genFileRef(file)) >= 0;
return file.size > 0 && (isNew || isActive);
}
static isPreflighted(fileEl, file) {
let preflightedRefs = fileEl.getAttribute(PHX_PREFLIGHTED_REFS).split(",");
let isPreflighted = preflightedRefs.indexOf(LiveUploader.genFileRef(file)) >= 0;
return isPreflighted && this.isActive(fileEl, file);
}
constructor(fileEl, file, view) {
this.ref = LiveUploader.genFileRef(file);
this.fileEl = fileEl;
this.file = file;
this.view = view;
this.meta = null;
this._isCancelled = false;
this._isDone = false;
this._progress = 0;
this._lastProgressSent = -1;
this._onDone = function() {
};
this._onElUpdated = this.onElUpdated.bind(this);
this.fileEl.addEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated);
}
metadata() {
return this.meta;
}
progress(progress) {
this._progress = Math.floor(progress);
if (this._progress > this._lastProgressSent) {
if (this._progress >= 100) {
this._progress = 100;
this._lastProgressSent = 100;
this._isDone = true;
this.view.pushFileProgress(this.fileEl, this.ref, 100, () => {
LiveUploader.untrackFile(this.fileEl, this.file);
this._onDone();
});
} else {
this._lastProgressSent = this._progress;
this.view.pushFileProgress(this.fileEl, this.ref, this._progress);
}
}
}
cancel() {
this._isCancelled = true;
this._isDone = true;
this._onDone();
}
isDone() {
return this._isDone;
}
error(reason = "failed") {
this.view.pushFileProgress(this.fileEl, this.ref, { error: reason });
LiveUploader.clearFiles(this.fileEl);
}
onDone(callback) {
this._onDone = () => {
this.fileEl.removeEventListener(PHX_LIVE_FILE_UPDATED, this._onElUpdated);
callback();
};
}
onElUpdated() {
let activeRefs = this.fileEl.getAttribute(PHX_ACTIVE_ENTRY_REFS).split(",");
if (activeRefs.indexOf(this.ref) === -1) {
this.cancel();
}
}
toPreflightPayload() {
return {
last_modified: this.file.lastModified,
name: this.file.name,
size: this.file.size,
type: this.file.type,
ref: this.ref
};
}
uploader(uploaders) {
if (this.meta.uploader) {
let callback = uploaders[this.meta.uploader] || logError(`no uploader configured for ${this.meta.uploader}`);
return { name: this.meta.uploader, callback };
} else {
return { name: "channel", callback: channelUploader };
}
}
zipPostFlight(resp) {
this.meta = resp.entries[this.ref];
if (!this.meta) {
logError(`no preflight upload response returned with ref ${this.ref}`, { input: this.fileEl, response: resp });
}
}
};
var liveUploaderFileRef = 0;
var LiveUploader = class {
static genFileRef(file) {
let ref = file._phxRef;
if (ref !== void 0) {
return ref;
} else {
file._phxRef = (liveUploaderFileRef++).toString();
return file._phxRef;
}
}
static getEntryDataURL(inputEl, ref, callback) {
let file = this.activeFiles(inputEl).find((file2) => this.genFileRef(file2) === ref);
callback(URL.createObjectURL(file));
}
static hasUploadsInProgress(formEl) {
let active = 0;
dom_default.findUploadInputs(formEl).forEach((input) => {
if (input.getAttribute(PHX_PREFLIGHTED_REFS) !== input.getAttribute(PHX_DONE_REFS)) {
active++;
}
});
return active > 0;
}
static serializeUploads(inputEl) {
let files = this.activeFiles(inputEl);
let fileData = {};
files.forEach((file) => {
let entry = { path: inputEl.name };
let uploadRef = inputEl.getAttribute(PHX_UPLOAD_REF);
fileData[uploadRef] = fileData[uploadRef] || [];
entry.ref = this.genFileRef(file);
entry.name = file.name || entry.ref;
entry.type = file.type;
entry.size = file.size;
fileData[uploadRef].push(entry);
});
return fileData;
}
static clearFiles(inputEl) {
inputEl.value = null;
inputEl.removeAttribute(PHX_UPLOAD_REF);
dom_default.putPrivate(inputEl, "files", []);
}
static untrackFile(inputEl, file) {
dom_default.putPrivate(inputEl, "files", dom_default.private(inputEl, "files").filter((f) => !Object.is(f, file)));
}
static trackFiles(inputEl, files) {
if (inputEl.getAttribute("multiple") !== null) {
let newFiles = files.filter((file) => !this.activeFiles(inputEl).find((f) => Object.is(f, file)));
dom_default.putPrivate(inputEl, "files", this.activeFiles(inputEl).concat(newFiles));
inputEl.value = null;
} else {
dom_default.putPrivate(inputEl, "files", files);
}
}
static activeFileInputs(formEl) {
let fileInputs = dom_default.findUploadInputs(formEl);
return Array.from(fileInputs).filter((el) => el.files && this.activeFiles(el).length > 0);
}
static activeFiles(input) {
return (dom_default.private(input, "files") || []).filter((f) => UploadEntry.isActive(input, f));
}
static inputsAwaitingPreflight(formEl) {
let fileInputs = dom_default.findUploadInputs(formEl);
return Array.from(fileInputs).filter((input) => this.filesAwaitingPreflight(input).length > 0);
}
static filesAwaitingPreflight(input) {
return this.activeFiles(input).filter((f) => !UploadEntry.isPreflighted(input, f));
}
constructor(inputEl, view, onComplete) {
this.view = view;
this.onComplete = onComplete;
this._entries = Array.from(LiveUploader.filesAwaitingPreflight(inputEl) || []).map((file) => new UploadEntry(inputEl, file, view));
this.numEntriesInProgress = this._entries.length;
}
entries() {
return this._entries;
}
initAdapterUpload(resp, onError, liveSocket2) {
this._entries = this._entries.map((entry) => {
entry.zipPostFlight(resp);
entry.onDone(() => {
this.numEntriesInProgress--;
if (this.numEntriesInProgress === 0) {
this.onComplete();
}
});
return entry;
});
let groupedEntries = this._entries.reduce((acc, entry) => {
let { name, callback } = entry.uploader(liveSocket2.uploaders);
acc[name] = acc[name] || { callback, entries: [] };
acc[name].entries.push(entry);
return acc;
}, {});
for (let name in groupedEntries) {
let { callback, entries } = groupedEntries[name];
callback(entries, onError, resp, liveSocket2);
}
}
};
var Hooks = {
LiveFileUpload: {
activeRefs() {
return this.el.getAttribute(PHX_ACTIVE_ENTRY_REFS);
},
preflightedRefs() {
return this.el.getAttribute(PHX_PREFLIGHTED_REFS);
},
mounted() {
this.preflightedWas = this.preflightedRefs();
},
updated() {
let newPreflights = this.preflightedRefs();
if (this.preflightedWas !== newPreflights) {
this.preflightedWas = newPreflights;
if (newPreflights === "") {
this.__view.cancelSubmit(this.el.form);
}
}
if (this.activeRefs() === "") {
this.el.value = null;
}
this.el.dispatchEvent(new CustomEvent(PHX_LIVE_FILE_UPDATED));
}
},
LiveImgPreview: {
mounted() {
this.ref = this.el.getAttribute("data-phx-entry-ref");
this.inputEl = document.getElementById(this.el.getAttribute(PHX_UPLOAD_REF));
LiveUploader.getEntryDataURL(this.inputEl, this.ref, (url) => {
this.url = url;
this.el.src = url;
});
},
destroyed() {
URL.revokeObjectURL(this.url);
}
}
};
var hooks_default = Hooks;
var DOMPostMorphRestorer = class {
constructor(containerBefore, containerAfter, updateType) {
let idsBefore = /* @__PURE__ */ new Set();
let idsAfter = new Set([...containerAfter.children].map((child) => child.id));
let elementsToModify = [];
Array.from(containerBefore.children).forEach((child) => {
if (child.id) {
idsBefore.add(child.id);
if (idsAfter.has(child.id)) {
let previousElementId = child.previousElementSibling && child.previousElementSibling.id;
elementsToModify.push({ elementId: child.id, previousElementId });
}
}
});
this.containerId = containerAfter.id;
this.updateType = updateType;
this.elementsToModify = elementsToModify;
this.elementIdsToAdd = [...idsAfter].filter((id) => !idsBefore.has(id));
}
perform() {
let container = dom_default.byId(this.containerId);
this.elementsToModify.forEach((elementToModify) => {
if (elementToModify.previousElementId) {
maybe(document.getElementById(elementToModify.previousElementId), (previousElem) => {
maybe(document.getElementById(elementToModify.elementId), (elem) => {
let isInRightPlace = elem.previousElementSibling && elem.previousElementSibling.id == previousElem.id;
if (!isInRightPlace) {
previousElem.insertAdjacentElement("afterend", elem);
}
});
});
} else {
maybe(document.getElementById(elementToModify.elementId), (elem) => {
let isInRightPlace = elem.previousElementSibling == null;
if (!isInRightPlace) {
container.insertAdjacentElement("afterbegin", elem);
}
});
}
});
if (this.updateType == "prepend") {
this.elementIdsToAdd.reverse().forEach((elemId) => {
maybe(document.getElementById(elemId), (elem) => container.insertAdjacentElement("afterbegin", elem));
});
}
}
};
var DOCUMENT_FRAGMENT_NODE = 11;
function morphAttrs(fromNode, toNode) {
var toNodeAttrs = toNode.attributes;
var attr;
var attrName;
var attrNamespaceURI;
var attrValue;
var fromValue;
if (toNode.nodeType === DOCUMENT_FRAGMENT_NODE || fromNode.nodeType === DOCUMENT_FRAGMENT_NODE) {
return;
}
for (var i = toNodeAttrs.length - 1; i >= 0; i--) {
attr = toNodeAttrs[i];
attrName = attr.name;
attrNamespaceURI = attr.namespaceURI;
attrValue = attr.value;
if (attrNamespaceURI) {
attrName = attr.localName || attrName;
fromValue = fromNode.getAttributeNS(attrNamespaceURI, attrName);
if (fromValue !== attrValue) {
if (attr.prefix === "xmlns") {
attrName = attr.name;
}
fromNode.setAttributeNS(attrNamespaceURI, attrName, attrValue);
}
} else {
fromValue = fromNode.getAttribute(attrName);
if (fromValue !== attrValue) {
fromNode.setAttribute(attrName, attrValue);
}
}
}
var fromNodeAttrs = fromNode.attributes;
for (var d = fromNodeAttrs.length - 1; d >= 0; d--) {
attr = fromNodeAttrs[d];
attrName = attr.name;
attrNamespaceURI = attr.namespaceURI;
if (attrNamespaceURI) {
attrName = attr.localName || attrName;
if (!toNode.hasAttributeNS(attrNamespaceURI, attrName)) {
fromNode.removeAttributeNS(attrNamespaceURI, attrName);
}
} else {
if (!toNode.hasAttribute(attrName)) {
fromNode.removeAttribute(attrName);
}
}
}
}
var range;
var NS_XHTML = "http://www.w3.org/1999/xhtml";
var doc = typeof document === "undefined" ? void 0 : document;
var HAS_TEMPLATE_SUPPORT = !!doc && "content" in doc.createElement("template");
var HAS_RANGE_SUPPORT = !!doc && doc.createRange && "createContextualFragment" in doc.createRange();
function createFragmentFromTemplate(str) {
var template = doc.createElement("template");
template.innerHTML = str;
return template.content.childNodes[0];
}
function createFragmentFromRange(str) {
if (!range) {
range = doc.createRange();
range.selectNode(doc.body);
}
var fragment = range.createContextualFragment(str);
return fragment.childNodes[0];
}
function createFragmentFromWrap(str) {
var fragment = doc.createElement("body");
fragment.innerHTML = str;
return fragment.childNodes[0];
}
function toElement(str) {
str = str.trim();
if (HAS_TEMPLATE_SUPPORT) {
return createFragmentFromTemplate(str);
} else if (HAS_RANGE_SUPPORT) {
return createFragmentFromRange(str);
}
return createFragmentFromWrap(str);
}
function compareNodeNames(fromEl, toEl) {
var fromNodeName = fromEl.nodeName;
var toNodeName = toEl.nodeName;
var fromCodeStart, toCodeStart;
if (fromNodeName === toNodeName) {
return true;
}
fromCodeStart = fromNodeName.charCodeAt(0);
toCodeStart = toNodeName.charCodeAt(0);
if (fromCodeStart <= 90 && toCodeStart >= 97) {
return fromNodeName === toNodeName.toUpperCase();
} else if (toCodeStart <= 90 && fromCodeStart >= 97) {
return toNodeName === fromNodeName.toUpperCase();
} else {
return false;
}
}
function createElementNS(name, namespaceURI) {
return !namespaceURI || namespaceURI === NS_XHTML ? doc.createElement(name) : doc.createElementNS(namespaceURI, name);
}
function moveChildren(fromEl, toEl) {
var curChild = fromEl.firstChild;
while (curChild) {
var nextChild = curChild.nextSibling;
toEl.appendChild(curChild);
curChild = nextChild;
}
return toEl;
}
function syncBooleanAttrProp(fromEl, toEl, name) {
if (fromEl[name] !== toEl[name]) {
fromEl[name] = toEl[name];
if (fromEl[name]) {
fromEl.setAttribute(name, "");
} else {
fromEl.removeAttribute(name);
}
}
}
var specialElHandlers = {
OPTION: function(fromEl, toEl) {
var parentNode = fromEl.parentNode;
if (parentNode) {
var parentName = parentNode.nodeName.toUpperCase();
if (parentName === "OPTGROUP") {
parentNode = parentNode.parentNode;
parentName = parentNode && parentNode.nodeName.toUpperCase();
}
if (parentName === "SELECT" && !parentNode.hasAttribute("multiple")) {
if (fromEl.hasAttribute("selected") && !toEl.selected) {
fromEl.setAttribute("selected", "selected");
fromEl.removeAttribute("selected");
}
parentNode.selectedIndex = -1;
}
}
syncBooleanAttrProp(fromEl, toEl, "selected");
},
INPUT: function(fromEl, toEl) {
syncBooleanAttrProp(fromEl, toEl, "checked");
syncBooleanAttrProp(fromEl, toEl, "disabled");
if (fromEl.value !== toEl.value) {
fromEl.value = toEl.value;
}
if (!toEl.hasAttribute("value")) {
fromEl.removeAttribute("value");
}
},
TEXTAREA: function(fromEl, toEl) {
var newValue = toEl.value;
if (fromEl.value !== newValue) {
fromEl.value = newValue;
}
var firstChild = fromEl.firstChild;
if (firstChild) {
var oldValue = firstChild.nodeValue;
if (oldValue == newValue || !newValue && oldValue == fromEl.placeholder) {
return;
}
firstChild.nodeValue = newValue;
}
},
SELECT: function(fromEl, toEl) {
if (!toEl.hasAttribute("multiple")) {
var selectedIndex = -1;
var i = 0;
var curChild = fromEl.firstChild;
var optgroup;
var nodeName;
while (curChild) {
nodeName = curChild.nodeName && curChild.nodeName.toUpperCase();
if (nodeName === "OPTGROUP") {
optgroup = curChild;
curChild = optgroup.firstChild;
} else {
if (nodeName === "OPTION") {
if (curChild.hasAttribute("selected")) {
selectedIndex = i;
break;
}
i++;
}
curChild = curChild.nextSibling;
if (!curChild && optgroup) {
curChild = optgroup.nextSibling;
optgroup = null;
}
}
}
fromEl.selectedIndex = selectedIndex;
}
}
};
var ELEMENT_NODE = 1;
var DOCUMENT_FRAGMENT_NODE$1 = 11;
var TEXT_NODE = 3;
var COMMENT_NODE = 8;
function noop2() {
}
function defaultGetNodeKey(node) {
if (node) {
return node.getAttribute && node.getAttribute("id") || node.id;
}
}
function morphdomFactory(morphAttrs2) {
return function morphdom2(fromNode, toNode, options) {
if (!options) {
options = {};
}
if (typeof toNode === "string") {
if (fromNode.nodeName === "#document" || fromNode.nodeName === "HTML" || fromNode.nodeName === "BODY") {
var toNodeHtml = toNode;
toNode = doc.createElement("html");
toNode.innerHTML = toNodeHtml;
} else {
toNode = toElement(toNode);
}
}
var getNodeKey = options.getNodeKey || defaultGetNodeKey;
var onBeforeNodeAdded = options.onBeforeNodeAdded || noop2;
var onNodeAdded = options.onNodeAdded || noop2;
var onBeforeElUpdated = options.onBeforeElUpdated || noop2;
var onElUpdated = options.onElUpdated || noop2;
var onBeforeNodeDiscarded = options.onBeforeNodeDiscarded || noop2;
var onNodeDiscarded = options.onNodeDiscarded || noop2;
var onBeforeElChildrenUpdated = options.onBeforeElChildrenUpdated || noop2;
var childrenOnly = options.childrenOnly === true;
var fromNodesLookup = /* @__PURE__ */ Object.create(null);
var keyedRemovalList = [];
function addKeyedRemoval(key) {
keyedRemovalList.push(key);
}
function walkDiscardedChildNodes(node, skipKeyedNodes) {
if (node.nodeType === ELEMENT_NODE) {
var curChild = node.firstChild;
while (curChild) {
var key = void 0;
if (skipKeyedNodes && (key = getNodeKey(curChild))) {
addKeyedRemoval(key);
} else {
onNodeDiscarded(curChild);
if (curChild.firstChild) {
walkDiscardedChildNodes(curChild, skipKeyedNodes);
}
}
curChild = curChild.nextSibling;
}
}
}
function removeNode(node, parentNode, skipKeyedNodes) {
if (onBeforeNodeDiscarded(node) === false) {
return;
}
if (parentNode) {
parentNode.removeChild(node);
}
onNodeDiscarded(node);
walkDiscardedChildNodes(node, skipKeyedNodes);
}
function indexTree(node) {
if (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE$1) {
var curChild = node.firstChild;
while (curChild) {
var key = getNodeKey(curChild);
if (key) {
fromNodesLookup[key] = curChild;
}
indexTree(curChild);
curChild = curChild.nextSibling;
}
}
}
indexTree(fromNode);
function handleNodeAdded(el) {
onNodeAdded(el);
var curChild = el.firstChild;
while (curChild) {
var nextSibling = curChild.nextSibling;
var key = getNodeKey(curChild);
if (key) {
var unmatchedFromEl = fromNodesLookup[key];
if (unmatchedFromEl && compareNodeNames(curChild, unmatchedFromEl)) {
curChild.parentNode.replaceChild(unmatchedFromEl, curChild);
morphEl(unmatchedFromEl, curChild);
} else {
handleNodeAdded(curChild);
}
} else {
handleNodeAdded(curChild);
}
curChild = nextSibling;
}
}
function cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey) {
while (curFromNodeChild) {
var fromNextSibling = curFromNodeChild.nextSibling;
if (curFromNodeKey = getNodeKey(curFromNodeChild)) {
addKeyedRemoval(curFromNodeKey);
} else {
removeNode(curFromNodeChild, fromEl, true);
}
curFromNodeChild = fromNextSibling;
}
}
function morphEl(fromEl, toEl, childrenOnly2) {
var toElKey = getNodeKey(toEl);
if (toElKey) {
delete fromNodesLookup[toElKey];
}
if (!childrenOnly2) {
if (onBeforeElUpdated(fromEl, toEl) === false) {
return;
}
morphAttrs2(fromEl, toEl);
onElUpdated(fromEl);
if (onBeforeElChildrenUpdated(fromEl, toEl) === false) {
return;
}
}
if (fromEl.nodeName !== "TEXTAREA") {
morphChildren(fromEl, toEl);
} else {
specialElHandlers.TEXTAREA(fromEl, toEl);
}
}
function morphChildren(fromEl, toEl) {
var curToNodeChild = toEl.firstChild;
var curFromNodeChild = fromEl.firstChild;
var curToNodeKey;
var curFromNodeKey;
var fromNextSibling;
var toNextSibling;
var matchingFromEl;
outer:
while (curToNodeChild) {
toNextSibling = curToNodeChild.nextSibling;
curToNodeKey = getNodeKey(curToNodeChild);
while (curFromNodeChild) {
fromNextSibling = curFromNodeChild.nextSibling;
if (curToNodeChild.isSameNode && curToNodeChild.isSameNode(curFromNodeChild)) {
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
continue outer;
}
curFromNodeKey = getNodeKey(curFromNodeChild);
var curFromNodeType = curFromNodeChild.nodeType;
var isCompatible = void 0;
if (curFromNodeType === curToNodeChild.nodeType) {
if (curFromNodeType === ELEMENT_NODE) {
if (curToNodeKey) {
if (curToNodeKey !== curFromNodeKey) {
if (matchingFromEl = fromNodesLookup[curToNodeKey]) {
if (fromNextSibling === matchingFromEl) {
isCompatible = false;
} else {
fromEl.insertBefore(matchingFromEl, curFromNodeChild);
if (curFromNodeKey) {
addKeyedRemoval(curFromNodeKey);
} else {
removeNode(curFromNodeChild, fromEl, true);
}
curFromNodeChild = matchingFromEl;
}
} else {
isCompatible = false;
}
}
} else if (curFromNodeKey) {
isCompatible = false;
}
isCompatible = isCompatible !== false && compareNodeNames(curFromNodeChild, curToNodeChild);
if (isCompatible) {
morphEl(curFromNodeChild, curToNodeChild);
}
} else if (curFromNodeType === TEXT_NODE || curFromNodeType == COMMENT_NODE) {
isCompatible = true;
if (curFromNodeChild.nodeValue !== curToNodeChild.nodeValue) {
curFromNodeChild.nodeValue = curToNodeChild.nodeValue;
}
}
}
if (isCompatible) {
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
continue outer;
}
if (curFromNodeKey) {
addKeyedRemoval(curFromNodeKey);
} else {
removeNode(curFromNodeChild, fromEl, true);
}
curFromNodeChild = fromNextSibling;
}
if (curToNodeKey && (matchingFromEl = fromNodesLookup[curToNodeKey]) && compareNodeNames(matchingFromEl, curToNodeChild)) {
fromEl.appendChild(matchingFromEl);
morphEl(matchingFromEl, curToNodeChild);
} else {
var onBeforeNodeAddedResult = onBeforeNodeAdded(curToNodeChild);
if (onBeforeNodeAddedResult !== false) {
if (onBeforeNodeAddedResult) {
curToNodeChild = onBeforeNodeAddedResult;
}
if (curToNodeChild.actualize) {
curToNodeChild = curToNodeChild.actualize(fromEl.ownerDocument || doc);
}
fromEl.appendChild(curToNodeChild);
handleNodeAdded(curToNodeChild);
}
}
curToNodeChild = toNextSibling;
curFromNodeChild = fromNextSibling;
}
cleanupFromEl(fromEl, curFromNodeChild, curFromNodeKey);
var specialElHandler = specialElHandlers[fromEl.nodeName];
if (specialElHandler) {
specialElHandler(fromEl, toEl);
}
}
var morphedNode = fromNode;
var morphedNodeType = morphedNode.nodeType;
var toNodeType = toNode.nodeType;
if (!childrenOnly) {
if (morphedNodeType === ELEMENT_NODE) {
if (toNodeType === ELEMENT_NODE) {
if (!compareNodeNames(fromNode, toNode)) {
onNodeDiscarded(fromNode);
morphedNode = moveChildren(fromNode, createElementNS(toNode.nodeName, toNode.namespaceURI));
}
} else {
morphedNode = toNode;
}
} else if (morphedNodeType === TEXT_NODE || morphedNodeType === COMMENT_NODE) {
if (toNodeType === morphedNodeType) {
if (morphedNode.nodeValue !== toNode.nodeValue) {
morphedNode.nodeValue = toNode.nodeValue;
}
return morphedNode;
} else {
morphedNode = toNode;
}
}
}
if (morphedNode === toNode) {
onNodeDiscarded(fromNode);
} else {
if (toNode.isSameNode && toNode.isSameNode(morphedNode)) {
return;
}
morphEl(morphedNode, toNode, childrenOnly);
if (keyedRemovalList) {
for (var i = 0, len = keyedRemovalList.length; i < len; i++) {
var elToRemove = fromNodesLookup[keyedRemovalList[i]];
if (elToRemove) {
removeNode(elToRemove, elToRemove.parentNode, false);
}
}
}
}
if (!childrenOnly && morphedNode !== fromNode && fromNode.parentNode) {
if (morphedNode.actualize) {
morphedNode = morphedNode.actualize(fromNode.ownerDocument || doc);
}
fromNode.parentNode.replaceChild(morphedNode, fromNode);
}
return morphedNode;
};
}
var morphdom = morphdomFactory(morphAttrs);
var morphdom_esm_default = morphdom;
var DOMPatch = class {
static patchEl(fromEl, toEl, activeElement) {
morphdom_esm_default(fromEl, toEl, {
childrenOnly: false,
onBeforeElUpdated: (fromEl2, toEl2) => {
if (activeElement && activeElement.isSameNode(fromEl2) && dom_default.isFormInput(fromEl2)) {
dom_default.mergeFocusedInput(fromEl2, toEl2);
return false;
}
}
});
}
constructor(view, container, id, html, targetCID) {
this.view = view;
this.liveSocket = view.liveSocket;
this.container = container;
this.id = id;
this.rootID = view.root.id;
this.html = html;
this.targetCID = targetCID;
this.cidPatch = isCid(this.targetCID);
this.callbacks = {
beforeadded: [],
beforeupdated: [],
beforephxChildAdded: [],
afteradded: [],
afterupdated: [],
afterdiscarded: [],
afterphxChildAdded: [],
aftertransitionsDiscarded: []
};
}
before(kind, callback) {
this.callbacks[`before${kind}`].push(callback);
}
after(kind, callback) {
this.callbacks[`after${kind}`].push(callback);
}
trackBefore(kind, ...args) {
this.callbacks[`before${kind}`].forEach((callback) => callback(...args));
}
trackAfter(kind, ...args) {
this.callbacks[`after${kind}`].forEach((callback) => callback(...args));
}
markPrunableContentForRemoval() {
dom_default.all(this.container, "[phx-update=append] > *, [phx-update=prepend] > *", (el) => {
el.setAttribute(PHX_PRUNE, "");
});
}
perform() {
let { view, liveSocket: liveSocket2, container, html } = this;
let targetContainer = this.isCIDPatch() ? this.targetCIDContainer(html) : container;
if (this.isCIDPatch() && !targetContainer) {
return;
}
let focused = liveSocket2.getActiveElement();
let { selectionStart, selectionEnd } = focused && dom_default.hasSelectionRange(focused) ? focused : {};
let phxUpdate = liveSocket2.binding(PHX_UPDATE);
let phxFeedbackFor = liveSocket2.binding(PHX_FEEDBACK_FOR);
let disableWith = liveSocket2.binding(PHX_DISABLE_WITH);
let phxTriggerExternal = liveSocket2.binding(PHX_TRIGGER_ACTION);
let phxRemove = liveSocket2.binding("remove");
let added = [];
let updates = [];
let appendPrependUpdates = [];
let pendingRemoves = [];
let externalFormTriggered = null;
let diffHTML = liveSocket2.time("premorph container prep", () => {
return this.buildDiffHTML(container, html, phxUpdate, targetContainer);
});
this.trackBefore("added", container);
this.trackBefore("updated", container, container);
liveSocket2.time("morphdom", () => {
morphdom_esm_default(targetContainer, diffHTML, {
childrenOnly: targetContainer.getAttribute(PHX_COMPONENT) === null,
getNodeKey: (node) => {
return dom_default.isPhxDestroyed(node) ? null : node.id;
},
onBeforeNodeAdded: (el) => {
this.trackBefore("added", el);
return el;
},
onNodeAdded: (el) => {
if (el instanceof HTMLImageElement && el.srcset) {
el.srcset = el.srcset;
} else if (el instanceof HTMLVideoElement && el.autoplay) {
el.play();
}
if (dom_default.isNowTriggerFormExternal(el, phxTriggerExternal)) {
externalFormTriggered = el;
}
dom_default.discardError(targetContainer, el, phxFeedbackFor);
if (dom_default.isPhxChild(el) && view.ownsElement(el) || dom_default.isPhxSticky(el) && view.ownsElement(el.parentNode)) {
this.trackAfter("phxChildAdded", el);
}
added.push(el);
},
onNodeDiscarded: (el) => {
if (dom_default.isPhxChild(el) || dom_default.isPhxSticky(el)) {
liveSocket2.destroyViewByEl(el);
}
this.trackAfter("discarded", el);
},
onBeforeNodeDiscarded: (el) => {
if (el.getAttribute && el.getAttribute(PHX_PRUNE) !== null) {
return true;
}
if (el.parentNode !== null && dom_default.isPhxUpdate(el.parentNode, phxUpdate, ["append", "prepend"]) && el.id) {
return false;
}
if (el.getAttribute && el.getAttribute(phxRemove)) {
pendingRemoves.push(el);
return false;
}
if (this.skipCIDSibling(el)) {
return false;
}
return true;
},
onElUpdated: (el) => {
if (dom_default.isNowTriggerFormExternal(el, phxTriggerExternal)) {
externalFormTriggered = el;
}
updates.push(el);
},
onBeforeElUpdated: (fromEl, toEl) => {
dom_default.cleanChildNodes(toEl, phxUpdate);
if (this.skipCIDSibling(toEl)) {
return false;
}
if (dom_default.isPhxSticky(fromEl)) {
return false;
}
if (dom_default.isIgnored(fromEl, phxUpdate)) {
this.trackBefore("updated", fromEl, toEl);
dom_default.mergeAttrs(fromEl, toEl, { isIgnored: true });
updates.push(fromEl);
dom_default.applyStickyOperations(fromEl);
return false;
}
if (fromEl.type === "number" && (fromEl.validity && fromEl.validity.badInput)) {
return false;
}
if (!dom_default.syncPendingRef(fromEl, toEl, disableWith)) {
if (dom_default.isUploadInput(fromEl)) {
this.trackBefore("updated", fromEl, toEl);
updates.push(fromEl);
}
dom_default.applyStickyOperations(fromEl);
return false;
}
if (dom_default.isPhxChild(toEl)) {
let prevSession = fromEl.getAttribute(PHX_SESSION);
dom_default.mergeAttrs(fromEl, toEl, { exclude: [PHX_STATIC] });
if (prevSession !== "") {
fromEl.setAttribute(PHX_SESSION, prevSession);
}
fromEl.setAttribute(PHX_ROOT_ID, this.rootID);
dom_default.applyStickyOperations(fromEl);
return false;
}
dom_default.copyPrivates(toEl, fromEl);
dom_default.discardError(targetContainer, toEl, phxFeedbackFor);
let isFocusedFormEl = focused && fromEl.isSameNode(focused) && dom_default.isFormInput(fromEl);
if (isFocusedFormEl) {
this.trackBefore("updated", fromEl, toEl);
dom_default.mergeFocusedInput(fromEl, toEl);
dom_default.syncAttrsToProps(fromEl);
updates.push(fromEl);
dom_default.applyStickyOperations(fromEl);
return false;
} else {
if (dom_default.isPhxUpdate(toEl, phxUpdate, ["append", "prepend"])) {
appendPrependUpdates.push(new DOMPostMorphRestorer(fromEl, toEl, toEl.getAttribute(phxUpdate)));
}
dom_default.syncAttrsToProps(toEl);
dom_default.applyStickyOperations(toEl);
this.trackBefore("updated", fromEl, toEl);
return true;
}
}
});
});
if (liveSocket2.isDebugEnabled()) {
detectDuplicateIds();
}
if (appendPrependUpdates.length > 0) {
liveSocket2.time("post-morph append/prepend restoration", () => {
appendPrependUpdates.forEach((update) => update.perform());
});
}
liveSocket2.silenceEvents(() => dom_default.restoreFocus(focused, selectionStart, selectionEnd));
dom_default.dispatchEvent(document, "phx:update");
added.forEach((el) => this.trackAfter("added", el));
updates.forEach((el) => this.trackAfter("updated", el));
if (pendingRemoves.length > 0) {
liveSocket2.transitionRemoves(pendingRemoves);
liveSocket2.requestDOMUpdate(() => {
pendingRemoves.forEach((el) => {
let child = dom_default.firstPhxChild(el);
if (child) {
liveSocket2.destroyViewByEl(child);
}
el.remove();
});
this.trackAfter("transitionsDiscarded", pendingRemoves);
});
}
if (externalFormTriggered) {
liveSocket2.disconnect();
externalFormTriggered.submit();
}
return true;
}
isCIDPatch() {
return this.cidPatch;
}
skipCIDSibling(el) {
return el.nodeType === Node.ELEMENT_NODE && el.getAttribute(PHX_SKIP) !== null;
}
targetCIDContainer(html) {
if (!this.isCIDPatch()) {
return;
}
let [first, ...rest] = dom_default.findComponentNodeList(this.container, this.targetCID);
if (rest.length === 0 && dom_default.childNodeLength(html) === 1) {
return first;
} else {
return first && first.parentNode;
}
}
buildDiffHTML(container, html, phxUpdate, targetContainer) {
let isCIDPatch = this.isCIDPatch();
let isCIDWithSingleRoot = isCIDPatch && targetContainer.getAttribute(PHX_COMPONENT) === this.targetCID.toString();
if (!isCIDPatch || isCIDWithSingleRoot) {
return html;
} else {
let diffContainer = null;
let template = document.createElement("template");
diffContainer = dom_default.cloneNode(targetContainer);
let [firstComponent, ...rest] = dom_default.findComponentNodeList(diffContainer, this.targetCID);
template.innerHTML = html;
rest.forEach((el) => el.remove());
Array.from(diffContainer.childNodes).forEach((child) => {
if (child.id && child.nodeType === Node.ELEMENT_NODE && child.getAttribute(PHX_COMPONENT) !== this.targetCID.toString()) {
child.setAttribute(PHX_SKIP, "");
child.innerHTML = "";
}
});
Array.from(template.content.childNodes).forEach((el) => diffContainer.insertBefore(el, firstComponent));
firstComponent.remove();
return diffContainer.outerHTML;
}
}
};
var Rendered = class {
static extract(diff) {
let { [REPLY]: reply, [EVENTS]: events, [TITLE]: title } = diff;
delete diff[REPLY];
delete diff[EVENTS];
delete diff[TITLE];
return { diff, title, reply: reply || null, events: events || [] };
}
constructor(viewId, rendered) {
this.viewId = viewId;
this.rendered = {};
this.mergeDiff(rendered);
}
parentViewId() {
return this.viewId;
}
toString(onlyCids) {
return this.recursiveToString(this.rendered, this.rendered[COMPONENTS], onlyCids);
}
recursiveToString(rendered, components = rendered[COMPONENTS], onlyCids) {
onlyCids = onlyCids ? new Set(onlyCids) : null;
let output = { buffer: "", components, onlyCids };
this.toOutputBuffer(rendered, null, output);
return output.buffer;
}
componentCIDs(diff) {
return Object.keys(diff[COMPONENTS] || {}).map((i) => parseInt(i));
}
isComponentOnlyDiff(diff) {
if (!diff[COMPONENTS]) {
return false;
}
return Object.keys(diff).length === 1;
}
getComponent(diff, cid) {
return diff[COMPONENTS][cid];
}
mergeDiff(diff) {
let newc = diff[COMPONENTS];
let cache = {};
delete diff[COMPONENTS];
this.rendered = this.mutableMerge(this.rendered, diff);
this.rendered[COMPONENTS] = this.rendered[COMPONENTS] || {};
if (newc) {
let oldc = this.rendered[COMPONENTS];
for (let cid in newc) {
newc[cid] = this.cachedFindComponent(cid, newc[cid], oldc, newc, cache);
}
for (let cid in newc) {
oldc[cid] = newc[cid];
}
diff[COMPONENTS] = newc;
}
}
cachedFindComponent(cid, cdiff, oldc, newc, cache) {
if (cache[cid]) {
return cache[cid];
} else {
let ndiff, stat, scid = cdiff[STATIC];
if (isCid(scid)) {
let tdiff;
if (scid > 0) {
tdiff = this.cachedFindComponent(scid, newc[scid], oldc, newc, cache);
} else {
tdiff = oldc[-scid];
}
stat = tdiff[STATIC];
ndiff = this.cloneMerge(tdiff, cdiff);
ndiff[STATIC] = stat;
} else {
ndiff = cdiff[STATIC] !== void 0 ? cdiff : this.cloneMerge(oldc[cid] || {}, cdiff);
}
cache[cid] = ndiff;
return ndiff;
}
}
mutableMerge(target, source) {
if (source[STATIC] !== void 0) {
return source;
} else {
this.doMutableMerge(target, source);
return target;
}
}
doMutableMerge(target, source) {
for (let key in source) {
let val = source[key];
let targetVal = target[key];
if (isObject(val) && val[STATIC] === void 0 && isObject(targetVal)) {
this.doMutableMerge(targetVal, val);
} else {
target[key] = val;
}
}
}
cloneMerge(target, source) {
let merged = __spreadValues(__spreadValues({}, target), source);
for (let key in merged) {
let val = source[key];
let targetVal = target[key];
if (isObject(val) && val[STATIC] === void 0 && isObject(targetVal)) {
merged[key] = this.cloneMerge(targetVal, val);
}
}
return merged;
}
componentToString(cid) {
return this.recursiveCIDToString(this.rendered[COMPONENTS], cid);
}
pruneCIDs(cids) {
cids.forEach((cid) => delete this.rendered[COMPONENTS][cid]);
}
get() {
return this.rendered;
}
isNewFingerprint(diff = {}) {
return !!diff[STATIC];
}
templateStatic(part, templates) {
if (typeof part === "number") {
return templates[part];
} else {
return part;
}
}
toOutputBuffer(rendered, templates, output) {
if (rendered[DYNAMICS]) {
return this.comprehensionToBuffer(rendered, templates, output);
}
let { [STATIC]: statics } = rendered;
statics = this.templateStatic(statics, templates);
output.buffer += statics[0];
for (let i = 1; i < statics.length; i++) {
this.dynamicToBuffer(rendered[i - 1], templates, output);
output.buffer += statics[i];
}
}
comprehensionToBuffer(rendered, templates, output) {
let { [DYNAMICS]: dynamics, [STATIC]: statics } = rendered;
statics = this.templateStatic(statics, templates);
let compTemplates = templates || rendered[TEMPLATES];
for (let d = 0; d < dynamics.length; d++) {
let dynamic = dynamics[d];
output.buffer += statics[0];
for (let i = 1; i < statics.length; i++) {
this.dynamicToBuffer(dynamic[i - 1], compTemplates, output);
output.buffer += statics[i];
}
}
}
dynamicToBuffer(rendered, templates, output) {
if (typeof rendered === "number") {
output.buffer += this.recursiveCIDToString(output.components, rendered, output.onlyCids);
} else if (isObject(rendered)) {
this.toOutputBuffer(rendered, templates, output);
} else {
output.buffer += rendered;
}
}
recursiveCIDToString(components, cid, onlyCids) {
let component = components[cid] || logError(`no component for CID ${cid}`, components);
let template = document.createElement("template");
template.innerHTML = this.recursiveToString(component, components, onlyCids);
let container = template.content;
let skip = onlyCids && !onlyCids.has(cid);
let [hasChildNodes, hasChildComponents] = Array.from(container.childNodes).reduce(([hasNodes, hasComponents], child, i) => {
if (child.nodeType === Node.ELEMENT_NODE) {
if (child.getAttribute(PHX_COMPONENT)) {
return [hasNodes, true];
}
child.setAttribute(PHX_COMPONENT, cid);
if (!child.id) {
child.id = `${this.parentViewId()}-${cid}-${i}`;
}
if (skip) {
child.setAttribute(PHX_SKIP, "");
child.innerHTML = "";
}
return [true, hasComponents];
} else {
if (child.nodeValue.trim() !== "") {
logError(`only HTML element tags are allowed at the root of components.
got: "${child.nodeValue.trim()}"
within:
`, template.innerHTML.trim());
child.replaceWith(this.createSpan(child.nodeValue, cid));
return [true, hasComponents];
} else {
child.remove();
return [hasNodes, hasComponents];
}
}
}, [false, false]);
if (!hasChildNodes && !hasChildComponents) {
logError("expected at least one HTML element tag inside a component, but the component is empty:\n", template.innerHTML.trim());
return this.createSpan("", cid).outerHTML;
} else if (!hasChildNodes && hasChildComponents) {
logError("expected at least one HTML element tag directly inside a component, but only subcomponents were found. A component must render at least one HTML tag directly inside itself.", template.innerHTML.trim());
return template.innerHTML;
} else {
return template.innerHTML;
}
}
createSpan(text, cid) {
let span = document.createElement("span");
span.innerText = text;
span.setAttribute(PHX_COMPONENT, cid);
return span;
}
};
var viewHookID = 1;
var ViewHook = class {
static makeID() {
return viewHookID++;
}
static elementID(el) {
return el.phxHookId;
}
constructor(view, el, callbacks) {
this.__view = view;
this.__liveSocket = view.liveSocket;
this.__callbacks = callbacks;
this.__listeners = /* @__PURE__ */ new Set();
this.__isDisconnected = false;
this.el = el;
this.el.phxHookId = this.constructor.makeID();
for (let key in this.__callbacks) {
this[key] = this.__callbacks[key];
}
}
__mounted() {
this.mounted && this.mounted();
}
__updated() {
this.updated && this.updated();
}
__beforeUpdate() {
this.beforeUpdate && this.beforeUpdate();
}
__destroyed() {
this.destroyed && this.destroyed();
}
__reconnected() {
if (this.__isDisconnected) {
this.__isDisconnected = false;
this.reconnected && this.reconnected();
}
}
__disconnected() {
this.__isDisconnected = true;
this.disconnected && this.disconnected();
}
pushEvent(event, payload = {}, onReply = function() {
}) {
return this.__view.pushHookEvent(null, event, payload, onReply);
}
pushEventTo(phxTarget, event, payload = {}, onReply = function() {
}) {
return this.__view.withinTargets(phxTarget, (view, targetCtx) => {
return view.pushHookEvent(targetCtx, event, payload, onReply);
});
}
handleEvent(event, callback) {
let callbackRef = (customEvent, bypass) => bypass ? event : callback(customEvent.detail);
window.addEventListener(`phx:${event}`, callbackRef);
this.__listeners.add(callbackRef);
return callbackRef;
}
removeHandleEvent(callbackRef) {
let event = callbackRef(null, true);
window.removeEventListener(`phx:${event}`, callbackRef);
this.__listeners.delete(callbackRef);
}
upload(name, files) {
return this.__view.dispatchUploads(name, files);
}
uploadTo(phxTarget, name, files) {
return this.__view.withinTargets(phxTarget, (view) => view.dispatchUploads(name, files));
}
__cleanup__() {
this.__listeners.forEach((callbackRef) => this.removeHandleEvent(callbackRef));
}
};
var JS = {
exec(eventType, phxEvent, view, sourceEl, defaults) {
let [defaultKind, defaultArgs] = defaults || [null, {}];
let commands = phxEvent.charAt(0) === "[" ? JSON.parse(phxEvent) : [[defaultKind, defaultArgs]];
commands.forEach(([kind, args]) => {
if (kind === defaultKind && defaultArgs.data) {
args.data = Object.assign(args.data || {}, defaultArgs.data);
}
this.filterToEls(sourceEl, args).forEach((el) => {
this[`exec_${kind}`](eventType, phxEvent, view, sourceEl, el, args);
});
});
},
isVisible(el) {
return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length > 0);
},
exec_dispatch(eventType, phxEvent, view, sourceEl, el, { to, event, detail }) {
dom_default.dispatchEvent(el, event, detail);
},
exec_push(eventType, phxEvent, view, sourceEl, el, args) {
let { event, data, target, page_loading, loading, value } = args;
let pushOpts = { loading, value, target, page_loading: !!page_loading };
let targetSrc = eventType === "change" ? sourceEl.form : sourceEl;
let phxTarget = target || targetSrc.getAttribute(view.binding("target")) || targetSrc;
view.withinTargets(phxTarget, (targetView, targetCtx) => {
if (eventType === "change") {
let { newCid, _target, callback } = args;
if (_target) {
pushOpts._target = _target;
}
targetView.pushInput(sourceEl, targetCtx, newCid, event || phxEvent, pushOpts, callback);
} else if (eventType === "submit") {
targetView.submitForm(sourceEl, targetCtx, event || phxEvent, pushOpts);
} else {
targetView.pushEvent(eventType, sourceEl, targetCtx, event || phxEvent, data, pushOpts);
}
});
},
exec_add_class(eventType, phxEvent, view, sourceEl, el, { names, transition, time }) {
this.addOrRemoveClasses(el, names, [], transition, time, view);
},
exec_remove_class(eventType, phxEvent, view, sourceEl, el, { names, transition, time }) {
this.addOrRemoveClasses(el, [], names, transition, time, view);
},
exec_transition(eventType, phxEvent, view, sourceEl, el, { time, transition }) {
let [transition_start, running, transition_end] = transition;
let onStart = () => this.addOrRemoveClasses(el, transition_start.concat(running), []);
let onDone = () => this.addOrRemoveClasses(el, transition_end, transition_start.concat(running));
view.transition(time, onStart, onDone);
},
exec_toggle(eventType, phxEvent, view, sourceEl, el, { display, ins, outs, time }) {
this.toggle(eventType, view, el, display, ins, outs, time);
},
exec_show(eventType, phxEvent, view, sourceEl, el, { display, transition, time }) {
this.show(eventType, view, el, display, transition, time);
},
exec_hide(eventType, phxEvent, view, sourceEl, el, { display, transition, time }) {
this.hide(eventType, view, el, display, transition, time);
},
exec_set_attr(eventType, phxEvent, view, sourceEl, el, { attr: [attr, val] }) {
this.setOrRemoveAttrs(el, [[attr, val]], []);
},
exec_remove_attr(eventType, phxEvent, view, sourceEl, el, { attr }) {
this.setOrRemoveAttrs(el, [], [attr]);
},
show(eventType, view, el, display, transition, time) {
if (!this.isVisible(el)) {
this.toggle(eventType, view, el, display, transition, null, time);
}
},
hide(eventType, view, el, display, transition, time) {
if (this.isVisible(el)) {
this.toggle(eventType, view, el, display, null, transition, time);
}
},
toggle(eventType, view, el, display, ins, outs, time) {
let [inClasses, inStartClasses, inEndClasses] = ins || [[], [], []];
let [outClasses, outStartClasses, outEndClasses] = outs || [[], [], []];
if (inClasses.length > 0 || outClasses.length > 0) {
if (this.isVisible(el)) {
let onStart = () => {
this.addOrRemoveClasses(el, outStartClasses, inClasses.concat(inStartClasses).concat(inEndClasses));
window.requestAnimationFrame(() => {
this.addOrRemoveClasses(el, outClasses, []);
window.requestAnimationFrame(() => this.addOrRemoveClasses(el, outEndClasses, outStartClasses));
});
};
el.dispatchEvent(new Event("phx:hide-start"));
view.transition(time, onStart, () => {
this.addOrRemoveClasses(el, [], outClasses.concat(outEndClasses));
dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = "none");
el.dispatchEvent(new Event("phx:hide-end"));
});
} else {
if (eventType === "remove") {
return;
}
let onStart = () => {
this.addOrRemoveClasses(el, inStartClasses, outClasses.concat(outStartClasses).concat(outEndClasses));
dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = display || "block");
window.requestAnimationFrame(() => {
this.addOrRemoveClasses(el, inClasses, []);
window.requestAnimationFrame(() => this.addOrRemoveClasses(el, inEndClasses, inStartClasses));
});
};
el.dispatchEvent(new Event("phx:show-start"));
view.transition(time, onStart, () => {
this.addOrRemoveClasses(el, [], inClasses.concat(inEndClasses));
el.dispatchEvent(new Event("phx:show-end"));
});
}
} else {
if (this.isVisible(el)) {
window.requestAnimationFrame(() => {
el.dispatchEvent(new Event("phx:hide-start"));
dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = "none");
el.dispatchEvent(new Event("phx:hide-end"));
});
} else {
window.requestAnimationFrame(() => {
el.dispatchEvent(new Event("phx:show-start"));
dom_default.putSticky(el, "toggle", (currentEl) => currentEl.style.display = display || "block");
el.dispatchEvent(new Event("phx:show-end"));
});
}
}
},
addOrRemoveClasses(el, adds, removes, transition, time, view) {
let [transition_run, transition_start, transition_end] = transition || [[], [], []];
if (transition_run.length > 0) {
let onStart = () => this.addOrRemoveClasses(el, transition_start.concat(transition_run), []);
let onDone = () => this.addOrRemoveClasses(el, adds.concat(transition_end), removes.concat(transition_run).concat(transition_start));
return view.transition(time, onStart, onDone);
}
window.requestAnimationFrame(() => {
let [prevAdds, prevRemoves] = dom_default.getSticky(el, "classes", [[], []]);
let keepAdds = adds.filter((name) => prevAdds.indexOf(name) < 0 && !el.classList.contains(name));
let keepRemoves = removes.filter((name) => prevRemoves.indexOf(name) < 0 && el.classList.contains(name));
let newAdds = prevAdds.filter((name) => removes.indexOf(name) < 0).concat(keepAdds);
let newRemoves = prevRemoves.filter((name) => adds.indexOf(name) < 0).concat(keepRemoves);
dom_default.putSticky(el, "classes", (currentEl) => {
currentEl.classList.remove(...newRemoves);
currentEl.classList.add(...newAdds);
return [newAdds, newRemoves];
});
});
},
setOrRemoveAttrs(el, sets, removes) {
let [prevSets, prevRemoves] = dom_default.getSticky(el, "attrs", [[], []]);
let keepSets = sets.filter(([attr, _val]) => !this.hasSet(prevSets, attr) && !el.attributes.getNamedItem(attr));
let keepRemoves = removes.filter((attr) => prevRemoves.indexOf(attr) < 0 && el.attributes.getNamedItem(attr));
let newSets = prevSets.filter(([attr, _val]) => removes.indexOf(attr) < 0).concat(keepSets);
let newRemoves = prevRemoves.filter((attr) => !this.hasSet(sets, attr)).concat(keepRemoves);
dom_default.putSticky(el, "attrs", (currentEl) => {
newRemoves.forEach((attr) => currentEl.removeAttribute(attr));
newSets.forEach(([attr, val]) => currentEl.setAttribute(attr, val));
return [newSets, newRemoves];
});
},
hasSet(sets, nameSearch) {
return sets.find(([name, val]) => name === nameSearch);
},
hasAllClasses(el, classes) {
return classes.every((name) => el.classList.contains(name));
},
isToggledOut(el, outClasses) {
return !this.isVisible(el) || this.hasAllClasses(el, outClasses);
},
filterToEls(sourceEl, { to }) {
return to ? dom_default.all(document, to) : [sourceEl];
}
};
var js_default = JS;
var serializeForm = (form, meta = {}) => {
let formData = new FormData(form);
let toRemove = [];
formData.forEach((val, key, _index) => {
if (val instanceof File) {
toRemove.push(key);
}
});
toRemove.forEach((key) => formData.delete(key));
let params = new URLSearchParams();
for (let [key, val] of formData.entries()) {
params.append(key, val);
}
for (let metaKey in meta) {
params.append(metaKey, meta[metaKey]);
}
return params.toString();
};
var View = class {
constructor(el, liveSocket2, parentView, flash) {
this.liveSocket = liveSocket2;
this.flash = flash;
this.parent = parentView;
this.root = parentView ? parentView.root : this;
this.el = el;
this.id = this.el.id;
this.ref = 0;
this.childJoins = 0;
this.loaderTimer = null;
this.pendingDiffs = [];
this.pruningCIDs = [];
this.redirect = false;
this.href = null;
this.joinCount = this.parent ? this.parent.joinCount - 1 : 0;
this.joinPending = true;
this.destroyed = false;
this.joinCallback = function(onDone) {
onDone && onDone();
};
this.stopCallback = function() {
};
this.pendingJoinOps = this.parent ? null : [];
this.viewHooks = {};
this.uploaders = {};
this.formSubmits = [];
this.children = this.parent ? null : {};
this.root.children[this.id] = {};
this.channel = this.liveSocket.channel(`lv:${this.id}`, () => {
return {
redirect: this.redirect ? this.href : void 0,
url: this.redirect ? void 0 : this.href || void 0,
params: this.connectParams(),
session: this.getSession(),
static: this.getStatic(),
flash: this.flash
};
});
this.showLoader(this.liveSocket.loaderTimeout);
this.bindChannel();
}
setHref(href) {
this.href = href;
}
setRedirect(href) {
this.redirect = true;
this.href = href;
}
isMain() {
return this.el.getAttribute(PHX_MAIN) !== null;
}
connectParams() {
let params = this.liveSocket.params(this.el);
let manifest = dom_default.all(document, `[${this.binding(PHX_TRACK_STATIC)}]`).map((node) => node.src || node.href).filter((url) => typeof url === "string");
if (manifest.length > 0) {
params["_track_static"] = manifest;
}
params["_mounts"] = this.joinCount;
return params;
}
isConnected() {
return this.channel.canPush();
}
getSession() {
return this.el.getAttribute(PHX_SESSION);
}
getStatic() {
let val = this.el.getAttribute(PHX_STATIC);
return val === "" ? null : val;
}
destroy(callback = function() {
}) {
this.destroyAllChildren();
this.destroyed = true;
delete this.root.children[this.id];
if (this.parent) {
delete this.root.children[this.parent.id][this.id];
}
clearTimeout(this.loaderTimer);
let onFinished = () => {
callback();
for (let id in this.viewHooks) {
this.destroyHook(this.viewHooks[id]);
}
};
dom_default.markPhxChildDestroyed(this.el);
this.log("destroyed", () => ["the child has been removed from the parent"]);
this.channel.leave().receive("ok", onFinished).receive("error", onFinished).receive("timeout", onFinished);
}
setContainerClasses(...classes) {
this.el.classList.remove(PHX_CONNECTED_CLASS, PHX_DISCONNECTED_CLASS, PHX_ERROR_CLASS);
this.el.classList.add(...classes);
}
showLoader(timeout) {
clearTimeout(this.loaderTimer);
if (timeout) {
this.loaderTimer = setTimeout(() => this.showLoader(), timeout);
} else {
for (let id in this.viewHooks) {
this.viewHooks[id].__disconnected();
}
this.setContainerClasses(PHX_DISCONNECTED_CLASS);
}
}
hideLoader() {
clearTimeout(this.loaderTimer);
this.setContainerClasses(PHX_CONNECTED_CLASS);
}
triggerReconnected() {
for (let id in this.viewHooks) {
this.viewHooks[id].__reconnected();
}
}
log(kind, msgCallback) {
this.liveSocket.log(this, kind, msgCallback);
}
transition(time, onStart, onDone = function() {
}) {
this.liveSocket.transition(time, onStart, onDone);
}
withinTargets(phxTarget, callback) {
if (phxTarget instanceof HTMLElement || phxTarget instanceof SVGElement) {
return this.liveSocket.owner(phxTarget, (view) => callback(view, phxTarget));
}
if (isCid(phxTarget)) {
let targets = dom_default.findComponentNodeList(this.el, phxTarget);
if (targets.length === 0) {
logError(`no component found matching phx-target of ${phxTarget}`);
} else {
callback(this, parseInt(phxTarget));
}
} else {
let targets = Array.from(document.querySelectorAll(phxTarget));
if (targets.length === 0) {
logError(`nothing found matching the phx-target selector "${phxTarget}"`);
}
targets.forEach((target) => this.liveSocket.owner(target, (view) => callback(view, target)));
}
}
applyDiff(type, rawDiff, callback) {
this.log(type, () => ["", clone(rawDiff)]);
let { diff, reply, events, title } = Rendered.extract(rawDiff);
if (title) {
dom_default.putTitle(title);
}
callback({ diff, reply, events });
return reply;
}
onJoin(resp) {
let { rendered, container } = resp;
if (container) {
let [tag, attrs] = container;
this.el = dom_default.replaceRootContainer(this.el, tag, attrs);
}
this.childJoins = 0;
this.joinPending = true;
this.flash = null;
browser_default.dropLocal(this.liveSocket.localStorage, window.location.pathname, CONSECUTIVE_RELOADS);
this.applyDiff("mount", rendered, ({ diff, events }) => {
this.rendered = new Rendered(this.id, diff);
let html = this.renderContainer(null, "join");
this.dropPendingRefs();
let forms = this.formsForRecovery(html);
this.joinCount++;
if (forms.length > 0) {
forms.forEach(([form, newForm, newCid], i) => {
this.pushFormRecovery(form, newCid, (resp2) => {
if (i === forms.length - 1) {
this.onJoinComplete(resp2, html, events);
}
});
});
} else {
this.onJoinComplete(resp, html, events);
}
});
}
dropPendingRefs() {
dom_default.all(document, `[${PHX_REF_SRC}="${this.id}"][${PHX_REF}]`, (el) => {
el.removeAttribute(PHX_REF);
el.removeAttribute(PHX_REF_SRC);
});
}
onJoinComplete({ live_patch }, html, events) {
if (this.joinCount > 1 || this.parent && !this.parent.isJoinPending()) {
return this.applyJoinPatch(live_patch, html, events);
}
let newChildren = dom_default.findPhxChildrenInFragment(html, this.id).filter((toEl) => {
let fromEl = toEl.id && this.el.querySelector(`[id="${toEl.id}"]`);
let phxStatic = fromEl && fromEl.getAttribute(PHX_STATIC);
if (phxStatic) {
toEl.setAttribute(PHX_STATIC, phxStatic);
}
return this.joinChild(toEl);
});
if (newChildren.length === 0) {
if (this.parent) {
this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, events)]);
this.parent.ackJoin(this);
} else {
this.onAllChildJoinsComplete();
this.applyJoinPatch(live_patch, html, events);
}
} else {
this.root.pendingJoinOps.push([this, () => this.applyJoinPatch(live_patch, html, events)]);
}
}
attachTrueDocEl() {
this.el = dom_default.byId(this.id);
this.el.setAttribute(PHX_ROOT_ID, this.root.id);
}
applyJoinPatch(live_patch, html, events) {
this.attachTrueDocEl();
let patch = new DOMPatch(this, this.el, this.id, html, null);
patch.markPrunableContentForRemoval();
this.performPatch(patch, false);
this.joinNewChildren();
dom_default.all(this.el, `[${this.binding(PHX_HOOK)}], [data-phx-${PHX_HOOK}]`, (hookEl) => {
let hook = this.addHook(hookEl);
if (hook) {
hook.__mounted();
}
});
this.joinPending = false;
this.liveSocket.dispatchEvents(events);
this.applyPendingUpdates();
if (live_patch) {
let { kind, to } = live_patch;
this.liveSocket.historyPatch(to, kind);
}
this.hideLoader();
if (this.joinCount > 1) {
this.triggerReconnected();
}
this.stopCallback();
}
triggerBeforeUpdateHook(fromEl, toEl) {
this.liveSocket.triggerDOM("onBeforeElUpdated", [fromEl, toEl]);
let hook = this.getHook(fromEl);
let isIgnored = hook && dom_default.isIgnored(fromEl, this.binding(PHX_UPDATE));
if (hook && !fromEl.isEqualNode(toEl) && !(isIgnored && isEqualObj(fromEl.dataset, toEl.dataset))) {
hook.__beforeUpdate();
return hook;
}
}
performPatch(patch, pruneCids) {
let removedEls = [];
let phxChildrenAdded = false;
let updatedHookIds = /* @__PURE__ */ new Set();
patch.after("added", (el) => {
this.liveSocket.triggerDOM("onNodeAdded", [el]);
let newHook = this.addHook(el);
if (newHook) {
newHook.__mounted();
}
});
patch.after("phxChildAdded", (el) => {
if (dom_default.isPhxSticky(el)) {
this.liveSocket.joinRootViews();
} else {
phxChildrenAdded = true;
}
});
patch.before("updated", (fromEl, toEl) => {
let hook = this.triggerBeforeUpdateHook(fromEl, toEl);
if (hook) {
updatedHookIds.add(fromEl.id);
}
});
patch.after("updated", (el) => {
if (updatedHookIds.has(el.id)) {
this.getHook(el).__updated();
}
});
patch.after("discarded", (el) => {
if (el.nodeType === Node.ELEMENT_NODE) {
removedEls.push(el);
}
});
patch.after("transitionsDiscarded", (els) => this.afterElementsRemoved(els, pruneCids));
patch.perform();
this.afterElementsRemoved(removedEls, pruneCids);
return phxChildrenAdded;
}
afterElementsRemoved(elements, pruneCids) {
let destroyedCIDs = [];
elements.forEach((parent) => {
let components = dom_default.all(parent, `[${PHX_COMPONENT}]`);
components.concat(parent).forEach((el) => {
let cid = this.componentID(el);
if (isCid(cid) && destroyedCIDs.indexOf(cid) === -1) {
destroyedCIDs.push(cid);
}
let hook = this.getHook(el);
hook && this.destroyHook(hook);
});
});
if (pruneCids) {
this.maybePushComponentsDestroyed(destroyedCIDs);
}
}
joinNewChildren() {
dom_default.findPhxChildren(this.el, this.id).forEach((el) => this.joinChild(el));
}
getChildById(id) {
return this.root.children[this.id][id];
}
getDescendentByEl(el) {
if (el.id === this.id) {
return this;
} else {
return this.children[el.getAttribute(PHX_PARENT_ID)][el.id];
}
}
destroyDescendent(id) {
for (let parentId in this.root.children) {
for (let childId in this.root.children[parentId]) {
if (childId === id) {
return this.root.children[parentId][childId].destroy();
}
}
}
}
joinChild(el) {
let child = this.getChildById(el.id);
if (!child) {
let view = new View(el, this.liveSocket, this);
this.root.children[this.id][view.id] = view;
view.join();
this.childJoins++;
return true;
}
}
isJoinPending() {
return this.joinPending;
}
ackJoin(_child) {
this.childJoins--;
if (this.childJoins === 0) {
if (this.parent) {
this.parent.ackJoin(this);
} else {
this.onAllChildJoinsComplete();
}
}
}
onAllChildJoinsComplete() {
this.joinCallback(() => {
this.pendingJoinOps.forEach(([view, op]) => {
if (!view.isDestroyed()) {
op();
}
});
this.pendingJoinOps = [];
});
}
update(diff, events) {
if (this.isJoinPending() || this.liveSocket.hasPendingLink()) {
return this.pendingDiffs.push({ diff, events });
}
this.rendered.mergeDiff(diff);
let phxChildrenAdded = false;
if (this.rendered.isComponentOnlyDiff(diff)) {
this.liveSocket.time("component patch complete", () => {
let parentCids = dom_default.findParentCIDs(this.el, this.rendered.componentCIDs(diff));
parentCids.forEach((parentCID) => {
if (this.componentPatch(this.rendered.getComponent(diff, parentCID), parentCID)) {
phxChildrenAdded = true;
}
});
});
} else if (!isEmpty(diff)) {
this.liveSocket.time("full patch complete", () => {
let html = this.renderContainer(diff, "update");
let patch = new DOMPatch(this, this.el, this.id, html, null);
phxChildrenAdded = this.performPatch(patch, true);
});
}
this.liveSocket.dispatchEvents(events);
if (phxChildrenAdded) {
this.joinNewChildren();
}
}
renderContainer(diff, kind) {
return this.liveSocket.time(`toString diff (${kind})`, () => {
let tag = this.el.tagName;
let cids = diff ? this.rendered.componentCIDs(diff).concat(this.pruningCIDs) : null;
let html = this.rendered.toString(cids);
return `<${tag}>${html}</${tag}>`;
});
}
componentPatch(diff, cid) {
if (isEmpty(diff))
return false;
let html = this.rendered.componentToString(cid);
let patch = new DOMPatch(this, this.el, this.id, html, cid);
let childrenAdded = this.performPatch(patch, true);
return childrenAdded;
}
getHook(el) {
return this.viewHooks[ViewHook.elementID(el)];
}
addHook(el) {
if (ViewHook.elementID(el) || !el.getAttribute) {
return;
}
let hookName = el.getAttribute(`data-phx-${PHX_HOOK}`) || el.getAttribute(this.binding(PHX_HOOK));
if (hookName && !this.ownsElement(el)) {
return;
}
let callbacks = this.liveSocket.getHookCallbacks(hookName);
if (callbacks) {
if (!el.id) {
logError(`no DOM ID for hook "${hookName}". Hooks require a unique ID on each element.`, el);
}
let hook = new ViewHook(this, el, callbacks);
this.viewHooks[ViewHook.elementID(hook.el)] = hook;
return hook;
} else if (hookName !== null) {
logError(`unknown hook found for "${hookName}"`, el);
}
}
destroyHook(hook) {
hook.__destroyed();
hook.__cleanup__();
delete this.viewHooks[ViewHook.elementID(hook.el)];
}
applyPendingUpdates() {
this.pendingDiffs.forEach(({ diff, events }) => this.update(diff, events));
this.pendingDiffs = [];
}
onChannel(event, cb) {
this.liveSocket.onChannel(this.channel, event, (resp) => {
if (this.isJoinPending()) {
this.root.pendingJoinOps.push([this, () => cb(resp)]);
} else {
this.liveSocket.requestDOMUpdate(() => cb(resp));
}
});
}
bindChannel() {
this.liveSocket.onChannel(this.channel, "diff", (rawDiff) => {
this.liveSocket.requestDOMUpdate(() => {
this.applyDiff("update", rawDiff, ({ diff, events }) => this.update(diff, events));
});
});
this.onChannel("redirect", ({ to, flash }) => this.onRedirect({ to, flash }));
this.onChannel("live_patch", (redir) => this.onLivePatch(redir));
this.onChannel("live_redirect", (redir) => this.onLiveRedirect(redir));
this.channel.onError((reason) => this.onError(reason));
this.channel.onClose((reason) => this.onClose(reason));
}
destroyAllChildren() {
for (let id in this.root.children[this.id]) {
this.getChildById(id).destroy();
}
}
onLiveRedirect(redir) {
let { to, kind, flash } = redir;
let url = this.expandURL(to);
this.liveSocket.historyRedirect(url, kind, flash);
}
onLivePatch(redir) {
let { to, kind } = redir;
this.href = this.expandURL(to);
this.liveSocket.historyPatch(to, kind);
}
expandURL(to) {
return to.startsWith("/") ? `${window.location.protocol}//${window.location.host}${to}` : to;
}
onRedirect({ to, flash }) {
this.liveSocket.redirect(to, flash);
}
isDestroyed() {
return this.destroyed;
}
join(callback) {
if (this.isMain()) {
this.stopCallback = this.liveSocket.withPageLoading({ to: this.href, kind: "initial" });
}
this.joinCallback = (onDone) => {
onDone = onDone || function() {
};
callback ? callback(this.joinCount, onDone) : onDone();
};
this.liveSocket.wrapPush(this, { timeout: false }, () => {
return this.channel.join().receive("ok", (data) => {
if (!this.isDestroyed()) {
this.liveSocket.requestDOMUpdate(() => this.onJoin(data));
}
}).receive("error", (resp) => !this.isDestroyed() && this.onJoinError(resp)).receive("timeout", () => !this.isDestroyed() && this.onJoinError({ reason: "timeout" }));
});
}
onJoinError(resp) {
if (resp.reason === "unauthorized" || resp.reason === "stale") {
this.log("error", () => ["unauthorized live_redirect. Falling back to page request", resp]);
return this.onRedirect({ to: this.href });
}
if (resp.redirect || resp.live_redirect) {
this.joinPending = false;
this.channel.leave();
}
if (resp.redirect) {
return this.onRedirect(resp.redirect);
}
if (resp.live_redirect) {
return this.onLiveRedirect(resp.live_redirect);
}
this.log("error", () => ["unable to join", resp]);
return this.liveSocket.reloadWithJitter(this);
}
onClose(reason) {
if (this.isDestroyed()) {
return;
}
if (this.isJoinPending() && document.visibilityState !== "hidden" || this.liveSocket.hasPendingLink() && reason !== "leave") {
return this.liveSocket.reloadWithJitter(this);
}
this.destroyAllChildren();
this.liveSocket.dropActiveElement(this);
if (document.activeElement) {
document.activeElement.blur();
}
if (this.liveSocket.isUnloaded()) {
this.showLoader(BEFORE_UNLOAD_LOADER_TIMEOUT);
}
}
onError(reason) {
this.onClose(reason);
this.log("error", () => ["view crashed", reason]);
if (!this.liveSocket.isUnloaded()) {
this.displayError();
}
}
displayError() {
if (this.isMain()) {
dom_default.dispatchEvent(window, "phx:page-loading-start", { to: this.href, kind: "error" });
}
this.showLoader();
this.setContainerClasses(PHX_DISCONNECTED_CLASS, PHX_ERROR_CLASS);
}
pushWithReply(refGenerator, event, payload, onReply = function() {
}) {
if (!this.isConnected()) {
return;
}
let [ref, [el], opts] = refGenerator ? refGenerator() : [null, [], {}];
let onLoadingDone = function() {
};
if (opts.page_loading || el && el.getAttribute(this.binding(PHX_PAGE_LOADING)) !== null) {
onLoadingDone = this.liveSocket.withPageLoading({ kind: "element", target: el });
}
if (typeof payload.cid !== "number") {
delete payload.cid;
}
return this.liveSocket.wrapPush(this, { timeout: true }, () => {
return this.channel.push(event, payload, PUSH_TIMEOUT).receive("ok", (resp) => {
if (ref !== null) {
this.undoRefs(ref);
}
let finish = (hookReply) => {
if (resp.redirect) {
this.onRedirect(resp.redirect);
}
if (resp.live_patch) {
this.onLivePatch(resp.live_patch);
}
if (resp.live_redirect) {
this.onLiveRedirect(resp.live_redirect);
}
onLoadingDone();
onReply(resp, hookReply);
};
if (resp.diff) {
this.liveSocket.requestDOMUpdate(() => {
let hookReply = this.applyDiff("update", resp.diff, ({ diff, events }) => {
this.update(diff, events);
});
finish(hookReply);
});
} else {
finish(null);
}
});
});
}
undoRefs(ref) {
dom_default.all(document, `[${PHX_REF_SRC}="${this.id}"][${PHX_REF}="${ref}"]`, (el) => {
let disabledVal = el.getAttribute(PHX_DISABLED);
el.removeAttribute(PHX_REF);
el.removeAttribute(PHX_REF_SRC);
if (el.getAttribute(PHX_READONLY) !== null) {
el.readOnly = false;
el.removeAttribute(PHX_READONLY);
}
if (disabledVal !== null) {
el.disabled = disabledVal === "true" ? true : false;
el.removeAttribute(PHX_DISABLED);
}
PHX_EVENT_CLASSES.forEach((className) => dom_default.removeClass(el, className));
let disableRestore = el.getAttribute(PHX_DISABLE_WITH_RESTORE);
if (disableRestore !== null) {
el.innerText = disableRestore;
el.removeAttribute(PHX_DISABLE_WITH_RESTORE);
}
let toEl = dom_default.private(el, PHX_REF);
if (toEl) {
let hook = this.triggerBeforeUpdateHook(el, toEl);
DOMPatch.patchEl(el, toEl, this.liveSocket.getActiveElement());
if (hook) {
hook.__updated();
}
dom_default.deletePrivate(el, PHX_REF);
}
});
}
putRef(elements, event, opts = {}) {
let newRef = this.ref++;
let disableWith = this.binding(PHX_DISABLE_WITH);
if (opts.loading) {
elements = elements.concat(dom_default.all(document, opts.loading));
}
elements.forEach((el) => {
el.classList.add(`phx-${event}-loading`);
el.setAttribute(PHX_REF, newRef);
el.setAttribute(PHX_REF_SRC, this.el.id);
let disableText = el.getAttribute(disableWith);
if (disableText !== null) {
if (!el.getAttribute(PHX_DISABLE_WITH_RESTORE)) {
el.setAttribute(PHX_DISABLE_WITH_RESTORE, el.innerText);
}
if (disableText !== "") {
el.innerText = disableText;
}
el.setAttribute("disabled", "");
}
});
return [newRef, elements, opts];
}
componentID(el) {
let cid = el.getAttribute && el.getAttribute(PHX_COMPONENT);
return cid ? parseInt(cid) : null;
}
targetComponentID(target, targetCtx, opts = {}) {
if (isCid(targetCtx)) {
return targetCtx;
}
let cidOrSelector = target.getAttribute(this.binding("target"));
if (isCid(cidOrSelector)) {
return parseInt(cidOrSelector);
} else if (targetCtx && (cidOrSelector !== null || opts.target)) {
return this.closestComponentID(targetCtx);
} else {
return null;
}
}
closestComponentID(targetCtx) {
if (isCid(targetCtx)) {
return targetCtx;
} else if (targetCtx) {
return maybe(targetCtx.closest(`[${PHX_COMPONENT}]`), (el) => this.ownsElement(el) && this.componentID(el));
} else {
return null;
}
}
pushHookEvent(targetCtx, event, payload, onReply) {
if (!this.isConnected()) {
this.log("hook", () => ["unable to push hook event. LiveView not connected", event, payload]);
return false;
}
let [ref, els, opts] = this.putRef([], "hook");
this.pushWithReply(() => [ref, els, opts], "event", {
type: "hook",
event,
value: payload,
cid: this.closestComponentID(targetCtx)
}, (resp, reply) => onReply(reply, ref));
return ref;
}
extractMeta(el, meta, value) {
let prefix = this.binding("value-");
for (let i = 0; i < el.attributes.length; i++) {
if (!meta) {
meta = {};
}
let name = el.attributes[i].name;
if (name.startsWith(prefix)) {
meta[name.replace(prefix, "")] = el.getAttribute(name);
}
}
if (el.value !== void 0) {
if (!meta) {
meta = {};
}
meta.value = el.value;
if (el.tagName === "INPUT" && CHECKABLE_INPUTS.indexOf(el.type) >= 0 && !el.checked) {
delete meta.value;
}
}
if (value) {
if (!meta) {
meta = {};
}
for (let key in value) {
meta[key] = value[key];
}
}
return meta;
}
pushEvent(type, el, targetCtx, phxEvent, meta, opts = {}) {
this.pushWithReply(() => this.putRef([el], type, opts), "event", {
type,
event: phxEvent,
value: this.extractMeta(el, meta, opts.value),
cid: this.targetComponentID(el, targetCtx, opts)
});
}
pushFileProgress(fileEl, entryRef, progress, onReply = function() {
}) {
this.liveSocket.withinOwners(fileEl.form, (view, targetCtx) => {
view.pushWithReply(null, "progress", {
event: fileEl.getAttribute(view.binding(PHX_PROGRESS)),
ref: fileEl.getAttribute(PHX_UPLOAD_REF),
entry_ref: entryRef,
progress,
cid: view.targetComponentID(fileEl.form, targetCtx)
}, onReply);
});
}
pushInput(inputEl, targetCtx, forceCid, phxEvent, opts, callback) {
let uploads;
let cid = isCid(forceCid) ? forceCid : this.targetComponentID(inputEl.form, targetCtx);
let refGenerator = () => this.putRef([inputEl, inputEl.form], "change", opts);
let formData = serializeForm(inputEl.form, { _target: opts._target });
if (dom_default.isUploadInput(inputEl) && inputEl.files && inputEl.files.length > 0) {
LiveUploader.trackFiles(inputEl, Array.from(inputEl.files));
}
uploads = LiveUploader.serializeUploads(inputEl);
let event = {
type: "form",
event: phxEvent,
value: formData,
uploads,
cid
};
this.pushWithReply(refGenerator, "event", event, (resp) => {
dom_default.showError(inputEl, this.liveSocket.binding(PHX_FEEDBACK_FOR));
if (dom_default.isUploadInput(inputEl) && inputEl.getAttribute("data-phx-auto-upload") !== null) {
if (LiveUploader.filesAwaitingPreflight(inputEl).length > 0) {
let [ref, _els] = refGenerator();
this.uploadFiles(inputEl.form, targetCtx, ref, cid, (_uploads) => {
callback && callback(resp);
this.triggerAwaitingSubmit(inputEl.form);
});
}
} else {
callback && callback(resp);
}
});
}
triggerAwaitingSubmit(formEl) {
let awaitingSubmit = this.getScheduledSubmit(formEl);
if (awaitingSubmit) {
let [_el, _ref, _opts, callback] = awaitingSubmit;
this.cancelSubmit(formEl);
callback();
}
}
getScheduledSubmit(formEl) {
return this.formSubmits.find(([el, _ref, _opts, _callback]) => el.isSameNode(formEl));
}
scheduleSubmit(formEl, ref, opts, callback) {
if (this.getScheduledSubmit(formEl)) {
return true;
}
this.formSubmits.push([formEl, ref, opts, callback]);
}
cancelSubmit(formEl) {
this.formSubmits = this.formSubmits.filter(([el, ref, _callback]) => {
if (el.isSameNode(formEl)) {
this.undoRefs(ref);
return false;
} else {
return true;
}
});
}
pushFormSubmit(formEl, targetCtx, phxEvent, opts, onReply) {
let filterIgnored = (el) => {
let userIgnored = closestPhxBinding(el, `${this.binding(PHX_UPDATE)}=ignore`, el.form);
return !(userIgnored || closestPhxBinding(el, "data-phx-update=ignore", el.form));
};
let filterDisables = (el) => {
return el.hasAttribute(this.binding(PHX_DISABLE_WITH));
};
let filterButton = (el) => el.tagName == "BUTTON";
let filterInput = (el) => ["INPUT", "TEXTAREA", "SELECT"].includes(el.tagName);
let refGenerator = () => {
let formElements = Array.from(formEl.elements);
let disables = formElements.filter(filterDisables);
let buttons = formElements.filter(filterButton).filter(filterIgnored);
let inputs = formElements.filter(filterInput).filter(filterIgnored);
buttons.forEach((button) => {
button.setAttribute(PHX_DISABLED, button.disabled);
button.disabled = true;
});
inputs.forEach((input) => {
input.setAttribute(PHX_READONLY, input.readOnly);
input.readOnly = true;
if (input.files) {
input.setAttribute(PHX_DISABLED, input.disabled);
input.disabled = true;
}
});
formEl.setAttribute(this.binding(PHX_PAGE_LOADING), "");
return this.putRef([formEl].concat(disables).concat(buttons).concat(inputs), "submit", opts);
};
let cid = this.targetComponentID(formEl, targetCtx);
if (LiveUploader.hasUploadsInProgress(formEl)) {
let [ref, _els] = refGenerator();
let push = () => this.pushFormSubmit(formEl, targetCtx, phxEvent, opts, onReply);
return this.scheduleSubmit(formEl, ref, opts, push);
} else if (LiveUploader.inputsAwaitingPreflight(formEl).length > 0) {
let [ref, els] = refGenerator();
let proxyRefGen = () => [ref, els, opts];
this.uploadFiles(formEl, targetCtx, ref, cid, (_uploads) => {
let formData = serializeForm(formEl, {});
this.pushWithReply(proxyRefGen, "event", {
type: "form",
event: phxEvent,
value: formData,
cid
}, onReply);
});
} else {
let formData = serializeForm(formEl);
this.pushWithReply(refGenerator, "event", {
type: "form",
event: phxEvent,
value: formData,
cid
}, onReply);
}
}
uploadFiles(formEl, targetCtx, ref, cid, onComplete) {
let joinCountAtUpload = this.joinCount;
let inputEls = LiveUploader.activeFileInputs(formEl);
let numFileInputsInProgress = inputEls.length;
inputEls.forEach((inputEl) => {
let uploader = new LiveUploader(inputEl, this, () => {
numFileInputsInProgress--;
if (numFileInputsInProgress === 0) {
onComplete();
}
});
this.uploaders[inputEl] = uploader;
let entries = uploader.entries().map((entry) => entry.toPreflightPayload());
let payload = {
ref: inputEl.getAttribute(PHX_UPLOAD_REF),
entries,
cid: this.targetComponentID(inputEl.form, targetCtx)
};
this.log("upload", () => ["sending preflight request", payload]);
this.pushWithReply(null, "allow_upload", payload, (resp) => {
this.log("upload", () => ["got preflight response", resp]);
if (resp.error) {
this.undoRefs(ref);
let [entry_ref, reason] = resp.error;
this.log("upload", () => [`error for entry ${entry_ref}`, reason]);
} else {
let onError = (callback) => {
this.channel.onError(() => {
if (this.joinCount === joinCountAtUpload) {
callback();
}
});
};
uploader.initAdapterUpload(resp, onError, this.liveSocket);
}
});
});
}
dispatchUploads(name, filesOrBlobs) {
let inputs = dom_default.findUploadInputs(this.el).filter((el) => el.name === name);
if (inputs.length === 0) {
logError(`no live file inputs found matching the name "${name}"`);
} else if (inputs.length > 1) {
logError(`duplicate live file inputs found matching the name "${name}"`);
} else {
dom_default.dispatchEvent(inputs[0], PHX_TRACK_UPLOADS, { files: filesOrBlobs });
}
}
pushFormRecovery(form, newCid, callback) {
this.liveSocket.withinOwners(form, (view, targetCtx) => {
let input = form.elements[0];
let phxEvent = form.getAttribute(this.binding(PHX_AUTO_RECOVER)) || form.getAttribute(this.binding("change"));
js_default.exec("change", phxEvent, view, input, ["push", { _target: input.name, newCid, callback }]);
});
}
pushLinkPatch(href, targetEl, callback) {
let linkRef = this.liveSocket.setPendingLink(href);
let refGen = targetEl ? () => this.putRef([targetEl], "click") : null;
let fallback = () => this.liveSocket.redirect(window.location.href);
let push = this.pushWithReply(refGen, "live_patch", { url: href }, (resp) => {
this.liveSocket.requestDOMUpdate(() => {
if (resp.link_redirect) {
this.liveSocket.replaceMain(href, null, callback, linkRef);
} else {
if (this.liveSocket.commitPendingLink(linkRef)) {
this.href = href;
}
this.applyPendingUpdates();
callback && callback(linkRef);
}
});
});
if (push) {
push.receive("timeout", fallback);
} else {
fallback();
}
}
formsForRecovery(html) {
if (this.joinCount === 0) {
return [];
}
let phxChange = this.binding("change");
let template = document.createElement("template");
template.innerHTML = html;
return dom_default.all(this.el, `form[${phxChange}]`).filter((form) => form.id && this.ownsElement(form)).filter((form) => form.elements.length > 0).filter((form) => form.getAttribute(this.binding(PHX_AUTO_RECOVER)) !== "ignore").map((form) => {
let newForm = template.content.querySelector(`form[id="${form.id}"][${phxChange}="${form.getAttribute(phxChange)}"]`);
if (newForm) {
return [form, newForm, this.targetComponentID(newForm)];
} else {
return [form, null, null];
}
}).filter(([form, newForm, newCid]) => newForm);
}
maybePushComponentsDestroyed(destroyedCIDs) {
let willDestroyCIDs = destroyedCIDs.filter((cid) => {
return dom_default.findComponentNodeList(this.el, cid).length === 0;
});
if (willDestroyCIDs.length > 0) {
this.pruningCIDs.push(...willDestroyCIDs);
this.pushWithReply(null, "cids_will_destroy", { cids: willDestroyCIDs }, () => {
this.pruningCIDs = this.pruningCIDs.filter((cid) => willDestroyCIDs.indexOf(cid) !== -1);
let completelyDestroyCIDs = willDestroyCIDs.filter((cid) => {
return dom_default.findComponentNodeList(this.el, cid).length === 0;
});
if (completelyDestroyCIDs.length > 0) {
this.pushWithReply(null, "cids_destroyed", { cids: completelyDestroyCIDs }, (resp) => {
this.rendered.pruneCIDs(resp.cids);
});
}
});
}
}
ownsElement(el) {
return el.getAttribute(PHX_PARENT_ID) === this.id || maybe(el.closest(PHX_VIEW_SELECTOR), (node) => node.id) === this.id;
}
submitForm(form, targetCtx, phxEvent, opts = {}) {
dom_default.putPrivate(form, PHX_HAS_SUBMITTED, true);
let phxFeedback = this.liveSocket.binding(PHX_FEEDBACK_FOR);
let inputs = Array.from(form.elements);
this.liveSocket.blurActiveElement(this);
this.pushFormSubmit(form, targetCtx, phxEvent, opts, () => {
inputs.forEach((input) => dom_default.showError(input, phxFeedback));
this.liveSocket.restorePreviouslyActiveFocus();
});
}
binding(kind) {
return this.liveSocket.binding(kind);
}
};
var LiveSocket = class {
constructor(url, phxSocket, opts = {}) {
this.unloaded = false;
if (!phxSocket || phxSocket.constructor.name === "Object") {
throw new Error(`
a phoenix Socket must be provided as the second argument to the LiveSocket constructor. For example:
import {Socket} from "phoenix"
import {LiveSocket} from "phoenix_live_view"
let liveSocket = new LiveSocket("/live", Socket, {...})
`);
}
this.socket = new phxSocket(url, opts);
this.bindingPrefix = opts.bindingPrefix || BINDING_PREFIX;
this.opts = opts;
this.params = closure2(opts.params || {});
this.viewLogger = opts.viewLogger;
this.metadataCallbacks = opts.metadata || {};
this.defaults = Object.assign(clone(DEFAULTS), opts.defaults || {});
this.activeElement = null;
this.prevActive = null;
this.silenced = false;
this.main = null;
this.linkRef = 1;
this.clickRef = 1;
this.roots = {};
this.href = window.location.href;
this.pendingLink = null;
this.currentLocation = clone(window.location);
this.hooks = opts.hooks || {};
this.uploaders = opts.uploaders || {};
this.loaderTimeout = opts.loaderTimeout || LOADER_TIMEOUT;
this.maxReloads = opts.maxReloads || MAX_RELOADS;
this.reloadJitterMin = opts.reloadJitterMin || RELOAD_JITTER_MIN;
this.reloadJitterMax = opts.reloadJitterMax || RELOAD_JITTER_MAX;
this.failsafeJitter = opts.failsafeJitter || FAILSAFE_JITTER;
this.localStorage = opts.localStorage || window.localStorage;
this.sessionStorage = opts.sessionStorage || window.sessionStorage;
this.boundTopLevelEvents = false;
this.domCallbacks = Object.assign({ onNodeAdded: closure2(), onBeforeElUpdated: closure2() }, opts.dom || {});
this.transitions = new TransitionSet();
window.addEventListener("pagehide", (_e) => {
this.unloaded = true;
});
this.socket.onOpen(() => {
if (this.isUnloaded()) {
window.location.reload();
}
});
}
isProfileEnabled() {
return this.sessionStorage.getItem(PHX_LV_PROFILE) === "true";
}
isDebugEnabled() {
return this.sessionStorage.getItem(PHX_LV_DEBUG) === "true";
}
enableDebug() {
this.sessionStorage.setItem(PHX_LV_DEBUG, "true");
}
enableProfiling() {
this.sessionStorage.setItem(PHX_LV_PROFILE, "true");
}
disableDebug() {
this.sessionStorage.removeItem(PHX_LV_DEBUG);
}
disableProfiling() {
this.sessionStorage.removeItem(PHX_LV_PROFILE);
}
enableLatencySim(upperBoundMs) {
this.enableDebug();
console.log("latency simulator enabled for the duration of this browser session. Call disableLatencySim() to disable");
this.sessionStorage.setItem(PHX_LV_LATENCY_SIM, upperBoundMs);
}
disableLatencySim() {
this.sessionStorage.removeItem(PHX_LV_LATENCY_SIM);
}
getLatencySim() {
let str = this.sessionStorage.getItem(PHX_LV_LATENCY_SIM);
return str ? parseInt(str) : null;
}
getSocket() {
return this.socket;
}
connect() {
let doConnect = () => {
if (this.joinRootViews()) {
this.bindTopLevelEvents();
this.socket.connect();
}
};
if (["complete", "loaded", "interactive"].indexOf(document.readyState) >= 0) {
doConnect();
} else {
document.addEventListener("DOMContentLoaded", () => doConnect());
}
}
disconnect(callback) {
this.socket.disconnect(callback);
}
execJS(el, encodedJS, eventType = null) {
this.owner(el, (view) => js_default.exec(eventType, encodedJS, view, el));
}
triggerDOM(kind, args) {
this.domCallbacks[kind](...args);
}
time(name, func) {
if (!this.isProfileEnabled() || !console.time) {
return func();
}
console.time(name);
let result = func();
console.timeEnd(name);
return result;
}
log(view, kind, msgCallback) {
if (this.viewLogger) {
let [msg, obj] = msgCallback();
this.viewLogger(view, kind, msg, obj);
} else if (this.isDebugEnabled()) {
let [msg, obj] = msgCallback();
debug(view, kind, msg, obj);
}
}
requestDOMUpdate(callback) {
this.transitions.after(callback);
}
transition(time, onStart, onDone = function() {
}) {
this.transitions.addTransition(time, onStart, onDone);
}
onChannel(channel, event, cb) {
channel.on(event, (data) => {
let latency = this.getLatencySim();
if (!latency) {
cb(data);
} else {
console.log(`simulating ${latency}ms of latency from server to client`);
setTimeout(() => cb(data), latency);
}
});
}
wrapPush(view, opts, push) {
let latency = this.getLatencySim();
let oldJoinCount = view.joinCount;
if (!latency) {
if (opts.timeout) {
return push().receive("timeout", () => {
if (view.joinCount === oldJoinCount && !view.isDestroyed()) {
this.reloadWithJitter(view, () => {
this.log(view, "timeout", () => ["received timeout while communicating with server. Falling back to hard refresh for recovery"]);
});
}
});
} else {
return push();
}
}
console.log(`simulating ${latency}ms of latency from client to server`);
let fakePush = {
receives: [],
receive(kind, cb) {
this.receives.push([kind, cb]);
}
};
setTimeout(() => {
if (view.isDestroyed()) {
return;
}
fakePush.receives.reduce((acc, [kind, cb]) => acc.receive(kind, cb), push());
}, latency);
return fakePush;
}
reloadWithJitter(view, log) {
view.destroy();
this.disconnect();
let minMs = this.reloadJitterMin;
let maxMs = this.reloadJitterMax;
let afterMs = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs;
let tries = browser_default.updateLocal(this.localStorage, window.location.pathname, CONSECUTIVE_RELOADS, 0, (count) => count + 1);
log ? log() : this.log(view, "join", () => [`encountered ${tries} consecutive reloads`]);
if (tries > this.maxReloads) {
this.log(view, "join", () => [`exceeded ${this.maxReloads} consecutive reloads. Entering failsafe mode`]);
afterMs = this.failsafeJitter;
}
setTimeout(() => {
if (this.hasPendingLink()) {
window.location = this.pendingLink;
} else {
window.location.reload();
}
}, afterMs);
}
getHookCallbacks(name) {
return name && name.startsWith("Phoenix.") ? hooks_default[name.split(".")[1]] : this.hooks[name];
}
isUnloaded() {
return this.unloaded;
}
isConnected() {
return this.socket.isConnected();
}
getBindingPrefix() {
return this.bindingPrefix;
}
binding(kind) {
return `${this.getBindingPrefix()}${kind}`;
}
channel(topic, params) {
return this.socket.channel(topic, params);
}
joinRootViews() {
let rootsFound = false;
dom_default.all(document, `${PHX_VIEW_SELECTOR}:not([${PHX_PARENT_ID}])`, (rootEl) => {
if (!this.getRootById(rootEl.id)) {
let view = this.newRootView(rootEl);
view.setHref(this.getHref());
view.join();
if (rootEl.getAttribute(PHX_MAIN)) {
this.main = view;
}
}
rootsFound = true;
});
return rootsFound;
}
redirect(to, flash) {
this.disconnect();
browser_default.redirect(to, flash);
}
replaceMain(href, flash, callback = null, linkRef = this.setPendingLink(href)) {
let oldMainEl = this.main.el;
let newMainEl = dom_default.cloneNode(oldMainEl, "");
this.main.showLoader(this.loaderTimeout);
this.main.destroy();
this.main = this.newRootView(newMainEl, flash);
this.main.setRedirect(href);
this.transitionRemoves();
this.main.join((joinCount, onDone) => {
if (joinCount === 1 && this.commitPendingLink(linkRef)) {
this.requestDOMUpdate(() => {
dom_default.findPhxSticky(document).forEach((el) => newMainEl.appendChild(el));
oldMainEl.replaceWith(newMainEl);
callback && callback();
onDone();
});
}
});
}
transitionRemoves(elements) {
let removeAttr = this.binding("remove");
elements = elements || dom_default.all(document, `[${removeAttr}]`);
elements.forEach((el) => {
if (document.body.contains(el)) {
this.execJS(el, el.getAttribute(removeAttr), "remove");
}
});
}
isPhxView(el) {
return el.getAttribute && el.getAttribute(PHX_SESSION) !== null;
}
newRootView(el, flash) {
let view = new View(el, this, null, flash);
this.roots[view.id] = view;
return view;
}
owner(childEl, callback) {
let view = maybe(childEl.closest(PHX_VIEW_SELECTOR), (el) => this.getViewByEl(el)) || this.main;
if (view) {
callback(view);
}
}
withinOwners(childEl, callback) {
this.owner(childEl, (view) => callback(view, childEl));
}
getViewByEl(el) {
let rootId = el.getAttribute(PHX_ROOT_ID);
return maybe(this.getRootById(rootId), (root) => root.getDescendentByEl(el));
}
getRootById(id) {
return this.roots[id];
}
destroyAllViews() {
for (let id in this.roots) {
this.roots[id].destroy();
delete this.roots[id];
}
}
destroyViewByEl(el) {
let root = this.getRootById(el.getAttribute(PHX_ROOT_ID));
if (root && root.id === el.id) {
root.destroy();
delete this.roots[root.id];
} else if (root) {
root.destroyDescendent(el.id);
}
}
setActiveElement(target) {
if (this.activeElement === target) {
return;
}
this.activeElement = target;
let cancel = () => {
if (target === this.activeElement) {
this.activeElement = null;
}
target.removeEventListener("mouseup", this);
target.removeEventListener("touchend", this);
};
target.addEventListener("mouseup", cancel);
target.addEventListener("touchend", cancel);
}
getActiveElement() {
if (document.activeElement === document.body) {
return this.activeElement || document.activeElement;
} else {
return document.activeElement || document.body;
}
}
dropActiveElement(view) {
if (this.prevActive && view.ownsElement(this.prevActive)) {
this.prevActive = null;
}
}
restorePreviouslyActiveFocus() {
if (this.prevActive && this.prevActive !== document.body) {
this.prevActive.focus();
}
}
blurActiveElement() {
this.prevActive = this.getActiveElement();
if (this.prevActive !== document.body) {
this.prevActive.blur();
}
}
bindTopLevelEvents() {
if (this.boundTopLevelEvents) {
return;
}
this.boundTopLevelEvents = true;
this.socket.onClose((event) => {
if (event.code === 1e3 && this.main) {
this.reloadWithJitter(this.main);
}
});
document.body.addEventListener("click", function() {
});
window.addEventListener("pageshow", (e) => {
if (e.persisted) {
this.getSocket().disconnect();
this.withPageLoading({ to: window.location.href, kind: "redirect" });
window.location.reload();
}
}, true);
this.bindNav();
this.bindClicks();
this.bindForms();
this.bind({ keyup: "keyup", keydown: "keydown" }, (e, type, view, targetEl, phxEvent, eventTarget) => {
let matchKey = targetEl.getAttribute(this.binding(PHX_KEY));
let pressedKey = e.key && e.key.toLowerCase();
if (matchKey && matchKey.toLowerCase() !== pressedKey) {
return;
}
let data = __spreadValues({ key: e.key }, this.eventMeta(type, e, targetEl));
js_default.exec(type, phxEvent, view, targetEl, ["push", { data }]);
});
this.bind({ blur: "focusout", focus: "focusin" }, (e, type, view, targetEl, phxEvent, eventTarget) => {
if (!eventTarget) {
let data = __spreadValues({ key: e.key }, this.eventMeta(type, e, targetEl));
js_default.exec(type, phxEvent, view, targetEl, ["push", { data }]);
}
});
this.bind({ blur: "blur", focus: "focus" }, (e, type, view, targetEl, targetCtx, phxEvent, phxTarget) => {
if (phxTarget === "window") {
let data = this.eventMeta(type, e, targetEl);
js_default.exec(type, phxEvent, view, targetEl, ["push", { data }]);
}
});
window.addEventListener("dragover", (e) => e.preventDefault());
window.addEventListener("drop", (e) => {
e.preventDefault();
let dropTargetId = maybe(closestPhxBinding(e.target, this.binding(PHX_DROP_TARGET)), (trueTarget) => {
return trueTarget.getAttribute(this.binding(PHX_DROP_TARGET));
});
let dropTarget = dropTargetId && document.getElementById(dropTargetId);
let files = Array.from(e.dataTransfer.files || []);
if (!dropTarget || dropTarget.disabled || files.length === 0 || !(dropTarget.files instanceof FileList)) {
return;
}
LiveUploader.trackFiles(dropTarget, files);
dropTarget.dispatchEvent(new Event("input", { bubbles: true }));
});
this.on(PHX_TRACK_UPLOADS, (e) => {
let uploadTarget = e.target;
if (!dom_default.isUploadInput(uploadTarget)) {
return;
}
let files = Array.from(e.detail.files || []).filter((f) => f instanceof File || f instanceof Blob);
LiveUploader.trackFiles(uploadTarget, files);
uploadTarget.dispatchEvent(new Event("input", { bubbles: true }));
});
}
eventMeta(eventName, e, targetEl) {
let callback = this.metadataCallbacks[eventName];
return callback ? callback(e, targetEl) : {};
}
setPendingLink(href) {
this.linkRef++;
this.pendingLink = href;
return this.linkRef;
}
commitPendingLink(linkRef) {
if (this.linkRef !== linkRef) {
return false;
} else {
this.href = this.pendingLink;
this.pendingLink = null;
return true;
}
}
getHref() {
return this.href;
}
hasPendingLink() {
return !!this.pendingLink;
}
bind(events, callback) {
for (let event in events) {
let browserEventName = events[event];
this.on(browserEventName, (e) => {
let binding = this.binding(event);
let windowBinding = this.binding(`window-${event}`);
let targetPhxEvent = e.target.getAttribute && e.target.getAttribute(binding);
if (targetPhxEvent) {
this.debounce(e.target, e, () => {
this.withinOwners(e.target, (view) => {
callback(e, event, view, e.target, targetPhxEvent, null);
});
});
} else {
dom_default.all(document, `[${windowBinding}]`, (el) => {
let phxEvent = el.getAttribute(windowBinding);
this.debounce(el, e, () => {
this.withinOwners(el, (view) => {
callback(e, event, view, el, phxEvent, "window");
});
});
});
}
});
}
}
bindClicks() {
this.bindClick("click", "click", false);
this.bindClick("mousedown", "capture-click", true);
}
bindClick(eventName, bindingName, capture) {
let click = this.binding(bindingName);
window.addEventListener(eventName, (e) => {
if (!this.isConnected()) {
return;
}
this.clickRef++;
let clickRefWas = this.clickRef;
let target = null;
if (capture) {
target = e.target.matches(`[${click}]`) ? e.target : e.target.querySelector(`[${click}]`);
} else {
target = closestPhxBinding(e.target, click);
this.dispatchClickAway(e, clickRefWas);
}
let phxEvent = target && target.getAttribute(click);
if (!phxEvent) {
return;
}
if (target.getAttribute("href") === "#") {
e.preventDefault();
}
this.debounce(target, e, () => {
this.withinOwners(target, (view) => {
js_default.exec("click", phxEvent, view, target, ["push", { data: this.eventMeta("click", e, target) }]);
});
});
}, capture);
}
dispatchClickAway(e, clickRefWas) {
let phxClickAway = this.binding("click-away");
let phxClick = this.binding("click");
dom_default.all(document, `[${phxClickAway}]`, (el) => {
if (!(el.isSameNode(e.target) || el.contains(e.target))) {
this.withinOwners(e.target, (view) => {
let phxEvent = el.getAttribute(phxClickAway);
if (js_default.isVisible(el)) {
let target = e.target.closest(`[${phxClick}]`) || e.target;
js_default.exec("click", phxEvent, view, el, ["push", { data: this.eventMeta("click", e, e.target) }]);
}
});
}
});
}
bindNav() {
if (!browser_default.canPushState()) {
return;
}
if (history.scrollRestoration) {
history.scrollRestoration = "manual";
}
let scrollTimer = null;
window.addEventListener("scroll", (_e) => {
clearTimeout(scrollTimer);
scrollTimer = setTimeout(() => {
browser_default.updateCurrentState((state) => Object.assign(state, { scroll: window.scrollY }));
}, 100);
});
window.addEventListener("popstate", (event) => {
if (!this.registerNewLocation(window.location)) {
return;
}
let { type, id, root, scroll } = event.state || {};
let href = window.location.href;
this.requestDOMUpdate(() => {
if (this.main.isConnected() && (type === "patch" && id === this.main.id)) {
this.main.pushLinkPatch(href, null);
} else {
this.replaceMain(href, null, () => {
if (root) {
this.replaceRootHistory();
}
if (typeof scroll === "number") {
setTimeout(() => {
window.scrollTo(0, scroll);
}, 0);
}
});
}
});
}, false);
window.addEventListener("click", (e) => {
let target = closestPhxBinding(e.target, PHX_LIVE_LINK);
let type = target && target.getAttribute(PHX_LIVE_LINK);
let wantsNewTab = e.metaKey || e.ctrlKey || e.button === 1;
if (!type || !this.isConnected() || !this.main || wantsNewTab) {
return;
}
let href = target.href;
let linkState = target.getAttribute(PHX_LINK_STATE);
e.preventDefault();
if (this.pendingLink === href) {
return;
}
this.requestDOMUpdate(() => {
if (type === "patch") {
this.pushHistoryPatch(href, linkState, target);
} else if (type === "redirect") {
this.historyRedirect(href, linkState);
} else {
throw new Error(`expected ${PHX_LIVE_LINK} to be "patch" or "redirect", got: ${type}`);
}
});
}, false);
}
dispatchEvent(event, payload = {}) {
dom_default.dispatchEvent(window, `phx:${event}`, payload);
}
dispatchEvents(events) {
events.forEach(([event, payload]) => this.dispatchEvent(event, payload));
}
withPageLoading(info, callback) {
dom_default.dispatchEvent(window, "phx:page-loading-start", info);
let done = () => dom_default.dispatchEvent(window, "phx:page-loading-stop", info);
return callback ? callback(done) : done;
}
pushHistoryPatch(href, linkState, targetEl) {
this.withPageLoading({ to: href, kind: "patch" }, (done) => {
this.main.pushLinkPatch(href, targetEl, (linkRef) => {
this.historyPatch(href, linkState, linkRef);
done();
});
});
}
historyPatch(href, linkState, linkRef = this.setPendingLink(href)) {
if (!this.commitPendingLink(linkRef)) {
return;
}
browser_default.pushState(linkState, { type: "patch", id: this.main.id }, href);
this.registerNewLocation(window.location);
}
historyRedirect(href, linkState, flash) {
let scroll = window.scrollY;
this.withPageLoading({ to: href, kind: "redirect" }, (done) => {
this.replaceMain(href, flash, () => {
browser_default.pushState(linkState, { type: "redirect", id: this.main.id, scroll }, href);
this.registerNewLocation(window.location);
done();
});
});
}
replaceRootHistory() {
browser_default.pushState("replace", { root: true, type: "patch", id: this.main.id });
}
registerNewLocation(newLocation) {
let { pathname, search } = this.currentLocation;
if (pathname + search === newLocation.pathname + newLocation.search) {
return false;
} else {
this.currentLocation = clone(newLocation);
return true;
}
}
bindForms() {
let iterations = 0;
this.on("submit", (e) => {
let phxEvent = e.target.getAttribute(this.binding("submit"));
if (!phxEvent) {
return;
}
e.preventDefault();
e.target.disabled = true;
this.withinOwners(e.target, (view) => {
js_default.exec("submit", phxEvent, view, e.target, ["push", {}]);
});
}, false);
for (let type of ["change", "input"]) {
this.on(type, (e) => {
let input = e.target;
let phxEvent = input.form && input.form.getAttribute(this.binding("change"));
if (!phxEvent) {
return;
}
if (input.type === "number" && input.validity && input.validity.badInput) {
return;
}
let currentIterations = iterations;
iterations++;
let { at, type: lastType } = dom_default.private(input, "prev-iteration") || {};
if (at === currentIterations - 1 && type !== lastType) {
return;
}
dom_default.putPrivate(input, "prev-iteration", { at: currentIterations, type });
this.debounce(input, e, () => {
this.withinOwners(input.form, (view) => {
dom_default.putPrivate(input, PHX_HAS_FOCUSED, true);
if (!dom_default.isTextualInput(input)) {
this.setActiveElement(input);
}
js_default.exec("change", phxEvent, view, input, ["push", { _target: e.target.name }]);
});
});
}, false);
}
}
debounce(el, event, callback) {
let phxDebounce = this.binding(PHX_DEBOUNCE);
let phxThrottle = this.binding(PHX_THROTTLE);
let defaultDebounce = this.defaults.debounce.toString();
let defaultThrottle = this.defaults.throttle.toString();
dom_default.debounce(el, event, phxDebounce, defaultDebounce, phxThrottle, defaultThrottle, callback);
}
silenceEvents(callback) {
this.silenced = true;
callback();
this.silenced = false;
}
on(event, callback) {
window.addEventListener(event, (e) => {
if (!this.silenced) {
callback(e);
}
});
}
};
var TransitionSet = class {
constructor() {
this.transitions = /* @__PURE__ */ new Set();
this.pendingOps = [];
this.reset();
}
reset() {
this.transitions.forEach((timer) => {
cancelTimeout(timer);
this.transitions.delete(timer);
});
this.flushPendingOps();
}
after(callback) {
if (this.size() === 0) {
callback();
} else {
this.pushPendingOp(callback);
}
}
addTransition(time, onStart, onDone) {
onStart();
let timer = setTimeout(() => {
this.transitions.delete(timer);
onDone();
if (this.size() === 0) {
this.flushPendingOps();
}
}, time);
this.transitions.add(timer);
}
pushPendingOp(op) {
this.pendingOps.push(op);
}
size() {
return this.transitions.size;
}
flushPendingOps() {
this.pendingOps.forEach((op) => op());
this.pendingOps = [];
}
};
// js/app.js
var import_topbar = __toESM(require_topbar());
window.$ = import_jquery3.default;
window.jQuery = import_jquery3.default;
var csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content");
var liveSocket = new LiveSocket("/live", Socket, { params: { _csrf_token: csrfToken } });
import_topbar.default.config({ barColors: { 0: "#29d" }, shadowColor: "rgba(0, 0, 0, .3)" });
window.addEventListener("phx:page-loading-start", (info) => import_topbar.default.show());
window.addEventListener("phx:page-loading-stop", (info) => import_topbar.default.hide());
liveSocket.connect();
window.liveSocket = liveSocket;
})();
/**
* Prism: Lightweight, robust, elegant syntax highlighting
*
* @license MIT <https://opensource.org/licenses/MIT>
* @author Lea Verou <https://lea.verou.me>
* @namespace
* @public
*/
/**
* @license MIT
* topbar 1.0.0, 2021-01-06
* http://buunguyen.github.io/topbar
* Copyright (c) 2021 Buu Nguyen
*/
/*! Bundled license information:
jquery/dist/jquery.js:
(*!
* jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2021-03-02T17:08Z
*)
bootstrap/dist/js/bootstrap.esm.js:
(*!
* Bootstrap v5.2.3 (https://getbootstrap.com/)
* Copyright 2011-2022 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
*)
*/
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9qcXVlcnkvZGlzdC9qcXVlcnkuanMiLCAiLi4vLi4vLi4vYXNzZXRzL3ZlbmRvci9wcmlzbS5qcyIsICIuLi8uLi8uLi9hc3NldHMvdmVuZG9yL3RvcGJhci5qcyIsICIuLi8uLi8uLi9hc3NldHMvanMvYXBwLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2luZGV4LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2VudW1zLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXROb2RlTmFtZS5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pbnN0YW5jZU9mLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9hcHBseVN0eWxlcy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL21hdGguanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvdXNlckFnZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc0xheW91dFZpZXdwb3J0LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldExheW91dFJlY3QuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2NvbnRhaW5zLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9pc1RhYmxlRWxlbWVudC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRQYXJlbnROb2RlLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL3dpdGhpbi5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRGcmVzaFNpZGVPYmplY3QuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2V4cGFuZFRvSGFzaE1hcC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvYXJyb3cuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0VmFyaWF0aW9uLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVBsYWNlbWVudC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0V2luZG93U2Nyb2xsLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRWaWV3cG9ydFJlY3QuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldERvY3VtZW50UmVjdC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvaXNTY3JvbGxQYXJlbnQuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvZG9tLXV0aWxzL2dldFNjcm9sbFBhcmVudC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvbGlzdFNjcm9sbFBhcmVudHMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVPZmZzZXRzLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2RldGVjdE92ZXJmbG93LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3V0aWxzL2NvbXB1dGVBdXRvUGxhY2VtZW50LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9mbGlwLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9oaWRlLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL21vZGlmaWVycy9vZmZzZXQuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvZ2V0QWx0QXhpcy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9tb2RpZmllcnMvcHJldmVudE92ZXJmbG93LmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL2RvbS11dGlscy9nZXRIVE1MRWxlbWVudFNjcm9sbC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Tm9kZVNjcm9sbC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi9kb20tdXRpbHMvZ2V0Q29tcG9zaXRlUmVjdC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9vcmRlck1vZGlmaWVycy5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9kZWJvdW5jZS5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL0Bwb3BwZXJqcy9jb3JlL2xpYi91dGlscy9mb3JtYXQuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvdmFsaWRhdGVNb2RpZmllcnMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvdW5pcXVlQnkuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvdXRpbHMvbWVyZ2VCeU5hbWUuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9saWIvY3JlYXRlUG9wcGVyLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3BvcHBlci1saXRlLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvQHBvcHBlcmpzL2NvcmUvbGliL3BvcHBlci5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9pbmRleC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvZG9tL2V2ZW50LWhhbmRsZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2RvbS9kYXRhLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9kb20vbWFuaXB1bGF0b3IuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvY29uZmlnLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9iYXNlLWNvbXBvbmVudC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9hbGVydC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvYnV0dG9uLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9kb20vc2VsZWN0b3ItZW5naW5lLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy91dGlsL3N3aXBlLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9jYXJvdXNlbC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvY29sbGFwc2UuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL2Ryb3Bkb3duLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy91dGlsL3Njcm9sbGJhci5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9iYWNrZHJvcC5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdXRpbC9mb2N1c3RyYXAuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL21vZGFsLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy9vZmZjYW52YXMuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3V0aWwvc2FuaXRpemVyLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy91dGlsL3RlbXBsYXRlLWZhY3RvcnkuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3Rvb2x0aXAuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3BvcG92ZXIuanMiLCAiLi4vLi4vLi4vYXNzZXRzL25vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvc3JjL3Njcm9sbHNweS5qcyIsICIuLi8uLi8uLi9hc3NldHMvbm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9zcmMvdGFiLmpzIiwgIi4uLy4uLy4uL2Fzc2V0cy9ub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL3NyYy90b2FzdC5qcyIsICIuLi8uLi8uLi9hc3NldHMvanMvcmVwb3NpdG9yeS5qcyIsICIuLi8uLi8uLi9hc3NldHMvanMva214X2FuaW0uanMiLCAiLi4vLi4vLi4vYXNzZXRzL2pzL2tteF9jb2xvcnMuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2h0bWwvcHJpdi9zdGF0aWMvcGhvZW5peF9odG1sLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC91dGlscy5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9wdXNoLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC90aW1lci5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvY2hhbm5lbC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvYWpheC5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXgvYXNzZXRzL2pzL3Bob2VuaXgvbG9uZ3BvbGwuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4L2Fzc2V0cy9qcy9waG9lbml4L3ByZXNlbmNlLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9zZXJpYWxpemVyLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peC9hc3NldHMvanMvcGhvZW5peC9zb2NrZXQuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvY29uc3RhbnRzLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2VudHJ5X3VwbG9hZGVyLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L3V0aWxzLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2Jyb3dzZXIuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvZG9tLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L3VwbG9hZF9lbnRyeS5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9saXZlX3VwbG9hZGVyLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2hvb2tzLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2RvbV9wb3N0X21vcnBoX3Jlc3RvcmVyLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL25vZGVfbW9kdWxlcy9tb3JwaGRvbS9kaXN0L21vcnBoZG9tLWVzbS5qcyIsICIuLi8uLi8uLi9kZXBzL3Bob2VuaXhfbGl2ZV92aWV3L2Fzc2V0cy9qcy9waG9lbml4X2xpdmVfdmlldy9kb21fcGF0Y2guanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvcmVuZGVyZWQuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvdmlld19ob29rLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L2pzLmpzIiwgIi4uLy4uLy4uL2RlcHMvcGhvZW5peF9saXZlX3ZpZXcvYXNzZXRzL2pzL3Bob2VuaXhfbGl2ZV92aWV3L3ZpZXcuanMiLCAiLi4vLi4vLi4vZGVwcy9waG9lbml4X2xpdmVfdmlldy9hc3NldHMvanMvcGhvZW5peF9saXZlX3ZpZXcvbGl2ZV9zb2NrZXQuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My42LjBcbiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBPcGVuSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAyMS0wMy0wMlQxNzowOFpcbiAqL1xuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBGb3IgQ29tbW9uSlMgYW5kIENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHdoZXJlIGEgcHJvcGVyIGB3aW5kb3dgXG5cdFx0Ly8gaXMgcHJlc2VudCwgZXhlY3V0ZSB0aGUgZmFjdG9yeSBhbmQgZ2V0IGpRdWVyeS5cblx0XHQvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YFxuXHRcdC8vIChzdWNoIGFzIE5vZGUuanMpLCBleHBvc2UgYSBmYWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzLlxuXHRcdC8vIFRoaXMgYWNjZW50dWF0ZXMgdGhlIG5lZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIHJlYWwgYHdpbmRvd2AuXG5cdFx0Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKSh3aW5kb3cpO1xuXHRcdC8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgP1xuXHRcdFx0ZmFjdG9yeSggZ2xvYmFsLCB0cnVlICkgOlxuXHRcdFx0ZnVuY3Rpb24oIHcgKSB7XG5cdFx0XHRcdGlmICggIXcuZG9jdW1lbnQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBcImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnRcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWN0b3J5KCB3ICk7XG5cdFx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGZhY3RvcnkoIGdsb2JhbCApO1xuXHR9XG5cbi8vIFBhc3MgdGhpcyBpZiB3aW5kb3cgaXMgbm90IGRlZmluZWQgeWV0XG59ICkoIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiggd2luZG93LCBub0dsb2JhbCApIHtcblxuLy8gRWRnZSA8PSAxMiAtIDEzKywgRmlyZWZveCA8PTE4IC0gNDUrLCBJRSAxMCAtIDExLCBTYWZhcmkgNS4xIC0gOSssIGlPUyA2IC0gOS4xXG4vLyB0aHJvdyBleGNlcHRpb25zIHdoZW4gbm9uLXN0cmljdCBjb2RlIChlLmcuLCBBU1AuTkVUIDQuNSkgYWNjZXNzZXMgc3RyaWN0IG1vZGVcbi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uXG4vLyBlbm91Z2ggdGhhdCBhbGwgc3VjaCBhdHRlbXB0cyBhcmUgZ3VhcmRlZCBpbiBhIHRyeSBibG9jay5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyID0gW107XG5cbnZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcblxudmFyIHNsaWNlID0gYXJyLnNsaWNlO1xuXG52YXIgZmxhdCA9IGFyci5mbGF0ID8gZnVuY3Rpb24oIGFycmF5ICkge1xuXHRyZXR1cm4gYXJyLmZsYXQuY2FsbCggYXJyYXkgKTtcbn0gOiBmdW5jdGlvbiggYXJyYXkgKSB7XG5cdHJldHVybiBhcnIuY29uY2F0LmFwcGx5KCBbXSwgYXJyYXkgKTtcbn07XG5cblxudmFyIHB1c2ggPSBhcnIucHVzaDtcblxudmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjtcblxudmFyIGNsYXNzMnR5cGUgPSB7fTtcblxudmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZztcblxudmFyIGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBmblRvU3RyaW5nID0gaGFzT3duLnRvU3RyaW5nO1xuXG52YXIgT2JqZWN0RnVuY3Rpb25TdHJpbmcgPSBmblRvU3RyaW5nLmNhbGwoIE9iamVjdCApO1xuXG52YXIgc3VwcG9ydCA9IHt9O1xuXG52YXIgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uIGlzRnVuY3Rpb24oIG9iaiApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTJcblx0XHQvLyBJbiBzb21lIGJyb3dzZXJzLCB0eXBlb2YgcmV0dXJucyBcImZ1bmN0aW9uXCIgZm9yIEhUTUwgPG9iamVjdD4gZWxlbWVudHNcblx0XHQvLyAoaS5lLiwgYHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcIm9iamVjdFwiICkgPT09IFwiZnVuY3Rpb25cImApLlxuXHRcdC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi5cblx0XHQvLyBTdXBwb3J0OiBRdFdlYiA8PTMuOC41LCBXZWJLaXQgPD01MzQuMzQsIHdraHRtbHRvcGRmIHRvb2wgPD0wLjEyLjVcblx0XHQvLyBQbHVzIGZvciBvbGQgV2ViS2l0LCB0eXBlb2YgcmV0dXJucyBcImZ1bmN0aW9uXCIgZm9yIEhUTUwgY29sbGVjdGlvbnNcblx0XHQvLyAoZS5nLiwgYHR5cGVvZiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImRpdlwiKSA9PT0gXCJmdW5jdGlvblwiYCkuIChnaC00NzU2KVxuXHRcdHJldHVybiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gXCJudW1iZXJcIiAmJlxuXHRcdFx0dHlwZW9mIG9iai5pdGVtICE9PSBcImZ1bmN0aW9uXCI7XG5cdH07XG5cblxudmFyIGlzV2luZG93ID0gZnVuY3Rpb24gaXNXaW5kb3coIG9iaiApIHtcblx0XHRyZXR1cm4gb2JqICE9IG51bGwgJiYgb2JqID09PSBvYmoud2luZG93O1xuXHR9O1xuXG5cbnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcblxuXG5cblx0dmFyIHByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMgPSB7XG5cdFx0dHlwZTogdHJ1ZSxcblx0XHRzcmM6IHRydWUsXG5cdFx0bm9uY2U6IHRydWUsXG5cdFx0bm9Nb2R1bGU6IHRydWVcblx0fTtcblxuXHRmdW5jdGlvbiBET01FdmFsKCBjb2RlLCBub2RlLCBkb2MgKSB7XG5cdFx0ZG9jID0gZG9jIHx8IGRvY3VtZW50O1xuXG5cdFx0dmFyIGksIHZhbCxcblx0XHRcdHNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50KCBcInNjcmlwdFwiICk7XG5cblx0XHRzY3JpcHQudGV4dCA9IGNvZGU7XG5cdFx0aWYgKCBub2RlICkge1xuXHRcdFx0Zm9yICggaSBpbiBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggNjQrLCBFZGdlIDE4K1xuXHRcdFx0XHQvLyBTb21lIGJyb3dzZXJzIGRvbid0IHN1cHBvcnQgdGhlIFwibm9uY2VcIiBwcm9wZXJ0eSBvbiBzY3JpcHRzLlxuXHRcdFx0XHQvLyBPbiB0aGUgb3RoZXIgaGFuZCwganVzdCB1c2luZyBgZ2V0QXR0cmlidXRlYCBpcyBub3QgZW5vdWdoIGFzXG5cdFx0XHRcdC8vIHRoZSBgbm9uY2VgIGF0dHJpYnV0ZSBpcyByZXNldCB0byBhbiBlbXB0eSBzdHJpbmcgd2hlbmV2ZXIgaXRcblx0XHRcdFx0Ly8gYmVjb21lcyBicm93c2luZy1jb250ZXh0IGNvbm5lY3RlZC5cblx0XHRcdFx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvaHRtbC9pc3N1ZXMvMjM2OVxuXHRcdFx0XHQvLyBTZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jbm9uY2UtYXR0cmlidXRlc1xuXHRcdFx0XHQvLyBUaGUgYG5vZGUuZ2V0QXR0cmlidXRlYCBjaGVjayB3YXMgYWRkZWQgZm9yIHRoZSBzYWtlIG9mXG5cdFx0XHRcdC8vIGBqUXVlcnkuZ2xvYmFsRXZhbGAgc28gdGhhdCBpdCBjYW4gZmFrZSBhIG5vbmNlLWNvbnRhaW5pbmcgbm9kZVxuXHRcdFx0XHQvLyB2aWEgYW4gb2JqZWN0LlxuXHRcdFx0XHR2YWwgPSBub2RlWyBpIF0gfHwgbm9kZS5nZXRBdHRyaWJ1dGUgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoIGkgKTtcblx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0c2NyaXB0LnNldEF0dHJpYnV0ZSggaSwgdmFsICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApO1xuXHR9XG5cblxuZnVuY3Rpb24gdG9UeXBlKCBvYmogKSB7XG5cdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0cmV0dXJuIG9iaiArIFwiXCI7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiID9cblx0XHRjbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKCBvYmogKSBdIHx8IFwib2JqZWN0XCIgOlxuXHRcdHR5cGVvZiBvYmo7XG59XG4vKiBnbG9iYWwgU3ltYm9sICovXG4vLyBEZWZpbmluZyB0aGlzIGdsb2JhbCBpbiAuZXNsaW50cmMuanNvbiB3b3VsZCBjcmVhdGUgYSBkYW5nZXIgb2YgdXNpbmcgdGhlIGdsb2JhbFxuLy8gdW5ndWFyZGVkIGluIGFub3RoZXIgcGxhY2UsIGl0IHNlZW1zIHNhZmVyIHRvIGRlZmluZSBnbG9iYWwgb25seSBmb3IgdGhpcyBtb2R1bGVcblxuXG5cbnZhclxuXHR2ZXJzaW9uID0gXCIzLjYuMFwiLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblxuXHRcdC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJ1xuXHRcdC8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChqdXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQgKTtcblx0fTtcblxualF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHtcblxuXHQvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkXG5cdGpxdWVyeTogdmVyc2lvbixcblxuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LFxuXG5cdC8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMFxuXHRsZW5ndGg6IDAsXG5cblx0dG9BcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SXG5cdC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5XG5cdGdldDogZnVuY3Rpb24oIG51bSApIHtcblxuXHRcdC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXlcblx0XHRpZiAoIG51bSA9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4ganVzdCB0aGUgb25lIGVsZW1lbnQgZnJvbSB0aGUgc2V0XG5cdFx0cmV0dXJuIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0aCBdIDogdGhpc1sgbnVtIF07XG5cdH0sXG5cblx0Ly8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFja1xuXHQvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldClcblx0cHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cblx0XHQvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldFxuXHRcdHZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTtcblxuXHRcdC8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpXG5cdFx0cmV0LnByZXZPYmplY3QgPSB0aGlzO1xuXG5cdFx0Ly8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXRcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdC8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuXG5cdGVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7XG5cdH0sXG5cblx0bWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0c2xpY2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApICk7XG5cdH0sXG5cblx0Zmlyc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAwICk7XG5cdH0sXG5cblx0bGFzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIC0xICk7XG5cdH0sXG5cblx0ZXZlbjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkuZ3JlcCggdGhpcywgZnVuY3Rpb24oIF9lbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuICggaSArIDEgKSAlIDI7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0b2RkOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5ncmVwKCB0aGlzLCBmdW5jdGlvbiggX2VsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gaSAlIDI7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0ZXE6IGZ1bmN0aW9uKCBpICkge1xuXHRcdHZhciBsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdGogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApO1xuXHR9LFxuXG5cdGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVjdG9yKCk7XG5cdH0sXG5cblx0Ly8gRm9yIGludGVybmFsIHVzZSBvbmx5LlxuXHQvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC5cblx0cHVzaDogcHVzaCxcblx0c29ydDogYXJyLnNvcnQsXG5cdHNwbGljZTogYXJyLnNwbGljZVxufTtcblxualF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHtcblx0dmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgMCBdIHx8IHt9LFxuXHRcdGkgPSAxLFxuXHRcdGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0ZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKCB0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRkZWVwID0gdGFyZ2V0O1xuXG5cdFx0Ly8gU2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgaSBdIHx8IHt9O1xuXHRcdGkrKztcblx0fVxuXG5cdC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KVxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgJiYgIWlzRnVuY3Rpb24oIHRhcmdldCApICkge1xuXHRcdHRhcmdldCA9IHt9O1xuXHR9XG5cblx0Ly8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkXG5cdGlmICggaSA9PT0gbGVuZ3RoICkge1xuXHRcdHRhcmdldCA9IHRoaXM7XG5cdFx0aS0tO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAoIG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSApICE9IG51bGwgKSB7XG5cblx0XHRcdC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3Rcblx0XHRcdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IE9iamVjdC5wcm90b3R5cGUgcG9sbHV0aW9uXG5cdFx0XHRcdC8vIFByZXZlbnQgbmV2ZXItZW5kaW5nIGxvb3Bcblx0XHRcdFx0aWYgKCBuYW1lID09PSBcIl9fcHJvdG9fX1wiIHx8IHRhcmdldCA9PT0gY29weSApIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5c1xuXHRcdFx0XHRpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHxcblx0XHRcdFx0XHQoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHtcblx0XHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblxuXHRcdFx0XHRcdC8vIEVuc3VyZSBwcm9wZXIgdHlwZSBmb3IgdGhlIHNvdXJjZSB2YWx1ZVxuXHRcdFx0XHRcdGlmICggY29weUlzQXJyYXkgJiYgIUFycmF5LmlzQXJyYXkoIHNyYyApICkge1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBbXTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKCAhY29weUlzQXJyYXkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSApIHtcblx0XHRcdFx0XHRcdGNsb25lID0ge307XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjb3B5SXNBcnJheSA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0Ly8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtXG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCBjbG9uZSwgY29weSApO1xuXG5cdFx0XHRcdC8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXNcblx0XHRcdFx0fSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0gY29weTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0XG5cdHJldHVybiB0YXJnZXQ7XG59O1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gVW5pcXVlIGZvciBlYWNoIGNvcHkgb2YgalF1ZXJ5IG9uIHRoZSBwYWdlXG5cdGV4cGFuZG86IFwialF1ZXJ5XCIgKyAoIHZlcnNpb24gKyBNYXRoLnJhbmRvbSgpICkucmVwbGFjZSggL1xcRC9nLCBcIlwiICksXG5cblx0Ly8gQXNzdW1lIGpRdWVyeSBpcyByZWFkeSB3aXRob3V0IHRoZSByZWFkeSBtb2R1bGVcblx0aXNSZWFkeTogdHJ1ZSxcblxuXHRlcnJvcjogZnVuY3Rpb24oIG1zZyApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoIG1zZyApO1xuXHR9LFxuXG5cdG5vb3A6IGZ1bmN0aW9uKCkge30sXG5cblx0aXNQbGFpbk9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblx0XHR2YXIgcHJvdG8sIEN0b3I7XG5cblx0XHQvLyBEZXRlY3Qgb2J2aW91cyBuZWdhdGl2ZXNcblx0XHQvLyBVc2UgdG9TdHJpbmcgaW5zdGVhZCBvZiBqUXVlcnkudHlwZSB0byBjYXRjaCBob3N0IG9iamVjdHNcblx0XHRpZiAoICFvYmogfHwgdG9TdHJpbmcuY2FsbCggb2JqICkgIT09IFwiW29iamVjdCBPYmplY3RdXCIgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cHJvdG8gPSBnZXRQcm90byggb2JqICk7XG5cblx0XHQvLyBPYmplY3RzIHdpdGggbm8gcHJvdG90eXBlIChlLmcuLCBgT2JqZWN0LmNyZWF0ZSggbnVsbCApYCkgYXJlIHBsYWluXG5cdFx0aWYgKCAhcHJvdG8gKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHQvLyBPYmplY3RzIHdpdGggcHJvdG90eXBlIGFyZSBwbGFpbiBpZmYgdGhleSB3ZXJlIGNvbnN0cnVjdGVkIGJ5IGEgZ2xvYmFsIE9iamVjdCBmdW5jdGlvblxuXHRcdEN0b3IgPSBoYXNPd24uY2FsbCggcHJvdG8sIFwiY29uc3RydWN0b3JcIiApICYmIHByb3RvLmNvbnN0cnVjdG9yO1xuXHRcdHJldHVybiB0eXBlb2YgQ3RvciA9PT0gXCJmdW5jdGlvblwiICYmIGZuVG9TdHJpbmcuY2FsbCggQ3RvciApID09PSBPYmplY3RGdW5jdGlvblN0cmluZztcblx0fSxcblxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBuYW1lO1xuXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIHByb3ZpZGVkIGNvbnRleHQ7IGZhbGxzIGJhY2sgdG8gdGhlIGdsb2JhbCBvbmVcblx0Ly8gaWYgbm90IHNwZWNpZmllZC5cblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUsIG9wdGlvbnMsIGRvYyApIHtcblx0XHRET01FdmFsKCBjb2RlLCB7IG5vbmNlOiBvcHRpb25zICYmIG9wdGlvbnMubm9uY2UgfSwgZG9jICk7XG5cdH0sXG5cblx0ZWFjaDogZnVuY3Rpb24oIG9iaiwgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGxlbmd0aCwgaSA9IDA7XG5cblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBvYmogKSApIHtcblx0XHRcdGxlbmd0aCA9IG9iai5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBvYmogKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9iajtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFx0WyBhcnIgXSA6IGFyclxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cHVzaC5jYWxsKCByZXQsIGFyciApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0aW5BcnJheTogZnVuY3Rpb24oIGVsZW0sIGFyciwgaSApIHtcblx0XHRyZXR1cm4gYXJyID09IG51bGwgPyAtMSA6IGluZGV4T2YuY2FsbCggYXJyLCBlbGVtLCBpICk7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0bWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkge1xuXHRcdHZhciBsZW4gPSArc2Vjb25kLmxlbmd0aCxcblx0XHRcdGogPSAwLFxuXHRcdFx0aSA9IGZpcnN0Lmxlbmd0aDtcblxuXHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0Zmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqIF07XG5cdFx0fVxuXG5cdFx0Zmlyc3QubGVuZ3RoID0gaTtcblxuXHRcdHJldHVybiBmaXJzdDtcblx0fSxcblxuXHRncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnZlcnQgKSB7XG5cdFx0dmFyIGNhbGxiYWNrSW52ZXJzZSxcblx0XHRcdG1hdGNoZXMgPSBbXSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoLFxuXHRcdFx0Y2FsbGJhY2tFeHBlY3QgPSAhaW52ZXJ0O1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtc1xuXHRcdC8vIHRoYXQgcGFzcyB0aGUgdmFsaWRhdG9yIGZ1bmN0aW9uXG5cdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRjYWxsYmFja0ludmVyc2UgPSAhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTtcblx0XHRcdGlmICggY2FsbGJhY2tJbnZlcnNlICE9PSBjYWxsYmFja0V4cGVjdCApIHtcblx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBlbGVtc1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGNoZXM7XG5cdH0sXG5cblx0Ly8gYXJnIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1hcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgYXJnICkge1xuXHRcdHZhciBsZW5ndGgsIHZhbHVlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRyZXQgPSBbXTtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpciBuZXcgdmFsdWVzXG5cdFx0aWYgKCBpc0FycmF5TGlrZSggZWxlbXMgKSApIHtcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEdvIHRocm91Z2ggZXZlcnkga2V5IG9uIHRoZSBvYmplY3QsXG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gZWxlbXMgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0XHRyZXR1cm4gZmxhdCggcmV0ICk7XG5cdH0sXG5cblx0Ly8gQSBnbG9iYWwgR1VJRCBjb3VudGVyIGZvciBvYmplY3RzXG5cdGd1aWQ6IDEsXG5cblx0Ly8galF1ZXJ5LnN1cHBvcnQgaXMgbm90IHVzZWQgaW4gQ29yZSBidXQgb3RoZXIgcHJvamVjdHMgYXR0YWNoIHRoZWlyXG5cdC8vIHByb3BlcnRpZXMgdG8gaXQgc28gaXQgbmVlZHMgdG8gZXhpc3QuXG5cdHN1cHBvcnQ6IHN1cHBvcnRcbn0gKTtcblxuaWYgKCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cdGpRdWVyeS5mblsgU3ltYm9sLml0ZXJhdG9yIF0gPSBhcnJbIFN5bWJvbC5pdGVyYXRvciBdO1xufVxuXG4vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXBcbmpRdWVyeS5lYWNoKCBcIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sXCIuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblx0XHRjbGFzczJ0eXBlWyBcIltvYmplY3QgXCIgKyBuYW1lICsgXCJdXCIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0fSApO1xuXG5mdW5jdGlvbiBpc0FycmF5TGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcilcblx0Ly8gYGluYCBjaGVjayB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0yMTQ1KVxuXHQvLyBoYXNPd24gaXNuJ3QgdXNlZCBoZXJlIGR1ZSB0byBmYWxzZSBuZWdhdGl2ZXNcblx0Ly8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRVxuXHR2YXIgbGVuZ3RoID0gISFvYmogJiYgXCJsZW5ndGhcIiBpbiBvYmogJiYgb2JqLmxlbmd0aCxcblx0XHR0eXBlID0gdG9UeXBlKCBvYmogKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIG9iaiApIHx8IGlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy42XG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vanMuZm91bmRhdGlvbi9cbiAqXG4gKiBEYXRlOiAyMDIxLTAyLTE2XG4gKi9cbiggZnVuY3Rpb24oIHdpbmRvdyApIHtcbnZhciBpLFxuXHRzdXBwb3J0LFxuXHRFeHByLFxuXHRnZXRUZXh0LFxuXHRpc1hNTCxcblx0dG9rZW5pemUsXG5cdGNvbXBpbGUsXG5cdHNlbGVjdCxcblx0b3V0ZXJtb3N0Q29udGV4dCxcblx0c29ydElucHV0LFxuXHRoYXNEdXBsaWNhdGUsXG5cblx0Ly8gTG9jYWwgZG9jdW1lbnQgdmFyc1xuXHRzZXREb2N1bWVudCxcblx0ZG9jdW1lbnQsXG5cdGRvY0VsZW0sXG5cdGRvY3VtZW50SXNIVE1MLFxuXHRyYnVnZ3lRU0EsXG5cdHJidWdneU1hdGNoZXMsXG5cdG1hdGNoZXMsXG5cdGNvbnRhaW5zLFxuXG5cdC8vIEluc3RhbmNlLXNwZWNpZmljIGRhdGFcblx0ZXhwYW5kbyA9IFwic2l6emxlXCIgKyAxICogbmV3IERhdGUoKSxcblx0cHJlZmVycmVkRG9jID0gd2luZG93LmRvY3VtZW50LFxuXHRkaXJydW5zID0gMCxcblx0ZG9uZSA9IDAsXG5cdGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHR0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0Y29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdG5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHtcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdH1cblx0XHRyZXR1cm4gMDtcblx0fSxcblxuXHQvLyBJbnN0YW5jZSBtZXRob2RzXG5cdGhhc093biA9ICgge30gKS5oYXNPd25Qcm9wZXJ0eSxcblx0YXJyID0gW10sXG5cdHBvcCA9IGFyci5wb3AsXG5cdHB1c2hOYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblxuXHQvLyBVc2UgYSBzdHJpcHBlZC1kb3duIGluZGV4T2YgYXMgaXQncyBmYXN0ZXIgdGhhbiBuYXRpdmVcblx0Ly8gaHR0cHM6Ly9qc3BlcmYuY29tL3Rob3ItaW5kZXhvZi12cy1mb3IvNVxuXHRpbmRleE9mID0gZnVuY3Rpb24oIGxpc3QsIGVsZW0gKSB7XG5cdFx0dmFyIGkgPSAwLFxuXHRcdFx0bGVuID0gbGlzdC5sZW5ndGg7XG5cdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRpZiAoIGxpc3RbIGkgXSA9PT0gZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fSxcblxuXHRib29sZWFucyA9IFwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufFwiICtcblx0XHRcImlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIixcblxuXHQvLyBSZWd1bGFyIGV4cHJlc3Npb25zXG5cblx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI3doaXRlc3BhY2Vcblx0d2hpdGVzcGFjZSA9IFwiW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZl1cIixcblxuXHQvLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzLXN5bnRheC0zLyNpZGVudC10b2tlbi1kaWFncmFtXG5cdGlkZW50aWZpZXIgPSBcIig/OlxcXFxcXFxcW1xcXFxkYS1mQS1GXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIj98XFxcXFxcXFxbXlxcXFxyXFxcXG5cXFxcZl18W1xcXFx3LV18W15cXDAtXFxcXHg3Zl0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHRhdHRyaWJ1dGVzID0gXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXG5cdFx0Ly8gT3BlcmF0b3IgKGNhcHR1cmUgMilcblx0XHRcIiooWypeJHwhfl0/PSlcIiArIHdoaXRlc3BhY2UgK1xuXG5cdFx0Ly8gXCJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdXG5cdFx0Ly8gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgK1xuXHRcdHdoaXRlc3BhY2UgKyBcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XFxcXCgoXCIgK1xuXG5cdFx0Ly8gVG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzIG5lZWRpbmcgdG9rZW5pemUgaW4gdGhlIHByZUZpbHRlciwgcHJlZmVyIGFyZ3VtZW50czpcblx0XHQvLyAxLiBxdW90ZWQgKGNhcHR1cmUgMzsgY2FwdHVyZSA0IG9yIGNhcHR1cmUgNSlcblx0XHRcIignKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcJ10pKiknfFxcXCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFxcXFwiXSkqKVxcXCIpfFwiICtcblxuXHRcdC8vIDIuIHNpbXBsZSAoY2FwdHVyZSA2KVxuXHRcdFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKClbXFxcXF1dfFwiICsgYXR0cmlidXRlcyArIFwiKSopfFwiICtcblxuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArXG5cdFx0d2hpdGVzcGFjZSArIFwiKyRcIiwgXCJnXCIgKSxcblxuXHRyY29tbWEgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiosXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcblx0cmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFs+K35dfFwiICsgd2hpdGVzcGFjZSArIFwiKVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XCIqXCIgKSxcblx0cmRlc2NlbmQgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgXCJ8PlwiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIkNMQVNTXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgaWRlbnRpZmllciArIFwifFsqXSlcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArXG5cdFx0XHR3aGl0ZXNwYWNlICsgXCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXG5cdFx0Ly8gRm9yIHVzZSBpbiBsaWJyYXJpZXMgaW1wbGVtZW50aW5nIC5pcygpXG5cdFx0Ly8gV2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRjaGluZyBpbiBgc2VsZWN0YFxuXHRcdFwibmVlZHNDb250ZXh0XCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmh0bWwgPSAvSFRNTCQvaSxcblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblxuXHQvLyBDU1MgZXNjYXBlc1xuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFxbXFxcXGRhLWZBLUZdezEsNn1cIiArIHdoaXRlc3BhY2UgKyBcIj98XFxcXFxcXFwoW15cXFxcclxcXFxuXFxcXGZdKVwiLCBcImdcIiApLFxuXHRmdW5lc2NhcGUgPSBmdW5jdGlvbiggZXNjYXBlLCBub25IZXggKSB7XG5cdFx0dmFyIGhpZ2ggPSBcIjB4XCIgKyBlc2NhcGUuc2xpY2UoIDEgKSAtIDB4MTAwMDA7XG5cblx0XHRyZXR1cm4gbm9uSGV4ID9cblxuXHRcdFx0Ly8gU3RyaXAgdGhlIGJhY2tzbGFzaCBwcmVmaXggZnJvbSBhIG5vbi1oZXggZXNjYXBlIHNlcXVlbmNlXG5cdFx0XHRub25IZXggOlxuXG5cdFx0XHQvLyBSZXBsYWNlIGEgaGV4YWRlY2ltYWwgZXNjYXBlIHNlcXVlbmNlIHdpdGggdGhlIGVuY29kZWQgVW5pY29kZSBjb2RlIHBvaW50XG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTExK1xuXHRcdFx0Ly8gRm9yIHZhbHVlcyBvdXRzaWRlIHRoZSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUgKEJNUCksIG1hbnVhbGx5IGNvbnN0cnVjdCBhXG5cdFx0XHQvLyBzdXJyb2dhdGUgcGFpclxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDpcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gQ1NTIHN0cmluZy9pZGVudGlmaWVyIHNlcmlhbGl6YXRpb25cblx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNjb21tb24tc2VyaWFsaXppbmctaWRpb21zXG5cdHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXDAtXFx4MWZcXHg3Zi1cXHVGRkZGXFx3LV0vZyxcblx0ZmNzc2VzY2FwZSA9IGZ1bmN0aW9uKCBjaCwgYXNDb2RlUG9pbnQgKSB7XG5cdFx0aWYgKCBhc0NvZGVQb2ludCApIHtcblxuXHRcdFx0Ly8gVSswMDAwIE5VTEwgYmVjb21lcyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSXG5cdFx0XHRpZiAoIGNoID09PSBcIlxcMFwiICkge1xuXHRcdFx0XHRyZXR1cm4gXCJcXHVGRkZEXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnRyb2wgY2hhcmFjdGVycyBhbmQgKGRlcGVuZGVudCB1cG9uIHBvc2l0aW9uKSBudW1iZXJzIGdldCBlc2NhcGVkIGFzIGNvZGUgcG9pbnRzXG5cdFx0XHRyZXR1cm4gY2guc2xpY2UoIDAsIC0xICkgKyBcIlxcXFxcIiArXG5cdFx0XHRcdGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArIFwiIFwiO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWRcblx0XHRyZXR1cm4gXCJcXFxcXCIgKyBjaDtcblx0fSxcblxuXHQvLyBVc2VkIGZvciBpZnJhbWVzXG5cdC8vIFNlZSBzZXREb2N1bWVudCgpXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRVxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fSxcblxuXHRpbkRpc2FibGVkRmllbGRzZXQgPSBhZGRDb21iaW5hdG9yKFxuXHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImZpZWxkc2V0XCI7XG5cdFx0fSxcblx0XHR7IGRpcjogXCJwYXJlbnROb2RlXCIsIG5leHQ6IFwibGVnZW5kXCIgfVxuXHQpO1xuXG4vLyBPcHRpbWl6ZSBmb3IgcHVzaC5hcHBseSggXywgTm9kZUxpc3QgKVxudHJ5IHtcblx0cHVzaC5hcHBseShcblx0XHQoIGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkgKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wXG5cdC8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHlcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xuXHRhcnJbIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzLmxlbmd0aCBdLm5vZGVUeXBlO1xufSBjYXRjaCAoIGUgKSB7XG5cdHB1c2ggPSB7IGFwcGx5OiBhcnIubGVuZ3RoID9cblxuXHRcdC8vIExldmVyYWdlIHNsaWNlIGlmIHBvc3NpYmxlXG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0cHVzaE5hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKCBlbHMgKSApO1xuXHRcdH0gOlxuXG5cdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdC8vIE90aGVyd2lzZSBhcHBlbmQgZGlyZWN0bHlcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHR2YXIgaiA9IHRhcmdldC5sZW5ndGgsXG5cdFx0XHRcdGkgPSAwO1xuXG5cdFx0XHQvLyBDYW4ndCB0cnVzdCBOb2RlTGlzdC5sZW5ndGhcblx0XHRcdHdoaWxlICggKCB0YXJnZXRbIGorKyBdID0gZWxzWyBpKysgXSApICkge31cblx0XHRcdHRhcmdldC5sZW5ndGggPSBqIC0gMTtcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBtLCBpLCBlbGVtLCBuaWQsIG1hdGNoLCBncm91cHMsIG5ld1NlbGVjdG9yLFxuXHRcdG5ld0NvbnRleHQgPSBjb250ZXh0ICYmIGNvbnRleHQub3duZXJEb2N1bWVudCxcblxuXHRcdC8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnRcblx0XHRub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dFxuXHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiB8fCAhc2VsZWN0b3IgfHxcblx0XHRub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSAmJiBub2RlVHlwZSAhPT0gMTEgKSB7XG5cblx0XHRyZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdC8vIFRyeSB0byBzaG9ydGN1dCBmaW5kIG9wZXJhdGlvbnMgKGFzIG9wcG9zZWQgdG8gZmlsdGVycykgaW4gSFRNTCBkb2N1bWVudHNcblx0aWYgKCAhc2VlZCApIHtcblx0XHRzZXREb2N1bWVudCggY29udGV4dCApO1xuXHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdFx0Ly8gSWYgdGhlIHNlbGVjdG9yIGlzIHN1ZmZpY2llbnRseSBzaW1wbGUsIHRyeSB1c2luZyBhIFwiZ2V0KkJ5KlwiIERPTSBtZXRob2Rcblx0XHRcdC8vIChleGNlcHRpbmcgRG9jdW1lbnRGcmFnbWVudCBjb250ZXh0LCB3aGVyZSB0aGUgbWV0aG9kcyBkb24ndCBleGlzdClcblx0XHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmICggbWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkgKSApIHtcblxuXHRcdFx0XHQvLyBJRCBzZWxlY3RvclxuXHRcdFx0XHRpZiAoICggbSA9IG1hdGNoWyAxIF0gKSApIHtcblxuXHRcdFx0XHRcdC8vIERvY3VtZW50IGNvbnRleHRcblx0XHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkgKSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSwgT3BlcmEsIFdlYmtpdFxuXHRcdFx0XHRcdFx0XHQvLyBUT0RPOiBpZGVudGlmeSB2ZXJzaW9uc1xuXHRcdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRcdGlmICggZWxlbS5pZCA9PT0gbSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBFbGVtZW50IGNvbnRleHRcblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSwgT3BlcmEsIFdlYmtpdFxuXHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdGlmICggbmV3Q29udGV4dCAmJiAoIGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkgKSAmJlxuXHRcdFx0XHRcdFx0XHRjb250YWlucyggY29udGV4dCwgZWxlbSApICYmXG5cdFx0XHRcdFx0XHRcdGVsZW0uaWQgPT09IG0gKSB7XG5cblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUeXBlIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWyAyIF0gKSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHRcdC8vIENsYXNzIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoICggbSA9IG1hdGNoWyAzIF0gKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiZcblx0XHRcdFx0XHRjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGxcblx0XHRcdGlmICggc3VwcG9ydC5xc2EgJiZcblx0XHRcdFx0IW5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXSAmJlxuXHRcdFx0XHQoICFyYnVnZ3lRU0EgfHwgIXJidWdneVFTQS50ZXN0KCBzZWxlY3RvciApICkgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA4IG9ubHlcblx0XHRcdFx0Ly8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHNcblx0XHRcdFx0KCBub2RlVHlwZSAhPT0gMSB8fCBjb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09IFwib2JqZWN0XCIgKSApIHtcblxuXHRcdFx0XHRuZXdTZWxlY3RvciA9IHNlbGVjdG9yO1xuXHRcdFx0XHRuZXdDb250ZXh0ID0gY29udGV4dDtcblxuXHRcdFx0XHQvLyBxU0EgY29uc2lkZXJzIGVsZW1lbnRzIG91dHNpZGUgYSBzY29waW5nIHJvb3Qgd2hlbiBldmFsdWF0aW5nIGNoaWxkIG9yXG5cdFx0XHRcdC8vIGRlc2NlbmRhbnQgY29tYmluYXRvcnMsIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnQuXG5cdFx0XHRcdC8vIEluIHN1Y2ggY2FzZXMsIHdlIHdvcmsgYXJvdW5kIHRoZSBiZWhhdmlvciBieSBwcmVmaXhpbmcgZXZlcnkgc2VsZWN0b3IgaW4gdGhlXG5cdFx0XHRcdC8vIGxpc3Qgd2l0aCBhbiBJRCBzZWxlY3RvciByZWZlcmVuY2luZyB0aGUgc2NvcGUgY29udGV4dC5cblx0XHRcdFx0Ly8gVGhlIHRlY2huaXF1ZSBoYXMgdG8gYmUgdXNlZCBhcyB3ZWxsIHdoZW4gYSBsZWFkaW5nIGNvbWJpbmF0b3IgaXMgdXNlZFxuXHRcdFx0XHQvLyBhcyBzdWNoIHNlbGVjdG9ycyBhcmUgbm90IHJlY29nbml6ZWQgYnkgcXVlcnlTZWxlY3RvckFsbC5cblx0XHRcdFx0Ly8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgdGVjaG5pcXVlLlxuXHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0KCByZGVzY2VuZC50ZXN0KCBzZWxlY3RvciApIHx8IHJjb21iaW5hdG9ycy50ZXN0KCBzZWxlY3RvciApICkgKSB7XG5cblx0XHRcdFx0XHQvLyBFeHBhbmQgY29udGV4dCBmb3Igc2libGluZyBzZWxlY3RvcnNcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHxcblx0XHRcdFx0XHRcdGNvbnRleHQ7XG5cblx0XHRcdFx0XHQvLyBXZSBjYW4gdXNlIDpzY29wZSBpbnN0ZWFkIG9mIHRoZSBJRCBoYWNrIGlmIHRoZSBicm93c2VyXG5cdFx0XHRcdFx0Ly8gc3VwcG9ydHMgaXQgJiBpZiB3ZSdyZSBub3QgY2hhbmdpbmcgdGhlIGNvbnRleHQuXG5cdFx0XHRcdFx0aWYgKCBuZXdDb250ZXh0ICE9PSBjb250ZXh0IHx8ICFzdXBwb3J0LnNjb3BlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBDYXB0dXJlIHRoZSBjb250ZXh0IElELCBzZXR0aW5nIGl0IGZpcnN0IGlmIG5lY2Vzc2FyeVxuXHRcdFx0XHRcdFx0aWYgKCAoIG5pZCA9IGNvbnRleHQuZ2V0QXR0cmlidXRlKCBcImlkXCIgKSApICkge1xuXHRcdFx0XHRcdFx0XHRuaWQgPSBuaWQucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgKCBuaWQgPSBleHBhbmRvICkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmVmaXggZXZlcnkgc2VsZWN0b3IgaW4gdGhlIGxpc3Rcblx0XHRcdFx0XHRncm91cHMgPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHRcdFx0XHRpID0gZ3JvdXBzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGdyb3Vwc1sgaSBdID0gKCBuaWQgPyBcIiNcIiArIG5pZCA6IFwiOnNjb3BlXCIgKSArIFwiIFwiICtcblx0XHRcdFx0XHRcdFx0dG9TZWxlY3RvciggZ3JvdXBzWyBpIF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bmV3U2VsZWN0b3IgPSBncm91cHMuam9pbiggXCIsXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cyxcblx0XHRcdFx0XHRcdG5ld0NvbnRleHQucXVlcnlTZWxlY3RvckFsbCggbmV3U2VsZWN0b3IgKVxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH0gY2F0Y2ggKCBxc2FFcnJvciApIHtcblx0XHRcdFx0XHRub25uYXRpdmVTZWxlY3RvckNhY2hlKCBzZWxlY3RvciwgdHJ1ZSApO1xuXHRcdFx0XHR9IGZpbmFsbHkge1xuXHRcdFx0XHRcdGlmICggbmlkID09PSBleHBhbmRvICkge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoIFwiaWRcIiApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEFsbCBvdGhlcnNcblx0cmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oc3RyaW5nLCBvYmplY3QpfSBSZXR1cm5zIHRoZSBPYmplY3QgZGF0YSBhZnRlciBzdG9yaW5nIGl0IG9uIGl0c2VsZiB3aXRoXG4gKlx0cHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aClcbiAqXHRkZWxldGluZyB0aGUgb2xkZXN0IGVudHJ5XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlKCkge1xuXHR2YXIga2V5cyA9IFtdO1xuXG5cdGZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkge1xuXG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1Nylcblx0XHRpZiAoIGtleXMucHVzaCgga2V5ICsgXCIgXCIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XG5cblx0XHRcdC8vIE9ubHkga2VlcCB0aGUgbW9zdCByZWNlbnQgZW50cmllc1xuXHRcdFx0ZGVsZXRlIGNhY2hlWyBrZXlzLnNoaWZ0KCkgXTtcblx0XHR9XG5cdFx0cmV0dXJuICggY2FjaGVbIGtleSArIFwiIFwiIF0gPSB2YWx1ZSApO1xuXHR9XG5cdHJldHVybiBjYWNoZTtcbn1cblxuLyoqXG4gKiBNYXJrIGEgZnVuY3Rpb24gZm9yIHNwZWNpYWwgdXNlIGJ5IFNpenpsZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIG1hcmtcbiAqL1xuZnVuY3Rpb24gbWFya0Z1bmN0aW9uKCBmbiApIHtcblx0Zm5bIGV4cGFuZG8gXSA9IHRydWU7XG5cdHJldHVybiBmbjtcbn1cblxuLyoqXG4gKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gUGFzc2VkIHRoZSBjcmVhdGVkIGVsZW1lbnQgYW5kIHJldHVybnMgYSBib29sZWFuIHJlc3VsdFxuICovXG5mdW5jdGlvbiBhc3NlcnQoIGZuICkge1xuXHR2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImZpZWxkc2V0XCIgKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBlbCApO1xuXHR9IGNhdGNoICggZSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH0gZmluYWxseSB7XG5cblx0XHQvLyBSZW1vdmUgZnJvbSBpdHMgcGFyZW50IGJ5IGRlZmF1bHRcblx0XHRpZiAoIGVsLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApO1xuXHRcdH1cblxuXHRcdC8vIHJlbGVhc2UgbWVtb3J5IGluIElFXG5cdFx0ZWwgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRyc1xuICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7XG5cdHZhciBhcnIgPSBhdHRycy5zcGxpdCggXCJ8XCIgKSxcblx0XHRpID0gYXJyLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRFeHByLmF0dHJIYW5kbGVbIGFyclsgaSBdIF0gPSBoYW5kbGVyO1xuXHR9XG59XG5cbi8qKlxuICogQ2hlY2tzIGRvY3VtZW50IG9yZGVyIG9mIHR3byBzaWJsaW5nc1xuICogQHBhcmFtIHtFbGVtZW50fSBhXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFJldHVybnMgbGVzcyB0aGFuIDAgaWYgYSBwcmVjZWRlcyBiLCBncmVhdGVyIHRoYW4gMCBpZiBhIGZvbGxvd3MgYlxuICovXG5mdW5jdGlvbiBzaWJsaW5nQ2hlY2soIGEsIGIgKSB7XG5cdHZhciBjdXIgPSBiICYmIGEsXG5cdFx0ZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdGEuc291cmNlSW5kZXggLSBiLnNvdXJjZUluZGV4O1xuXG5cdC8vIFVzZSBJRSBzb3VyY2VJbmRleCBpZiBhdmFpbGFibGUgb24gYm90aCBub2Rlc1xuXHRpZiAoIGRpZmYgKSB7XG5cdFx0cmV0dXJuIGRpZmY7XG5cdH1cblxuXHQvLyBDaGVjayBpZiBiIGZvbGxvd3MgYVxuXHRpZiAoIGN1ciApIHtcblx0XHR3aGlsZSAoICggY3VyID0gY3VyLm5leHRTaWJsaW5nICkgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKCBuYW1lID09PSBcImlucHV0XCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIiApICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIDplbmFibGVkLzpkaXNhYmxlZFxuICogQHBhcmFtIHtCb29sZWFufSBkaXNhYmxlZCB0cnVlIGZvciA6ZGlzYWJsZWQ7IGZhbHNlIGZvciA6ZW5hYmxlZFxuICovXG5mdW5jdGlvbiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZGlzYWJsZWQgKSB7XG5cblx0Ly8gS25vd24gOmRpc2FibGVkIGZhbHNlIHBvc2l0aXZlczogZmllbGRzZXRbZGlzYWJsZWRdID4gbGVnZW5kOm50aC1vZi10eXBlKG4rMikgOmNhbi1kaXNhYmxlXG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIE9ubHkgY2VydGFpbiBlbGVtZW50cyBjYW4gbWF0Y2ggOmVuYWJsZWQgb3IgOmRpc2FibGVkXG5cdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZW5hYmxlZFxuXHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI3NlbGVjdG9yLWRpc2FibGVkXG5cdFx0aWYgKCBcImZvcm1cIiBpbiBlbGVtICkge1xuXG5cdFx0XHQvLyBDaGVjayBmb3IgaW5oZXJpdGVkIGRpc2FibGVkbmVzcyBvbiByZWxldmFudCBub24tZGlzYWJsZWQgZWxlbWVudHM6XG5cdFx0XHQvLyAqIGxpc3RlZCBmb3JtLWFzc29jaWF0ZWQgZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBmaWVsZHNldFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NhdGVnb3J5LWxpc3RlZFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtZmUtZGlzYWJsZWRcblx0XHRcdC8vICogb3B0aW9uIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXBcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LW9wdGlvbi1kaXNhYmxlZFxuXHRcdFx0Ly8gQWxsIHN1Y2ggZWxlbWVudHMgaGF2ZSBhIFwiZm9ybVwiIHByb3BlcnR5LlxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgJiYgZWxlbS5kaXNhYmxlZCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0Ly8gT3B0aW9uIGVsZW1lbnRzIGRlZmVyIHRvIGEgcGFyZW50IG9wdGdyb3VwIGlmIHByZXNlbnRcblx0XHRcdFx0aWYgKCBcImxhYmVsXCIgaW4gZWxlbSApIHtcblx0XHRcdFx0XHRpZiAoIFwibGFiZWxcIiBpbiBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5wYXJlbnROb2RlLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDYgLSAxMVxuXHRcdFx0XHQvLyBVc2UgdGhlIGlzRGlzYWJsZWQgc2hvcnRjdXQgcHJvcGVydHkgdG8gY2hlY2sgZm9yIGRpc2FibGVkIGZpZWxkc2V0IGFuY2VzdG9yc1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pc0Rpc2FibGVkID09PSBkaXNhYmxlZCB8fFxuXG5cdFx0XHRcdFx0Ly8gV2hlcmUgdGhlcmUgaXMgbm8gaXNEaXNhYmxlZCwgY2hlY2sgbWFudWFsbHlcblx0XHRcdFx0XHQvKiBqc2hpbnQgLVcwMTggKi9cblx0XHRcdFx0XHRlbGVtLmlzRGlzYWJsZWQgIT09ICFkaXNhYmxlZCAmJlxuXHRcdFx0XHRcdGluRGlzYWJsZWRGaWVsZHNldCggZWxlbSApID09PSBkaXNhYmxlZDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXG5cdFx0Ly8gVHJ5IHRvIHdpbm5vdyBvdXQgZWxlbWVudHMgdGhhdCBjYW4ndCBiZSBkaXNhYmxlZCBiZWZvcmUgdHJ1c3RpbmcgdGhlIGRpc2FibGVkIHByb3BlcnR5LlxuXHRcdC8vIFNvbWUgdmljdGltcyBnZXQgY2F1Z2h0IGluIG91ciBuZXQgKGxhYmVsLCBsZWdlbmQsIG1lbnUsIHRyYWNrKSwgYnV0IGl0IHNob3VsZG4ndFxuXHRcdC8vIGV2ZW4gZXhpc3Qgb24gdGhlbSwgbGV0IGFsb25lIGhhdmUgYSBib29sZWFuIHZhbHVlLlxuXHRcdH0gZWxzZSBpZiAoIFwibGFiZWxcIiBpbiBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdH1cblxuXHRcdC8vIFJlbWFpbmluZyBlbGVtZW50cyBhcmUgbmVpdGhlciA6ZW5hYmxlZCBub3IgOmRpc2FibGVkXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgcG9zaXRpb25hbHNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZuICkge1xuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHR2YXIgaixcblx0XHRcdFx0bWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSxcblx0XHRcdFx0aSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7XG5cblx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlc1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggc2VlZFsgKCBqID0gbWF0Y2hJbmRleGVzWyBpIF0gKSBdICkge1xuXHRcdFx0XHRcdHNlZWRbIGogXSA9ICEoIG1hdGNoZXNbIGogXSA9IHNlZWRbIGogXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9ICk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHR2YXIgbmFtZXNwYWNlID0gZWxlbSAmJiBlbGVtLm5hbWVzcGFjZVVSSSxcblx0XHRkb2NFbGVtID0gZWxlbSAmJiAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkuZG9jdW1lbnRFbGVtZW50O1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OFxuXHQvLyBBc3N1bWUgSFRNTCB3aGVuIGRvY3VtZW50RWxlbWVudCBkb2Vzbid0IHlldCBleGlzdCwgc3VjaCBhcyBpbnNpZGUgbG9hZGluZyBpZnJhbWVzXG5cdC8vIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC80ODMzXG5cdHJldHVybiAhcmh0bWwudGVzdCggbmFtZXNwYWNlIHx8IGRvY0VsZW0gJiYgZG9jRWxlbS5ub2RlTmFtZSB8fCBcIkhUTUxcIiApO1xufTtcblxuLyoqXG4gKiBTZXRzIGRvY3VtZW50LXJlbGF0ZWQgdmFyaWFibGVzIG9uY2UgYmFzZWQgb24gdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3R9IFtkb2NdIEFuIGVsZW1lbnQgb3IgZG9jdW1lbnQgb2JqZWN0IHRvIHVzZSB0byBzZXQgdGhlIGRvY3VtZW50XG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKi9cbnNldERvY3VtZW50ID0gU2l6emxlLnNldERvY3VtZW50ID0gZnVuY3Rpb24oIG5vZGUgKSB7XG5cdHZhciBoYXNDb21wYXJlLCBzdWJXaW5kb3csXG5cdFx0ZG9jID0gbm9kZSA/IG5vZGUub3duZXJEb2N1bWVudCB8fCBub2RlIDogcHJlZmVycmVkRG9jO1xuXG5cdC8vIFJldHVybiBlYXJseSBpZiBkb2MgaXMgaW52YWxpZCBvciBhbHJlYWR5IHNlbGVjdGVkXG5cdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICggZG9jID09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHtcblx0XHRyZXR1cm4gZG9jdW1lbnQ7XG5cdH1cblxuXHQvLyBVcGRhdGUgZ2xvYmFsIHZhcmlhYmxlc1xuXHRkb2N1bWVudCA9IGRvYztcblx0ZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblx0ZG9jdW1lbnRJc0hUTUwgPSAhaXNYTUwoIGRvY3VtZW50ICk7XG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExKywgRWRnZSAxMiAtIDE4K1xuXHQvLyBBY2Nlc3NpbmcgaWZyYW1lIGRvY3VtZW50cyBhZnRlciB1bmxvYWQgdGhyb3dzIFwicGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpXG5cdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICggcHJlZmVycmVkRG9jICE9IGRvY3VtZW50ICYmXG5cdFx0KCBzdWJXaW5kb3cgPSBkb2N1bWVudC5kZWZhdWx0VmlldyApICYmIHN1YldpbmRvdy50b3AgIT09IHN1YldpbmRvdyApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDExLCBFZGdlXG5cdFx0aWYgKCBzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRcdHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcInVubG9hZFwiLCB1bmxvYWRIYW5kbGVyLCBmYWxzZSApO1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDEwIG9ubHlcblx0XHR9IGVsc2UgaWYgKCBzdWJXaW5kb3cuYXR0YWNoRXZlbnQgKSB7XG5cdFx0XHRzdWJXaW5kb3cuYXR0YWNoRXZlbnQoIFwib251bmxvYWRcIiwgdW5sb2FkSGFuZGxlciApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDggLSAxMSssIEVkZ2UgMTIgLSAxOCssIENocm9tZSA8PTE2IC0gMjUgb25seSwgRmlyZWZveCA8PTMuNiAtIDMxIG9ubHksXG5cdC8vIFNhZmFyaSA0IC0gNSBvbmx5LCBPcGVyYSA8PTExLjYgLSAxMi54IG9ubHlcblx0Ly8gSUUvRWRnZSAmIG9sZGVyIGJyb3dzZXJzIGRvbid0IHN1cHBvcnQgdGhlIDpzY29wZSBwc2V1ZG8tY2xhc3MuXG5cdC8vIFN1cHBvcnQ6IFNhZmFyaSA2LjAgb25seVxuXHQvLyBTYWZhcmkgNi4wIHN1cHBvcnRzIDpzY29wZSBidXQgaXQncyBhbiBhbGlhcyBvZiA6cm9vdCB0aGVyZS5cblx0c3VwcG9ydC5zY29wZSA9IGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXHRcdHJldHVybiB0eXBlb2YgZWwucXVlcnlTZWxlY3RvckFsbCAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuXHRcdFx0IWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiOnNjb3BlIGZpZWxkc2V0IGRpdlwiICkubGVuZ3RoO1xuXHR9ICk7XG5cblx0LyogQXR0cmlidXRlc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gU3VwcG9ydDogSUU8OFxuXHQvLyBWZXJpZnkgdGhhdCBnZXRBdHRyaWJ1dGUgcmVhbGx5IHJldHVybnMgYXR0cmlidXRlcyBhbmQgbm90IHByb3BlcnRpZXNcblx0Ly8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpXG5cdHN1cHBvcnQuYXR0cmlidXRlcyA9IGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRcdGVsLmNsYXNzTmFtZSA9IFwiaVwiO1xuXHRcdHJldHVybiAhZWwuZ2V0QXR0cmlidXRlKCBcImNsYXNzTmFtZVwiICk7XG5cdH0gKTtcblxuXHQvKiBnZXRFbGVtZW50KHMpQnkqXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50c0J5VGFnTmFtZShcIipcIikgcmV0dXJucyBvbmx5IGVsZW1lbnRzXG5cdHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgPSBhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudCggXCJcIiApICk7XG5cdFx0cmV0dXJuICFlbC5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCIqXCIgKS5sZW5ndGg7XG5cdH0gKTtcblxuXHQvLyBTdXBwb3J0OiBJRTw5XG5cdHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDEwXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRCeUlkIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZVxuXHQvLyBUaGUgYnJva2VuIGdldEVsZW1lbnRCeUlkIG1ldGhvZHMgZG9uJ3QgcGljayB1cCBwcm9ncmFtbWF0aWNhbGx5LXNldCBuYW1lcyxcblx0Ly8gc28gdXNlIGEgcm91bmRhYm91dCBnZXRFbGVtZW50c0J5TmFtZSB0ZXN0XG5cdHN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaWQgPSBleHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9ICk7XG5cblx0Ly8gSUQgZmlsdGVyIGFuZCBmaW5kXG5cdGlmICggc3VwcG9ydC5nZXRCeUlkICkge1xuXHRcdEV4cHIuZmlsdGVyWyBcIklEXCIgXSA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdFx0RXhwci5maW5kWyBcIklEXCIgXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblx0XHRcdFx0cmV0dXJuIGVsZW0gPyBbIGVsZW0gXSA6IFtdO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0RXhwci5maWx0ZXJbIFwiSURcIiBdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIFwiaWRcIiApO1xuXHRcdFx0XHRyZXR1cm4gbm9kZSAmJiBub2RlLnZhbHVlID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA2IC0gNyBvbmx5XG5cdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgaXMgbm90IHJlbGlhYmxlIGFzIGEgZmluZCBzaG9ydGN1dFxuXHRcdEV4cHIuZmluZFsgXCJJRFwiIF0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0XHR2YXIgbm9kZSwgaSwgZWxlbXMsXG5cdFx0XHRcdFx0ZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtICkge1xuXG5cdFx0XHRcdFx0Ly8gVmVyaWZ5IHRoZSBpZCBhdHRyaWJ1dGVcblx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBlbGVtID0gZWxlbXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBcImlkXCIgKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZFsgXCJUQUdcIiBdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA/XG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRG9jdW1lbnRGcmFnbWVudCBub2RlcyBkb24ndCBoYXZlIGdFQlROXG5cdFx0XHR9IGVsc2UgaWYgKCBzdXBwb3J0LnFzYSApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnICk7XG5cdFx0XHR9XG5cdFx0fSA6XG5cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdHRtcCA9IFtdLFxuXHRcdFx0XHRpID0gMCxcblxuXHRcdFx0XHQvLyBCeSBoYXBweSBjb2luY2lkZW5jZSwgYSAoYnJva2VuKSBnRUJUTiBhcHBlYXJzIG9uIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgdG9vXG5cdFx0XHRcdHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50c1xuXHRcdFx0aWYgKCB0YWcgPT09IFwiKlwiICkge1xuXHRcdFx0XHR3aGlsZSAoICggZWxlbSA9IHJlc3VsdHNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0dG1wLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdG1wO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0fTtcblxuXHQvLyBDbGFzc1xuXHRFeHByLmZpbmRbIFwiQ0xBU1NcIiBdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7XG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qIFFTQS9tYXRjaGVzU2VsZWN0b3Jcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnRcblxuXHQvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KVxuXHRyYnVnZ3lNYXRjaGVzID0gW107XG5cblx0Ly8gcVNhKDpmb2N1cykgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKENocm9tZSAyMSlcblx0Ly8gV2UgYWxsb3cgdGhpcyBiZWNhdXNlIG9mIGEgYnVnIGluIElFOC85IHRoYXQgdGhyb3dzIGFuIGVycm9yXG5cdC8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWVcblx0Ly8gU28sIHdlIGFsbG93IDpmb2N1cyB0byBwYXNzIHRocm91Z2ggUVNBIGFsbCB0aGUgdGltZSB0byBhdm9pZCB0aGUgSUUgZXJyb3Jcblx0Ly8gU2VlIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM3OFxuXHRyYnVnZ3lRU0EgPSBbXTtcblxuXHRpZiAoICggc3VwcG9ydC5xc2EgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKSApICkge1xuXG5cdFx0Ly8gQnVpbGQgUVNBIHJlZ2V4XG5cdFx0Ly8gUmVnZXggc3RyYXRlZ3kgYWRvcHRlZCBmcm9tIERpZWdvIFBlcmluaVxuXHRcdGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXG5cdFx0XHR2YXIgaW5wdXQ7XG5cblx0XHRcdC8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2Vcblx0XHRcdC8vIFRoaXMgaXMgdG8gdGVzdCBJRSdzIHRyZWF0bWVudCBvZiBub3QgZXhwbGljaXRseVxuXHRcdFx0Ly8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsXG5cdFx0XHQvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5XG5cdFx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9IFwiPGEgaWQ9J1wiICsgZXhwYW5kbyArIFwiJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgaWQ9J1wiICsgZXhwYW5kbyArIFwiLVxcclxcXFwnIG1zYWxsb3djYXB0dXJlPScnPlwiICtcblx0XHRcdFx0XCI8b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTgsIE9wZXJhIDExLTEyLjE2XG5cdFx0XHQvLyBOb3RoaW5nIHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmluZ3MgZm9sbG93IF49IG9yICQ9IG9yICo9XG5cdFx0XHQvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCBcInNhZmVcIiBmb3IgV2luUlRcblx0XHRcdC8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvblxuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIlttc2FsbG93Y2FwdHVyZV49JyddXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJbc2VsZWN0ZWRdXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86dmFsdWV8XCIgKyBib29sZWFucyArIFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44K1xuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJbaWR+PVwiICsgZXhwYW5kbyArIFwiLV1cIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwifj1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTUgLSAxOCtcblx0XHRcdC8vIElFIDExL0VkZ2UgZG9uJ3QgZmluZCBlbGVtZW50cyBvbiBhIGBbbmFtZT0nJ11gIHF1ZXJ5IGluIHNvbWUgY2FzZXMuXG5cdFx0XHQvLyBBZGRpbmcgYSB0ZW1wb3JhcnkgYXR0cmlidXRlIHRvIHRoZSBkb2N1bWVudCBiZWZvcmUgdGhlIHNlbGVjdGlvbiB3b3Jrc1xuXHRcdFx0Ly8gYXJvdW5kIHRoZSBpc3N1ZS5cblx0XHRcdC8vIEludGVyZXN0aW5nbHksIElFIDEwICYgb2xkZXIgZG9uJ3Qgc2VlbSB0byBoYXZlIHRoZSBpc3N1ZS5cblx0XHRcdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcIlwiICk7XG5cdFx0XHRlbC5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW25hbWU9JyddXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqbmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKj1cIiArXG5cdFx0XHRcdFx0d2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiOmNoZWNrZWRcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmNoZWNrZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCssIGlPUyA4K1xuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MVxuXHRcdFx0Ly8gSW4tcGFnZSBgc2VsZWN0b3IjaWQgc2libGluZy1jb21iaW5hdG9yIHNlbGVjdG9yYCBmYWlsc1xuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJhI1wiICsgZXhwYW5kbyArIFwiKypcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiLiMuK1srfl1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9My42IC0gNSBvbmx5XG5cdFx0XHQvLyBPbGQgRmlyZWZveCBkb2Vzbid0IHRocm93IG9uIGEgYmFkbHktZXNjYXBlZCBpZGVudGlmaWVyLlxuXHRcdFx0ZWwucXVlcnlTZWxlY3RvckFsbCggXCJcXFxcXFxmXCIgKTtcblx0XHRcdHJidWdneVFTQS5wdXNoKCBcIltcXFxcclxcXFxuXFxcXGZdXCIgKTtcblx0XHR9ICk7XG5cblx0XHRhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdGVsLmlubmVySFRNTCA9IFwiPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHNcblx0XHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdFx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdFx0XHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcImhpZGRlblwiICk7XG5cdFx0XHRlbC5hcHBlbmRDaGlsZCggaW5wdXQgKS5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcIkRcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZVxuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIltuYW1lPWRdXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIm5hbWVcIiArIHdoaXRlc3BhY2UgKyBcIipbKl4kfCF+XT89XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRkYgMy41IC0gOmVuYWJsZWQvOmRpc2FibGVkIGFuZCBoaWRkZW4gZWxlbWVudHMgKGhpZGRlbiBlbGVtZW50cyBhcmUgc3RpbGwgZW5hYmxlZClcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiOmVuYWJsZWRcIiApLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0XHQvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHNcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIjpkaXNhYmxlZFwiICkubGVuZ3RoICE9PSAyICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCI6ZW5hYmxlZFwiLCBcIjpkaXNhYmxlZFwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IE9wZXJhIDEwIC0gMTEgb25seVxuXHRcdFx0Ly8gT3BlcmEgMTAtMTEgZG9lcyBub3QgdGhyb3cgb24gcG9zdC1jb21tYSBpbnZhbGlkIHBzZXVkb3Ncblx0XHRcdGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiKiw6eFwiICk7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaCggXCIsLio6XCIgKTtcblx0XHR9ICk7XG5cdH1cblxuXHRpZiAoICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgPSBybmF0aXZlLnRlc3QoICggbWF0Y2hlcyA9IGRvY0VsZW0ubWF0Y2hlcyB8fFxuXHRcdGRvY0VsZW0ud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tb3pNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm9NYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1zTWF0Y2hlc1NlbGVjdG9yICkgKSApICkge1xuXG5cdFx0YXNzZXJ0KCBmdW5jdGlvbiggZWwgKSB7XG5cblx0XHRcdC8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvclxuXHRcdFx0Ly8gb24gYSBkaXNjb25uZWN0ZWQgbm9kZSAoSUUgOSlcblx0XHRcdHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwoIGVsLCBcIipcIiApO1xuXG5cdFx0XHQvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uXG5cdFx0XHQvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFkXG5cdFx0XHRtYXRjaGVzLmNhbGwoIGVsLCBcIltzIT0nJ106eFwiICk7XG5cdFx0XHRyYnVnZ3lNYXRjaGVzLnB1c2goIFwiIT1cIiwgcHNldWRvcyApO1xuXHRcdH0gKTtcblx0fVxuXG5cdHJidWdneVFTQSA9IHJidWdneVFTQS5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5UVNBLmpvaW4oIFwifFwiICkgKTtcblx0cmJ1Z2d5TWF0Y2hlcyA9IHJidWdneU1hdGNoZXMubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneU1hdGNoZXMuam9pbiggXCJ8XCIgKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgc2VsZi1leGNsdXNpdmVcblx0Ly8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcblx0Y29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID9cblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXG5cdFx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xuXHRcdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdGFkb3duLmNvbnRhaW5zID9cblx0XHRcdFx0XHRhZG93bi5jb250YWlucyggYnVwICkgOlxuXHRcdFx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNlxuXHRcdFx0KSApO1xuXHRcdH0gOlxuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0aWYgKCBiICkge1xuXHRcdFx0XHR3aGlsZSAoICggYiA9IGIucGFyZW50Tm9kZSApICkge1xuXHRcdFx0XHRcdGlmICggYiA9PT0gYSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBoYXNDb21wYXJlID9cblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdGNvbXBhcmUgPSAoIGEub3duZXJEb2N1bWVudCB8fCBhICkgPT0gKCBiLm93bmVyRG9jdW1lbnQgfHwgYiApID9cblx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSB3ZSBrbm93IHRoZXkgYXJlIGRpc2Nvbm5lY3RlZFxuXHRcdFx0MTtcblxuXHRcdC8vIERpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdGlmICggY29tcGFyZSAmIDEgfHxcblx0XHRcdCggIXN1cHBvcnQuc29ydERldGFjaGVkICYmIGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGEgKSA9PT0gY29tcGFyZSApICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRpZiAoIGEgPT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09IHByZWZlcnJlZERvYyAmJlxuXHRcdFx0XHRjb250YWlucyggcHJlZmVycmVkRG9jLCBhICkgKSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTErLCBFZGdlIDE3IC0gMTgrXG5cdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcblx0XHRcdGlmICggYiA9PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT0gcHJlZmVycmVkRG9jICYmXG5cdFx0XHRcdGNvbnRhaW5zKCBwcmVmZXJyZWREb2MsIGIgKSApIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1haW50YWluIG9yaWdpbmFsIG9yZGVyXG5cdFx0XHRyZXR1cm4gc29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21wYXJlICYgNCA/IC0xIDogMTtcblx0fSA6XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cblx0XHRcdHJldHVybiBhID09IGRvY3VtZW50ID8gLTEgOlxuXHRcdFx0XHRiID09IGRvY3VtZW50ID8gMSA6XG5cdFx0XHRcdC8qIGVzbGludC1lbmFibGUgZXFlcWVxICovXG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKCBjdXIgPSBjdXIucGFyZW50Tm9kZSApICkge1xuXHRcdFx0YXAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXHRcdGN1ciA9IGI7XG5cdFx0d2hpbGUgKCAoIGN1ciA9IGN1ci5wYXJlbnROb2RlICkgKSB7XG5cdFx0XHRicC51bnNoaWZ0KCBjdXIgKTtcblx0XHR9XG5cblx0XHQvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeVxuXHRcdHdoaWxlICggYXBbIGkgXSA9PT0gYnBbIGkgXSApIHtcblx0XHRcdGkrKztcblx0XHR9XG5cblx0XHRyZXR1cm4gaSA/XG5cblx0XHRcdC8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvclxuXHRcdFx0c2libGluZ0NoZWNrKCBhcFsgaSBdLCBicFsgaSBdICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50IHNvcnQgZmlyc3Rcblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBlcWVxZXEgKi9cblx0XHRcdGFwWyBpIF0gPT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbIGkgXSA9PSBwcmVmZXJyZWREb2MgPyAxIDpcblx0XHRcdC8qIGVzbGludC1lbmFibGUgZXFlcWVxICovXG5cdFx0XHQwO1xuXHR9O1xuXG5cdHJldHVybiBkb2N1bWVudDtcbn07XG5cblNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkge1xuXHRyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBlbGVtZW50cyApO1xufTtcblxuU2l6emxlLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBlbGVtLCBleHByICkge1xuXHRzZXREb2N1bWVudCggZWxlbSApO1xuXG5cdGlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiZcblx0XHQhbm9ubmF0aXZlU2VsZWN0b3JDYWNoZVsgZXhwciArIFwiIFwiIF0gJiZcblx0XHQoICFyYnVnZ3lNYXRjaGVzIHx8ICFyYnVnZ3lNYXRjaGVzLnRlc3QoIGV4cHIgKSApICYmXG5cdFx0KCAhcmJ1Z2d5UVNBICAgICB8fCAhcmJ1Z2d5UVNBLnRlc3QoIGV4cHIgKSApICkge1xuXG5cdFx0dHJ5IHtcblx0XHRcdHZhciByZXQgPSBtYXRjaGVzLmNhbGwoIGVsZW0sIGV4cHIgKTtcblxuXHRcdFx0Ly8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdFx0aWYgKCByZXQgfHwgc3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCB8fFxuXG5cdFx0XHRcdC8vIEFzIHdlbGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0byBiZSBpbiBhIGRvY3VtZW50XG5cdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0ZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdG5vbm5hdGl2ZVNlbGVjdG9yQ2FjaGUoIGV4cHIsIHRydWUgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdGlmICggKCBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCApICE9IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblx0cmV0dXJuIGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICk7XG59O1xuXG5TaXp6bGUuYXR0ciA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0Ly8gSUUvRWRnZSBzb21ldGltZXMgdGhyb3cgYSBcIlBlcm1pc3Npb24gZGVuaWVkXCIgZXJyb3Igd2hlbiBzdHJpY3QtY29tcGFyaW5nXG5cdC8vIHR3byBkb2N1bWVudHM7IHNoYWxsb3cgY29tcGFyaXNvbnMgd29yay5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0dmFyIGZuID0gRXhwci5hdHRySGFuZGxlWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSxcblxuXHRcdC8vIERvbid0IGdldCBmb29sZWQgYnkgT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KVxuXHRcdHZhbCA9IGZuICYmIGhhc093bi5jYWxsKCBFeHByLmF0dHJIYW5kbGUsIG5hbWUudG9Mb3dlckNhc2UoKSApID9cblx0XHRcdGZuKCBlbGVtLCBuYW1lLCAhZG9jdW1lbnRJc0hUTUwgKSA6XG5cdFx0XHR1bmRlZmluZWQ7XG5cblx0cmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID9cblx0XHR2YWwgOlxuXHRcdHN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSA6XG5cdFx0XHQoIHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApICkgJiYgdmFsLnNwZWNpZmllZCA/XG5cdFx0XHRcdHZhbC52YWx1ZSA6XG5cdFx0XHRcdG51bGw7XG59O1xuXG5TaXp6bGUuZXNjYXBlID0gZnVuY3Rpb24oIHNlbCApIHtcblx0cmV0dXJuICggc2VsICsgXCJcIiApLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcbn07XG5cblNpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdHRocm93IG5ldyBFcnJvciggXCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiBcIiArIG1zZyApO1xufTtcblxuLyoqXG4gKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzXG4gKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVzdWx0c1xuICovXG5TaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkge1xuXHR2YXIgZWxlbSxcblx0XHRkdXBsaWNhdGVzID0gW10sXG5cdFx0aiA9IDAsXG5cdFx0aSA9IDA7XG5cblx0Ly8gVW5sZXNzIHdlICprbm93KiB3ZSBjYW4gZGV0ZWN0IGR1cGxpY2F0ZXMsIGFzc3VtZSB0aGVpciBwcmVzZW5jZVxuXHRoYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzO1xuXHRzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTtcblx0cmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTtcblxuXHRpZiAoIGhhc0R1cGxpY2F0ZSApIHtcblx0XHR3aGlsZSAoICggZWxlbSA9IHJlc3VsdHNbIGkrKyBdICkgKSB7XG5cdFx0XHRpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHtcblx0XHRcdFx0aiA9IGR1cGxpY2F0ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdHJlc3VsdHMuc3BsaWNlKCBkdXBsaWNhdGVzWyBqIF0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDbGVhciBpbnB1dCBhZnRlciBzb3J0aW5nIHRvIHJlbGVhc2Ugb2JqZWN0c1xuXHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjVcblx0c29ydElucHV0ID0gbnVsbDtcblxuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXNcbiAqIEBwYXJhbSB7QXJyYXl8RWxlbWVudH0gZWxlbVxuICovXG5nZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0dmFyIG5vZGUsXG5cdFx0cmV0ID0gXCJcIixcblx0XHRpID0gMCxcblx0XHRub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0aWYgKCAhbm9kZVR5cGUgKSB7XG5cblx0XHQvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheVxuXHRcdHdoaWxlICggKCBub2RlID0gZWxlbVsgaSsrIF0gKSApIHtcblxuXHRcdFx0Ly8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXNcblx0XHRcdHJldCArPSBnZXRUZXh0KCBub2RlICk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7XG5cblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0cmV0ICs9IGdldFRleHQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVWYWx1ZTtcblx0fVxuXG5cdC8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rlc1xuXG5cdHJldHVybiByZXQ7XG59O1xuXG5FeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHtcblxuXHQvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXJcblx0Y2FjaGVMZW5ndGg6IDUwLFxuXG5cdGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLFxuXG5cdG1hdGNoOiBtYXRjaEV4cHIsXG5cblx0YXR0ckhhbmRsZToge30sXG5cblx0ZmluZDoge30sXG5cblx0cmVsYXRpdmU6IHtcblx0XHRcIj5cIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiIFwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIgfSxcblx0XHRcIitcIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCJ+XCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiIH1cblx0fSxcblxuXHRwcmVGaWx0ZXI6IHtcblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0bWF0Y2hbIDEgXSA9IG1hdGNoWyAxIF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblxuXHRcdFx0Ly8gTW92ZSB0aGUgZ2l2ZW4gdmFsdWUgdG8gbWF0Y2hbM10gd2hldGhlciBxdW90ZWQgb3IgdW5xdW90ZWRcblx0XHRcdG1hdGNoWyAzIF0gPSAoIG1hdGNoWyAzIF0gfHwgbWF0Y2hbIDQgXSB8fFxuXHRcdFx0XHRtYXRjaFsgNSBdIHx8IFwiXCIgKS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHRpZiAoIG1hdGNoWyAyIF0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbIDMgXSA9IFwiIFwiICsgbWF0Y2hbIDMgXSArIFwiIFwiO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsgMSBdID0gbWF0Y2hbIDEgXS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRpZiAoIG1hdGNoWyAxIF0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblxuXHRcdFx0XHQvLyBudGgtKiByZXF1aXJlcyBhcmd1bWVudFxuXHRcdFx0XHRpZiAoICFtYXRjaFsgMyBdICkge1xuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbIDAgXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbIDQgXSA9ICsoIG1hdGNoWyA0IF0gP1xuXHRcdFx0XHRcdG1hdGNoWyA1IF0gKyAoIG1hdGNoWyA2IF0gfHwgMSApIDpcblx0XHRcdFx0XHQyICogKCBtYXRjaFsgMyBdID09PSBcImV2ZW5cIiB8fCBtYXRjaFsgMyBdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbIDUgXSA9ICsoICggbWF0Y2hbIDcgXSArIG1hdGNoWyA4IF0gKSB8fCBtYXRjaFsgMyBdID09PSBcIm9kZFwiICk7XG5cblx0XHRcdFx0Ly8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFsgMyBdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdH0sXG5cblx0XHRcIlBTRVVET1wiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHR2YXIgZXhjZXNzLFxuXHRcdFx0XHR1bnF1b3RlZCA9ICFtYXRjaFsgNiBdICYmIG1hdGNoWyAyIF07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByWyBcIkNISUxEXCIgXS50ZXN0KCBtYXRjaFsgMCBdICkgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pc1xuXHRcdFx0aWYgKCBtYXRjaFsgMyBdICkge1xuXHRcdFx0XHRtYXRjaFsgMiBdID0gbWF0Y2hbIDQgXSB8fCBtYXRjaFsgNSBdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblxuXHRcdFx0XHQvLyBHZXQgZXhjZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KVxuXHRcdFx0XHQoIGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApICkgJiZcblxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KCBleGNlc3MgPSB1bnF1b3RlZC5pbmRleE9mKCBcIilcIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGggKSApIHtcblxuXHRcdFx0XHQvLyBleGNlc3MgaXMgYSBuZWdhdGl2ZSBpbmRleFxuXHRcdFx0XHRtYXRjaFsgMCBdID0gbWF0Y2hbIDAgXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWyAyIF0gPSB1bnF1b3RlZC5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldHVybiBvbmx5IGNhcHR1cmVzIG5lZWRlZCBieSB0aGUgcHNldWRvIGZpbHRlciBtZXRob2QgKHR5cGUgYW5kIGFyZ3VtZW50KVxuXHRcdFx0cmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7XG5cdFx0fVxuXHR9LFxuXG5cdGZpbHRlcjoge1xuXG5cdFx0XCJUQUdcIjogZnVuY3Rpb24oIG5vZGVOYW1lU2VsZWN0b3IgKSB7XG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBub2RlTmFtZVNlbGVjdG9yID09PSBcIipcIiA/XG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9IDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTtcblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDTEFTU1wiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkge1xuXHRcdFx0dmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyBcIiBcIiBdO1xuXG5cdFx0XHRyZXR1cm4gcGF0dGVybiB8fFxuXHRcdFx0XHQoIHBhdHRlcm4gPSBuZXcgUmVnRXhwKCBcIihefFwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcdFx0XCIpXCIgKyBjbGFzc05hbWUgKyBcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiICkgKSAmJiBjbGFzc0NhY2hlKFxuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHBhdHRlcm4udGVzdChcblx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHxcblx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKCBcImNsYXNzXCIgKSB8fFxuXHRcdFx0XHRcdFx0XHRcdFwiXCJcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fSApO1xuXHRcdH0sXG5cblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHRcdFx0aWYgKCByZXN1bHQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiIT1cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoICFvcGVyYXRvciApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlc3VsdCArPSBcIlwiO1xuXG5cdFx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBtYXgtbGVuICovXG5cblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIF9hcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7XG5cdFx0XHR2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSBcIm50aFwiLFxuXHRcdFx0XHRmb3J3YXJkID0gdHlwZS5zbGljZSggLTQgKSAhPT0gXCJsYXN0XCIsXG5cdFx0XHRcdG9mVHlwZSA9IHdoYXQgPT09IFwib2YtdHlwZVwiO1xuXG5cdFx0XHRyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/XG5cblx0XHRcdFx0Ly8gU2hvcnRjdXQgZm9yIDpudGgtKihuKVxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gISFlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRcdH0gOlxuXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBfY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBjYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIG5vZGVJbmRleCwgc3RhcnQsXG5cdFx0XHRcdFx0XHRkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyBcIm5leHRTaWJsaW5nXCIgOiBcInByZXZpb3VzU2libGluZ1wiLFxuXHRcdFx0XHRcdFx0cGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdFx0bmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdFx0XHR1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZSxcblx0XHRcdFx0XHRcdGRpZmYgPSBmYWxzZTtcblxuXHRcdFx0XHRcdGlmICggcGFyZW50ICkge1xuXG5cdFx0XHRcdFx0XHQvLyA6KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdFx0XHRpZiAoIHNpbXBsZSApIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCBkaXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAoIG5vZGUgPSBub2RlWyBkaXIgXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8ICggbm9kZVsgZXhwYW5kbyBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdCggb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0XHRjYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0ZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdO1xuXHRcdFx0XHRcdFx0XHRub2RlID0gbm9kZUluZGV4ICYmIHBhcmVudC5jaGlsZE5vZGVzWyBub2RlSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHR3aGlsZSAoICggbm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEZhbGxiYWNrIHRvIHNlZWtpbmcgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0KCBkaWZmID0gbm9kZUluZGV4ID0gMCApIHx8IHN0YXJ0LnBvcCgpICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBXaGVuIGZvdW5kLCBjYWNoZSBpbmRleGVzIG9uIGBwYXJlbnRgIGFuZCBicmVha1xuXHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiArK2RpZmYgJiYgbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAoIG5vZGVbIGV4cGFuZG8gXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdCggb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdFx0ZGlmZiA9IG5vZGVJbmRleDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIHhtbCA6bnRoLWNoaWxkKC4uLilcblx0XHRcdFx0XHRcdFx0Ly8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKVxuXHRcdFx0XHRcdFx0XHRpZiAoIGRpZmYgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoICggbm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdCggZGlmZiA9IG5vZGVJbmRleCA9IDAgKSB8fCBzdGFydC5wb3AoKSApICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoICggb2ZUeXBlID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsrZGlmZiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFjaCBlbmNvdW50ZXJlZCBlbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KCBub2RlWyBleHBhbmRvIF0gPSB7fSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQoIG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybiBkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7XG5cblx0XHRcdC8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZVxuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3Nlc1xuXHRcdFx0Ly8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnNcblx0XHRcdC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3Ncblx0XHRcdHZhciBhcmdzLFxuXHRcdFx0XHRmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIHBzZXVkbzogXCIgKyBwc2V1ZG8gKTtcblxuXHRcdFx0Ly8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdFxuXHRcdFx0Ly8gYXJndW1lbnRzIGFyZSBuZWVkZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb25cblx0XHRcdC8vIGp1c3QgYXMgU2l6emxlIGRvZXNcblx0XHRcdGlmICggZm5bIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0cmV0dXJuIGZuKCBhcmd1bWVudCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXNcblx0XHRcdGlmICggZm4ubGVuZ3RoID4gMSApIHtcblx0XHRcdFx0YXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sIFwiXCIsIGFyZ3VtZW50IF07XG5cdFx0XHRcdHJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0XHRcdG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaWR4LFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksXG5cdFx0XHRcdFx0XHRcdGkgPSBtYXRjaGVkLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkWyBpIF0gKTtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbIGkgXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0gKSA6XG5cdFx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm47XG5cdFx0fVxuXHR9LFxuXG5cdHBzZXVkb3M6IHtcblxuXHRcdC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvc1xuXHRcdFwibm90XCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXG5cdFx0XHQvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZVxuXHRcdFx0Ly8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmdcblx0XHRcdC8vIHNwYWNlcyBhcyBjb21iaW5hdG9yc1xuXHRcdFx0dmFyIGlucHV0ID0gW10sXG5cdFx0XHRcdHJlc3VsdHMgPSBbXSxcblx0XHRcdFx0bWF0Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSApO1xuXG5cdFx0XHRyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID9cblx0XHRcdFx0bWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgX2NvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0XHRcdHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSxcblx0XHRcdFx0XHRcdGkgPSBzZWVkLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmBcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKCBlbGVtID0gdW5tYXRjaGVkWyBpIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaSBdID0gISggbWF0Y2hlc1sgaSBdID0gZWxlbSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApIDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIF9jb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0aW5wdXRbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0bWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApO1xuXG5cdFx0XHRcdFx0Ly8gRG9uJ3Qga2VlcCB0aGUgZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdFx0XHRpbnB1dFsgMCBdID0gbnVsbDtcblx0XHRcdFx0XHRyZXR1cm4gIXJlc3VsdHMucG9wKCk7XG5cdFx0XHRcdH07XG5cdFx0fSApLFxuXG5cdFx0XCJoYXNcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDtcblx0XHRcdH07XG5cdFx0fSApLFxuXG5cdFx0XCJjb250YWluc1wiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTtcblx0XHRcdH07XG5cdFx0fSApLFxuXG5cdFx0Ly8gXCJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yXG5cdFx0Ly8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWVcblx0XHQvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLFxuXHRcdC8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgXCItXCIuXG5cdFx0Ly8gVGhlIG1hdGNoaW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1lZCBjYXNlLWluc2Vuc2l0aXZlbHkuXG5cdFx0Ly8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS5cIlxuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG9cblx0XHRcImxhbmdcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHtcblxuXHRcdFx0Ly8gbGFuZyB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllclxuXHRcdFx0aWYgKCAhcmlkZW50aWZpZXIudGVzdCggbGFuZyB8fCBcIlwiICkgKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoIGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0XHRcdFx0ZWxlbS5sYW5nIDpcblx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKCBcInhtbDpsYW5nXCIgKSB8fCBlbGVtLmdldEF0dHJpYnV0ZSggXCJsYW5nXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKCBlbGVtID0gZWxlbS5wYXJlbnROb2RlICkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0gKSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHRcInRhcmdldFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdFx0cmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkO1xuXHRcdH0sXG5cblx0XHRcInJvb3RcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTtcblx0XHR9LFxuXG5cdFx0XCJmb2N1c1wiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmXG5cdFx0XHRcdCggIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkgKSAmJlxuXHRcdFx0XHQhISggZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCApO1xuXHRcdH0sXG5cblx0XHQvLyBCb29sZWFuIHByb3BlcnRpZXNcblx0XHRcImVuYWJsZWRcIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksXG5cdFx0XCJkaXNhYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggdHJ1ZSApLFxuXG5cdFx0XCJjaGVja2VkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaGVja2VkXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmICEhZWxlbS5jaGVja2VkICkgfHxcblx0XHRcdFx0KCBub2RlTmFtZSA9PT0gXCJvcHRpb25cIiAmJiAhIWVsZW0uc2VsZWN0ZWQgKTtcblx0XHR9LFxuXG5cdFx0XCJzZWxlY3RlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0Ly8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdFxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtZXhwcmVzc2lvbnNcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlO1xuXHRcdH0sXG5cblx0XHQvLyBDb250ZW50c1xuXHRcdFwiZW1wdHlcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvXG5cdFx0XHQvLyA6ZW1wdHkgaXMgbmVnYXRlZCBieSBlbGVtZW50ICgxKSBvciBjb250ZW50IG5vZGVzICh0ZXh0OiAzOyBjZGF0YTogNDsgZW50aXR5IHJlZjogNSksXG5cdFx0XHQvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKVxuXHRcdFx0Ly8gbm9kZVR5cGUgPCA2IHdvcmtzIGJlY2F1c2UgYXR0cmlidXRlcyAoMikgZG8gbm90IGFwcGVhciBhcyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0XCJwYXJlbnRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gIUV4cHIucHNldWRvc1sgXCJlbXB0eVwiIF0oIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdFwiaGVhZGVyXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImlucHV0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImJ1dHRvblwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXG5cdFx0XCJ0ZXh0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiZcblx0XHRcdFx0ZWxlbS50eXBlID09PSBcInRleHRcIiAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDhcblx0XHRcdFx0Ly8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sIFwic2VhcmNoXCIpIGFwcGVhciB3aXRoIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0KCAoIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSggXCJ0eXBlXCIgKSApID09IG51bGwgfHxcblx0XHRcdFx0XHRhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiICk7XG5cdFx0fSxcblxuXHRcdC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb25cblx0XHRcImZpcnN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFsgMCBdO1xuXHRcdH0gKSxcblxuXHRcdFwibGFzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggX21hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIFsgbGVuZ3RoIC0gMSBdO1xuXHRcdH0gKSxcblxuXHRcdFwiZXFcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIF9tYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHRyZXR1cm4gWyBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50IF07XG5cdFx0fSApLFxuXG5cdFx0XCJldmVuXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oIGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9ICksXG5cblx0XHRcIm9kZFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDE7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApLFxuXG5cdFx0XCJsdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgP1xuXHRcdFx0XHRhcmd1bWVudCArIGxlbmd0aCA6XG5cdFx0XHRcdGFyZ3VtZW50ID4gbGVuZ3RoID9cblx0XHRcdFx0XHRsZW5ndGggOlxuXHRcdFx0XHRcdGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyAtLWkgPj0gMDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0gKSxcblxuXHRcdFwiZ3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSApXG5cdH1cbn07XG5cbkV4cHIucHNldWRvc1sgXCJudGhcIiBdID0gRXhwci5wc2V1ZG9zWyBcImVxXCIgXTtcblxuLy8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBlIHBzZXVkb3NcbmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUlucHV0UHNldWRvKCBpICk7XG59XG5mb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCByZXNldDogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApO1xufVxuXG4vLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnNcbmZ1bmN0aW9uIHNldEZpbHRlcnMoKSB7fVxuc2V0RmlsdGVycy5wcm90b3R5cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7XG5FeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpO1xuXG50b2tlbml6ZSA9IFNpenpsZS50b2tlbml6ZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkge1xuXHR2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSxcblx0XHRzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLFxuXHRcdGNhY2hlZCA9IHRva2VuQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoIGNhY2hlZCApIHtcblx0XHRyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApO1xuXHR9XG5cblx0c29GYXIgPSBzZWxlY3Rvcjtcblx0Z3JvdXBzID0gW107XG5cdHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjtcblxuXHR3aGlsZSAoIHNvRmFyICkge1xuXG5cdFx0Ly8gQ29tbWEgYW5kIGZpcnN0IHJ1blxuXHRcdGlmICggIW1hdGNoZWQgfHwgKCBtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApICkgKSB7XG5cdFx0XHRpZiAoIG1hdGNoICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWyAwIF0ubGVuZ3RoICkgfHwgc29GYXI7XG5cdFx0XHR9XG5cdFx0XHRncm91cHMucHVzaCggKCB0b2tlbnMgPSBbXSApICk7XG5cdFx0fVxuXG5cdFx0bWF0Y2hlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ29tYmluYXRvcnNcblx0XHRpZiAoICggbWF0Y2ggPSByY29tYmluYXRvcnMuZXhlYyggc29GYXIgKSApICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCgge1xuXHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbIDAgXS5yZXBsYWNlKCBydHJpbSwgXCIgXCIgKVxuXHRcdFx0fSApO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKCBtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkgKSAmJiAoICFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KCBtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSApICkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCgge1xuXHRcdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdFx0bWF0Y2hlczogbWF0Y2hcblx0XHRcdFx0fSApO1xuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggIW1hdGNoZWQgKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3Ncblx0Ly8gaWYgd2UncmUganVzdCBwYXJzaW5nXG5cdC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vuc1xuXHRyZXR1cm4gcGFyc2VPbmx5ID9cblx0XHRzb0Zhci5sZW5ndGggOlxuXHRcdHNvRmFyID9cblx0XHRcdFNpenpsZS5lcnJvciggc2VsZWN0b3IgKSA6XG5cblx0XHRcdC8vIENhY2hlIHRoZSB0b2tlbnNcblx0XHRcdHRva2VuQ2FjaGUoIHNlbGVjdG9yLCBncm91cHMgKS5zbGljZSggMCApO1xufTtcblxuZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRzZWxlY3RvciA9IFwiXCI7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdHNlbGVjdG9yICs9IHRva2Vuc1sgaSBdLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdHNraXAgPSBjb21iaW5hdG9yLm5leHQsXG5cdFx0a2V5ID0gc2tpcCB8fCBkaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYga2V5ID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cblx0XHQvLyBDaGVjayBhZ2FpbnN0IGNsb3Nlc3QgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRcblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IDpcblxuXHRcdC8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50c1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgb2xkQ2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLFxuXHRcdFx0XHRuZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTtcblxuXHRcdFx0Ly8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gY29tYmluYXRvciBjYWNoaW5nXG5cdFx0XHRpZiAoIHhtbCApIHtcblx0XHRcdFx0d2hpbGUgKCAoIGVsZW0gPSBlbGVtWyBkaXIgXSApICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxIHx8IGNoZWNrTm9uRWxlbWVudHMgKSB7XG5cdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gZWxlbVsgZXhwYW5kbyBdIHx8ICggZWxlbVsgZXhwYW5kbyBdID0ge30gKTtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIGVsZW0udW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHQoIG91dGVyQ2FjaGVbIGVsZW0udW5pcXVlSUQgXSA9IHt9ICk7XG5cblx0XHRcdFx0XHRcdGlmICggc2tpcCAmJiBza2lwID09PSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdGVsZW0gPSBlbGVtWyBkaXIgXSB8fCBlbGVtO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggKCBvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSApICYmXG5cdFx0XHRcdFx0XHRcdG9sZENhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgb2xkQ2FjaGVbIDEgXSA9PT0gZG9uZU5hbWUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQXNzaWduIHRvIG5ld0NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0cmV0dXJuICggbmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0gKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsga2V5IF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAoIG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcbn1cblxuZnVuY3Rpb24gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICkge1xuXHRyZXR1cm4gbWF0Y2hlcnMubGVuZ3RoID4gMSA/XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBpID0gbWF0Y2hlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggIW1hdGNoZXJzWyBpIF0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSA6XG5cdFx0bWF0Y2hlcnNbIDAgXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1sgaSBdLCByZXN1bHRzICk7XG5cdH1cblx0cmV0dXJuIHJlc3VsdHM7XG59XG5cbmZ1bmN0aW9uIGNvbmRlbnNlKCB1bm1hdGNoZWQsIG1hcCwgZmlsdGVyLCBjb250ZXh0LCB4bWwgKSB7XG5cdHZhciBlbGVtLFxuXHRcdG5ld1VubWF0Y2hlZCA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGxlbiA9IHVubWF0Y2hlZC5sZW5ndGgsXG5cdFx0bWFwcGVkID0gbWFwICE9IG51bGw7XG5cblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0aWYgKCAoIGVsZW0gPSB1bm1hdGNoZWRbIGkgXSApICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBzZWVkLCByZXN1bHRzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0dmFyIHRlbXAsIGksIGVsZW0sXG5cdFx0XHRwcmVNYXAgPSBbXSxcblx0XHRcdHBvc3RNYXAgPSBbXSxcblx0XHRcdHByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsXG5cblx0XHRcdC8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0XG5cdFx0XHRlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyhcblx0XHRcdFx0c2VsZWN0b3IgfHwgXCIqXCIsXG5cdFx0XHRcdGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsXG5cdFx0XHRcdFtdXG5cdFx0XHQpLFxuXG5cdFx0XHQvLyBQcmVmaWx0ZXIgdG8gZ2V0IG1hdGNoZXIgaW5wdXQsIHByZXNlcnZpbmcgYSBtYXAgZm9yIHNlZWQtcmVzdWx0cyBzeW5jaHJvbml6YXRpb25cblx0XHRcdG1hdGNoZXJJbiA9IHByZUZpbHRlciAmJiAoIHNlZWQgfHwgIXNlbGVjdG9yICkgP1xuXHRcdFx0XHRjb25kZW5zZSggZWxlbXMsIHByZU1hcCwgcHJlRmlsdGVyLCBjb250ZXh0LCB4bWwgKSA6XG5cdFx0XHRcdGVsZW1zLFxuXG5cdFx0XHRtYXRjaGVyT3V0ID0gbWF0Y2hlciA/XG5cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cyxcblx0XHRcdFx0cG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgP1xuXG5cdFx0XHRcdFx0Ly8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0W10gOlxuXG5cdFx0XHRcdFx0Ly8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5XG5cdFx0XHRcdFx0cmVzdWx0cyA6XG5cdFx0XHRcdG1hdGNoZXJJbjtcblxuXHRcdC8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzXG5cdFx0aWYgKCBtYXRjaGVyICkge1xuXHRcdFx0bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwb3N0RmlsdGVyXG5cdFx0aWYgKCBwb3N0RmlsdGVyICkge1xuXHRcdFx0dGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7XG5cdFx0XHRwb3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7XG5cblx0XHRcdC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW5cblx0XHRcdGkgPSB0ZW1wLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICggZWxlbSA9IHRlbXBbIGkgXSApICkge1xuXHRcdFx0XHRcdG1hdGNoZXJPdXRbIHBvc3RNYXBbIGkgXSBdID0gISggbWF0Y2hlckluWyBwb3N0TWFwWyBpIF0gXSA9IGVsZW0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggc2VlZCApIHtcblx0XHRcdGlmICggcG9zdEZpbmRlciB8fCBwcmVGaWx0ZXIgKSB7XG5cdFx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblxuXHRcdFx0XHRcdC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0c1xuXHRcdFx0XHRcdHRlbXAgPSBbXTtcblx0XHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZWxlbSA9IG1hdGNoZXJPdXRbIGkgXSApICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMgbm90IHlldCBhIGZpbmFsIG1hdGNoXG5cdFx0XHRcdFx0XHRcdHRlbXAucHVzaCggKCBtYXRjaGVySW5bIGkgXSA9IGVsZW0gKSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCAoIG1hdGNoZXJPdXQgPSBbXSApLCB0ZW1wLCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkXG5cdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0aWYgKCAoIGVsZW0gPSBtYXRjaGVyT3V0WyBpIF0gKSAmJlxuXHRcdFx0XHRcdFx0KCB0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFsgaSBdICkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFsgdGVtcCBdID0gISggcmVzdWx0c1sgdGVtcCBdID0gZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHtcblx0dmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaixcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdGxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1sgMCBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbIFwiIFwiIF0sXG5cdFx0aSA9IGxlYWRpbmdSZWxhdGl2ZSA/IDEgOiAwLFxuXG5cdFx0Ly8gVGhlIGZvdW5kYXRpb25hbCBtYXRjaGVyIGVuc3VyZXMgdGhhdCBlbGVtZW50cyBhcmUgcmVhY2hhYmxlIGZyb20gdG9wLWxldmVsIGNvbnRleHQocylcblx0XHRtYXRjaENvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBjaGVja0NvbnRleHQ7XG5cdFx0fSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLFxuXHRcdG1hdGNoQW55Q29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YoIGNoZWNrQ29udGV4dCwgZWxlbSApID4gLTE7XG5cdFx0fSwgaW1wbGljaXRSZWxhdGl2ZSwgdHJ1ZSApLFxuXHRcdG1hdGNoZXJzID0gWyBmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIHJldCA9ICggIWxlYWRpbmdSZWxhdGl2ZSAmJiAoIHhtbCB8fCBjb250ZXh0ICE9PSBvdXRlcm1vc3RDb250ZXh0ICkgKSB8fCAoXG5cdFx0XHRcdCggY2hlY2tDb250ZXh0ID0gY29udGV4dCApLm5vZGVUeXBlID9cblx0XHRcdFx0XHRtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0XHRtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7XG5cblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKCBtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyBpIF0udHlwZSBdICkgKSB7XG5cdFx0XHRtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvciggZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksIG1hdGNoZXIgKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1sgaSBdLnR5cGUgXS5hcHBseSggbnVsbCwgdG9rZW5zWyBpIF0ubWF0Y2hlcyApO1xuXG5cdFx0XHQvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlclxuXHRcdFx0aWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zWyBqIF0udHlwZSBdICkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBzZXRNYXRjaGVyKFxuXHRcdFx0XHRcdGkgPiAxICYmIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLFxuXHRcdFx0XHRcdGkgPiAxICYmIHRvU2VsZWN0b3IoXG5cblx0XHRcdFx0XHQvLyBJZiB0aGUgcHJlY2VkaW5nIHRva2VuIHdhcyBhIGRlc2NlbmRhbnQgY29tYmluYXRvciwgaW5zZXJ0IGFuIGltcGxpY2l0IGFueS1lbGVtZW50IGAqYFxuXHRcdFx0XHRcdHRva2Vuc1xuXHRcdFx0XHRcdFx0LnNsaWNlKCAwLCBpIC0gMSApXG5cdFx0XHRcdFx0XHQuY29uY2F0KCB7IHZhbHVlOiB0b2tlbnNbIGkgLSAyIF0udHlwZSA9PT0gXCIgXCIgPyBcIipcIiA6IFwiXCIgfSApXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAoIHRva2VucyA9IHRva2Vucy5zbGljZSggaiApICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIHRvU2VsZWN0b3IoIHRva2VucyApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRtYXRjaGVycy5wdXNoKCBtYXRjaGVyICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKSB7XG5cdHZhciBieVNldCA9IHNldE1hdGNoZXJzLmxlbmd0aCA+IDAsXG5cdFx0YnlFbGVtZW50ID0gZWxlbWVudE1hdGNoZXJzLmxlbmd0aCA+IDAsXG5cdFx0c3VwZXJNYXRjaGVyID0gZnVuY3Rpb24oIHNlZWQsIGNvbnRleHQsIHhtbCwgcmVzdWx0cywgb3V0ZXJtb3N0ICkge1xuXHRcdFx0dmFyIGVsZW0sIGosIG1hdGNoZXIsXG5cdFx0XHRcdG1hdGNoZWRDb3VudCA9IDAsXG5cdFx0XHRcdGkgPSBcIjBcIixcblx0XHRcdFx0dW5tYXRjaGVkID0gc2VlZCAmJiBbXSxcblx0XHRcdFx0c2V0TWF0Y2hlZCA9IFtdLFxuXHRcdFx0XHRjb250ZXh0QmFja3VwID0gb3V0ZXJtb3N0Q29udGV4dCxcblxuXHRcdFx0XHQvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0XG5cdFx0XHRcdGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kWyBcIlRBR1wiIF0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblxuXHRcdFx0XHQvLyBVc2UgaW50ZWdlciBkaXJydW5zIGlmZiB0aGlzIGlzIHRoZSBvdXRlcm1vc3QgbWF0Y2hlclxuXHRcdFx0XHRkaXJydW5zVW5pcXVlID0gKCBkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSApLFxuXHRcdFx0XHRsZW4gPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDExKywgRWRnZSAxNyAtIDE4K1xuXHRcdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdFx0Ly8gdHdvIGRvY3VtZW50czsgc2hhbGxvdyBjb21wYXJpc29ucyB3b3JrLlxuXHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZXFlcWVxXG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09IGRvY3VtZW50IHx8IGNvbnRleHQgfHwgb3V0ZXJtb3N0O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgZWxlbWVudHMgcGFzc2luZyBlbGVtZW50TWF0Y2hlcnMgZGlyZWN0bHkgdG8gcmVzdWx0c1xuXHRcdFx0Ly8gU3VwcG9ydDogSUU8OSwgU2FmYXJpXG5cdFx0XHQvLyBUb2xlcmF0ZSBOb2RlTGlzdCBwcm9wZXJ0aWVzIChJRTogXCJsZW5ndGhcIjsgU2FmYXJpOiA8bnVtYmVyPikgbWF0Y2hpbmcgZWxlbWVudHMgYnkgaWRcblx0XHRcdGZvciAoIDsgaSAhPT0gbGVuICYmICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSssIEVkZ2UgMTcgLSAxOCtcblx0XHRcdFx0XHQvLyBJRS9FZGdlIHNvbWV0aW1lcyB0aHJvdyBhIFwiUGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvciB3aGVuIHN0cmljdC1jb21wYXJpbmdcblx0XHRcdFx0XHQvLyB0d28gZG9jdW1lbnRzOyBzaGFsbG93IGNvbXBhcmlzb25zIHdvcmsuXG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGVxZXFlcVxuXHRcdFx0XHRcdGlmICggIWNvbnRleHQgJiYgZWxlbS5vd25lckRvY3VtZW50ICE9IGRvY3VtZW50ICkge1xuXHRcdFx0XHRcdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0XHRcdFx0XHRcdHhtbCA9ICFkb2N1bWVudElzSFRNTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKCAoIG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hlcnNbIGorKyBdICkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQgfHwgZG9jdW1lbnQsIHhtbCApICkge1xuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRcdFx0ZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gVHJhY2sgdW5tYXRjaGVkIGVsZW1lbnRzIGZvciBzZXQgZmlsdGVyc1xuXHRcdFx0XHRpZiAoIGJ5U2V0ICkge1xuXG5cdFx0XHRcdFx0Ly8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVyc1xuXHRcdFx0XHRcdGlmICggKCBlbGVtID0gIW1hdGNoZXIgJiYgZWxlbSApICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGBpYCBpcyBub3cgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHZpc2l0ZWQgYWJvdmUsIGFuZCBhZGRpbmcgaXQgdG8gYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIG1ha2VzIHRoZSBsYXR0ZXIgbm9ubmVnYXRpdmUuXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBlcXVhbHMgYGlgKSwgdW5sZXNzIHdlIGRpZG4ndCB2aXNpdCBfYW55XyBlbGVtZW50cyBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhhdmVcblx0XHRcdC8vIG5vIGVsZW1lbnQgbWF0Y2hlcnMgYW5kIG5vIHNlZWQuXG5cdFx0XHQvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyBcIjBcIiBgaWAgYWxsb3dzIGBpYCB0byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0XG5cdFx0XHQvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIFwiMDBcIiBgbWF0Y2hlZENvdW50YCB0aGF0IGRpZmZlcnMgZnJvbSBgaWAgYnV0IGlzIGFsc29cblx0XHRcdC8vIG51bWVyaWNhbGx5IHplcm8uXG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKCBtYXRjaGVyID0gc2V0TWF0Y2hlcnNbIGorKyBdICkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggc2VlZCApIHtcblxuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKCB1bm1hdGNoZWRbIGkgXSB8fCBzZXRNYXRjaGVkWyBpIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkWyBpIF0gPSBwb3AuY2FsbCggcmVzdWx0cyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRGlzY2FyZCBpbmRleCBwbGFjZWhvbGRlciB2YWx1ZXMgdG8gZ2V0IG9ubHkgYWN0dWFsIG1hdGNoZXNcblx0XHRcdFx0XHRzZXRNYXRjaGVkID0gY29uZGVuc2UoIHNldE1hdGNoZWQgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFkZCBtYXRjaGVzIHRvIHJlc3VsdHNcblx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgc2V0TWF0Y2hlZCApO1xuXG5cdFx0XHRcdC8vIFNlZWRsZXNzIHNldCBtYXRjaGVzIHN1Y2NlZWRpbmcgbXVsdGlwbGUgc3VjY2Vzc2Z1bCBtYXRjaGVycyBzdGlwdWxhdGUgc29ydGluZ1xuXHRcdFx0XHRpZiAoIG91dGVybW9zdCAmJiAhc2VlZCAmJiBzZXRNYXRjaGVkLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0XHQoIG1hdGNoZWRDb3VudCArIHNldE1hdGNoZXJzLmxlbmd0aCApID4gMSApIHtcblxuXHRcdFx0XHRcdFNpenpsZS51bmlxdWVTb3J0KCByZXN1bHRzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gT3ZlcnJpZGUgbWFuaXB1bGF0aW9uIG9mIGdsb2JhbHMgYnkgbmVzdGVkIG1hdGNoZXJzXG5cdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0ZGlycnVucyA9IGRpcnJ1bnNVbmlxdWU7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0QmFja3VwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5tYXRjaGVkO1xuXHRcdH07XG5cblx0cmV0dXJuIGJ5U2V0ID9cblx0XHRtYXJrRnVuY3Rpb24oIHN1cGVyTWF0Y2hlciApIDpcblx0XHRzdXBlck1hdGNoZXI7XG59XG5cbmNvbXBpbGUgPSBTaXp6bGUuY29tcGlsZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgbWF0Y2ggLyogSW50ZXJuYWwgVXNlIE9ubHkgKi8gKSB7XG5cdHZhciBpLFxuXHRcdHNldE1hdGNoZXJzID0gW10sXG5cdFx0ZWxlbWVudE1hdGNoZXJzID0gW10sXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggIWNhY2hlZCApIHtcblxuXHRcdC8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudFxuXHRcdGlmICggIW1hdGNoICkge1xuXHRcdFx0bWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHR9XG5cdFx0aSA9IG1hdGNoLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGNhY2hlZCA9IG1hdGNoZXJGcm9tVG9rZW5zKCBtYXRjaFsgaSBdICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKFxuXHRcdFx0c2VsZWN0b3IsXG5cdFx0XHRtYXRjaGVyRnJvbUdyb3VwTWF0Y2hlcnMoIGVsZW1lbnRNYXRjaGVycywgc2V0TWF0Y2hlcnMgKVxuXHRcdCk7XG5cblx0XHQvLyBTYXZlIHNlbGVjdG9yIGFuZCB0b2tlbml6YXRpb25cblx0XHRjYWNoZWQuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0fVxuXHRyZXR1cm4gY2FjaGVkO1xufTtcblxuLyoqXG4gKiBBIGxvdy1sZXZlbCBzZWxlY3Rpb24gZnVuY3Rpb24gdGhhdCB3b3JrcyB3aXRoIFNpenpsZSdzIGNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uIGJ1aWx0IHdpdGggU2l6emxlLmNvbXBpbGVcbiAqIEBwYXJhbSB7RWxlbWVudH0gY29udGV4dFxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdXG4gKiBAcGFyYW0ge0FycmF5fSBbc2VlZF0gQSBzZXQgb2YgZWxlbWVudHMgdG8gbWF0Y2ggYWdhaW5zdFxuICovXG5zZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkge1xuXHR2YXIgaSwgdG9rZW5zLCB0b2tlbiwgdHlwZSwgZmluZCxcblx0XHRjb21waWxlZCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICYmIHNlbGVjdG9yLFxuXHRcdG1hdGNoID0gIXNlZWQgJiYgdG9rZW5pemUoICggc2VsZWN0b3IgPSBjb21waWxlZC5zZWxlY3RvciB8fCBzZWxlY3RvciApICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbIDAgXSA9IG1hdGNoWyAwIF0uc2xpY2UoIDAgKTtcblx0XHRpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICggdG9rZW4gPSB0b2tlbnNbIDAgXSApLnR5cGUgPT09IFwiSURcIiAmJlxuXHRcdFx0Y29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbIDEgXS50eXBlIF0gKSB7XG5cblx0XHRcdGNvbnRleHQgPSAoIEV4cHIuZmluZFsgXCJJRFwiIF0oIHRva2VuLm1hdGNoZXNbIDAgXVxuXHRcdFx0XHQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSwgY29udGV4dCApIHx8IFtdIClbIDAgXTtcblx0XHRcdGlmICggIWNvbnRleHQgKSB7XG5cdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHQvLyBQcmVjb21waWxlZCBtYXRjaGVycyB3aWxsIHN0aWxsIHZlcmlmeSBhbmNlc3RyeSwgc28gc3RlcCB1cCBhIGxldmVsXG5cdFx0XHR9IGVsc2UgaWYgKCBjb21waWxlZCApIHtcblx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQucGFyZW50Tm9kZTtcblx0XHRcdH1cblxuXHRcdFx0c2VsZWN0b3IgPSBzZWxlY3Rvci5zbGljZSggdG9rZW5zLnNoaWZ0KCkudmFsdWUubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmV0Y2ggYSBzZWVkIHNldCBmb3IgcmlnaHQtdG8tbGVmdCBtYXRjaGluZ1xuXHRcdGkgPSBtYXRjaEV4cHJbIFwibmVlZHNDb250ZXh0XCIgXS50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0b2tlbiA9IHRva2Vuc1sgaSBdO1xuXG5cdFx0XHQvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbICggdHlwZSA9IHRva2VuLnR5cGUgKSBdICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggKCBmaW5kID0gRXhwci5maW5kWyB0eXBlIF0gKSApIHtcblxuXHRcdFx0XHQvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnNcblx0XHRcdFx0aWYgKCAoIHNlZWQgPSBmaW5kKFxuXHRcdFx0XHRcdHRva2VuLm1hdGNoZXNbIDAgXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRcdHJzaWJsaW5nLnRlc3QoIHRva2Vuc1sgMCBdLnR5cGUgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHxcblx0XHRcdFx0XHRcdGNvbnRleHRcblx0XHRcdFx0KSApICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5XG5cdFx0XHRcdFx0dG9rZW5zLnNwbGljZSggaSwgMSApO1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7XG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuXHQvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlXG5cdCggY29tcGlsZWQgfHwgY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkgKShcblx0XHRzZWVkLFxuXHRcdGNvbnRleHQsXG5cdFx0IWRvY3VtZW50SXNIVE1MLFxuXHRcdHJlc3VsdHMsXG5cdFx0IWNvbnRleHQgfHwgcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHQpO1xuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIE9uZS10aW1lIGFzc2lnbm1lbnRzXG5cbi8vIFNvcnQgc3RhYmlsaXR5XG5zdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0KCBcIlwiICkuc29ydCggc29ydE9yZGVyICkuam9pbiggXCJcIiApID09PSBleHBhbmRvO1xuXG4vLyBTdXBwb3J0OiBDaHJvbWUgMTQtMzUrXG4vLyBBbHdheXMgYXNzdW1lIGR1cGxpY2F0ZXMgaWYgdGhleSBhcmVuJ3QgcGFzc2VkIHRvIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uXG5zdXBwb3J0LmRldGVjdER1cGxpY2F0ZXMgPSAhIWhhc0R1cGxpY2F0ZTtcblxuLy8gSW5pdGlhbGl6ZSBhZ2FpbnN0IHRoZSBkZWZhdWx0IGRvY3VtZW50XG5zZXREb2N1bWVudCgpO1xuXG4vLyBTdXBwb3J0OiBXZWJraXQ8NTM3LjMyIC0gU2FmYXJpIDYuMC4zL0Nocm9tZSAyNSAoZml4ZWQgaW4gQ2hyb21lIDI3KVxuLy8gRGV0YWNoZWQgbm9kZXMgY29uZm91bmRpbmdseSBmb2xsb3cgKmVhY2ggb3RoZXIqXG5zdXBwb3J0LnNvcnREZXRhY2hlZCA9IGFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXG5cdC8vIFNob3VsZCByZXR1cm4gMSwgYnV0IHJldHVybnMgNCAoZm9sbG93aW5nKVxuXHRyZXR1cm4gZWwuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZmllbGRzZXRcIiApICkgJiAxO1xufSApO1xuXG4vLyBTdXBwb3J0OiBJRTw4XG4vLyBQcmV2ZW50IGF0dHJpYnV0ZS9wcm9wZXJ0eSBcImludGVycG9sYXRpb25cIlxuLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUyOFZTLjg1JTI5LmFzcHhcbmlmICggIWFzc2VydCggZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JyMnPjwvYT5cIjtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcImhyZWZcIiApID09PSBcIiNcIjtcbn0gKSApIHtcblx0YWRkSGFuZGxlKCBcInR5cGV8aHJlZnxoZWlnaHR8d2lkdGhcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwidHlwZVwiID8gMSA6IDIgKTtcblx0XHR9XG5cdH0gKTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0ZWwuaW5uZXJIVE1MID0gXCI8aW5wdXQvPlwiO1xuXHRlbC5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiLCBcIlwiICk7XG5cdHJldHVybiBlbC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IFwiXCI7XG59ICkgKSB7XG5cdGFkZEhhbmRsZSggXCJ2YWx1ZVwiLCBmdW5jdGlvbiggZWxlbSwgX25hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSApO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZ2V0QXR0cmlidXRlTm9kZSB0byBmZXRjaCBib29sZWFucyB3aGVuIGdldEF0dHJpYnV0ZSBsaWVzXG5pZiAoICFhc3NlcnQoIGZ1bmN0aW9uKCBlbCApIHtcblx0cmV0dXJuIGVsLmdldEF0dHJpYnV0ZSggXCJkaXNhYmxlZFwiICkgPT0gbnVsbDtcbn0gKSApIHtcblx0YWRkSGFuZGxlKCBib29sZWFucywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciB2YWw7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgpIDpcblx0XHRcdFx0KCB2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKSApICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHRcdHZhbC52YWx1ZSA6XG5cdFx0XHRcdFx0bnVsbDtcblx0XHR9XG5cdH0gKTtcbn1cblxucmV0dXJuIFNpenpsZTtcblxufSApKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xuXG4vLyBEZXByZWNhdGVkXG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5qUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlO1xuXG5cblxuXG52YXIgZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XG5cdHZhciBtYXRjaGVkID0gW10sXG5cdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0dmFyIG1hdGNoZWQgPSBbXTtcblxuXHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0bWF0Y2hlZC5wdXNoKCBuICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG5cblxuZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7XG5cblx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbn1cbnZhciByc2luZ2xlVGFnID0gKCAvXjwoW2Etel1bXlxcL1xcMD46XFx4MjBcXHRcXHJcXG5cXGZdKilbXFx4MjBcXHRcXHJcXG5cXGZdKlxcLz8+KD86PFxcL1xcMT58KSQvaSApO1xuXG5cblxuLy8gSW1wbGVtZW50IHRoZSBpZGVudGljYWwgZnVuY3Rpb25hbGl0eSBmb3IgZmlsdGVyIGFuZCBub3RcbmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwgbm90ICkge1xuXHRpZiAoIGlzRnVuY3Rpb24oIHF1YWxpZmllciApICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIFNpbmdsZSBlbGVtZW50XG5cdGlmICggcXVhbGlmaWVyLm5vZGVUeXBlICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICggZWxlbSA9PT0gcXVhbGlmaWVyICkgIT09IG5vdDtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBBcnJheWxpa2Ugb2YgZWxlbWVudHMgKGpRdWVyeSwgYXJndW1lbnRzLCBBcnJheSlcblx0aWYgKCB0eXBlb2YgcXVhbGlmaWVyICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBGaWx0ZXJlZCBkaXJlY3RseSBmb3IgYm90aCBzaW1wbGUgYW5kIGNvbXBsZXggc2VsZWN0b3JzXG5cdHJldHVybiBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGVsZW1lbnRzLCBub3QgKTtcbn1cblxualF1ZXJ5LmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBlbGVtcywgbm90ICkge1xuXHR2YXIgZWxlbSA9IGVsZW1zWyAwIF07XG5cblx0aWYgKCBub3QgKSB7XG5cdFx0ZXhwciA9IFwiOm5vdChcIiArIGV4cHIgKyBcIilcIjtcblx0fVxuXG5cdGlmICggZWxlbXMubGVuZ3RoID09PSAxICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggZWxlbSwgZXhwciApID8gWyBlbGVtIF0gOiBbXTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnkuZmluZC5tYXRjaGVzKCBleHByLCBqUXVlcnkuZ3JlcCggZWxlbXMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxO1xuXHR9ICkgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBpLCByZXQsXG5cdFx0XHRsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdHNlbGYgPSB0aGlzO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSApICk7XG5cdFx0fVxuXG5cdFx0cmV0ID0gdGhpcy5wdXNoU3RhY2soIFtdICk7XG5cblx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0alF1ZXJ5LmZpbmQoIHNlbGVjdG9yLCBzZWxmWyBpIF0sIHJldCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBsZW4gPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIHJldCApIDogcmV0O1xuXHR9LFxuXHRmaWx0ZXI6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIGZhbHNlICkgKTtcblx0fSxcblx0bm90OiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCB0cnVlICkgKTtcblx0fSxcblx0aXM6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gISF3aW5ub3coXG5cdFx0XHR0aGlzLFxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgcG9zaXRpb25hbC9yZWxhdGl2ZSBzZWxlY3RvciwgY2hlY2sgbWVtYmVyc2hpcCBpbiB0aGUgcmV0dXJuZWQgc2V0XG5cdFx0XHQvLyBzbyAkKFwicDpmaXJzdFwiKS5pcyhcInA6bGFzdFwiKSB3b24ndCByZXR1cm4gdHJ1ZSBmb3IgYSBkb2Mgd2l0aCB0d28gXCJwXCIuXG5cdFx0XHR0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgJiYgcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApID9cblx0XHRcdFx0alF1ZXJ5KCBzZWxlY3RvciApIDpcblx0XHRcdFx0c2VsZWN0b3IgfHwgW10sXG5cdFx0XHRmYWxzZVxuXHRcdCkubGVuZ3RoO1xuXHR9XG59ICk7XG5cblxuLy8gSW5pdGlhbGl6ZSBhIGpRdWVyeSBvYmplY3RcblxuXG4vLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudClcbnZhciByb290alF1ZXJ5LFxuXG5cdC8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzXG5cdC8vIFByaW9yaXRpemUgI2lkIG92ZXIgPHRhZz4gdG8gYXZvaWQgWFNTIHZpYSBsb2NhdGlvbi5oYXNoICgjOTUyMSlcblx0Ly8gU3RyaWN0IEhUTUwgcmVjb2duaXRpb24gKCMxMTI5MDogbXVzdCBzdGFydCB3aXRoIDwpXG5cdC8vIFNob3J0Y3V0IHNpbXBsZSAjaWQgY2FzZSBmb3Igc3BlZWRcblx0cnF1aWNrRXhwciA9IC9eKD86XFxzKig8W1xcd1xcV10rPilbXj5dKnwjKFtcXHctXSspKSQvLFxuXG5cdGluaXQgPSBqUXVlcnkuZm4uaW5pdCA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCwgcm9vdCApIHtcblx0XHR2YXIgbWF0Y2gsIGVsZW07XG5cblx0XHQvLyBIQU5ETEU6ICQoXCJcIiksICQobnVsbCksICQodW5kZWZpbmVkKSwgJChmYWxzZSlcblx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblxuXHRcdC8vIE1ldGhvZCBpbml0KCkgYWNjZXB0cyBhbiBhbHRlcm5hdGUgcm9vdGpRdWVyeVxuXHRcdC8vIHNvIG1pZ3JhdGUgY2FuIHN1cHBvcnQgalF1ZXJ5LnN1YiAoZ2gtMjEwMSlcblx0XHRyb290ID0gcm9vdCB8fCByb290alF1ZXJ5O1xuXG5cdFx0Ly8gSGFuZGxlIEhUTUwgc3RyaW5nc1xuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0aWYgKCBzZWxlY3RvclsgMCBdID09PSBcIjxcIiAmJlxuXHRcdFx0XHRzZWxlY3Rvclsgc2VsZWN0b3IubGVuZ3RoIC0gMSBdID09PSBcIj5cIiAmJlxuXHRcdFx0XHRzZWxlY3Rvci5sZW5ndGggPj0gMyApIHtcblxuXHRcdFx0XHQvLyBBc3N1bWUgdGhhdCBzdHJpbmdzIHRoYXQgc3RhcnQgYW5kIGVuZCB3aXRoIDw+IGFyZSBIVE1MIGFuZCBza2lwIHRoZSByZWdleCBjaGVja1xuXHRcdFx0XHRtYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1hdGNoIGh0bWwgb3IgbWFrZSBzdXJlIG5vIGNvbnRleHQgaXMgc3BlY2lmaWVkIGZvciAjaWRcblx0XHRcdGlmICggbWF0Y2ggJiYgKCBtYXRjaFsgMSBdIHx8ICFjb250ZXh0ICkgKSB7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpXG5cdFx0XHRcdGlmICggbWF0Y2hbIDEgXSApIHtcblx0XHRcdFx0XHRjb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbIDAgXSA6IGNvbnRleHQ7XG5cblx0XHRcdFx0XHQvLyBPcHRpb24gdG8gcnVuIHNjcmlwdHMgaXMgdHJ1ZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0XHQvLyBJbnRlbnRpb25hbGx5IGxldCB0aGUgZXJyb3IgYmUgdGhyb3duIGlmIHBhcnNlSFRNTCBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcywgalF1ZXJ5LnBhcnNlSFRNTChcblx0XHRcdFx0XHRcdG1hdGNoWyAxIF0sXG5cdFx0XHRcdFx0XHRjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IGRvY3VtZW50LFxuXHRcdFx0XHRcdFx0dHJ1ZVxuXHRcdFx0XHRcdCkgKTtcblxuXHRcdFx0XHRcdC8vIEhBTkRMRTogJChodG1sLCBwcm9wcylcblx0XHRcdFx0XHRpZiAoIHJzaW5nbGVUYWcudGVzdCggbWF0Y2hbIDEgXSApICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCBtYXRjaCBpbiBjb250ZXh0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFByb3BlcnRpZXMgb2YgY29udGV4dCBhcmUgY2FsbGVkIGFzIG1ldGhvZHMgaWYgcG9zc2libGVcblx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXNcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmF0dHIoIG1hdGNoLCBjb250ZXh0WyBtYXRjaCBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoI2lkKVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbIDIgXSApO1xuXG5cdFx0XHRcdFx0aWYgKCBlbGVtICkge1xuXG5cdFx0XHRcdFx0XHQvLyBJbmplY3QgdGhlIGVsZW1lbnQgZGlyZWN0bHkgaW50byB0aGUgalF1ZXJ5IG9iamVjdFxuXHRcdFx0XHRcdFx0dGhpc1sgMCBdID0gZWxlbTtcblx0XHRcdFx0XHRcdHRoaXMubGVuZ3RoID0gMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsICQoLi4uKSlcblx0XHRcdH0gZWxzZSBpZiAoICFjb250ZXh0IHx8IGNvbnRleHQuanF1ZXJ5ICkge1xuXHRcdFx0XHRyZXR1cm4gKCBjb250ZXh0IHx8IHJvb3QgKS5maW5kKCBzZWxlY3RvciApO1xuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgY29udGV4dClcblx0XHRcdC8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0Ly8gSEFORExFOiAkKERPTUVsZW1lbnQpXG5cdFx0fSBlbHNlIGlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7XG5cdFx0XHR0aGlzWyAwIF0gPSBzZWxlY3Rvcjtcblx0XHRcdHRoaXMubGVuZ3RoID0gMTtcblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0Ly8gSEFORExFOiAkKGZ1bmN0aW9uKVxuXHRcdC8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeVxuXHRcdH0gZWxzZSBpZiAoIGlzRnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7XG5cdFx0XHRyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0cm9vdC5yZWFkeSggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSBpbW1lZGlhdGVseSBpZiByZWFkeSBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRzZWxlY3RvciggalF1ZXJ5ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yLCB0aGlzICk7XG5cdH07XG5cbi8vIEdpdmUgdGhlIGluaXQgZnVuY3Rpb24gdGhlIGpRdWVyeSBwcm90b3R5cGUgZm9yIGxhdGVyIGluc3RhbnRpYXRpb25cbmluaXQucHJvdG90eXBlID0galF1ZXJ5LmZuO1xuXG4vLyBJbml0aWFsaXplIGNlbnRyYWwgcmVmZXJlbmNlXG5yb290alF1ZXJ5ID0galF1ZXJ5KCBkb2N1bWVudCApO1xuXG5cbnZhciBycGFyZW50c3ByZXYgPSAvXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxcblxuXHQvLyBNZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldFxuXHRndWFyYW50ZWVkVW5pcXVlID0ge1xuXHRcdGNoaWxkcmVuOiB0cnVlLFxuXHRcdGNvbnRlbnRzOiB0cnVlLFxuXHRcdG5leHQ6IHRydWUsXG5cdFx0cHJldjogdHJ1ZVxuXHR9O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhhczogZnVuY3Rpb24oIHRhcmdldCApIHtcblx0XHR2YXIgdGFyZ2V0cyA9IGpRdWVyeSggdGFyZ2V0LCB0aGlzICksXG5cdFx0XHRsID0gdGFyZ2V0cy5sZW5ndGg7XG5cblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1sgaSBdICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0Y2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9ycywgY29udGV4dCApIHtcblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRtYXRjaGVkID0gW10sXG5cdFx0XHR0YXJnZXRzID0gdHlwZW9mIHNlbGVjdG9ycyAhPT0gXCJzdHJpbmdcIiAmJiBqUXVlcnkoIHNlbGVjdG9ycyApO1xuXG5cdFx0Ly8gUG9zaXRpb25hbCBzZWxlY3RvcnMgbmV2ZXIgbWF0Y2gsIHNpbmNlIHRoZXJlJ3Mgbm8gX3NlbGVjdGlvbl8gY29udGV4dFxuXHRcdGlmICggIXJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgKSB7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cblx0XHRcdFx0XHQvLyBBbHdheXMgc2tpcCBkb2N1bWVudCBmcmFnbWVudHNcblx0XHRcdFx0XHRpZiAoIGN1ci5ub2RlVHlwZSA8IDExICYmICggdGFyZ2V0cyA/XG5cdFx0XHRcdFx0XHR0YXJnZXRzLmluZGV4KCBjdXIgKSA+IC0xIDpcblxuXHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcGFzcyBub24tZWxlbWVudHMgdG8gU2l6emxlXG5cdFx0XHRcdFx0XHRjdXIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBjdXIsIHNlbGVjdG9ycyApICkgKSB7XG5cblx0XHRcdFx0XHRcdG1hdGNoZWQucHVzaCggY3VyICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQubGVuZ3RoID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICkgOiBtYXRjaGVkICk7XG5cdH0sXG5cblx0Ly8gRGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiBhbiBlbGVtZW50IHdpdGhpbiB0aGUgc2V0XG5cdGluZGV4OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIE5vIGFyZ3VtZW50LCByZXR1cm4gaW5kZXggaW4gcGFyZW50XG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybiAoIHRoaXNbIDAgXSAmJiB0aGlzWyAwIF0ucGFyZW50Tm9kZSApID8gdGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGggOiAtMTtcblx0XHR9XG5cblx0XHQvLyBJbmRleCBpbiBzZWxlY3RvclxuXHRcdGlmICggdHlwZW9mIGVsZW0gPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdGhpc1sgMCBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50XG5cdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggdGhpcyxcblxuXHRcdFx0Ly8gSWYgaXQgcmVjZWl2ZXMgYSBqUXVlcnkgb2JqZWN0LCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1c2VkXG5cdFx0XHRlbGVtLmpxdWVyeSA/IGVsZW1bIDAgXSA6IGVsZW1cblx0XHQpO1xuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayhcblx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMuZ2V0KCksIGpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSApXG5cdFx0XHQpXG5cdFx0KTtcblx0fSxcblxuXHRhZGRCYWNrOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID9cblx0XHRcdHRoaXMucHJldk9iamVjdCA6IHRoaXMucHJldk9iamVjdC5maWx0ZXIoIHNlbGVjdG9yIClcblx0XHQpO1xuXHR9XG59ICk7XG5cbmZ1bmN0aW9uIHNpYmxpbmcoIGN1ciwgZGlyICkge1xuXHR3aGlsZSAoICggY3VyID0gY3VyWyBkaXIgXSApICYmIGN1ci5ub2RlVHlwZSAhPT0gMSApIHt9XG5cdHJldHVybiBjdXI7XG59XG5cbmpRdWVyeS5lYWNoKCB7XG5cdHBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsO1xuXHR9LFxuXHRwYXJlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInBhcmVudE5vZGVcIiApO1xuXHR9LFxuXHRwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBfaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIsIHVudGlsICk7XG5cdH0sXG5cdG5leHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgX2ksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0cHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgX2ksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIsIHVudGlsICk7XG5cdH0sXG5cdHNpYmxpbmdzOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoICggZWxlbS5wYXJlbnROb2RlIHx8IHt9ICkuZmlyc3RDaGlsZCwgZWxlbSApO1xuXHR9LFxuXHRjaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCBlbGVtLmZpcnN0Q2hpbGQgKTtcblx0fSxcblx0Y29udGVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdGlmICggZWxlbS5jb250ZW50RG9jdW1lbnQgIT0gbnVsbCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSAxMStcblx0XHRcdC8vIDxvYmplY3Q+IGVsZW1lbnRzIHdpdGggbm8gYGRhdGFgIGF0dHJpYnV0ZSBoYXMgYW4gb2JqZWN0XG5cdFx0XHQvLyBgY29udGVudERvY3VtZW50YCB3aXRoIGEgYG51bGxgIHByb3RvdHlwZS5cblx0XHRcdGdldFByb3RvKCBlbGVtLmNvbnRlbnREb2N1bWVudCApICkge1xuXG5cdFx0XHRyZXR1cm4gZWxlbS5jb250ZW50RG9jdW1lbnQ7XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHksIGlPUyA3IG9ubHksIEFuZHJvaWQgQnJvd3NlciA8PTQuMyBvbmx5XG5cdFx0Ly8gVHJlYXQgdGhlIHRlbXBsYXRlIGVsZW1lbnQgYXMgYSByZWd1bGFyIG9uZSBpbiBicm93c2VycyB0aGF0XG5cdFx0Ly8gZG9uJ3Qgc3VwcG9ydCBpdC5cblx0XHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRlbXBsYXRlXCIgKSApIHtcblx0XHRcdGVsZW0gPSBlbGVtLmNvbnRlbnQgfHwgZWxlbTtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7XG5cdH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWwsIHNlbGVjdG9yICkge1xuXHRcdHZhciBtYXRjaGVkID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7XG5cblx0XHRpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09IFwiVW50aWxcIiApIHtcblx0XHRcdHNlbGVjdG9yID0gdW50aWw7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRtYXRjaGVkID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIG1hdGNoZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZXNcblx0XHRcdGlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSApIHtcblx0XHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXNcblx0XHRcdGlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0bWF0Y2hlZC5yZXZlcnNlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7XG5cdH07XG59ICk7XG52YXIgcm5vdGh0bWx3aGl0ZSA9ICggL1teXFx4MjBcXHRcXHJcXG5cXGZdKy9nICk7XG5cblxuXG4vLyBDb252ZXJ0IFN0cmluZy1mb3JtYXR0ZWQgb3B0aW9ucyBpbnRvIE9iamVjdC1mb3JtYXR0ZWQgb25lc1xuZnVuY3Rpb24gY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIHtcblx0dmFyIG9iamVjdCA9IHt9O1xuXHRqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHtcblx0XHRvYmplY3RbIGZsYWcgXSA9IHRydWU7XG5cdH0gKTtcblx0cmV0dXJuIG9iamVjdDtcbn1cblxuLypcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICpcbiAqXHRvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93XG4gKlx0XHRcdHRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZVxuICogXCJmaXJlZFwiIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFBvc3NpYmxlIG9wdGlvbnM6XG4gKlxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHRtZW1vcnk6XHRcdFx0d2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZFxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxuICpcdFx0XHRcdFx0dmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcbiAqXG4gKlx0c3RvcE9uRmFsc2U6XHRpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2VcbiAqXG4gKi9cbmpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHQvLyBDb252ZXJ0IG9wdGlvbnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0ZWQgaWYgbmVlZGVkXG5cdC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdClcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cblx0XHRjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgOlxuXHRcdGpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7XG5cblx0dmFyIC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmdcblx0XHRmaXJpbmcsXG5cblx0XHQvLyBMYXN0IGZpcmUgdmFsdWUgZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0c1xuXHRcdG1lbW9yeSxcblxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXG5cdFx0ZmlyZWQsXG5cblx0XHQvLyBGbGFnIHRvIHByZXZlbnQgZmlyaW5nXG5cdFx0bG9ja2VkLFxuXG5cdFx0Ly8gQWN0dWFsIGNhbGxiYWNrIGxpc3Rcblx0XHRsaXN0ID0gW10sXG5cblx0XHQvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0c1xuXHRcdHF1ZXVlID0gW10sXG5cblx0XHQvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSBhZGQvcmVtb3ZlIGFzIG5lZWRlZClcblx0XHRmaXJpbmdJbmRleCA9IC0xLFxuXG5cdFx0Ly8gRmlyZSBjYWxsYmFja3Ncblx0XHRmaXJlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuZm9yY2Ugc2luZ2xlLWZpcmluZ1xuXHRcdFx0bG9ja2VkID0gbG9ja2VkIHx8IG9wdGlvbnMub25jZTtcblxuXHRcdFx0Ly8gRXhlY3V0ZSBjYWxsYmFja3MgZm9yIGFsbCBwZW5kaW5nIGV4ZWN1dGlvbnMsXG5cdFx0XHQvLyByZXNwZWN0aW5nIGZpcmluZ0luZGV4IG92ZXJyaWRlcyBhbmQgcnVudGltZSBjaGFuZ2VzXG5cdFx0XHRmaXJlZCA9IGZpcmluZyA9IHRydWU7XG5cdFx0XHRmb3IgKCA7IHF1ZXVlLmxlbmd0aDsgZmlyaW5nSW5kZXggPSAtMSApIHtcblx0XHRcdFx0bWVtb3J5ID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdFx0d2hpbGUgKCArK2ZpcmluZ0luZGV4IDwgbGlzdC5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHQvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvblxuXHRcdFx0XHRcdGlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmXG5cdFx0XHRcdFx0XHRvcHRpb25zLnN0b3BPbkZhbHNlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlXG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvcmdldCB0aGUgZGF0YSBpZiB3ZSdyZSBkb25lIHdpdGggaXRcblx0XHRcdGlmICggIW9wdGlvbnMubWVtb3J5ICkge1xuXHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XG5cblx0XHRcdC8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kXG5cdFx0XHRpZiAoIGxvY2tlZCApIHtcblxuXHRcdFx0XHQvLyBLZWVwIGFuIGVtcHR5IGxpc3QgaWYgd2UgaGF2ZSBkYXRhIGZvciBmdXR1cmUgYWRkIGNhbGxzXG5cdFx0XHRcdGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGlzdCA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3Rcblx0XHRzZWxmID0ge1xuXG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XG5cdFx0XHRhZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBoYXZlIG1lbW9yeSBmcm9tIGEgcGFzdCBydW4sIHdlIHNob3VsZCBmaXJlIGFmdGVyIGFkZGluZ1xuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdHF1ZXVlLnB1c2goIG1lbW9yeSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCggZnVuY3Rpb24gYWRkKCBhcmdzICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0b1R5cGUoIGFyZyApICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW5zcGVjdCByZWN1cnNpdmVseVxuXHRcdFx0XHRcdFx0XHRcdGFkZCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9ICkoIGFyZ3VtZW50cyApO1xuXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdHZhciBpbmRleDtcblx0XHRcdFx0XHR3aGlsZSAoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdGxpc3Quc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgZmlyaW5nIGluZGV4ZXNcblx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7XG5cdFx0XHRcdFx0XHRcdGZpcmluZ0luZGV4LS07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYSBnaXZlbiBjYWxsYmFjayBpcyBpbiB0aGUgbGlzdC5cblx0XHRcdC8vIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm4gd2hldGhlciBvciBub3QgbGlzdCBoYXMgY2FsbGJhY2tzIGF0dGFjaGVkLlxuXHRcdFx0aGFzOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdHJldHVybiBmbiA/XG5cdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6XG5cdFx0XHRcdFx0bGlzdC5sZW5ndGggPiAwO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdFxuXHRcdFx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZFxuXHRcdFx0Ly8gQWJvcnQgYW55IGN1cnJlbnQvcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHQvLyBDbGVhciBhbGwgY2FsbGJhY2tzIGFuZCB2YWx1ZXNcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlXG5cdFx0XHQvLyBBbHNvIGRpc2FibGUgLmFkZCB1bmxlc3Mgd2UgaGF2ZSBtZW1vcnkgKHNpbmNlIGl0IHdvdWxkIGhhdmUgbm8gZWZmZWN0KVxuXHRcdFx0Ly8gQWJvcnQgYW55IHBlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGlmICggIW1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWxvY2tlZDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHNcblx0XHRcdGZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHtcblx0XHRcdFx0aWYgKCAhbG9ja2VkICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0cXVldWUucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdGlmICggIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5mdW5jdGlvbiBJZGVudGl0eSggdiApIHtcblx0cmV0dXJuIHY7XG59XG5mdW5jdGlvbiBUaHJvd2VyKCBleCApIHtcblx0dGhyb3cgZXg7XG59XG5cbmZ1bmN0aW9uIGFkb3B0VmFsdWUoIHZhbHVlLCByZXNvbHZlLCByZWplY3QsIG5vVmFsdWUgKSB7XG5cdHZhciBtZXRob2Q7XG5cblx0dHJ5IHtcblxuXHRcdC8vIENoZWNrIGZvciBwcm9taXNlIGFzcGVjdCBmaXJzdCB0byBwcml2aWxlZ2Ugc3luY2hyb25vdXMgYmVoYXZpb3Jcblx0XHRpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUucHJvbWlzZSApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7XG5cblx0XHQvLyBPdGhlciB0aGVuYWJsZXNcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnRoZW4gKSApICkge1xuXHRcdFx0bWV0aG9kLmNhbGwoIHZhbHVlLCByZXNvbHZlLCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIG5vbi10aGVuYWJsZXNcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb250cm9sIGByZXNvbHZlYCBhcmd1bWVudHMgYnkgbGV0dGluZyBBcnJheSNzbGljZSBjYXN0IGJvb2xlYW4gYG5vVmFsdWVgIHRvIGludGVnZXI6XG5cdFx0XHQvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApXG5cdFx0XHQvLyAqIHRydWU6IFsgdmFsdWUgXS5zbGljZSggMSApID0+IHJlc29sdmUoKVxuXHRcdFx0cmVzb2x2ZS5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0uc2xpY2UoIG5vVmFsdWUgKSApO1xuXHRcdH1cblxuXHQvLyBGb3IgUHJvbWlzZXMvQSssIGNvbnZlcnQgZXhjZXB0aW9ucyBpbnRvIHJlamVjdGlvbnNcblx0Ly8gU2luY2UgalF1ZXJ5LndoZW4gZG9lc24ndCB1bndyYXAgdGhlbmFibGVzLCB3ZSBjYW4gc2tpcCB0aGUgZXh0cmEgY2hlY2tzIGFwcGVhcmluZyBpblxuXHQvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLlxuXHR9IGNhdGNoICggdmFsdWUgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5XG5cdFx0Ly8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dFxuXHRcdHJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTtcblx0fVxufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0RGVmZXJyZWQ6IGZ1bmN0aW9uKCBmdW5jICkge1xuXHRcdHZhciB0dXBsZXMgPSBbXG5cblx0XHRcdFx0Ly8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGNhbGxiYWNrcyxcblx0XHRcdFx0Ly8gLi4uIC50aGVuIGhhbmRsZXJzLCBhcmd1bWVudCBpbmRleCwgW2ZpbmFsIHN0YXRlXVxuXHRcdFx0XHRbIFwibm90aWZ5XCIsIFwicHJvZ3Jlc3NcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSwgMiBdLFxuXHRcdFx0XHRbIFwicmVzb2x2ZVwiLCBcImRvbmVcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIDAsIFwicmVzb2x2ZWRcIiBdLFxuXHRcdFx0XHRbIFwicmVqZWN0XCIsIFwiZmFpbFwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMSwgXCJyZWplY3RlZFwiIF1cblx0XHRcdF0sXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxuXHRcdFx0cHJvbWlzZSA9IHtcblx0XHRcdFx0c3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWx3YXlzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjYXRjaFwiOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb21pc2UudGhlbiggbnVsbCwgZm4gKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdHBpcGU6IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHtcblx0XHRcdFx0XHR2YXIgZm5zID0gYXJndW1lbnRzO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIF9pLCB0dXBsZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBNYXAgdHVwbGVzIChwcm9ncmVzcywgZG9uZSwgZmFpbCkgdG8gYXJndW1lbnRzIChkb25lLCBmYWlsLCBwcm9ncmVzcylcblx0XHRcdFx0XHRcdFx0dmFyIGZuID0gaXNGdW5jdGlvbiggZm5zWyB0dXBsZVsgNCBdIF0gKSAmJiBmbnNbIHR1cGxlWyA0IF0gXTtcblxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5wcm9ncmVzcyhmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5ub3RpZnkgfSlcblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQuZG9uZShmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZXNvbHZlIH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmZhaWwoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVqZWN0IH0pXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMSBdIF0oIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkICYmIGlzRnVuY3Rpb24oIHJldHVybmVkLnByb21pc2UgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLnByb21pc2UoKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQucHJvZ3Jlc3MoIG5ld0RlZmVyLm5vdGlmeSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5kb25lKCBuZXdEZWZlci5yZXNvbHZlIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmZhaWwoIG5ld0RlZmVyLnJlamVjdCApO1xuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlclsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0oXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGZuID8gWyByZXR1cm5lZCBdIDogYXJndW1lbnRzXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0Zm5zID0gbnVsbDtcblx0XHRcdFx0XHR9ICkucHJvbWlzZSgpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGVuOiBmdW5jdGlvbiggb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIG9uUHJvZ3Jlc3MgKSB7XG5cdFx0XHRcdFx0dmFyIG1heERlcHRoID0gMDtcblx0XHRcdFx0XHRmdW5jdGlvbiByZXNvbHZlKCBkZXB0aCwgZGVmZXJyZWQsIGhhbmRsZXIsIHNwZWNpYWwgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHZhciB0aGF0ID0gdGhpcyxcblx0XHRcdFx0XHRcdFx0XHRhcmdzID0gYXJndW1lbnRzLFxuXHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3cgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCwgdGhlbjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjNcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTU5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgZG91YmxlLXJlc29sdXRpb24gYXR0ZW1wdHNcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggZGVwdGggPCBtYXhEZXB0aCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCA9IGhhbmRsZXIuYXBwbHkoIHRoYXQsIGFyZ3MgKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNDhcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgPT09IGRlZmVycmVkLnByb21pc2UoKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhyb3cgbmV3IFR5cGVFcnJvciggXCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb25cIiApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9ucyAyLjMuMy4xLCAzLjVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTU0XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC03NVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gUmV0cmlldmUgYHRoZW5gIG9ubHkgb25jZVxuXHRcdFx0XHRcdFx0XHRcdFx0dGhlbiA9IHJldHVybmVkICYmXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuNFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02NFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IGNoZWNrIG9iamVjdHMgYW5kIGZ1bmN0aW9ucyBmb3IgdGhlbmFiaWxpdHlcblx0XHRcdFx0XHRcdFx0XHRcdFx0KCB0eXBlb2YgcmV0dXJuZWQgPT09IFwib2JqZWN0XCIgfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgcmV0dXJuZWQgPT09IFwiZnVuY3Rpb25cIiApICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLnRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhIHJldHVybmVkIHRoZW5hYmxlXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24oIHRoZW4gKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTcGVjaWFsIHByb2Nlc3NvcnMgKG5vdGlmeSkganVzdCB3YWl0IGZvciByZXNvbHV0aW9uXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVuLmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgVGhyb3dlciwgc3BlY2lhbCApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBOb3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgYWxzbyBob29rIGludG8gcHJvZ3Jlc3Ncblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIC4uLmFuZCBkaXNyZWdhcmQgb2xkZXIgcmVzb2x1dGlvbiB2YWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtYXhEZXB0aCsrO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGggKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGFsbCBvdGhlciByZXR1cm5lZCB2YWx1ZXNcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBoYW5kbGVyICE9PSBJZGVudGl0eSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIHJldHVybmVkIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBQcm9jZXNzIHRoZSB2YWx1ZShzKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEZWZhdWx0IHByb2Nlc3MgaXMgcmVzb2x2ZVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoIHNwZWNpYWwgfHwgZGVmZXJyZWQucmVzb2x2ZVdpdGggKSggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IG5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBjYXRjaCBhbmQgcmVqZWN0IGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzID0gc3BlY2lhbCA/XG5cdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93IDpcblx0XHRcdFx0XHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3coKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2soIGUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3Muc3RhY2tUcmFjZSApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy40LjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC02MVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIElnbm9yZSBwb3N0LXJlc29sdXRpb24gZXhjZXB0aW9uc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKyAxID49IG1heERlcHRoICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBhbmQgbXVsdGlwbGUgdmFsdWVzIChub24tc3BlYyBiZWhhdmlvcilcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlciAhPT0gVGhyb3dlciApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncyA9IFsgZSBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCB0aGF0LCBhcmdzICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy4xXG5cdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTU3XG5cdFx0XHRcdFx0XHRcdC8vIFJlLXJlc29sdmUgcHJvbWlzZXMgaW1tZWRpYXRlbHkgdG8gZG9kZ2UgZmFsc2UgcmVqZWN0aW9uIGZyb21cblx0XHRcdFx0XHRcdFx0Ly8gc3Vic2VxdWVudCBlcnJvcnNcblx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCApIHtcblx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzKCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBDYWxsIGFuIG9wdGlvbmFsIGhvb2sgdG8gcmVjb3JkIHRoZSBzdGFjaywgaW4gY2FzZSBvZiBleGNlcHRpb25cblx0XHRcdFx0XHRcdFx0XHQvLyBzaW5jZSBpdCdzIG90aGVyd2lzZSBsb3N0IHdoZW4gZXhlY3V0aW9uIGdvZXMgYXN5bmNcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5EZWZlcnJlZC5nZXRTdGFja0hvb2sgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzLnN0YWNrVHJhY2UgPSBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBwcm9jZXNzICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXG5cdFx0XHRcdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGlzRnVuY3Rpb24oIG9uUHJvZ3Jlc3MgKSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRvblByb2dyZXNzIDpcblx0XHRcdFx0XHRcdFx0XHRcdElkZW50aXR5LFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLm5vdGlmeVdpdGhcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMSBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25GdWxmaWxsZWQgKSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRvbkZ1bGZpbGxlZCA6XG5cdFx0XHRcdFx0XHRcdFx0XHRJZGVudGl0eVxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHQvLyByZWplY3RlZF9oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDIgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGlzRnVuY3Rpb24oIG9uUmVqZWN0ZWQgKSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRvblJlamVjdGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdFRocm93ZXJcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9ICkucHJvbWlzZSgpO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEdldCBhIHByb21pc2UgZm9yIHRoaXMgZGVmZXJyZWRcblx0XHRcdFx0Ly8gSWYgb2JqIGlzIHByb3ZpZGVkLCB0aGUgcHJvbWlzZSBhc3BlY3QgaXMgYWRkZWQgdG8gdGhlIG9iamVjdFxuXHRcdFx0XHRwcm9taXNlOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdFx0XHRcdHJldHVybiBvYmogIT0gbnVsbCA/IGpRdWVyeS5leHRlbmQoIG9iaiwgcHJvbWlzZSApIDogcHJvbWlzZTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGRlZmVycmVkID0ge307XG5cblx0XHQvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzXG5cdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0dmFyIGxpc3QgPSB0dXBsZVsgMiBdLFxuXHRcdFx0XHRzdGF0ZVN0cmluZyA9IHR1cGxlWyA1IF07XG5cblx0XHRcdC8vIHByb21pc2UucHJvZ3Jlc3MgPSBsaXN0LmFkZFxuXHRcdFx0Ly8gcHJvbWlzZS5kb25lID0gbGlzdC5hZGRcblx0XHRcdC8vIHByb21pc2UuZmFpbCA9IGxpc3QuYWRkXG5cdFx0XHRwcm9taXNlWyB0dXBsZVsgMSBdIF0gPSBsaXN0LmFkZDtcblxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlXG5cdFx0XHRpZiAoIHN0YXRlU3RyaW5nICkge1xuXHRcdFx0XHRsaXN0LmFkZChcblx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gc3RhdGUgPSBcInJlc29sdmVkXCIgKGkuZS4sIGZ1bGZpbGxlZClcblx0XHRcdFx0XHRcdC8vIHN0YXRlID0gXCJyZWplY3RlZFwiXG5cdFx0XHRcdFx0XHRzdGF0ZSA9IHN0YXRlU3RyaW5nO1xuXHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHQvLyByZWplY3RlZF9jYWxsYmFja3MuZGlzYWJsZVxuXHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9jYWxsYmFja3MuZGlzYWJsZVxuXHRcdFx0XHRcdHR1cGxlc1sgMyAtIGkgXVsgMiBdLmRpc2FibGUsXG5cblx0XHRcdFx0XHQvLyByZWplY3RlZF9oYW5kbGVycy5kaXNhYmxlXG5cdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2hhbmRsZXJzLmRpc2FibGVcblx0XHRcdFx0XHR0dXBsZXNbIDMgLSBpIF1bIDMgXS5kaXNhYmxlLFxuXG5cdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfY2FsbGJhY2tzLmxvY2tcblx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMiBdLmxvY2ssXG5cblx0XHRcdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5sb2NrXG5cdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDMgXS5sb2NrXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmZpcmVcblx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5maXJlXG5cdFx0XHQvLyByZWplY3RlZF9oYW5kbGVycy5maXJlXG5cdFx0XHRsaXN0LmFkZCggdHVwbGVbIDMgXS5maXJlICk7XG5cblx0XHRcdC8vIGRlZmVycmVkLm5vdGlmeSA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5ub3RpZnlXaXRoKC4uLikgfVxuXHRcdFx0Ly8gZGVmZXJyZWQucmVzb2x2ZSA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZXNvbHZlV2l0aCguLi4pIH1cblx0XHRcdC8vIGRlZmVycmVkLnJlamVjdCA9IGZ1bmN0aW9uKCkgeyBkZWZlcnJlZC5yZWplY3RXaXRoKC4uLikgfVxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0oIHRoaXMgPT09IGRlZmVycmVkID8gdW5kZWZpbmVkIDogdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fTtcblxuXHRcdFx0Ly8gZGVmZXJyZWQubm90aWZ5V2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdC8vIGRlZmVycmVkLnJlc29sdmVXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0Ly8gZGVmZXJyZWQucmVqZWN0V2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSA9IGxpc3QuZmlyZVdpdGg7XG5cdFx0fSApO1xuXG5cdFx0Ly8gTWFrZSB0aGUgZGVmZXJyZWQgYSBwcm9taXNlXG5cdFx0cHJvbWlzZS5wcm9taXNlKCBkZWZlcnJlZCApO1xuXG5cdFx0Ly8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueVxuXHRcdGlmICggZnVuYyApIHtcblx0XHRcdGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGRvbmUhXG5cdFx0cmV0dXJuIGRlZmVycmVkO1xuXHR9LFxuXG5cdC8vIERlZmVycmVkIGhlbHBlclxuXHR3aGVuOiBmdW5jdGlvbiggc2luZ2xlVmFsdWUgKSB7XG5cdFx0dmFyXG5cblx0XHRcdC8vIGNvdW50IG9mIHVuY29tcGxldGVkIHN1Ym9yZGluYXRlc1xuXHRcdFx0cmVtYWluaW5nID0gYXJndW1lbnRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gY291bnQgb2YgdW5wcm9jZXNzZWQgYXJndW1lbnRzXG5cdFx0XHRpID0gcmVtYWluaW5nLFxuXG5cdFx0XHQvLyBzdWJvcmRpbmF0ZSBmdWxmaWxsbWVudCBkYXRhXG5cdFx0XHRyZXNvbHZlQ29udGV4dHMgPSBBcnJheSggaSApLFxuXHRcdFx0cmVzb2x2ZVZhbHVlcyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLFxuXG5cdFx0XHQvLyB0aGUgcHJpbWFyeSBEZWZlcnJlZFxuXHRcdFx0cHJpbWFyeSA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXG5cdFx0XHQvLyBzdWJvcmRpbmF0ZSBjYWxsYmFjayBmYWN0b3J5XG5cdFx0XHR1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZUNvbnRleHRzWyBpIF0gPSB0aGlzO1xuXHRcdFx0XHRcdHJlc29sdmVWYWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoICEoIC0tcmVtYWluaW5nICkgKSB7XG5cdFx0XHRcdFx0XHRwcmltYXJ5LnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHR9O1xuXG5cdFx0Ly8gU2luZ2xlLSBhbmQgZW1wdHkgYXJndW1lbnRzIGFyZSBhZG9wdGVkIGxpa2UgUHJvbWlzZS5yZXNvbHZlXG5cdFx0aWYgKCByZW1haW5pbmcgPD0gMSApIHtcblx0XHRcdGFkb3B0VmFsdWUoIHNpbmdsZVZhbHVlLCBwcmltYXJ5LmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIHByaW1hcnkucmVqZWN0LFxuXHRcdFx0XHQhcmVtYWluaW5nICk7XG5cblx0XHRcdC8vIFVzZSAudGhlbigpIHRvIHVud3JhcCBzZWNvbmRhcnkgdGhlbmFibGVzIChjZi4gZ2gtMzAwMClcblx0XHRcdGlmICggcHJpbWFyeS5zdGF0ZSgpID09PSBcInBlbmRpbmdcIiB8fFxuXHRcdFx0XHRpc0Z1bmN0aW9uKCByZXNvbHZlVmFsdWVzWyBpIF0gJiYgcmVzb2x2ZVZhbHVlc1sgaSBdLnRoZW4gKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gcHJpbWFyeS50aGVuKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTXVsdGlwbGUgYXJndW1lbnRzIGFyZSBhZ2dyZWdhdGVkIGxpa2UgUHJvbWlzZS5hbGwgYXJyYXkgZWxlbWVudHNcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBwcmltYXJ5LnJlamVjdCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcmltYXJ5LnByb21pc2UoKTtcblx0fVxufSApO1xuXG5cbi8vIFRoZXNlIHVzdWFsbHkgaW5kaWNhdGUgYSBwcm9ncmFtbWVyIG1pc3Rha2UgZHVyaW5nIGRldmVsb3BtZW50LFxuLy8gd2FybiBhYm91dCB0aGVtIEFTQVAgcmF0aGVyIHRoYW4gc3dhbGxvd2luZyB0aGVtIGJ5IGRlZmF1bHQuXG52YXIgcmVycm9yTmFtZXMgPSAvXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztcblxualF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sgPSBmdW5jdGlvbiggZXJyb3IsIHN0YWNrICkge1xuXG5cdC8vIFN1cHBvcnQ6IElFIDggLSA5IG9ubHlcblx0Ly8gQ29uc29sZSBleGlzdHMgd2hlbiBkZXYgdG9vbHMgYXJlIG9wZW4sIHdoaWNoIGNhbiBoYXBwZW4gYXQgYW55IHRpbWVcblx0aWYgKCB3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS53YXJuICYmIGVycm9yICYmIHJlcnJvck5hbWVzLnRlc3QoIGVycm9yLm5hbWUgKSApIHtcblx0XHR3aW5kb3cuY29uc29sZS53YXJuKCBcImpRdWVyeS5EZWZlcnJlZCBleGNlcHRpb246IFwiICsgZXJyb3IubWVzc2FnZSwgZXJyb3Iuc3RhY2ssIHN0YWNrICk7XG5cdH1cbn07XG5cblxuXG5cbmpRdWVyeS5yZWFkeUV4Y2VwdGlvbiA9IGZ1bmN0aW9uKCBlcnJvciApIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdHRocm93IGVycm9yO1xuXHR9ICk7XG59O1xuXG5cblxuXG4vLyBUaGUgZGVmZXJyZWQgdXNlZCBvbiBET00gcmVhZHlcbnZhciByZWFkeUxpc3QgPSBqUXVlcnkuRGVmZXJyZWQoKTtcblxualF1ZXJ5LmZuLnJlYWR5ID0gZnVuY3Rpb24oIGZuICkge1xuXG5cdHJlYWR5TGlzdFxuXHRcdC50aGVuKCBmbiApXG5cblx0XHQvLyBXcmFwIGpRdWVyeS5yZWFkeUV4Y2VwdGlvbiBpbiBhIGZ1bmN0aW9uIHNvIHRoYXQgdGhlIGxvb2t1cFxuXHRcdC8vIGhhcHBlbnMgYXQgdGhlIHRpbWUgb2YgZXJyb3IgaGFuZGxpbmcgaW5zdGVhZCBvZiBjYWxsYmFja1xuXHRcdC8vIHJlZ2lzdHJhdGlvbi5cblx0XHQuY2F0Y2goIGZ1bmN0aW9uKCBlcnJvciApIHtcblx0XHRcdGpRdWVyeS5yZWFkeUV4Y2VwdGlvbiggZXJyb3IgKTtcblx0XHR9ICk7XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy5cblx0aXNSZWFkeTogZmFsc2UsXG5cblx0Ly8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZVxuXHQvLyB0aGUgcmVhZHkgZXZlbnQgZmlyZXMuIFNlZSAjNjc4MVxuXHRyZWFkeVdhaXQ6IDEsXG5cblx0Ly8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeVxuXHRyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7XG5cblx0XHQvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5XG5cdFx0aWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmVtZW1iZXIgdGhhdCB0aGUgRE9NIGlzIHJlYWR5XG5cdFx0alF1ZXJ5LmlzUmVhZHkgPSB0cnVlO1xuXG5cdFx0Ly8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmVcblx0XHRpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlXG5cdFx0cmVhZHlMaXN0LnJlc29sdmVXaXRoKCBkb2N1bWVudCwgWyBqUXVlcnkgXSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5yZWFkeS50aGVuID0gcmVhZHlMaXN0LnRoZW47XG5cbi8vIFRoZSByZWFkeSBldmVudCBoYW5kbGVyIGFuZCBzZWxmIGNsZWFudXAgbWV0aG9kXG5mdW5jdGlvbiBjb21wbGV0ZWQoKSB7XG5cdGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwiRE9NQ29udGVudExvYWRlZFwiLCBjb21wbGV0ZWQgKTtcblx0d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIFwibG9hZFwiLCBjb21wbGV0ZWQgKTtcblx0alF1ZXJ5LnJlYWR5KCk7XG59XG5cbi8vIENhdGNoIGNhc2VzIHdoZXJlICQoZG9jdW1lbnQpLnJlYWR5KCkgaXMgY2FsbGVkXG4vLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC5cbi8vIFN1cHBvcnQ6IElFIDw9OSAtIDEwIG9ubHlcbi8vIE9sZGVyIElFIHNvbWV0aW1lcyBzaWduYWxzIFwiaW50ZXJhY3RpdmVcIiB0b28gc29vblxuaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIgfHxcblx0KCBkb2N1bWVudC5yZWFkeVN0YXRlICE9PSBcImxvYWRpbmdcIiAmJiAhZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICkgKSB7XG5cblx0Ly8gSGFuZGxlIGl0IGFzeW5jaHJvbm91c2x5IHRvIGFsbG93IHNjcmlwdHMgdGhlIG9wcG9ydHVuaXR5IHRvIGRlbGF5IHJlYWR5XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBqUXVlcnkucmVhZHkgKTtcblxufSBlbHNlIHtcblxuXHQvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrXG5cdGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIFwiRE9NQ29udGVudExvYWRlZFwiLCBjb21wbGV0ZWQgKTtcblxuXHQvLyBBIGZhbGxiYWNrIHRvIHdpbmRvdy5vbmxvYWQsIHRoYXQgd2lsbCBhbHdheXMgd29ya1xuXHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xufVxuXG5cblxuXG4vLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBvZiBhIGNvbGxlY3Rpb25cbi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvblxudmFyIGFjY2VzcyA9IGZ1bmN0aW9uKCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHJhdyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGVsZW1zLmxlbmd0aCxcblx0XHRidWxrID0ga2V5ID09IG51bGw7XG5cblx0Ly8gU2V0cyBtYW55IHZhbHVlc1xuXHRpZiAoIHRvVHlwZSgga2V5ICkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblx0XHRmb3IgKCBpIGluIGtleSApIHtcblx0XHRcdGFjY2VzcyggZWxlbXMsIGZuLCBpLCBrZXlbIGkgXSwgdHJ1ZSwgZW1wdHlHZXQsIHJhdyApO1xuXHRcdH1cblxuXHQvLyBTZXRzIG9uZSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cblx0XHRpZiAoICFpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmF3ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGJ1bGsgKSB7XG5cblx0XHRcdC8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldFxuXHRcdFx0aWYgKCByYXcgKSB7XG5cdFx0XHRcdGZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApO1xuXHRcdFx0XHRmbiA9IG51bGw7XG5cblx0XHRcdC8vIC4uLmV4Y2VwdCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvbiB2YWx1ZXNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ1bGsgPSBmbjtcblx0XHRcdFx0Zm4gPSBmdW5jdGlvbiggZWxlbSwgX2tleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRmbihcblx0XHRcdFx0XHRlbGVtc1sgaSBdLCBrZXksIHJhdyA/XG5cdFx0XHRcdFx0XHR2YWx1ZSA6XG5cdFx0XHRcdFx0XHR2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggY2hhaW5hYmxlICkge1xuXHRcdHJldHVybiBlbGVtcztcblx0fVxuXG5cdC8vIEdldHNcblx0aWYgKCBidWxrICkge1xuXHRcdHJldHVybiBmbi5jYWxsKCBlbGVtcyApO1xuXHR9XG5cblx0cmV0dXJuIGxlbiA/IGZuKCBlbGVtc1sgMCBdLCBrZXkgKSA6IGVtcHR5R2V0O1xufTtcblxuXG4vLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmdcbnZhciBybXNQcmVmaXggPSAvXi1tcy0vLFxuXHRyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7XG5cbi8vIFVzZWQgYnkgY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJlcGxhY2UoKVxuZnVuY3Rpb24gZmNhbWVsQ2FzZSggX2FsbCwgbGV0dGVyICkge1xuXHRyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8vIENvbnZlcnQgZGFzaGVkIHRvIGNhbWVsQ2FzZTsgdXNlZCBieSB0aGUgY3NzIGFuZCBkYXRhIG1vZHVsZXNcbi8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcbi8vIE1pY3Jvc29mdCBmb3Jnb3QgdG8gaHVtcCB0aGVpciB2ZW5kb3IgcHJlZml4ICgjOTU3MilcbmZ1bmN0aW9uIGNhbWVsQ2FzZSggc3RyaW5nICkge1xuXHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHJtc1ByZWZpeCwgXCJtcy1cIiApLnJlcGxhY2UoIHJkYXNoQWxwaGEsIGZjYW1lbENhc2UgKTtcbn1cbnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdC8vIEFjY2VwdHMgb25seTpcblx0Ly8gIC0gTm9kZVxuXHQvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFXG5cdC8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFXG5cdC8vICAtIE9iamVjdFxuXHQvLyAgICAtIEFueVxuXHRyZXR1cm4gb3duZXIubm9kZVR5cGUgPT09IDEgfHwgb3duZXIubm9kZVR5cGUgPT09IDkgfHwgISggK293bmVyLm5vZGVUeXBlICk7XG59O1xuXG5cblxuXG5mdW5jdGlvbiBEYXRhKCkge1xuXHR0aGlzLmV4cGFuZG8gPSBqUXVlcnkuZXhwYW5kbyArIERhdGEudWlkKys7XG59XG5cbkRhdGEudWlkID0gMTtcblxuRGF0YS5wcm90b3R5cGUgPSB7XG5cblx0Y2FjaGU6IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHRcdC8vIENoZWNrIGlmIHRoZSBvd25lciBvYmplY3QgYWxyZWFkeSBoYXMgYSBjYWNoZVxuXHRcdHZhciB2YWx1ZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdC8vIElmIG5vdCwgY3JlYXRlIG9uZVxuXHRcdGlmICggIXZhbHVlICkge1xuXHRcdFx0dmFsdWUgPSB7fTtcblxuXHRcdFx0Ly8gV2UgY2FuIGFjY2VwdCBkYXRhIGZvciBub24tZWxlbWVudCBub2RlcyBpbiBtb2Rlcm4gYnJvd3NlcnMsXG5cdFx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlICM4MzM1LlxuXHRcdFx0Ly8gQWx3YXlzIHJldHVybiBhbiBlbXB0eSBvYmplY3QuXG5cdFx0XHRpZiAoIGFjY2VwdERhdGEoIG93bmVyICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYgaXQgaXMgYSBub2RlIHVubGlrZWx5IHRvIGJlIHN0cmluZ2lmeS1lZCBvciBsb29wZWQgb3ZlclxuXHRcdFx0XHQvLyB1c2UgcGxhaW4gYXNzaWdubWVudFxuXHRcdFx0XHRpZiAoIG93bmVyLm5vZGVUeXBlICkge1xuXHRcdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHZhbHVlO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBzZWN1cmUgaXQgaW4gYSBub24tZW51bWVyYWJsZSBwcm9wZXJ0eVxuXHRcdFx0XHQvLyBjb25maWd1cmFibGUgbXVzdCBiZSB0cnVlIHRvIGFsbG93IHRoZSBwcm9wZXJ0eSB0byBiZVxuXHRcdFx0XHQvLyBkZWxldGVkIHdoZW4gZGF0YSBpcyByZW1vdmVkXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBvd25lciwgdGhpcy5leHBhbmRvLCB7XG5cdFx0XHRcdFx0XHR2YWx1ZTogdmFsdWUsXG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWVcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH0sXG5cdHNldDogZnVuY3Rpb24oIG93bmVyLCBkYXRhLCB2YWx1ZSApIHtcblx0XHR2YXIgcHJvcCxcblx0XHRcdGNhY2hlID0gdGhpcy5jYWNoZSggb3duZXIgKTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwga2V5LCB2YWx1ZSBdIGFyZ3Ncblx0XHQvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGNhY2hlWyBjYW1lbENhc2UoIGRhdGEgKSBdID0gdmFsdWU7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIHsgcHJvcGVydGllcyB9IF0gYXJnc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvcHkgdGhlIHByb3BlcnRpZXMgb25lLWJ5LW9uZSB0byB0aGUgY2FjaGUgb2JqZWN0XG5cdFx0XHRmb3IgKCBwcm9wIGluIGRhdGEgKSB7XG5cdFx0XHRcdGNhY2hlWyBjYW1lbENhc2UoIHByb3AgKSBdID0gZGF0YVsgcHJvcCBdO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gY2FjaGU7XG5cdH0sXG5cdGdldDogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0cmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMuY2FjaGUoIG93bmVyICkgOlxuXG5cdFx0XHQvLyBBbHdheXMgdXNlIGNhbWVsQ2FzZSBrZXkgKGdoLTIyNTcpXG5cdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gJiYgb3duZXJbIHRoaXMuZXhwYW5kbyBdWyBjYW1lbENhc2UoIGtleSApIF07XG5cdH0sXG5cdGFjY2VzczogZnVuY3Rpb24oIG93bmVyLCBrZXksIHZhbHVlICkge1xuXG5cdFx0Ly8gSW4gY2FzZXMgd2hlcmUgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBObyBrZXkgd2FzIHNwZWNpZmllZFxuXHRcdC8vICAgMi4gQSBzdHJpbmcga2V5IHdhcyBzcGVjaWZpZWQsIGJ1dCBubyB2YWx1ZSBwcm92aWRlZFxuXHRcdC8vXG5cdFx0Ly8gVGFrZSB0aGUgXCJyZWFkXCIgcGF0aCBhbmQgYWxsb3cgdGhlIGdldCBtZXRob2QgdG8gZGV0ZXJtaW5lXG5cdFx0Ly8gd2hpY2ggdmFsdWUgdG8gcmV0dXJuLCByZXNwZWN0aXZlbHkgZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBUaGUgZW50aXJlIGNhY2hlIG9iamVjdFxuXHRcdC8vICAgMi4gVGhlIGRhdGEgc3RvcmVkIGF0IHRoZSBrZXlcblx0XHQvL1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0KCAoIGtleSAmJiB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiICkgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5nZXQoIG93bmVyLCBrZXkgKTtcblx0XHR9XG5cblx0XHQvLyBXaGVuIHRoZSBrZXkgaXMgbm90IGEgc3RyaW5nLCBvciBib3RoIGEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vIGFyZSBzcGVjaWZpZWQsIHNldCBvciBleHRlbmQgKGV4aXN0aW5nIG9iamVjdHMpIHdpdGggZWl0aGVyOlxuXHRcdC8vXG5cdFx0Ly8gICAxLiBBbiBvYmplY3Qgb2YgcHJvcGVydGllc1xuXHRcdC8vICAgMi4gQSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly9cblx0XHR0aGlzLnNldCggb3duZXIsIGtleSwgdmFsdWUgKTtcblxuXHRcdC8vIFNpbmNlIHRoZSBcInNldFwiIHBhdGggY2FuIGhhdmUgdHdvIHBvc3NpYmxlIGVudHJ5IHBvaW50c1xuXHRcdC8vIHJldHVybiB0aGUgZXhwZWN0ZWQgZGF0YSBiYXNlZCBvbiB3aGljaCBwYXRoIHdhcyB0YWtlblsqXVxuXHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiBrZXk7XG5cdH0sXG5cdHJlbW92ZTogZnVuY3Rpb24oIG93bmVyLCBrZXkgKSB7XG5cdFx0dmFyIGksXG5cdFx0XHRjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdGlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIGtleSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0IGFycmF5IG9yIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcgb2Yga2V5c1xuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBrZXkgKSApIHtcblxuXHRcdFx0XHQvLyBJZiBrZXkgaXMgYW4gYXJyYXkgb2Yga2V5cy4uLlxuXHRcdFx0XHQvLyBXZSBhbHdheXMgc2V0IGNhbWVsQ2FzZSBrZXlzLCBzbyByZW1vdmUgdGhhdC5cblx0XHRcdFx0a2V5ID0ga2V5Lm1hcCggY2FtZWxDYXNlICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRrZXkgPSBjYW1lbENhc2UoIGtleSApO1xuXG5cdFx0XHRcdC8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBjcmVhdGUgYW4gYXJyYXkgYnkgbWF0Y2hpbmcgbm9uLXdoaXRlc3BhY2Vcblx0XHRcdFx0a2V5ID0ga2V5IGluIGNhY2hlID9cblx0XHRcdFx0XHRbIGtleSBdIDpcblx0XHRcdFx0XHQoIGtleS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdICk7XG5cdFx0XHR9XG5cblx0XHRcdGkgPSBrZXkubGVuZ3RoO1xuXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0ZGVsZXRlIGNhY2hlWyBrZXlbIGkgXSBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSB0aGUgZXhwYW5kbyBpZiB0aGVyZSdzIG5vIG1vcmUgZGF0YVxuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHwgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICkgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDVcblx0XHRcdC8vIFdlYmtpdCAmIEJsaW5rIHBlcmZvcm1hbmNlIHN1ZmZlcnMgd2hlbiBkZWxldGluZyBwcm9wZXJ0aWVzXG5cdFx0XHQvLyBmcm9tIERPTSBub2Rlcywgc28gc2V0IHRvIHVuZGVmaW5lZCBpbnN0ZWFkXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zNzg2MDcgKGJ1ZyByZXN0cmljdGVkKVxuXHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVsZXRlIG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBvd25lciApIHtcblx0XHR2YXIgY2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0cmV0dXJuIGNhY2hlICE9PSB1bmRlZmluZWQgJiYgIWpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApO1xuXHR9XG59O1xudmFyIGRhdGFQcml2ID0gbmV3IERhdGEoKTtcblxudmFyIGRhdGFVc2VyID0gbmV3IERhdGEoKTtcblxuXG5cbi8vXHRJbXBsZW1lbnRhdGlvbiBTdW1tYXJ5XG4vL1xuLy9cdDEuIEVuZm9yY2UgQVBJIHN1cmZhY2UgYW5kIHNlbWFudGljIGNvbXBhdGliaWxpdHkgd2l0aCAxLjkueCBicmFuY2hcbi8vXHQyLiBJbXByb3ZlIHRoZSBtb2R1bGUncyBtYWludGFpbmFiaWxpdHkgYnkgcmVkdWNpbmcgdGhlIHN0b3JhZ2Vcbi8vXHRcdHBhdGhzIHRvIGEgc2luZ2xlIG1lY2hhbmlzbS5cbi8vXHQzLiBVc2UgdGhlIHNhbWUgc2luZ2xlIG1lY2hhbmlzbSB0byBzdXBwb3J0IFwicHJpdmF0ZVwiIGFuZCBcInVzZXJcIiBkYXRhLlxuLy9cdDQuIF9OZXZlcl8gZXhwb3NlIFwicHJpdmF0ZVwiIGRhdGEgdG8gdXNlciBjb2RlIChUT0RPOiBEcm9wIF9kYXRhLCBfcmVtb3ZlRGF0YSlcbi8vXHQ1LiBBdm9pZCBleHBvc2luZyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9uIHVzZXIgb2JqZWN0cyAoZWcuIGV4cGFuZG8gcHJvcGVydGllcylcbi8vXHQ2LiBQcm92aWRlIGEgY2xlYXIgcGF0aCBmb3IgaW1wbGVtZW50YXRpb24gdXBncmFkZSB0byBXZWFrTWFwIGluIDIwMTRcblxudmFyIHJicmFjZSA9IC9eKD86XFx7W1xcd1xcV10qXFx9fFxcW1tcXHdcXFddKlxcXSkkLyxcblx0cm11bHRpRGFzaCA9IC9bQS1aXS9nO1xuXG5mdW5jdGlvbiBnZXREYXRhKCBkYXRhICkge1xuXHRpZiAoIGRhdGEgPT09IFwidHJ1ZVwiICkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aWYgKCBkYXRhID09PSBcImZhbHNlXCIgKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0aWYgKCBkYXRhID09PSBcIm51bGxcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nXG5cdGlmICggZGF0YSA9PT0gK2RhdGEgKyBcIlwiICkge1xuXHRcdHJldHVybiArZGF0YTtcblx0fVxuXG5cdGlmICggcmJyYWNlLnRlc3QoIGRhdGEgKSApIHtcblx0XHRyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSApO1xuXHR9XG5cblx0cmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGRhdGFBdHRyKCBlbGVtLCBrZXksIGRhdGEgKSB7XG5cdHZhciBuYW1lO1xuXG5cdC8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnlcblx0Ly8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlXG5cdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0bmFtZSA9IFwiZGF0YS1cIiArIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCBcIi0kJlwiICkudG9Mb3dlckNhc2UoKTtcblx0XHRkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTtcblxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRkYXRhID0gZ2V0RGF0YSggZGF0YSApO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXJcblx0XHRcdGRhdGFVc2VyLnNldCggZWxlbSwga2V5LCBkYXRhICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBkYXRhO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGhhc0RhdGE6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkYXRhVXNlci5oYXNEYXRhKCBlbGVtICkgfHwgZGF0YVByaXYuaGFzRGF0YSggZWxlbSApO1xuXHR9LFxuXG5cdGRhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhVXNlci5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhVXNlci5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fSxcblxuXHQvLyBUT0RPOiBOb3cgdGhhdCBhbGwgY2FsbHMgdG8gX2RhdGEgYW5kIF9yZW1vdmVEYXRhIGhhdmUgYmVlbiByZXBsYWNlZFxuXHQvLyB3aXRoIGRpcmVjdCBjYWxscyB0byBkYXRhUHJpdiBtZXRob2RzLCB0aGVzZSBjYW4gYmUgZGVwcmVjYXRlZC5cblx0X2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkge1xuXHRcdHJldHVybiBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIG5hbWUsIGRhdGEgKTtcblx0fSxcblxuXHRfcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRkYXRhOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHtcblx0XHR2YXIgaSwgbmFtZSwgZGF0YSxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRhdHRycyA9IGVsZW0gJiYgZWxlbS5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gR2V0cyBhbGwgdmFsdWVzXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdGhpcy5sZW5ndGggKSB7XG5cdFx0XHRcdGRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0gKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgIWRhdGFQcml2LmdldCggZWxlbSwgXCJoYXNEYXRhQXR0cnNcIiApICkge1xuXHRcdFx0XHRcdGkgPSBhdHRycy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDExIG9ubHlcblx0XHRcdFx0XHRcdC8vIFRoZSBhdHRycyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0KVxuXHRcdFx0XHRcdFx0aWYgKCBhdHRyc1sgaSBdICkge1xuXHRcdFx0XHRcdFx0XHRuYW1lID0gYXR0cnNbIGkgXS5uYW1lO1xuXHRcdFx0XHRcdFx0XHRpZiAoIG5hbWUuaW5kZXhPZiggXCJkYXRhLVwiICkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZSA9IGNhbWVsQ2FzZSggbmFtZS5zbGljZSggNSApICk7XG5cdFx0XHRcdFx0XHRcdFx0ZGF0YUF0dHIoIGVsZW0sIG5hbWUsIGRhdGFbIG5hbWUgXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJoYXNEYXRhQXR0cnNcIiwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXHRcdH1cblxuXHRcdC8vIFNldHMgbXVsdGlwbGUgdmFsdWVzXG5cdFx0aWYgKCB0eXBlb2Yga2V5ID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5ICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGRhdGE7XG5cblx0XHRcdC8vIFRoZSBjYWxsaW5nIGpRdWVyeSBvYmplY3QgKGVsZW1lbnQgbWF0Y2hlcykgaXMgbm90IGVtcHR5XG5cdFx0XHQvLyAoYW5kIHRoZXJlZm9yZSBoYXMgYW4gZWxlbWVudCBhcHBlYXJzIGF0IHRoaXNbIDAgXSkgYW5kIHRoZVxuXHRcdFx0Ly8gYHZhbHVlYCBwYXJhbWV0ZXIgd2FzIG5vdCB1bmRlZmluZWQuIEFuIGVtcHR5IGpRdWVyeSBvYmplY3Rcblx0XHRcdC8vIHdpbGwgcmVzdWx0IGluIGB1bmRlZmluZWRgIGZvciBlbGVtID0gdGhpc1sgMCBdIHdoaWNoIHdpbGxcblx0XHRcdC8vIHRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbiBhdHRlbXB0IHRvIHJlYWQgYSBkYXRhIGNhY2hlIGlzIG1hZGUuXG5cdFx0XHRpZiAoIGVsZW0gJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIGdldCBkYXRhIGZyb20gdGhlIGNhY2hlXG5cdFx0XHRcdC8vIFRoZSBrZXkgd2lsbCBhbHdheXMgYmUgY2FtZWxDYXNlZCBpbiBEYXRhXG5cdFx0XHRcdGRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gXCJkaXNjb3ZlclwiIHRoZSBkYXRhIGluXG5cdFx0XHRcdC8vIEhUTUw1IGN1c3RvbSBkYXRhLSogYXR0cnNcblx0XHRcdFx0ZGF0YSA9IGRhdGFBdHRyKCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSB0cmllZCByZWFsbHkgaGFyZCwgYnV0IHRoZSBkYXRhIGRvZXNuJ3QgZXhpc3QuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IHRoZSBkYXRhLi4uXG5cdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8vIFdlIGFsd2F5cyBzdG9yZSB0aGUgY2FtZWxDYXNlZCBrZXlcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXksIHZhbHVlICk7XG5cdFx0XHR9ICk7XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxLCBudWxsLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGRhdGFVc2VyLnJlbW92ZSggdGhpcywga2V5ICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHF1ZXVlO1xuXG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0dHlwZSA9ICggdHlwZSB8fCBcImZ4XCIgKSArIFwicXVldWVcIjtcblx0XHRcdHF1ZXVlID0gZGF0YVByaXYuZ2V0KCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdC8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXBcblx0XHRcdGlmICggZGF0YSApIHtcblx0XHRcdFx0aWYgKCAhcXVldWUgfHwgQXJyYXkuaXNBcnJheSggZGF0YSApICkge1xuXHRcdFx0XHRcdHF1ZXVlID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KCBkYXRhICkgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBkYXRhICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBxdWV1ZSB8fCBbXTtcblx0XHR9XG5cdH0sXG5cblx0ZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCBlbGVtLCB0eXBlICksXG5cdFx0XHRzdGFydExlbmd0aCA9IHF1ZXVlLmxlbmd0aCxcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKSxcblx0XHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCB0eXBlICksXG5cdFx0XHRuZXh0ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCBlbGVtLCB0eXBlICk7XG5cdFx0XHR9O1xuXG5cdFx0Ly8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbFxuXHRcdGlmICggZm4gPT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0c3RhcnRMZW5ndGgtLTtcblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXG5cdFx0XHQvLyBBZGQgYSBwcm9ncmVzcyBzZW50aW5lbCB0byBwcmV2ZW50IHRoZSBmeCBxdWV1ZSBmcm9tIGJlaW5nXG5cdFx0XHQvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiApIHtcblx0XHRcdFx0cXVldWUudW5zaGlmdCggXCJpbnByb2dyZXNzXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2xlYXIgdXAgdGhlIGxhc3QgcXVldWUgc3RvcCBmdW5jdGlvblxuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRmbi5jYWxsKCBlbGVtLCBuZXh0LCBob29rcyApO1xuXHRcdH1cblxuXHRcdGlmICggIXN0YXJ0TGVuZ3RoICYmIGhvb2tzICkge1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSgpO1xuXHRcdH1cblx0fSxcblxuXHQvLyBOb3QgcHVibGljIC0gZ2VuZXJhdGUgYSBxdWV1ZUhvb2tzIG9iamVjdCwgb3IgcmV0dXJuIHRoZSBjdXJyZW50IG9uZVxuXHRfcXVldWVIb29rczogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKSB7XG5cdFx0dmFyIGtleSA9IHR5cGUgKyBcInF1ZXVlSG9va3NcIjtcblx0XHRyZXR1cm4gZGF0YVByaXYuZ2V0KCBlbGVtLCBrZXkgKSB8fCBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIGtleSwge1xuXHRcdFx0ZW1wdHk6IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLmFkZCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgWyB0eXBlICsgXCJxdWV1ZVwiLCBrZXkgXSApO1xuXHRcdFx0fSApXG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBzZXR0ZXIgPSAyO1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGRhdGEgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IFwiZnhcIjtcblx0XHRcdHNldHRlci0tO1xuXHRcdH1cblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA8IHNldHRlciApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucXVldWUoIHRoaXNbIDAgXSwgdHlwZSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcyA6XG5cdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTtcblxuXHRcdFx0XHQvLyBFbnN1cmUgYSBob29rcyBmb3IgdGhpcyBxdWV1ZVxuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiZnhcIiAmJiBxdWV1ZVsgMCBdICE9PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdH0sXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHR9ICk7XG5cdH0sXG5cdGNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0fSxcblxuXHQvLyBHZXQgYSBwcm9taXNlIHJlc29sdmVkIHdoZW4gcXVldWVzIG9mIGEgY2VydGFpbiB0eXBlXG5cdC8vIGFyZSBlbXB0aWVkIChmeCBpcyB0aGUgdHlwZSBieSBkZWZhdWx0KVxuXHRwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqICkge1xuXHRcdHZhciB0bXAsXG5cdFx0XHRjb3VudCA9IDEsXG5cdFx0XHRkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0ZWxlbWVudHMgPSB0aGlzLFxuXHRcdFx0aSA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0cmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICEoIC0tY291bnQgKSApIHtcblx0XHRcdFx0XHRkZWZlci5yZXNvbHZlV2l0aCggZWxlbWVudHMsIFsgZWxlbWVudHMgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG9iaiA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRtcCA9IGRhdGFQcml2LmdldCggZWxlbWVudHNbIGkgXSwgdHlwZSArIFwicXVldWVIb29rc1wiICk7XG5cdFx0XHRpZiAoIHRtcCAmJiB0bXAuZW1wdHkgKSB7XG5cdFx0XHRcdGNvdW50Kys7XG5cdFx0XHRcdHRtcC5lbXB0eS5hZGQoIHJlc29sdmUgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVzb2x2ZSgpO1xuXHRcdHJldHVybiBkZWZlci5wcm9taXNlKCBvYmogKTtcblx0fVxufSApO1xudmFyIHBudW0gPSAoIC9bKy1dPyg/OlxcZCpcXC58KVxcZCsoPzpbZUVdWystXT9cXGQrfCkvICkuc291cmNlO1xuXG52YXIgcmNzc051bSA9IG5ldyBSZWdFeHAoIFwiXig/OihbKy1dKT18KShcIiArIHBudW0gKyBcIikoW2EteiVdKikkXCIsIFwiaVwiICk7XG5cblxudmFyIGNzc0V4cGFuZCA9IFsgXCJUb3BcIiwgXCJSaWdodFwiLCBcIkJvdHRvbVwiLCBcIkxlZnRcIiBdO1xuXG52YXIgZG9jdW1lbnRFbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG5cblxuXHR2YXIgaXNBdHRhY2hlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cdFx0fSxcblx0XHRjb21wb3NlZCA9IHsgY29tcG9zZWQ6IHRydWUgfTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTErLCBFZGdlIDEyIC0gMTgrLCBpT1MgMTAuMCAtIDEwLjIgb25seVxuXHQvLyBDaGVjayBhdHRhY2htZW50IGFjcm9zcyBzaGFkb3cgRE9NIGJvdW5kYXJpZXMgd2hlbiBwb3NzaWJsZSAoZ2gtMzUwNClcblx0Ly8gU3VwcG9ydDogaU9TIDEwLjAtMTAuMiBvbmx5XG5cdC8vIEVhcmx5IGlPUyAxMCB2ZXJzaW9ucyBzdXBwb3J0IGBhdHRhY2hTaGFkb3dgIGJ1dCBub3QgYGdldFJvb3ROb2RlYCxcblx0Ly8gbGVhZGluZyB0byBlcnJvcnMuIFdlIG5lZWQgdG8gY2hlY2sgZm9yIGBnZXRSb290Tm9kZWAuXG5cdGlmICggZG9jdW1lbnRFbGVtZW50LmdldFJvb3ROb2RlICkge1xuXHRcdGlzQXR0YWNoZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApIHx8XG5cdFx0XHRcdGVsZW0uZ2V0Um9vdE5vZGUoIGNvbXBvc2VkICkgPT09IGVsZW0ub3duZXJEb2N1bWVudDtcblx0XHR9O1xuXHR9XG52YXIgaXNIaWRkZW5XaXRoaW5UcmVlID0gZnVuY3Rpb24oIGVsZW0sIGVsICkge1xuXG5cdFx0Ly8gaXNIaWRkZW5XaXRoaW5UcmVlIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGpRdWVyeSNmaWx0ZXIgZnVuY3Rpb247XG5cdFx0Ly8gaW4gdGhhdCBjYXNlLCBlbGVtZW50IHdpbGwgYmUgc2Vjb25kIGFyZ3VtZW50XG5cdFx0ZWxlbSA9IGVsIHx8IGVsZW07XG5cblx0XHQvLyBJbmxpbmUgc3R5bGUgdHJ1bXBzIGFsbFxuXHRcdHJldHVybiBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwibm9uZVwiIHx8XG5cdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwiXCIgJiZcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlLCBjaGVjayBjb21wdXRlZCBzdHlsZVxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTQzIC0gNDVcblx0XHRcdC8vIERpc2Nvbm5lY3RlZCBlbGVtZW50cyBjYW4gaGF2ZSBjb21wdXRlZCBkaXNwbGF5OiBub25lLCBzbyBmaXJzdCBjb25maXJtIHRoYXQgZWxlbSBpc1xuXHRcdFx0Ly8gaW4gdGhlIGRvY3VtZW50LlxuXHRcdFx0aXNBdHRhY2hlZCggZWxlbSApICYmXG5cblx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgPT09IFwibm9uZVwiO1xuXHR9O1xuXG5cblxuZnVuY3Rpb24gYWRqdXN0Q1NTKCBlbGVtLCBwcm9wLCB2YWx1ZVBhcnRzLCB0d2VlbiApIHtcblx0dmFyIGFkanVzdGVkLCBzY2FsZSxcblx0XHRtYXhJdGVyYXRpb25zID0gMjAsXG5cdFx0Y3VycmVudFZhbHVlID0gdHdlZW4gP1xuXHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5jdXIoKTtcblx0XHRcdH0gOlxuXHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wLCBcIlwiICk7XG5cdFx0XHR9LFxuXHRcdGluaXRpYWwgPSBjdXJyZW50VmFsdWUoKSxcblx0XHR1bml0ID0gdmFsdWVQYXJ0cyAmJiB2YWx1ZVBhcnRzWyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gPyBcIlwiIDogXCJweFwiICksXG5cblx0XHQvLyBTdGFydGluZyB2YWx1ZSBjb21wdXRhdGlvbiBpcyByZXF1aXJlZCBmb3IgcG90ZW50aWFsIHVuaXQgbWlzbWF0Y2hlc1xuXHRcdGluaXRpYWxJblVuaXQgPSBlbGVtLm5vZGVUeXBlICYmXG5cdFx0XHQoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSB8fCB1bml0ICE9PSBcInB4XCIgJiYgK2luaXRpYWwgKSAmJlxuXHRcdFx0cmNzc051bS5leGVjKCBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wICkgKTtcblxuXHRpZiAoIGluaXRpYWxJblVuaXQgJiYgaW5pdGlhbEluVW5pdFsgMyBdICE9PSB1bml0ICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTU0XG5cdFx0Ly8gSGFsdmUgdGhlIGl0ZXJhdGlvbiB0YXJnZXQgdmFsdWUgdG8gcHJldmVudCBpbnRlcmZlcmVuY2UgZnJvbSBDU1MgdXBwZXIgYm91bmRzIChnaC0yMTQ0KVxuXHRcdGluaXRpYWwgPSBpbml0aWFsIC8gMjtcblxuXHRcdC8vIFRydXN0IHVuaXRzIHJlcG9ydGVkIGJ5IGpRdWVyeS5jc3Ncblx0XHR1bml0ID0gdW5pdCB8fCBpbml0aWFsSW5Vbml0WyAzIF07XG5cblx0XHQvLyBJdGVyYXRpdmVseSBhcHByb3hpbWF0ZSBmcm9tIGEgbm9uemVybyBzdGFydGluZyBwb2ludFxuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbCB8fCAxO1xuXG5cdFx0d2hpbGUgKCBtYXhJdGVyYXRpb25zLS0gKSB7XG5cblx0XHRcdC8vIEV2YWx1YXRlIGFuZCB1cGRhdGUgb3VyIGJlc3QgZ3Vlc3MgKGRvdWJsaW5nIGd1ZXNzZXMgdGhhdCB6ZXJvIG91dCkuXG5cdFx0XHQvLyBGaW5pc2ggaWYgdGhlIHNjYWxlIGVxdWFscyBvciBjcm9zc2VzIDEgKG1ha2luZyB0aGUgb2xkKm5ldyBwcm9kdWN0IG5vbi1wb3NpdGl2ZSkuXG5cdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cdFx0XHRpZiAoICggMSAtIHNjYWxlICkgKiAoIDEgLSAoIHNjYWxlID0gY3VycmVudFZhbHVlKCkgLyBpbml0aWFsIHx8IDAuNSApICkgPD0gMCApIHtcblx0XHRcdFx0bWF4SXRlcmF0aW9ucyA9IDA7XG5cdFx0XHR9XG5cdFx0XHRpbml0aWFsSW5Vbml0ID0gaW5pdGlhbEluVW5pdCAvIHNjYWxlO1xuXG5cdFx0fVxuXG5cdFx0aW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgKiAyO1xuXHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB3ZSB1cGRhdGUgdGhlIHR3ZWVuIHByb3BlcnRpZXMgbGF0ZXIgb25cblx0XHR2YWx1ZVBhcnRzID0gdmFsdWVQYXJ0cyB8fCBbXTtcblx0fVxuXG5cdGlmICggdmFsdWVQYXJ0cyApIHtcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWxJblVuaXQgfHwgK2luaXRpYWwgfHwgMDtcblxuXHRcdC8vIEFwcGx5IHJlbGF0aXZlIG9mZnNldCAoKz0vLT0pIGlmIHNwZWNpZmllZFxuXHRcdGFkanVzdGVkID0gdmFsdWVQYXJ0c1sgMSBdID9cblx0XHRcdGluaXRpYWxJblVuaXQgKyAoIHZhbHVlUGFydHNbIDEgXSArIDEgKSAqIHZhbHVlUGFydHNbIDIgXSA6XG5cdFx0XHQrdmFsdWVQYXJ0c1sgMiBdO1xuXHRcdGlmICggdHdlZW4gKSB7XG5cdFx0XHR0d2Vlbi51bml0ID0gdW5pdDtcblx0XHRcdHR3ZWVuLnN0YXJ0ID0gaW5pdGlhbEluVW5pdDtcblx0XHRcdHR3ZWVuLmVuZCA9IGFkanVzdGVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gYWRqdXN0ZWQ7XG59XG5cblxudmFyIGRlZmF1bHREaXNwbGF5TWFwID0ge307XG5cbmZ1bmN0aW9uIGdldERlZmF1bHREaXNwbGF5KCBlbGVtICkge1xuXHR2YXIgdGVtcCxcblx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsXG5cdFx0bm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLFxuXHRcdGRpc3BsYXkgPSBkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXTtcblxuXHRpZiAoIGRpc3BsYXkgKSB7XG5cdFx0cmV0dXJuIGRpc3BsYXk7XG5cdH1cblxuXHR0ZW1wID0gZG9jLmJvZHkuYXBwZW5kQ2hpbGQoIGRvYy5jcmVhdGVFbGVtZW50KCBub2RlTmFtZSApICk7XG5cdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCB0ZW1wLCBcImRpc3BsYXlcIiApO1xuXG5cdHRlbXAucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGVtcCApO1xuXG5cdGlmICggZGlzcGxheSA9PT0gXCJub25lXCIgKSB7XG5cdFx0ZGlzcGxheSA9IFwiYmxvY2tcIjtcblx0fVxuXHRkZWZhdWx0RGlzcGxheU1hcFsgbm9kZU5hbWUgXSA9IGRpc3BsYXk7XG5cblx0cmV0dXJuIGRpc3BsYXk7XG59XG5cbmZ1bmN0aW9uIHNob3dIaWRlKCBlbGVtZW50cywgc2hvdyApIHtcblx0dmFyIGRpc3BsYXksIGVsZW0sXG5cdFx0dmFsdWVzID0gW10sXG5cdFx0aW5kZXggPSAwLFxuXHRcdGxlbmd0aCA9IGVsZW1lbnRzLmxlbmd0aDtcblxuXHQvLyBEZXRlcm1pbmUgbmV3IGRpc3BsYXkgdmFsdWUgZm9yIGVsZW1lbnRzIHRoYXQgbmVlZCB0byBjaGFuZ2Vcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XG5cdFx0aWYgKCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7XG5cdFx0aWYgKCBzaG93ICkge1xuXG5cdFx0XHQvLyBTaW5jZSB3ZSBmb3JjZSB2aXNpYmlsaXR5IHVwb24gY2FzY2FkZS1oaWRkZW4gZWxlbWVudHMsIGFuIGltbWVkaWF0ZSAoYW5kIHNsb3cpXG5cdFx0XHQvLyBjaGVjayBpcyByZXF1aXJlZCBpbiB0aGlzIGZpcnN0IGxvb3AgdW5sZXNzIHdlIGhhdmUgYSBub25lbXB0eSBkaXNwbGF5IHZhbHVlIChlaXRoZXJcblx0XHRcdC8vIGlubGluZSBvciBhYm91dC10by1iZS1yZXN0b3JlZClcblx0XHRcdGlmICggZGlzcGxheSA9PT0gXCJub25lXCIgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJkaXNwbGF5XCIgKSB8fCBudWxsO1xuXHRcdFx0XHRpZiAoICF2YWx1ZXNbIGluZGV4IF0gKSB7XG5cdFx0XHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwiXCIgJiYgaXNIaWRkZW5XaXRoaW5UcmVlKCBlbGVtICkgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IGdldERlZmF1bHREaXNwbGF5KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggZGlzcGxheSAhPT0gXCJub25lXCIgKSB7XG5cdFx0XHRcdHZhbHVlc1sgaW5kZXggXSA9IFwibm9uZVwiO1xuXG5cdFx0XHRcdC8vIFJlbWVtYmVyIHdoYXQgd2UncmUgb3ZlcndyaXRpbmdcblx0XHRcdFx0ZGF0YVByaXYuc2V0KCBlbGVtLCBcImRpc3BsYXlcIiwgZGlzcGxheSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcCB0byBhdm9pZCBjb25zdGFudCByZWZsb3dcblx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoIHZhbHVlc1sgaW5kZXggXSAhPSBudWxsICkge1xuXHRcdFx0ZWxlbWVudHNbIGluZGV4IF0uc3R5bGUuZGlzcGxheSA9IHZhbHVlc1sgaW5kZXggXTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudHM7XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0c2hvdzogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzLCB0cnVlICk7XG5cdH0sXG5cdGhpZGU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcyApO1xuXHR9LFxuXHR0b2dnbGU6IGZ1bmN0aW9uKCBzdGF0ZSApIHtcblx0XHRpZiAoIHR5cGVvZiBzdGF0ZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGUgPyB0aGlzLnNob3coKSA6IHRoaXMuaGlkZSgpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBpc0hpZGRlbldpdGhpblRyZWUoIHRoaXMgKSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuc2hvdygpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuaGlkZSgpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxufSApO1xudmFyIHJjaGVja2FibGVUeXBlID0gKCAvXig/OmNoZWNrYm94fHJhZGlvKSQvaSApO1xuXG52YXIgcnRhZ05hbWUgPSAoIC88KFthLXpdW15cXC9cXDA+XFx4MjBcXHRcXHJcXG5cXGZdKikvaSApO1xuXG52YXIgcnNjcmlwdFR5cGUgPSAoIC9eJHxebW9kdWxlJHxcXC8oPzpqYXZhfGVjbWEpc2NyaXB0L2kgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIG9ubHlcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHQvLyBJRSA8PTkgcmVwbGFjZXMgPG9wdGlvbj4gdGFncyB3aXRoIHRoZWlyIGNvbnRlbnRzIHdoZW4gaW5zZXJ0ZWQgb3V0c2lkZSBvZlxuXHQvLyB0aGUgc2VsZWN0IGVsZW1lbnQuXG5cdGRpdi5pbm5lckhUTUwgPSBcIjxvcHRpb24+PC9vcHRpb24+XCI7XG5cdHN1cHBvcnQub3B0aW9uID0gISFkaXYubGFzdENoaWxkO1xufSApKCk7XG5cblxuLy8gV2UgaGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1cHBvcnQgWEhUTUwgKCMxMzIwMClcbnZhciB3cmFwTWFwID0ge1xuXG5cdC8vIFhIVE1MIHBhcnNlcnMgZG8gbm90IG1hZ2ljYWxseSBpbnNlcnQgZWxlbWVudHMgaW4gdGhlXG5cdC8vIHNhbWUgd2F5IHRoYXQgdGFnIHNvdXAgcGFyc2VycyBkby4gU28gd2UgY2Fubm90IHNob3J0ZW5cblx0Ly8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLlxuXHR0aGVhZDogWyAxLCBcIjx0YWJsZT5cIiwgXCI8L3RhYmxlPlwiIF0sXG5cdGNvbDogWyAyLCBcIjx0YWJsZT48Y29sZ3JvdXA+XCIsIFwiPC9jb2xncm91cD48L3RhYmxlPlwiIF0sXG5cdHRyOiBbIDIsIFwiPHRhYmxlPjx0Ym9keT5cIiwgXCI8L3Rib2R5PjwvdGFibGU+XCIgXSxcblx0dGQ6IFsgMywgXCI8dGFibGU+PHRib2R5Pjx0cj5cIiwgXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXG5cdF9kZWZhdWx0OiBbIDAsIFwiXCIsIFwiXCIgXVxufTtcblxud3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDtcbndyYXBNYXAudGggPSB3cmFwTWFwLnRkO1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuaWYgKCAhc3VwcG9ydC5vcHRpb24gKSB7XG5cdHdyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbiA9IFsgMSwgXCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+XCIsIFwiPC9zZWxlY3Q+XCIgXTtcbn1cblxuXG5mdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdC8vIFVzZSB0eXBlb2YgdG8gYXZvaWQgemVyby1hcmd1bWVudCBtZXRob2QgaW52b2NhdGlvbiBvbiBob3N0IG9iamVjdHMgKCMxNTE1MSlcblx0dmFyIHJldDtcblxuXHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCBcIipcIiApO1xuXG5cdH0gZWxzZSBpZiAoIHR5cGVvZiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0cmV0ID0gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2Uge1xuXHRcdHJldCA9IFtdO1xuXHR9XG5cblx0aWYgKCB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgbm9kZU5hbWUoIGNvbnRleHQsIHRhZyApICkge1xuXHRcdHJldHVybiBqUXVlcnkubWVyZ2UoIFsgY29udGV4dCBdLCByZXQgKTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59XG5cblxuLy8gTWFyayBzY3JpcHRzIGFzIGhhdmluZyBhbHJlYWR5IGJlZW4gZXZhbHVhdGVkXG5mdW5jdGlvbiBzZXRHbG9iYWxFdmFsKCBlbGVtcywgcmVmRWxlbWVudHMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRkYXRhUHJpdi5zZXQoXG5cdFx0XHRlbGVtc1sgaSBdLFxuXHRcdFx0XCJnbG9iYWxFdmFsXCIsXG5cdFx0XHQhcmVmRWxlbWVudHMgfHwgZGF0YVByaXYuZ2V0KCByZWZFbGVtZW50c1sgaSBdLCBcImdsb2JhbEV2YWxcIiApXG5cdFx0KTtcblx0fVxufVxuXG5cbnZhciByaHRtbCA9IC88fCYjP1xcdys7LztcblxuZnVuY3Rpb24gYnVpbGRGcmFnbWVudCggZWxlbXMsIGNvbnRleHQsIHNjcmlwdHMsIHNlbGVjdGlvbiwgaWdub3JlZCApIHtcblx0dmFyIGVsZW0sIHRtcCwgdGFnLCB3cmFwLCBhdHRhY2hlZCwgaixcblx0XHRmcmFnbWVudCA9IGNvbnRleHQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLFxuXHRcdG5vZGVzID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1zWyBpIF07XG5cblx0XHRpZiAoIGVsZW0gfHwgZWxlbSA9PT0gMCApIHtcblxuXHRcdFx0Ly8gQWRkIG5vZGVzIGRpcmVjdGx5XG5cdFx0XHRpZiAoIHRvVHlwZSggZWxlbSApID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIGVsZW0ubm9kZVR5cGUgPyBbIGVsZW0gXSA6IGVsZW0gKTtcblxuXHRcdFx0Ly8gQ29udmVydCBub24taHRtbCBpbnRvIGEgdGV4dCBub2RlXG5cdFx0XHR9IGVsc2UgaWYgKCAhcmh0bWwudGVzdCggZWxlbSApICkge1xuXHRcdFx0XHRub2Rlcy5wdXNoKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBlbGVtICkgKTtcblxuXHRcdFx0Ly8gQ29udmVydCBodG1sIGludG8gRE9NIG5vZGVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0bXAgPSB0bXAgfHwgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICk7XG5cblx0XHRcdFx0Ly8gRGVzZXJpYWxpemUgYSBzdGFuZGFyZCByZXByZXNlbnRhdGlvblxuXHRcdFx0XHR0YWcgPSAoIHJ0YWdOYW1lLmV4ZWMoIGVsZW0gKSB8fCBbIFwiXCIsIFwiXCIgXSApWyAxIF0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0d3JhcCA9IHdyYXBNYXBbIHRhZyBdIHx8IHdyYXBNYXAuX2RlZmF1bHQ7XG5cdFx0XHRcdHRtcC5pbm5lckhUTUwgPSB3cmFwWyAxIF0gKyBqUXVlcnkuaHRtbFByZWZpbHRlciggZWxlbSApICsgd3JhcFsgMiBdO1xuXG5cdFx0XHRcdC8vIERlc2NlbmQgdGhyb3VnaCB3cmFwcGVycyB0byB0aGUgcmlnaHQgY29udGVudFxuXHRcdFx0XHRqID0gd3JhcFsgMCBdO1xuXHRcdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0XHR0bXAgPSB0bXAubGFzdENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgdG1wLmNoaWxkTm9kZXMgKTtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB0aGUgdG9wLWxldmVsIGNvbnRhaW5lclxuXHRcdFx0XHR0bXAgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSB0aGUgY3JlYXRlZCBub2RlcyBhcmUgb3JwaGFuZWQgKCMxMjM5Milcblx0XHRcdFx0dG1wLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZW1vdmUgd3JhcHBlciBmcm9tIGZyYWdtZW50XG5cdGZyYWdtZW50LnRleHRDb250ZW50ID0gXCJcIjtcblxuXHRpID0gMDtcblx0d2hpbGUgKCAoIGVsZW0gPSBub2Rlc1sgaSsrIF0gKSApIHtcblxuXHRcdC8vIFNraXAgZWxlbWVudHMgYWxyZWFkeSBpbiB0aGUgY29udGV4dCBjb2xsZWN0aW9uICh0cmFjLTQwODcpXG5cdFx0aWYgKCBzZWxlY3Rpb24gJiYgalF1ZXJ5LmluQXJyYXkoIGVsZW0sIHNlbGVjdGlvbiApID4gLTEgKSB7XG5cdFx0XHRpZiAoIGlnbm9yZWQgKSB7XG5cdFx0XHRcdGlnbm9yZWQucHVzaCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0YXR0YWNoZWQgPSBpc0F0dGFjaGVkKCBlbGVtICk7XG5cblx0XHQvLyBBcHBlbmQgdG8gZnJhZ21lbnRcblx0XHR0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksIFwic2NyaXB0XCIgKTtcblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRpZiAoIGF0dGFjaGVkICkge1xuXHRcdFx0c2V0R2xvYmFsRXZhbCggdG1wICk7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FwdHVyZSBleGVjdXRhYmxlc1xuXHRcdGlmICggc2NyaXB0cyApIHtcblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0bXBbIGorKyBdICkgKSB7XG5cdFx0XHRcdGlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8IFwiXCIgKSApIHtcblx0XHRcdFx0XHRzY3JpcHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmcmFnbWVudDtcbn1cblxuXG52YXIgcnR5cGVuYW1lc3BhY2UgPSAvXihbXi5dKikoPzpcXC4oLispfCkvO1xuXG5mdW5jdGlvbiByZXR1cm5UcnVlKCkge1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLy8gU3VwcG9ydDogSUUgPD05IC0gMTErXG4vLyBmb2N1cygpIGFuZCBibHVyKCkgYXJlIGFzeW5jaHJvbm91cywgZXhjZXB0IHdoZW4gdGhleSBhcmUgbm8tb3AuXG4vLyBTbyBleHBlY3QgZm9jdXMgdG8gYmUgc3luY2hyb25vdXMgd2hlbiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGFjdGl2ZSxcbi8vIGFuZCBibHVyIHRvIGJlIHN5bmNocm9ub3VzIHdoZW4gdGhlIGVsZW1lbnQgaXMgbm90IGFscmVhZHkgYWN0aXZlLlxuLy8gKGZvY3VzIGFuZCBibHVyIGFyZSBhbHdheXMgc3luY2hyb25vdXMgaW4gb3RoZXIgc3VwcG9ydGVkIGJyb3dzZXJzLFxuLy8gdGhpcyBqdXN0IGRlZmluZXMgd2hlbiB3ZSBjYW4gY291bnQgb24gaXQpLlxuZnVuY3Rpb24gZXhwZWN0U3luYyggZWxlbSwgdHlwZSApIHtcblx0cmV0dXJuICggZWxlbSA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSApID09PSAoIHR5cGUgPT09IFwiZm9jdXNcIiApO1xufVxuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gQWNjZXNzaW5nIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgY2FuIHRocm93IHVuZXhwZWN0ZWRseVxuLy8gaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzkzXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG5mdW5jdGlvbiBvbiggZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkge1xuXHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cblx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vICggdHlwZXMsIGRhdGEsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRvcmlnRm4gPSBmbjtcblx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9O1xuXG5cdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0fVxuXHRyZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdH0gKTtcbn1cblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS5cbiAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuXG4gKi9cbmpRdWVyeS5ldmVudCA9IHtcblxuXHRnbG9iYWw6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHtcblxuXHRcdHZhciBoYW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIE9ubHkgYXR0YWNoIGV2ZW50cyB0byBvYmplY3RzIHRoYXQgYWNjZXB0IGRhdGFcblx0XHRpZiAoICFhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZVxuXHRcdC8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KVxuXHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGRvY3VtZW50RWxlbWVudCwgc2VsZWN0b3IgKTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0gT2JqZWN0LmNyZWF0ZSggbnVsbCApO1xuXHRcdH1cblx0XHRpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7XG5cdFx0XHRldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSA9IGZ1bmN0aW9uKCBlICkge1xuXG5cdFx0XHRcdC8vIERpc2NhcmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkgYW5kXG5cdFx0XHRcdC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWRcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09IFwidW5kZWZpbmVkXCIgJiYgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCAhPT0gZS50eXBlID9cblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuZGlzcGF0Y2guYXBwbHkoIGVsZW0sIGFyZ3VtZW50cyApIDogdW5kZWZpbmVkO1xuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFRoZXJlICptdXN0KiBiZSBhIHR5cGUsIG5vIGF0dGFjaGluZyBuYW1lc3BhY2Utb25seSBoYW5kbGVyc1xuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4gdHlwZVxuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnNcblx0XHRcdGhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0b3JpZ1R5cGU6IG9yaWdUeXBlLFxuXHRcdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0XHRoYW5kbGVyOiBoYW5kbGVyLFxuXHRcdFx0XHRndWlkOiBoYW5kbGVyLmd1aWQsXG5cdFx0XHRcdHNlbGVjdG9yOiBzZWxlY3Rvcixcblx0XHRcdFx0bmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSxcblx0XHRcdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oIFwiLlwiIClcblx0XHRcdH0sIGhhbmRsZU9iakluICk7XG5cblx0XHRcdC8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0XG5cdFx0XHRpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHtcblx0XHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IFtdO1xuXHRcdFx0XHRoYW5kbGVycy5kZWxlZ2F0ZUNvdW50ID0gMDtcblxuXHRcdFx0XHQvLyBPbmx5IHVzZSBhZGRFdmVudExpc3RlbmVyIGlmIHRoZSBzcGVjaWFsIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2Vcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC5zZXR1cCB8fFxuXHRcdFx0XHRcdHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRcdFx0XHRcdGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzcGVjaWFsLmFkZCApIHtcblx0XHRcdFx0c3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cblx0XHRcdFx0aWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdCwgZGVsZWdhdGVzIGluIGZyb250XG5cdFx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxlT2JqICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBldmVyIGJlZW4gdXNlZCwgZm9yIGV2ZW50IG9wdGltaXphdGlvblxuXHRcdFx0alF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTtcblx0XHR9XG5cblx0fSxcblxuXHQvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnRcblx0cmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIHNlbGVjdG9yLCBtYXBwZWRUeXBlcyApIHtcblxuXHRcdHZhciBqLCBvcmlnQ291bnQsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHRpZiAoICFlbGVtRGF0YSB8fCAhKCBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudFxuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSB8fCBbXTtcblx0XHRcdHRtcCA9IHRtcFsgMiBdICYmXG5cdFx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApO1xuXG5cdFx0XHQvLyBSZW1vdmUgbWF0Y2hpbmcgZXZlbnRzXG5cdFx0XHRvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07XG5cblx0XHRcdFx0aWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJlxuXHRcdFx0XHRcdCggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmXG5cdFx0XHRcdFx0KCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJlxuXHRcdFx0XHRcdCggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHxcblx0XHRcdFx0XHRcdHNlbGVjdG9yID09PSBcIioqXCIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7XG5cdFx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7XG5cblx0XHRcdFx0XHRpZiAoIGhhbmRsZU9iai5zZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBzcGVjaWFsLnJlbW92ZSApIHtcblx0XHRcdFx0XHRcdHNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIHdlIHJlbW92ZWQgc29tZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4aXN0XG5cdFx0XHQvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycylcblx0XHRcdGlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRcdGlmICggIXNwZWNpYWwudGVhcmRvd24gfHxcblx0XHRcdFx0XHRzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZWxldGUgZXZlbnRzWyB0eXBlIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIGRhdGEgYW5kIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWRcblx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHtcblx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJoYW5kbGUgZXZlbnRzXCIgKTtcblx0XHR9XG5cdH0sXG5cblx0ZGlzcGF0Y2g6IGZ1bmN0aW9uKCBuYXRpdmVFdmVudCApIHtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaiwgaGFuZGxlclF1ZXVlLFxuXHRcdFx0YXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLFxuXG5cdFx0XHQvLyBNYWtlIGEgd3JpdGFibGUgalF1ZXJ5LkV2ZW50IGZyb20gdGhlIG5hdGl2ZSBldmVudCBvYmplY3Rcblx0XHRcdGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggbmF0aXZlRXZlbnQgKSxcblxuXHRcdFx0aGFuZGxlcnMgPSAoXG5cdFx0XHRcdGRhdGFQcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IE9iamVjdC5jcmVhdGUoIG51bGwgKVxuXHRcdFx0KVsgZXZlbnQudHlwZSBdIHx8IFtdLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyBldmVudC50eXBlIF0gfHwge307XG5cblx0XHQvLyBVc2UgdGhlIGZpeC1lZCBqUXVlcnkuRXZlbnQgcmF0aGVyIHRoYW4gdGhlIChyZWFkLW9ubHkpIG5hdGl2ZSBldmVudFxuXHRcdGFyZ3NbIDAgXSA9IGV2ZW50O1xuXG5cdFx0Zm9yICggaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRhcmdzWyBpIF0gPSBhcmd1bWVudHNbIGkgXTtcblx0XHR9XG5cblx0XHRldmVudC5kZWxlZ2F0ZVRhcmdldCA9IHRoaXM7XG5cblx0XHQvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkXG5cdFx0aWYgKCBzcGVjaWFsLnByZURpc3BhdGNoICYmIHNwZWNpYWwucHJlRGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGhhbmRsZXJzXG5cdFx0aGFuZGxlclF1ZXVlID0galF1ZXJ5LmV2ZW50LmhhbmRsZXJzLmNhbGwoIHRoaXMsIGV2ZW50LCBoYW5kbGVycyApO1xuXG5cdFx0Ly8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkgd2FudCB0byBzdG9wIHByb3BhZ2F0aW9uIGJlbmVhdGggdXNcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggbWF0Y2hlZCA9IGhhbmRsZXJRdWV1ZVsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07XG5cblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiZcblx0XHRcdFx0IWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGV2ZW50IGlzIG5hbWVzcGFjZWQsIHRoZW4gZWFjaCBoYW5kbGVyIGlzIG9ubHkgaW52b2tlZCBpZiBpdCBpc1xuXHRcdFx0XHQvLyBzcGVjaWFsbHkgdW5pdmVyc2FsIG9yIGl0cyBuYW1lc3BhY2VzIGFyZSBhIHN1cGVyc2V0IG9mIHRoZSBldmVudCdzLlxuXHRcdFx0XHRpZiAoICFldmVudC5ybmFtZXNwYWNlIHx8IGhhbmRsZU9iai5uYW1lc3BhY2UgPT09IGZhbHNlIHx8XG5cdFx0XHRcdFx0ZXZlbnQucm5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fFxuXHRcdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIgKS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIGhhbmRsZU9iaiwgc2VsLCBtYXRjaGVkSGFuZGxlcnMsIG1hdGNoZWRTZWxlY3RvcnMsXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTlcblx0XHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICh0cmFjLTEzMTgwKVxuXHRcdFx0Y3VyLm5vZGVUeXBlICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MlxuXHRcdFx0Ly8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnQtdHlwZS1jbGlja1xuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0Ly8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgXCJjbGlja3NcIiBvZiByYWRpbyBpbnB1dHMsIHdoaWNoIGNhbiBoYXZlIGBidXR0b25gIC0xIChnaC0yMzQzKVxuXHRcdFx0ISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGV2ZW50LmJ1dHRvbiA+PSAxICkgKSB7XG5cblx0XHRcdGZvciAoIDsgY3VyICE9PSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGN1ci5kaXNhYmxlZCA9PT0gdHJ1ZSApICkge1xuXHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycyA9IFtdO1xuXHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnMgPSB7fTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID4gLTEgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggbWF0Y2hlZEhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZWRIYW5kbGVycyB9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xuXHRcdGN1ciA9IHRoaXM7XG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhhbmRsZXJRdWV1ZTtcblx0fSxcblxuXHRhZGRQcm9wOiBmdW5jdGlvbiggbmFtZSwgaG9vayApIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGpRdWVyeS5FdmVudC5wcm90b3R5cGUsIG5hbWUsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogaXNGdW5jdGlvbiggaG9vayApID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gaG9vayggdGhpcy5vcmlnaW5hbEV2ZW50ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IDpcblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50WyBuYW1lIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCBuYW1lLCB7XG5cdFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0d3JpdGFibGU6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0Zml4OiBmdW5jdGlvbiggb3JpZ2luYWxFdmVudCApIHtcblx0XHRyZXR1cm4gb3JpZ2luYWxFdmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/XG5cdFx0XHRvcmlnaW5hbEV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIG9yaWdpbmFsRXZlbnQgKTtcblx0fSxcblxuXHRzcGVjaWFsOiB7XG5cdFx0bG9hZDoge1xuXG5cdFx0XHQvLyBQcmV2ZW50IHRyaWdnZXJlZCBpbWFnZS5sb2FkIGV2ZW50cyBmcm9tIGJ1YmJsaW5nIHRvIHdpbmRvdy5sb2FkXG5cdFx0XHRub0J1YmJsZTogdHJ1ZVxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gVXRpbGl6ZSBuYXRpdmUgZXZlbnQgdG8gZW5zdXJlIGNvcnJlY3Qgc3RhdGUgZm9yIGNoZWNrYWJsZSBpbnB1dHNcblx0XHRcdHNldHVwOiBmdW5jdGlvbiggZGF0YSApIHtcblxuXHRcdFx0XHQvLyBGb3IgbXV0dWFsIGNvbXByZXNzaWJpbGl0eSB3aXRoIF9kZWZhdWx0LCByZXBsYWNlIGB0aGlzYCBhY2Nlc3Mgd2l0aCBhIGxvY2FsIHZhci5cblx0XHRcdFx0Ly8gYHx8IGRhdGFgIGlzIGRlYWQgY29kZSBtZWFudCBvbmx5IHRvIHByZXNlcnZlIHRoZSB2YXJpYWJsZSB0aHJvdWdoIG1pbmlmaWNhdGlvbi5cblx0XHRcdFx0dmFyIGVsID0gdGhpcyB8fCBkYXRhO1xuXG5cdFx0XHRcdC8vIENsYWltIHRoZSBmaXJzdCBoYW5kbGVyXG5cdFx0XHRcdGlmICggcmNoZWNrYWJsZVR5cGUudGVzdCggZWwudHlwZSApICYmXG5cdFx0XHRcdFx0ZWwuY2xpY2sgJiYgbm9kZU5hbWUoIGVsLCBcImlucHV0XCIgKSApIHtcblxuXHRcdFx0XHRcdC8vIGRhdGFQcml2LnNldCggZWwsIFwiY2xpY2tcIiwgLi4uIClcblx0XHRcdFx0XHRsZXZlcmFnZU5hdGl2ZSggZWwsIFwiY2xpY2tcIiwgcmV0dXJuVHJ1ZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBwcm9jZXNzaW5nIGluIHRoZSBjYWxsZXJcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSxcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCBkYXRhICkge1xuXG5cdFx0XHRcdC8vIEZvciBtdXR1YWwgY29tcHJlc3NpYmlsaXR5IHdpdGggX2RlZmF1bHQsIHJlcGxhY2UgYHRoaXNgIGFjY2VzcyB3aXRoIGEgbG9jYWwgdmFyLlxuXHRcdFx0XHQvLyBgfHwgZGF0YWAgaXMgZGVhZCBjb2RlIG1lYW50IG9ubHkgdG8gcHJlc2VydmUgdGhlIHZhcmlhYmxlIHRocm91Z2ggbWluaWZpY2F0aW9uLlxuXHRcdFx0XHR2YXIgZWwgPSB0aGlzIHx8IGRhdGE7XG5cblx0XHRcdFx0Ly8gRm9yY2Ugc2V0dXAgYmVmb3JlIHRyaWdnZXJpbmcgYSBjbGlja1xuXHRcdFx0XHRpZiAoIHJjaGVja2FibGVUeXBlLnRlc3QoIGVsLnR5cGUgKSAmJlxuXHRcdFx0XHRcdGVsLmNsaWNrICYmIG5vZGVOYW1lKCBlbCwgXCJpbnB1dFwiICkgKSB7XG5cblx0XHRcdFx0XHRsZXZlcmFnZU5hdGl2ZSggZWwsIFwiY2xpY2tcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmV0dXJuIG5vbi1mYWxzZSB0byBhbGxvdyBub3JtYWwgZXZlbnQtcGF0aCBwcm9wYWdhdGlvblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0sXG5cblx0XHRcdC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5LCBzdXBwcmVzcyBuYXRpdmUgLmNsaWNrKCkgb24gbGlua3Ncblx0XHRcdC8vIEFsc28gcHJldmVudCBpdCBpZiB3ZSdyZSBjdXJyZW50bHkgaW5zaWRlIGEgbGV2ZXJhZ2VkIG5hdGl2ZS1ldmVudCBzdGFja1xuXHRcdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcblx0XHRcdFx0cmV0dXJuIHJjaGVja2FibGVUeXBlLnRlc3QoIHRhcmdldC50eXBlICkgJiZcblx0XHRcdFx0XHR0YXJnZXQuY2xpY2sgJiYgbm9kZU5hbWUoIHRhcmdldCwgXCJpbnB1dFwiICkgJiZcblx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRhcmdldCwgXCJjbGlja1wiICkgfHxcblx0XHRcdFx0XHRub2RlTmFtZSggdGFyZ2V0LCBcImFcIiApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRiZWZvcmV1bmxvYWQ6IHtcblx0XHRcdHBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggMjArXG5cdFx0XHRcdC8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC5cblx0XHRcdFx0aWYgKCBldmVudC5yZXN1bHQgIT09IHVuZGVmaW5lZCAmJiBldmVudC5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdGV2ZW50Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWUgPSBldmVudC5yZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbi8vIEVuc3VyZSB0aGUgcHJlc2VuY2Ugb2YgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBoYW5kbGVzIG1hbnVhbGx5LXRyaWdnZXJlZFxuLy8gc3ludGhldGljIGV2ZW50cyBieSBpbnRlcnJ1cHRpbmcgcHJvZ3Jlc3MgdW50aWwgcmVpbnZva2VkIGluIHJlc3BvbnNlIHRvXG4vLyAqbmF0aXZlKiBldmVudHMgdGhhdCBpdCBmaXJlcyBkaXJlY3RseSwgZW5zdXJpbmcgdGhhdCBzdGF0ZSBjaGFuZ2VzIGhhdmVcbi8vIGFscmVhZHkgb2NjdXJyZWQgYmVmb3JlIG90aGVyIGxpc3RlbmVycyBhcmUgaW52b2tlZC5cbmZ1bmN0aW9uIGxldmVyYWdlTmF0aXZlKCBlbCwgdHlwZSwgZXhwZWN0U3luYyApIHtcblxuXHQvLyBNaXNzaW5nIGV4cGVjdFN5bmMgaW5kaWNhdGVzIGEgdHJpZ2dlciBjYWxsLCB3aGljaCBtdXN0IGZvcmNlIHNldHVwIHRocm91Z2ggalF1ZXJ5LmV2ZW50LmFkZFxuXHRpZiAoICFleHBlY3RTeW5jICkge1xuXHRcdGlmICggZGF0YVByaXYuZ2V0KCBlbCwgdHlwZSApID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBlbCwgdHlwZSwgcmV0dXJuVHJ1ZSApO1xuXHRcdH1cblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBSZWdpc3RlciB0aGUgY29udHJvbGxlciBhcyBhIHNwZWNpYWwgdW5pdmVyc2FsIGhhbmRsZXIgZm9yIGFsbCBldmVudCBuYW1lc3BhY2VzXG5cdGRhdGFQcml2LnNldCggZWwsIHR5cGUsIGZhbHNlICk7XG5cdGpRdWVyeS5ldmVudC5hZGQoIGVsLCB0eXBlLCB7XG5cdFx0bmFtZXNwYWNlOiBmYWxzZSxcblx0XHRoYW5kbGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR2YXIgbm90QXN5bmMsIHJlc3VsdCxcblx0XHRcdFx0c2F2ZWQgPSBkYXRhUHJpdi5nZXQoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0aWYgKCAoIGV2ZW50LmlzVHJpZ2dlciAmIDEgKSAmJiB0aGlzWyB0eXBlIF0gKSB7XG5cblx0XHRcdFx0Ly8gSW50ZXJydXB0IHByb2Nlc3Npbmcgb2YgdGhlIG91dGVyIHN5bnRoZXRpYyAudHJpZ2dlcigpZWQgZXZlbnRcblx0XHRcdFx0Ly8gU2F2ZWQgZGF0YSBzaG91bGQgYmUgZmFsc2UgaW4gc3VjaCBjYXNlcywgYnV0IG1pZ2h0IGJlIGEgbGVmdG92ZXIgY2FwdHVyZSBvYmplY3Rcblx0XHRcdFx0Ly8gZnJvbSBhbiBhc3luYyBuYXRpdmUgaGFuZGxlciAoZ2gtNDM1MClcblx0XHRcdFx0aWYgKCAhc2F2ZWQubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgYXJndW1lbnRzIGZvciB1c2Ugd2hlbiBoYW5kbGluZyB0aGUgaW5uZXIgbmF0aXZlIGV2ZW50XG5cdFx0XHRcdFx0Ly8gVGhlcmUgd2lsbCBhbHdheXMgYmUgYXQgbGVhc3Qgb25lIGFyZ3VtZW50IChhbiBldmVudCBvYmplY3QpLCBzbyB0aGlzIGFycmF5XG5cdFx0XHRcdFx0Ly8gd2lsbCBub3QgYmUgY29uZnVzZWQgd2l0aCBhIGxlZnRvdmVyIGNhcHR1cmUgb2JqZWN0LlxuXHRcdFx0XHRcdHNhdmVkID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCB0eXBlLCBzYXZlZCApO1xuXG5cdFx0XHRcdFx0Ly8gVHJpZ2dlciB0aGUgbmF0aXZlIGV2ZW50IGFuZCBjYXB0dXJlIGl0cyByZXN1bHRcblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMStcblx0XHRcdFx0XHQvLyBmb2N1cygpIGFuZCBibHVyKCkgYXJlIGFzeW5jaHJvbm91c1xuXHRcdFx0XHRcdG5vdEFzeW5jID0gZXhwZWN0U3luYyggdGhpcywgdHlwZSApO1xuXHRcdFx0XHRcdHRoaXNbIHR5cGUgXSgpO1xuXHRcdFx0XHRcdHJlc3VsdCA9IGRhdGFQcml2LmdldCggdGhpcywgdHlwZSApO1xuXHRcdFx0XHRcdGlmICggc2F2ZWQgIT09IHJlc3VsdCB8fCBub3RBc3luYyApIHtcblx0XHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgdHlwZSwgZmFsc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmVzdWx0ID0ge307XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggc2F2ZWQgIT09IHJlc3VsdCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2FuY2VsIHRoZSBvdXRlciBzeW50aGV0aWMgZXZlbnRcblx0XHRcdFx0XHRcdGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDg2K1xuXHRcdFx0XHRcdFx0Ly8gSW4gQ2hyb21lLCBpZiBhbiBlbGVtZW50IGhhdmluZyBhIGZvY3Vzb3V0IGhhbmRsZXIgaXMgYmx1cnJlZCBieVxuXHRcdFx0XHRcdFx0Ly8gY2xpY2tpbmcgb3V0c2lkZSBvZiBpdCwgaXQgaW52b2tlcyB0aGUgaGFuZGxlciBzeW5jaHJvbm91c2x5LiBJZlxuXHRcdFx0XHRcdFx0Ly8gdGhhdCBoYW5kbGVyIGNhbGxzIGAucmVtb3ZlKClgIG9uIHRoZSBlbGVtZW50LCB0aGUgZGF0YSBpcyBjbGVhcmVkLFxuXHRcdFx0XHRcdFx0Ly8gbGVhdmluZyBgcmVzdWx0YCB1bmRlZmluZWQuIFdlIG5lZWQgdG8gZ3VhcmQgYWdhaW5zdCB0aGlzLlxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdCAmJiByZXN1bHQudmFsdWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIElmIHRoaXMgaXMgYW4gaW5uZXIgc3ludGhldGljIGV2ZW50IGZvciBhbiBldmVudCB3aXRoIGEgYnViYmxpbmcgc3Vycm9nYXRlXG5cdFx0XHRcdC8vIChmb2N1cyBvciBibHVyKSwgYXNzdW1lIHRoYXQgdGhlIHN1cnJvZ2F0ZSBhbHJlYWR5IHByb3BhZ2F0ZWQgZnJvbSB0cmlnZ2VyaW5nIHRoZVxuXHRcdFx0XHQvLyBuYXRpdmUgZXZlbnQgYW5kIHByZXZlbnQgdGhhdCBmcm9tIGhhcHBlbmluZyBhZ2FpbiBoZXJlLlxuXHRcdFx0XHQvLyBUaGlzIHRlY2huaWNhbGx5IGdldHMgdGhlIG9yZGVyaW5nIHdyb25nIHcuci50LiB0byBgLnRyaWdnZXIoKWAgKGluIHdoaWNoIHRoZVxuXHRcdFx0XHQvLyBidWJibGluZyBzdXJyb2dhdGUgcHJvcGFnYXRlcyAqYWZ0ZXIqIHRoZSBub24tYnViYmxpbmcgYmFzZSksIGJ1dCB0aGF0IHNlZW1zXG5cdFx0XHRcdC8vIGxlc3MgYmFkIHRoYW4gZHVwbGljYXRpb24uXG5cdFx0XHRcdH0gZWxzZSBpZiAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fSApLmRlbGVnYXRlVHlwZSApIHtcblx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIGlzIGEgbmF0aXZlIGV2ZW50IHRyaWdnZXJlZCBhYm92ZSwgZXZlcnl0aGluZyBpcyBub3cgaW4gb3JkZXJcblx0XHRcdC8vIEZpcmUgYW4gaW5uZXIgc3ludGhldGljIGV2ZW50IHdpdGggdGhlIG9yaWdpbmFsIGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggc2F2ZWQubGVuZ3RoICkge1xuXG5cdFx0XHRcdC8vIC4uLmFuZCBjYXB0dXJlIHRoZSByZXN1bHRcblx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCB0eXBlLCB7XG5cdFx0XHRcdFx0dmFsdWU6IGpRdWVyeS5ldmVudC50cmlnZ2VyKFxuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMStcblx0XHRcdFx0XHRcdC8vIEV4dGVuZCB3aXRoIHRoZSBwcm90b3R5cGUgdG8gcmVzZXQgdGhlIGFib3ZlIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpXG5cdFx0XHRcdFx0XHRqUXVlcnkuZXh0ZW5kKCBzYXZlZFsgMCBdLCBqUXVlcnkuRXZlbnQucHJvdG90eXBlICksXG5cdFx0XHRcdFx0XHRzYXZlZC5zbGljZSggMSApLFxuXHRcdFx0XHRcdFx0dGhpc1xuXHRcdFx0XHRcdClcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdC8vIEFib3J0IGhhbmRsaW5nIG9mIHRoZSBuYXRpdmUgZXZlbnRcblx0XHRcdFx0ZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9ICk7XG59XG5cbmpRdWVyeS5yZW1vdmVFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7XG5cblx0Ly8gVGhpcyBcImlmXCIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzXG5cdGlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkge1xuXHRcdGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlICk7XG5cdH1cbn07XG5cbmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkge1xuXG5cdC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZFxuXHRpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHtcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gRXZlbnQgb2JqZWN0XG5cdGlmICggc3JjICYmIHNyYy50eXBlICkge1xuXHRcdHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYztcblx0XHR0aGlzLnR5cGUgPSBzcmMudHlwZTtcblxuXHRcdC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG5cdFx0Ly8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fFxuXHRcdFx0XHRzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5kZWZpbmVkICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5XG5cdFx0XHRcdHNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0cmV0dXJuVHJ1ZSA6XG5cdFx0XHRyZXR1cm5GYWxzZTtcblxuXHRcdC8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllc1xuXHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHlcblx0XHQvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKVxuXHRcdHRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/XG5cdFx0XHRzcmMudGFyZ2V0LnBhcmVudE5vZGUgOlxuXHRcdFx0c3JjLnRhcmdldDtcblxuXHRcdHRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0O1xuXHRcdHRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0O1xuXG5cdC8vIEV2ZW50IHR5cGVcblx0fSBlbHNlIHtcblx0XHR0aGlzLnR5cGUgPSBzcmM7XG5cdH1cblxuXHQvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuXHRpZiAoIHByb3BzICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuXHR0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxualF1ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IGpRdWVyeS5FdmVudCxcblx0aXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcblx0aXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzU2ltdWxhdGVkOiBmYWxzZSxcblxuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0fSxcblx0c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cblx0XHR0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG59O1xuXG4vLyBJbmNsdWRlcyBhbGwgY29tbW9uIGV2ZW50IHByb3BzIGluY2x1ZGluZyBLZXlFdmVudCBhbmQgTW91c2VFdmVudCBzcGVjaWZpYyBwcm9wc1xualF1ZXJ5LmVhY2goIHtcblx0YWx0S2V5OiB0cnVlLFxuXHRidWJibGVzOiB0cnVlLFxuXHRjYW5jZWxhYmxlOiB0cnVlLFxuXHRjaGFuZ2VkVG91Y2hlczogdHJ1ZSxcblx0Y3RybEtleTogdHJ1ZSxcblx0ZGV0YWlsOiB0cnVlLFxuXHRldmVudFBoYXNlOiB0cnVlLFxuXHRtZXRhS2V5OiB0cnVlLFxuXHRwYWdlWDogdHJ1ZSxcblx0cGFnZVk6IHRydWUsXG5cdHNoaWZ0S2V5OiB0cnVlLFxuXHR2aWV3OiB0cnVlLFxuXHRcImNoYXJcIjogdHJ1ZSxcblx0Y29kZTogdHJ1ZSxcblx0Y2hhckNvZGU6IHRydWUsXG5cdGtleTogdHJ1ZSxcblx0a2V5Q29kZTogdHJ1ZSxcblx0YnV0dG9uOiB0cnVlLFxuXHRidXR0b25zOiB0cnVlLFxuXHRjbGllbnRYOiB0cnVlLFxuXHRjbGllbnRZOiB0cnVlLFxuXHRvZmZzZXRYOiB0cnVlLFxuXHRvZmZzZXRZOiB0cnVlLFxuXHRwb2ludGVySWQ6IHRydWUsXG5cdHBvaW50ZXJUeXBlOiB0cnVlLFxuXHRzY3JlZW5YOiB0cnVlLFxuXHRzY3JlZW5ZOiB0cnVlLFxuXHR0YXJnZXRUb3VjaGVzOiB0cnVlLFxuXHR0b0VsZW1lbnQ6IHRydWUsXG5cdHRvdWNoZXM6IHRydWUsXG5cdHdoaWNoOiB0cnVlXG59LCBqUXVlcnkuZXZlbnQuYWRkUHJvcCApO1xuXG5qUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggdHlwZSwgZGVsZWdhdGVUeXBlICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdID0ge1xuXG5cdFx0Ly8gVXRpbGl6ZSBuYXRpdmUgZXZlbnQgaWYgcG9zc2libGUgc28gYmx1ci9mb2N1cyBzZXF1ZW5jZSBpcyBjb3JyZWN0XG5cdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDbGFpbSB0aGUgZmlyc3QgaGFuZGxlclxuXHRcdFx0Ly8gZGF0YVByaXYuc2V0KCB0aGlzLCBcImZvY3VzXCIsIC4uLiApXG5cdFx0XHQvLyBkYXRhUHJpdi5zZXQoIHRoaXMsIFwiYmx1clwiLCAuLi4gKVxuXHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIHRoaXMsIHR5cGUsIGV4cGVjdFN5bmMgKTtcblxuXHRcdFx0Ly8gUmV0dXJuIGZhbHNlIHRvIGFsbG93IG5vcm1hbCBwcm9jZXNzaW5nIGluIHRoZSBjYWxsZXJcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBGb3JjZSBzZXR1cCBiZWZvcmUgdHJpZ2dlclxuXHRcdFx0bGV2ZXJhZ2VOYXRpdmUoIHRoaXMsIHR5cGUgKTtcblxuXHRcdFx0Ly8gUmV0dXJuIG5vbi1mYWxzZSB0byBhbGxvdyBub3JtYWwgZXZlbnQtcGF0aCBwcm9wYWdhdGlvblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIFN1cHByZXNzIG5hdGl2ZSBmb2N1cyBvciBibHVyIGFzIGl0J3MgYWxyZWFkeSBiZWluZyBmaXJlZFxuXHRcdC8vIGluIGxldmVyYWdlTmF0aXZlLlxuXHRcdF9kZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRkZWxlZ2F0ZVR5cGU6IGRlbGVnYXRlVHlwZVxuXHR9O1xufSApO1xuXG4vLyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVja3Ncbi8vIHNvIHRoYXQgZXZlbnQgZGVsZWdhdGlvbiB3b3JrcyBpbiBqUXVlcnkuXG4vLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dFxuLy9cbi8vIFN1cHBvcnQ6IFNhZmFyaSA3IG9ubHlcbi8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOlxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDcwMjU4XG4vLyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBidWcgKGl0IGV4aXN0ZWQgaW4gb2xkZXIgQ2hyb21lIHZlcnNpb25zIGFzIHdlbGwpLlxualF1ZXJ5LmVhY2goIHtcblx0bW91c2VlbnRlcjogXCJtb3VzZW92ZXJcIixcblx0bW91c2VsZWF2ZTogXCJtb3VzZW91dFwiLFxuXHRwb2ludGVyZW50ZXI6IFwicG9pbnRlcm92ZXJcIixcblx0cG9pbnRlcmxlYXZlOiBcInBvaW50ZXJvdXRcIlxufSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHtcblx0XHRkZWxlZ2F0ZVR5cGU6IGZpeCxcblx0XHRiaW5kVHlwZTogZml4LFxuXG5cdFx0aGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHR0YXJnZXQgPSB0aGlzLFxuXHRcdFx0XHRyZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCxcblx0XHRcdFx0aGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqO1xuXG5cdFx0XHQvLyBGb3IgbW91c2VlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LlxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcblx0XHRcdGlmICggIXJlbGF0ZWQgfHwgKCByZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkgKSApIHtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTtcblx0XHRcdFx0cmV0ID0gaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRldmVudC50eXBlID0gZml4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHRvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7XG5cdH0sXG5cdG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7XG5cdH0sXG5cdG9mZjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZm4gKSB7XG5cdFx0dmFyIGhhbmRsZU9iaiwgdHlwZTtcblx0XHRpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiApIHtcblxuXHRcdFx0Ly8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudFxuXHRcdFx0aGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqO1xuXHRcdFx0alF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCApLm9mZihcblx0XHRcdFx0aGFuZGxlT2JqLm5hbWVzcGFjZSA/XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlICsgXCIuXCIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDpcblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUsXG5cdFx0XHRcdGhhbmRsZU9iai5zZWxlY3Rvcixcblx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXJcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApXG5cdFx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0XHR0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcyBbLCBmbl0gKVxuXHRcdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbnZhclxuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHlcblx0Ly8gSW4gSUUvRWRnZSB1c2luZyByZWdleCBncm91cHMgaGVyZSBjYXVzZXMgc2V2ZXJlIHNsb3dkb3ducy5cblx0Ly8gU2VlIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvMTczNjUxMi9cblx0cm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksXG5cblx0Ly8gY2hlY2tlZD1cImNoZWNrZWRcIiBvciBjaGVja2VkXG5cdHJjaGVja2VkID0gL2NoZWNrZWRcXHMqKD86W149XXw9XFxzKi5jaGVja2VkLikvaSxcblx0cmNsZWFuU2NyaXB0ID0gL15cXHMqPCEoPzpcXFtDREFUQVxcW3wtLSl8KD86XFxdXFxdfC0tKT5cXHMqJC9nO1xuXG4vLyBQcmVmZXIgYSB0Ym9keSBvdmVyIGl0cyBwYXJlbnQgdGFibGUgZm9yIGNvbnRhaW5pbmcgbmV3IHJvd3NcbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0aWYgKCBub2RlTmFtZSggZWxlbSwgXCJ0YWJsZVwiICkgJiZcblx0XHRub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCBcInRyXCIgKSApIHtcblxuXHRcdHJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggXCJ0Ym9keVwiIClbIDAgXSB8fCBlbGVtO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbi8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb25cbmZ1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7XG5cdGVsZW0udHlwZSA9ICggZWxlbS5nZXRBdHRyaWJ1dGUoIFwidHlwZVwiICkgIT09IG51bGwgKSArIFwiL1wiICsgZWxlbS50eXBlO1xuXHRyZXR1cm4gZWxlbTtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7XG5cdGlmICggKCBlbGVtLnR5cGUgfHwgXCJcIiApLnNsaWNlKCAwLCA1ICkgPT09IFwidHJ1ZS9cIiApIHtcblx0XHRlbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTtcblx0fSBlbHNlIHtcblx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggXCJ0eXBlXCIgKTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5mdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkge1xuXHR2YXIgaSwgbCwgdHlwZSwgcGRhdGFPbGQsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFQcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YVByaXYuZ2V0KCBzcmMgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRhdGFQcml2LnJlbW92ZSggZGVzdCwgXCJoYW5kbGUgZXZlbnRzXCIgKTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YVVzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhVXNlci5hY2Nlc3MoIHNyYyApO1xuXHRcdHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xkICk7XG5cblx0XHRkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybiB0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gZG9tTWFuaXAoIGNvbGxlY3Rpb24sIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICkge1xuXG5cdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0YXJncyA9IGZsYXQoIGFyZ3MgKTtcblxuXHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gfHxcblx0XHRcdCggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdHJldHVybiBjb2xsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBpbmRleCApIHtcblx0XHRcdHZhciBzZWxmID0gY29sbGVjdGlvbi5lcSggaW5kZXggKTtcblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgJiYgKCBub2RlLnR5cGUgfHwgXCJcIiApLnRvTG93ZXJDYXNlKCkgICE9PSBcIm1vZHVsZVwiICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICYmICFub2RlLm5vTW9kdWxlICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5fZXZhbFVybCggbm9kZS5zcmMsIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5vbmNlOiBub2RlLm5vbmNlIHx8IG5vZGUuZ2V0QXR0cmlidXRlKCBcIm5vbmNlXCIgKVxuXHRcdFx0XHRcdFx0XHRcdH0sIGRvYyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRET01FdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApLCBub2RlLCBkb2MgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY29sbGVjdGlvbjtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlKCBlbGVtLCBzZWxlY3Rvciwga2VlcERhdGEgKSB7XG5cdHZhciBub2RlLFxuXHRcdG5vZGVzID0gc2VsZWN0b3IgPyBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgZWxlbSApIDogZWxlbSxcblx0XHRpID0gMDtcblxuXHRmb3IgKCA7ICggbm9kZSA9IG5vZGVzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0aWYgKCAha2VlcERhdGEgJiYgbm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggbm9kZSApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBub2RlLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRpZiAoIGtlZXBEYXRhICYmIGlzQXR0YWNoZWQoIG5vZGUgKSApIHtcblx0XHRcdFx0c2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdH1cblx0XHRcdG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggbm9kZSApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHJldHVybiBodG1sO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0dmFyIGksIGwsIHNyY0VsZW1lbnRzLCBkZXN0RWxlbWVudHMsXG5cdFx0XHRjbG9uZSA9IGVsZW0uY2xvbmVOb2RlKCB0cnVlICksXG5cdFx0XHRpblBhZ2UgPSBpc0F0dGFjaGVkKCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBodHRwczovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblx0XHR2YXIgZGF0YSwgZWxlbSwgdHlwZSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkge1xuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGlmICggKCBkYXRhID0gZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbFsgdHlwZSBdICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0Ly8gLmdldCgpIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0cHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG52YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSg/IXB4KVthLXolXSskXCIsIFwiaVwiICk7XG5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seSwgRmlyZWZveCA8PTMwICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHR2YXIgdmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkge1xuXHRcdFx0dmlldyA9IHdpbmRvdztcblx0XHR9XG5cblx0XHRyZXR1cm4gdmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suY2FsbCggZWxlbSApO1xuXG5cdC8vIFJldmVydCB0aGUgb2xkIHZhbHVlc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb2xkWyBuYW1lIF07XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufTtcblxuXG52YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oIFwifFwiICksIFwiaVwiICk7XG5cblxuXG4oIGZ1bmN0aW9uKCkge1xuXG5cdC8vIEV4ZWN1dGluZyBib3RoIHBpeGVsUG9zaXRpb24gJiBib3hTaXppbmdSZWxpYWJsZSB0ZXN0cyByZXF1aXJlIG9ubHkgb25lIGxheW91dFxuXHQvLyBzbyB0aGV5J3JlIGV4ZWN1dGVkIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSB0aGUgc2Vjb25kIGNvbXB1dGF0aW9uLlxuXHRmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHtcblxuXHRcdC8vIFRoaXMgaXMgYSBzaW5nbGV0b24sIHdlIG5lZWQgdG8gZXhlY3V0ZSBpdCBvbmx5IG9uY2Vcblx0XHRpZiAoICFkaXYgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDtcIiArXG5cdFx0XHRcIm1hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MFwiO1xuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdFwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO1wiICtcblx0XHRcdFwibWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDtcIiArXG5cdFx0XHRcIndpZHRoOjYwJTt0b3A6MSVcIjtcblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApLmFwcGVuZENoaWxkKCBkaXYgKTtcblxuXHRcdHZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTtcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSBcIjElXCI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0XG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyO1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seSwgU2FmYXJpIDw9OS4xIC0gMTAuMSwgaU9TIDw9Ny4wIC0gOS4zXG5cdFx0Ly8gU29tZSBzdHlsZXMgY29tZSBiYWNrIHdpdGggcGVyY2VudGFnZSB2YWx1ZXMsIGV2ZW4gdGhvdWdoIHRoZXkgc2hvdWxkbid0XG5cdFx0ZGl2LnN0eWxlLnJpZ2h0ID0gXCI2MCVcIjtcblx0XHRwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHRcdC8vIERldGVjdCBtaXNyZXBvcnRpbmcgb2YgY29udGVudCBkaW1lbnNpb25zIGZvciBib3gtc2l6aW5nOmJvcmRlci1ib3ggZWxlbWVudHNcblx0XHRib3hTaXppbmdSZWxpYWJsZVZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUud2lkdGggKSA9PT0gMzY7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHQvLyBEZXRlY3Qgb3ZlcmZsb3c6c2Nyb2xsIHNjcmV3aW5lc3MgKGdoLTM2OTkpXG5cdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9NjRcblx0XHQvLyBEb24ndCBnZXQgdHJpY2tlZCB3aGVuIHpvb20gYWZmZWN0cyBvZmZzZXRXaWR0aCAoZ2gtNDAyOSlcblx0XHRkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0c2Nyb2xsYm94U2l6ZVZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2Lm9mZnNldFdpZHRoIC8gMyApID09PSAxMjtcblxuXHRcdGRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7XG5cblx0XHQvLyBOdWxsaWZ5IHRoZSBkaXYgc28gaXQgd291bGRuJ3QgYmUgc3RvcmVkIGluIHRoZSBtZW1vcnkgYW5kXG5cdFx0Ly8gaXQgd2lsbCBhbHNvIGJlIGEgc2lnbiB0aGF0IGNoZWNrcyBhbHJlYWR5IHBlcmZvcm1lZFxuXHRcdGRpdiA9IG51bGw7XG5cdH1cblxuXHRmdW5jdGlvbiByb3VuZFBpeGVsTWVhc3VyZXMoIG1lYXN1cmUgKSB7XG5cdFx0cmV0dXJuIE1hdGgucm91bmQoIHBhcnNlRmxvYXQoIG1lYXN1cmUgKSApO1xuXHR9XG5cblx0dmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCxcblx0XHRyZWxpYWJsZVRyRGltZW5zaW9uc1ZhbCwgcmVsaWFibGVNYXJnaW5MZWZ0VmFsLFxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0Ly8gRmluaXNoIGVhcmx5IGluIGxpbWl0ZWQgKG5vbi1icm93c2VyKSBlbnZpcm9ubWVudHNcblx0aWYgKCAhZGl2LnN0eWxlICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKCM4OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdGJveFNpemluZ1JlbGlhYmxlOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gYm94U2l6aW5nUmVsaWFibGVWYWw7XG5cdFx0fSxcblx0XHRwaXhlbEJveFN0eWxlczogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHBpeGVsQm94U3R5bGVzVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxQb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHBpeGVsUG9zaXRpb25WYWw7XG5cdFx0fSxcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiByZWxpYWJsZU1hcmdpbkxlZnRWYWw7XG5cdFx0fSxcblx0XHRzY3JvbGxib3hTaXplOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gc2Nyb2xsYm94U2l6ZVZhbDtcblx0XHR9LFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgOSAtIDExKywgRWRnZSAxNSAtIDE4K1xuXHRcdC8vIElFL0VkZ2UgbWlzcmVwb3J0IGBnZXRDb21wdXRlZFN0eWxlYCBvZiB0YWJsZSByb3dzIHdpdGggd2lkdGgvaGVpZ2h0XG5cdFx0Ly8gc2V0IGluIENTUyB3aGlsZSBgb2Zmc2V0KmAgcHJvcGVydGllcyByZXBvcnQgY29ycmVjdCB2YWx1ZXMuXG5cdFx0Ly8gQmVoYXZpb3IgaW4gSUUgOSBpcyBtb3JlIHN1YnRsZSB0aGFuIGluIG5ld2VyIHZlcnNpb25zICYgaXQgcGFzc2VzXG5cdFx0Ly8gc29tZSB2ZXJzaW9ucyBvZiB0aGlzIHRlc3Q7IG1ha2Ugc3VyZSBub3QgdG8gbWFrZSBpdCBwYXNzIHRoZXJlIVxuXHRcdC8vXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA3MCtcblx0XHQvLyBPbmx5IEZpcmVmb3ggaW5jbHVkZXMgYm9yZGVyIHdpZHRoc1xuXHRcdC8vIGluIGNvbXB1dGVkIGRpbWVuc2lvbnMuIChnaC00NTI5KVxuXHRcdHJlbGlhYmxlVHJEaW1lbnNpb25zOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0YWJsZSwgdHIsIHRyQ2hpbGQsIHRyU3R5bGU7XG5cdFx0XHRpZiAoIHJlbGlhYmxlVHJEaW1lbnNpb25zVmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJ0YWJsZVwiICk7XG5cdFx0XHRcdHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJ0clwiICk7XG5cdFx0XHRcdHRyQ2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0XHRcdFx0dGFibGUuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGVcIjtcblx0XHRcdFx0dHIuc3R5bGUuY3NzVGV4dCA9IFwiYm9yZGVyOjFweCBzb2xpZFwiO1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA4Nitcblx0XHRcdFx0Ly8gSGVpZ2h0IHNldCB0aHJvdWdoIGNzc1RleHQgZG9lcyBub3QgZ2V0IGFwcGxpZWQuXG5cdFx0XHRcdC8vIENvbXB1dGVkIGhlaWdodCB0aGVuIGNvbWVzIGJhY2sgYXMgMC5cblx0XHRcdFx0dHIuc3R5bGUuaGVpZ2h0ID0gXCIxcHhcIjtcblx0XHRcdFx0dHJDaGlsZC5zdHlsZS5oZWlnaHQgPSBcIjlweFwiO1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgOCBDaHJvbWUgODYrXG5cdFx0XHRcdC8vIEluIG91ciBib2R5QmFja2dyb3VuZC5odG1sIGlmcmFtZSxcblx0XHRcdFx0Ly8gZGlzcGxheSBmb3IgYWxsIGRpdiBlbGVtZW50cyBpcyBzZXQgdG8gXCJpbmxpbmVcIixcblx0XHRcdFx0Ly8gd2hpY2ggY2F1c2VzIGEgcHJvYmxlbSBvbmx5IGluIEFuZHJvaWQgOCBDaHJvbWUgODYuXG5cdFx0XHRcdC8vIEVuc3VyaW5nIHRoZSBkaXYgaXMgZGlzcGxheTogYmxvY2tcblx0XHRcdFx0Ly8gZ2V0cyBhcm91bmQgdGhpcyBpc3N1ZS5cblx0XHRcdFx0dHJDaGlsZC5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuXG5cdFx0XHRcdGRvY3VtZW50RWxlbWVudFxuXHRcdFx0XHRcdC5hcHBlbmRDaGlsZCggdGFibGUgKVxuXHRcdFx0XHRcdC5hcHBlbmRDaGlsZCggdHIgKVxuXHRcdFx0XHRcdC5hcHBlbmRDaGlsZCggdHJDaGlsZCApO1xuXG5cdFx0XHRcdHRyU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggdHIgKTtcblx0XHRcdFx0cmVsaWFibGVUckRpbWVuc2lvbnNWYWwgPSAoIHBhcnNlSW50KCB0clN0eWxlLmhlaWdodCwgMTAgKSArXG5cdFx0XHRcdFx0cGFyc2VJbnQoIHRyU3R5bGUuYm9yZGVyVG9wV2lkdGgsIDEwICkgK1xuXHRcdFx0XHRcdHBhcnNlSW50KCB0clN0eWxlLmJvcmRlckJvdHRvbVdpZHRoLCAxMCApICkgPT09IHRyLm9mZnNldEhlaWdodDtcblxuXHRcdFx0XHRkb2N1bWVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoIHRhYmxlICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVUckRpbWVuc2lvbnNWYWw7XG5cdFx0fVxuXHR9ICk7XG59ICkoKTtcblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA1MStcblx0XHQvLyBSZXRyaWV2aW5nIHN0eWxlIGJlZm9yZSBjb21wdXRlZCBzb21laG93XG5cdFx0Ly8gZml4ZXMgYW4gaXNzdWUgd2l0aCBnZXR0aW5nIHdyb25nIHZhbHVlc1xuXHRcdC8vIG9uIGRldGFjaGVkIGVsZW1lbnRzXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7XG5cblx0Ly8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBuZWVkZWQgZm9yOlxuXHQvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNylcblx0Ly8gICAuY3NzKCctLWN1c3RvbVByb3BlcnR5KSAoIzMxNDQpXG5cdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF07XG5cblx0XHRpZiAoIHJldCA9PT0gXCJcIiAmJiAhaXNBdHRhY2hlZCggZWxlbSApICkge1xuXHRcdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gQSB0cmlidXRlIHRvIHRoZSBcImF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHNcIlxuXHRcdC8vIEFuZHJvaWQgQnJvd3NlciByZXR1cm5zIHBlcmNlbnRhZ2UgZm9yIHNvbWUgdmFsdWVzLFxuXHRcdC8vIGJ1dCB3aWR0aCBzZWVtcyB0byBiZSByZWxpYWJseSBwaXhlbHMuXG5cdFx0Ly8gVGhpcyBpcyBhZ2FpbnN0IHRoZSBDU1NPTSBkcmFmdCBzcGVjOlxuXHRcdC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5waXhlbEJveFN0eWxlcygpICYmIHJudW1ub25weC50ZXN0KCByZXQgKSAmJiByYm94U3R5bGUudGVzdCggbmFtZSApICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG5cdFx0XHR3aWR0aCA9IHN0eWxlLndpZHRoO1xuXHRcdFx0bWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDtcblx0XHRcdG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7XG5cblx0XHRcdC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXRcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDtcblx0XHRcdHJldCA9IGNvbXB1dGVkLndpZHRoO1xuXG5cdFx0XHQvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXG5cdFx0XHRzdHlsZS53aWR0aCA9IHdpZHRoO1xuXHRcdFx0c3R5bGUubWluV2lkdGggPSBtaW5XaWR0aDtcblx0XHRcdHN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJldCAhPT0gdW5kZWZpbmVkID9cblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0XHQvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuXHRcdHJldCArIFwiXCIgOlxuXHRcdHJldDtcbn1cblxuXG5mdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7XG5cblx0Ly8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBjb25kaXRpb25GbigpICkge1xuXG5cdFx0XHRcdC8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZVxuXHRcdFx0XHQvLyB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLCByZW1vdmUgaXQuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmdldDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi5cblx0XHRcdHJldHVybiAoIHRoaXMuZ2V0ID0gaG9va0ZuICkuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fTtcbn1cblxuXG52YXIgY3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlLFxuXHR2ZW5kb3JQcm9wcyA9IHt9O1xuXG4vLyBSZXR1cm4gYSB2ZW5kb3ItcHJlZml4ZWQgcHJvcGVydHkgb3IgdW5kZWZpbmVkXG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHtcblxuXHQvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZVsgMCBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKCAxICksXG5cdFx0aSA9IGNzc1ByZWZpeGVzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7XG5cdFx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cbn1cblxuLy8gUmV0dXJuIGEgcG90ZW50aWFsbHktbWFwcGVkIGpRdWVyeS5jc3NQcm9wcyBvciB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHlcbmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7XG5cdHZhciBmaW5hbCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdIHx8IHZlbmRvclByb3BzWyBuYW1lIF07XG5cblx0aWYgKCBmaW5hbCApIHtcblx0XHRyZXR1cm4gZmluYWw7XG5cdH1cblx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblx0cmV0dXJuIHZlbmRvclByb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7XG59XG5cblxudmFyXG5cblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZVxuXHQvLyBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0cmN1c3RvbVByb3AgPSAvXi0tLyxcblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH07XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBfZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICkge1xuXG5cdC8vIEFueSByZWxhdGl2ZSAoKy8tKSB2YWx1ZXMgaGF2ZSBhbHJlYWR5IGJlZW5cblx0Ly8gbm9ybWFsaXplZCBhdCB0aGlzIHBvaW50XG5cdHZhciBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApO1xuXHRyZXR1cm4gbWF0Y2hlcyA/XG5cblx0XHQvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCBcInN1YnRyYWN0XCIsIGUuZy4sIHdoZW4gdXNlZCBhcyBpbiBjc3NIb29rc1xuXHRcdE1hdGgubWF4KCAwLCBtYXRjaGVzWyAyIF0gLSAoIHN1YnRyYWN0IHx8IDAgKSApICsgKCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgOlxuXHRcdHZhbHVlO1xufVxuXG5mdW5jdGlvbiBib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgYm94LCBpc0JvcmRlckJveCwgc3R5bGVzLCBjb21wdXRlZFZhbCApIHtcblx0dmFyIGkgPSBkaW1lbnNpb24gPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXHRcdGV4dHJhID0gMCxcblx0XHRkZWx0YSA9IDA7XG5cblx0Ly8gQWRqdXN0bWVudCBtYXkgbm90IGJlIG5lY2Vzc2FyeVxuXHRpZiAoIGJveCA9PT0gKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApICkge1xuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgNDsgaSArPSAyICkge1xuXG5cdFx0Ly8gQm90aCBib3ggbW9kZWxzIGV4Y2x1ZGUgbWFyZ2luXG5cdFx0aWYgKCBib3ggPT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBib3ggKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGNvbnRlbnQtYm94LCB3ZSdyZSBzZWVraW5nIFwicGFkZGluZ1wiIG9yIFwiYm9yZGVyXCIgb3IgXCJtYXJnaW5cIlxuXHRcdGlmICggIWlzQm9yZGVyQm94ICkge1xuXG5cdFx0XHQvLyBBZGQgcGFkZGluZ1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEZvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCIsIGFkZCBib3JkZXJcblx0XHRcdGlmICggYm94ICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gQnV0IHN0aWxsIGtlZXAgdHJhY2sgb2YgaXQgb3RoZXJ3aXNlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRleHRyYSArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0Ly8gSWYgd2UgZ2V0IGhlcmUgd2l0aCBhIGJvcmRlci1ib3ggKGNvbnRlbnQgKyBwYWRkaW5nICsgYm9yZGVyKSwgd2UncmUgc2Vla2luZyBcImNvbnRlbnRcIiBvclxuXHRcdC8vIFwicGFkZGluZ1wiIG9yIFwibWFyZ2luXCJcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIsIHN1YnRyYWN0IHBhZGRpbmdcblx0XHRcdGlmICggYm94ID09PSBcImNvbnRlbnRcIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvciBcImNvbnRlbnRcIiBvciBcInBhZGRpbmdcIiwgc3VidHJhY3QgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdFx0ZGVsdGEgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBBY2NvdW50IGZvciBwb3NpdGl2ZSBjb250ZW50LWJveCBzY3JvbGwgZ3V0dGVyIHdoZW4gcmVxdWVzdGVkIGJ5IHByb3ZpZGluZyBjb21wdXRlZFZhbFxuXHRpZiAoICFpc0JvcmRlckJveCAmJiBjb21wdXRlZFZhbCA+PSAwICkge1xuXG5cdFx0Ly8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIGEgcm91bmRlZCBzdW0gb2YgY29udGVudCwgcGFkZGluZywgc2Nyb2xsIGd1dHRlciwgYW5kIGJvcmRlclxuXHRcdC8vIEFzc3VtaW5nIGludGVnZXIgc2Nyb2xsIGd1dHRlciwgc3VidHJhY3QgdGhlIHJlc3QgYW5kIHJvdW5kIGRvd25cblx0XHRkZWx0YSArPSBNYXRoLm1heCggMCwgTWF0aC5jZWlsKFxuXHRcdFx0ZWxlbVsgXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdIC1cblx0XHRcdGNvbXB1dGVkVmFsIC1cblx0XHRcdGRlbHRhIC1cblx0XHRcdGV4dHJhIC1cblx0XHRcdDAuNVxuXG5cdFx0Ly8gSWYgb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGlzIHVua25vd24sIHRoZW4gd2UgY2FuJ3QgZGV0ZXJtaW5lIGNvbnRlbnQtYm94IHNjcm9sbCBndXR0ZXJcblx0XHQvLyBVc2UgYW4gZXhwbGljaXQgemVybyB0byBhdm9pZCBOYU4gKGdoLTM5NjQpXG5cdFx0KSApIHx8IDA7XG5cdH1cblxuXHRyZXR1cm4gZGVsdGE7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZVxuXHR2YXIgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cblx0XHQvLyBUbyBhdm9pZCBmb3JjaW5nIGEgcmVmbG93LCBvbmx5IGZldGNoIGJveFNpemluZyBpZiB3ZSBuZWVkIGl0IChnaC00MzIyKS5cblx0XHQvLyBGYWtlIGNvbnRlbnQtYm94IHVudGlsIHdlIGtub3cgaXQncyBuZWVkZWQgdG8ga25vdyB0aGUgdHJ1ZSB2YWx1ZS5cblx0XHRib3hTaXppbmdOZWVkZWQgPSAhc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IGV4dHJhLFxuXHRcdGlzQm9yZGVyQm94ID0gYm94U2l6aW5nTmVlZGVkICYmXG5cdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCxcblxuXHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSxcblx0XHRvZmZzZXRQcm9wID0gXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKTtcblxuXHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTRcblx0Ly8gUmV0dXJuIGEgY29uZm91bmRpbmcgbm9uLXBpeGVsIHZhbHVlIG9yIGZlaWduIGlnbm9yYW5jZSwgYXMgYXBwcm9wcmlhdGUuXG5cdGlmICggcm51bW5vbnB4LnRlc3QoIHZhbCApICkge1xuXHRcdGlmICggIWV4dHJhICkge1xuXHRcdFx0cmV0dXJuIHZhbDtcblx0XHR9XG5cdFx0dmFsID0gXCJhdXRvXCI7XG5cdH1cblxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIFVzZSBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgZm9yIHdoZW4gYm94IHNpemluZyBpcyB1bnJlbGlhYmxlLlxuXHQvLyBJbiB0aG9zZSBjYXNlcywgdGhlIGNvbXB1dGVkIHZhbHVlIGNhbiBiZSB0cnVzdGVkIHRvIGJlIGJvcmRlci1ib3guXG5cdGlmICggKCAhc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpICYmIGlzQm9yZGVyQm94IHx8XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMCAtIDExKywgRWRnZSAxNSAtIDE4K1xuXHRcdC8vIElFL0VkZ2UgbWlzcmVwb3J0IGBnZXRDb21wdXRlZFN0eWxlYCBvZiB0YWJsZSByb3dzIHdpdGggd2lkdGgvaGVpZ2h0XG5cdFx0Ly8gc2V0IGluIENTUyB3aGlsZSBgb2Zmc2V0KmAgcHJvcGVydGllcyByZXBvcnQgY29ycmVjdCB2YWx1ZXMuXG5cdFx0Ly8gSW50ZXJlc3RpbmdseSwgaW4gc29tZSBjYXNlcyBJRSA5IGRvZXNuJ3Qgc3VmZmVyIGZyb20gdGhpcyBpc3N1ZS5cblx0XHQhc3VwcG9ydC5yZWxpYWJsZVRyRGltZW5zaW9ucygpICYmIG5vZGVOYW1lKCBlbGVtLCBcInRyXCIgKSB8fFxuXG5cdFx0Ly8gRmFsbCBiYWNrIHRvIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCB3aGVuIHZhbHVlIGlzIFwiYXV0b1wiXG5cdFx0Ly8gVGhpcyBoYXBwZW5zIGZvciBpbmxpbmUgZWxlbWVudHMgd2l0aCBubyBleHBsaWNpdCBzZXR0aW5nIChnaC0zNTcxKVxuXHRcdHZhbCA9PT0gXCJhdXRvXCIgfHxcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjEgLSA0LjMgb25seVxuXHRcdC8vIEFsc28gdXNlIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBmb3IgbWlzcmVwb3J0ZWQgaW5saW5lIGRpbWVuc2lvbnMgKGdoLTM2MDIpXG5cdFx0IXBhcnNlRmxvYXQoIHZhbCApICYmIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiaW5saW5lXCIgKSAmJlxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoZSBlbGVtZW50IGlzIHZpc2libGUgJiBjb25uZWN0ZWRcblx0XHRlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICkge1xuXG5cdFx0aXNCb3JkZXJCb3ggPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiO1xuXG5cdFx0Ly8gV2hlcmUgYXZhaWxhYmxlLCBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgYXBwcm94aW1hdGUgYm9yZGVyIGJveCBkaW1lbnNpb25zLlxuXHRcdC8vIFdoZXJlIG5vdCBhdmFpbGFibGUgKGUuZy4sIFNWRyksIGFzc3VtZSB1bnJlbGlhYmxlIGJveC1zaXppbmcgYW5kIGludGVycHJldCB0aGVcblx0XHQvLyByZXRyaWV2ZWQgdmFsdWUgYXMgYSBjb250ZW50IGJveCBkaW1lbnNpb24uXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IG9mZnNldFByb3AgaW4gZWxlbTtcblx0XHRpZiAoIHZhbHVlSXNCb3JkZXJCb3ggKSB7XG5cdFx0XHR2YWwgPSBlbGVtWyBvZmZzZXRQcm9wIF07XG5cdFx0fVxuXHR9XG5cblx0Ly8gTm9ybWFsaXplIFwiXCIgYW5kIGF1dG9cblx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblxuXHQvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsXG5cdHJldHVybiAoIHZhbCArXG5cdFx0Ym94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0ZWxlbSxcblx0XHRcdGRpbWVuc2lvbixcblx0XHRcdGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSxcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3gsXG5cdFx0XHRzdHlsZXMsXG5cblx0XHRcdC8vIFByb3ZpZGUgdGhlIGN1cnJlbnQgY29tcHV0ZWQgc2l6ZSB0byByZXF1ZXN0IHNjcm9sbCBndXR0ZXIgY2FsY3VsYXRpb24gKGdoLTM1ODkpXG5cdFx0XHR2YWxcblx0XHQpXG5cdCkgKyBcInB4XCI7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdHJ1ZSxcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImdyaWRBcmVhXCI6IHRydWUsXG5cdFx0XCJncmlkQ29sdW1uXCI6IHRydWUsXG5cdFx0XCJncmlkQ29sdW1uRW5kXCI6IHRydWUsXG5cdFx0XCJncmlkQ29sdW1uU3RhcnRcIjogdHJ1ZSxcblx0XHRcImdyaWRSb3dcIjogdHJ1ZSxcblx0XHRcImdyaWRSb3dFbmRcIjogdHJ1ZSxcblx0XHRcImdyaWRSb3dTdGFydFwiOiB0cnVlLFxuXHRcdFwibGluZUhlaWdodFwiOiB0cnVlLFxuXHRcdFwib3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwib3JkZXJcIjogdHJ1ZSxcblx0XHRcIm9ycGhhbnNcIjogdHJ1ZSxcblx0XHRcIndpZG93c1wiOiB0cnVlLFxuXHRcdFwiekluZGV4XCI6IHRydWUsXG5cdFx0XCJ6b29tXCI6IHRydWVcblx0fSxcblxuXHQvLyBBZGQgaW4gcHJvcGVydGllcyB3aG9zZSBuYW1lcyB5b3Ugd2lzaCB0byBmaXggYmVmb3JlXG5cdC8vIHNldHRpbmcgb3IgZ2V0dGluZyB0aGUgdmFsdWVcblx0Y3NzUHJvcHM6IHt9LFxuXG5cdC8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlXG5cdHN0eWxlOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUsIGV4dHJhICkge1xuXG5cdFx0Ly8gRG9uJ3Qgc2V0IHN0eWxlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggfHwgIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lXG5cdFx0dmFyIHJldCwgdHlwZSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApLFxuXHRcdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gcXVlcnkgdGhlIHZhbHVlIGlmIGl0IGlzIGEgQ1NTIGN1c3RvbSBwcm9wZXJ0eVxuXHRcdC8vIHNpbmNlIHRoZXkgYXJlIHVzZXItZGVmaW5lZC5cblx0XHRpZiAoICFpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRuYW1lID0gZmluYWxQcm9wTmFtZSggb3JpZ05hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBHZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLCB0aGVuIHVucHJlZml4ZWQgdmVyc2lvblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdFx0Ly8gQ29udmVydCBcIis9XCIgb3IgXCItPVwiIHRvIHJlbGF0aXZlIG51bWJlcnMgKCM3MzQ1KVxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICYmICggcmV0ID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiYgcmV0WyAxIF0gKSB7XG5cdFx0XHRcdHZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTtcblxuXHRcdFx0XHQvLyBGaXhlcyBidWcgIzkyMzdcblx0XHRcdFx0dHlwZSA9IFwibnVtYmVyXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IG51bGwgYW5kIE5hTiB2YWx1ZXMgYXJlbid0IHNldCAoIzcxMTYpXG5cdFx0XHRpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCB0aGUgdW5pdCAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxuXHRcdFx0Ly8gVGhlIGlzQ3VzdG9tUHJvcCBjaGVjayBjYW4gYmUgcmVtb3ZlZCBpbiBqUXVlcnkgNC4wIHdoZW4gd2Ugb25seSBhdXRvLWFwcGVuZFxuXHRcdFx0Ly8gXCJweFwiIHRvIGEgZmV3IGhhcmRjb2RlZCB2YWx1ZXMuXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwibnVtYmVyXCIgJiYgIWlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0XHRzdHlsZS5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3Rcblx0XHRcdHJldHVybiBzdHlsZVsgbmFtZSBdO1xuXHRcdH1cblx0fSxcblxuXHRjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkge1xuXHRcdHZhciB2YWwsIG51bSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZVxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgbnVtZXJpYyBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggX2ksIGRpbWVuc2lvbiApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBkaW1lbnNpb24gXSA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdC8vIENlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbVxuXHRcdFx0XHQvLyBidXQgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdFxuXHRcdFx0XHRyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKSAmJlxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDgrXG5cdFx0XHRcdFx0Ly8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm9cblx0XHRcdFx0XHQvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLlxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHRcdFx0XHRcdC8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGVcblx0XHRcdFx0XHQvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuXG5cdFx0XHRcdFx0KCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID9cblx0XHRcdFx0XHRzd2FwKCBlbGVtLCBjc3NTaG93LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHRcdFx0fSApIDpcblx0XHRcdFx0XHRnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHtcblx0XHRcdHZhciBtYXRjaGVzLFxuXHRcdFx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblxuXHRcdFx0XHQvLyBPbmx5IHJlYWQgc3R5bGVzLnBvc2l0aW9uIGlmIHRoZSB0ZXN0IGhhcyBhIGNoYW5jZSB0byBmYWlsXG5cdFx0XHRcdC8vIHRvIGF2b2lkIGZvcmNpbmcgYSByZWZsb3cuXG5cdFx0XHRcdHNjcm9sbGJveFNpemVCdWdneSA9ICFzdXBwb3J0LnNjcm9sbGJveFNpemUoKSAmJlxuXHRcdFx0XHRcdHN0eWxlcy5wb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiLFxuXG5cdFx0XHRcdC8vIFRvIGF2b2lkIGZvcmNpbmcgYSByZWZsb3csIG9ubHkgZmV0Y2ggYm94U2l6aW5nIGlmIHdlIG5lZWQgaXQgKGdoLTM5OTEpXG5cdFx0XHRcdGJveFNpemluZ05lZWRlZCA9IHNjcm9sbGJveFNpemVCdWdneSB8fCBleHRyYSxcblx0XHRcdFx0aXNCb3JkZXJCb3ggPSBib3hTaXppbmdOZWVkZWQgJiZcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBcImJveFNpemluZ1wiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiYm9yZGVyLWJveFwiLFxuXHRcdFx0XHRzdWJ0cmFjdCA9IGV4dHJhID9cblx0XHRcdFx0XHRib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdFx0ZGltZW5zaW9uLFxuXHRcdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0XHRpc0JvcmRlckJveCxcblx0XHRcdFx0XHRcdHN0eWxlc1xuXHRcdFx0XHRcdCkgOlxuXHRcdFx0XHRcdDA7XG5cblx0XHRcdC8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZFxuXHRcdFx0Ly8gZmFraW5nIGEgY29udGVudC1ib3ggdG8gZ2V0IGJvcmRlciBhbmQgcGFkZGluZyAoZ2gtMzY5OSlcblx0XHRcdGlmICggaXNCb3JkZXJCb3ggJiYgc2Nyb2xsYm94U2l6ZUJ1Z2d5ICkge1xuXHRcdFx0XHRzdWJ0cmFjdCAtPSBNYXRoLmNlaWwoXG5cdFx0XHRcdFx0ZWxlbVsgXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdIC1cblx0XHRcdFx0XHRwYXJzZUZsb2F0KCBzdHlsZXNbIGRpbWVuc2lvbiBdICkgLVxuXHRcdFx0XHRcdGJveE1vZGVsQWRqdXN0bWVudCggZWxlbSwgZGltZW5zaW9uLCBcImJvcmRlclwiLCBmYWxzZSwgc3R5bGVzICkgLVxuXHRcdFx0XHRcdDAuNVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IHRvIHBpeGVscyBpZiB2YWx1ZSBhZGp1c3RtZW50IGlzIG5lZWRlZFxuXHRcdFx0aWYgKCBzdWJ0cmFjdCAmJiAoIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJlxuXHRcdFx0XHQoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSAhPT0gXCJweFwiICkge1xuXG5cdFx0XHRcdGVsZW0uc3R5bGVbIGRpbWVuc2lvbiBdID0gdmFsdWU7XG5cdFx0XHRcdHZhbHVlID0galF1ZXJ5LmNzcyggZWxlbSwgZGltZW5zaW9uICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7XG5cdFx0fVxuXHR9O1xufSApO1xuXG5qUXVlcnkuY3NzSG9va3MubWFyZ2luTGVmdCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxpYWJsZU1hcmdpbkxlZnQsXG5cdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0cmV0dXJuICggcGFyc2VGbG9hdCggY3VyQ1NTKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiApICkgfHxcblx0XHRcdFx0ZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC1cblx0XHRcdFx0XHRzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXHRcdFx0XHRcdH0gKVxuXHRcdFx0KSArIFwicHhcIjtcblx0XHR9XG5cdH1cbik7XG5cbi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXNcbmpRdWVyeS5lYWNoKCB7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS5zcGxpdCggXCIgXCIgKSA6IFsgdmFsdWUgXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgNDsgaSsrICkge1xuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XG5cdFx0XHRcdFx0cGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXhwYW5kZWQ7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICggcHJlZml4ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy5cblx0XHRcdC8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0O1xuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcy1pcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlID09PSAxICYmIChcblx0XHRcdFx0alF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gfHxcblx0XHRcdFx0XHR0d2Vlbi5lbGVtLnN0eWxlWyBmaW5hbFByb3BOYW1lKCB0d2Vlbi5wcm9wICkgXSAhPSBudWxsICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIFBhbmljIGJhc2VkIGFwcHJvYWNoIHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xuVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdlZW4uZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmVhc2luZyA9IHtcblx0bGluZWFyOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gcDtcblx0fSxcblx0c3dpbmc6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgKSAvIDI7XG5cdH0sXG5cdF9kZWZhdWx0OiBcInN3aW5nXCJcbn07XG5cbmpRdWVyeS5meCA9IFR3ZWVuLnByb3RvdHlwZS5pbml0O1xuXG4vLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludFxualF1ZXJ5LmZ4LnN0ZXAgPSB7fTtcblxuXG5cblxudmFyXG5cdGZ4Tm93LCBpblByb2dyZXNzLFxuXHRyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxcblx0cnJ1biA9IC9xdWV1ZUhvb2tzJC87XG5cbmZ1bmN0aW9uIHNjaGVkdWxlKCkge1xuXHRpZiAoIGluUHJvZ3Jlc3MgKSB7XG5cdFx0aWYgKCBkb2N1bWVudC5oaWRkZW4gPT09IGZhbHNlICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKSB7XG5cdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBzY2hlZHVsZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApO1xuXHRcdH1cblxuXHRcdGpRdWVyeS5meC50aWNrKCk7XG5cdH1cbn1cblxuLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseVxuZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRmeE5vdyA9IHVuZGVmaW5lZDtcblx0fSApO1xuXHRyZXR1cm4gKCBmeE5vdyA9IERhdGUubm93KCkgKTtcbn1cblxuLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmltYXRpb25cbmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7XG5cdHZhciB3aGljaCxcblx0XHRpID0gMCxcblx0XHRhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07XG5cblx0Ly8gSWYgd2UgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAxIHRvIGRvIGFsbCBjc3NFeHBhbmQgdmFsdWVzLFxuXHQvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodFxuXHRpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGggPyAxIDogMDtcblx0Zm9yICggOyBpIDwgNDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkge1xuXHRcdHdoaWNoID0gY3NzRXhwYW5kWyBpIF07XG5cdFx0YXR0cnNbIFwibWFyZ2luXCIgKyB3aGljaCBdID0gYXR0cnNbIFwicGFkZGluZ1wiICsgd2hpY2ggXSA9IHR5cGU7XG5cdH1cblxuXHRpZiAoIGluY2x1ZGVXaWR0aCApIHtcblx0XHRhdHRycy5vcGFjaXR5ID0gYXR0cnMud2lkdGggPSB0eXBlO1xuXHR9XG5cblx0cmV0dXJuIGF0dHJzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHtcblx0dmFyIHR3ZWVuLFxuXHRcdGNvbGxlY3Rpb24gPSAoIEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCBBbmltYXRpb24udHdlZW5lcnNbIFwiKlwiIF0gKSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHtcblxuXHRcdFx0Ly8gV2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHlcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7XG5cdHZhciBwcm9wLCB2YWx1ZSwgdG9nZ2xlLCBob29rcywgb2xkZmlyZSwgcHJvcFR3ZWVuLCByZXN0b3JlRGlzcGxheSwgZGlzcGxheSxcblx0XHRpc0JveCA9IFwid2lkdGhcIiBpbiBwcm9wcyB8fCBcImhlaWdodFwiIGluIHByb3BzLFxuXHRcdGFuaW0gPSB0aGlzLFxuXHRcdG9yaWcgPSB7fSxcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGUsXG5cdFx0aGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbldpdGhpblRyZWUoIGVsZW0gKSxcblx0XHRkYXRhU2hvdyA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJmeHNob3dcIiApO1xuXG5cdC8vIFF1ZXVlLXNraXBwaW5nIGFuaW1hdGlvbnMgaGlqYWNrIHRoZSBmeCBob29rc1xuXHRpZiAoICFvcHRzLnF1ZXVlICkge1xuXHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCBcImZ4XCIgKTtcblx0XHRpZiAoIGhvb2tzLnVucXVldWVkID09IG51bGwgKSB7XG5cdFx0XHRob29rcy51bnF1ZXVlZCA9IDA7XG5cdFx0XHRvbGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhaG9va3MudW5xdWV1ZWQgKSB7XG5cdFx0XHRcdFx0b2xkZmlyZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRob29rcy51bnF1ZXVlZCsrO1xuXG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBFbnN1cmUgdGhlIGNvbXBsZXRlIGhhbmRsZXIgaXMgY2FsbGVkIGJlZm9yZSB0aGlzIGNvbXBsZXRlc1xuXHRcdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRob29rcy51bnF1ZXVlZC0tO1xuXHRcdFx0XHRpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sIFwiZnhcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBEZXRlY3Qgc2hvdy9oaWRlIGFuaW1hdGlvbnNcblx0Zm9yICggcHJvcCBpbiBwcm9wcyApIHtcblx0XHR2YWx1ZSA9IHByb3BzWyBwcm9wIF07XG5cdFx0aWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkge1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBwcm9wIF07XG5cdFx0XHR0b2dnbGUgPSB0b2dnbGUgfHwgdmFsdWUgPT09IFwidG9nZ2xlXCI7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAoIGhpZGRlbiA/IFwiaGlkZVwiIDogXCJzaG93XCIgKSApIHtcblxuXHRcdFx0XHQvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgXCJzaG93XCIgYW5kXG5cdFx0XHRcdC8vIHRoZXJlIGlzIHN0aWxsIGRhdGEgZnJvbSBhIHN0b3BwZWQgc2hvdy9oaWRlXG5cdFx0XHRcdGlmICggdmFsdWUgPT09IFwic2hvd1wiICYmIGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSB0cnVlO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBhbGwgb3RoZXIgbm8tb3Agc2hvdy9oaWRlIGRhdGFcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBCYWlsIG91dCBpZiB0aGlzIGlzIGEgbm8tb3AgbGlrZSAuaGlkZSgpLmhpZGUoKVxuXHRwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7XG5cdGlmICggIXByb3BUd2VlbiAmJiBqUXVlcnkuaXNFbXB0eU9iamVjdCggb3JpZyApICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFJlc3RyaWN0IFwib3ZlcmZsb3dcIiBhbmQgXCJkaXNwbGF5XCIgc3R5bGVzIGR1cmluZyBib3ggYW5pbWF0aW9uc1xuXHRpZiAoIGlzQm94ICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDE1XG5cdFx0Ly8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRSBkb2VzIG5vdCBpbmZlciB0aGUgc2hvcnRoYW5kXG5cdFx0Ly8gZnJvbSBpZGVudGljYWxseS12YWx1ZWQgb3ZlcmZsb3dYIGFuZCBvdmVyZmxvd1kgYW5kIEVkZ2UganVzdCBtaXJyb3JzXG5cdFx0Ly8gdGhlIG92ZXJmbG93WCB2YWx1ZSB0aGVyZS5cblx0XHRvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTtcblxuXHRcdC8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZVxuXHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTtcblx0XHRpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7XG5cdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHR9XG5cdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdGlmICggcmVzdG9yZURpc3BsYXkgKSB7XG5cdFx0XHRcdGRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gR2V0IG5vbmVtcHR5IHZhbHVlKHMpIGJ5IHRlbXBvcmFyaWx5IGZvcmNpbmcgdmlzaWJpbGl0eVxuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdFx0cmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7XG5cdFx0XHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBbmltYXRlIGlubGluZSBlbGVtZW50cyBhcyBpbmxpbmUtYmxvY2tcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwiaW5saW5lXCIgfHwgZGlzcGxheSA9PT0gXCJpbmxpbmUtYmxvY2tcIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcImZsb2F0XCIgKSA9PT0gXCJub25lXCIgKSB7XG5cblx0XHRcdFx0Ly8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgZGlzcGxheSB2YWx1ZSBhdCB0aGUgZW5kIG9mIHB1cmUgc2hvdy9oaWRlIGFuaW1hdGlvbnNcblx0XHRcdFx0aWYgKCAhcHJvcFR3ZWVuICkge1xuXHRcdFx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRzdHlsZS5kaXNwbGF5ID0gcmVzdG9yZURpc3BsYXk7XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdGRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5O1xuXHRcdFx0XHRcdFx0cmVzdG9yZURpc3BsYXkgPSBkaXNwbGF5ID09PSBcIm5vbmVcIiA/IFwiXCIgOiBkaXNwbGF5O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRzdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoIG9wdHMub3ZlcmZsb3cgKSB7XG5cdFx0c3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuXHRcdGFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdHN0eWxlLm92ZXJmbG93ID0gb3B0cy5vdmVyZmxvd1sgMCBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dZID0gb3B0cy5vdmVyZmxvd1sgMiBdO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRwcm9wVHdlZW4gPSBmYWxzZTtcblx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXG5cdFx0Ly8gR2VuZXJhbCBzaG93L2hpZGUgc2V0dXAgZm9yIHRoaXMgZWxlbWVudCBhbmltYXRpb25cblx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRpZiAoIGRhdGFTaG93ICkge1xuXHRcdFx0XHRpZiAoIFwiaGlkZGVuXCIgaW4gZGF0YVNob3cgKSB7XG5cdFx0XHRcdFx0aGlkZGVuID0gZGF0YVNob3cuaGlkZGVuO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgXCJmeHNob3dcIiwgeyBkaXNwbGF5OiByZXN0b3JlRGlzcGxheSB9ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0b3JlIGhpZGRlbi92aXNpYmxlIGZvciB0b2dnbGUgc28gYC5zdG9wKCkudG9nZ2xlKClgIFwicmV2ZXJzZXNcIlxuXHRcdFx0aWYgKCB0b2dnbGUgKSB7XG5cdFx0XHRcdGRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNob3cgZWxlbWVudHMgYmVmb3JlIGFuaW1hdGluZyB0aGVtXG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0c2hvd0hpZGUoIFsgZWxlbSBdLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqL1xuXG5cdFx0XHRhbmltLmRvbmUoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdFx0Ly8gVGhlIGZpbmFsIHN0ZXAgb2YgYSBcImhpZGVcIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50XG5cdFx0XHRcdGlmICggIWhpZGRlbiApIHtcblx0XHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBQZXItcHJvcGVydHkgc2V0dXBcblx0XHRwcm9wVHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0cHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdFx0cHJvcFR3ZWVuLnN0YXJ0ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBBbmltYXRpb24ucHJlZmlsdGVycy5sZW5ndGgsXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSApLFxuXHRcdHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdFx0cmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHlcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbW9yZSB0byBkbywgeWllbGRcblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhbiBlbXB0eSBhbmltYXRpb24sIHN5bnRoZXNpemUgYSBmaW5hbCBwcm9ncmVzcyBub3RpZmljYXRpb25cblx0XHRcdGlmICggIWxlbmd0aCApIHtcblx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNvbHZlIHRoZSBhbmltYXRpb24gYW5kIHJlcG9ydCBpdHMgY29uY2x1c2lvblxuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdFx0fSxcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xuXHRcdFx0XHR2YXIgaW5kZXggPSAwLFxuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0XG5cdFx0XHRcdFx0bGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDtcblx0XHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0b3BwZWQgPSB0cnVlO1xuXHRcdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdFxuXHRcdFx0XHRpZiAoIGdvdG9FbmQgKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdH0gKSxcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcblxuXHRwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0cmVzdWx0ID0gQW5pbWF0aW9uLnByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdGlmICggaXNGdW5jdGlvbiggcmVzdWx0LnN0b3AgKSApIHtcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCBhbmltYXRpb24uZWxlbSwgYW5pbWF0aW9uLm9wdHMucXVldWUgKS5zdG9wID1cblx0XHRcdFx0XHRyZXN1bHQuc3RvcC5iaW5kKCByZXN1bHQgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBhbmltYXRpb24gKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIGFuaW1hdGlvbi5vcHRzLnN0YXJ0ICkgKSB7XG5cdFx0YW5pbWF0aW9uLm9wdHMuc3RhcnQuY2FsbCggZWxlbSwgYW5pbWF0aW9uICk7XG5cdH1cblxuXHQvLyBBdHRhY2ggY2FsbGJhY2tzIGZyb20gb3B0aW9uc1xuXHRhbmltYXRpb25cblx0XHQucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzIClcblx0XHQuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKVxuXHRcdC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsIClcblx0XHQuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTtcblxuXHRqUXVlcnkuZngudGltZXIoXG5cdFx0alF1ZXJ5LmV4dGVuZCggdGljaywge1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdGFuaW06IGFuaW1hdGlvbixcblx0XHRcdHF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZVxuXHRcdH0gKVxuXHQpO1xuXG5cdHJldHVybiBhbmltYXRpb247XG59XG5cbmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHtcblxuXHR0d2VlbmVyczoge1xuXHRcdFwiKlwiOiBbIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHtcblx0XHRcdHZhciB0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICk7XG5cdFx0XHRhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTtcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9IF1cblx0fSxcblxuXHR0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHtcblx0XHRcdGNhbGxiYWNrID0gcHJvcHM7XG5cdFx0XHRwcm9wcyA9IFsgXCIqXCIgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcHMgPSBwcm9wcy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApO1xuXHRcdH1cblxuXHRcdHZhciBwcm9wLFxuXHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0bGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdHByb3AgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdID0gQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW107XG5cdFx0XHRBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH1cblx0fSxcblxuXHRwcmVmaWx0ZXJzOiBbIGRlZmF1bHRQcmVmaWx0ZXIgXSxcblxuXHRwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHtcblx0XHRpZiAoIHByZXBlbmQgKSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy5wdXNoKCBjYWxsYmFjayApO1xuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7XG5cdHZhciBvcHQgPSBzcGVlZCAmJiB0eXBlb2Ygc3BlZWQgPT09IFwib2JqZWN0XCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHtcblx0XHRjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fFxuXHRcdFx0aXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCxcblx0XHRkdXJhdGlvbjogc3BlZWQsXG5cdFx0ZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFpc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmdcblx0fTtcblxuXHQvLyBHbyB0byB0aGUgZW5kIHN0YXRlIGlmIGZ4IGFyZSBvZmZcblx0aWYgKCBqUXVlcnkuZngub2ZmICkge1xuXHRcdG9wdC5kdXJhdGlvbiA9IDA7XG5cblx0fSBlbHNlIHtcblx0XHRpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiBcImZ4XCJcblx0aWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7XG5cdFx0b3B0LnF1ZXVlID0gXCJmeFwiO1xuXHR9XG5cblx0Ly8gUXVldWVpbmdcblx0b3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTtcblxuXHRvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHtcblx0XHRcdG9wdC5vbGQuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0LnF1ZXVlICkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gb3B0O1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cblx0XHQvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDBcblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggXCJvcGFjaXR5XCIsIDAgKS5zaG93KClcblxuXHRcdFx0Ly8gQW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkXG5cdFx0XHQuZW5kKCkuYW5pbWF0ZSggeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9LFxuXHRhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSxcblx0XHRcdG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSxcblx0XHRcdGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3Rcblx0XHRcdFx0dmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApO1xuXG5cdFx0XHRcdC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBpbW1lZGlhdGVseVxuXHRcdFx0XHRpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgXCJmaW5pc2hcIiApICkge1xuXHRcdFx0XHRcdGFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0ZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247XG5cblx0XHRyZXR1cm4gZW1wdHkgfHwgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/XG5cdFx0XHR0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOlxuXHRcdFx0dGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApO1xuXHR9LFxuXHRzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHtcblx0XHR2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkge1xuXHRcdFx0dmFyIHN0b3AgPSBob29rcy5zdG9wO1xuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRzdG9wKCBnb3RvRW5kICk7XG5cdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRnb3RvRW5kID0gY2xlYXJRdWV1ZTtcblx0XHRcdGNsZWFyUXVldWUgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBjbGVhclF1ZXVlICkge1xuXHRcdFx0dGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZGVxdWV1ZSA9IHRydWUsXG5cdFx0XHRcdGluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyBcInF1ZXVlSG9va3NcIixcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkge1xuXHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpbmRleCBpbiBkYXRhICkge1xuXHRcdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgJiYgcnJ1bi50ZXN0KCBpbmRleCApICkge1xuXHRcdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiZcblx0XHRcdFx0XHQoIHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSApIHtcblxuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIGdvdG9FbmQgKTtcblx0XHRcdFx0XHRkZXF1ZXVlID0gZmFsc2U7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkLlxuXHRcdFx0Ly8gVGltZXJzIGN1cnJlbnRseSB3aWxsIGNhbGwgdGhlaXIgY29tcGxldGUgY2FsbGJhY2tzLCB3aGljaFxuXHRcdFx0Ly8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLlxuXHRcdFx0aWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblx0ZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRpZiAoIHR5cGUgIT09IGZhbHNlICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpbmRleCxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApLFxuXHRcdFx0XHRxdWV1ZSA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlXCIgXSxcblx0XHRcdFx0aG9va3MgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgXSxcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0bGVuZ3RoID0gcXVldWUgPyBxdWV1ZS5sZW5ndGggOiAwO1xuXG5cdFx0XHQvLyBFbmFibGUgZmluaXNoaW5nIGZsYWcgb24gcHJpdmF0ZSBkYXRhXG5cdFx0XHRkYXRhLmZpbmlzaCA9IHRydWU7XG5cblx0XHRcdC8vIEVtcHR5IHRoZSBxdWV1ZSBmaXJzdFxuXHRcdFx0alF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBbXSApO1xuXG5cdFx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnN0b3AgKSB7XG5cdFx0XHRcdGhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7XG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFuaW1hdGlvbnMgaW4gdGhlIG9sZCBxdWV1ZSBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGlmICggcXVldWVbIGluZGV4IF0gJiYgcXVldWVbIGluZGV4IF0uZmluaXNoICkge1xuXHRcdFx0XHRcdHF1ZXVlWyBpbmRleCBdLmZpbmlzaC5jYWxsKCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVHVybiBvZmYgZmluaXNoaW5nIGZsYWdcblx0XHRcdGRlbGV0ZSBkYXRhLmZpbmlzaDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJ0b2dnbGVcIiwgXCJzaG93XCIsIFwiaGlkZVwiIF0sIGZ1bmN0aW9uKCBfaSwgbmFtZSApIHtcblx0dmFyIGNzc0ZuID0galF1ZXJ5LmZuWyBuYW1lIF07XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBzcGVlZCA9PSBudWxsIHx8IHR5cGVvZiBzcGVlZCA9PT0gXCJib29sZWFuXCIgP1xuXHRcdFx0Y3NzRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApIDpcblx0XHRcdHRoaXMuYW5pbWF0ZSggZ2VuRngoIG5hbWUsIHRydWUgKSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxuLy8gR2VuZXJhdGUgc2hvcnRjdXRzIGZvciBjdXN0b20gYW5pbWF0aW9uc1xualF1ZXJ5LmVhY2goIHtcblx0c2xpZGVEb3duOiBnZW5GeCggXCJzaG93XCIgKSxcblx0c2xpZGVVcDogZ2VuRngoIFwiaGlkZVwiICksXG5cdHNsaWRlVG9nZ2xlOiBnZW5GeCggXCJ0b2dnbGVcIiApLFxuXHRmYWRlSW46IHsgb3BhY2l0eTogXCJzaG93XCIgfSxcblx0ZmFkZU91dDogeyBvcGFjaXR5OiBcImhpZGVcIiB9LFxuXHRmYWRlVG9nZ2xlOiB7IG9wYWNpdHk6IFwidG9nZ2xlXCIgfVxufSwgZnVuY3Rpb24oIG5hbWUsIHByb3BzICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5hbmltYXRlKCBwcm9wcywgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LnRpbWVycyA9IFtdO1xualF1ZXJ5LmZ4LnRpY2sgPSBmdW5jdGlvbigpIHtcblx0dmFyIHRpbWVyLFxuXHRcdGkgPSAwLFxuXHRcdHRpbWVycyA9IGpRdWVyeS50aW1lcnM7XG5cblx0ZnhOb3cgPSBEYXRlLm5vdygpO1xuXG5cdGZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHtcblx0XHR0aW1lciA9IHRpbWVyc1sgaSBdO1xuXG5cdFx0Ly8gUnVuIHRoZSB0aW1lciBhbmQgc2FmZWx5IHJlbW92ZSBpdCB3aGVuIGRvbmUgKGFsbG93aW5nIGZvciBleHRlcm5hbCByZW1vdmFsKVxuXHRcdGlmICggIXRpbWVyKCkgJiYgdGltZXJzWyBpIF0gPT09IHRpbWVyICkge1xuXHRcdFx0dGltZXJzLnNwbGljZSggaS0tLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0aWYgKCAhdGltZXJzLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZnguc3RvcCgpO1xuXHR9XG5cdGZ4Tm93ID0gdW5kZWZpbmVkO1xufTtcblxualF1ZXJ5LmZ4LnRpbWVyID0gZnVuY3Rpb24oIHRpbWVyICkge1xuXHRqUXVlcnkudGltZXJzLnB1c2goIHRpbWVyICk7XG5cdGpRdWVyeS5meC5zdGFydCgpO1xufTtcblxualF1ZXJ5LmZ4LmludGVydmFsID0gMTM7XG5qUXVlcnkuZnguc3RhcnQgPSBmdW5jdGlvbigpIHtcblx0aWYgKCBpblByb2dyZXNzICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGluUHJvZ3Jlc3MgPSB0cnVlO1xuXHRzY2hlZHVsZSgpO1xufTtcblxualF1ZXJ5LmZ4LnN0b3AgPSBmdW5jdGlvbigpIHtcblx0aW5Qcm9ncmVzcyA9IG51bGw7XG59O1xuXG5qUXVlcnkuZnguc3BlZWRzID0ge1xuXHRzbG93OiA2MDAsXG5cdGZhc3Q6IDIwMCxcblxuXHQvLyBEZWZhdWx0IHNwZWVkXG5cdF9kZWZhdWx0OiA0MDBcbn07XG5cblxuLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLlxuLy8gaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTAwMzI0MDE0NzQ3L2h0dHA6Ly9ibGluZHNpZ25hbHMuY29tL2luZGV4LnBocC8yMDA5LzA3L2pxdWVyeS1kZWxheS9cbmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkge1xuXHR0aW1lID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4LnNwZWVkc1sgdGltZSBdIHx8IHRpbWUgOiB0aW1lO1xuXHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHtcblx0XHR2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7XG5cdFx0aG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dCApO1xuXHRcdH07XG5cdH0gKTtcbn07XG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICksXG5cdFx0c2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzZWxlY3RcIiApLFxuXHRcdG9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvcHRpb25cIiApICk7XG5cblx0aW5wdXQudHlwZSA9IFwiY2hlY2tib3hcIjtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4zIG9ubHlcblx0Ly8gRGVmYXVsdCB2YWx1ZSBmb3IgYSBjaGVja2JveCBzaG91bGQgYmUgXCJvblwiXG5cdHN1cHBvcnQuY2hlY2tPbiA9IGlucHV0LnZhbHVlICE9PSBcIlwiO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdFxuXHRzdXBwb3J0Lm9wdFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkO1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHQvLyBBbiBpbnB1dCBsb3NlcyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpb1xuXHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRpbnB1dC52YWx1ZSA9IFwidFwiO1xuXHRpbnB1dC50eXBlID0gXCJyYWRpb1wiO1xuXHRzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gXCJ0XCI7XG59ICkoKTtcblxuXG52YXIgYm9vbEhvb2ssXG5cdGF0dHJIYW5kbGUgPSBqUXVlcnkuZXhwci5hdHRySGFuZGxlO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHR2YXIgcmV0LCBob29rcyxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXR0cmlidXRlIGhvb2tzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBsb3dlcmNhc2UgdmVyc2lvblxuXHRcdC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWRcblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblx0XHRcdGhvb2tzID0galF1ZXJ5LmF0dHJIb29rc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0KCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSA/IGJvb2xIb29rIDogdW5kZWZpbmVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gbnVsbCApIHtcblx0XHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgdmFsdWUgKyBcIlwiICk7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmICggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBuYW1lICkgKSAhPT0gbnVsbCApIHtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXG5cdFx0cmV0ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0Ly8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWRcblx0XHRyZXR1cm4gcmV0ID09IG51bGwgPyB1bmRlZmluZWQgOiByZXQ7XG5cdH0sXG5cblx0YXR0ckhvb2tzOiB7XG5cdFx0dHlwZToge1xuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggIXN1cHBvcnQucmFkaW9WYWx1ZSAmJiB2YWx1ZSA9PT0gXCJyYWRpb1wiICYmXG5cdFx0XHRcdFx0bm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBlbGVtLnZhbHVlO1xuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgdmFsdWUgKTtcblx0XHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRcdGVsZW0udmFsdWUgPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0dmFyIG5hbWUsXG5cdFx0XHRpID0gMCxcblxuXHRcdFx0Ly8gQXR0cmlidXRlIG5hbWVzIGNhbiBjb250YWluIG5vbi1IVE1MIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xuXHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjYXR0cmlidXRlcy0yXG5cdFx0XHRhdHRyTmFtZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApO1xuXG5cdFx0aWYgKCBhdHRyTmFtZXMgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdHdoaWxlICggKCBuYW1lID0gYXR0ck5hbWVzWyBpKysgXSApICkge1xuXHRcdFx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBIb29rcyBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzXG5ib29sSG9vayA9IHtcblx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7XG5cdFx0aWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBib29sZWFuIGF0dHJpYnV0ZXMgd2hlbiBzZXQgdG8gZmFsc2Vcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lICk7XG5cdFx0fVxuXHRcdHJldHVybiBuYW1lO1xuXHR9XG59O1xuXG5qUXVlcnkuZWFjaCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goIC9cXHcrL2cgKSwgZnVuY3Rpb24oIF9pLCBuYW1lICkge1xuXHR2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7XG5cblx0YXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciByZXQsIGhhbmRsZSxcblx0XHRcdGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRpZiAoICFpc1hNTCApIHtcblxuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRsb3dlcmNhc2VOYW1lIDpcblx0XHRcdFx0bnVsbDtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn0gKTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF07XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XG5cdFx0XHRcdC8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0L1xuXHRcdFx0XHQvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2YWwoIzEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRpZiAoIHRhYmluZGV4ICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRyY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJlxuXHRcdFx0XHRcdGVsZW0uaHJlZlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuLy8gZXNsaW50IHJ1bGUgXCJuby11bnVzZWQtZXhwcmVzc2lvbnNcIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlXG4vLyBzaW5jZSBpdCBjb25zaWRlcnMgc3VjaCBhY2Nlc3Npb25zIG5vb3BcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG5cdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBIVE1MIHNwZWNcblx0Ly8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlXG5cdGZ1bmN0aW9uIHN0cmlwQW5kQ29sbGFwc2UoIHZhbHVlICkge1xuXHRcdHZhciB0b2tlbnMgPSB2YWx1ZS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHRcdHJldHVybiB0b2tlbnMuam9pbiggXCIgXCIgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHtcblx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc2VzLmxlbmd0aCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hdHRyKCBcImNsYXNzXCIsIFwiXCIgKTtcblx0XHR9XG5cblx0XHRjbGFzc2VzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzZXMubGVuZ3RoICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xuXHRcdHZhciB0eXBlID0gdHlwZW9mIHZhbHVlLFxuXHRcdFx0aXNWYWxpZFZhbHVlID0gdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIGlzVmFsaWRWYWx1ZSApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyhcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLFxuXHRcdFx0XHRcdHN0YXRlVmFsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY2xhc3NOYW1lLCBpLCBzZWxmLCBjbGFzc05hbWVzO1xuXG5cdFx0XHRpZiAoIGlzVmFsaWRWYWx1ZSApIHtcblxuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHRpID0gMDtcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXHRcdFx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRcdFx0d2hpbGUgKCAoIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XHRcIlwiIDpcblx0XHRcdFx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiApIHx8IFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZSwgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Y2xhc3NOYW1lID0gXCIgXCIgKyBzZWxlY3RvciArIFwiIFwiO1xuXHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggZ2V0Q2xhc3MoIGVsZW0gKSApICsgXCIgXCIgKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+IC0xICkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn0gKTtcblxuXG5cblxudmFyIHJyZXR1cm4gPSAvXFxyL2c7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0dmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGhvb2tzLCByZXQsIHZhbHVlSXNGdW5jdGlvbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF07XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF0gfHxcblx0XHRcdFx0XHRqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHRcdGlmICggaG9va3MgJiZcblx0XHRcdFx0XHRcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdFx0KCByZXQgPSBob29rcy5nZXQoIGVsZW0sIFwidmFsdWVcIiApICkgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0ID0gZWxlbS52YWx1ZTtcblxuXHRcdFx0XHQvLyBIYW5kbGUgbW9zdCBjb21tb24gc3RyaW5nIGNhc2VzXG5cdFx0XHRcdGlmICggdHlwZW9mIHJldCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcmV0LnJlcGxhY2UoIHJyZXR1cm4sIFwiXCIgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlclxuXHRcdFx0XHRyZXR1cm4gcmV0ID09IG51bGwgPyBcIlwiIDogcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0dmFyIHZhbDtcblxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZS5jYWxsKCB0aGlzLCBpLCBqUXVlcnkoIHRoaXMgKS52YWwoKSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFsID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzIFwiXCI7IGNvbnZlcnQgbnVtYmVycyB0byBzdHJpbmdcblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHZhbCA9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWwgPT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdHZhbCArPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCB2YWwgKSApIHtcblx0XHRcdFx0dmFsID0galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKyBcIlwiO1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cblx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLnR5cGUgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdO1xuXG5cdFx0XHQvLyBJZiBzZXQgcmV0dXJucyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBub3JtYWwgc2V0dGluZ1xuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8IGhvb2tzLnNldCggdGhpcywgdmFsLCBcInZhbHVlXCIgKSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHR0aGlzLnZhbHVlID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHZhbEhvb2tzOiB7XG5cdFx0b3B0aW9uOiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHRcdHZhciB2YWwgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInZhbHVlXCIgKTtcblx0XHRcdFx0cmV0dXJuIHZhbCAhPSBudWxsID9cblx0XHRcdFx0XHR2YWwgOlxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExIG9ubHlcblx0XHRcdFx0XHQvLyBvcHRpb24udGV4dCB0aHJvd3MgZXhjZXB0aW9ucyAoIzE0Njg2LCAjMTQ4NTgpXG5cdFx0XHRcdFx0Ly8gU3RyaXAgYW5kIGNvbGxhcHNlIHdoaXRlc3BhY2Vcblx0XHRcdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2Utd2hpdGVzcGFjZVxuXHRcdFx0XHRcdHN0cmlwQW5kQ29sbGFwc2UoIGpRdWVyeS50ZXh0KCBlbGVtICkgKTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHNlbGVjdDoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIHZhbHVlLCBvcHRpb24sIGksXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHRpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCxcblx0XHRcdFx0XHRvbmUgPSBlbGVtLnR5cGUgPT09IFwic2VsZWN0LW9uZVwiLFxuXHRcdFx0XHRcdHZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSxcblx0XHRcdFx0XHRtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHRpZiAoIGluZGV4IDwgMCApIHtcblx0XHRcdFx0XHRpID0gbWF4O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aSA9IG9uZSA/IGluZGV4IDogMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnNcblx0XHRcdFx0Zm9yICggOyBpIDwgbWF4OyBpKysgKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHQvLyBJRTgtOSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICgjMjU1MSlcblx0XHRcdFx0XHRpZiAoICggb3B0aW9uLnNlbGVjdGVkIHx8IGkgPT09IGluZGV4ICkgJiZcblxuXHRcdFx0XHRcdFx0XHQvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHRcdFx0XHRcdCFvcHRpb24uZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdFx0KCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHxcblx0XHRcdFx0XHRcdFx0XHQhbm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCBcIm9wdGdyb3VwXCIgKSApICkge1xuXG5cdFx0XHRcdFx0XHQvLyBHZXQgdGhlIHNwZWNpZmljIHZhbHVlIGZvciB0aGUgb3B0aW9uXG5cdFx0XHRcdFx0XHR2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7XG5cblx0XHRcdFx0XHRcdC8vIFdlIGRvbid0IG5lZWQgYW4gYXJyYXkgZm9yIG9uZSBzZWxlY3RzXG5cdFx0XHRcdFx0XHRpZiAoIG9uZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheVxuXHRcdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgb3B0aW9uU2V0LCBvcHRpb24sXG5cdFx0XHRcdFx0b3B0aW9ucyA9IGVsZW0ub3B0aW9ucyxcblx0XHRcdFx0XHR2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApLFxuXHRcdFx0XHRcdGkgPSBvcHRpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXG5cdFx0XHRcdFx0aWYgKCBvcHRpb24uc2VsZWN0ZWQgPVxuXHRcdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGpRdWVyeS52YWxIb29rcy5vcHRpb24uZ2V0KCBvcHRpb24gKSwgdmFsdWVzICkgPiAtMVxuXHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0b3B0aW9uU2V0ID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWNvbmQtYXNzaWduICovXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBGb3JjZSBicm93c2VycyB0byBiZWhhdmUgY29uc2lzdGVudGx5IHdoZW4gbm9uLW1hdGNoaW5nIHZhbHVlIGlzIHNldFxuXHRcdFx0XHRpZiAoICFvcHRpb25TZXQgKSB7XG5cdFx0XHRcdFx0ZWxlbS5zZWxlY3RlZEluZGV4ID0gLTE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHZhbHVlcztcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gUmFkaW9zIGFuZCBjaGVja2JveGVzIGdldHRlci9zZXR0ZXJcbmpRdWVyeS5lYWNoKCBbIFwicmFkaW9cIiwgXCJjaGVja2JveFwiIF0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXSA9IHtcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS5jaGVja2VkID0galF1ZXJ5LmluQXJyYXkoIGpRdWVyeSggZWxlbSApLnZhbCgpLCB2YWx1ZSApID4gLTEgKTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGlmICggIXN1cHBvcnQuY2hlY2tPbiApIHtcblx0XHRqUXVlcnkudmFsSG9va3NbIHRoaXMgXS5nZXQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IG51bGwgPyBcIm9uXCIgOiBlbGVtLnZhbHVlO1xuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUmV0dXJuIGpRdWVyeSBmb3IgYXR0cmlidXRlcy1vbmx5IGluY2x1c2lvblxuXG5cbnN1cHBvcnQuZm9jdXNpbiA9IFwib25mb2N1c2luXCIgaW4gd2luZG93O1xuXG5cbnZhciByZm9jdXNNb3JwaCA9IC9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxcblx0c3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgPSBmdW5jdGlvbiggZSApIHtcblx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9O1xuXG5qUXVlcnkuZXh0ZW5kKCBqUXVlcnkuZXZlbnQsIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHtcblxuXHRcdHZhciBpLCBjdXIsIHRtcCwgYnViYmxlVHlwZSwgb250eXBlLCBoYW5kbGUsIHNwZWNpYWwsIGxhc3RFbGVtZW50LFxuXHRcdFx0ZXZlbnRQYXRoID0gWyBlbGVtIHx8IGRvY3VtZW50IF0sXG5cdFx0XHR0eXBlID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcInR5cGVcIiApID8gZXZlbnQudHlwZSA6IGV2ZW50LFxuXHRcdFx0bmFtZXNwYWNlcyA9IGhhc093bi5jYWxsKCBldmVudCwgXCJuYW1lc3BhY2VcIiApID8gZXZlbnQubmFtZXNwYWNlLnNwbGl0KCBcIi5cIiApIDogW107XG5cblx0XHRjdXIgPSBsYXN0RWxlbWVudCA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50O1xuXG5cdFx0Ly8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3dcblx0XHRpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlLmluZGV4T2YoIFwiLlwiICkgPiAtMSApIHtcblxuXHRcdFx0Ly8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKVxuXHRcdFx0bmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIFwiLlwiICk7XG5cdFx0XHR0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpO1xuXHRcdFx0bmFtZXNwYWNlcy5zb3J0KCk7XG5cdFx0fVxuXHRcdG9udHlwZSA9IHR5cGUuaW5kZXhPZiggXCI6XCIgKSA8IDAgJiYgXCJvblwiICsgdHlwZTtcblxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhIGpRdWVyeS5FdmVudCBvYmplY3QsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBlIHN0cmluZ1xuXHRcdGV2ZW50ID0gZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0ZXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSBcIm9iamVjdFwiICYmIGV2ZW50ICk7XG5cblx0XHQvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpXG5cdFx0ZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7XG5cdFx0ZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApO1xuXHRcdGV2ZW50LnJuYW1lc3BhY2UgPSBldmVudC5uYW1lc3BhY2UgP1xuXHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICkgOlxuXHRcdFx0bnVsbDtcblxuXHRcdC8vIENsZWFuIHVwIHRoZSBldmVudCBpbiBjYXNlIGl0IGlzIGJlaW5nIHJldXNlZFxuXHRcdGV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDtcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBlbGVtO1xuXHRcdH1cblxuXHRcdC8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3Rcblx0XHRkYXRhID0gZGF0YSA9PSBudWxsID9cblx0XHRcdFsgZXZlbnQgXSA6XG5cdFx0XHRqUXVlcnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0gKTtcblxuXHRcdC8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXNcblx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICgjOTk1MSlcblx0XHQvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KVxuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhc3BlY2lhbC5ub0J1YmJsZSAmJiAhaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0YnViYmxlVHlwZSA9IHNwZWNpYWwuZGVsZWdhdGVUeXBlIHx8IHR5cGU7XG5cdFx0XHRpZiAoICFyZm9jdXNNb3JwaC50ZXN0KCBidWJibGVUeXBlICsgdHlwZSApICkge1xuXHRcdFx0XHRjdXIgPSBjdXIucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGZvciAoIDsgY3VyOyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIGN1ciApO1xuXHRcdFx0XHR0bXAgPSBjdXI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE9ubHkgYWRkIHdpbmRvdyBpZiB3ZSBnb3QgdG8gZG9jdW1lbnQgKGUuZy4sIG5vdCBwbGFpbiBvYmogb3IgZGV0YWNoZWQgRE9NKVxuXHRcdFx0aWYgKCB0bXAgPT09ICggZWxlbS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50ICkgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCB0bXAuZGVmYXVsdFZpZXcgfHwgdG1wLnBhcmVudFdpbmRvdyB8fCB3aW5kb3cgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGaXJlIGhhbmRsZXJzIG9uIHRoZSBldmVudCBwYXRoXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIGN1ciA9IGV2ZW50UGF0aFsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGxhc3RFbGVtZW50ID0gY3VyO1xuXHRcdFx0ZXZlbnQudHlwZSA9IGkgPiAxID9cblx0XHRcdFx0YnViYmxlVHlwZSA6XG5cdFx0XHRcdHNwZWNpYWwuYmluZFR5cGUgfHwgdHlwZTtcblxuXHRcdFx0Ly8galF1ZXJ5IGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9ICggZGF0YVByaXYuZ2V0KCBjdXIsIFwiZXZlbnRzXCIgKSB8fCBPYmplY3QuY3JlYXRlKCBudWxsICkgKVsgZXZlbnQudHlwZSBdICYmXG5cdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImhhbmRsZVwiICk7XG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0c3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0YWNjZXB0RGF0YSggZWxlbSApICkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0Ly8gVXNlZCBvbmx5IGZvciBgZm9jdXMoaW4gfCBvdXQpYCBldmVudHNcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxuLy8gU3VwcG9ydDogRmlyZWZveCA8PTQ0XG4vLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4N1xuLy9cbi8vIFN1cHBvcnQ6IENocm9tZSA8PTQ4IC0gNDksIFNhZmFyaSA8PTkuMCAtIDkuMVxuLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsXG4vLyB3aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXJcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5pZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7XG5cdGpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cblx0XHQvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxuXHRcdHZhciBoYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSApO1xuXHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gSGFuZGxlOiByZWd1bGFyIG5vZGVzICh2aWEgYHRoaXMub3duZXJEb2N1bWVudGApLCB3aW5kb3dcblx0XHRcdFx0Ly8gKHZpYSBgdGhpcy5kb2N1bWVudGApICYgZG9jdW1lbnQgKHZpYSBgdGhpc2ApLlxuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMuZG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSxcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLmRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4ICkgLSAxO1xuXG5cdFx0XHRcdGlmICggIWF0dGFjaGVzICkge1xuXHRcdFx0XHRcdGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCBvcmlnLCBoYW5kbGVyLCB0cnVlICk7XG5cdFx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBkb2MsIGZpeCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCwgYXR0YWNoZXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH0gKTtcbn1cbnZhciBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjtcblxudmFyIG5vbmNlID0geyBndWlkOiBEYXRlLm5vdygpIH07XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbCwgcGFyc2VyRXJyb3JFbGVtO1xuXHRpZiAoICFkYXRhIHx8IHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHlcblx0Ly8gSUUgdGhyb3dzIG9uIHBhcnNlRnJvbVN0cmluZyB3aXRoIGludmFsaWQgaW5wdXQuXG5cdHRyeSB7XG5cdFx0eG1sID0gKCBuZXcgd2luZG93LkRPTVBhcnNlcigpICkucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCBcInRleHQveG1sXCIgKTtcblx0fSBjYXRjaCAoIGUgKSB7fVxuXG5cdHBhcnNlckVycm9yRWxlbSA9IHhtbCAmJiB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApWyAwIF07XG5cdGlmICggIXhtbCB8fCBwYXJzZXJFcnJvckVsZW0gKSB7XG5cdFx0alF1ZXJ5LmVycm9yKCBcIkludmFsaWQgWE1MOiBcIiArIChcblx0XHRcdHBhcnNlckVycm9yRWxlbSA/XG5cdFx0XHRcdGpRdWVyeS5tYXAoIHBhcnNlckVycm9yRWxlbS5jaGlsZE5vZGVzLCBmdW5jdGlvbiggZWwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsLnRleHRDb250ZW50O1xuXHRcdFx0XHR9ICkuam9pbiggXCJcXG5cIiApIDpcblx0XHRcdFx0ZGF0YVxuXHRcdCkgKTtcblx0fVxuXHRyZXR1cm4geG1sO1xufTtcblxuXG52YXJcblx0cmJyYWNrZXQgPSAvXFxbXFxdJC8sXG5cdHJDUkxGID0gL1xccj9cXG4vZyxcblx0cnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFxuXHRyc3VibWl0dGFibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7XG5cbmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHtcblx0dmFyIG5hbWU7XG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLlxuXHRcdGpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkge1xuXHRcdFx0aWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHtcblxuXHRcdFx0XHQvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuXG5cdFx0XHRcdGFkZCggcHJlZml4LCB2ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguXG5cdFx0XHRcdGJ1aWxkUGFyYW1zKFxuXHRcdFx0XHRcdHByZWZpeCArIFwiW1wiICsgKCB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9IG51bGwgPyBpIDogXCJcIiApICsgXCJdXCIsXG5cdFx0XHRcdFx0dixcblx0XHRcdFx0XHR0cmFkaXRpb25hbCxcblx0XHRcdFx0XHRhZGRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0fSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIHRvVHlwZSggb2JqICkgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgb2JqZWN0IGl0ZW0uXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4ICsgXCJbXCIgKyBuYW1lICsgXCJdXCIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBTZXJpYWxpemUgc2NhbGFyIGl0ZW0uXG5cdFx0YWRkKCBwcmVmaXgsIG9iaiApO1xuXHR9XG59XG5cbi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mXG4vLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmdcbmpRdWVyeS5wYXJhbSA9IGZ1bmN0aW9uKCBhLCB0cmFkaXRpb25hbCApIHtcblx0dmFyIHByZWZpeCxcblx0XHRzID0gW10sXG5cdFx0YWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWVPckZ1bmN0aW9uICkge1xuXG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHVzZSBpdHMgcmV0dXJuIHZhbHVlXG5cdFx0XHR2YXIgdmFsdWUgPSBpc0Z1bmN0aW9uKCB2YWx1ZU9yRnVuY3Rpb24gKSA/XG5cdFx0XHRcdHZhbHVlT3JGdW5jdGlvbigpIDpcblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uO1xuXG5cdFx0XHRzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArIFwiPVwiICtcblx0XHRcdFx0ZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICk7XG5cdFx0fTtcblxuXHRpZiAoIGEgPT0gbnVsbCApIHtcblx0XHRyZXR1cm4gXCJcIjtcblx0fVxuXG5cdC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50c1xuXHRcdGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHtcblx0XHRcdGFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7XG5cdFx0fSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSBcIm9sZFwiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlclxuXHRcdC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxuXHRcdGZvciAoIHByZWZpeCBpbiBhICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uXG5cdHJldHVybiBzLmpvaW4oIFwiJlwiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7XG5cdH0sXG5cdHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDYW4gYWRkIHByb3BIb29rIGZvciBcImVsZW1lbnRzXCIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzXG5cdFx0XHR2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgXCJlbGVtZW50c1wiICk7XG5cdFx0XHRyZXR1cm4gZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpcztcblx0XHR9ICkuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKCBcIjpkaXNhYmxlZFwiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3Ncblx0XHRcdHJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCBcIjpkaXNhYmxlZFwiICkgJiZcblx0XHRcdFx0cnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJlxuXHRcdFx0XHQoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7XG5cdFx0fSApLm1hcCggZnVuY3Rpb24oIF9pLCBlbGVtICkge1xuXHRcdFx0dmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpO1xuXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWwgKSApIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0fSApLmdldCgpO1xuXHR9XG59ICk7XG5cblxudmFyXG5cdHIyMCA9IC8lMjAvZyxcblx0cmhhc2ggPSAvIy4qJC8sXG5cdHJhbnRpQ2FjaGUgPSAvKFs/Jl0pXz1bXiZdKi8sXG5cdHJoZWFkZXJzID0gL14oLio/KTpbIFxcdF0qKFteXFxyXFxuXSopJC9tZyxcblxuXHQvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb25cblx0cmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxcblx0cm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sXG5cdHJwcm90b2NvbCA9IC9eXFwvXFwvLyxcblxuXHQvKiBQcmVmaWx0ZXJzXG5cdCAqIDEpIFRoZXkgYXJlIHVzZWZ1bCB0byBpbnRyb2R1Y2UgY3VzdG9tIGRhdGFUeXBlcyAoc2VlIGFqYXgvanNvbnAuanMgZm9yIGFuIGV4YW1wbGUpXG5cdCAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6XG5cdCAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0cmFuc3BvcnRcblx0ICogICAgLSBBRlRFUiBwYXJhbSBzZXJpYWxpemF0aW9uIChzLmRhdGEgaXMgYSBzdHJpbmcgaWYgcy5wcm9jZXNzRGF0YSBpcyB0cnVlKVxuXHQgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byBcIipcIiBpZiBuZWVkZWRcblx0ICovXG5cdHByZWZpbHRlcnMgPSB7fSxcblxuXHQvKiBUcmFuc3BvcnRzIGJpbmRpbmdzXG5cdCAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogMikgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiAzKSBzZWxlY3Rpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBnbyB0byBcIipcIiBpZiBuZWVkZWRcblx0ICovXG5cdHRyYW5zcG9ydHMgPSB7fSxcblxuXHQvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb25cblx0YWxsVHlwZXMgPSBcIiovXCIuY29uY2F0KCBcIipcIiApLFxuXG5cdC8vIEFuY2hvciB0YWcgZm9yIHBhcnNpbmcgdGhlIGRvY3VtZW50IG9yaWdpblxuXHRvcmlnaW5BbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXG5vcmlnaW5BbmNob3IuaHJlZiA9IGxvY2F0aW9uLmhyZWY7XG5cbi8vIEJhc2UgXCJjb25zdHJ1Y3RvclwiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnRcbmZ1bmN0aW9uIGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlICkge1xuXG5cdC8vIGRhdGFUeXBlRXhwcmVzc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gXCIqXCJcblx0cmV0dXJuIGZ1bmN0aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uO1xuXHRcdFx0ZGF0YVR5cGVFeHByZXNzaW9uID0gXCIqXCI7XG5cdFx0fVxuXG5cdFx0dmFyIGRhdGFUeXBlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBmdW5jICkgKSB7XG5cblx0XHRcdC8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb25cblx0XHRcdHdoaWxlICggKCBkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSsrIF0gKSApIHtcblxuXHRcdFx0XHQvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZFxuXHRcdFx0XHRpZiAoIGRhdGFUeXBlWyAwIF0gPT09IFwiK1wiICkge1xuXHRcdFx0XHRcdGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCBcIipcIjtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnVuc2hpZnQoIGZ1bmMgKTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYXBwZW5kXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0c1xuZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHtcblxuXHR2YXIgaW5zcGVjdGVkID0ge30sXG5cdFx0c2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7XG5cblx0ZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7XG5cdFx0dmFyIHNlbGVjdGVkO1xuXHRcdGluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7XG5cdFx0alF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHtcblx0XHRcdHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7XG5cdFx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHtcblxuXHRcdFx0XHRvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdGluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHtcblx0XHRcdFx0cmV0dXJuICEoIHNlbGVjdGVkID0gZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0XHRyZXR1cm4gc2VsZWN0ZWQ7XG5cdH1cblxuXHRyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbIFwiKlwiIF0gJiYgaW5zcGVjdCggXCIqXCIgKTtcbn1cblxuLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zXG4vLyB0aGF0IHRha2VzIFwiZmxhdFwiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKVxuLy8gRml4ZXMgIzk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKCBkZWVwID0ge30gKSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlXG5cdGlmICggY3QgKSB7XG5cdFx0Zm9yICggdHlwZSBpbiBjb250ZW50cyApIHtcblx0XHRcdGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7XG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxuXHRpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHtcblx0XHRmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1sgMCBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZVxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XG5cdH1cblxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXG5cdC8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkXG5cdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2Vcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xuXHRcdGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7XG5cdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07XG5cdH1cbn1cblxuLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZVxuICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHtcblx0dmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsXG5cdFx0Y29udmVydGVycyA9IHt9LFxuXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVyc1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY29udiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50ID0gdG1wWyAwIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdG1wWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcblx0XHRcdFx0aWYgKCBjb252ICE9PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxuXHRcdFx0XHRcdGlmICggY29udiAmJiBzLnRocm93cyApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGU6IFwicGFyc2VyZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRlcnJvcjogY29udiA/IGUgOiBcIk5vIGNvbnZlcnNpb24gZnJvbSBcIiArIHByZXYgKyBcIiB0byBcIiArIGN1cnJlbnRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4geyBzdGF0ZTogXCJzdWNjZXNzXCIsIGRhdGE6IHJlc3BvbnNlIH07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBsb2NhdGlvbi5ocmVmLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggbG9jYXRpb24ucHJvdG9jb2wgKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cblx0XHQvKlxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0ZGF0YTogbnVsbCxcblx0XHRkYXRhVHlwZTogbnVsbCxcblx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRwYXNzd29yZDogbnVsbCxcblx0XHRjYWNoZTogbnVsbCxcblx0XHR0aHJvd3M6IGZhbHNlLFxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcblx0XHRoZWFkZXJzOiB7fSxcblx0XHQqL1xuXG5cdFx0YWNjZXB0czoge1xuXHRcdFx0XCIqXCI6IGFsbFR5cGVzLFxuXHRcdFx0dGV4dDogXCJ0ZXh0L3BsYWluXCIsXG5cdFx0XHRodG1sOiBcInRleHQvaHRtbFwiLFxuXHRcdFx0eG1sOiBcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixcblx0XHRcdGpzb246IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJcblx0XHR9LFxuXG5cdFx0Y29udGVudHM6IHtcblx0XHRcdHhtbDogL1xcYnhtbFxcYi8sXG5cdFx0XHRodG1sOiAvXFxiaHRtbC8sXG5cdFx0XHRqc29uOiAvXFxianNvblxcYi9cblx0XHR9LFxuXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcblx0XHRcdHhtbDogXCJyZXNwb25zZVhNTFwiLFxuXHRcdFx0dGV4dDogXCJyZXNwb25zZVRleHRcIixcblx0XHRcdGpzb246IFwicmVzcG9uc2VKU09OXCJcblx0XHR9LFxuXG5cdFx0Ly8gRGF0YSBjb252ZXJ0ZXJzXG5cdFx0Ly8gS2V5cyBzZXBhcmF0ZSBzb3VyY2UgKG9yIGNhdGNoYWxsIFwiKlwiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuXHRcdGNvbnZlcnRlcnM6IHtcblxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XG5cdFx0XHRcIiogdGV4dFwiOiBTdHJpbmcsXG5cblx0XHRcdC8vIFRleHQgdG8gaHRtbCAodHJ1ZSA9IG5vIHRyYW5zZm9ybWF0aW9uKVxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcblxuXHRcdFx0Ly8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvblxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogSlNPTi5wYXJzZSxcblxuXHRcdFx0Ly8gUGFyc2UgdGV4dCBhcyB4bWxcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXG5cdFx0fSxcblxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XG5cdFx0Ly8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZlxuXHRcdC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXG5cdFx0ZmxhdE9wdGlvbnM6IHtcblx0XHRcdHVybDogdHJ1ZSxcblx0XHRcdGNvbnRleHQ6IHRydWVcblx0XHR9XG5cdH0sXG5cblx0Ly8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXRcblx0Ly8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLlxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxuXHRhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkge1xuXHRcdHJldHVybiBzZXR0aW5ncyA/XG5cblx0XHRcdC8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0XG5cdFx0XHRhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKSwgc2V0dGluZ3MgKSA6XG5cblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3Ncblx0XHRcdGFqYXhFeHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHRhcmdldCApO1xuXHR9LFxuXG5cdGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLFxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcblxuXHQvLyBNYWluIG1ldGhvZFxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xuXG5cdFx0Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmVcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRvcHRpb25zID0gdXJsO1xuXHRcdFx0dXJsID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHR2YXIgdHJhbnNwb3J0LFxuXG5cdFx0XHQvLyBVUkwgd2l0aG91dCBhbnRpLWNhY2hlIHBhcmFtXG5cdFx0XHRjYWNoZVVSTCxcblxuXHRcdFx0Ly8gUmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxuXG5cdFx0XHQvLyB0aW1lb3V0IGhhbmRsZVxuXHRcdFx0dGltZW91dFRpbWVyLFxuXG5cdFx0XHQvLyBVcmwgY2xlYW51cCB2YXJcblx0XHRcdHVybEFuY2hvcixcblxuXHRcdFx0Ly8gUmVxdWVzdCBzdGF0ZSAoYmVjb21lcyBmYWxzZSB1cG9uIHNlbmQgYW5kIHRydWUgdXBvbiBjb21wbGV0aW9uKVxuXHRcdFx0Y29tcGxldGVkLFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXG5cdFx0XHQvLyB1bmNhY2hlZCBwYXJ0IG9mIHRoZSB1cmxcblx0XHRcdHVuY2FjaGVkLFxuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2JqZWN0XG5cdFx0XHRzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSxcblxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiZcblx0XHRcdFx0KCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0alF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6XG5cdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZVxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXG5cblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdID1cblx0XHRcdFx0XHRcdFx0XHRcdCggcmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdIHx8IFtdIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmNvbmNhdCggbWF0Y2hbIDIgXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgKyBcIiBcIiBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaC5qb2luKCBcIiwgXCIgKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gPVxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xuXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSlcblx0XHQvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGVcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgXCJcIiApXG5cdFx0XHQucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiApO1xuXG5cdFx0Ly8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0XG5cdFx0cy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTtcblxuXHRcdC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3Rcblx0XHRzLmRhdGFUeXBlcyA9ICggcy5kYXRhVHlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblxuXHRcdC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLlxuXHRcdGlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkge1xuXHRcdFx0dXJsQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJhXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEsIEVkZ2UgMTIgLSAxNVxuXHRcdFx0Ly8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCxcblx0XHRcdC8vIGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjgweC9cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gcy51cmw7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEgb25seVxuXHRcdFx0XHQvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZVxuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHVybEFuY2hvci5ocmVmO1xuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gb3JpZ2luQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09XG5cdFx0XHRcdFx0dXJsQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgdXJsQW5jaG9yLmhvc3Q7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbixcblx0XHRcdFx0Ly8gaXQgY2FuIGJlIHJlamVjdGVkIGJ5IHRoZSB0cmFuc3BvcnQgaWYgaXQgaXMgaW52YWxpZFxuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG9cblx0XHQvLyBEb24ndCBmaXJlIGV2ZW50cyBpZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0YXJ0XCIgKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHQvLyBSZW1vdmUgaGFzaCB0byBzaW1wbGlmeSB1cmwgbWFuaXB1bGF0aW9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybC5yZXBsYWNlKCByaGFzaCwgXCJcIiApO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBoYXNoIHNvIHdlIGNhbiBwdXQgaXQgYmFja1xuXHRcdFx0dW5jYWNoZWQgPSBzLnVybC5zbGljZSggY2FjaGVVUkwubGVuZ3RoICk7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICYmICggcy5wcm9jZXNzRGF0YSB8fCB0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICkgKSB7XG5cdFx0XHRcdGNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XG5cblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRjYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsIFwiJDFcIiApO1xuXHRcdFx0XHR1bmNhY2hlZCA9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyAoIG5vbmNlLmd1aWQrKyApICtcblx0XHRcdFx0XHR1bmNhY2hlZDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUHV0IGhhc2ggYW5kIGFudGktY2FjaGUgb24gdGhlIFVSTCB0aGF0IHdpbGwgYmUgcmVxdWVzdGVkIChnaC0xNzMyKVxuXHRcdFx0cy51cmwgPSBjYWNoZVVSTCArIHVuY2FjaGVkO1xuXG5cdFx0Ly8gQ2hhbmdlICclMjAnIHRvICcrJyBpZiB0aGlzIGlzIGVuY29kZWQgZm9ybSBib2R5IGNvbnRlbnQgKGdoLTI2NTgpXG5cdFx0fSBlbHNlIGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiZcblx0XHRcdCggcy5jb250ZW50VHlwZSB8fCBcIlwiICkuaW5kZXhPZiggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiApID09PSAwICkge1xuXHRcdFx0cy5kYXRhID0gcy5kYXRhLnJlcGxhY2UoIHIyMCwgXCIrXCIgKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0aWYgKCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU1vZGlmaWVkLVNpbmNlXCIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHRcdGlmICggalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTm9uZS1NYXRjaFwiLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2VudFxuXHRcdGlmICggcy5kYXRhICYmIHMuaGFzQ29udGVudCAmJiBzLmNvbnRlbnRUeXBlICE9PSBmYWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJDb250ZW50LVR5cGVcIiwgcy5jb250ZW50VHlwZSApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGVcblx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKFxuXHRcdFx0XCJBY2NlcHRcIixcblx0XHRcdHMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gP1xuXHRcdFx0XHRzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArXG5cdFx0XHRcdFx0KCBzLmRhdGFUeXBlc1sgMCBdICE9PSBcIipcIiA/IFwiLCBcIiArIGFsbFR5cGVzICsgXCI7IHE9MC4wMVwiIDogXCJcIiApIDpcblx0XHRcdFx0cy5hY2NlcHRzWyBcIipcIiBdXG5cdFx0KTtcblxuXHRcdC8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvblxuXHRcdGZvciAoIGkgaW4gcy5oZWFkZXJzICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0XG5cdFx0aWYgKCBzLmJlZm9yZVNlbmQgJiZcblx0XHRcdCggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgY29tcGxldGVkICkgKSB7XG5cblx0XHRcdC8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVyblxuXHRcdFx0cmV0dXJuIGpxWEhSLmFib3J0KCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWJvcnRpbmcgaXMgbm8gbG9uZ2VyIGEgY2FuY2VsbGF0aW9uXG5cdFx0c3RyQWJvcnQgPSBcImFib3J0XCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrcyBvbiBkZWZlcnJlZHNcblx0XHRjb21wbGV0ZURlZmVycmVkLmFkZCggcy5jb21wbGV0ZSApO1xuXHRcdGpxWEhSLmRvbmUoIHMuc3VjY2VzcyApO1xuXHRcdGpxWEhSLmZhaWwoIHMuZXJyb3IgKTtcblxuXHRcdC8vIEdldCB0cmFuc3BvcnRcblx0XHR0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIG5vIHRyYW5zcG9ydCwgd2UgYXV0by1hYm9ydFxuXHRcdGlmICggIXRyYW5zcG9ydCApIHtcblx0XHRcdGRvbmUoIC0xLCBcIk5vIFRyYW5zcG9ydFwiICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSAxO1xuXG5cdFx0XHQvLyBTZW5kIGdsb2JhbCBldmVudFxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheFNlbmRcIiwgWyBqcVhIUiwgcyBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlXG5cdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0cmV0dXJuIGpxWEhSO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaW1lb3V0XG5cdFx0XHRpZiAoIHMuYXN5bmMgJiYgcy50aW1lb3V0ID4gMCApIHtcblx0XHRcdFx0dGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGpxWEhSLmFib3J0KCBcInRpbWVvdXRcIiApO1xuXHRcdFx0XHR9LCBzLnRpbWVvdXQgKTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29tcGxldGVkID0gZmFsc2U7XG5cdFx0XHRcdHRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Ly8gUmV0aHJvdyBwb3N0LWNvbXBsZXRpb24gZXhjZXB0aW9uc1xuXHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUHJvcGFnYXRlIG90aGVycyBhcyByZXN1bHRzXG5cdFx0XHRcdGRvbmUoIC0xLCBlICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGJhY2sgZm9yIHdoZW4gZXZlcnl0aGluZyBpcyBkb25lXG5cdFx0ZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7XG5cdFx0XHR2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLFxuXHRcdFx0XHRzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dDtcblxuXHRcdFx0Ly8gSWdub3JlIHJlcGVhdCBpbnZvY2F0aW9uc1xuXHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29tcGxldGVkID0gdHJ1ZTtcblxuXHRcdFx0Ly8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHNcblx0XHRcdGlmICggdGltZW91dFRpbWVyICkge1xuXHRcdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb25cblx0XHRcdC8vIChubyBtYXR0ZXIgaG93IGxvbmcgdGhlIGpxWEhSIG9iamVjdCB3aWxsIGJlIHVzZWQpXG5cdFx0XHR0cmFuc3BvcnQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdC8vIENhY2hlIHJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyA9IGhlYWRlcnMgfHwgXCJcIjtcblxuXHRcdFx0Ly8gU2V0IHJlYWR5U3RhdGVcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMgPiAwID8gNCA6IDA7XG5cblx0XHRcdC8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsXG5cdFx0XHRpc1N1Y2Nlc3MgPSBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNDtcblxuXHRcdFx0Ly8gR2V0IHJlc3BvbnNlIGRhdGFcblx0XHRcdGlmICggcmVzcG9uc2VzICkge1xuXHRcdFx0XHRyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVXNlIGEgbm9vcCBjb252ZXJ0ZXIgZm9yIG1pc3Npbmcgc2NyaXB0IGJ1dCBub3QgaWYganNvbnBcblx0XHRcdGlmICggIWlzU3VjY2VzcyAmJlxuXHRcdFx0XHRqUXVlcnkuaW5BcnJheSggXCJzY3JpcHRcIiwgcy5kYXRhVHlwZXMgKSA+IC0xICYmXG5cdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBcImpzb25cIiwgcy5kYXRhVHlwZXMgKSA8IDAgKSB7XG5cdFx0XHRcdHMuY29udmVydGVyc1sgXCJ0ZXh0IHNjcmlwdFwiIF0gPSBmdW5jdGlvbigpIHt9O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25zZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpXG5cdFx0XHRyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApO1xuXG5cdFx0XHQvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZ1xuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRcdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJMYXN0LU1vZGlmaWVkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcImV0YWdcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBFeHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dCBhbmQgbm9ybWFsaXplIGZvciBub24tYWJvcnRzXG5cdFx0XHRcdGVycm9yID0gc3RhdHVzVGV4dDtcblx0XHRcdFx0aWYgKCBzdGF0dXMgfHwgIXN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiZXJyb3JcIjtcblx0XHRcdFx0XHRpZiAoIHN0YXR1cyA8IDAgKSB7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdFxuXHRcdFx0anFYSFIuc3RhdHVzID0gc3RhdHVzO1xuXHRcdFx0anFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyBcIlwiO1xuXG5cdFx0XHQvLyBTdWNjZXNzL0Vycm9yXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTtcblx0XHRcdHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyBcImFqYXhTdWNjZXNzXCIgOiBcImFqYXhFcnJvclwiLFxuXHRcdFx0XHRcdFsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbXBsZXRlXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4Q29tcGxldGVcIiwgWyBqcVhIUiwgcyBdICk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0b3BcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBfaSwgbWV0aG9kICkge1xuXHRqUXVlcnlbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2ssIHR5cGUgKSB7XG5cblx0XHQvLyBTaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZFxuXHRcdGlmICggaXNGdW5jdGlvbiggZGF0YSApICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7XG5cdFx0XHRjYWxsYmFjayA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKVxuXHRcdHJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cdFx0XHR0eXBlOiBtZXRob2QsXG5cdFx0XHRkYXRhVHlwZTogdHlwZSxcblx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRzdWNjZXNzOiBjYWxsYmFja1xuXHRcdH0sIGpRdWVyeS5pc1BsYWluT2JqZWN0KCB1cmwgKSAmJiB1cmwgKSApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7XG5cdHZhciBpO1xuXHRmb3IgKCBpIGluIHMuaGVhZGVycyApIHtcblx0XHRpZiAoIGkudG9Mb3dlckNhc2UoKSA9PT0gXCJjb250ZW50LXR5cGVcIiApIHtcblx0XHRcdHMuY29udGVudFR5cGUgPSBzLmhlYWRlcnNbIGkgXSB8fCBcIlwiO1xuXHRcdH1cblx0fVxufSApO1xuXG5cbmpRdWVyeS5fZXZhbFVybCA9IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMsIGRvYyApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KCB7XG5cdFx0dXJsOiB1cmwsXG5cblx0XHQvLyBNYWtlIHRoaXMgZXhwbGljaXQsIHNpbmNlIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgdGhyb3VnaCBhamF4U2V0dXAgKCMxMTI2NClcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGNhY2hlOiB0cnVlLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXG5cdFx0Ly8gT25seSBldmFsdWF0ZSB0aGUgcmVzcG9uc2UgaWYgaXQgaXMgc3VjY2Vzc2Z1bCAoZ2gtNDEyNilcblx0XHQvLyBkYXRhRmlsdGVyIGlzIG5vdCBpbnZva2VkIGZvciBmYWlsdXJlIHJlc3BvbnNlcywgc28gdXNpbmcgaXQgaW5zdGVhZFxuXHRcdC8vIG9mIHRoZSBkZWZhdWx0IGNvbnZlcnRlciBpcyBrbHVkZ3kgYnV0IGl0IHdvcmtzLlxuXHRcdGNvbnZlcnRlcnM6IHtcblx0XHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oKSB7fVxuXHRcdH0sXG5cdFx0ZGF0YUZpbHRlcjogZnVuY3Rpb24oIHJlc3BvbnNlICkge1xuXHRcdFx0alF1ZXJ5Lmdsb2JhbEV2YWwoIHJlc3BvbnNlLCBvcHRpb25zLCBkb2MgKTtcblx0XHR9XG5cdH0gKTtcbn07XG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgd3JhcDtcblxuXHRcdGlmICggdGhpc1sgMCBdICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRcdGh0bWwgPSBodG1sLmNhbGwoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZFxuXHRcdFx0d3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7XG5cblx0XHRcdGlmICggdGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0d3JhcC5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IHRoaXM7XG5cblx0XHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkge1xuXHRcdFx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVsZW07XG5cdFx0XHR9ICkuYXBwZW5kKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLFxuXHRcdFx0XHRjb250ZW50cyA9IHNlbGYuY29udGVudHMoKTtcblxuXHRcdFx0aWYgKCBjb250ZW50cy5sZW5ndGggKSB7XG5cdFx0XHRcdGNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZi5hcHBlbmQoIGh0bWwgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0d3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dmFyIGh0bWxJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggaHRtbCApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApO1xuXHRcdH0gKTtcblx0fSxcblxuXHR1bndyYXA6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR0aGlzLnBhcmVudCggc2VsZWN0b3IgKS5ub3QoIFwiYm9keVwiICkuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7XG5cdFx0fSApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmV4cHIucHNldWRvcy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICFqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUoIGVsZW0gKTtcbn07XG5qUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICEhKCBlbGVtLm9mZnNldFdpZHRoIHx8IGVsZW0ub2Zmc2V0SGVpZ2h0IHx8IGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKTtcbn07XG5cblxuXG5cbmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblx0fSBjYXRjaCAoIGUgKSB7fVxufTtcblxudmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7XG5cblx0XHQvLyBGaWxlIHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIGNvZGUgMCwgYXNzdW1lIDIwMFxuXHRcdDA6IDIwMCxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0Ly8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydCggZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaztcblxuXHQvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0XG5cdGlmICggc3VwcG9ydC5jb3JzIHx8IHhoclN1cHBvcnRlZCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkge1xuXHRcdFx0XHR2YXIgaSxcblx0XHRcdFx0XHR4aHIgPSBvcHRpb25zLnhocigpO1xuXG5cdFx0XHRcdHhoci5vcGVuKFxuXHRcdFx0XHRcdG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLnVybCxcblx0XHRcdFx0XHRvcHRpb25zLmFzeW5jLFxuXHRcdFx0XHRcdG9wdGlvbnMudXNlcm5hbWUsXG5cdFx0XHRcdFx0b3B0aW9ucy5wYXNzd29yZFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBmaWVsZHMgaWYgcHJvdmlkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0eGhyWyBpIF0gPSBvcHRpb25zLnhockZpZWxkc1sgaSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkge1xuXHRcdFx0XHRcdHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHRcdFx0XHQvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlXG5cdFx0XHRcdC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuXG5cdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxuXHRcdFx0XHQvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC5cblx0XHRcdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrID0geGhyLm9ubG9hZCA9XG5cdFx0XHRcdFx0XHRcdFx0eGhyLm9uZXJyb3IgPSB4aHIub25hYm9ydCA9IHhoci5vbnRpbWVvdXQgPVxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlID09PSBcImFib3J0XCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0eGhyLmFib3J0KCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09IFwiZXJyb3JcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZVxuXHRcdFx0XHRcdFx0XHRcdGlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggMCwgXCJlcnJvclwiICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblx0XHRcdFx0XHRcdFx0XHRcdHhoclN1Y2Nlc3NTdGF0dXNbIHhoci5zdGF0dXMgXSB8fCB4aHIuc3RhdHVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHQsXG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBGb3IgWEhSMiBub24tdGV4dCwgbGV0IHRoZSBjYWxsZXIgaGFuZGxlIGl0IChnaC0yNDk4KVxuXHRcdFx0XHRcdFx0XHRcdFx0KCB4aHIucmVzcG9uc2VUeXBlIHx8IFwidGV4dFwiICkgIT09IFwidGV4dFwiICB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHhoci5yZXNwb25zZVRleHQgIT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGJpbmFyeTogeGhyLnJlc3BvbnNlIH0gOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IHRleHQ6IHhoci5yZXNwb25zZVRleHQgfSxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIExpc3RlbiB0byBldmVudHNcblx0XHRcdFx0eGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7XG5cdFx0XHRcdGVycm9yQ2FsbGJhY2sgPSB4aHIub25lcnJvciA9IHhoci5vbnRpbWVvdXQgPSBjYWxsYmFjayggXCJlcnJvclwiICk7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgOSBvbmx5XG5cdFx0XHRcdC8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0XG5cdFx0XHRcdC8vIHRvIGhhbmRsZSB1bmNhdWdodCBhYm9ydHNcblx0XHRcdFx0aWYgKCB4aHIub25hYm9ydCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHhoci5vbmFib3J0ID0gZXJyb3JDYWxsYmFjaztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIENoZWNrIHJlYWR5U3RhdGUgYmVmb3JlIHRpbWVvdXQgYXMgaXQgY2hhbmdlc1xuXHRcdFx0XHRcdFx0aWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCxcblx0XHRcdFx0XHRcdFx0Ly8gYnV0IHRoYXQgd2lsbCBub3QgaGFuZGxlIGEgbmF0aXZlIGFib3J0XG5cdFx0XHRcdFx0XHRcdC8vIEFsc28sIHNhdmUgZXJyb3JDYWxsYmFjayB0byBhIHZhcmlhYmxlXG5cdFx0XHRcdFx0XHRcdC8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGVycm9yQ2FsbGJhY2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIHRoZSBhYm9ydCBjYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGNhbGxiYWNrKCBcImFib3J0XCIgKTtcblxuXHRcdFx0XHR0cnkge1xuXG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdCAodGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uKVxuXHRcdFx0XHRcdHhoci5zZW5kKCBvcHRpb25zLmhhc0NvbnRlbnQgJiYgb3B0aW9ucy5kYXRhIHx8IG51bGwgKTtcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHQvLyAjMTQ2ODM6IE9ubHkgcmV0aHJvdyBpZiB0aGlzIGhhc24ndCBiZWVuIG5vdGlmaWVkIGFzIGFuIGVycm9yIHlldFxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFByZXZlbnQgYXV0by1leGVjdXRpb24gb2Ygc2NyaXB0cyB3aGVuIG5vIGV4cGxpY2l0IGRhdGFUeXBlIHdhcyBwcm92aWRlZCAoU2VlIGdoLTI0MzIpXG5qUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLmNvbnRlbnRzLnNjcmlwdCA9IGZhbHNlO1xuXHR9XG59ICk7XG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBcIiArXG5cdFx0XHRcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xuXHR9XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydFxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gb3IgZm9yY2VkLWJ5LWF0dHJzIHJlcXVlc3RzXG5cdGlmICggcy5jcm9zc0RvbWFpbiB8fCBzLnNjcmlwdEF0dHJzICkge1xuXHRcdHZhciBzY3JpcHQsIGNhbGxiYWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGpRdWVyeSggXCI8c2NyaXB0PlwiIClcblx0XHRcdFx0XHQuYXR0ciggcy5zY3JpcHRBdHRycyB8fCB7fSApXG5cdFx0XHRcdFx0LnByb3AoIHsgY2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LCBzcmM6IHMudXJsIH0gKVxuXHRcdFx0XHRcdC5vbiggXCJsb2FkIGVycm9yXCIsIGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZS5ndWlkKysgKSApO1xuXHRcdHRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlO1xuXHRcdHJldHVybiBjYWxsYmFjaztcblx0fVxufSApO1xuXG4vLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHNcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xuXG5cdHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lcixcblx0XHRqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgP1xuXHRcdFx0XCJ1cmxcIiA6XG5cdFx0XHR0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCggcy5jb250ZW50VHlwZSB8fCBcIlwiIClcblx0XHRcdFx0XHQuaW5kZXhPZiggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiApID09PSAwICYmXG5cdFx0XHRcdHJqc29ucC50ZXN0KCBzLmRhdGEgKSAmJiBcImRhdGFcIlxuXHRcdCk7XG5cblx0Ly8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzIFwianNvbnBcIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldFxuXHRpZiAoIGpzb25Qcm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09IFwianNvbnBcIiApIHtcblxuXHRcdC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXRcblx0XHRjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBpc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2soKSA6XG5cdFx0XHRzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHQvLyBJbnNlcnQgY2FsbGJhY2sgaW50byB1cmwgb3IgZm9ybSBkYXRhXG5cdFx0aWYgKCBqc29uUHJvcCApIHtcblx0XHRcdHNbIGpzb25Qcm9wIF0gPSBzWyBqc29uUHJvcCBdLnJlcGxhY2UoIHJqc29ucCwgXCIkMVwiICsgY2FsbGJhY2tOYW1lICk7XG5cdFx0fSBlbHNlIGlmICggcy5qc29ucCAhPT0gZmFsc2UgKSB7XG5cdFx0XHRzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gXCImXCIgOiBcIj9cIiApICsgcy5qc29ucCArIFwiPVwiICsgY2FsbGJhY2tOYW1lO1xuXHRcdH1cblxuXHRcdC8vIFVzZSBkYXRhIGNvbnZlcnRlciB0byByZXRyaWV2ZSBqc29uIGFmdGVyIHNjcmlwdCBleGVjdXRpb25cblx0XHRzLmNvbnZlcnRlcnNbIFwic2NyaXB0IGpzb25cIiBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoICFyZXNwb25zZUNvbnRhaW5lciApIHtcblx0XHRcdFx0alF1ZXJ5LmVycm9yKCBjYWxsYmFja05hbWUgKyBcIiB3YXMgbm90IGNhbGxlZFwiICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTtcblx0XHR9O1xuXG5cdFx0Ly8gRm9yY2UganNvbiBkYXRhVHlwZVxuXHRcdHMuZGF0YVR5cGVzWyAwIF0gPSBcImpzb25cIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tcblx0XHRvdmVyd3JpdHRlbiA9IHdpbmRvd1sgY2FsbGJhY2tOYW1lIF07XG5cdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBhcmd1bWVudHM7XG5cdFx0fTtcblxuXHRcdC8vIENsZWFuLXVwIGZ1bmN0aW9uIChmaXJlcyBhZnRlciBjb252ZXJ0ZXJzKVxuXHRcdGpxWEhSLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIElmIHByZXZpb3VzIHZhbHVlIGRpZG4ndCBleGlzdCAtIHJlbW92ZSBpdFxuXHRcdFx0aWYgKCBvdmVyd3JpdHRlbiA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRqUXVlcnkoIHdpbmRvdyApLnJlbW92ZVByb3AoIGNhbGxiYWNrTmFtZSApO1xuXG5cdFx0XHQvLyBPdGhlcndpc2UgcmVzdG9yZSBwcmVleGlzdGluZyB2YWx1ZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2luZG93WyBjYWxsYmFja05hbWUgXSA9IG92ZXJ3cml0dGVuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTYXZlIGJhY2sgYXMgZnJlZVxuXHRcdFx0aWYgKCBzWyBjYWxsYmFja05hbWUgXSApIHtcblxuXHRcdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCByZS11c2luZyB0aGUgb3B0aW9ucyBkb2Vzbid0IHNjcmV3IHRoaW5ncyBhcm91bmRcblx0XHRcdFx0cy5qc29ucENhbGxiYWNrID0gb3JpZ2luYWxTZXR0aW5ncy5qc29ucENhbGxiYWNrO1xuXG5cdFx0XHRcdC8vIFNhdmUgdGhlIGNhbGxiYWNrIG5hbWUgZm9yIGZ1dHVyZSB1c2Vcblx0XHRcdFx0b2xkQ2FsbGJhY2tzLnB1c2goIGNhbGxiYWNrTmFtZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDYWxsIGlmIGl0IHdhcyBhIGZ1bmN0aW9uIGFuZCB3ZSBoYXZlIGEgcmVzcG9uc2Vcblx0XHRcdGlmICggcmVzcG9uc2VDb250YWluZXIgJiYgaXNGdW5jdGlvbiggb3ZlcndyaXR0ZW4gKSApIHtcblx0XHRcdFx0b3ZlcndyaXR0ZW4oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmVzcG9uc2VDb250YWluZXIgPSBvdmVyd3JpdHRlbiA9IHVuZGVmaW5lZDtcblx0XHR9ICk7XG5cblx0XHQvLyBEZWxlZ2F0ZSB0byBzY3JpcHRcblx0XHRyZXR1cm4gXCJzY3JpcHRcIjtcblx0fVxufSApO1xuXG5cblxuXG4vLyBTdXBwb3J0OiBTYWZhcmkgOCBvbmx5XG4vLyBJbiBTYWZhcmkgOCBkb2N1bWVudHMgY3JlYXRlZCB2aWEgZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50XG4vLyBjb2xsYXBzZSBzaWJsaW5nIGZvcm1zOiB0aGUgc2Vjb25kIG9uZSBiZWNvbWVzIGEgY2hpbGQgb2YgdGhlIGZpcnN0IG9uZS5cbi8vIEJlY2F1c2Ugb2YgdGhhdCwgdGhpcyBzZWN1cml0eSBtZWFzdXJlIGhhcyB0byBiZSBkaXNhYmxlZCBpbiBTYWZhcmkgOC5cbi8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzczMzdcbnN1cHBvcnQuY3JlYXRlSFRNTERvY3VtZW50ID0gKCBmdW5jdGlvbigpIHtcblx0dmFyIGJvZHkgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKS5ib2R5O1xuXHRib2R5LmlubmVySFRNTCA9IFwiPGZvcm0+PC9mb3JtPjxmb3JtPjwvZm9ybT5cIjtcblx0cmV0dXJuIGJvZHkuY2hpbGROb2Rlcy5sZW5ndGggPT09IDI7XG59ICkoKTtcblxuXG4vLyBBcmd1bWVudCBcImRhdGFcIiBzaG91bGQgYmUgc3RyaW5nIG9mIGh0bWxcbi8vIGNvbnRleHQgKG9wdGlvbmFsKTogSWYgc3BlY2lmaWVkLCB0aGUgZnJhZ21lbnQgd2lsbCBiZSBjcmVhdGVkIGluIHRoaXMgY29udGV4dCxcbi8vIGRlZmF1bHRzIHRvIGRvY3VtZW50XG4vLyBrZWVwU2NyaXB0cyAob3B0aW9uYWwpOiBJZiB0cnVlLCB3aWxsIGluY2x1ZGUgc2NyaXB0cyBwYXNzZWQgaW4gdGhlIGh0bWwgc3RyaW5nXG5qUXVlcnkucGFyc2VIVE1MID0gZnVuY3Rpb24oIGRhdGEsIGNvbnRleHQsIGtlZXBTY3JpcHRzICkge1xuXHRpZiAoIHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRrZWVwU2NyaXB0cyA9IGNvbnRleHQ7XG5cdFx0Y29udGV4dCA9IGZhbHNlO1xuXHR9XG5cblx0dmFyIGJhc2UsIHBhcnNlZCwgc2NyaXB0cztcblxuXHRpZiAoICFjb250ZXh0ICkge1xuXG5cdFx0Ly8gU3RvcCBzY3JpcHRzIG9yIGlubGluZSBldmVudCBoYW5kbGVycyBmcm9tIGJlaW5nIGV4ZWN1dGVkIGltbWVkaWF0ZWx5XG5cdFx0Ly8gYnkgdXNpbmcgZG9jdW1lbnQuaW1wbGVtZW50YXRpb25cblx0XHRpZiAoIHN1cHBvcnQuY3JlYXRlSFRNTERvY3VtZW50ICkge1xuXHRcdFx0Y29udGV4dCA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCggXCJcIiApO1xuXG5cdFx0XHQvLyBTZXQgdGhlIGJhc2UgaHJlZiBmb3IgdGhlIGNyZWF0ZWQgZG9jdW1lbnRcblx0XHRcdC8vIHNvIGFueSBwYXJzZWQgZWxlbWVudHMgd2l0aCBVUkxzXG5cdFx0XHQvLyBhcmUgYmFzZWQgb24gdGhlIGRvY3VtZW50J3MgVVJMIChnaC0yOTY1KVxuXHRcdFx0YmFzZSA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCggXCJiYXNlXCIgKTtcblx0XHRcdGJhc2UuaHJlZiA9IGRvY3VtZW50LmxvY2F0aW9uLmhyZWY7XG5cdFx0XHRjb250ZXh0LmhlYWQuYXBwZW5kQ2hpbGQoIGJhc2UgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29udGV4dCA9IGRvY3VtZW50O1xuXHRcdH1cblx0fVxuXG5cdHBhcnNlZCA9IHJzaW5nbGVUYWcuZXhlYyggZGF0YSApO1xuXHRzY3JpcHRzID0gIWtlZXBTY3JpcHRzICYmIFtdO1xuXG5cdC8vIFNpbmdsZSB0YWdcblx0aWYgKCBwYXJzZWQgKSB7XG5cdFx0cmV0dXJuIFsgY29udGV4dC5jcmVhdGVFbGVtZW50KCBwYXJzZWRbIDEgXSApIF07XG5cdH1cblxuXHRwYXJzZWQgPSBidWlsZEZyYWdtZW50KCBbIGRhdGEgXSwgY29udGV4dCwgc2NyaXB0cyApO1xuXG5cdGlmICggc2NyaXB0cyAmJiBzY3JpcHRzLmxlbmd0aCApIHtcblx0XHRqUXVlcnkoIHNjcmlwdHMgKS5yZW1vdmUoKTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBwYXJzZWQuY2hpbGROb2RlcyApO1xufTtcblxuXG4vKipcbiAqIExvYWQgYSB1cmwgaW50byBhIHBhZ2VcbiAqL1xualF1ZXJ5LmZuLmxvYWQgPSBmdW5jdGlvbiggdXJsLCBwYXJhbXMsIGNhbGxiYWNrICkge1xuXHR2YXIgc2VsZWN0b3IsIHR5cGUsIHJlc3BvbnNlLFxuXHRcdHNlbGYgPSB0aGlzLFxuXHRcdG9mZiA9IHVybC5pbmRleE9mKCBcIiBcIiApO1xuXG5cdGlmICggb2ZmID4gLTEgKSB7XG5cdFx0c2VsZWN0b3IgPSBzdHJpcEFuZENvbGxhcHNlKCB1cmwuc2xpY2UoIG9mZiApICk7XG5cdFx0dXJsID0gdXJsLnNsaWNlKCAwLCBvZmYgKTtcblx0fVxuXG5cdC8vIElmIGl0J3MgYSBmdW5jdGlvblxuXHRpZiAoIGlzRnVuY3Rpb24oIHBhcmFtcyApICkge1xuXG5cdFx0Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2tcblx0XHRjYWxsYmFjayA9IHBhcmFtcztcblx0XHRwYXJhbXMgPSB1bmRlZmluZWQ7XG5cblx0Ly8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZ1xuXHR9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHR0eXBlID0gXCJQT1NUXCI7XG5cdH1cblxuXHQvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdFxuXHRpZiAoIHNlbGYubGVuZ3RoID4gMCApIHtcblx0XHRqUXVlcnkuYWpheCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cblx0XHRcdC8vIElmIFwidHlwZVwiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiBcIkdFVFwiIG1ldGhvZCB3aWxsIGJlIHVzZWQuXG5cdFx0XHQvLyBNYWtlIHZhbHVlIG9mIHRoaXMgZmllbGQgZXhwbGljaXQgc2luY2Vcblx0XHRcdC8vIHVzZXIgY2FuIG92ZXJyaWRlIGl0IHRocm91Z2ggYWpheFNldHVwIG1ldGhvZFxuXHRcdFx0dHlwZTogdHlwZSB8fCBcIkdFVFwiLFxuXHRcdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxuXHRcdFx0ZGF0YTogcGFyYW1zXG5cdFx0fSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7XG5cblx0XHRcdC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFja1xuXHRcdFx0cmVzcG9uc2UgPSBhcmd1bWVudHM7XG5cblx0XHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xuXG5cdFx0XHRcdC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdlxuXHRcdFx0XHQvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnNcblx0XHRcdFx0alF1ZXJ5KCBcIjxkaXY+XCIgKS5hcHBlbmQoIGpRdWVyeS5wYXJzZUhUTUwoIHJlc3BvbnNlVGV4dCApICkuZmluZCggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHRcblx0XHRcdFx0cmVzcG9uc2VUZXh0ICk7XG5cblx0XHQvLyBJZiB0aGUgcmVxdWVzdCBzdWNjZWVkcywgdGhpcyBmdW5jdGlvbiBnZXRzIFwiZGF0YVwiLCBcInN0YXR1c1wiLCBcImpxWEhSXCJcblx0XHQvLyBidXQgdGhleSBhcmUgaWdub3JlZCBiZWNhdXNlIHJlc3BvbnNlIHdhcyBzZXQgYWJvdmUuXG5cdFx0Ly8gSWYgaXQgZmFpbHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImpxWEhSXCIsIFwic3RhdHVzXCIsIFwiZXJyb3JcIlxuXHRcdH0gKS5hbHdheXMoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xuXHRcdFx0c2VsZi5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y2FsbGJhY2suYXBwbHkoIHRoaXMsIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn07XG5cblxuXG5cbmpRdWVyeS5leHByLnBzZXVkb3MuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW0gPT09IGZuLmVsZW07XG5cdH0gKS5sZW5ndGg7XG59O1xuXG5cblxuXG5qUXVlcnkub2Zmc2V0ID0ge1xuXHRzZXRPZmZzZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBpICkge1xuXHRcdHZhciBjdXJQb3NpdGlvbiwgY3VyTGVmdCwgY3VyQ1NTVG9wLCBjdXJUb3AsIGN1ck9mZnNldCwgY3VyQ1NTTGVmdCwgY2FsY3VsYXRlUG9zaXRpb24sXG5cdFx0XHRwb3NpdGlvbiA9IGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApLFxuXHRcdFx0Y3VyRWxlbSA9IGpRdWVyeSggZWxlbSApLFxuXHRcdFx0cHJvcHMgPSB7fTtcblxuXHRcdC8vIFNldCBwb3NpdGlvbiBmaXJzdCwgaW4tY2FzZSB0b3AvbGVmdCBhcmUgc2V0IGV2ZW4gb24gc3RhdGljIGVsZW1cblx0XHRpZiAoIHBvc2l0aW9uID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0ZWxlbS5zdHlsZS5wb3NpdGlvbiA9IFwicmVsYXRpdmVcIjtcblx0XHR9XG5cblx0XHRjdXJPZmZzZXQgPSBjdXJFbGVtLm9mZnNldCgpO1xuXHRcdGN1ckNTU1RvcCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwidG9wXCIgKTtcblx0XHRjdXJDU1NMZWZ0ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJsZWZ0XCIgKTtcblx0XHRjYWxjdWxhdGVQb3NpdGlvbiA9ICggcG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiB8fCBwb3NpdGlvbiA9PT0gXCJmaXhlZFwiICkgJiZcblx0XHRcdCggY3VyQ1NTVG9wICsgY3VyQ1NTTGVmdCApLmluZGV4T2YoIFwiYXV0b1wiICkgPiAtMTtcblxuXHRcdC8vIE5lZWQgdG8gYmUgYWJsZSB0byBjYWxjdWxhdGUgcG9zaXRpb24gaWYgZWl0aGVyXG5cdFx0Ly8gdG9wIG9yIGxlZnQgaXMgYXV0byBhbmQgcG9zaXRpb24gaXMgZWl0aGVyIGFic29sdXRlIG9yIGZpeGVkXG5cdFx0aWYgKCBjYWxjdWxhdGVQb3NpdGlvbiApIHtcblx0XHRcdGN1clBvc2l0aW9uID0gY3VyRWxlbS5wb3NpdGlvbigpO1xuXHRcdFx0Y3VyVG9wID0gY3VyUG9zaXRpb24udG9wO1xuXHRcdFx0Y3VyTGVmdCA9IGN1clBvc2l0aW9uLmxlZnQ7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyVG9wID0gcGFyc2VGbG9hdCggY3VyQ1NTVG9wICkgfHwgMDtcblx0XHRcdGN1ckxlZnQgPSBwYXJzZUZsb2F0KCBjdXJDU1NMZWZ0ICkgfHwgMDtcblx0XHR9XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIG9wdGlvbnMgKSApIHtcblxuXHRcdFx0Ly8gVXNlIGpRdWVyeS5leHRlbmQgaGVyZSB0byBhbGxvdyBtb2RpZmljYXRpb24gb2YgY29vcmRpbmF0ZXMgYXJndW1lbnQgKGdoLTE4NDgpXG5cdFx0XHRvcHRpb25zID0gb3B0aW9ucy5jYWxsKCBlbGVtLCBpLCBqUXVlcnkuZXh0ZW5kKCB7fSwgY3VyT2Zmc2V0ICkgKTtcblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbnMudG9wICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy50b3AgPSAoIG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCApICsgY3VyVG9wO1xuXHRcdH1cblx0XHRpZiAoIG9wdGlvbnMubGVmdCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMubGVmdCA9ICggb3B0aW9ucy5sZWZ0IC0gY3VyT2Zmc2V0LmxlZnQgKSArIGN1ckxlZnQ7XG5cdFx0fVxuXG5cdFx0aWYgKCBcInVzaW5nXCIgaW4gb3B0aW9ucyApIHtcblx0XHRcdG9wdGlvbnMudXNpbmcuY2FsbCggZWxlbSwgcHJvcHMgKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJFbGVtLmNzcyggcHJvcHMgKTtcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHQvLyBvZmZzZXQoKSByZWxhdGVzIGFuIGVsZW1lbnQncyBib3JkZXIgYm94IHRvIHRoZSBkb2N1bWVudCBvcmlnaW5cblx0b2Zmc2V0OiBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHRcdC8vIFByZXNlcnZlIGNoYWluaW5nIGZvciBzZXR0ZXJcblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gb3B0aW9ucyA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0dGhpcyA6XG5cdFx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTtcblx0XHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHZhciByZWN0LCB3aW4sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhZWxlbSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gemVyb3MgZm9yIGRpc2Nvbm5lY3RlZCBhbmQgaGlkZGVuIChkaXNwbGF5OiBub25lKSBlbGVtZW50cyAoZ2gtMjMxMClcblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0XHQvLyBSdW5uaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCBvbiBhXG5cdFx0Ly8gZGlzY29ubmVjdGVkIG5vZGUgaW4gSUUgdGhyb3dzIGFuIGVycm9yXG5cdFx0aWYgKCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9O1xuXHRcdH1cblxuXHRcdC8vIEdldCBkb2N1bWVudC1yZWxhdGl2ZSBwb3NpdGlvbiBieSBhZGRpbmcgdmlld3BvcnQgc2Nyb2xsIHRvIHZpZXdwb3J0LXJlbGF0aXZlIGdCQ1Jcblx0XHRyZWN0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR3aW4gPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogcmVjdC50b3AgKyB3aW4ucGFnZVlPZmZzZXQsXG5cdFx0XHRsZWZ0OiByZWN0LmxlZnQgKyB3aW4ucGFnZVhPZmZzZXRcblx0XHR9O1xuXHR9LFxuXG5cdC8vIHBvc2l0aW9uKCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgbWFyZ2luIGJveCB0byBpdHMgb2Zmc2V0IHBhcmVudCdzIHBhZGRpbmcgYm94XG5cdC8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGJlaGF2aW9yIG9mIENTUyBhYnNvbHV0ZSBwb3NpdGlvbmluZ1xuXHRwb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhdGhpc1sgMCBdICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBvZmZzZXRQYXJlbnQsIG9mZnNldCwgZG9jLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdHBhcmVudE9mZnNldCA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07XG5cblx0XHQvLyBwb3NpdGlvbjpmaXhlZCBlbGVtZW50cyBhcmUgb2Zmc2V0IGZyb20gdGhlIHZpZXdwb3J0LCB3aGljaCBpdHNlbGYgYWx3YXlzIGhhcyB6ZXJvIG9mZnNldFxuXHRcdGlmICggalF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICkgPT09IFwiZml4ZWRcIiApIHtcblxuXHRcdFx0Ly8gQXNzdW1lIHBvc2l0aW9uOmZpeGVkIGltcGxpZXMgYXZhaWxhYmlsaXR5IG9mIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuXHRcdFx0b2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRvZmZzZXQgPSB0aGlzLm9mZnNldCgpO1xuXG5cdFx0XHQvLyBBY2NvdW50IGZvciB0aGUgKnJlYWwqIG9mZnNldCBwYXJlbnQsIHdoaWNoIGNhbiBiZSB0aGUgZG9jdW1lbnQgb3IgaXRzIHJvb3QgZWxlbWVudFxuXHRcdFx0Ly8gd2hlbiBhIHN0YXRpY2FsbHkgcG9zaXRpb25lZCBlbGVtZW50IGlzIGlkZW50aWZpZWRcblx0XHRcdGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudDtcblx0XHRcdG9mZnNldFBhcmVudCA9IGVsZW0ub2Zmc2V0UGFyZW50IHx8IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJlxuXHRcdFx0XHQoIG9mZnNldFBhcmVudCA9PT0gZG9jLmJvZHkgfHwgb2Zmc2V0UGFyZW50ID09PSBkb2MuZG9jdW1lbnRFbGVtZW50ICkgJiZcblx0XHRcdFx0alF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcInBvc2l0aW9uXCIgKSA9PT0gXCJzdGF0aWNcIiApIHtcblxuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQucGFyZW50Tm9kZTtcblx0XHRcdH1cblx0XHRcdGlmICggb2Zmc2V0UGFyZW50ICYmIG9mZnNldFBhcmVudCAhPT0gZWxlbSAmJiBvZmZzZXRQYXJlbnQubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgYm9yZGVycyBpbnRvIGl0cyBvZmZzZXQsIHNpbmNlIHRoZXkgYXJlIG91dHNpZGUgaXRzIGNvbnRlbnQgb3JpZ2luXG5cdFx0XHRcdHBhcmVudE9mZnNldCA9IGpRdWVyeSggb2Zmc2V0UGFyZW50ICkub2Zmc2V0KCk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC50b3AgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcImJvcmRlclRvcFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdFx0cGFyZW50T2Zmc2V0LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcImJvcmRlckxlZnRXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU3VidHJhY3QgcGFyZW50IG9mZnNldHMgYW5kIGVsZW1lbnQgbWFyZ2luc1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IG9mZnNldC50b3AgLSBwYXJlbnRPZmZzZXQudG9wIC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5Ub3BcIiwgdHJ1ZSApLFxuXHRcdFx0bGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luTGVmdFwiLCB0cnVlIClcblx0XHR9O1xuXHR9LFxuXG5cdC8vIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIGRvY3VtZW50RWxlbWVudCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOlxuXHQvLyAxKSBGb3IgdGhlIGVsZW1lbnQgaW5zaWRlIHRoZSBpZnJhbWUgd2l0aG91dCBvZmZzZXRQYXJlbnQsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuXG5cdC8vICAgIGRvY3VtZW50RWxlbWVudCBvZiB0aGUgcGFyZW50IHdpbmRvd1xuXHQvLyAyKSBGb3IgdGhlIGhpZGRlbiBvciBkZXRhY2hlZCBlbGVtZW50XG5cdC8vIDMpIEZvciBib2R5IG9yIGh0bWwgZWxlbWVudCwgaS5lLiBpbiBjYXNlIG9mIHRoZSBodG1sIG5vZGUgLSBpdCB3aWxsIHJldHVybiBpdHNlbGZcblx0Ly9cblx0Ly8gYnV0IHRob3NlIGV4Y2VwdGlvbnMgd2VyZSBuZXZlciBwcmVzZW50ZWQgYXMgYSByZWFsIGxpZmUgdXNlLWNhc2VzXG5cdC8vIGFuZCBtaWdodCBiZSBjb25zaWRlcmVkIGFzIG1vcmUgcHJlZmVyYWJsZSByZXN1bHRzLlxuXHQvL1xuXHQvLyBUaGlzIGxvZ2ljLCBob3dldmVyLCBpcyBub3QgZ3VhcmFudGVlZCBhbmQgY2FuIGNoYW5nZSBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZVxuXHRvZmZzZXRQYXJlbnQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQ7XG5cblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmIGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnRFbGVtZW50O1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG4vLyBDcmVhdGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IHNjcm9sbExlZnQ6IFwicGFnZVhPZmZzZXRcIiwgc2Nyb2xsVG9wOiBcInBhZ2VZT2Zmc2V0XCIgfSwgZnVuY3Rpb24oIG1ldGhvZCwgcHJvcCApIHtcblx0dmFyIHRvcCA9IFwicGFnZVlPZmZzZXRcIiA9PT0gcHJvcDtcblxuXHRqUXVlcnkuZm5bIG1ldGhvZCBdID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbWV0aG9kLCB2YWwgKSB7XG5cblx0XHRcdC8vIENvYWxlc2NlIGRvY3VtZW50cyBhbmQgd2luZG93c1xuXHRcdFx0dmFyIHdpbjtcblx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblx0XHRcdFx0d2luID0gZWxlbTtcblx0XHRcdH0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW0uZGVmYXVsdFZpZXc7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggdmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiB3aW4gPyB3aW5bIHByb3AgXSA6IGVsZW1bIG1ldGhvZCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHdpbiApIHtcblx0XHRcdFx0d2luLnNjcm9sbFRvKFxuXHRcdFx0XHRcdCF0b3AgPyB2YWwgOiB3aW4ucGFnZVhPZmZzZXQsXG5cdFx0XHRcdFx0dG9wID8gdmFsIDogd2luLnBhZ2VZT2Zmc2V0XG5cdFx0XHRcdCk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1bIG1ldGhvZCBdID0gdmFsO1xuXHRcdFx0fVxuXHRcdH0sIG1ldGhvZCwgdmFsLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH07XG59ICk7XG5cbi8vIFN1cHBvcnQ6IFNhZmFyaSA8PTcgLSA5LjEsIENocm9tZSA8PTM3IC0gNDlcbi8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uXG4vLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcbi8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NTg5MzQ3XG4vLyBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgcGVyY2VudCB3aGVuIHNwZWNpZmllZCBmb3IgdG9wL2xlZnQvYm90dG9tL3JpZ2h0O1xuLy8gcmF0aGVyIHRoYW4gbWFrZSB0aGUgY3NzIG1vZHVsZSBkZXBlbmQgb24gdGhlIG9mZnNldCBtb2R1bGUsIGp1c3QgY2hlY2sgZm9yIGl0IGhlcmVcbmpRdWVyeS5lYWNoKCBbIFwidG9wXCIsIFwibGVmdFwiIF0sIGZ1bmN0aW9uKCBfaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCgge1xuXHRcdHBhZGRpbmc6IFwiaW5uZXJcIiArIG5hbWUsXG5cdFx0Y29udGVudDogdHlwZSxcblx0XHRcIlwiOiBcIm91dGVyXCIgKyBuYW1lXG5cdH0sIGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXG5cdFx0Ly8gTWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KVxuXHRcdFx0XHRcdHJldHVybiBmdW5jTmFtZS5pbmRleE9mKCBcIm91dGVyXCIgKSA9PT0gMCA/XG5cdFx0XHRcdFx0XHRlbGVtWyBcImlubmVyXCIgKyBuYW1lIF0gOlxuXHRcdFx0XHRcdFx0ZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIFwiY2xpZW50XCIgKyBuYW1lIF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdFx0XHRcdC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSxcblx0XHRcdFx0XHQvLyB3aGljaGV2ZXIgaXMgZ3JlYXRlc3Rcblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwic2Nyb2xsXCIgKyBuYW1lIF0sIGRvY1sgXCJzY3JvbGxcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZG9jWyBcImNsaWVudFwiICsgbmFtZSBdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblxuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUgKTtcblx0XHR9O1xuXHR9ICk7XG59ICk7XG5cblxualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIF9pLCB0eXBlICkge1xuXHRqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZSwgZm4gKTtcblx0fTtcbn0gKTtcblxuXG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgP1xuXHRcdFx0dGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6XG5cdFx0XHR0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8IFwiKipcIiwgZm4gKTtcblx0fSxcblxuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XG5cdFx0cmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goXG5cdCggXCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBcIiArXG5cdFwibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgXCIgK1xuXHRcImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnVcIiApLnNwbGl0KCBcIiBcIiApLFxuXHRmdW5jdGlvbiggX2ksIG5hbWUgKSB7XG5cblx0XHQvLyBIYW5kbGUgZXZlbnQgYmluZGluZ1xuXHRcdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAwID9cblx0XHRcdFx0dGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6XG5cdFx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHRcdH07XG5cdH1cbik7XG5cblxuXG5cbi8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seVxuLy8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG52YXIgcnRyaW0gPSAvXltcXHNcXHVGRUZGXFx4QTBdK3xbXFxzXFx1RkVGRlxceEEwXSskL2c7XG5cbi8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuLy8gYXJndW1lbnRzLlxuLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKVxuLy8gSG93ZXZlciwgaXQgaXMgbm90IHNsYXRlZCBmb3IgcmVtb3ZhbCBhbnkgdGltZSBzb29uXG5qUXVlcnkucHJveHkgPSBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRjb250ZXh0ID0gZm47XG5cdFx0Zm4gPSB0bXA7XG5cdH1cblxuXHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBTaW11bGF0ZWQgYmluZFxuXHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdH07XG5cblx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdHJldHVybiBwcm94eTtcbn07XG5cbmpRdWVyeS5ob2xkUmVhZHkgPSBmdW5jdGlvbiggaG9sZCApIHtcblx0aWYgKCBob2xkICkge1xuXHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0fSBlbHNlIHtcblx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0fVxufTtcbmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmpRdWVyeS5wYXJzZUpTT04gPSBKU09OLnBhcnNlO1xualF1ZXJ5Lm5vZGVOYW1lID0gbm9kZU5hbWU7XG5qUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5qUXVlcnkuaXNXaW5kb3cgPSBpc1dpbmRvdztcbmpRdWVyeS5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG5qUXVlcnkudHlwZSA9IHRvVHlwZTtcblxualF1ZXJ5Lm5vdyA9IERhdGUubm93O1xuXG5qUXVlcnkuaXNOdW1lcmljID0gZnVuY3Rpb24oIG9iaiApIHtcblxuXHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHQvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpXG5cdC8vIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gZmluaXRlIG51bWJlcnMgKGdoLTI2NjIpXG5cdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRyZXR1cm4gKCB0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgKSAmJlxuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdCFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTtcbn07XG5cbmpRdWVyeS50cmltID0gZnVuY3Rpb24oIHRleHQgKSB7XG5cdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFwiXCIgOlxuXHRcdCggdGV4dCArIFwiXCIgKS5yZXBsYWNlKCBydHJpbSwgXCJcIiApO1xufTtcblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoIHR5cGVvZiBub0dsb2JhbCA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5cblxuXG5yZXR1cm4galF1ZXJ5O1xufSApO1xuIiwgIi8qIFByaXNtSlMgMS4yOC4wXG5odHRwczovL3ByaXNtanMuY29tL2Rvd25sb2FkLmh0bWwjdGhlbWVzPXByaXNtLXRvbW9ycm93Jmxhbmd1YWdlcz1tYXJrdXArY3NzK2NsaWtlK2phdmFzY3JpcHQrYWJhcCthYm5mK2FjdGlvbnNjcmlwdCthZGErYWdkYSthbCthbnRscjQrYXBhY2hlY29uZithcGV4K2FwbCthcHBsZXNjcmlwdCthcWwrYXJkdWlubythcmZmK2FybWFzbSthcnR1cm8rYXNjaWlkb2MrYXNwbmV0K2FzbTY1MDIrYXNtYXRtZWwrYXV0b2hvdGtleSthdXRvaXQrYXZpc3ludGgrYXZyby1pZGwrYXdrK2Jhc2grYmFzaWMrYmF0Y2grYmJjb2RlK2JpY2VwK2JpcmIrYmlzb24rYm5mK2JyYWluZnVjayticmlnaHRzY3JpcHQrYnJvK2JzbCtjK2NzaGFycCtjcHArY2ZzY3JpcHQrY2hhaXNjcmlwdCtjaWwrY2xvanVyZStjbWFrZStjb2JvbCtjb2ZmZWVzY3JpcHQrY29uY3VybmFzK2NzcCtjb29rbGFuZytjb3ErY3J5c3RhbCtjc3MtZXh0cmFzK2NzditjdWUrY3lwaGVyK2QrZGFydCtkYXRhd2VhdmUrZGF4K2RoYWxsK2RpZmYrZGphbmdvK2Rucy16b25lLWZpbGUrZG9ja2VyK2RvdCtlYm5mK2VkaXRvcmNvbmZpZytlaWZmZWwrZWpzK2VsaXhpcitlbG0rZXRsdWErZXJiK2VybGFuZytleGNlbC1mb3JtdWxhK2ZzaGFycCtmYWN0b3IrZmFsc2UrZmlyZXN0b3JlLXNlY3VyaXR5LXJ1bGVzK2Zsb3crZm9ydHJhbitmdGwrZ21sK2dhcCtnY29kZStnZHNjcmlwdCtnZWRjb20rZ2V0dGV4dCtnaGVya2luK2dpdCtnbHNsK2duK2xpbmtlci1zY3JpcHQrZ28rZ28tbW9kdWxlK2dyYWRsZStncmFwaHFsK2dyb292eStoYW1sK2hhbmRsZWJhcnMraGFza2VsbCtoYXhlK2hjbCtobHNsK2hvb24raHR0cCtocGtwK2hzdHMraWNoaWdvamFtK2ljb24raWN1LW1lc3NhZ2UtZm9ybWF0K2lkcmlzK2lnbm9yZStpbmZvcm03K2luaStpbytqK2phdmEramF2YWRvYytqYXZhZG9jbGlrZStqYXZhc3RhY2t0cmFjZStqZXhsK2pvbGllK2pxK2pzZG9jK2pzLWV4dHJhcytqc29uK2pzb241K2pzb25wK2pzc3RhY2t0cmFjZStqcy10ZW1wbGF0ZXMranVsaWEra2VlcGFsaXZlZCtrZXltYW4ra290bGluK2t1bWlyK2t1c3RvK2xhdGV4K2xhdHRlK2xlc3MrbGlseXBvbmQrbGlxdWlkK2xpc3ArbGl2ZXNjcmlwdCtsbHZtK2xvZytsb2xjb2RlK2x1YSttYWdtYSttYWtlZmlsZSttYXJrZG93bittYXJrdXAtdGVtcGxhdGluZyttYXRhK21hdGxhYittYXhzY3JpcHQrbWVsK21lcm1haWQrbWl6YXIrbW9uZ29kYittb25rZXkrbW9vbnNjcmlwdCtuMXFsK240anMrbmFuZDJ0ZXRyaXMtaGRsK25hbmlzY3JpcHQrbmFzbStuZW9uK25ldm9kK25naW54K25pbStuaXgrbnNpcytvYmplY3RpdmVjK29jYW1sK29kaW4rb3BlbmNsK29wZW5xYXNtK296K3BhcmlncCtwYXJzZXIrcGFzY2FsK3Bhc2NhbGlnbytwc2wrcGNheGlzK3Blb3BsZWNvZGUrcGVybCtwaHArcGhwZG9jK3BocC1leHRyYXMrcGxhbnQtdW1sK3Bsc3FsK3Bvd2VycXVlcnkrcG93ZXJzaGVsbCtwcm9jZXNzaW5nK3Byb2xvZytwcm9tcWwrcHJvcGVydGllcytwcm90b2J1ZitwdWcrcHVwcGV0K3B1cmUrcHVyZWJhc2ljK3B1cmVzY3JpcHQrcHl0aG9uK3FzaGFycCtxK3FtbCtxb3JlK3IrcmFja2V0K2NzaHRtbCtqc3grdHN4K3JlYXNvbityZWdleCtyZWdvK3JlbnB5K3Jlc2NyaXB0K3Jlc3QrcmlwK3JvYm9jb25mK3JvYm90ZnJhbWV3b3JrK3J1YnkrcnVzdCtzYXMrc2FzcytzY3NzK3NjYWxhK3NjaGVtZStzaGVsbC1zZXNzaW9uK3NtYWxpK3NtYWxsdGFsaytzbWFydHkrc21sK3NvbGlkaXR5K3NvbHV0aW9uLWZpbGUrc295K3NwYXJxbCtzcGx1bmstc3BsK3NxZitzcWwrc3F1aXJyZWwrc3RhbitzdGF0YStpZWNzdCtzdHlsdXMrc3VwZXJjb2xsaWRlcitzd2lmdCtzeXN0ZW1kK3Q0LXRlbXBsYXRpbmcrdDQtY3MrdDQtdmIrdGFwK3RjbCt0dDIrdGV4dGlsZSt0b21sK3RyZW1vcit0dXJ0bGUrdHdpZyt0eXBlc2NyaXB0K3R5cG9zY3JpcHQrdW5yZWFsc2NyaXB0K3VvcmF6b3IrdXJpK3YrdmFsYSt2Ym5ldCt2ZWxvY2l0eSt2ZXJpbG9nK3ZoZGwrdmltK3Zpc3VhbC1iYXNpYyt3YXJwc2NyaXB0K3dhc20rd2ViLWlkbCt3Z3NsK3dpa2krd29sZnJhbSt3cmVuK3hlb3JhK3htbC1kb2MreG9qbyt4cXVlcnkreWFtbCt5YW5nK3ppZyZwbHVnaW5zPWxpbmUtbnVtYmVycytmaWxlLWhpZ2hsaWdodCAqL1xuLy8vIDxyZWZlcmVuY2UgbGliPVwiV2ViV29ya2VyXCIvPlxuXG52YXIgX3NlbGYgPSAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpXG5cdD8gd2luZG93ICAgLy8gaWYgaW4gYnJvd3NlclxuXHQ6IChcblx0XHQodHlwZW9mIFdvcmtlckdsb2JhbFNjb3BlICE9PSAndW5kZWZpbmVkJyAmJiBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUpXG5cdFx0XHQ/IHNlbGYgLy8gaWYgaW4gd29ya2VyXG5cdFx0XHQ6IHt9ICAgLy8gaWYgaW4gbm9kZSBqc1xuXHQpO1xuXG4vKipcbiAqIFByaXNtOiBMaWdodHdlaWdodCwgcm9idXN0LCBlbGVnYW50IHN5bnRheCBoaWdobGlnaHRpbmdcbiAqXG4gKiBAbGljZW5zZSBNSVQgPGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUPlxuICogQGF1dGhvciBMZWEgVmVyb3UgPGh0dHBzOi8vbGVhLnZlcm91Lm1lPlxuICogQG5hbWVzcGFjZVxuICogQHB1YmxpY1xuICovXG52YXIgUHJpc20gPSAoZnVuY3Rpb24gKF9zZWxmKSB7XG5cblx0Ly8gUHJpdmF0ZSBoZWxwZXIgdmFyc1xuXHR2YXIgbGFuZyA9IC8oPzpefFxccylsYW5nKD86dWFnZSk/LShbXFx3LV0rKSg/PVxcc3wkKS9pO1xuXHR2YXIgdW5pcXVlSWQgPSAwO1xuXG5cdC8vIFRoZSBncmFtbWFyIG9iamVjdCBmb3IgcGxhaW50ZXh0XG5cdHZhciBwbGFpblRleHRHcmFtbWFyID0ge307XG5cblxuXHR2YXIgXyA9IHtcblx0XHQvKipcblx0XHQgKiBCeSBkZWZhdWx0LCBQcmlzbSB3aWxsIGF0dGVtcHQgdG8gaGlnaGxpZ2h0IGFsbCBjb2RlIGVsZW1lbnRzIChieSBjYWxsaW5nIHtAbGluayBQcmlzbS5oaWdobGlnaHRBbGx9KSBvbiB0aGVcblx0XHQgKiBjdXJyZW50IHBhZ2UgYWZ0ZXIgdGhlIHBhZ2UgZmluaXNoZWQgbG9hZGluZy4gVGhpcyBtaWdodCBiZSBhIHByb2JsZW0gaWYgZS5nLiB5b3Ugd2FudGVkIHRvIGFzeW5jaHJvbm91c2x5IGxvYWRcblx0XHQgKiBhZGRpdGlvbmFsIGxhbmd1YWdlcyBvciBwbHVnaW5zIHlvdXJzZWxmLlxuXHRcdCAqXG5cdFx0ICogQnkgc2V0dGluZyB0aGlzIHZhbHVlIHRvIGB0cnVlYCwgUHJpc20gd2lsbCBub3QgYXV0b21hdGljYWxseSBoaWdobGlnaHQgYWxsIGNvZGUgZWxlbWVudHMgb24gdGhlIHBhZ2UuXG5cdFx0ICpcblx0XHQgKiBZb3Ugb2J2aW91c2x5IGhhdmUgdG8gY2hhbmdlIHRoaXMgdmFsdWUgYmVmb3JlIHRoZSBhdXRvbWF0aWMgaGlnaGxpZ2h0aW5nIHN0YXJ0ZWQuIFRvIGRvIHRoaXMsIHlvdSBjYW4gYWRkIGFuXG5cdFx0ICogZW1wdHkgUHJpc20gb2JqZWN0IGludG8gdGhlIGdsb2JhbCBzY29wZSBiZWZvcmUgbG9hZGluZyB0aGUgUHJpc20gc2NyaXB0IGxpa2UgdGhpczpcblx0XHQgKlxuXHRcdCAqIGBgYGpzXG5cdFx0ICogd2luZG93LlByaXNtID0gd2luZG93LlByaXNtIHx8IHt9O1xuXHRcdCAqIFByaXNtLm1hbnVhbCA9IHRydWU7XG5cdFx0ICogLy8gYWRkIGEgbmV3IDxzY3JpcHQ+IHRvIGxvYWQgUHJpc20ncyBzY3JpcHRcblx0XHQgKiBgYGBcblx0XHQgKlxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XG5cdFx0ICogQG1lbWJlcm9mIFByaXNtXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqL1xuXHRcdG1hbnVhbDogX3NlbGYuUHJpc20gJiYgX3NlbGYuUHJpc20ubWFudWFsLFxuXHRcdC8qKlxuXHRcdCAqIEJ5IGRlZmF1bHQsIGlmIFByaXNtIGlzIGluIGEgd2ViIHdvcmtlciwgaXQgYXNzdW1lcyB0aGF0IGl0IGlzIGluIGEgd29ya2VyIGl0IGNyZWF0ZWQgaXRzZWxmLCBzbyBpdCB1c2VzXG5cdFx0ICogYGFkZEV2ZW50TGlzdGVuZXJgIHRvIGNvbW11bmljYXRlIHdpdGggaXRzIHBhcmVudCBpbnN0YW5jZS4gSG93ZXZlciwgaWYgeW91J3JlIHVzaW5nIFByaXNtIG1hbnVhbGx5IGluIHlvdXJcblx0XHQgKiBvd24gd29ya2VyLCB5b3UgZG9uJ3Qgd2FudCBpdCB0byBkbyB0aGlzLlxuXHRcdCAqXG5cdFx0ICogQnkgc2V0dGluZyB0aGlzIHZhbHVlIHRvIGB0cnVlYCwgUHJpc20gd2lsbCBub3QgYWRkIGl0cyBvd24gbGlzdGVuZXJzIHRvIHRoZSB3b3JrZXIuXG5cdFx0ICpcblx0XHQgKiBZb3Ugb2J2aW91c2x5IGhhdmUgdG8gY2hhbmdlIHRoaXMgdmFsdWUgYmVmb3JlIFByaXNtIGV4ZWN1dGVzLiBUbyBkbyB0aGlzLCB5b3UgY2FuIGFkZCBhblxuXHRcdCAqIGVtcHR5IFByaXNtIG9iamVjdCBpbnRvIHRoZSBnbG9iYWwgc2NvcGUgYmVmb3JlIGxvYWRpbmcgdGhlIFByaXNtIHNjcmlwdCBsaWtlIHRoaXM6XG5cdFx0ICpcblx0XHQgKiBgYGBqc1xuXHRcdCAqIHdpbmRvdy5QcmlzbSA9IHdpbmRvdy5QcmlzbSB8fCB7fTtcblx0XHQgKiBQcmlzbS5kaXNhYmxlV29ya2VyTWVzc2FnZUhhbmRsZXIgPSB0cnVlO1xuXHRcdCAqIC8vIExvYWQgUHJpc20ncyBzY3JpcHRcblx0XHQgKiBgYGBcblx0XHQgKlxuXHRcdCAqIEBkZWZhdWx0IGZhbHNlXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XG5cdFx0ICogQG1lbWJlcm9mIFByaXNtXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqL1xuXHRcdGRpc2FibGVXb3JrZXJNZXNzYWdlSGFuZGxlcjogX3NlbGYuUHJpc20gJiYgX3NlbGYuUHJpc20uZGlzYWJsZVdvcmtlck1lc3NhZ2VIYW5kbGVyLFxuXG5cdFx0LyoqXG5cdFx0ICogQSBuYW1lc3BhY2UgZm9yIHV0aWxpdHkgbWV0aG9kcy5cblx0XHQgKlxuXHRcdCAqIEFsbCBmdW5jdGlvbiBpbiB0aGlzIG5hbWVzcGFjZSB0aGF0IGFyZSBub3QgZXhwbGljaXRseSBtYXJrZWQgYXMgX3B1YmxpY18gYXJlIGZvciBfX2ludGVybmFsIHVzZSBvbmx5X18gYW5kIG1heVxuXHRcdCAqIGNoYW5nZSBvciBkaXNhcHBlYXIgYXQgYW55IHRpbWUuXG5cdFx0ICpcblx0XHQgKiBAbmFtZXNwYWNlXG5cdFx0ICogQG1lbWJlcm9mIFByaXNtXG5cdFx0ICovXG5cdFx0dXRpbDoge1xuXHRcdFx0ZW5jb2RlOiBmdW5jdGlvbiBlbmNvZGUodG9rZW5zKSB7XG5cdFx0XHRcdGlmICh0b2tlbnMgaW5zdGFuY2VvZiBUb2tlbikge1xuXHRcdFx0XHRcdHJldHVybiBuZXcgVG9rZW4odG9rZW5zLnR5cGUsIGVuY29kZSh0b2tlbnMuY29udGVudCksIHRva2Vucy5hbGlhcyk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0b2tlbnMpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRva2Vucy5tYXAoZW5jb2RlKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyZXR1cm4gdG9rZW5zLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoL1xcdTAwYTAvZywgJyAnKTtcblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB0eXBlIG9mIHRoZSBnaXZlbiB2YWx1ZS5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge2FueX0gb1xuXHRcdFx0ICogQHJldHVybnMge3N0cmluZ31cblx0XHRcdCAqIEBleGFtcGxlXG5cdFx0XHQgKiB0eXBlKG51bGwpICAgICAgPT09ICdOdWxsJ1xuXHRcdFx0ICogdHlwZSh1bmRlZmluZWQpID09PSAnVW5kZWZpbmVkJ1xuXHRcdFx0ICogdHlwZSgxMjMpICAgICAgID09PSAnTnVtYmVyJ1xuXHRcdFx0ICogdHlwZSgnZm9vJykgICAgID09PSAnU3RyaW5nJ1xuXHRcdFx0ICogdHlwZSh0cnVlKSAgICAgID09PSAnQm9vbGVhbidcblx0XHRcdCAqIHR5cGUoWzEsIDJdKSAgICA9PT0gJ0FycmF5J1xuXHRcdFx0ICogdHlwZSh7fSkgICAgICAgID09PSAnT2JqZWN0J1xuXHRcdFx0ICogdHlwZShTdHJpbmcpICAgID09PSAnRnVuY3Rpb24nXG5cdFx0XHQgKiB0eXBlKC9hYmMrLykgICAgPT09ICdSZWdFeHAnXG5cdFx0XHQgKi9cblx0XHRcdHR5cGU6IGZ1bmN0aW9uIChvKSB7XG5cdFx0XHRcdHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBSZXR1cm5zIGEgdW5pcXVlIG51bWJlciBmb3IgdGhlIGdpdmVuIG9iamVjdC4gTGF0ZXIgY2FsbHMgd2lsbCBzdGlsbCByZXR1cm4gdGhlIHNhbWUgbnVtYmVyLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0fSBvYmpcblx0XHRcdCAqIEByZXR1cm5zIHtudW1iZXJ9XG5cdFx0XHQgKi9cblx0XHRcdG9iaklkOiBmdW5jdGlvbiAob2JqKSB7XG5cdFx0XHRcdGlmICghb2JqWydfX2lkJ10pIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCAnX19pZCcsIHsgdmFsdWU6ICsrdW5pcXVlSWQgfSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIG9ialsnX19pZCddO1xuXHRcdFx0fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBDcmVhdGVzIGEgZGVlcCBjbG9uZSBvZiB0aGUgZ2l2ZW4gb2JqZWN0LlxuXHRcdFx0ICpcblx0XHRcdCAqIFRoZSBtYWluIGludGVuZGVkIHVzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGNsb25lIGxhbmd1YWdlIGRlZmluaXRpb25zLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7VH0gb1xuXHRcdFx0ICogQHBhcmFtIHtSZWNvcmQ8bnVtYmVyLCBhbnk+fSBbdmlzaXRlZF1cblx0XHRcdCAqIEByZXR1cm5zIHtUfVxuXHRcdFx0ICogQHRlbXBsYXRlIFRcblx0XHRcdCAqL1xuXHRcdFx0Y2xvbmU6IGZ1bmN0aW9uIGRlZXBDbG9uZShvLCB2aXNpdGVkKSB7XG5cdFx0XHRcdHZpc2l0ZWQgPSB2aXNpdGVkIHx8IHt9O1xuXG5cdFx0XHRcdHZhciBjbG9uZTsgdmFyIGlkO1xuXHRcdFx0XHRzd2l0Y2ggKF8udXRpbC50eXBlKG8pKSB7XG5cdFx0XHRcdFx0Y2FzZSAnT2JqZWN0Jzpcblx0XHRcdFx0XHRcdGlkID0gXy51dGlsLm9iaklkKG8pO1xuXHRcdFx0XHRcdFx0aWYgKHZpc2l0ZWRbaWRdKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2aXNpdGVkW2lkXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGNsb25lID0gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSAqLyAoe30pO1xuXHRcdFx0XHRcdFx0dmlzaXRlZFtpZF0gPSBjbG9uZTtcblxuXHRcdFx0XHRcdFx0Zm9yICh2YXIga2V5IGluIG8pIHtcblx0XHRcdFx0XHRcdFx0aWYgKG8uaGFzT3duUHJvcGVydHkoa2V5KSkge1xuXHRcdFx0XHRcdFx0XHRcdGNsb25lW2tleV0gPSBkZWVwQ2xvbmUob1trZXldLCB2aXNpdGVkKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRyZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovIChjbG9uZSk7XG5cblx0XHRcdFx0XHRjYXNlICdBcnJheSc6XG5cdFx0XHRcdFx0XHRpZCA9IF8udXRpbC5vYmpJZChvKTtcblx0XHRcdFx0XHRcdGlmICh2aXNpdGVkW2lkXSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmlzaXRlZFtpZF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRjbG9uZSA9IFtdO1xuXHRcdFx0XHRcdFx0dmlzaXRlZFtpZF0gPSBjbG9uZTtcblxuXHRcdFx0XHRcdFx0KC8qKiBAdHlwZSB7QXJyYXl9ICovKC8qKiBAdHlwZSB7YW55fSAqLyhvKSkpLmZvckVhY2goZnVuY3Rpb24gKHYsIGkpIHtcblx0XHRcdFx0XHRcdFx0Y2xvbmVbaV0gPSBkZWVwQ2xvbmUodiwgdmlzaXRlZCk7XG5cdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAoY2xvbmUpO1xuXG5cdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdHJldHVybiBvO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIFJldHVybnMgdGhlIFByaXNtIGxhbmd1YWdlIG9mIHRoZSBnaXZlbiBlbGVtZW50IHNldCBieSBhIGBsYW5ndWFnZS14eHh4YCBvciBgbGFuZy14eHh4YCBjbGFzcy5cblx0XHRcdCAqXG5cdFx0XHQgKiBJZiBubyBsYW5ndWFnZSBpcyBzZXQgZm9yIHRoZSBlbGVtZW50IG9yIHRoZSBlbGVtZW50IGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYCwgYG5vbmVgIHdpbGwgYmUgcmV0dXJuZWQuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG5cdFx0XHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHRcdFx0ICovXG5cdFx0XHRnZXRMYW5ndWFnZTogZnVuY3Rpb24gKGVsZW1lbnQpIHtcblx0XHRcdFx0d2hpbGUgKGVsZW1lbnQpIHtcblx0XHRcdFx0XHR2YXIgbSA9IGxhbmcuZXhlYyhlbGVtZW50LmNsYXNzTmFtZSk7XG5cdFx0XHRcdFx0aWYgKG0pIHtcblx0XHRcdFx0XHRcdHJldHVybiBtWzFdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuICdub25lJztcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogU2V0cyB0aGUgUHJpc20gYGxhbmd1YWdlLXh4eHhgIGNsYXNzIG9mIHRoZSBnaXZlbiBlbGVtZW50LlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuXHRcdFx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlXG5cdFx0XHQgKiBAcmV0dXJucyB7dm9pZH1cblx0XHRcdCAqL1xuXHRcdFx0c2V0TGFuZ3VhZ2U6IGZ1bmN0aW9uIChlbGVtZW50LCBsYW5ndWFnZSkge1xuXHRcdFx0XHQvLyByZW1vdmUgYWxsIGBsYW5ndWFnZS14eHh4YCBjbGFzc2VzXG5cdFx0XHRcdC8vICh0aGlzIG1pZ2h0IGxlYXZlIGJlaGluZCBhIGxlYWRpbmcgc3BhY2UpXG5cdFx0XHRcdGVsZW1lbnQuY2xhc3NOYW1lID0gZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZShSZWdFeHAobGFuZywgJ2dpJyksICcnKTtcblxuXHRcdFx0XHQvLyBhZGQgdGhlIG5ldyBgbGFuZ3VhZ2UteHh4eGAgY2xhc3Ncblx0XHRcdFx0Ly8gKHVzaW5nIGBjbGFzc0xpc3RgIHdpbGwgYXV0b21hdGljYWxseSBjbGVhbiB1cCBzcGFjZXMgZm9yIHVzKVxuXHRcdFx0XHRlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xhbmd1YWdlLScgKyBsYW5ndWFnZSk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIFJldHVybnMgdGhlIHNjcmlwdCBlbGVtZW50IHRoYXQgaXMgY3VycmVudGx5IGV4ZWN1dGluZy5cblx0XHRcdCAqXG5cdFx0XHQgKiBUaGlzIGRvZXMgX19ub3RfXyB3b3JrIGZvciBsaW5lIHNjcmlwdCBlbGVtZW50LlxuXHRcdFx0ICpcblx0XHRcdCAqIEByZXR1cm5zIHtIVE1MU2NyaXB0RWxlbWVudCB8IG51bGx9XG5cdFx0XHQgKi9cblx0XHRcdGN1cnJlbnRTY3JpcHQ6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoJ2N1cnJlbnRTY3JpcHQnIGluIGRvY3VtZW50ICYmIDEgPCAyIC8qIGhhY2sgdG8gdHJpcCBUUycgZmxvdyBhbmFseXNpcyAqLykge1xuXHRcdFx0XHRcdHJldHVybiAvKiogQHR5cGUge2FueX0gKi8gKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSUUxMSB3b3JrYXJvdW5kXG5cdFx0XHRcdC8vIHdlJ2xsIGdldCB0aGUgc3JjIG9mIHRoZSBjdXJyZW50IHNjcmlwdCBieSBwYXJzaW5nIElFMTEncyBlcnJvciBzdGFjayB0cmFjZVxuXHRcdFx0XHQvLyB0aGlzIHdpbGwgbm90IHdvcmsgZm9yIGlubGluZSBzY3JpcHRzXG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoKTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IGZpbGUgc3JjIHVybCBmcm9tIHN0YWNrLiBTcGVjaWZpY2FsbHkgd29ya3Mgd2l0aCB0aGUgZm9ybWF0IG9mIHN0YWNrIHRyYWNlcyBpbiBJRS5cblx0XHRcdFx0XHQvLyBBIHN0YWNrIHdpbGwgbG9vayBsaWtlIHRoaXM6XG5cdFx0XHRcdFx0Ly9cblx0XHRcdFx0XHQvLyBFcnJvclxuXHRcdFx0XHRcdC8vICAgIGF0IF8udXRpbC5jdXJyZW50U2NyaXB0IChodHRwOi8vbG9jYWxob3N0L2NvbXBvbmVudHMvcHJpc20tY29yZS5qczoxMTk6NSlcblx0XHRcdFx0XHQvLyAgICBhdCBHbG9iYWwgY29kZSAoaHR0cDovL2xvY2FsaG9zdC9jb21wb25lbnRzL3ByaXNtLWNvcmUuanM6NjA2OjEpXG5cblx0XHRcdFx0XHR2YXIgc3JjID0gKC9hdCBbXihcXHJcXG5dKlxcKCguKik6W146XSs6W146XStcXCkkL2kuZXhlYyhlcnIuc3RhY2spIHx8IFtdKVsxXTtcblx0XHRcdFx0XHRpZiAoc3JjKSB7XG5cdFx0XHRcdFx0XHR2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcblx0XHRcdFx0XHRcdGZvciAodmFyIGkgaW4gc2NyaXB0cykge1xuXHRcdFx0XHRcdFx0XHRpZiAoc2NyaXB0c1tpXS5zcmMgPT0gc3JjKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHNjcmlwdHNbaV07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogUmV0dXJucyB3aGV0aGVyIGEgZ2l2ZW4gY2xhc3MgaXMgYWN0aXZlIGZvciBgZWxlbWVudGAuXG5cdFx0XHQgKlxuXHRcdFx0ICogVGhlIGNsYXNzIGNhbiBiZSBhY3RpdmF0ZWQgaWYgYGVsZW1lbnRgIG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzIGhhcyB0aGUgZ2l2ZW4gY2xhc3MgYW5kIGl0IGNhbiBiZSBkZWFjdGl2YXRlZFxuXHRcdFx0ICogaWYgYGVsZW1lbnRgIG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzIGhhcyB0aGUgbmVnYXRlZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBjbGFzcy4gVGhlIF9uZWdhdGVkIHZlcnNpb25fIG9mIHRoZVxuXHRcdFx0ICogZ2l2ZW4gY2xhc3MgaXMganVzdCB0aGUgZ2l2ZW4gY2xhc3Mgd2l0aCBhIGBuby1gIHByZWZpeC5cblx0XHRcdCAqXG5cdFx0XHQgKiBXaGV0aGVyIHRoZSBjbGFzcyBpcyBhY3RpdmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgY2xvc2VzdCBhbmNlc3RvciBvZiBgZWxlbWVudGAgKHdoZXJlIGBlbGVtZW50YCBpdHNlbGYgaXNcblx0XHRcdCAqIGNsb3Nlc3QgYW5jZXN0b3IpIHRoYXQgaGFzIHRoZSBnaXZlbiBjbGFzcyBvciB0aGUgbmVnYXRlZCB2ZXJzaW9uIG9mIGl0LiBJZiBuZWl0aGVyIGBlbGVtZW50YCBub3IgYW55IG9mIGl0c1xuXHRcdFx0ICogYW5jZXN0b3JzIGhhdmUgdGhlIGdpdmVuIGNsYXNzIG9yIHRoZSBuZWdhdGVkIHZlcnNpb24gb2YgaXQsIHRoZW4gdGhlIGRlZmF1bHQgYWN0aXZhdGlvbiB3aWxsIGJlIHJldHVybmVkLlxuXHRcdFx0ICpcblx0XHRcdCAqIEluIHRoZSBwYXJhZG94aWNhbCBzaXR1YXRpb24gd2hlcmUgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgY29udGFpbnMgX19ib3RoX18gdGhlIGdpdmVuIGNsYXNzIGFuZCB0aGUgbmVnYXRlZFxuXHRcdFx0ICogdmVyc2lvbiBvZiBpdCwgdGhlIGNsYXNzIGlzIGNvbnNpZGVyZWQgYWN0aXZlLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudFxuXHRcdFx0ICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZVxuXHRcdFx0ICogQHBhcmFtIHtib29sZWFufSBbZGVmYXVsdEFjdGl2YXRpb249ZmFsc2VdXG5cdFx0XHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0XHRcdCAqL1xuXHRcdFx0aXNBY3RpdmU6IGZ1bmN0aW9uIChlbGVtZW50LCBjbGFzc05hbWUsIGRlZmF1bHRBY3RpdmF0aW9uKSB7XG5cdFx0XHRcdHZhciBubyA9ICduby0nICsgY2xhc3NOYW1lO1xuXG5cdFx0XHRcdHdoaWxlIChlbGVtZW50KSB7XG5cdFx0XHRcdFx0dmFyIGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuXHRcdFx0XHRcdGlmIChjbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChjbGFzc0xpc3QuY29udGFpbnMobm8pKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuICEhZGVmYXVsdEFjdGl2YXRpb247XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIGFsbCBjdXJyZW50bHkgbG9hZGVkIGxhbmd1YWdlcyBhbmQgdGhlIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyB0byBjcmVhdGUgYW5kIG1vZGlmeSBsYW5ndWFnZXMuXG5cdFx0ICpcblx0XHQgKiBAbmFtZXNwYWNlXG5cdFx0ICogQG1lbWJlcm9mIFByaXNtXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqL1xuXHRcdGxhbmd1YWdlczoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBUaGUgZ3JhbW1hciBmb3IgcGxhaW4sIHVuZm9ybWF0dGVkIHRleHQuXG5cdFx0XHQgKi9cblx0XHRcdHBsYWluOiBwbGFpblRleHRHcmFtbWFyLFxuXHRcdFx0cGxhaW50ZXh0OiBwbGFpblRleHRHcmFtbWFyLFxuXHRcdFx0dGV4dDogcGxhaW5UZXh0R3JhbW1hcixcblx0XHRcdHR4dDogcGxhaW5UZXh0R3JhbW1hcixcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBDcmVhdGVzIGEgZGVlcCBjb3B5IG9mIHRoZSBsYW5ndWFnZSB3aXRoIHRoZSBnaXZlbiBpZCBhbmQgYXBwZW5kcyB0aGUgZ2l2ZW4gdG9rZW5zLlxuXHRcdFx0ICpcblx0XHRcdCAqIElmIGEgdG9rZW4gaW4gYHJlZGVmYCBhbHNvIGFwcGVhcnMgaW4gdGhlIGNvcGllZCBsYW5ndWFnZSwgdGhlbiB0aGUgZXhpc3RpbmcgdG9rZW4gaW4gdGhlIGNvcGllZCBsYW5ndWFnZVxuXHRcdFx0ICogd2lsbCBiZSBvdmVyd3JpdHRlbiBhdCBpdHMgb3JpZ2luYWwgcG9zaXRpb24uXG5cdFx0XHQgKlxuXHRcdFx0ICogIyMgQmVzdCBwcmFjdGljZXNcblx0XHRcdCAqXG5cdFx0XHQgKiBTaW5jZSB0aGUgcG9zaXRpb24gb2Ygb3ZlcndyaXRpbmcgdG9rZW5zICh0b2tlbiBpbiBgcmVkZWZgIHRoYXQgb3ZlcndyaXRlIHRva2VucyBpbiB0aGUgY29waWVkIGxhbmd1YWdlKVxuXHRcdFx0ICogZG9lc24ndCBtYXR0ZXIsIHRoZXkgY2FuIHRlY2huaWNhbGx5IGJlIGluIGFueSBvcmRlci4gSG93ZXZlciwgdGhpcyBjYW4gYmUgY29uZnVzaW5nIHRvIG90aGVycyB0aGF0IHRyeWluZyB0b1xuXHRcdFx0ICogdW5kZXJzdGFuZCB0aGUgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBiZWNhdXNlLCBub3JtYWxseSwgdGhlIG9yZGVyIG9mIHRva2VucyBtYXR0ZXJzIGluIFByaXNtIGdyYW1tYXJzLlxuXHRcdFx0ICpcblx0XHRcdCAqIFRoZXJlZm9yZSwgaXQgaXMgZW5jb3VyYWdlZCB0byBvcmRlciBvdmVyd3JpdGluZyB0b2tlbnMgYWNjb3JkaW5nIHRvIHRoZSBwb3NpdGlvbnMgb2YgdGhlIG92ZXJ3cml0dGVuIHRva2Vucy5cblx0XHRcdCAqIEZ1cnRoZXJtb3JlLCBhbGwgbm9uLW92ZXJ3cml0aW5nIHRva2VucyBzaG91bGQgYmUgcGxhY2VkIGFmdGVyIHRoZSBvdmVyd3JpdGluZyBvbmVzLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCBUaGUgaWQgb2YgdGhlIGxhbmd1YWdlIHRvIGV4dGVuZC4gVGhpcyBoYXMgdG8gYmUgYSBrZXkgaW4gYFByaXNtLmxhbmd1YWdlc2AuXG5cdFx0XHQgKiBAcGFyYW0ge0dyYW1tYXJ9IHJlZGVmIFRoZSBuZXcgdG9rZW5zIHRvIGFwcGVuZC5cblx0XHRcdCAqIEByZXR1cm5zIHtHcmFtbWFyfSBUaGUgbmV3IGxhbmd1YWdlIGNyZWF0ZWQuXG5cdFx0XHQgKiBAcHVibGljXG5cdFx0XHQgKiBAZXhhbXBsZVxuXHRcdFx0ICogUHJpc20ubGFuZ3VhZ2VzWydjc3Mtd2l0aC1jb2xvcnMnXSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NzcycsIHtcblx0XHRcdCAqICAgICAvLyBQcmlzbS5sYW5ndWFnZXMuY3NzIGFscmVhZHkgaGFzIGEgJ2NvbW1lbnQnIHRva2VuLCBzbyB0aGlzIHRva2VuIHdpbGwgb3ZlcndyaXRlIENTUycgJ2NvbW1lbnQnIHRva2VuXG5cdFx0XHQgKiAgICAgLy8gYXQgaXRzIG9yaWdpbmFsIHBvc2l0aW9uXG5cdFx0XHQgKiAgICAgJ2NvbW1lbnQnOiB7IC4uLiB9LFxuXHRcdFx0ICogICAgIC8vIENTUyBkb2Vzbid0IGhhdmUgYSAnY29sb3InIHRva2VuLCBzbyB0aGlzIHRva2VuIHdpbGwgYmUgYXBwZW5kZWRcblx0XHRcdCAqICAgICAnY29sb3InOiAvXFxiKD86cmVkfGdyZWVufGJsdWUpXFxiL1xuXHRcdFx0ICogfSk7XG5cdFx0XHQgKi9cblx0XHRcdGV4dGVuZDogZnVuY3Rpb24gKGlkLCByZWRlZikge1xuXHRcdFx0XHR2YXIgbGFuZyA9IF8udXRpbC5jbG9uZShfLmxhbmd1YWdlc1tpZF0pO1xuXG5cdFx0XHRcdGZvciAodmFyIGtleSBpbiByZWRlZikge1xuXHRcdFx0XHRcdGxhbmdba2V5XSA9IHJlZGVmW2tleV07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbGFuZztcblx0XHRcdH0sXG5cblx0XHRcdC8qKlxuXHRcdFx0ICogSW5zZXJ0cyB0b2tlbnMgX2JlZm9yZV8gYW5vdGhlciB0b2tlbiBpbiBhIGxhbmd1YWdlIGRlZmluaXRpb24gb3IgYW55IG90aGVyIGdyYW1tYXIuXG5cdFx0XHQgKlxuXHRcdFx0ICogIyMgVXNhZ2Vcblx0XHRcdCAqXG5cdFx0XHQgKiBUaGlzIGhlbHBlciBtZXRob2QgbWFrZXMgaXQgZWFzeSB0byBtb2RpZnkgZXhpc3RpbmcgbGFuZ3VhZ2VzLiBGb3IgZXhhbXBsZSwgdGhlIENTUyBsYW5ndWFnZSBkZWZpbml0aW9uXG5cdFx0XHQgKiBub3Qgb25seSBkZWZpbmVzIENTUyBoaWdobGlnaHRpbmcgZm9yIENTUyBkb2N1bWVudHMsIGJ1dCBhbHNvIG5lZWRzIHRvIGRlZmluZSBoaWdobGlnaHRpbmcgZm9yIENTUyBlbWJlZGRlZFxuXHRcdFx0ICogaW4gSFRNTCB0aHJvdWdoIGA8c3R5bGU+YCBlbGVtZW50cy4gVG8gZG8gdGhpcywgaXQgbmVlZHMgdG8gbW9kaWZ5IGBQcmlzbS5sYW5ndWFnZXMubWFya3VwYCBhbmQgYWRkIHRoZVxuXHRcdFx0ICogYXBwcm9wcmlhdGUgdG9rZW5zLiBIb3dldmVyLCBgUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cGAgaXMgYSByZWd1bGFyIEphdmFTY3JpcHQgb2JqZWN0IGxpdGVyYWwsIHNvIGlmIHlvdSBkb1xuXHRcdFx0ICogdGhpczpcblx0XHRcdCAqXG5cdFx0XHQgKiBgYGBqc1xuXHRcdFx0ICogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC5zdHlsZSA9IHtcblx0XHRcdCAqICAgICAvLyB0b2tlblxuXHRcdFx0ICogfTtcblx0XHRcdCAqIGBgYFxuXHRcdFx0ICpcblx0XHRcdCAqIHRoZW4gdGhlIGBzdHlsZWAgdG9rZW4gd2lsbCBiZSBhZGRlZCAoYW5kIHByb2Nlc3NlZCkgYXQgdGhlIGVuZC4gYGluc2VydEJlZm9yZWAgYWxsb3dzIHlvdSB0byBpbnNlcnQgdG9rZW5zXG5cdFx0XHQgKiBiZWZvcmUgZXhpc3RpbmcgdG9rZW5zLiBGb3IgdGhlIENTUyBleGFtcGxlIGFib3ZlLCB5b3Ugd291bGQgdXNlIGl0IGxpa2UgdGhpczpcblx0XHRcdCAqXG5cdFx0XHQgKiBgYGBqc1xuXHRcdFx0ICogUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnbWFya3VwJywgJ2NkYXRhJywge1xuXHRcdFx0ICogICAgICdzdHlsZSc6IHtcblx0XHRcdCAqICAgICAgICAgLy8gdG9rZW5cblx0XHRcdCAqICAgICB9XG5cdFx0XHQgKiB9KTtcblx0XHRcdCAqIGBgYFxuXHRcdFx0ICpcblx0XHRcdCAqICMjIFNwZWNpYWwgY2FzZXNcblx0XHRcdCAqXG5cdFx0XHQgKiBJZiB0aGUgZ3JhbW1hcnMgb2YgYGluc2lkZWAgYW5kIGBpbnNlcnRgIGhhdmUgdG9rZW5zIHdpdGggdGhlIHNhbWUgbmFtZSwgdGhlIHRva2VucyBpbiBgaW5zaWRlYCdzIGdyYW1tYXJcblx0XHRcdCAqIHdpbGwgYmUgaWdub3JlZC5cblx0XHRcdCAqXG5cdFx0XHQgKiBUaGlzIGJlaGF2aW9yIGNhbiBiZSB1c2VkIHRvIGluc2VydCB0b2tlbnMgYWZ0ZXIgYGJlZm9yZWA6XG5cdFx0XHQgKlxuXHRcdFx0ICogYGBganNcblx0XHRcdCAqIFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ21hcmt1cCcsICdjb21tZW50Jywge1xuXHRcdFx0ICogICAgICdjb21tZW50JzogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC5jb21tZW50LFxuXHRcdFx0ICogICAgIC8vIHRva2VucyBhZnRlciAnY29tbWVudCdcblx0XHRcdCAqIH0pO1xuXHRcdFx0ICogYGBgXG5cdFx0XHQgKlxuXHRcdFx0ICogIyMgTGltaXRhdGlvbnNcblx0XHRcdCAqXG5cdFx0XHQgKiBUaGUgbWFpbiBwcm9ibGVtIGBpbnNlcnRCZWZvcmVgIGhhcyB0byBzb2x2ZSBpcyBpdGVyYXRpb24gb3JkZXIuIFNpbmNlIEVTMjAxNSwgdGhlIGl0ZXJhdGlvbiBvcmRlciBmb3Igb2JqZWN0XG5cdFx0XHQgKiBwcm9wZXJ0aWVzIGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIGluc2VydGlvbiBvcmRlciAoZXhjZXB0IGZvciBpbnRlZ2VyIGtleXMpIGJ1dCBzb21lIGJyb3dzZXJzIGJlaGF2ZVxuXHRcdFx0ICogZGlmZmVyZW50bHkgd2hlbiBrZXlzIGFyZSBkZWxldGVkIGFuZCByZS1pbnNlcnRlZC4gU28gYGluc2VydEJlZm9yZWAgY2FuJ3QgYmUgaW1wbGVtZW50ZWQgYnkgdGVtcG9yYXJpbHlcblx0XHRcdCAqIGRlbGV0aW5nIHByb3BlcnRpZXMgd2hpY2ggaXMgbmVjZXNzYXJ5IHRvIGluc2VydCBhdCBhcmJpdHJhcnkgcG9zaXRpb25zLlxuXHRcdFx0ICpcblx0XHRcdCAqIFRvIHNvbHZlIHRoaXMgcHJvYmxlbSwgYGluc2VydEJlZm9yZWAgZG9lc24ndCBhY3R1YWxseSBpbnNlcnQgdGhlIGdpdmVuIHRva2VucyBpbnRvIHRoZSB0YXJnZXQgb2JqZWN0LlxuXHRcdFx0ICogSW5zdGVhZCwgaXQgd2lsbCBjcmVhdGUgYSBuZXcgb2JqZWN0IGFuZCByZXBsYWNlIGFsbCByZWZlcmVuY2VzIHRvIHRoZSB0YXJnZXQgb2JqZWN0IHdpdGggdGhlIG5ldyBvbmUuIFRoaXNcblx0XHRcdCAqIGNhbiBiZSBkb25lIHdpdGhvdXQgdGVtcG9yYXJpbHkgZGVsZXRpbmcgcHJvcGVydGllcywgc28gdGhlIGl0ZXJhdGlvbiBvcmRlciBpcyB3ZWxsLWRlZmluZWQuXG5cdFx0XHQgKlxuXHRcdFx0ICogSG93ZXZlciwgb25seSByZWZlcmVuY2VzIHRoYXQgY2FuIGJlIHJlYWNoZWQgZnJvbSBgUHJpc20ubGFuZ3VhZ2VzYCBvciBgaW5zZXJ0YCB3aWxsIGJlIHJlcGxhY2VkLiBJLmUuIGlmXG5cdFx0XHQgKiB5b3UgaG9sZCB0aGUgdGFyZ2V0IG9iamVjdCBpbiBhIHZhcmlhYmxlLCB0aGVuIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgd2lsbCBub3QgY2hhbmdlLlxuXHRcdFx0ICpcblx0XHRcdCAqIGBgYGpzXG5cdFx0XHQgKiB2YXIgb2xkTWFya3VwID0gUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cDtcblx0XHRcdCAqIHZhciBuZXdNYXJrdXAgPSBQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdtYXJrdXAnLCAnY29tbWVudCcsIHsgLi4uIH0pO1xuXHRcdFx0ICpcblx0XHRcdCAqIGFzc2VydChvbGRNYXJrdXAgIT09IFByaXNtLmxhbmd1YWdlcy5tYXJrdXApO1xuXHRcdFx0ICogYXNzZXJ0KG5ld01hcmt1cCA9PT0gUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cCk7XG5cdFx0XHQgKiBgYGBcblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge3N0cmluZ30gaW5zaWRlIFRoZSBwcm9wZXJ0eSBvZiBgcm9vdGAgKGUuZy4gYSBsYW5ndWFnZSBpZCBpbiBgUHJpc20ubGFuZ3VhZ2VzYCkgdGhhdCBjb250YWlucyB0aGVcblx0XHRcdCAqIG9iamVjdCB0byBiZSBtb2RpZmllZC5cblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBiZWZvcmUgVGhlIGtleSB0byBpbnNlcnQgYmVmb3JlLlxuXHRcdFx0ICogQHBhcmFtIHtHcmFtbWFyfSBpbnNlcnQgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGtleS12YWx1ZSBwYWlycyB0byBiZSBpbnNlcnRlZC5cblx0XHRcdCAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gW3Jvb3RdIFRoZSBvYmplY3QgY29udGFpbmluZyBgaW5zaWRlYCwgaS5lLiB0aGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlXG5cdFx0XHQgKiBvYmplY3QgdG8gYmUgbW9kaWZpZWQuXG5cdFx0XHQgKlxuXHRcdFx0ICogRGVmYXVsdHMgdG8gYFByaXNtLmxhbmd1YWdlc2AuXG5cdFx0XHQgKiBAcmV0dXJucyB7R3JhbW1hcn0gVGhlIG5ldyBncmFtbWFyIG9iamVjdC5cblx0XHRcdCAqIEBwdWJsaWNcblx0XHRcdCAqL1xuXHRcdFx0aW5zZXJ0QmVmb3JlOiBmdW5jdGlvbiAoaW5zaWRlLCBiZWZvcmUsIGluc2VydCwgcm9vdCkge1xuXHRcdFx0XHRyb290ID0gcm9vdCB8fCAvKiogQHR5cGUge2FueX0gKi8gKF8ubGFuZ3VhZ2VzKTtcblx0XHRcdFx0dmFyIGdyYW1tYXIgPSByb290W2luc2lkZV07XG5cdFx0XHRcdC8qKiBAdHlwZSB7R3JhbW1hcn0gKi9cblx0XHRcdFx0dmFyIHJldCA9IHt9O1xuXG5cdFx0XHRcdGZvciAodmFyIHRva2VuIGluIGdyYW1tYXIpIHtcblx0XHRcdFx0XHRpZiAoZ3JhbW1hci5oYXNPd25Qcm9wZXJ0eSh0b2tlbikpIHtcblxuXHRcdFx0XHRcdFx0aWYgKHRva2VuID09IGJlZm9yZSkge1xuXHRcdFx0XHRcdFx0XHRmb3IgKHZhciBuZXdUb2tlbiBpbiBpbnNlcnQpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoaW5zZXJ0Lmhhc093blByb3BlcnR5KG5ld1Rva2VuKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0W25ld1Rva2VuXSA9IGluc2VydFtuZXdUb2tlbl07XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIERvIG5vdCBpbnNlcnQgdG9rZW4gd2hpY2ggYWxzbyBvY2N1ciBpbiBpbnNlcnQuIFNlZSAjMTUyNVxuXHRcdFx0XHRcdFx0aWYgKCFpbnNlcnQuaGFzT3duUHJvcGVydHkodG9rZW4pKSB7XG5cdFx0XHRcdFx0XHRcdHJldFt0b2tlbl0gPSBncmFtbWFyW3Rva2VuXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgb2xkID0gcm9vdFtpbnNpZGVdO1xuXHRcdFx0XHRyb290W2luc2lkZV0gPSByZXQ7XG5cblx0XHRcdFx0Ly8gVXBkYXRlIHJlZmVyZW5jZXMgaW4gb3RoZXIgbGFuZ3VhZ2UgZGVmaW5pdGlvbnNcblx0XHRcdFx0Xy5sYW5ndWFnZXMuREZTKF8ubGFuZ3VhZ2VzLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuXHRcdFx0XHRcdGlmICh2YWx1ZSA9PT0gb2xkICYmIGtleSAhPSBpbnNpZGUpIHtcblx0XHRcdFx0XHRcdHRoaXNba2V5XSA9IHJldDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBUcmF2ZXJzZSBhIGxhbmd1YWdlIGRlZmluaXRpb24gd2l0aCBEZXB0aCBGaXJzdCBTZWFyY2hcblx0XHRcdERGUzogZnVuY3Rpb24gREZTKG8sIGNhbGxiYWNrLCB0eXBlLCB2aXNpdGVkKSB7XG5cdFx0XHRcdHZpc2l0ZWQgPSB2aXNpdGVkIHx8IHt9O1xuXG5cdFx0XHRcdHZhciBvYmpJZCA9IF8udXRpbC5vYmpJZDtcblxuXHRcdFx0XHRmb3IgKHZhciBpIGluIG8pIHtcblx0XHRcdFx0XHRpZiAoby5oYXNPd25Qcm9wZXJ0eShpKSkge1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2suY2FsbChvLCBpLCBvW2ldLCB0eXBlIHx8IGkpO1xuXG5cdFx0XHRcdFx0XHR2YXIgcHJvcGVydHkgPSBvW2ldO1xuXHRcdFx0XHRcdFx0dmFyIHByb3BlcnR5VHlwZSA9IF8udXRpbC50eXBlKHByb3BlcnR5KTtcblxuXHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5VHlwZSA9PT0gJ09iamVjdCcgJiYgIXZpc2l0ZWRbb2JqSWQocHJvcGVydHkpXSkge1xuXHRcdFx0XHRcdFx0XHR2aXNpdGVkW29iaklkKHByb3BlcnR5KV0gPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRERlMocHJvcGVydHksIGNhbGxiYWNrLCBudWxsLCB2aXNpdGVkKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocHJvcGVydHlUeXBlID09PSAnQXJyYXknICYmICF2aXNpdGVkW29iaklkKHByb3BlcnR5KV0pIHtcblx0XHRcdFx0XHRcdFx0dmlzaXRlZFtvYmpJZChwcm9wZXJ0eSldID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0REZTKHByb3BlcnR5LCBjYWxsYmFjaywgaSwgdmlzaXRlZCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHBsdWdpbnM6IHt9LFxuXG5cdFx0LyoqXG5cdFx0ICogVGhpcyBpcyB0aGUgbW9zdCBoaWdoLWxldmVsIGZ1bmN0aW9uIGluIFByaXNtXHUyMDE5cyBBUEkuXG5cdFx0ICogSXQgZmV0Y2hlcyBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgaGF2ZSBhIGAubGFuZ3VhZ2UteHh4eGAgY2xhc3MgYW5kIHRoZW4gY2FsbHMge0BsaW5rIFByaXNtLmhpZ2hsaWdodEVsZW1lbnR9IG9uXG5cdFx0ICogZWFjaCBvbmUgb2YgdGhlbS5cblx0XHQgKlxuXHRcdCAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBgUHJpc20uaGlnaGxpZ2h0QWxsVW5kZXIoZG9jdW1lbnQsIGFzeW5jLCBjYWxsYmFjaylgLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBbYXN5bmM9ZmFsc2VdIFNhbWUgYXMgaW4ge0BsaW5rIFByaXNtLmhpZ2hsaWdodEFsbFVuZGVyfS5cblx0XHQgKiBAcGFyYW0ge0hpZ2hsaWdodENhbGxiYWNrfSBbY2FsbGJhY2tdIFNhbWUgYXMgaW4ge0BsaW5rIFByaXNtLmhpZ2hsaWdodEFsbFVuZGVyfS5cblx0XHQgKiBAbWVtYmVyb2YgUHJpc21cblx0XHQgKiBAcHVibGljXG5cdFx0ICovXG5cdFx0aGlnaGxpZ2h0QWxsOiBmdW5jdGlvbiAoYXN5bmMsIGNhbGxiYWNrKSB7XG5cdFx0XHRfLmhpZ2hsaWdodEFsbFVuZGVyKGRvY3VtZW50LCBhc3luYywgY2FsbGJhY2spO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBGZXRjaGVzIGFsbCB0aGUgZGVzY2VuZGFudHMgb2YgYGNvbnRhaW5lcmAgdGhhdCBoYXZlIGEgYC5sYW5ndWFnZS14eHh4YCBjbGFzcyBhbmQgdGhlbiBjYWxsc1xuXHRcdCAqIHtAbGluayBQcmlzbS5oaWdobGlnaHRFbGVtZW50fSBvbiBlYWNoIG9uZSBvZiB0aGVtLlxuXHRcdCAqXG5cdFx0ICogVGhlIGZvbGxvd2luZyBob29rcyB3aWxsIGJlIHJ1bjpcblx0XHQgKiAxLiBgYmVmb3JlLWhpZ2hsaWdodGFsbGBcblx0XHQgKiAyLiBgYmVmb3JlLWFsbC1lbGVtZW50cy1oaWdobGlnaHRgXG5cdFx0ICogMy4gQWxsIGhvb2tzIG9mIHtAbGluayBQcmlzbS5oaWdobGlnaHRFbGVtZW50fSBmb3IgZWFjaCBlbGVtZW50LlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtQYXJlbnROb2RlfSBjb250YWluZXIgVGhlIHJvb3QgZWxlbWVudCwgd2hvc2UgZGVzY2VuZGFudHMgdGhhdCBoYXZlIGEgYC5sYW5ndWFnZS14eHh4YCBjbGFzcyB3aWxsIGJlIGhpZ2hsaWdodGVkLlxuXHRcdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FzeW5jPWZhbHNlXSBXaGV0aGVyIGVhY2ggZWxlbWVudCBpcyB0byBiZSBoaWdobGlnaHRlZCBhc3luY2hyb25vdXNseSB1c2luZyBXZWIgV29ya2Vycy5cblx0XHQgKiBAcGFyYW0ge0hpZ2hsaWdodENhbGxiYWNrfSBbY2FsbGJhY2tdIEFuIG9wdGlvbmFsIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgb24gZWFjaCBlbGVtZW50IGFmdGVyIGl0cyBoaWdobGlnaHRpbmcgaXMgZG9uZS5cblx0XHQgKiBAbWVtYmVyb2YgUHJpc21cblx0XHQgKiBAcHVibGljXG5cdFx0ICovXG5cdFx0aGlnaGxpZ2h0QWxsVW5kZXI6IGZ1bmN0aW9uIChjb250YWluZXIsIGFzeW5jLCBjYWxsYmFjaykge1xuXHRcdFx0dmFyIGVudiA9IHtcblx0XHRcdFx0Y2FsbGJhY2s6IGNhbGxiYWNrLFxuXHRcdFx0XHRjb250YWluZXI6IGNvbnRhaW5lcixcblx0XHRcdFx0c2VsZWN0b3I6ICdjb2RlW2NsYXNzKj1cImxhbmd1YWdlLVwiXSwgW2NsYXNzKj1cImxhbmd1YWdlLVwiXSBjb2RlLCBjb2RlW2NsYXNzKj1cImxhbmctXCJdLCBbY2xhc3MqPVwibGFuZy1cIl0gY29kZSdcblx0XHRcdH07XG5cblx0XHRcdF8uaG9va3MucnVuKCdiZWZvcmUtaGlnaGxpZ2h0YWxsJywgZW52KTtcblxuXHRcdFx0ZW52LmVsZW1lbnRzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGVudi5jb250YWluZXIucXVlcnlTZWxlY3RvckFsbChlbnYuc2VsZWN0b3IpKTtcblxuXHRcdFx0Xy5ob29rcy5ydW4oJ2JlZm9yZS1hbGwtZWxlbWVudHMtaGlnaGxpZ2h0JywgZW52KTtcblxuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGVsZW1lbnQ7IChlbGVtZW50ID0gZW52LmVsZW1lbnRzW2krK10pOykge1xuXHRcdFx0XHRfLmhpZ2hsaWdodEVsZW1lbnQoZWxlbWVudCwgYXN5bmMgPT09IHRydWUsIGVudi5jYWxsYmFjayk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8qKlxuXHRcdCAqIEhpZ2hsaWdodHMgdGhlIGNvZGUgaW5zaWRlIGEgc2luZ2xlIGVsZW1lbnQuXG5cdFx0ICpcblx0XHQgKiBUaGUgZm9sbG93aW5nIGhvb2tzIHdpbGwgYmUgcnVuOlxuXHRcdCAqIDEuIGBiZWZvcmUtc2FuaXR5LWNoZWNrYFxuXHRcdCAqIDIuIGBiZWZvcmUtaGlnaGxpZ2h0YFxuXHRcdCAqIDMuIEFsbCBob29rcyBvZiB7QGxpbmsgUHJpc20uaGlnaGxpZ2h0fS4gVGhlc2UgaG9va3Mgd2lsbCBiZSBydW4gYnkgYW4gYXN5bmNocm9ub3VzIHdvcmtlciBpZiBgYXN5bmNgIGlzIGB0cnVlYC5cblx0XHQgKiA0LiBgYmVmb3JlLWluc2VydGBcblx0XHQgKiA1LiBgYWZ0ZXItaGlnaGxpZ2h0YFxuXHRcdCAqIDYuIGBjb21wbGV0ZWBcblx0XHQgKlxuXHRcdCAqIFNvbWUgdGhlIGFib3ZlIGhvb2tzIHdpbGwgYmUgc2tpcHBlZCBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGNvbnRhaW4gYW55IHRleHQgb3IgdGhlcmUgaXMgbm8gZ3JhbW1hciBsb2FkZWQgZm9yXG5cdFx0ICogdGhlIGVsZW1lbnQncyBsYW5ndWFnZS5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBjb2RlLlxuXHRcdCAqIEl0IG11c3QgaGF2ZSBhIGNsYXNzIG9mIGBsYW5ndWFnZS14eHh4YCB0byBiZSBwcm9jZXNzZWQsIHdoZXJlIGB4eHh4YCBpcyBhIHZhbGlkIGxhbmd1YWdlIGlkZW50aWZpZXIuXG5cdFx0ICogQHBhcmFtIHtib29sZWFufSBbYXN5bmM9ZmFsc2VdIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgdG8gYmUgaGlnaGxpZ2h0ZWQgYXN5bmNocm9ub3VzbHkgdXNpbmcgV2ViIFdvcmtlcnNcblx0XHQgKiB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGFuZCBhdm9pZCBibG9ja2luZyB0aGUgVUkgd2hlbiBoaWdobGlnaHRpbmcgdmVyeSBsYXJnZSBjaHVua3Mgb2YgY29kZS4gVGhpcyBvcHRpb24gaXNcblx0XHQgKiBbZGlzYWJsZWQgYnkgZGVmYXVsdF0oaHR0cHM6Ly9wcmlzbWpzLmNvbS9mYXEuaHRtbCN3aHktaXMtYXN5bmNocm9ub3VzLWhpZ2hsaWdodGluZy1kaXNhYmxlZC1ieS1kZWZhdWx0KS5cblx0XHQgKlxuXHRcdCAqIE5vdGU6IEFsbCBsYW5ndWFnZSBkZWZpbml0aW9ucyByZXF1aXJlZCB0byBoaWdobGlnaHQgdGhlIGNvZGUgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFpbiBgcHJpc20uanNgIGZpbGUgZm9yXG5cdFx0ICogYXN5bmNocm9ub3VzIGhpZ2hsaWdodGluZyB0byB3b3JrLiBZb3UgY2FuIGJ1aWxkIHlvdXIgb3duIGJ1bmRsZSBvbiB0aGVcblx0XHQgKiBbRG93bmxvYWQgcGFnZV0oaHR0cHM6Ly9wcmlzbWpzLmNvbS9kb3dubG9hZC5odG1sKS5cblx0XHQgKiBAcGFyYW0ge0hpZ2hsaWdodENhbGxiYWNrfSBbY2FsbGJhY2tdIEFuIG9wdGlvbmFsIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlIGhpZ2hsaWdodGluZyBpcyBkb25lLlxuXHRcdCAqIE1vc3RseSB1c2VmdWwgd2hlbiBgYXN5bmNgIGlzIGB0cnVlYCwgc2luY2UgaW4gdGhhdCBjYXNlLCB0aGUgaGlnaGxpZ2h0aW5nIGlzIGRvbmUgYXN5bmNocm9ub3VzbHkuXG5cdFx0ICogQG1lbWJlcm9mIFByaXNtXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqL1xuXHRcdGhpZ2hsaWdodEVsZW1lbnQ6IGZ1bmN0aW9uIChlbGVtZW50LCBhc3luYywgY2FsbGJhY2spIHtcblx0XHRcdC8vIEZpbmQgbGFuZ3VhZ2Vcblx0XHRcdHZhciBsYW5ndWFnZSA9IF8udXRpbC5nZXRMYW5ndWFnZShlbGVtZW50KTtcblx0XHRcdHZhciBncmFtbWFyID0gXy5sYW5ndWFnZXNbbGFuZ3VhZ2VdO1xuXG5cdFx0XHQvLyBTZXQgbGFuZ3VhZ2Ugb24gdGhlIGVsZW1lbnQsIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRfLnV0aWwuc2V0TGFuZ3VhZ2UoZWxlbWVudCwgbGFuZ3VhZ2UpO1xuXG5cdFx0XHQvLyBTZXQgbGFuZ3VhZ2Ugb24gdGhlIHBhcmVudCwgZm9yIHN0eWxpbmdcblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cdFx0XHRpZiAocGFyZW50ICYmIHBhcmVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAncHJlJykge1xuXHRcdFx0XHRfLnV0aWwuc2V0TGFuZ3VhZ2UocGFyZW50LCBsYW5ndWFnZSk7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBjb2RlID0gZWxlbWVudC50ZXh0Q29udGVudDtcblxuXHRcdFx0dmFyIGVudiA9IHtcblx0XHRcdFx0ZWxlbWVudDogZWxlbWVudCxcblx0XHRcdFx0bGFuZ3VhZ2U6IGxhbmd1YWdlLFxuXHRcdFx0XHRncmFtbWFyOiBncmFtbWFyLFxuXHRcdFx0XHRjb2RlOiBjb2RlXG5cdFx0XHR9O1xuXG5cdFx0XHRmdW5jdGlvbiBpbnNlcnRIaWdobGlnaHRlZENvZGUoaGlnaGxpZ2h0ZWRDb2RlKSB7XG5cdFx0XHRcdGVudi5oaWdobGlnaHRlZENvZGUgPSBoaWdobGlnaHRlZENvZGU7XG5cblx0XHRcdFx0Xy5ob29rcy5ydW4oJ2JlZm9yZS1pbnNlcnQnLCBlbnYpO1xuXG5cdFx0XHRcdGVudi5lbGVtZW50LmlubmVySFRNTCA9IGVudi5oaWdobGlnaHRlZENvZGU7XG5cblx0XHRcdFx0Xy5ob29rcy5ydW4oJ2FmdGVyLWhpZ2hsaWdodCcsIGVudik7XG5cdFx0XHRcdF8uaG9va3MucnVuKCdjb21wbGV0ZScsIGVudik7XG5cdFx0XHRcdGNhbGxiYWNrICYmIGNhbGxiYWNrLmNhbGwoZW52LmVsZW1lbnQpO1xuXHRcdFx0fVxuXG5cdFx0XHRfLmhvb2tzLnJ1bignYmVmb3JlLXNhbml0eS1jaGVjaycsIGVudik7XG5cblx0XHRcdC8vIHBsdWdpbnMgbWF5IGNoYW5nZS9hZGQgdGhlIHBhcmVudC9lbGVtZW50XG5cdFx0XHRwYXJlbnQgPSBlbnYuZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuXHRcdFx0aWYgKHBhcmVudCAmJiBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3ByZScgJiYgIXBhcmVudC5oYXNBdHRyaWJ1dGUoJ3RhYmluZGV4JykpIHtcblx0XHRcdFx0cGFyZW50LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWVudi5jb2RlKSB7XG5cdFx0XHRcdF8uaG9va3MucnVuKCdjb21wbGV0ZScsIGVudik7XG5cdFx0XHRcdGNhbGxiYWNrICYmIGNhbGxiYWNrLmNhbGwoZW52LmVsZW1lbnQpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdF8uaG9va3MucnVuKCdiZWZvcmUtaGlnaGxpZ2h0JywgZW52KTtcblxuXHRcdFx0aWYgKCFlbnYuZ3JhbW1hcikge1xuXHRcdFx0XHRpbnNlcnRIaWdobGlnaHRlZENvZGUoXy51dGlsLmVuY29kZShlbnYuY29kZSkpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmIChhc3luYyAmJiBfc2VsZi5Xb3JrZXIpIHtcblx0XHRcdFx0dmFyIHdvcmtlciA9IG5ldyBXb3JrZXIoXy5maWxlbmFtZSk7XG5cblx0XHRcdFx0d29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uIChldnQpIHtcblx0XHRcdFx0XHRpbnNlcnRIaWdobGlnaHRlZENvZGUoZXZ0LmRhdGEpO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHdvcmtlci5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0bGFuZ3VhZ2U6IGVudi5sYW5ndWFnZSxcblx0XHRcdFx0XHRjb2RlOiBlbnYuY29kZSxcblx0XHRcdFx0XHRpbW1lZGlhdGVDbG9zZTogdHJ1ZVxuXHRcdFx0XHR9KSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbnNlcnRIaWdobGlnaHRlZENvZGUoXy5oaWdobGlnaHQoZW52LmNvZGUsIGVudi5ncmFtbWFyLCBlbnYubGFuZ3VhZ2UpKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogTG93LWxldmVsIGZ1bmN0aW9uLCBvbmx5IHVzZSBpZiB5b3Uga25vdyB3aGF0IHlvdVx1MjAxOXJlIGRvaW5nLiBJdCBhY2NlcHRzIGEgc3RyaW5nIG9mIHRleHQgYXMgaW5wdXRcblx0XHQgKiBhbmQgdGhlIGxhbmd1YWdlIGRlZmluaXRpb25zIHRvIHVzZSwgYW5kIHJldHVybnMgYSBzdHJpbmcgd2l0aCB0aGUgSFRNTCBwcm9kdWNlZC5cblx0XHQgKlxuXHRcdCAqIFRoZSBmb2xsb3dpbmcgaG9va3Mgd2lsbCBiZSBydW46XG5cdFx0ICogMS4gYGJlZm9yZS10b2tlbml6ZWBcblx0XHQgKiAyLiBgYWZ0ZXItdG9rZW5pemVgXG5cdFx0ICogMy4gYHdyYXBgOiBPbiBlYWNoIHtAbGluayBUb2tlbn0uXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBBIHN0cmluZyB3aXRoIHRoZSBjb2RlIHRvIGJlIGhpZ2hsaWdodGVkLlxuXHRcdCAqIEBwYXJhbSB7R3JhbW1hcn0gZ3JhbW1hciBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgdG9rZW5zIHRvIHVzZS5cblx0XHQgKlxuXHRcdCAqIFVzdWFsbHkgYSBsYW5ndWFnZSBkZWZpbml0aW9uIGxpa2UgYFByaXNtLmxhbmd1YWdlcy5tYXJrdXBgLlxuXHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSBUaGUgbmFtZSBvZiB0aGUgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBwYXNzZWQgdG8gYGdyYW1tYXJgLlxuXHRcdCAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBoaWdobGlnaHRlZCBIVE1MLlxuXHRcdCAqIEBtZW1iZXJvZiBQcmlzbVxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKiBAZXhhbXBsZVxuXHRcdCAqIFByaXNtLmhpZ2hsaWdodCgndmFyIGZvbyA9IHRydWU7JywgUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHQsICdqYXZhc2NyaXB0Jyk7XG5cdFx0ICovXG5cdFx0aGlnaGxpZ2h0OiBmdW5jdGlvbiAodGV4dCwgZ3JhbW1hciwgbGFuZ3VhZ2UpIHtcblx0XHRcdHZhciBlbnYgPSB7XG5cdFx0XHRcdGNvZGU6IHRleHQsXG5cdFx0XHRcdGdyYW1tYXI6IGdyYW1tYXIsXG5cdFx0XHRcdGxhbmd1YWdlOiBsYW5ndWFnZVxuXHRcdFx0fTtcblx0XHRcdF8uaG9va3MucnVuKCdiZWZvcmUtdG9rZW5pemUnLCBlbnYpO1xuXHRcdFx0aWYgKCFlbnYuZ3JhbW1hcikge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1RoZSBsYW5ndWFnZSBcIicgKyBlbnYubGFuZ3VhZ2UgKyAnXCIgaGFzIG5vIGdyYW1tYXIuJyk7XG5cdFx0XHR9XG5cdFx0XHRlbnYudG9rZW5zID0gXy50b2tlbml6ZShlbnYuY29kZSwgZW52LmdyYW1tYXIpO1xuXHRcdFx0Xy5ob29rcy5ydW4oJ2FmdGVyLXRva2VuaXplJywgZW52KTtcblx0XHRcdHJldHVybiBUb2tlbi5zdHJpbmdpZnkoXy51dGlsLmVuY29kZShlbnYudG9rZW5zKSwgZW52Lmxhbmd1YWdlKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogVGhpcyBpcyB0aGUgaGVhcnQgb2YgUHJpc20sIGFuZCB0aGUgbW9zdCBsb3ctbGV2ZWwgZnVuY3Rpb24geW91IGNhbiB1c2UuIEl0IGFjY2VwdHMgYSBzdHJpbmcgb2YgdGV4dCBhcyBpbnB1dFxuXHRcdCAqIGFuZCB0aGUgbGFuZ3VhZ2UgZGVmaW5pdGlvbnMgdG8gdXNlLCBhbmQgcmV0dXJucyBhbiBhcnJheSB3aXRoIHRoZSB0b2tlbml6ZWQgY29kZS5cblx0XHQgKlxuXHRcdCAqIFdoZW4gdGhlIGxhbmd1YWdlIGRlZmluaXRpb24gaW5jbHVkZXMgbmVzdGVkIHRva2VucywgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCByZWN1cnNpdmVseSBvbiBlYWNoIG9mIHRoZXNlIHRva2Vucy5cblx0XHQgKlxuXHRcdCAqIFRoaXMgbWV0aG9kIGNvdWxkIGJlIHVzZWZ1bCBpbiBvdGhlciBjb250ZXh0cyBhcyB3ZWxsLCBhcyBhIHZlcnkgY3J1ZGUgcGFyc2VyLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHQgQSBzdHJpbmcgd2l0aCB0aGUgY29kZSB0byBiZSBoaWdobGlnaHRlZC5cblx0XHQgKiBAcGFyYW0ge0dyYW1tYXJ9IGdyYW1tYXIgQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRva2VucyB0byB1c2UuXG5cdFx0ICpcblx0XHQgKiBVc3VhbGx5IGEgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBsaWtlIGBQcmlzbS5sYW5ndWFnZXMubWFya3VwYC5cblx0XHQgKiBAcmV0dXJucyB7VG9rZW5TdHJlYW19IEFuIGFycmF5IG9mIHN0cmluZ3MgYW5kIHRva2VucywgYSB0b2tlbiBzdHJlYW0uXG5cdFx0ICogQG1lbWJlcm9mIFByaXNtXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqIEBleGFtcGxlXG5cdFx0ICogbGV0IGNvZGUgPSBgdmFyIGZvbyA9IDA7YDtcblx0XHQgKiBsZXQgdG9rZW5zID0gUHJpc20udG9rZW5pemUoY29kZSwgUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHQpO1xuXHRcdCAqIHRva2Vucy5mb3JFYWNoKHRva2VuID0+IHtcblx0XHQgKiAgICAgaWYgKHRva2VuIGluc3RhbmNlb2YgUHJpc20uVG9rZW4gJiYgdG9rZW4udHlwZSA9PT0gJ251bWJlcicpIHtcblx0XHQgKiAgICAgICAgIGNvbnNvbGUubG9nKGBGb3VuZCBudW1lcmljIGxpdGVyYWw6ICR7dG9rZW4uY29udGVudH1gKTtcblx0XHQgKiAgICAgfVxuXHRcdCAqIH0pO1xuXHRcdCAqL1xuXHRcdHRva2VuaXplOiBmdW5jdGlvbiAodGV4dCwgZ3JhbW1hcikge1xuXHRcdFx0dmFyIHJlc3QgPSBncmFtbWFyLnJlc3Q7XG5cdFx0XHRpZiAocmVzdCkge1xuXHRcdFx0XHRmb3IgKHZhciB0b2tlbiBpbiByZXN0KSB7XG5cdFx0XHRcdFx0Z3JhbW1hclt0b2tlbl0gPSByZXN0W3Rva2VuXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBncmFtbWFyLnJlc3Q7XG5cdFx0XHR9XG5cblx0XHRcdHZhciB0b2tlbkxpc3QgPSBuZXcgTGlua2VkTGlzdCgpO1xuXHRcdFx0YWRkQWZ0ZXIodG9rZW5MaXN0LCB0b2tlbkxpc3QuaGVhZCwgdGV4dCk7XG5cblx0XHRcdG1hdGNoR3JhbW1hcih0ZXh0LCB0b2tlbkxpc3QsIGdyYW1tYXIsIHRva2VuTGlzdC5oZWFkLCAwKTtcblxuXHRcdFx0cmV0dXJuIHRvQXJyYXkodG9rZW5MaXN0KTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogQG5hbWVzcGFjZVxuXHRcdCAqIEBtZW1iZXJvZiBQcmlzbVxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKi9cblx0XHRob29rczoge1xuXHRcdFx0YWxsOiB7fSxcblxuXHRcdFx0LyoqXG5cdFx0XHQgKiBBZGRzIHRoZSBnaXZlbiBjYWxsYmFjayB0byB0aGUgbGlzdCBvZiBjYWxsYmFja3MgZm9yIHRoZSBnaXZlbiBob29rLlxuXHRcdFx0ICpcblx0XHRcdCAqIFRoZSBjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgaG9vayBpdCBpcyByZWdpc3RlcmVkIGZvciBpcyBydW4uXG5cdFx0XHQgKiBIb29rcyBhcmUgdXN1YWxseSBkaXJlY3RseSBydW4gYnkgYSBoaWdobGlnaHQgZnVuY3Rpb24gYnV0IHlvdSBjYW4gYWxzbyBydW4gaG9va3MgeW91cnNlbGYuXG5cdFx0XHQgKlxuXHRcdFx0ICogT25lIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbiBiZSByZWdpc3RlcmVkIHRvIG11bHRpcGxlIGhvb2tzIGFuZCB0aGUgc2FtZSBob29rIG11bHRpcGxlIHRpbWVzLlxuXHRcdFx0ICpcblx0XHRcdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBob29rLlxuXHRcdFx0ICogQHBhcmFtIHtIb29rQ2FsbGJhY2t9IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG5cdFx0XHQgKiBAcHVibGljXG5cdFx0XHQgKi9cblx0XHRcdGFkZDogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrKSB7XG5cdFx0XHRcdHZhciBob29rcyA9IF8uaG9va3MuYWxsO1xuXG5cdFx0XHRcdGhvb2tzW25hbWVdID0gaG9va3NbbmFtZV0gfHwgW107XG5cblx0XHRcdFx0aG9va3NbbmFtZV0ucHVzaChjYWxsYmFjayk7XG5cdFx0XHR9LFxuXG5cdFx0XHQvKipcblx0XHRcdCAqIFJ1bnMgYSBob29rIGludm9raW5nIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG5cdFx0XHQgKlxuXHRcdFx0ICogQ2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBzeW5jaHJvbm91c2x5IGFuZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIHJlZ2lzdGVyZWQuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGhvb2suXG5cdFx0XHQgKiBAcGFyYW0ge09iamVjdDxzdHJpbmcsIGFueT59IGVudiBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIG9mIHRoZSBob29rIHBhc3NlZCB0byBhbGwgY2FsbGJhY2tzIHJlZ2lzdGVyZWQuXG5cdFx0XHQgKiBAcHVibGljXG5cdFx0XHQgKi9cblx0XHRcdHJ1bjogZnVuY3Rpb24gKG5hbWUsIGVudikge1xuXHRcdFx0XHR2YXIgY2FsbGJhY2tzID0gXy5ob29rcy5hbGxbbmFtZV07XG5cblx0XHRcdFx0aWYgKCFjYWxsYmFja3MgfHwgIWNhbGxiYWNrcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKHZhciBpID0gMCwgY2FsbGJhY2s7IChjYWxsYmFjayA9IGNhbGxiYWNrc1tpKytdKTspIHtcblx0XHRcdFx0XHRjYWxsYmFjayhlbnYpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdFRva2VuOiBUb2tlblxuXHR9O1xuXHRfc2VsZi5QcmlzbSA9IF87XG5cblxuXHQvLyBUeXBlc2NyaXB0IG5vdGU6XG5cdC8vIFRoZSBmb2xsb3dpbmcgY2FuIGJlIHVzZWQgdG8gaW1wb3J0IHRoZSBUb2tlbiB0eXBlIGluIEpTRG9jOlxuXHQvL1xuXHQvLyAgIEB0eXBlZGVmIHtJbnN0YW5jZVR5cGU8aW1wb3J0KFwiLi9wcmlzbS1jb3JlXCIpW1wiVG9rZW5cIl0+fSBUb2tlblxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHRva2VuLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBTZWUge0BsaW5rIFRva2VuI3R5cGUgdHlwZX1cblx0ICogQHBhcmFtIHtzdHJpbmcgfCBUb2tlblN0cmVhbX0gY29udGVudCBTZWUge0BsaW5rIFRva2VuI2NvbnRlbnQgY29udGVudH1cblx0ICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW119IFthbGlhc10gVGhlIGFsaWFzKGVzKSBvZiB0aGUgdG9rZW4uXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbbWF0Y2hlZFN0cj1cIlwiXSBBIGNvcHkgb2YgdGhlIGZ1bGwgc3RyaW5nIHRoaXMgdG9rZW4gd2FzIGNyZWF0ZWQgZnJvbS5cblx0ICogQGNsYXNzXG5cdCAqIEBnbG9iYWxcblx0ICogQHB1YmxpY1xuXHQgKi9cblx0ZnVuY3Rpb24gVG9rZW4odHlwZSwgY29udGVudCwgYWxpYXMsIG1hdGNoZWRTdHIpIHtcblx0XHQvKipcblx0XHQgKiBUaGUgdHlwZSBvZiB0aGUgdG9rZW4uXG5cdFx0ICpcblx0XHQgKiBUaGlzIGlzIHVzdWFsbHkgdGhlIGtleSBvZiBhIHBhdHRlcm4gaW4gYSB7QGxpbmsgR3JhbW1hcn0uXG5cdFx0ICpcblx0XHQgKiBAdHlwZSB7c3RyaW5nfVxuXHRcdCAqIEBzZWUgR3JhbW1hclRva2VuXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqL1xuXHRcdHRoaXMudHlwZSA9IHR5cGU7XG5cdFx0LyoqXG5cdFx0ICogVGhlIHN0cmluZ3Mgb3IgdG9rZW5zIGNvbnRhaW5lZCBieSB0aGlzIHRva2VuLlxuXHRcdCAqXG5cdFx0ICogVGhpcyB3aWxsIGJlIGEgdG9rZW4gc3RyZWFtIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZWQgYWxzbyBkZWZpbmVkIGFuIGBpbnNpZGVgIGdyYW1tYXIuXG5cdFx0ICpcblx0XHQgKiBAdHlwZSB7c3RyaW5nIHwgVG9rZW5TdHJlYW19XG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqL1xuXHRcdHRoaXMuY29udGVudCA9IGNvbnRlbnQ7XG5cdFx0LyoqXG5cdFx0ICogVGhlIGFsaWFzKGVzKSBvZiB0aGUgdG9rZW4uXG5cdFx0ICpcblx0XHQgKiBAdHlwZSB7c3RyaW5nfHN0cmluZ1tdfVxuXHRcdCAqIEBzZWUgR3JhbW1hclRva2VuXG5cdFx0ICogQHB1YmxpY1xuXHRcdCAqL1xuXHRcdHRoaXMuYWxpYXMgPSBhbGlhcztcblx0XHQvLyBDb3B5IG9mIHRoZSBmdWxsIHN0cmluZyB0aGlzIHRva2VuIHdhcyBjcmVhdGVkIGZyb21cblx0XHR0aGlzLmxlbmd0aCA9IChtYXRjaGVkU3RyIHx8ICcnKS5sZW5ndGggfCAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgdG9rZW4gc3RyZWFtIGlzIGFuIGFycmF5IG9mIHN0cmluZ3MgYW5kIHtAbGluayBUb2tlbiBUb2tlbn0gb2JqZWN0cy5cblx0ICpcblx0ICogVG9rZW4gc3RyZWFtcyBoYXZlIHRvIGZ1bGZpbGwgYSBmZXcgcHJvcGVydGllcyB0aGF0IGFyZSBhc3N1bWVkIGJ5IG1vc3QgZnVuY3Rpb25zIChtb3N0bHkgaW50ZXJuYWwgb25lcykgdGhhdCBwcm9jZXNzXG5cdCAqIHRoZW0uXG5cdCAqXG5cdCAqIDEuIE5vIGFkamFjZW50IHN0cmluZ3MuXG5cdCAqIDIuIE5vIGVtcHR5IHN0cmluZ3MuXG5cdCAqXG5cdCAqICAgIFRoZSBvbmx5IGV4Y2VwdGlvbiBoZXJlIGlzIHRoZSB0b2tlbiBzdHJlYW0gdGhhdCBvbmx5IGNvbnRhaW5zIHRoZSBlbXB0eSBzdHJpbmcgYW5kIG5vdGhpbmcgZWxzZS5cblx0ICpcblx0ICogQHR5cGVkZWYge0FycmF5PHN0cmluZyB8IFRva2VuPn0gVG9rZW5TdHJlYW1cblx0ICogQGdsb2JhbFxuXHQgKiBAcHVibGljXG5cdCAqL1xuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdG9rZW4gb3IgdG9rZW4gc3RyZWFtIHRvIGFuIEhUTUwgcmVwcmVzZW50YXRpb24uXG5cdCAqXG5cdCAqIFRoZSBmb2xsb3dpbmcgaG9va3Mgd2lsbCBiZSBydW46XG5cdCAqIDEuIGB3cmFwYDogT24gZWFjaCB7QGxpbmsgVG9rZW59LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZyB8IFRva2VuIHwgVG9rZW5TdHJlYW19IG8gVGhlIHRva2VuIG9yIHRva2VuIHN0cmVhbSB0byBiZSBjb252ZXJ0ZWQuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSBUaGUgbmFtZSBvZiBjdXJyZW50IGxhbmd1YWdlLlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgSFRNTCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdG9rZW4gb3IgdG9rZW4gc3RyZWFtLlxuXHQgKiBAbWVtYmVyb2YgVG9rZW5cblx0ICogQHN0YXRpY1xuXHQgKi9cblx0VG9rZW4uc3RyaW5naWZ5ID0gZnVuY3Rpb24gc3RyaW5naWZ5KG8sIGxhbmd1YWdlKSB7XG5cdFx0aWYgKHR5cGVvZiBvID09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gbztcblx0XHR9XG5cdFx0aWYgKEFycmF5LmlzQXJyYXkobykpIHtcblx0XHRcdHZhciBzID0gJyc7XG5cdFx0XHRvLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0cyArPSBzdHJpbmdpZnkoZSwgbGFuZ3VhZ2UpO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gcztcblx0XHR9XG5cblx0XHR2YXIgZW52ID0ge1xuXHRcdFx0dHlwZTogby50eXBlLFxuXHRcdFx0Y29udGVudDogc3RyaW5naWZ5KG8uY29udGVudCwgbGFuZ3VhZ2UpLFxuXHRcdFx0dGFnOiAnc3BhbicsXG5cdFx0XHRjbGFzc2VzOiBbJ3Rva2VuJywgby50eXBlXSxcblx0XHRcdGF0dHJpYnV0ZXM6IHt9LFxuXHRcdFx0bGFuZ3VhZ2U6IGxhbmd1YWdlXG5cdFx0fTtcblxuXHRcdHZhciBhbGlhc2VzID0gby5hbGlhcztcblx0XHRpZiAoYWxpYXNlcykge1xuXHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoYWxpYXNlcykpIHtcblx0XHRcdFx0QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZW52LmNsYXNzZXMsIGFsaWFzZXMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZW52LmNsYXNzZXMucHVzaChhbGlhc2VzKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRfLmhvb2tzLnJ1bignd3JhcCcsIGVudik7XG5cblx0XHR2YXIgYXR0cmlidXRlcyA9ICcnO1xuXHRcdGZvciAodmFyIG5hbWUgaW4gZW52LmF0dHJpYnV0ZXMpIHtcblx0XHRcdGF0dHJpYnV0ZXMgKz0gJyAnICsgbmFtZSArICc9XCInICsgKGVudi5hdHRyaWJ1dGVzW25hbWVdIHx8ICcnKS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JykgKyAnXCInO1xuXHRcdH1cblxuXHRcdHJldHVybiAnPCcgKyBlbnYudGFnICsgJyBjbGFzcz1cIicgKyBlbnYuY2xhc3Nlcy5qb2luKCcgJykgKyAnXCInICsgYXR0cmlidXRlcyArICc+JyArIGVudi5jb250ZW50ICsgJzwvJyArIGVudi50YWcgKyAnPic7XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7UmVnRXhwfSBwYXR0ZXJuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBwb3Ncblx0ICogQHBhcmFtIHtzdHJpbmd9IHRleHRcblx0ICogQHBhcmFtIHtib29sZWFufSBsb29rYmVoaW5kXG5cdCAqIEByZXR1cm5zIHtSZWdFeHBFeGVjQXJyYXkgfCBudWxsfVxuXHQgKi9cblx0ZnVuY3Rpb24gbWF0Y2hQYXR0ZXJuKHBhdHRlcm4sIHBvcywgdGV4dCwgbG9va2JlaGluZCkge1xuXHRcdHBhdHRlcm4ubGFzdEluZGV4ID0gcG9zO1xuXHRcdHZhciBtYXRjaCA9IHBhdHRlcm4uZXhlYyh0ZXh0KTtcblx0XHRpZiAobWF0Y2ggJiYgbG9va2JlaGluZCAmJiBtYXRjaFsxXSkge1xuXHRcdFx0Ly8gY2hhbmdlIHRoZSBtYXRjaCB0byByZW1vdmUgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgUHJpc20gbG9va2JlaGluZCBncm91cFxuXHRcdFx0dmFyIGxvb2tiZWhpbmRMZW5ndGggPSBtYXRjaFsxXS5sZW5ndGg7XG5cdFx0XHRtYXRjaC5pbmRleCArPSBsb29rYmVoaW5kTGVuZ3RoO1xuXHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZShsb29rYmVoaW5kTGVuZ3RoKTtcblx0XHR9XG5cdFx0cmV0dXJuIG1hdGNoO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0XG5cdCAqIEBwYXJhbSB7TGlua2VkTGlzdDxzdHJpbmcgfCBUb2tlbj59IHRva2VuTGlzdFxuXHQgKiBAcGFyYW0ge2FueX0gZ3JhbW1hclxuXHQgKiBAcGFyYW0ge0xpbmtlZExpc3ROb2RlPHN0cmluZyB8IFRva2VuPn0gc3RhcnROb2RlXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFBvc1xuXHQgKiBAcGFyYW0ge1JlbWF0Y2hPcHRpb25zfSBbcmVtYXRjaF1cblx0ICogQHJldHVybnMge3ZvaWR9XG5cdCAqIEBwcml2YXRlXG5cdCAqXG5cdCAqIEB0eXBlZGVmIFJlbWF0Y2hPcHRpb25zXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjYXVzZVxuXHQgKiBAcHJvcGVydHkge251bWJlcn0gcmVhY2hcblx0ICovXG5cdGZ1bmN0aW9uIG1hdGNoR3JhbW1hcih0ZXh0LCB0b2tlbkxpc3QsIGdyYW1tYXIsIHN0YXJ0Tm9kZSwgc3RhcnRQb3MsIHJlbWF0Y2gpIHtcblx0XHRmb3IgKHZhciB0b2tlbiBpbiBncmFtbWFyKSB7XG5cdFx0XHRpZiAoIWdyYW1tYXIuaGFzT3duUHJvcGVydHkodG9rZW4pIHx8ICFncmFtbWFyW3Rva2VuXSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHBhdHRlcm5zID0gZ3JhbW1hclt0b2tlbl07XG5cdFx0XHRwYXR0ZXJucyA9IEFycmF5LmlzQXJyYXkocGF0dGVybnMpID8gcGF0dGVybnMgOiBbcGF0dGVybnNdO1xuXG5cdFx0XHRmb3IgKHZhciBqID0gMDsgaiA8IHBhdHRlcm5zLmxlbmd0aDsgKytqKSB7XG5cdFx0XHRcdGlmIChyZW1hdGNoICYmIHJlbWF0Y2guY2F1c2UgPT0gdG9rZW4gKyAnLCcgKyBqKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIHBhdHRlcm5PYmogPSBwYXR0ZXJuc1tqXTtcblx0XHRcdFx0dmFyIGluc2lkZSA9IHBhdHRlcm5PYmouaW5zaWRlO1xuXHRcdFx0XHR2YXIgbG9va2JlaGluZCA9ICEhcGF0dGVybk9iai5sb29rYmVoaW5kO1xuXHRcdFx0XHR2YXIgZ3JlZWR5ID0gISFwYXR0ZXJuT2JqLmdyZWVkeTtcblx0XHRcdFx0dmFyIGFsaWFzID0gcGF0dGVybk9iai5hbGlhcztcblxuXHRcdFx0XHRpZiAoZ3JlZWR5ICYmICFwYXR0ZXJuT2JqLnBhdHRlcm4uZ2xvYmFsKSB7XG5cdFx0XHRcdFx0Ly8gV2l0aG91dCB0aGUgZ2xvYmFsIGZsYWcsIGxhc3RJbmRleCB3b24ndCB3b3JrXG5cdFx0XHRcdFx0dmFyIGZsYWdzID0gcGF0dGVybk9iai5wYXR0ZXJuLnRvU3RyaW5nKCkubWF0Y2goL1tpbXN1eV0qJC8pWzBdO1xuXHRcdFx0XHRcdHBhdHRlcm5PYmoucGF0dGVybiA9IFJlZ0V4cChwYXR0ZXJuT2JqLnBhdHRlcm4uc291cmNlLCBmbGFncyArICdnJyk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvKiogQHR5cGUge1JlZ0V4cH0gKi9cblx0XHRcdFx0dmFyIHBhdHRlcm4gPSBwYXR0ZXJuT2JqLnBhdHRlcm4gfHwgcGF0dGVybk9iajtcblxuXHRcdFx0XHRmb3IgKCAvLyBpdGVyYXRlIHRoZSB0b2tlbiBsaXN0IGFuZCBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHRva2VuL3N0cmluZyBwb3NpdGlvblxuXHRcdFx0XHRcdHZhciBjdXJyZW50Tm9kZSA9IHN0YXJ0Tm9kZS5uZXh0LCBwb3MgPSBzdGFydFBvcztcblx0XHRcdFx0XHRjdXJyZW50Tm9kZSAhPT0gdG9rZW5MaXN0LnRhaWw7XG5cdFx0XHRcdFx0cG9zICs9IGN1cnJlbnROb2RlLnZhbHVlLmxlbmd0aCwgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5uZXh0XG5cdFx0XHRcdCkge1xuXG5cdFx0XHRcdFx0aWYgKHJlbWF0Y2ggJiYgcG9zID49IHJlbWF0Y2gucmVhY2gpIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHZhciBzdHIgPSBjdXJyZW50Tm9kZS52YWx1ZTtcblxuXHRcdFx0XHRcdGlmICh0b2tlbkxpc3QubGVuZ3RoID4gdGV4dC5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdC8vIFNvbWV0aGluZyB3ZW50IHRlcnJpYmx5IHdyb25nLCBBQk9SVCwgQUJPUlQhXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKHN0ciBpbnN0YW5jZW9mIFRva2VuKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgcmVtb3ZlQ291bnQgPSAxOyAvLyB0aGlzIGlzIHRoZSB0byBwYXJhbWV0ZXIgb2YgcmVtb3ZlQmV0d2VlblxuXHRcdFx0XHRcdHZhciBtYXRjaDtcblxuXHRcdFx0XHRcdGlmIChncmVlZHkpIHtcblx0XHRcdFx0XHRcdG1hdGNoID0gbWF0Y2hQYXR0ZXJuKHBhdHRlcm4sIHBvcywgdGV4dCwgbG9va2JlaGluZCk7XG5cdFx0XHRcdFx0XHRpZiAoIW1hdGNoIHx8IG1hdGNoLmluZGV4ID49IHRleHQubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2YXIgZnJvbSA9IG1hdGNoLmluZGV4O1xuXHRcdFx0XHRcdFx0dmFyIHRvID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR2YXIgcCA9IHBvcztcblxuXHRcdFx0XHRcdFx0Ly8gZmluZCB0aGUgbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBtYXRjaFxuXHRcdFx0XHRcdFx0cCArPSBjdXJyZW50Tm9kZS52YWx1ZS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoZnJvbSA+PSBwKSB7XG5cdFx0XHRcdFx0XHRcdGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUubmV4dDtcblx0XHRcdFx0XHRcdFx0cCArPSBjdXJyZW50Tm9kZS52YWx1ZS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHQvLyBhZGp1c3QgcG9zIChhbmQgcClcblx0XHRcdFx0XHRcdHAgLT0gY3VycmVudE5vZGUudmFsdWUubGVuZ3RoO1xuXHRcdFx0XHRcdFx0cG9zID0gcDtcblxuXHRcdFx0XHRcdFx0Ly8gdGhlIGN1cnJlbnQgbm9kZSBpcyBhIFRva2VuLCB0aGVuIHRoZSBtYXRjaCBzdGFydHMgaW5zaWRlIGFub3RoZXIgVG9rZW4sIHdoaWNoIGlzIGludmFsaWRcblx0XHRcdFx0XHRcdGlmIChjdXJyZW50Tm9kZS52YWx1ZSBpbnN0YW5jZW9mIFRva2VuKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBmaW5kIHRoZSBsYXN0IG5vZGUgd2hpY2ggaXMgYWZmZWN0ZWQgYnkgdGhpcyBtYXRjaFxuXHRcdFx0XHRcdFx0Zm9yIChcblx0XHRcdFx0XHRcdFx0dmFyIGsgPSBjdXJyZW50Tm9kZTtcblx0XHRcdFx0XHRcdFx0ayAhPT0gdG9rZW5MaXN0LnRhaWwgJiYgKHAgPCB0byB8fCB0eXBlb2Ygay52YWx1ZSA9PT0gJ3N0cmluZycpO1xuXHRcdFx0XHRcdFx0XHRrID0gay5uZXh0XG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0cmVtb3ZlQ291bnQrKztcblx0XHRcdFx0XHRcdFx0cCArPSBrLnZhbHVlLmxlbmd0aDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHJlbW92ZUNvdW50LS07XG5cblx0XHRcdFx0XHRcdC8vIHJlcGxhY2Ugd2l0aCB0aGUgbmV3IG1hdGNoXG5cdFx0XHRcdFx0XHRzdHIgPSB0ZXh0LnNsaWNlKHBvcywgcCk7XG5cdFx0XHRcdFx0XHRtYXRjaC5pbmRleCAtPSBwb3M7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdG1hdGNoID0gbWF0Y2hQYXR0ZXJuKHBhdHRlcm4sIDAsIHN0ciwgbG9va2JlaGluZCk7XG5cdFx0XHRcdFx0XHRpZiAoIW1hdGNoKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZWRlY2xhcmVcblx0XHRcdFx0XHR2YXIgZnJvbSA9IG1hdGNoLmluZGV4O1xuXHRcdFx0XHRcdHZhciBtYXRjaFN0ciA9IG1hdGNoWzBdO1xuXHRcdFx0XHRcdHZhciBiZWZvcmUgPSBzdHIuc2xpY2UoMCwgZnJvbSk7XG5cdFx0XHRcdFx0dmFyIGFmdGVyID0gc3RyLnNsaWNlKGZyb20gKyBtYXRjaFN0ci5sZW5ndGgpO1xuXG5cdFx0XHRcdFx0dmFyIHJlYWNoID0gcG9zICsgc3RyLmxlbmd0aDtcblx0XHRcdFx0XHRpZiAocmVtYXRjaCAmJiByZWFjaCA+IHJlbWF0Y2gucmVhY2gpIHtcblx0XHRcdFx0XHRcdHJlbWF0Y2gucmVhY2ggPSByZWFjaDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR2YXIgcmVtb3ZlRnJvbSA9IGN1cnJlbnROb2RlLnByZXY7XG5cblx0XHRcdFx0XHRpZiAoYmVmb3JlKSB7XG5cdFx0XHRcdFx0XHRyZW1vdmVGcm9tID0gYWRkQWZ0ZXIodG9rZW5MaXN0LCByZW1vdmVGcm9tLCBiZWZvcmUpO1xuXHRcdFx0XHRcdFx0cG9zICs9IGJlZm9yZS5sZW5ndGg7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmVtb3ZlUmFuZ2UodG9rZW5MaXN0LCByZW1vdmVGcm9tLCByZW1vdmVDb3VudCk7XG5cblx0XHRcdFx0XHR2YXIgd3JhcHBlZCA9IG5ldyBUb2tlbih0b2tlbiwgaW5zaWRlID8gXy50b2tlbml6ZShtYXRjaFN0ciwgaW5zaWRlKSA6IG1hdGNoU3RyLCBhbGlhcywgbWF0Y2hTdHIpO1xuXHRcdFx0XHRcdGN1cnJlbnROb2RlID0gYWRkQWZ0ZXIodG9rZW5MaXN0LCByZW1vdmVGcm9tLCB3cmFwcGVkKTtcblxuXHRcdFx0XHRcdGlmIChhZnRlcikge1xuXHRcdFx0XHRcdFx0YWRkQWZ0ZXIodG9rZW5MaXN0LCBjdXJyZW50Tm9kZSwgYWZ0ZXIpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChyZW1vdmVDb3VudCA+IDEpIHtcblx0XHRcdFx0XHRcdC8vIGF0IGxlYXN0IG9uZSBUb2tlbiBvYmplY3Qgd2FzIHJlbW92ZWQsIHNvIHdlIGhhdmUgdG8gZG8gc29tZSByZW1hdGNoaW5nXG5cdFx0XHRcdFx0XHQvLyB0aGlzIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGUgY3VycmVudCBwYXR0ZXJuIGlzIGdyZWVkeVxuXG5cdFx0XHRcdFx0XHQvKiogQHR5cGUge1JlbWF0Y2hPcHRpb25zfSAqL1xuXHRcdFx0XHRcdFx0dmFyIG5lc3RlZFJlbWF0Y2ggPSB7XG5cdFx0XHRcdFx0XHRcdGNhdXNlOiB0b2tlbiArICcsJyArIGosXG5cdFx0XHRcdFx0XHRcdHJlYWNoOiByZWFjaFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdG1hdGNoR3JhbW1hcih0ZXh0LCB0b2tlbkxpc3QsIGdyYW1tYXIsIGN1cnJlbnROb2RlLnByZXYsIHBvcywgbmVzdGVkUmVtYXRjaCk7XG5cblx0XHRcdFx0XHRcdC8vIHRoZSByZWFjaCBtaWdodCBoYXZlIGJlZW4gZXh0ZW5kZWQgYmVjYXVzZSBvZiB0aGUgcmVtYXRjaGluZ1xuXHRcdFx0XHRcdFx0aWYgKHJlbWF0Y2ggJiYgbmVzdGVkUmVtYXRjaC5yZWFjaCA+IHJlbWF0Y2gucmVhY2gpIHtcblx0XHRcdFx0XHRcdFx0cmVtYXRjaC5yZWFjaCA9IG5lc3RlZFJlbWF0Y2gucmVhY2g7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEB0eXBlZGVmIExpbmtlZExpc3ROb2RlXG5cdCAqIEBwcm9wZXJ0eSB7VH0gdmFsdWVcblx0ICogQHByb3BlcnR5IHtMaW5rZWRMaXN0Tm9kZTxUPiB8IG51bGx9IHByZXYgVGhlIHByZXZpb3VzIG5vZGUuXG5cdCAqIEBwcm9wZXJ0eSB7TGlua2VkTGlzdE5vZGU8VD4gfCBudWxsfSBuZXh0IFRoZSBuZXh0IG5vZGUuXG5cdCAqIEB0ZW1wbGF0ZSBUXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXG5cdC8qKlxuXHQgKiBAdGVtcGxhdGUgVFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0ZnVuY3Rpb24gTGlua2VkTGlzdCgpIHtcblx0XHQvKiogQHR5cGUge0xpbmtlZExpc3ROb2RlPFQ+fSAqL1xuXHRcdHZhciBoZWFkID0geyB2YWx1ZTogbnVsbCwgcHJldjogbnVsbCwgbmV4dDogbnVsbCB9O1xuXHRcdC8qKiBAdHlwZSB7TGlua2VkTGlzdE5vZGU8VD59ICovXG5cdFx0dmFyIHRhaWwgPSB7IHZhbHVlOiBudWxsLCBwcmV2OiBoZWFkLCBuZXh0OiBudWxsIH07XG5cdFx0aGVhZC5uZXh0ID0gdGFpbDtcblxuXHRcdC8qKiBAdHlwZSB7TGlua2VkTGlzdE5vZGU8VD59ICovXG5cdFx0dGhpcy5oZWFkID0gaGVhZDtcblx0XHQvKiogQHR5cGUge0xpbmtlZExpc3ROb2RlPFQ+fSAqL1xuXHRcdHRoaXMudGFpbCA9IHRhaWw7XG5cdFx0dGhpcy5sZW5ndGggPSAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBuZXcgbm9kZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZSB0byB0aGUgbGlzdC5cblx0ICpcblx0ICogQHBhcmFtIHtMaW5rZWRMaXN0PFQ+fSBsaXN0XG5cdCAqIEBwYXJhbSB7TGlua2VkTGlzdE5vZGU8VD59IG5vZGVcblx0ICogQHBhcmFtIHtUfSB2YWx1ZVxuXHQgKiBAcmV0dXJucyB7TGlua2VkTGlzdE5vZGU8VD59IFRoZSBhZGRlZCBub2RlLlxuXHQgKiBAdGVtcGxhdGUgVFxuXHQgKi9cblx0ZnVuY3Rpb24gYWRkQWZ0ZXIobGlzdCwgbm9kZSwgdmFsdWUpIHtcblx0XHQvLyBhc3N1bWVzIHRoYXQgbm9kZSAhPSBsaXN0LnRhaWwgJiYgdmFsdWVzLmxlbmd0aCA+PSAwXG5cdFx0dmFyIG5leHQgPSBub2RlLm5leHQ7XG5cblx0XHR2YXIgbmV3Tm9kZSA9IHsgdmFsdWU6IHZhbHVlLCBwcmV2OiBub2RlLCBuZXh0OiBuZXh0IH07XG5cdFx0bm9kZS5uZXh0ID0gbmV3Tm9kZTtcblx0XHRuZXh0LnByZXYgPSBuZXdOb2RlO1xuXHRcdGxpc3QubGVuZ3RoKys7XG5cblx0XHRyZXR1cm4gbmV3Tm9kZTtcblx0fVxuXHQvKipcblx0ICogUmVtb3ZlcyBgY291bnRgIG5vZGVzIGFmdGVyIHRoZSBnaXZlbiBub2RlLiBUaGUgZ2l2ZW4gbm9kZSB3aWxsIG5vdCBiZSByZW1vdmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge0xpbmtlZExpc3Q8VD59IGxpc3Rcblx0ICogQHBhcmFtIHtMaW5rZWRMaXN0Tm9kZTxUPn0gbm9kZVxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnRcblx0ICogQHRlbXBsYXRlIFRcblx0ICovXG5cdGZ1bmN0aW9uIHJlbW92ZVJhbmdlKGxpc3QsIG5vZGUsIGNvdW50KSB7XG5cdFx0dmFyIG5leHQgPSBub2RlLm5leHQ7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudCAmJiBuZXh0ICE9PSBsaXN0LnRhaWw7IGkrKykge1xuXHRcdFx0bmV4dCA9IG5leHQubmV4dDtcblx0XHR9XG5cdFx0bm9kZS5uZXh0ID0gbmV4dDtcblx0XHRuZXh0LnByZXYgPSBub2RlO1xuXHRcdGxpc3QubGVuZ3RoIC09IGk7XG5cdH1cblx0LyoqXG5cdCAqIEBwYXJhbSB7TGlua2VkTGlzdDxUPn0gbGlzdFxuXHQgKiBAcmV0dXJucyB7VFtdfVxuXHQgKiBAdGVtcGxhdGUgVFxuXHQgKi9cblx0ZnVuY3Rpb24gdG9BcnJheShsaXN0KSB7XG5cdFx0dmFyIGFycmF5ID0gW107XG5cdFx0dmFyIG5vZGUgPSBsaXN0LmhlYWQubmV4dDtcblx0XHR3aGlsZSAobm9kZSAhPT0gbGlzdC50YWlsKSB7XG5cdFx0XHRhcnJheS5wdXNoKG5vZGUudmFsdWUpO1xuXHRcdFx0bm9kZSA9IG5vZGUubmV4dDtcblx0XHR9XG5cdFx0cmV0dXJuIGFycmF5O1xuXHR9XG5cblxuXHRpZiAoIV9zZWxmLmRvY3VtZW50KSB7XG5cdFx0aWYgKCFfc2VsZi5hZGRFdmVudExpc3RlbmVyKSB7XG5cdFx0XHQvLyBpbiBOb2RlLmpzXG5cdFx0XHRyZXR1cm4gXztcblx0XHR9XG5cblx0XHRpZiAoIV8uZGlzYWJsZVdvcmtlck1lc3NhZ2VIYW5kbGVyKSB7XG5cdFx0XHQvLyBJbiB3b3JrZXJcblx0XHRcdF9zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiAoZXZ0KSB7XG5cdFx0XHRcdHZhciBtZXNzYWdlID0gSlNPTi5wYXJzZShldnQuZGF0YSk7XG5cdFx0XHRcdHZhciBsYW5nID0gbWVzc2FnZS5sYW5ndWFnZTtcblx0XHRcdFx0dmFyIGNvZGUgPSBtZXNzYWdlLmNvZGU7XG5cdFx0XHRcdHZhciBpbW1lZGlhdGVDbG9zZSA9IG1lc3NhZ2UuaW1tZWRpYXRlQ2xvc2U7XG5cblx0XHRcdFx0X3NlbGYucG9zdE1lc3NhZ2UoXy5oaWdobGlnaHQoY29kZSwgXy5sYW5ndWFnZXNbbGFuZ10sIGxhbmcpKTtcblx0XHRcdFx0aWYgKGltbWVkaWF0ZUNsb3NlKSB7XG5cdFx0XHRcdFx0X3NlbGYuY2xvc2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgZmFsc2UpO1xuXHRcdH1cblxuXHRcdHJldHVybiBfO1xuXHR9XG5cblx0Ly8gR2V0IGN1cnJlbnQgc2NyaXB0IGFuZCBoaWdobGlnaHRcblx0dmFyIHNjcmlwdCA9IF8udXRpbC5jdXJyZW50U2NyaXB0KCk7XG5cblx0aWYgKHNjcmlwdCkge1xuXHRcdF8uZmlsZW5hbWUgPSBzY3JpcHQuc3JjO1xuXG5cdFx0aWYgKHNjcmlwdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtbWFudWFsJykpIHtcblx0XHRcdF8ubWFudWFsID0gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRmdW5jdGlvbiBoaWdobGlnaHRBdXRvbWF0aWNhbGx5Q2FsbGJhY2soKSB7XG5cdFx0aWYgKCFfLm1hbnVhbCkge1xuXHRcdFx0Xy5oaWdobGlnaHRBbGwoKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoIV8ubWFudWFsKSB7XG5cdFx0Ly8gSWYgdGhlIGRvY3VtZW50IHN0YXRlIGlzIFwibG9hZGluZ1wiLCB0aGVuIHdlJ2xsIHVzZSBET01Db250ZW50TG9hZGVkLlxuXHRcdC8vIElmIHRoZSBkb2N1bWVudCBzdGF0ZSBpcyBcImludGVyYWN0aXZlXCIgYW5kIHRoZSBwcmlzbS5qcyBzY3JpcHQgaXMgZGVmZXJyZWQsIHRoZW4gd2UnbGwgYWxzbyB1c2UgdGhlXG5cdFx0Ly8gRE9NQ29udGVudExvYWRlZCBldmVudCBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIHNvbWUgcGx1Z2lucyBvciBsYW5ndWFnZXMgd2hpY2ggaGF2ZSBhbHNvIGJlZW4gZGVmZXJyZWQgYW5kIHRoZXlcblx0XHQvLyBtaWdodCB0YWtlIGxvbmdlciBvbmUgYW5pbWF0aW9uIGZyYW1lIHRvIGV4ZWN1dGUgd2hpY2ggY2FuIGNyZWF0ZSBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIG9ubHkgc29tZSBwbHVnaW5zIGhhdmVcblx0XHQvLyBiZWVuIGxvYWRlZCB3aGVuIFByaXNtLmhpZ2hsaWdodEFsbCgpIGlzIGV4ZWN1dGVkLCBkZXBlbmRpbmcgb24gaG93IGZhc3QgcmVzb3VyY2VzIGFyZSBsb2FkZWQuXG5cdFx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9QcmlzbUpTL3ByaXNtL2lzc3Vlcy8yMTAyXG5cdFx0dmFyIHJlYWR5U3RhdGUgPSBkb2N1bWVudC5yZWFkeVN0YXRlO1xuXHRcdGlmIChyZWFkeVN0YXRlID09PSAnbG9hZGluZycgfHwgcmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJyAmJiBzY3JpcHQgJiYgc2NyaXB0LmRlZmVyKSB7XG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgaGlnaGxpZ2h0QXV0b21hdGljYWxseUNhbGxiYWNrKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcblx0XHRcdFx0d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShoaWdobGlnaHRBdXRvbWF0aWNhbGx5Q2FsbGJhY2spO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoaGlnaGxpZ2h0QXV0b21hdGljYWxseUNhbGxiYWNrLCAxNik7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIF87XG5cbn0oX3NlbGYpKTtcblxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSB7XG5cdG1vZHVsZS5leHBvcnRzID0gUHJpc207XG59XG5cbi8vIGhhY2sgZm9yIGNvbXBvbmVudHMgdG8gd29yayBjb3JyZWN0bHkgaW4gbm9kZS5qc1xuaWYgKHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnKSB7XG5cdGdsb2JhbC5QcmlzbSA9IFByaXNtO1xufVxuXG4vLyBzb21lIGFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbi90eXBlc1xuXG4vKipcbiAqIFRoZSBleHBhbnNpb24gb2YgYSBzaW1wbGUgYFJlZ0V4cGAgbGl0ZXJhbCB0byBzdXBwb3J0IGFkZGl0aW9uYWwgcHJvcGVydGllcy5cbiAqXG4gKiBAdHlwZWRlZiBHcmFtbWFyVG9rZW5cbiAqIEBwcm9wZXJ0eSB7UmVnRXhwfSBwYXR0ZXJuIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gb2YgdGhlIHRva2VuLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbG9va2JlaGluZD1mYWxzZV0gSWYgYHRydWVgLCB0aGVuIHRoZSBmaXJzdCBjYXB0dXJpbmcgZ3JvdXAgb2YgYHBhdHRlcm5gIHdpbGwgKGVmZmVjdGl2ZWx5KVxuICogYmVoYXZlIGFzIGEgbG9va2JlaGluZCBncm91cCBtZWFuaW5nIHRoYXQgdGhlIGNhcHR1cmVkIHRleHQgd2lsbCBub3QgYmUgcGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IG9mIHRoZSBuZXcgdG9rZW4uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtncmVlZHk9ZmFsc2VdIFdoZXRoZXIgdGhlIHRva2VuIGlzIGdyZWVkeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfHN0cmluZ1tdfSBbYWxpYXNdIEFuIG9wdGlvbmFsIGFsaWFzIG9yIGxpc3Qgb2YgYWxpYXNlcy5cbiAqIEBwcm9wZXJ0eSB7R3JhbW1hcn0gW2luc2lkZV0gVGhlIG5lc3RlZCBncmFtbWFyIG9mIHRoaXMgdG9rZW4uXG4gKlxuICogVGhlIGBpbnNpZGVgIGdyYW1tYXIgd2lsbCBiZSB1c2VkIHRvIHRva2VuaXplIHRoZSB0ZXh0IHZhbHVlIG9mIGVhY2ggdG9rZW4gb2YgdGhpcyBraW5kLlxuICpcbiAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gbWFrZSBuZXN0ZWQgYW5kIGV2ZW4gcmVjdXJzaXZlIGxhbmd1YWdlIGRlZmluaXRpb25zLlxuICpcbiAqIE5vdGU6IFRoaXMgY2FuIGNhdXNlIGluZmluaXRlIHJlY3Vyc2lvbi4gQmUgY2FyZWZ1bCB3aGVuIHlvdSBlbWJlZCBkaWZmZXJlbnQgbGFuZ3VhZ2VzIG9yIGV2ZW4gdGhlIHNhbWUgbGFuZ3VhZ2UgaW50b1xuICogZWFjaCBhbm90aGVyLlxuICogQGdsb2JhbFxuICogQHB1YmxpY1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR3JhbW1hclxuICogQHR5cGUge09iamVjdDxzdHJpbmcsIFJlZ0V4cCB8IEdyYW1tYXJUb2tlbiB8IEFycmF5PFJlZ0V4cCB8IEdyYW1tYXJUb2tlbj4+fVxuICogQHByb3BlcnR5IHtHcmFtbWFyfSBbcmVzdF0gQW4gb3B0aW9uYWwgZ3JhbW1hciBvYmplY3QgdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMgZ3JhbW1hci5cbiAqIEBnbG9iYWxcbiAqIEBwdWJsaWNcbiAqL1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gd2hpY2ggd2lsbCBpbnZva2VkIGFmdGVyIGFuIGVsZW1lbnQgd2FzIHN1Y2Nlc3NmdWxseSBoaWdobGlnaHRlZC5cbiAqXG4gKiBAY2FsbGJhY2sgSGlnaGxpZ2h0Q2FsbGJhY2tcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudCBzdWNjZXNzZnVsbHkgaGlnaGxpZ2h0ZWQuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBnbG9iYWxcbiAqIEBwdWJsaWNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBIb29rQ2FsbGJhY2tcbiAqIEBwYXJhbSB7T2JqZWN0PHN0cmluZywgYW55Pn0gZW52IFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgb2YgdGhlIGhvb2suXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqIEBnbG9iYWxcbiAqIEBwdWJsaWNcbiAqL1xuO1xuUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLzwhLS0oPzooPyE8IS0tKVtcXHNcXFNdKSo/LS0+Lyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3Byb2xvZyc6IHtcblx0XHRwYXR0ZXJuOiAvPFxcP1tcXHNcXFNdKz9cXD8+Lyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2RvY3R5cGUnOiB7XG5cdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3htbC8jTlQtZG9jdHlwZWRlY2xcblx0XHRwYXR0ZXJuOiAvPCFET0NUWVBFKD86W14+XCInW1xcXV18XCJbXlwiXSpcInwnW14nXSonKSsoPzpcXFsoPzpbXjxcIidcXF1dfFwiW15cIl0qXCJ8J1teJ10qJ3w8KD8hIS0tKXw8IS0tKD86W14tXXwtKD8hLT4pKSotLT4pKlxcXVxccyopPz4vaSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJuYWwtc3Vic2V0Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF5bXlxcW10qXFxbKVtcXHNcXFNdKyg/PVxcXT4kKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cIlteXCJdKlwifCdbXiddKicvLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXjwhfD4kfFtbXFxdXS8sXG5cdFx0XHQnZG9jdHlwZS10YWcnOiAvXkRPQ1RZUEUvaSxcblx0XHRcdCduYW1lJzogL1teXFxzPD4nXCJdKy9cblx0XHR9XG5cdH0sXG5cdCdjZGF0YSc6IHtcblx0XHRwYXR0ZXJuOiAvPCFcXFtDREFUQVxcW1tcXHNcXFNdKj9cXF1cXF0+L2ksXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd0YWcnOiB7XG5cdFx0cGF0dGVybjogLzxcXC8/KD8hXFxkKVteXFxzPlxcLz0kPCVdKyg/Olxccyg/OlxccypbXlxccz5cXC89XSsoPzpcXHMqPVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W15cXHMnXCI+PV0rKD89W1xccz5dKSl8KD89W1xccy8+XSkpKSspP1xccypcXC8/Pi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3RhZyc6IHtcblx0XHRcdFx0cGF0dGVybjogL148XFwvP1teXFxzPlxcL10rLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL148XFwvPy8sXG5cdFx0XHRcdFx0J25hbWVzcGFjZSc6IC9eW15cXHM+XFwvOl0rOi9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzcGVjaWFsLWF0dHInOiBbXSxcblx0XHRcdCdhdHRyLXZhbHVlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvPVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W15cXHMnXCI+PV0rKS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IFtcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL149Lyxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdhdHRyLWVxdWFscydcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccyopW1wiJ118W1wiJ10kLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC8/Pi8sXG5cdFx0XHQnYXR0ci1uYW1lJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvW15cXHM+XFwvXSsvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnbmFtZXNwYWNlJzogL15bXlxccz5cXC86XSs6L1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHR9XG5cdH0sXG5cdCdlbnRpdHknOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyZbXFxkYS16XXsxLDh9Oy9pLFxuXHRcdFx0YWxpYXM6ICduYW1lZC1lbnRpdHknXG5cdFx0fSxcblx0XHQvJiN4P1tcXGRhLWZdezEsOH07L2lcblx0XVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cFsndGFnJ10uaW5zaWRlWydhdHRyLXZhbHVlJ10uaW5zaWRlWydlbnRpdHknXSA9XG5cdFByaXNtLmxhbmd1YWdlcy5tYXJrdXBbJ2VudGl0eSddO1xuUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cFsnZG9jdHlwZSddLmluc2lkZVsnaW50ZXJuYWwtc3Vic2V0J10uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cDtcblxuLy8gUGx1Z2luIHRvIG1ha2UgZW50aXR5IHRpdGxlIHNob3cgdGhlIHJlYWwgZW50aXR5LCBpZGVhIGJ5IFJvbWFuIEtvbWFyb3ZcblByaXNtLmhvb2tzLmFkZCgnd3JhcCcsIGZ1bmN0aW9uIChlbnYpIHtcblxuXHRpZiAoZW52LnR5cGUgPT09ICdlbnRpdHknKSB7XG5cdFx0ZW52LmF0dHJpYnV0ZXNbJ3RpdGxlJ10gPSBlbnYuY29udGVudC5yZXBsYWNlKC8mYW1wOy8sICcmJyk7XG5cdH1cbn0pO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC50YWcsICdhZGRJbmxpbmVkJywge1xuXHQvKipcblx0ICogQWRkcyBhbiBpbmxpbmVkIGxhbmd1YWdlIHRvIG1hcmt1cC5cblx0ICpcblx0ICogQW4gZXhhbXBsZSBvZiBhbiBpbmxpbmVkIGxhbmd1YWdlIGlzIENTUyB3aXRoIGA8c3R5bGU+YCB0YWdzLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGFnTmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFnIHRoYXQgY29udGFpbnMgdGhlIGlubGluZWQgbGFuZ3VhZ2UuIFRoaXMgbmFtZSB3aWxsIGJlIHRyZWF0ZWQgYXNcblx0ICogY2FzZSBpbnNlbnNpdGl2ZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmcgVGhlIGxhbmd1YWdlIGtleS5cblx0ICogQGV4YW1wbGVcblx0ICogYWRkSW5saW5lZCgnc3R5bGUnLCAnY3NzJyk7XG5cdCAqL1xuXHR2YWx1ZTogZnVuY3Rpb24gYWRkSW5saW5lZCh0YWdOYW1lLCBsYW5nKSB7XG5cdFx0dmFyIGluY2x1ZGVkQ2RhdGFJbnNpZGUgPSB7fTtcblx0XHRpbmNsdWRlZENkYXRhSW5zaWRlWydsYW5ndWFnZS0nICsgbGFuZ10gPSB7XG5cdFx0XHRwYXR0ZXJuOiAvKF48IVxcW0NEQVRBXFxbKVtcXHNcXFNdKz8oPz1cXF1cXF0+JCkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlc1tsYW5nXVxuXHRcdH07XG5cdFx0aW5jbHVkZWRDZGF0YUluc2lkZVsnY2RhdGEnXSA9IC9ePCFcXFtDREFUQVxcW3xcXF1cXF0+JC9pO1xuXG5cdFx0dmFyIGluc2lkZSA9IHtcblx0XHRcdCdpbmNsdWRlZC1jZGF0YSc6IHtcblx0XHRcdFx0cGF0dGVybjogLzwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/XFxdXFxdPi9pLFxuXHRcdFx0XHRpbnNpZGU6IGluY2x1ZGVkQ2RhdGFJbnNpZGVcblx0XHRcdH1cblx0XHR9O1xuXHRcdGluc2lkZVsnbGFuZ3VhZ2UtJyArIGxhbmddID0ge1xuXHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlc1tsYW5nXVxuXHRcdH07XG5cblx0XHR2YXIgZGVmID0ge307XG5cdFx0ZGVmW3RhZ05hbWVdID0ge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oPF9fW14+XSo+KSg/OjwhXFxbQ0RBVEFcXFsoPzpbXlxcXV18XFxdKD8hXFxdPikpKlxcXVxcXT58KD8hPCFcXFtDREFUQVxcWylbXFxzXFxTXSkqPyg/PTxcXC9fXz4pLy5zb3VyY2UucmVwbGFjZSgvX18vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdGFnTmFtZTsgfSksICdpJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBpbnNpZGVcblx0XHR9O1xuXG5cdFx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnbWFya3VwJywgJ2NkYXRhJywgZGVmKTtcblx0fVxufSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC50YWcsICdhZGRBdHRyaWJ1dGUnLCB7XG5cdC8qKlxuXHQgKiBBZGRzIGFuIHBhdHRlcm4gdG8gaGlnaGxpZ2h0IGxhbmd1YWdlcyBlbWJlZGRlZCBpbiBIVE1MIGF0dHJpYnV0ZXMuXG5cdCAqXG5cdCAqIEFuIGV4YW1wbGUgb2YgYW4gaW5saW5lZCBsYW5ndWFnZSBpcyBDU1Mgd2l0aCBgc3R5bGVgIGF0dHJpYnV0ZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFnIHRoYXQgY29udGFpbnMgdGhlIGlubGluZWQgbGFuZ3VhZ2UuIFRoaXMgbmFtZSB3aWxsIGJlIHRyZWF0ZWQgYXNcblx0ICogY2FzZSBpbnNlbnNpdGl2ZS5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmcgVGhlIGxhbmd1YWdlIGtleS5cblx0ICogQGV4YW1wbGVcblx0ICogYWRkQXR0cmlidXRlKCdzdHlsZScsICdjc3MnKTtcblx0ICovXG5cdHZhbHVlOiBmdW5jdGlvbiAoYXR0ck5hbWUsIGxhbmcpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXMubWFya3VwLnRhZy5pbnNpZGVbJ3NwZWNpYWwtYXR0ciddLnB1c2goe1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHQvKF58W1wiJ1xcc10pLy5zb3VyY2UgKyAnKD86JyArIGF0dHJOYW1lICsgJyknICsgL1xccyo9XFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXlxccydcIj49XSsoPz1bXFxzPl0pKS8uc291cmNlLFxuXHRcdFx0XHQnaSdcblx0XHRcdCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdhdHRyLW5hbWUnOiAvXlteXFxzPV0rLyxcblx0XHRcdFx0J2F0dHItdmFsdWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLz1bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3ZhbHVlJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF49XFxzKihbXCInXXwoPyFbXCInXSkpKVxcU1tcXHNcXFNdKig/PVxcMiQpLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0YWxpYXM6IFtsYW5nLCAnbGFuZ3VhZ2UtJyArIGxhbmddLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlc1tsYW5nXVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IFtcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9ePS8sXG5cdFx0XHRcdFx0XHRcdFx0YWxpYXM6ICdhdHRyLWVxdWFscydcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0L1wifCcvXG5cdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaHRtbCA9IFByaXNtLmxhbmd1YWdlcy5tYXJrdXA7XG5QcmlzbS5sYW5ndWFnZXMubWF0aG1sID0gUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cDtcblByaXNtLmxhbmd1YWdlcy5zdmcgPSBQcmlzbS5sYW5ndWFnZXMubWFya3VwO1xuXG5QcmlzbS5sYW5ndWFnZXMueG1sID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnbWFya3VwJywge30pO1xuUHJpc20ubGFuZ3VhZ2VzLnNzbWwgPSBQcmlzbS5sYW5ndWFnZXMueG1sO1xuUHJpc20ubGFuZ3VhZ2VzLmF0b20gPSBQcmlzbS5sYW5ndWFnZXMueG1sO1xuUHJpc20ubGFuZ3VhZ2VzLnJzcyA9IFByaXNtLmxhbmd1YWdlcy54bWw7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgc3RyaW5nID0gLyg/OlwiKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cIlxcXFxcXHJcXG5dKSpcInwnKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W14nXFxcXFxcclxcbl0pKicpLztcblxuXHRQcmlzbS5sYW5ndWFnZXMuY3NzID0ge1xuXHRcdCdjb21tZW50JzogL1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdCdhdHJ1bGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJ0BbXFxcXHctXSg/OicgKyAvW147e1xcc1wiJ118XFxzKyg/IVxccykvLnNvdXJjZSArICd8JyArIHN0cmluZy5zb3VyY2UgKyAnKSo/JyArIC8oPzo7fCg/PVxccypcXHspKS8uc291cmNlKSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncnVsZSc6IC9eQFtcXHctXSsvLFxuXHRcdFx0XHQnc2VsZWN0b3ItZnVuY3Rpb24tYXJndW1lbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhcXGJzZWxlY3RvclxccypcXChcXHMqKD8hW1xccyldKSkoPzpbXigpXFxzXXxcXHMrKD8hW1xccyldKXxcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKSkrKD89XFxzKlxcKSkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdzZWxlY3Rvcidcblx0XHRcdFx0fSxcblx0XHRcdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhefFteXFx3LV0pKD86YW5kfG5vdHxvbmx5fG9yKSg/IVtcXHctXSkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0XHQvLyBTZWUgcmVzdCBiZWxvd1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3VybCc6IHtcblx0XHRcdC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3MtdmFsdWVzLTMvI3VybHNcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnXFxcXGJ1cmxcXFxcKCg/OicgKyBzdHJpbmcuc291cmNlICsgJ3wnICsgLyg/OlteXFxcXFxcclxcbigpXCInXXxcXFxcW1xcc1xcU10pKi8uc291cmNlICsgJylcXFxcKScsICdpJyksXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Z1bmN0aW9uJzogL151cmwvaSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXCh8XFwpJC8sXG5cdFx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCdeJyArIHN0cmluZy5zb3VyY2UgKyAnJCcpLFxuXHRcdFx0XHRcdGFsaWFzOiAndXJsJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnc2VsZWN0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyhefFt7fVxcXFxzXSlbXnt9XFxcXHNdKD86W157fTtcIlxcJ1xcXFxzXXxcXFxccysoPyFbXFxcXHN7XSl8JyArIHN0cmluZy5zb3VyY2UgKyAnKSooPz1cXFxccypcXFxceyknKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiBzdHJpbmcsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdwcm9wZXJ0eSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXi1cXHdcXHhBMC1cXHVGRkZGXSkoPyFcXHMpWy1fYS16XFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWy1cXHdcXHhBMC1cXHVGRkZGXSkqKD89XFxzKjopL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnaW1wb3J0YW50JzogLyFpbXBvcnRhbnRcXGIvaSxcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14tYS16MC05XSlbLWEtejAtOV0rKD89XFwoKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKXt9OzosXS9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuY3NzWydhdHJ1bGUnXS5pbnNpZGUucmVzdCA9IFByaXNtLmxhbmd1YWdlcy5jc3M7XG5cblx0dmFyIG1hcmt1cCA9IFByaXNtLmxhbmd1YWdlcy5tYXJrdXA7XG5cdGlmIChtYXJrdXApIHtcblx0XHRtYXJrdXAudGFnLmFkZElubGluZWQoJ3N0eWxlJywgJ2NzcycpO1xuXHRcdG1hcmt1cC50YWcuYWRkQXR0cmlidXRlKCdzdHlsZScsICdjc3MnKTtcblx0fVxuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5jbGlrZSA9IHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcOl0pXFwvXFwvLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYig/OmNsYXNzfGV4dGVuZHN8aW1wbGVtZW50c3xpbnN0YW5jZW9mfGludGVyZmFjZXxuZXd8dHJhaXQpXFxzK3xcXGJjYXRjaFxccytcXCgpW1xcdy5cXFxcXSsvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1suXFxcXF0vXG5cdFx0fVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpicmVha3xjYXRjaHxjb250aW51ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufGlmfGlufGluc3RhbmNlb2Z8bmV3fG51bGx8cmV0dXJufHRocm93fHRyeXx3aGlsZSlcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGJcXHcrKD89XFwoKS8sXG5cdCdudW1iZXInOiAvXFxiMHhbXFxkYS1mXStcXGJ8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspPy9pLFxuXHQnb3BlcmF0b3InOiAvWzw+XT0/fFshPV09Pz0/fC0tP3xcXCtcXCs/fCYmP3xcXHxcXHw/fFs/Ki9+XiVdLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHQgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0UHJpc20ubGFuZ3VhZ2VzLmNsaWtlWydjbGFzcy1uYW1lJ10sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteJFxcd1xceEEwLVxcdUZGRkZdKSg/IVxccylbXyRBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSooPz1cXC4oPzpjb25zdHJ1Y3Rvcnxwcm90b3R5cGUpKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQna2V5d29yZCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFx9KVxccyopY2F0Y2hcXGIvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteLl18XFwuXFwuXFwuXFxzKilcXGIoPzphc3xhc3NlcnQoPz1cXHMqXFx7KXxhc3luYyg/PVxccyooPzpmdW5jdGlvblxcYnxcXCh8WyRcXHdcXHhBMC1cXHVGRkZGXXwkKSl8YXdhaXR8YnJlYWt8Y2FzZXxjbGFzc3xjb25zdHxjb250aW51ZXxkZWJ1Z2dlcnxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGVudW18ZXhwb3J0fGV4dGVuZHN8ZmluYWxseSg/PVxccyooPzpcXHt8JCkpfGZvcnxmcm9tKD89XFxzKig/OlsnXCJdfCQpKXxmdW5jdGlvbnwoPzpnZXR8c2V0KSg/PVxccyooPzpbI1xcWyRcXHdcXHhBMC1cXHVGRkZGXXwkKSl8aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW58aW5zdGFuY2VvZnxpbnRlcmZhY2V8bGV0fG5ld3xudWxsfG9mfHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJldHVybnxzdGF0aWN8c3VwZXJ8c3dpdGNofHRoaXN8dGhyb3d8dHJ5fHR5cGVvZnx1bmRlZmluZWR8dmFyfHZvaWR8d2hpbGV8d2l0aHx5aWVsZClcXGIvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdF0sXG5cdC8vIEFsbG93IGZvciBhbGwgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgKFNlZSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMDA4NDQ0KVxuXHQnZnVuY3Rpb24nOiAvIz8oPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKD89XFxzKig/OlxcLlxccyooPzphcHBseXxiaW5kfGNhbGwpXFxzKik/XFwoKS8sXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0LyhefFteXFx3JF0pLy5zb3VyY2UgK1xuXHRcdFx0Jyg/OicgK1xuXHRcdFx0KFxuXHRcdFx0XHQvLyBjb25zdGFudFxuXHRcdFx0XHQvTmFOfEluZmluaXR5Ly5zb3VyY2UgK1xuXHRcdFx0XHQnfCcgK1xuXHRcdFx0XHQvLyBiaW5hcnkgaW50ZWdlclxuXHRcdFx0XHQvMFtiQl1bMDFdKyg/Ol9bMDFdKykqbj8vLnNvdXJjZSArXG5cdFx0XHRcdCd8JyArXG5cdFx0XHRcdC8vIG9jdGFsIGludGVnZXJcblx0XHRcdFx0LzBbb09dWzAtN10rKD86X1swLTddKykqbj8vLnNvdXJjZSArXG5cdFx0XHRcdCd8JyArXG5cdFx0XHRcdC8vIGhleGFkZWNpbWFsIGludGVnZXJcblx0XHRcdFx0LzBbeFhdW1xcZEEtRmEtZl0rKD86X1tcXGRBLUZhLWZdKykqbj8vLnNvdXJjZSArXG5cdFx0XHRcdCd8JyArXG5cdFx0XHRcdC8vIGRlY2ltYWwgYmlnaW50XG5cdFx0XHRcdC9cXGQrKD86X1xcZCspKm4vLnNvdXJjZSArXG5cdFx0XHRcdCd8JyArXG5cdFx0XHRcdC8vIGRlY2ltYWwgbnVtYmVyIChpbnRlZ2VyIG9yIGZsb2F0KSBidXQgbm8gYmlnaW50XG5cdFx0XHRcdC8oPzpcXGQrKD86X1xcZCspKig/OlxcLig/OlxcZCsoPzpfXFxkKykqKT8pP3xcXC5cXGQrKD86X1xcZCspKikoPzpbRWVdWystXT9cXGQrKD86X1xcZCspKik/Ly5zb3VyY2Vcblx0XHRcdCkgK1xuXHRcdFx0JyknICtcblx0XHRcdC8oPyFbXFx3JF0pLy5zb3VyY2Vcblx0XHQpLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J29wZXJhdG9yJzogLy0tfFxcK1xcK3xcXCpcXCo9P3w9PnwmJj0/fFxcfFxcfD0/fFshPV09PXw8PD0/fD4+Pj89P3xbLSsqLyUmfF4hPTw+XT0/fFxcLnszfXxcXD9cXD89P3xcXD9cXC4/fFt+Ol0vXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRbJ2NsYXNzLW5hbWUnXVswXS5wYXR0ZXJuID0gLyhcXGIoPzpjbGFzc3xleHRlbmRzfGltcGxlbWVudHN8aW5zdGFuY2VvZnxpbnRlcmZhY2V8bmV3KVxccyspW1xcdy5cXFxcXSsvO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqYXZhc2NyaXB0JywgJ2tleXdvcmQnLCB7XG5cdCdyZWdleCc6IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHQvLyBsb29rYmVoaW5kXG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLWR1cGUtY2hhcmFjdGVycy1jaGFyYWN0ZXItY2xhc3Ncblx0XHRcdC8oKD86XnxbXiRcXHdcXHhBMC1cXHVGRkZGLlwiJ1xcXSlcXHNdfFxcYig/OnJldHVybnx5aWVsZCkpXFxzKikvLnNvdXJjZSArXG5cdFx0XHQvLyBSZWdleCBwYXR0ZXJuOlxuXHRcdFx0Ly8gVGhlcmUgYXJlIDIgcmVnZXggcGF0dGVybnMgaGVyZS4gVGhlIFJlZ0V4cCBzZXQgbm90YXRpb24gcHJvcG9zYWwgYWRkZWQgc3VwcG9ydCBmb3IgbmVzdGVkIGNoYXJhY3RlclxuXHRcdFx0Ly8gY2xhc3NlcyBpZiB0aGUgYHZgIGZsYWcgaXMgcHJlc2VudC4gVW5mb3J0dW5hdGVseSwgbmVzdGVkIENDcyBhcmUgYm90aCBjb250ZXh0LWZyZWUgYW5kIGluY29tcGF0aWJsZVxuXHRcdFx0Ly8gd2l0aCB0aGUgb25seSBzeW50YXgsIHNvIHdlIGhhdmUgdG8gZGVmaW5lIDIgZGlmZmVyZW50IHJlZ2V4IHBhdHRlcm5zLlxuXHRcdFx0L1xcLy8uc291cmNlICtcblx0XHRcdCcoPzonICtcblx0XHRcdC8oPzpcXFsoPzpbXlxcXVxcXFxcXHJcXG5dfFxcXFwuKSpcXF18XFxcXC58W14vXFxcXFxcW1xcclxcbl0pK1xcL1tkZ2lteXVzXXswLDd9Ly5zb3VyY2UgK1xuXHRcdFx0J3wnICtcblx0XHRcdC8vIGB2YCBmbGFnIHN5bnRheC4gVGhpcyBzdXBwb3J0cyAzIGxldmVscyBvZiBuZXN0ZWQgY2hhcmFjdGVyIGNsYXNzZXMuXG5cdFx0XHQvKD86XFxbKD86W15bXFxdXFxcXFxcclxcbl18XFxcXC58XFxbKD86W15bXFxdXFxcXFxcclxcbl18XFxcXC58XFxbKD86W15bXFxdXFxcXFxcclxcbl18XFxcXC4pKlxcXSkqXFxdKSpcXF18XFxcXC58W14vXFxcXFxcW1xcclxcbl0pK1xcL1tkZ2lteXVzXXswLDd9dltkZ2lteXVzXXswLDd9Ly5zb3VyY2UgK1xuXHRcdFx0JyknICtcblx0XHRcdC8vIGxvb2thaGVhZFxuXHRcdFx0Lyg/PSg/Olxcc3xcXC9cXCooPzpbXipdfFxcKig/IVxcLykpKlxcKlxcLykqKD86JHxbXFxyXFxuLC47On0pXFxdXXxcXC9cXC8pKS8uc291cmNlXG5cdFx0KSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdyZWdleC1zb3VyY2UnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFxcLylbXFxzXFxTXSsoPz1cXC9bYS16XSokKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtcmVnZXgnLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5yZWdleFxuXHRcdFx0fSxcblx0XHRcdCdyZWdleC1kZWxpbWl0ZXInOiAvXlxcL3xcXC8kLyxcblx0XHRcdCdyZWdleC1mbGFncyc6IC9eW2Etel0rJC8sXG5cdFx0fVxuXHR9LFxuXHQvLyBUaGlzIG11c3QgYmUgZGVjbGFyZWQgYmVmb3JlIGtleXdvcmQgYmVjYXVzZSB3ZSB1c2UgXCJmdW5jdGlvblwiIGluc2lkZSB0aGUgbG9vay1mb3J3YXJkXG5cdCdmdW5jdGlvbi12YXJpYWJsZSc6IHtcblx0XHRwYXR0ZXJuOiAvIz8oPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKD89XFxzKls9Ol1cXHMqKD86YXN5bmNcXHMqKT8oPzpcXGJmdW5jdGlvblxcYnwoPzpcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKXwoPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKVxccyo9PikpLyxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQncGFyYW1ldGVyJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oZnVuY3Rpb24oPzpcXHMrKD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKik/XFxzKlxcKFxccyopKD8hXFxzKSg/OlteKClcXHNdfFxccysoPyFbXFxzKV0pfFxcKFteKCldKlxcKSkrKD89XFxzKlxcKSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXiRcXHdcXHhBMC1cXHVGRkZGXSkoPyFcXHMpW18kYS16XFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKD89XFxzKj0+KS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXFwoXFxzKikoPyFcXHMpKD86W14oKVxcc118XFxzKyg/IVtcXHMpXSl8XFwoW14oKV0qXFwpKSsoPz1cXHMqXFwpXFxzKj0+KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLygoPzpcXGJ8XFxzfF4pKD8hKD86YXN8YXN5bmN8YXdhaXR8YnJlYWt8Y2FzZXxjYXRjaHxjbGFzc3xjb25zdHxjb250aW51ZXxkZWJ1Z2dlcnxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGVudW18ZXhwb3J0fGV4dGVuZHN8ZmluYWxseXxmb3J8ZnJvbXxmdW5jdGlvbnxnZXR8aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW58aW5zdGFuY2VvZnxpbnRlcmZhY2V8bGV0fG5ld3xudWxsfG9mfHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJldHVybnxzZXR8c3RhdGljfHN1cGVyfHN3aXRjaHx0aGlzfHRocm93fHRyeXx0eXBlb2Z8dW5kZWZpbmVkfHZhcnx2b2lkfHdoaWxlfHdpdGh8eWllbGQpKD8hWyRcXHdcXHhBMC1cXHVGRkZGXSkpKD86KD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKlxccyopXFwoXFxzKnxcXF1cXHMqXFwoXFxzKikoPyFcXHMpKD86W14oKVxcc118XFxzKyg/IVtcXHMpXSl8XFwoW14oKV0qXFwpKSsoPz1cXHMqXFwpXFxzKlxceykvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHR9XG5cdF0sXG5cdCdjb25zdGFudCc6IC9cXGJbQS1aXSg/OltBLVpfXXxcXGR4PykqXFxiL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmFzY3JpcHQnLCAnc3RyaW5nJywge1xuXHQnaGFzaGJhbmcnOiB7XG5cdFx0cGF0dGVybjogL14jIS4qLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdjb21tZW50J1xuXHR9LFxuXHQndGVtcGxhdGUtc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9gKD86XFxcXFtcXHNcXFNdfFxcJFxceyg/Oltee31dfFxceyg/Oltee31dfFxce1tefV0qXFx9KSpcXH0pK1xcfXwoPyFcXCRcXHspW15cXFxcYF0pKmAvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd0ZW1wbGF0ZS1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL15gfGAkLyxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHR9LFxuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKilcXCRcXHsoPzpbXnt9XXxcXHsoPzpbXnt9XXxcXHtbXn1dKlxcfSkqXFx9KStcXH0vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eXFwkXFx7fFxcfSQvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH0sXG5cdCdzdHJpbmctcHJvcGVydHknOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFsse10pWyBcXHRdKikoW1wiJ10pKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwyKVteXFxcXFxcclxcbl0pKlxcMig/PVxccyo6KS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqYXZhc2NyaXB0JywgJ29wZXJhdG9yJywge1xuXHQnbGl0ZXJhbC1wcm9wZXJ0eSc6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58Wyx7XSlbIFxcdF0qKSg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSooPz1cXHMqOikvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG59KTtcblxuaWYgKFByaXNtLmxhbmd1YWdlcy5tYXJrdXApIHtcblx0UHJpc20ubGFuZ3VhZ2VzLm1hcmt1cC50YWcuYWRkSW5saW5lZCgnc2NyaXB0JywgJ2phdmFzY3JpcHQnKTtcblxuXHQvLyBhZGQgYXR0cmlidXRlIHN1cHBvcnQgZm9yIGFsbCBET00gZXZlbnRzLlxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMjU3RhbmRhcmRfZXZlbnRzXG5cdFByaXNtLmxhbmd1YWdlcy5tYXJrdXAudGFnLmFkZEF0dHJpYnV0ZShcblx0XHQvb24oPzphYm9ydHxibHVyfGNoYW5nZXxjbGlja3xjb21wb3NpdGlvbig/OmVuZHxzdGFydHx1cGRhdGUpfGRibGNsaWNrfGVycm9yfGZvY3VzKD86aW58b3V0KT98a2V5KD86ZG93bnx1cCl8bG9hZHxtb3VzZSg/OmRvd258ZW50ZXJ8bGVhdmV8bW92ZXxvdXR8b3Zlcnx1cCl8cmVzZXR8cmVzaXplfHNjcm9sbHxzZWxlY3R8c2xvdGNoYW5nZXxzdWJtaXR8dW5sb2FkfHdoZWVsKS8uc291cmNlLFxuXHRcdCdqYXZhc2NyaXB0J1xuXHQpO1xufVxuXG5QcmlzbS5sYW5ndWFnZXMuanMgPSBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdDtcblxuUHJpc20ubGFuZ3VhZ2VzLmFiYXAgPSB7XG5cdCdjb21tZW50JzogL15cXCouKi9tLFxuXHQnc3RyaW5nJzogLyhgfCcpKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdCdzdHJpbmctdGVtcGxhdGUnOiB7XG5cdFx0cGF0dGVybjogLyhbfH1dKSg/OlxcXFwufFteXFxcXHx7XFxyXFxuXSkqKD89W3x7XSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnXG5cdH0sXG5cdC8qIEVuZCBPZiBMaW5lIGNvbW1lbnRzIHNob3VsZCBub3QgaW50ZXJmZXJlIHdpdGggc3RyaW5ncyB3aGVuIHRoZVxuXHRxdW90ZSBjaGFyYWN0ZXIgb2NjdXJzIHdpdGhpbiB0aGVtLiBXZSBhc3N1bWUgYSBzdHJpbmcgYmVpbmcgaGlnaGxpZ2h0ZWRcblx0aW5zaWRlIGFuIEVPTCBjb21tZW50IGlzIG1vcmUgYWNjZXB0YWJsZSB0aGFuIHRoZSBvcHBvc2l0ZS5cblx0Ki9cblx0J2VvbC1jb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxcXHMpXCIuKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdjb21tZW50J1xuXHR9LFxuXHQna2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcc3xcXC58XikoPzpcXCotSU5QVVR8XFw/VE98QUJBUC1TT1VSQ0V8QUJCUkVWSUFURUR8QUJTfEFCU1RSQUNUfEFDQ0VQVHxBQ0NFUFRJTkd8QUNDRVNTUE9MSUNZfEFDQ09SRElOR3xBQ09TfEFDVElWQVRJT058QUNUVUFMfEFERHxBREQtQ09SUkVTUE9ORElOR3xBREpBQ0VOVHxBRlRFUnxBTElBU3xBTElBU0VTfEFMSUdOfEFMTHxBTExPQ0FURXxBTFBIQXxBTkFMWVNJU3xBTkFMWVpFUnxBTkR8QU5ZfEFQUEVORHxBUFBFTkRBR0V8QVBQRU5ESU5HfEFQUExJQ0FUSU9OfEFSQ0hJVkV8QVJFQXxBUklUSE1FVElDfEFTfEFTQ0VORElOR3xBU0lOfEFTUEVDVHxBU1NFUlR8QVNTSUdOfEFTU0lHTkVEfEFTU0lHTklOR3xBU1NPQ0lBVElPTnxBU1lOQ0hST05PVVN8QVR8QVRBTnxBVFRSSUJVVEVTfEFVVEhPUklUWXxBVVRIT1JJVFktQ0hFQ0t8QVZHfEJBQ0t8QkFDS0dST1VORHxCQUNLVVB8QkFDS1dBUkR8QkFESXxCQVNFfEJFRk9SRXxCRUdJTnxCRVRXRUVOfEJJR3xCSU5BUll8QklORElOR3xCSVR8QklULUFORHxCSVQtTk9UfEJJVC1PUnxCSVQtWE9SfEJMQUNLfEJMQU5LfEJMQU5LU3xCTE9CfEJMT0NLfEJMT0NLU3xCTFVFfEJPVU5EfEJPVU5EQVJJRVN8Qk9VTkRTfEJPWEVEfEJSRUFLLVBPSU5UfEJUfEJVRkZFUnxCWXxCWVBBU1NJTkd8QllURXxCWVRFLUNBfEJZVEUtQ058QllURS1DT3xCWVRFLUNTfEJZVEUtTkF8QllURS1OU3xCWVRFLU9SREVSfEN8Q0F8Q0FMTHxDQUxMSU5HfENBU0V8Q0FTVHxDQVNUSU5HfENBVENIfENFSUx8Q0VOVEVSfENFTlRFUkVEfENIQUlOfENIQUlOLUlOUFVUfENIQUlOLVJFUVVFU1R8Q0hBTkdFfENIQU5HSU5HfENIQU5ORUxTfENIQVItVE8tSEVYfENIQVJBQ1RFUnxDSEFSTEVOfENIRUNLfENIRUNLQk9YfENJUkNVTEFSfENJX3xDTEFTU3xDTEFTUy1DT0RJTkd8Q0xBU1MtREFUQXxDTEFTUy1FVkVOVFN8Q0xBU1MtTUVUSE9EU3xDTEFTUy1QT09MfENMRUFOVVB8Q0xFQVJ8Q0xJRU5UfENMT0J8Q0xPQ0t8Q0xPU0V8Q058Q05UfENPfENPQUxFU0NFfENPREV8Q09ESU5HfENPTExFQ1R8Q09MT1J8Q09MVU1OfENPTFVNTlN8Q09MX0JBQ0tHUk9VTkR8Q09MX0dST1VQfENPTF9IRUFESU5HfENPTF9LRVl8Q09MX05FR0FUSVZFfENPTF9OT1JNQUx8Q09MX1BPU0lUSVZFfENPTF9UT1RBTHxDT01NRU5UfENPTU1FTlRTfENPTU1JVHxDT01NT058Q09NTVVOSUNBVElPTnxDT01QQVJJTkd8Q09NUE9ORU5UfENPTVBPTkVOVFN8Q09NUFJFU1NJT058Q09NUFVURXxDT05DQVR8Q09OQ0FURU5BVEV8Q09ORHxDT05ERU5TRXxDT05ESVRJT058Q09OTkVDVHxDT05ORUNUSU9OfENPTlNUQU5UU3xDT05URVhUfENPTlRFWFRTfENPTlRJTlVFfENPTlRST0x8Q09OVFJPTFN8Q09OVnxDT05WRVJTSU9OfENPTlZFUlR8Q09QSUVTfENPUFl8Q09SUkVTUE9ORElOR3xDT1N8Q09TSHxDT1VOVHxDT1VOVFJZfENPVkVSfENQfENQSXxDUkVBVEV8Q1JFQVRJTkd8Q1JJVElDQUx8Q1N8Q1VSUkVOQ1l8Q1VSUkVOQ1lfQ09OVkVSU0lPTnxDVVJSRU5UfENVUlNPUnxDVVJTT1ItU0VMRUNUSU9OfENVU1RPTUVSfENVU1RPTUVSLUZVTkNUSU9OfERBTkdFUk9VU3xEQVRBfERBVEFCQVNFfERBVEFJTkZPfERBVEFTRVR8REFURXxEQVlMSUdIVHxEQk1BWExFTnxERFxcL01NXFwvWVl8RERcXC9NTVxcL1lZWVl8RERNTVlZfERFQUxMT0NBVEV8REVDSU1BTFN8REVDSU1BTF9TSElGVHxERUNMQVJBVElPTlN8REVFUHxERUZBVUxUfERFRkVSUkVEfERFRklORXxERUZJTklOR3xERUZJTklUSU9OfERFTEVURXxERUxFVElOR3xERU1BTkR8REVQQVJUTUVOVHxERVNDRU5ESU5HfERFU0NSSUJFfERFU1RJTkFUSU9OfERFVEFJTHxESUFMT0d8RElSRUNUT1JZfERJU0NPTk5FQ1R8RElTUExBWXxESVNQTEFZLU1PREV8RElTVEFOQ0V8RElTVElOQ1R8RElWfERJVklERXxESVZJREUtQ09SUkVTUE9ORElOR3xESVZJU0lPTnxET3xEVU1NWXxEVVBMSUNBVEV8RFVQTElDQVRFU3xEVVJBVElPTnxEVVJJTkd8RFlOQU1JQ3xEWU5QUk98RXxFQUNIfEVESVR8RURJVE9SLUNBTEx8RUxTRXxFTFNFSUZ8RU1QVFl8RU5BQkxFRHxFTkFCTElOR3xFTkNPRElOR3xFTkR8RU5ELUVOSEFOQ0VNRU5ULVNFQ1RJT058RU5ELUxJTkVTfEVORC1PRi1ERUZJTklUSU9OfEVORC1PRi1GSUxFfEVORC1PRi1QQUdFfEVORC1PRi1TRUxFQ1RJT058RU5EQVR8RU5EQ0FTRXxFTkRDQVRDSHxFTkRDSEFJTnxFTkRDTEFTU3xFTkRET3xFTkRFTkhBTkNFTUVOVHxFTkRFWEVDfEVOREZPUnxFTkRGT1JNfEVOREZVTkNUSU9OfEVORElBTnxFTkRJRnxFTkRJTkd8RU5ESU5URVJGQUNFfEVORExPT1B8RU5ETUVUSE9EfEVORE1PRFVMRXxFTkRPTnxFTkRQUk9WSURFfEVORFNFTEVDVHxFTkRUUll8RU5EV0hJTEV8RU5HSU5FRVJJTkd8RU5IQU5DRU1FTlR8RU5IQU5DRU1FTlQtUE9JTlR8RU5IQU5DRU1FTlQtU0VDVElPTnxFTkhBTkNFTUVOVFN8RU5UUklFU3xFTlRSWXxFTlZJUk9OTUVOVHxFUXxFUVVBTHxFUVVJVnxFUlJPUk1FU1NBR0V8RVJST1JTfEVTQ0FQRXxFU0NBUElOR3xFVkVOVHxFVkVOVFN8RVhBQ1R8RVhDRVBUfEVYQ0VQVElPTnxFWENFUFRJT04tVEFCTEV8RVhDRVBUSU9OU3xFWENMVURFfEVYQ0xVRElOR3xFWEVDfEVYRUNVVEV8RVhJU1RTfEVYSVR8RVhJVC1DT01NQU5EfEVYUHxFWFBBTkR8RVhQQU5ESU5HfEVYUElSQVRJT058RVhQTElDSVR8RVhQT05FTlR8RVhQT1JUfEVYUE9SVElOR3xFWFRFTkR8RVhURU5ERUR8RVhURU5TSU9OfEVYVFJBQ1R8RkFJTHxGRVRDSHxGSUVMRHxGSUVMRC1HUk9VUFN8RklFTEQtU1lNQk9MfEZJRUxELVNZTUJPTFN8RklFTERTfEZJTEV8RklMVEVSfEZJTFRFUi1UQUJMRXxGSUxURVJTfEZJTkFMfEZJTkR8RklSU1R8RklSU1QtTElORXxGSVhFRC1QT0lOVHxGS0VRfEZLR0V8RkxPT1J8RkxVU0h8Rk9OVHxGT1J8Rk9STXxGT1JNQVR8Rk9SV0FSRHxGT1VORHxGUkFDfEZSQU1FfEZSQU1FU3xGUkVFfEZSSUVORFN8RlJPTXxGVU5DVElPTnxGVU5DVElPTi1QT09MfEZVTkNUSU9OQUxJVFl8RlVSVEhFUnxHQVBTfEdFfEdFTkVSQVRFfEdFVHxHSVZJTkd8R0tFUXxHS0dFfEdMT0JBTHxHUkFOVHxHUkVBVEVSfEdSRUVOfEdST1VQfEdST1VQU3xHVHxIQU5ETEV8SEFORExFUnxIQVJNTEVTU3xIQVNIRUR8SEFWSU5HfEhEQnxIRUFELUxJTkVTfEhFQURFUnxIRUFERVJTfEhFQURJTkd8SEVMUC1JRHxIRUxQLVJFUVVFU1R8SElERXxISUdIfEhJTlR8SE9MRHxIT1RTUE9UfEl8SUNPTnxJRHxJREVOVElGSUNBVElPTnxJREVOVElGSUVSfElEU3xJRnxJR05PUkV8SUdOT1JJTkd8SU1NRURJQVRFTFl8SU1QTEVNRU5UQVRJT058SU1QTEVNRU5UQVRJT05TfElNUExFTUVOVEVEfElNUExJQ0lUfElNUE9SVHxJTVBPUlRJTkd8SU58SU5BQ1RJVkV8SU5DTHxJTkNMVURFfElOQ0xVREVTfElOQ0xVRElOR3xJTkNSRU1FTlR8SU5ERVh8SU5ERVgtTElORXxJTkZPVFlQRVN8SU5IRVJJVElOR3xJTklUfElOSVRJQUx8SU5JVElBTElaQVRJT058SU5ORVJ8SU5PVVR8SU5QVVR8SU5TRVJUfElOU1RBTkNFU3xJTlRFTlNJRklFRHxJTlRFUkZBQ0V8SU5URVJGQUNFLVBPT0x8SU5URVJGQUNFU3xJTlRFUk5BTHxJTlRFUlZBTFN8SU5UT3xJTlZFUlNFfElOVkVSVEVELURBVEV8SVN8SVNPfElURVJBVE9SfElUTk98Sk9CfEpPSU58S0VFUHxLRUVQSU5HfEtFUk5FTHxLRVl8S0VZU3xLRVlXT1JEU3xLSU5EfExBTkdVQUdFfExBU1R8TEFURXxMQVlPVVR8TEV8TEVBRElOR3xMRUFWRXxMRUZUfExFRlQtSlVTVElGSUVEfExFRlRQTFVTfExFRlRTUEFDRXxMRUdBQ1l8TEVOR1RIfExFU1N8TEVUfExFVkVMfExFVkVMU3xMSUtFfExJTkV8TElORS1DT1VOVHxMSU5FLVNFTEVDVElPTnxMSU5FLVNJWkV8TElORUZFRUR8TElORVN8TElTVHxMSVNULVBST0NFU1NJTkd8TElTVEJPWHxMSVRUTEV8TExBTkd8TE9BRHxMT0FELU9GLVBST0dSQU18TE9CfExPQ0FMfExPQ0FMRXxMT0NBVE9SfExPR3xMT0ctUE9JTlR8TE9HMTB8TE9HRklMRXxMT0dJQ0FMfExPTkd8TE9PUHxMT1d8TE9XRVJ8TFBBRHxMUEl8TFR8TXxNQUlMfE1BSU58TUFKT1ItSUR8TUFQUElOR3xNQVJHSU58TUFSS3xNQVNLfE1BVENIfE1BVENIQ09ERXxNQVh8TUFYSU1VTXxNRURJVU18TUVNQkVSU3xNRU1PUll8TUVTSHxNRVNTQUdFfE1FU1NBR0UtSUR8TUVTU0FHRVN8TUVTU0FHSU5HfE1FVEhPRHxNRVRIT0RTfE1JTnxNSU5JTVVNfE1JTk9SLUlEfE1NXFwvRERcXC9ZWXxNTVxcL0REXFwvWVlZWXxNTUREWVl8TU9EfE1PREV8TU9ESUZ8TU9ESUZJRVJ8TU9ESUZZfE1PRFVMRXxNT1ZFfE1PVkUtQ09SUkVTUE9ORElOR3xNVUxUSVBMWXxNVUxUSVBMWS1DT1JSRVNQT05ESU5HfE5BfE5BTUV8TkFNRVRBQnxOQVRJVkV8TkJ8TkV8TkVTVEVEfE5FU1RJTkd8TkVXfE5FVy1MSU5FfE5FVy1QQUdFfE5FVy1TRUNUSU9OfE5FWFR8Tk98Tk8tRElTUExBWXxOTy1FWFRFTlNJT058Tk8tR0FQfE5PLUdBUFN8Tk8tR1JPVVBJTkd8Tk8tSEVBRElOR3xOTy1TQ1JPTExJTkd8Tk8tU0lHTnxOTy1USVRMRXxOTy1UT1BPRlBBR0V8Tk8tWkVST3xOT0RFfE5PREVTfE5PTi1VTklDT0RFfE5PTi1VTklRVUV8Tk9UfE5QfE5TfE5VTEx8TlVNQkVSfE5VTU9GQ0hBUnxPfE9CSkVDVHxPQkpFQ1RTfE9CTElHQVRPUll8T0NDVVJSRU5DRXxPQ0NVUlJFTkNFU3xPQ0NVUlN8T0Z8T0ZGfE9GRlNFVHxPTEV8T058T05MWXxPUEVOfE9QVElPTnxPUFRJT05BTHxPUFRJT05TfE9SfE9SREVSfE9USEVSfE9USEVSU3xPVVR8T1VURVJ8T1VUUFVUfE9VVFBVVC1MRU5HVEh8T1ZFUkZMT1d8T1ZFUkxBWXxQQUNLfFBBQ0tBR0V8UEFEfFBBRERJTkd8UEFHRXxQQUdFU3xQQVJBTUVURVJ8UEFSQU1FVEVSLVRBQkxFfFBBUkFNRVRFUlN8UEFSVHxQQVJUSUFMTFl8UEFUVEVSTnxQRVJDRU5UQUdFfFBFUkZPUk18UEVSRk9STUlOR3xQRVJTT058UEZ8UEYtU1RBVFVTfFBJTkt8UExBQ0VTfFBPT0x8UE9TSVRJT058UE9TX0hJR0h8UE9TX0xPV3xQUkFHTUFTfFBSRUNPTVBJTEVEfFBSRUZFUlJFRHxQUkVTRVJWSU5HfFBSSU1BUll8UFJJTlR8UFJJTlQtQ09OVFJPTHxQUklPUklUWXxQUklWQVRFfFBST0NFRFVSRXxQUk9DRVNTfFBST0dSQU18UFJPUEVSVFl8UFJPVEVDVEVEfFBST1ZJREV8UFVCTElDfFBVU0hCVVRUT058UFVUfFFVRVVFLU9OTFl8UVVJQ0tJTkZPfFJBRElPQlVUVE9OfFJBSVNFfFJBSVNJTkd8UkFOR0V8UkFOR0VTfFJBV3xSRUFEfFJFQUQtT05MWXxSRUFERVJ8UkVDRUlWRXxSRUNFSVZFRHxSRUNFSVZFUnxSRUNFSVZJTkd8UkVEfFJFREVGSU5JVElPTnxSRURVQ0V8UkVEVUNFRHxSRUZ8UkVGRVJFTkNFfFJFRlJFU0h8UkVHRVh8UkVKRUNUfFJFTU9URXxSRU5BTUlOR3xSRVBMQUNFfFJFUExBQ0VNRU5UfFJFUExBQ0lOR3xSRVBPUlR8UkVRVUVTVHxSRVFVRVNURUR8UkVTRVJWRXxSRVNFVHxSRVNPTFVUSU9OfFJFU1BFQ1RJTkd8UkVTUE9OU0lCTEV8UkVTVUxUfFJFU1VMVFN8UkVTVU1BQkxFfFJFU1VNRXxSRVRSWXxSRVRVUk58UkVUVVJOQ09ERXxSRVRVUk5JTkd8UklHSFR8UklHSFQtSlVTVElGSUVEfFJJR0hUUExVU3xSSUdIVFNQQUNFfFJJU0t8Uk1DX0NPTU1VTklDQVRJT05fRkFJTFVSRXxSTUNfSU5WQUxJRF9TVEFUVVN8Uk1DX1NZU1RFTV9GQUlMVVJFfFJPTEV8Uk9MTEJBQ0t8Uk9VTkR8Uk9XU3xSVFRJfFJVTnxTQVB8U0FQLVNQT09MfFNBVklOR3xTQ0FMRV9QUkVTRVJWSU5HfFNDQUxFX1BSRVNFUlZJTkdfU0NJRU5USUZJQ3xTQ0FOfFNDSUVOVElGSUN8U0NJRU5USUZJQ19XSVRIX0xFQURJTkdfWkVST3xTQ1JFRU58U0NST0xMfFNDUk9MTC1CT1VOREFSWXxTQ1JPTExJTkd8U0VBUkNIfFNFQ09OREFSWXxTRUNPTkRTfFNFQ1RJT058U0VMRUNUfFNFTEVDVC1PUFRJT05TfFNFTEVDVElPTnxTRUxFQ1RJT04tU0NSRUVOfFNFTEVDVElPTi1TRVR8U0VMRUNUSU9OLVNFVFN8U0VMRUNUSU9OLVRBQkxFfFNFTEVDVElPTlN8U0VMRUNUT1J8U0VORHxTRVBBUkFURXxTRVBBUkFURUR8U0VUfFNIQVJFRHxTSElGVHxTSE9SVHxTSE9SVERVTVAtSUR8U0lHTnxTSUdOX0FTX1BPU1RGSVh8U0lNUExFfFNJTnxTSU5HTEV8U0lOSHxTSVpFfFNLSVB8U0tJUFBJTkd8U01BUlR8U09NRXxTT1JUfFNPUlRBQkxFfFNPUlRFRHxTT1VSQ0V8U1BBQ0V8U1BFQ0lGSUVEfFNQTElUfFNQT09MfFNQT1RTfFNRTHxTUUxTQ1JJUFR8U1FSVHxTVEFCTEV8U1RBTVB8U1RBTkRBUkR8U1RBUlQtT0YtU0VMRUNUSU9OfFNUQVJUSU5HfFNUQVRFfFNUQVRFTUVOVHxTVEFURU1FTlRTfFNUQVRJQ3xTVEFUSUNTfFNUQVRVU0lORk98U1RFUC1MT09QfFNUT1B8U1RSTEVOfFNUUlVDVFVSRXxTVFJVQ1RVUkVTfFNUWUxFfFNVQktFWXxTVUJNQVRDSEVTfFNVQk1JVHxTVUJST1VUSU5FfFNVQlNDUkVFTnxTVUJTVFJJTkd8U1VCVFJBQ1R8U1VCVFJBQ1QtQ09SUkVTUE9ORElOR3xTVUZGSVh8U1VNfFNVTU1BUll8U1VNTUlOR3xTVVBQTElFRHxTVVBQTFl8U1VQUFJFU1N8U1dJVENIfFNXSVRDSFNUQVRFU3xTWU1CT0x8U1lOQ1BPSU5UU3xTWU5UQVh8U1lOVEFYLUNIRUNLfFNZTlRBWC1UUkFDRXxTWVNURU0tQ0FMTHxTWVNURU0tRVhDRVBUSU9OU3xTWVNURU0tRVhJVHxUQUJ8VEFCQkVEfFRBQkxFfFRBQkxFU3xUQUJMRVZJRVd8VEFCU1RSSVB8VEFOfFRBTkh8VEFSR0VUfFRBU0t8VEFTS1N8VEVTVHxURVNUSU5HfFRFWFR8VEVYVFBPT0x8VEhFTnxUSFJPV3xUSU1FfFRJTUVTfFRJTUVTVEFNUHxUSU1FWk9ORXxUSVRMRXxUSVRMRS1MSU5FU3xUSVRMRUJBUnxUT3xUT0tFTklaQVRJT058VE9LRU5TfFRPUC1MSU5FU3xUT1AtT0YtUEFHRXxUUkFDRS1GSUxFfFRSQUNFLVRBQkxFfFRSQUlMSU5HfFRSQU5TQUNUSU9OfFRSQU5TRkVSfFRSQU5TRk9STUFUSU9OfFRSQU5TTEFURXxUUkFOU1BPUlRJTkd8VFJNQUN8VFJVTkN8VFJVTkNBVEV8VFJVTkNBVElPTnxUUll8VFlQRXxUWVBFLVBPT0x8VFlQRS1QT09MU3xUWVBFU3xVTElORXxVTkFTU0lHTnxVTkRFUnxVTklDT0RFfFVOSU9OfFVOSVFVRXxVTklUfFVOSVRfQ09OVkVSU0lPTnxVTklYfFVOUEFDS3xVTlRJTHxVTldJTkR8VVB8VVBEQVRFfFVQUEVSfFVTRVJ8VVNFUi1DT01NQU5EfFVTSU5HfFVURi04fFZBTElEfFZBTFVFfFZBTFVFLVJFUVVFU1R8VkFMVUVTfFZBUll8VkFSWUlOR3xWRVJJRklDQVRJT04tTUVTU0FHRXxWRVJTSU9OfFZJQXxWSUVXfFZJU0lCTEV8V0FJVHxXQVJOSU5HfFdIRU58V0hFTkVWRVJ8V0hFUkV8V0hJTEV8V0lEVEh8V0lORE9XfFdJTkRPV1N8V0lUSHxXSVRILUhFQURJTkd8V0lUSC1USVRMRXxXSVRIT1VUfFdPUkR8V09SS3xXUklURXxXUklURVJ8WHxYTUx8WE9SfFhTRHxYU1RSTEVOfFlFTExPV3xZRVN8WVlNTUREfFp8WkVST3xaT05FKSg/IVtcXHctXSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdC8qIE51bWJlcnMgY2FuIGJlIG9ubHkgaW50ZWdlcnMuIERlY2ltYWwgb3IgSGV4IGFwcGVhciBvbmx5IGFzIHN0cmluZ3MgKi9cblx0J251bWJlcic6IC9cXGJcXGQrXFxiLyxcblx0LyogT3BlcmF0b3JzIG11c3QgYWx3YXlzIGJlIHN1cnJvdW5kZWQgYnkgd2hpdGVzcGFjZSwgdGhleSBjYW5ub3QgYmUgcHV0XG5cdGFkamFjZW50IHRvIG9wZXJhbmRzLlxuXHQqL1xuXHQnb3BlcmF0b3InOiB7XG5cdFx0cGF0dGVybjogLyhcXHMpKD86XFwqXFwqP3w8Wz0+XT98Pj0/fFxcPz18Wy0rXFwvPV0pKD89XFxzKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nLW9wZXJhdG9yJzoge1xuXHRcdHBhdHRlcm46IC8oXFxzKSYmPyg/PVxccykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0LyogVGhlIG9mZmljaWFsIGVkaXRvciBoaWdobGlnaHRzICovXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQndG9rZW4tb3BlcmF0b3InOiBbe1xuXHRcdC8qIFNwZWNpYWwgb3BlcmF0b3JzIHVzZWQgdG8gYWNjZXNzIHN0cnVjdHVyZSBjb21wb25lbnRzLCBjbGFzcyBtZXRob2RzL2F0dHJpYnV0ZXMsIGV0Yy4gKi9cblx0XHRwYXR0ZXJuOiAvKFxcdykoPzotPj98PT58W358e31dKSg/PVxcdykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0fSwge1xuXHRcdC8qIFNwZWNpYWwgdG9rZW5zIHVzZWQgZG8gZGVsaW1pdCBzdHJpbmcgdGVtcGxhdGVzICovXG5cdFx0cGF0dGVybjogL1t8e31dLyxcblx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHR9XSxcblx0J3B1bmN0dWF0aW9uJzogL1ssLjooKV0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGNvcmVSdWxlcyA9ICcoPzpBTFBIQXxCSVR8Q0hBUnxDUnxDUkxGfENUTHxESUdJVHxEUVVPVEV8SEVYRElHfEhUQUJ8TEZ8TFdTUHxPQ1RFVHxTUHxWQ0hBUnxXU1ApJztcblxuXHRQcmlzbS5sYW5ndWFnZXMuYWJuZiA9IHtcblx0XHQnY29tbWVudCc6IC87LiovLFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKD86JVtpc10pP1wiW15cIlxcblxccl0qXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eJVtpc10vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncmFuZ2UnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJSg/OmJbMDFdKy1bMDFdK3xkXFxkKy1cXGQrfHhbQS1GXFxkXSstW0EtRlxcZF0rKS9pLFxuXHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0fSxcblx0XHQndGVybWluYWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJSg/OmJbMDFdKyg/OlxcLlswMV0rKSp8ZFxcZCsoPzpcXC5cXGQrKSp8eFtBLUZcXGRdKyg/OlxcLltBLUZcXGRdKykqKS9pLFxuXHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0fSxcblx0XHQncmVwZXRpdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy1dKSg/OlxcZCpcXCpcXGQqfFxcZCspLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH0sXG5cdFx0J2RlZmluaXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSg/OlthLXpdW1xcdy1dKnw8W148Plxcclxcbl0qPikoPz1cXHMqPSkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC88fD4vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY29yZS1ydWxlJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCcoPzooXnxbXjxcXFxcdy1dKScgKyBjb3JlUnVsZXMgKyAnfDwnICsgY29yZVJ1bGVzICsgJz4pKD8hW1xcXFx3LV0pJywgJ2knKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogWydydWxlJywgJ2NvbnN0YW50J10sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzx8Pi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdydWxlJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFtePFxcdy1dKVthLXpdW1xcdy1dKnw8W148Plxcclxcbl0qPi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvPHw+L1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J29wZXJhdG9yJzogLz1cXC8/fFxcLy8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKVxcW1xcXV0vXG5cdH07XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmFjdGlvbnNjcmlwdCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2phdmFzY3JpcHQnLCB7XG5cdCdrZXl3b3JkJzogL1xcYig/OmFzfGJyZWFrfGNhc2V8Y2F0Y2h8Y2xhc3N8Y29uc3R8ZGVmYXVsdHxkZWxldGV8ZG98ZHluYW1pY3xlYWNofGVsc2V8ZXh0ZW5kc3xmaW5hbHxmaW5hbGx5fGZvcnxmdW5jdGlvbnxnZXR8aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW58aW5jbHVkZXxpbnN0YW5jZW9mfGludGVyZmFjZXxpbnRlcm5hbHxpc3xuYW1lc3BhY2V8bmF0aXZlfG5ld3xudWxsfG92ZXJyaWRlfHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJldHVybnxzZXR8c3RhdGljfHN1cGVyfHN3aXRjaHx0aGlzfHRocm93fHRyeXx0eXBlb2Z8dXNlfHZhcnx2b2lkfHdoaWxlfHdpdGgpXFxiLyxcblx0J29wZXJhdG9yJzogL1xcK1xcK3wtLXwoPzpbK1xcLSpcXC8lXl18JiY/fFxcfFxcfD98PDw/fD4+Pz4/fFshPV09Pyk9P3xbfj9AXS9cbn0pO1xuUHJpc20ubGFuZ3VhZ2VzLmFjdGlvbnNjcmlwdFsnY2xhc3MtbmFtZSddLmFsaWFzID0gJ2Z1bmN0aW9uJztcblxuLy8gZG9lc24ndCB3b3JrIHdpdGggQVMgYmVjYXVzZSBBUyBpcyB0b28gY29tcGxleFxuZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5hY3Rpb25zY3JpcHRbJ3BhcmFtZXRlciddO1xuZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5hY3Rpb25zY3JpcHRbJ2xpdGVyYWwtcHJvcGVydHknXTtcblxuaWYgKFByaXNtLmxhbmd1YWdlcy5tYXJrdXApIHtcblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnYWN0aW9uc2NyaXB0JywgJ3N0cmluZycsIHtcblx0XHQneG1sJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteLl0pPFxcLz9cXHcrKD86XFxzK1teXFxzPlxcLz1dKz0oXCJ8JykoPzpcXFxcW1xcc1xcU118KD8hXFwyKVteXFxcXF0pKlxcMikqXFxzKlxcLz8+Lyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5tYXJrdXBcblx0XHR9XG5cdH0pO1xufVxuO1xuUHJpc20ubGFuZ3VhZ2VzLmFkYSA9IHtcblx0J2NvbW1lbnQnOiAvLS0uKi8sXG5cdCdzdHJpbmcnOiAvXCIoPzpcIlwifFteXCJcXHJcXGZcXG5dKSpcIi8sXG5cdCdudW1iZXInOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYlxcZCg/Ol8/XFxkKSojW1xcZEEtRl0oPzpfP1tcXGRBLUZdKSooPzpcXC5bXFxkQS1GXSg/Ol8/W1xcZEEtRl0pKik/Iyg/OkVbKy1dP1xcZCg/Ol8/XFxkKSopPy9pXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiXFxkKD86Xz9cXGQpKig/OlxcLlxcZCg/Ol8/XFxkKSopPyg/OkVbKy1dP1xcZCg/Ol8/XFxkKSopP1xcYi9pXG5cdFx0fVxuXHRdLFxuXHQnYXR0cmlidXRlJzoge1xuXHRcdHBhdHRlcm46IC9cXGInXFx3Ky8sXG5cdFx0YWxpYXM6ICdhdHRyLW5hbWUnXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFib3J0fGFic3xhYnN0cmFjdHxhY2NlcHR8YWNjZXNzfGFsaWFzZWR8YWxsfGFuZHxhcnJheXxhdHxiZWdpbnxib2R5fGNhc2V8Y29uc3RhbnR8ZGVjbGFyZXxkZWxheXxkZWx0YXxkaWdpdHN8ZG98ZWxzZXxlbHNpZnxlbmR8ZW50cnl8ZXhjZXB0aW9ufGV4aXR8Zm9yfGZ1bmN0aW9ufGdlbmVyaWN8Z290b3xpZnxpbnxpbnRlcmZhY2V8aXN8bGltaXRlZHxsb29wfG1vZHxuZXd8bm90fG51bGx8b2Z8b3J8b3RoZXJzfG91dHxvdmVycmlkaW5nfHBhY2thZ2V8cHJhZ21hfHByaXZhdGV8cHJvY2VkdXJlfHByb3RlY3RlZHxyYWlzZXxyYW5nZXxyZWNvcmR8cmVtfHJlbmFtZXN8cmVxdWV1ZXxyZXR1cm58cmV2ZXJzZXxzZWxlY3R8c2VwYXJhdGV8c29tZXxzdWJ0eXBlfHN5bmNocm9uaXplZHx0YWdnZWR8dGFza3x0ZXJtaW5hdGV8dGhlbnx0eXBlfHVudGlsfHVzZXx3aGVufHdoaWxlfHdpdGh8eG9yKVxcYi9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXHQnb3BlcmF0b3InOiAvPFs9Pl0/fD49P3w9Pj98Oj18XFwvPT98XFwqXFwqP3xbJistXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9cXC5cXC4/fFssOygpOl0vLFxuXHQnY2hhcic6IC8nLicvLFxuXHQndmFyaWFibGUnOiAvXFxiW2Etel0oPzpcXHcpKlxcYi9pXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmFnZGEgPSB7XG5cdFx0J2NvbW1lbnQnOiAvXFx7LVtcXHNcXFNdKj8oPzotXFx9fCQpfC0tLiovLFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlxcXFxcXHJcXG5cIl0pKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKCl7fVx1Mjk4M1x1Mjk4NC47QF0vLFxuXHRcdCdjbGFzcy1uYW1lJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpkYXRhfHJlY29yZCkgKylcXFMrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSg/IVxccylbXjpcXHJcXG5dKyg/PTopL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdH0sXG5cdFx0J29wZXJhdG9yJzoge1xuXHRcdFx0cGF0dGVybjogLyheXFxzKnxcXHMpKD86Wz18Olx1MjIwMFx1MjE5Mlx1MDNCQlxcXFw/X118LT4pKD89XFxzKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86U2V0fGFic3RyYWN0fGNvbnN0cnVjdG9yfGRhdGF8ZXRhLWVxdWFsaXR5fGZpZWxkfGZvcmFsbHxoaWRpbmd8aW1wb3J0fGlufGluZHVjdGl2ZXxpbmZpeHxpbmZpeGx8aW5maXhyfGluc3RhbmNlfGxldHxtYWNyb3xtb2R1bGV8bXV0dWFsfG5vLWV0YS1lcXVhbGl0eXxvcGVufG92ZXJsYXB8cGF0dGVybnxwb3N0dWxhdGV8cHJpbWl0aXZlfHByaXZhdGV8cHVibGljfHF1b3RlfHF1b3RlQ29udGV4dHxxdW90ZUdvYWx8cXVvdGVUZXJtfHJlY29yZHxyZW5hbWluZ3xyZXdyaXRlfHN5bnRheHx0YWN0aWN8dW5xdW90ZXx1bnF1b3RlRGVjbHx1bnF1b3RlRGVmfHVzaW5nfHZhcmlhYmxlfHdoZXJlfHdpdGgpXFxiLyxcblx0fTtcbn0oUHJpc20pKTtcblxuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9BTC9ibG9iL21hc3Rlci9ncmFtbWFyL2Fsc3ludGF4LnRtbGFuZ3VhZ2VcblxuUHJpc20ubGFuZ3VhZ2VzLmFsID0ge1xuXHQnY29tbWVudCc6IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OicnfFteJ1xcclxcbl0pKicoPyEnKXxcIig/OlwiXCJ8W15cIlxcclxcbl0pKlwiKD8hXCIpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiKD86ZXZlbnR8cHJvY2VkdXJlfHRyaWdnZXIpXFxzK3woPzpefFteLl0pXFwuXFxzKilbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogW1xuXHRcdC8vIGtleXdvcmRzXG5cdFx0L1xcYig/OmFycmF5fGFzc2VydGVycm9yfGJlZ2lufGJyZWFrfGNhc2V8ZG98ZG93bnRvfGVsc2V8ZW5kfGV2ZW50fGV4aXR8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258aWZ8aW1wbGVtZW50c3xpbnxpbmRhdGFzZXR8aW50ZXJmYWNlfGludGVybmFsfGxvY2FsfG9mfHByb2NlZHVyZXxwcm9ncmFtfHByb3RlY3RlZHxyZXBlYXR8cnVub25jbGllbnR8c2VjdXJpdHlmaWx0ZXJpbmd8c3VwcHJlc3NkaXNwb3NlfHRlbXBvcmFyeXx0aGVufHRvfHRyaWdnZXJ8dW50aWx8dmFyfHdoaWxlfHdpdGh8d2l0aGV2ZW50cylcXGIvaSxcblx0XHQvLyBvYmplY3RzIGFuZCBtZXRhZGF0YSB0aGF0IGFyZSB1c2VkIGxpa2Uga2V5d29yZHNcblx0XHQvXFxiKD86YWN0aW9ufGFjdGlvbnN8YWRkYWZ0ZXJ8YWRkYmVmb3JlfGFkZGZpcnN0fGFkZGxhc3R8YXJlYXxhc3NlbWJseXxjaGFydHBhcnR8Y29kZXVuaXR8Y29sdW1ufGNvbnRyb2xhZGRpbnxjdWVncm91cHxjdXN0b21pemVzfGRhdGFpdGVtfGRhdGFzZXR8ZG90bmV0fGVsZW1lbnRzfGVudW18ZW51bWV4dGVuc2lvbnxleHRlbmRzfGZpZWxkfGZpZWxkYXR0cmlidXRlfGZpZWxkZWxlbWVudHxmaWVsZGdyb3VwfGZpZWxkZ3JvdXBzfGZpZWxkc3xmaWx0ZXJ8Zml4ZWR8Z3JpZHxncm91cHxrZXl8a2V5c3xsYWJlbHxsYWJlbHN8bGF5b3V0fG1vZGlmeXxtb3ZlYWZ0ZXJ8bW92ZWJlZm9yZXxtb3ZlZmlyc3R8bW92ZWxhc3R8cGFnZXxwYWdlY3VzdG9taXphdGlvbnxwYWdlZXh0ZW5zaW9ufHBhcnR8cHJvZmlsZXxxdWVyeXxyZXBlYXRlcnxyZXBvcnR8cmVxdWVzdHBhZ2V8c2NoZW1hfHNlcGFyYXRvcnxzeXN0ZW1wYXJ0fHRhYmxlfHRhYmxlZWxlbWVudHx0YWJsZWV4dGVuc2lvbnx0ZXh0YXR0cmlidXRlfHRleHRlbGVtZW50fHR5cGV8dXNlcmNvbnRyb2x8dmFsdWV8eG1scG9ydClcXGIvaVxuXHRdLFxuXHQnbnVtYmVyJzogL1xcYig/OjB4W1xcZGEtZl0rfCg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzplWystXT9cXGQrKT8pKD86RnxMTD98VSg/OkxMPyk/KT9cXGIvaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblx0J3ZhcmlhYmxlJzogL1xcYig/OkN1cnIoPzpGaWVsZE5vfFBhZ2V8UmVwb3J0KXx4P1JlY3xSZXF1ZXN0T3B0aW9uc1BhZ2UpXFxiLyxcblx0J2NsYXNzLW5hbWUnOiAvXFxiKD86YXV0b21hdGlvbnxiaWdpbnRlZ2VyfGJpZ3RleHR8YmxvYnxib29sZWFufGJ5dGV8Y2hhcnxjbGllbnR0eXBlfGNvZGV8Y29tcGxldGlvbnRyaWdnZXJlcnJvcmxldmVsfGNvbm5lY3Rpb250eXBlfGRhdGFiYXNlfGRhdGFjbGFzc2lmaWNhdGlvbnxkYXRhc2NvcGV8ZGF0ZXxkYXRlZm9ybXVsYXxkYXRldGltZXxkZWNpbWFsfGRlZmF1bHRsYXlvdXR8ZGlhbG9nfGRpY3Rpb25hcnl8ZG90bmV0YXNzZW1ibHl8ZG90bmV0dHlwZWRlY2xhcmF0aW9ufGR1cmF0aW9ufGVycm9yaW5mb3xlcnJvcnR5cGV8ZXhlY3V0aW9uY29udGV4dHxleGVjdXRpb25tb2RlfGZpZWxkY2xhc3N8ZmllbGRyZWZ8ZmllbGR0eXBlfGZpbGV8ZmlsdGVycGFnZWJ1aWxkZXJ8Z3VpZHxodHRwY2xpZW50fGh0dHBjb250ZW50fGh0dHBoZWFkZXJzfGh0dHByZXF1ZXN0bWVzc2FnZXxodHRwcmVzcG9uc2VtZXNzYWdlfGluc3RyZWFtfGludGVnZXJ8am9rZXJ8anNvbmFycmF5fGpzb25vYmplY3R8anNvbnRva2VufGpzb252YWx1ZXxrZXlyZWZ8bGlzdHxtb2R1bGVkZXBlbmRlbmN5aW5mb3xtb2R1bGVpbmZvfG5vbmV8bm90aWZpY2F0aW9ufG5vdGlmaWNhdGlvbnNjb3BlfG9iamVjdHR5cGV8b3B0aW9ufG91dHN0cmVhbXxwYWdlcmVzdWx0fHJlY29yZHxyZWNvcmRpZHxyZWNvcmRyZWZ8cmVwb3J0Zm9ybWF0fHNlY3VyaXR5ZmlsdGVyfHNlc3Npb25zZXR0aW5nc3x0YWJsZWNvbm5lY3Rpb250eXBlfHRhYmxlZmlsdGVyfHRlc3RhY3Rpb258dGVzdGZpZWxkfHRlc3RmaWx0ZXJmaWVsZHx0ZXN0cGFnZXx0ZXN0cGVybWlzc2lvbnN8dGVzdHJlcXVlc3RwYWdlfHRleHR8dGV4dGJ1aWxkZXJ8dGV4dGNvbnN0fHRleHRlbmNvZGluZ3x0aW1lfHRyYW5zYWN0aW9ubW9kZWx8dHJhbnNhY3Rpb250eXBlfHZhcmlhbnR8dmVyYm9zaXR5fHZlcnNpb258dmlld3x2aWV3c3x3ZWJzZXJ2aWNlYWN0aW9uY29udGV4dHx3ZWJzZXJ2aWNlYWN0aW9ucmVzdWx0Y29kZXx4bWxhdHRyaWJ1dGV8eG1sYXR0cmlidXRlY29sbGVjdGlvbnx4bWxjZGF0YXx4bWxjb21tZW50fHhtbGRlY2xhcmF0aW9ufHhtbGRvY3VtZW50fHhtbGRvY3VtZW50dHlwZXx4bWxlbGVtZW50fHhtbG5hbWVzcGFjZW1hbmFnZXJ8eG1sbmFtZXRhYmxlfHhtbG5vZGV8eG1sbm9kZWxpc3R8eG1scHJvY2Vzc2luZ2luc3RydWN0aW9ufHhtbHJlYWRvcHRpb25zfHhtbHRleHR8eG1sd3JpdGVvcHRpb25zKVxcYi9pLFxuXHQnb3BlcmF0b3InOiAvXFwuXFwufDpbPTpdfFstKyovXT0/fDw+fFs8Pl09P3w9fFxcYig/OmFuZHxkaXZ8bW9kfG5vdHxvcnx4b3IpXFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bKClcXFtcXF17fTouOyxdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmFudGxyNCA9IHtcblx0J2NvbW1lbnQnOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLycoPzpcXFxcLnxbXlxcXFwnXFxyXFxuXSkqJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjaGFyYWN0ZXItY2xhc3MnOiB7XG5cdFx0cGF0dGVybjogL1xcWyg/OlxcXFwufFteXFxcXFxcXVxcclxcbl0pKlxcXS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAncmVnZXgnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3JhbmdlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFteW118KD86XnxbXlxcXFxdKSg/OlxcXFxcXFxcKSpcXFxcXFxbKS0oPyFcXF0pLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdH0sXG5cdFx0XHQnZXNjYXBlJzogL1xcXFwoPzp1KD86W2EtZkEtRlxcZF17NH18XFx7W2EtZkEtRlxcZF0rXFx9KXxbcFBdXFx7Wz1cXHctXStcXH18W15cXHJcXG51cFBdKS8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXV0vXG5cdFx0fVxuXHR9LFxuXHQnYWN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9cXHsoPzpbXnt9XXxcXHsoPzpbXnt9XXxcXHsoPzpbXnt9XXxcXHtbXnt9XSpcXH0pKlxcfSkqXFx9KSpcXH0vLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdjb250ZW50Jzoge1xuXHRcdFx0XHQvLyB0aGlzIG1pZ2h0IGJlIEMsIEMrKywgUHl0aG9uLCBKYXZhLCBDIywgb3IgYW55IG90aGVyIGxhbmd1YWdlIEFOVExSNCBjb21waWxlcyB0b1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxceylbXFxzXFxTXSsoPz1cXH0pLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9be31dL1xuXHRcdH1cblx0fSxcblx0J2NvbW1hbmQnOiB7XG5cdFx0cGF0dGVybjogLygtPlxccyooPyFcXHMpKSg/OlxccyooPzosXFxzKik/XFxiW2Etel1cXHcqKD86XFxzKlxcKFteKClcXHJcXG5dKlxcKSk/KSsoPz1cXHMqOykvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2Z1bmN0aW9uJzogL1xcYlxcdysoPz1cXHMqKD86WywoXXwkKSkvLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1ssKCldL1xuXHRcdH1cblx0fSxcblx0J2Fubm90YXRpb24nOiB7XG5cdFx0cGF0dGVybjogL0BcXHcrKD86OjpcXHcrKSovLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2xhYmVsJzoge1xuXHRcdHBhdHRlcm46IC8jWyBcXHRdKlxcdysvLFxuXHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmNhdGNofGNoYW5uZWxzfGZpbmFsbHl8ZnJhZ21lbnR8Z3JhbW1hcnxpbXBvcnR8bGV4ZXJ8bG9jYWxzfG1vZGV8b3B0aW9uc3xwYXJzZXJ8cmV0dXJuc3x0aHJvd3N8dG9rZW5zKVxcYi8sXG5cdCdkZWZpbml0aW9uJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGJbYS16XVxcdyooPz1cXHMqOikvLFxuXHRcdFx0YWxpYXM6IFsncnVsZScsICdjbGFzcy1uYW1lJ11cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGJbQS1aXVxcdyooPz1cXHMqOikvLFxuXHRcdFx0YWxpYXM6IFsndG9rZW4nLCAnY29uc3RhbnQnXVxuXHRcdH0sXG5cdF0sXG5cdCdjb25zdGFudCc6IC9cXGJbQS1aXVtBLVpfXSpcXGIvLFxuXHQnb3BlcmF0b3InOiAvXFwuXFwufC0+fFt8fl18WyorP11cXD8/Lyxcblx0J3B1bmN0dWF0aW9uJzogL1s7OigpPV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuZzQgPSBQcmlzbS5sYW5ndWFnZXMuYW50bHI0O1xuXG5QcmlzbS5sYW5ndWFnZXMuYXBhY2hlY29uZiA9IHtcblx0J2NvbW1lbnQnOiAvIy4qLyxcblx0J2RpcmVjdGl2ZS1pbmxpbmUnOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKilcXGIoPzpBY2NlcHRGaWx0ZXJ8QWNjZXB0UGF0aEluZm98QWNjZXNzRmlsZU5hbWV8QWN0aW9ufEFkZCg/OkFsdHxBbHRCeUVuY29kaW5nfEFsdEJ5VHlwZXxDaGFyc2V0fERlZmF1bHRDaGFyc2V0fERlc2NyaXB0aW9ufEVuY29kaW5nfEhhbmRsZXJ8SWNvbnxJY29uQnlFbmNvZGluZ3xJY29uQnlUeXBlfElucHV0RmlsdGVyfExhbmd1YWdlfE1vZHVsZUluZm98T3V0cHV0RmlsdGVyfE91dHB1dEZpbHRlckJ5VHlwZXxUeXBlKXxBbGlhc3xBbGlhc01hdGNofEFsbG93KD86Q09OTkVDVHxFbmNvZGVkU2xhc2hlc3xNZXRob2RzfE92ZXJyaWRlfE92ZXJyaWRlTGlzdCk/fEFub255bW91cyg/Ol9Mb2dFbWFpbHxfTXVzdEdpdmVFbWFpbHxfTm9Vc2VySUR8X1ZlcmlmeUVtYWlsKT98QXN5bmNSZXF1ZXN0V29ya2VyRmFjdG9yfEF1dGgoPzpCYXNpY0F1dGhvcml0YXRpdmV8QmFzaWNGYWtlfEJhc2ljUHJvdmlkZXJ8QmFzaWNVc2VEaWdlc3RBbGdvcml0aG18REJEVXNlclBXUXVlcnl8REJEVXNlclJlYWxtUXVlcnl8REJNR3JvdXBGaWxlfERCTVR5cGV8REJNVXNlckZpbGV8RGlnZXN0KD86QWxnb3JpdGhtfERvbWFpbnxOb25jZUxpZmV0aW1lfFByb3ZpZGVyfFFvcHxTaG1lbVNpemUpfEZvcm0oPzpBdXRob3JpdGF0aXZlfEJvZHl8RGlzYWJsZU5vU3RvcmV8RmFrZUJhc2ljQXV0aHxMb2NhdGlvbnxMb2dpblJlcXVpcmVkTG9jYXRpb258TG9naW5TdWNjZXNzTG9jYXRpb258TG9nb3V0TG9jYXRpb258TWV0aG9kfE1pbWV0eXBlfFBhc3N3b3JkfFByb3ZpZGVyfFNpdGVQYXNzcGhyYXNlfFNpemV8VXNlcm5hbWUpfEdyb3VwRmlsZXxMREFQKD86QXV0aG9yaXplUHJlZml4fEJpbmRBdXRob3JpdGF0aXZlfEJpbmRETnxCaW5kUGFzc3dvcmR8Q2hhcnNldENvbmZpZ3xDb21wYXJlQXNVc2VyfENvbXBhcmVETk9uU2VydmVyfERlcmVmZXJlbmNlQWxpYXNlc3xHcm91cEF0dHJpYnV0ZXxHcm91cEF0dHJpYnV0ZUlzRE58SW5pdGlhbEJpbmRBc1VzZXJ8SW5pdGlhbEJpbmRQYXR0ZXJufE1heFN1Ykdyb3VwRGVwdGh8UmVtb3RlVXNlckF0dHJpYnV0ZXxSZW1vdGVVc2VySXNETnxTZWFyY2hBc1VzZXJ8U3ViR3JvdXBBdHRyaWJ1dGV8U3ViR3JvdXBDbGFzc3xVcmwpfE1lcmdpbmd8TmFtZXxuQ2FjaGUoPzpDb250ZXh0fEVuYWJsZXxQcm92aWRlRm9yfFNPQ2FjaGV8VGltZW91dCl8bnpGY2dpQ2hlY2tBdXRoblByb3ZpZGVyfG56RmNnaURlZmluZVByb3ZpZGVyfFR5cGV8VXNlckZpbGV8ekRCRExvZ2luVG9SZWZlcmVyfHpEQkRRdWVyeXx6REJEUmVkaXJlY3RRdWVyeXx6REJNVHlwZXx6U2VuZEZvcmJpZGRlbk9uRmFpbHVyZSl8QmFsYW5jZXJHcm93dGh8QmFsYW5jZXJJbmhlcml0fEJhbGFuY2VyTWVtYmVyfEJhbGFuY2VyUGVyc2lzdHxCcm93c2VyTWF0Y2h8QnJvd3Nlck1hdGNoTm9DYXNlfEJ1ZmZlcmVkTG9nc3xCdWZmZXJTaXplfENhY2hlKD86RGVmYXVsdEV4cGlyZXxEZXRhaWxIZWFkZXJ8RGlyTGVuZ3RofERpckxldmVsc3xEaXNhYmxlfEVuYWJsZXxGaWxlfEhlYWRlcnxJZ25vcmVDYWNoZUNvbnRyb2x8SWdub3JlSGVhZGVyc3xJZ25vcmVOb0xhc3RNb2R8SWdub3JlUXVlcnlTdHJpbmd8SWdub3JlVVJMU2Vzc2lvbklkZW50aWZpZXJzfEtleUJhc2VVUkx8TGFzdE1vZGlmaWVkRmFjdG9yfExvY2t8TG9ja01heEFnZXxMb2NrUGF0aHxNYXhFeHBpcmV8TWF4RmlsZVNpemV8TWluRXhwaXJlfE1pbkZpbGVTaXplfE5lZ290aWF0ZWREb2NzfFF1aWNrSGFuZGxlcnxSZWFkU2l6ZXxSZWFkVGltZXxSb290fFNvY2FjaGUoPzpNYXhTaXplfE1heFRpbWV8TWluVGltZXxSZWFkU2l6ZXxSZWFkVGltZSk/fFN0YWxlT25FcnJvcnxTdG9yZUV4cGlyZWR8U3RvcmVOb1N0b3JlfFN0b3JlUHJpdmF0ZSl8Q0dJRFNjcmlwdFRpbWVvdXR8Q0dJTWFwRXh0ZW5zaW9ufENoYXJzZXREZWZhdWx0fENoYXJzZXRPcHRpb25zfENoYXJzZXRTb3VyY2VFbmN8Q2hlY2tDYXNlT25seXxDaGVja1NwZWxsaW5nfENocm9vdERpcnxDb250ZW50RGlnZXN0fENvb2tpZURvbWFpbnxDb29raWVFeHBpcmVzfENvb2tpZU5hbWV8Q29va2llU3R5bGV8Q29va2llVHJhY2tpbmd8Q29yZUR1bXBEaXJlY3Rvcnl8Q3VzdG9tTG9nfERhdnxEYXZEZXB0aEluZmluaXR5fERhdkdlbmVyaWNMb2NrREJ8RGF2TG9ja0RCfERhdk1pblRpbWVvdXR8REJERXhwdGltZXxEQkRJbml0U1FMfERCREtlZXB8REJETWF4fERCRE1pbnxEQkRQYXJhbXN8REJEUGVyc2lzdHxEQkRQcmVwYXJlU1FMfERCRHJpdmVyfERlZmF1bHRJY29ufERlZmF1bHRMYW5ndWFnZXxEZWZhdWx0UnVudGltZURpcnxEZWZhdWx0VHlwZXxEZWZpbmV8RGVmbGF0ZSg/OkJ1ZmZlclNpemV8Q29tcHJlc3Npb25MZXZlbHxGaWx0ZXJOb3RlfEluZmxhdGVMaW1pdFJlcXVlc3RCb2R5fEluZmxhdGVSYXRpbyg/OkJ1cnN0fExpbWl0KXxNZW1MZXZlbHxXaW5kb3dTaXplKXxEZW55fERpcmVjdG9yeUNoZWNrSGFuZGxlcnxEaXJlY3RvcnlJbmRleHxEaXJlY3RvcnlJbmRleFJlZGlyZWN0fERpcmVjdG9yeVNsYXNofERvY3VtZW50Um9vdHxEVHJhY2VQcml2aWxlZ2VzfER1bXBJT0lucHV0fER1bXBJT091dHB1dHxFbmFibGVFeGNlcHRpb25Ib29rfEVuYWJsZU1NQVB8RW5hYmxlU2VuZGZpbGV8RXJyb3J8RXJyb3JEb2N1bWVudHxFcnJvckxvZ3xFcnJvckxvZ0Zvcm1hdHxFeGFtcGxlfEV4cGlyZXNBY3RpdmV8RXhwaXJlc0J5VHlwZXxFeHBpcmVzRGVmYXVsdHxFeHRlbmRlZFN0YXR1c3xFeHRGaWx0ZXJEZWZpbmV8RXh0RmlsdGVyT3B0aW9uc3xGYWxsYmFja1Jlc291cmNlfEZpbGVFVGFnfEZpbHRlckNoYWlufEZpbHRlckRlY2xhcmV8RmlsdGVyUHJvdG9jb2x8RmlsdGVyUHJvdmlkZXJ8RmlsdGVyVHJhY2V8Rm9yY2VMYW5ndWFnZVByaW9yaXR5fEZvcmNlVHlwZXxGb3JlbnNpY0xvZ3xHcHJvZkRpcnxHcmFjZWZ1bFNodXRkb3duVGltZW91dHxHcm91cHxIZWFkZXJ8SGVhZGVyTmFtZXxIZWFydGJlYXQoPzpBZGRyZXNzfExpc3RlbnxNYXhTZXJ2ZXJzfFN0b3JhZ2UpfEhvc3RuYW1lTG9va3Vwc3xJZGVudGl0eUNoZWNrfElkZW50aXR5Q2hlY2tUaW1lb3V0fEltYXBCYXNlfEltYXBEZWZhdWx0fEltYXBNZW51fEluY2x1ZGV8SW5jbHVkZU9wdGlvbmFsfEluZGV4KD86SGVhZEluc2VydHxJZ25vcmV8SWdub3JlUmVzZXR8T3B0aW9uc3xPcmRlckRlZmF1bHR8U3R5bGVTaGVldCl8SW5wdXRTZWR8SVNBUEkoPzpBcHBlbmRMb2dUb0Vycm9yc3xBcHBlbmRMb2dUb1F1ZXJ5fENhY2hlRmlsZXxGYWtlQXN5bmN8TG9nTm90U3VwcG9ydGVkfFJlYWRBaGVhZEJ1ZmZlcil8S2VlcEFsaXZlfEtlZXBBbGl2ZVRpbWVvdXR8S2VwdEJvZHlTaXplfExhbmd1YWdlUHJpb3JpdHl8TERBUCg/OkNhY2hlRW50cmllc3xDYWNoZVRUTHxDb25uZWN0aW9uUG9vbFRUTHxDb25uZWN0aW9uVGltZW91dHxMaWJyYXJ5RGVidWd8T3BDYWNoZUVudHJpZXN8T3BDYWNoZVRUTHxSZWZlcnJhbEhvcExpbWl0fFJlZmVycmFsc3xSZXRyaWVzfFJldHJ5RGVsYXl8U2hhcmVkQ2FjaGVGaWxlfFNoYXJlZENhY2hlU2l6ZXxUaW1lb3V0fFRydXN0ZWRDbGllbnRDZXJ0fFRydXN0ZWRHbG9iYWxDZXJ0fFRydXN0ZWRNb2RlfFZlcmlmeVNlcnZlckNlcnQpfExpbWl0KD86SW50ZXJuYWxSZWN1cnNpb258UmVxdWVzdCg/OkJvZHl8RmllbGRzfEZpZWxkU2l6ZXxMaW5lKXxYTUxSZXF1ZXN0Qm9keSl8TGlzdGVufExpc3RlbkJhY2tMb2d8TG9hZEZpbGV8TG9hZE1vZHVsZXxMb2dGb3JtYXR8TG9nTGV2ZWx8TG9nTWVzc2FnZXxMdWFBdXRoelByb3ZpZGVyfEx1YUNvZGVDYWNoZXxMdWEoPzpIb29rKD86QWNjZXNzQ2hlY2tlcnxBdXRoQ2hlY2tlcnxDaGVja1VzZXJJRHxGaXh1cHN8SW5zZXJ0RmlsdGVyfExvZ3xNYXBUb1N0b3JhZ2V8VHJhbnNsYXRlTmFtZXxUeXBlQ2hlY2tlcil8SW5oZXJpdHxJbnB1dEZpbHRlcnxNYXBIYW5kbGVyfE91dHB1dEZpbHRlcnxQYWNrYWdlQ1BhdGh8UGFja2FnZVBhdGh8UXVpY2tIYW5kbGVyfFJvb3R8U2NvcGUpfE1heCg/OkNvbm5lY3Rpb25zUGVyQ2hpbGR8S2VlcEFsaXZlUmVxdWVzdHN8TWVtRnJlZXxSYW5nZU92ZXJsYXBzfFJhbmdlUmV2ZXJzYWxzfFJhbmdlc3xSZXF1ZXN0V29ya2Vyc3xTcGFyZVNlcnZlcnN8U3BhcmVUaHJlYWRzfFRocmVhZHMpfE1lcmdlVHJhaWxlcnN8TWV0YURpcnxNZXRhRmlsZXN8TWV0YVN1ZmZpeHxNaW1lTWFnaWNGaWxlfE1pblNwYXJlU2VydmVyc3xNaW5TcGFyZVRocmVhZHN8TU1hcEZpbGV8TW9kZW1TdGFuZGFyZHxNb2RNaW1lVXNlUGF0aEluZm98TXVsdGl2aWV3c01hdGNofE11dGV4fE5hbWVWaXJ0dWFsSG9zdHxOb1Byb3h5fE5XU1NMVHJ1c3RlZENlcnRzfE5XU1NMVXBncmFkZWFibGV8T3B0aW9uc3xPcmRlcnxPdXRwdXRTZWR8UGFzc0VudnxQaWRGaWxlfFByaXZpbGVnZXNNb2RlfFByb3RvY29sfFByb3RvY29sRWNob3xQcm94eSg/OkFkZEhlYWRlcnN8QmFkSGVhZGVyfEJsb2NrfERvbWFpbnxFcnJvck92ZXJyaWRlfEV4cHJlc3NEQk1GaWxlfEV4cHJlc3NEQk1UeXBlfEV4cHJlc3NFbmFibGV8RnRwRGlyQ2hhcnNldHxGdHBFc2NhcGVXaWxkY2FyZHN8RnRwTGlzdE9uV2lsZGNhcmR8SFRNTCg/OkJ1ZlNpemV8Q2hhcnNldE91dHxEb2NUeXBlfEVuYWJsZXxFdmVudHN8RXh0ZW5kZWR8Rml4dXBzfEludGVycHxMaW5rc3xNZXRhfFN0cmlwQ29tbWVudHN8VVJMTWFwKXxJT0J1ZmZlclNpemV8TWF4Rm9yd2FyZHN8UGFzcyg/OkluaGVyaXR8SW50ZXJwb2xhdGVFbnZ8TWF0Y2h8UmV2ZXJzZXxSZXZlcnNlQ29va2llRG9tYWlufFJldmVyc2VDb29raWVQYXRoKT98UHJlc2VydmVIb3N0fFJlY2VpdmVCdWZmZXJTaXplfFJlbW90ZXxSZW1vdGVNYXRjaHxSZXF1ZXN0c3xTQ0dJSW50ZXJuYWxSZWRpcmVjdHxTQ0dJU2VuZGZpbGV8U2V0fFNvdXJjZUFkZHJlc3N8U3RhdHVzfFRpbWVvdXR8VmlhKXxSZWFkbWVOYW1lfFJlY2VpdmVCdWZmZXJTaXplfFJlZGlyZWN0fFJlZGlyZWN0TWF0Y2h8UmVkaXJlY3RQZXJtYW5lbnR8UmVkaXJlY3RUZW1wfFJlZmxlY3RvckhlYWRlcnxSZW1vdGVJUCg/OkhlYWRlcnxJbnRlcm5hbFByb3h5fEludGVybmFsUHJveHlMaXN0fFByb3hpZXNIZWFkZXJ8VHJ1c3RlZFByb3h5fFRydXN0ZWRQcm94eUxpc3QpfFJlbW92ZUNoYXJzZXR8UmVtb3ZlRW5jb2Rpbmd8UmVtb3ZlSGFuZGxlcnxSZW1vdmVJbnB1dEZpbHRlcnxSZW1vdmVMYW5ndWFnZXxSZW1vdmVPdXRwdXRGaWx0ZXJ8UmVtb3ZlVHlwZXxSZXF1ZXN0SGVhZGVyfFJlcXVlc3RSZWFkVGltZW91dHxSZXF1aXJlfFJld3JpdGUoPzpCYXNlfENvbmR8RW5naW5lfE1hcHxPcHRpb25zfFJ1bGUpfFJMaW1pdENQVXxSTGltaXRNRU18UkxpbWl0TlBST0N8U2F0aXNmeXxTY29yZUJvYXJkRmlsZXxTY3JpcHQoPzpBbGlhc3xBbGlhc01hdGNofEludGVycHJldGVyU291cmNlfExvZ3xMb2dCdWZmZXJ8TG9nTGVuZ3RofFNvY2spP3xTZWN1cmVMaXN0ZW58U2VlUmVxdWVzdFRhaWx8U2VuZEJ1ZmZlclNpemV8U2VydmVyKD86QWRtaW58QWxpYXN8TGltaXR8TmFtZXxQYXRofFJvb3R8U2lnbmF0dXJlfFRva2Vucyl8U2Vzc2lvbig/OkNvb2tpZSg/Ok5hbWV8TmFtZTJ8UmVtb3ZlKXxDcnlwdG8oPzpDaXBoZXJ8RHJpdmVyfFBhc3NwaHJhc2V8UGFzc3BocmFzZUZpbGUpfERCRCg/OkNvb2tpZU5hbWV8Q29va2llTmFtZTJ8Q29va2llUmVtb3ZlfERlbGV0ZUxhYmVsfEluc2VydExhYmVsfFBlclVzZXJ8U2VsZWN0TGFiZWx8VXBkYXRlTGFiZWwpfEVudnxFeGNsdWRlfEhlYWRlcnxJbmNsdWRlfE1heEFnZSk/fFNldEVudnxTZXRFbnZJZnxTZXRFbnZJZkV4cHJ8U2V0RW52SWZOb0Nhc2V8U2V0SGFuZGxlcnxTZXRJbnB1dEZpbHRlcnxTZXRPdXRwdXRGaWx0ZXJ8U1NJRW5kVGFnfFNTSUVycm9yTXNnfFNTSUVUYWd8U1NJTGFzdE1vZGlmaWVkfFNTSUxlZ2FjeUV4cHJQYXJzZXJ8U1NJU3RhcnRUYWd8U1NJVGltZUZvcm1hdHxTU0lVbmRlZmluZWRFY2hvfFNTTCg/OkNBQ2VydGlmaWNhdGVGaWxlfENBQ2VydGlmaWNhdGVQYXRofENBRE5SZXF1ZXN0RmlsZXxDQUROUmVxdWVzdFBhdGh8Q0FSZXZvY2F0aW9uQ2hlY2t8Q0FSZXZvY2F0aW9uRmlsZXxDQVJldm9jYXRpb25QYXRofENlcnRpZmljYXRlQ2hhaW5GaWxlfENlcnRpZmljYXRlRmlsZXxDZXJ0aWZpY2F0ZUtleUZpbGV8Q2lwaGVyU3VpdGV8Q29tcHJlc3Npb258Q3J5cHRvRGV2aWNlfEVuZ2luZXxGSVBTfEhvbm9yQ2lwaGVyT3JkZXJ8SW5zZWN1cmVSZW5lZ290aWF0aW9ufE9DU1AoPzpEZWZhdWx0UmVzcG9uZGVyfEVuYWJsZXxPdmVycmlkZVJlc3BvbmRlcnxSZXNwb25kZXJUaW1lb3V0fFJlc3BvbnNlTWF4QWdlfFJlc3BvbnNlVGltZVNrZXd8VXNlUmVxdWVzdE5vbmNlKXxPcGVuU1NMQ29uZkNtZHxPcHRpb25zfFBhc3NQaHJhc2VEaWFsb2d8UHJvdG9jb2x8UHJveHkoPzpDQUNlcnRpZmljYXRlRmlsZXxDQUNlcnRpZmljYXRlUGF0aHxDQVJldm9jYXRpb24oPzpDaGVja3xGaWxlfFBhdGgpfENoZWNrUGVlcig/OkNOfEV4cGlyZXxOYW1lKXxDaXBoZXJTdWl0ZXxFbmdpbmV8TWFjaGluZUNlcnRpZmljYXRlKD86Q2hhaW5GaWxlfEZpbGV8UGF0aCl8UHJvdG9jb2x8VmVyaWZ5fFZlcmlmeURlcHRoKXxSYW5kb21TZWVkfFJlbmVnQnVmZmVyU2l6ZXxSZXF1aXJlfFJlcXVpcmVTU0x8U2Vzc2lvbig/OkNhY2hlfENhY2hlVGltZW91dHxUaWNrZXRLZXlGaWxlfFRpY2tldHMpfFNSUFVua25vd25Vc2VyU2VlZHxTUlBWZXJpZmllckZpbGV8U3RhcGxpbmcoPzpDYWNoZXxFcnJvckNhY2hlVGltZW91dHxGYWtlVHJ5TGF0ZXJ8Rm9yY2VVUkx8UmVzcG9uZGVyVGltZW91dHxSZXNwb25zZU1heEFnZXxSZXNwb25zZVRpbWVTa2V3fFJldHVyblJlc3BvbmRlckVycm9yc3xTdGFuZGFyZENhY2hlVGltZW91dCl8U3RyaWN0U05JVkhvc3RDaGVja3xVc2VyTmFtZXxVc2VTdGFwbGluZ3xWZXJpZnlDbGllbnR8VmVyaWZ5RGVwdGgpfFN0YXJ0U2VydmVyc3xTdGFydFRocmVhZHN8U3Vic3RpdHV0ZXxTdWV4ZWN8U3VleGVjVXNlckdyb3VwfFRocmVhZExpbWl0fFRocmVhZHNQZXJDaGlsZHxUaHJlYWRTdGFja1NpemV8VGltZU91dHxUcmFjZUVuYWJsZXxUcmFuc2ZlckxvZ3xUeXBlc0NvbmZpZ3xVbkRlZmluZXxVbmRlZk1hY3JvfFVuc2V0RW52fFVzZXxVc2VDYW5vbmljYWxOYW1lfFVzZUNhbm9uaWNhbFBoeXNpY2FsUG9ydHxVc2VyfFVzZXJEaXJ8Vkhvc3RDR0lNb2RlfFZIb3N0Q0dJUHJpdnN8Vkhvc3RHcm91cHxWSG9zdFByaXZzfFZIb3N0U2VjdXJlfFZIb3N0VXNlcnxWaXJ0dWFsKD86RG9jdW1lbnRSb290fFNjcmlwdEFsaWFzKSg/OklQKT98V2F0Y2hkb2dJbnRlcnZhbHxYQml0SGFja3x4bWwyRW5jQWxpYXN8eG1sMkVuY0RlZmF1bHR8eG1sMlN0YXJ0UGFyc2UpXFxiL2ltLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J2RpcmVjdGl2ZS1ibG9jayc6IHtcblx0XHRwYXR0ZXJuOiAvPFxcLz9cXGIoPzpBdXRoW256XVByb3ZpZGVyQWxpYXN8RGlyZWN0b3J5fERpcmVjdG9yeU1hdGNofEVsc2V8RWxzZUlmfEZpbGVzfEZpbGVzTWF0Y2h8SWZ8SWZEZWZpbmV8SWZNb2R1bGV8SWZWZXJzaW9ufExpbWl0fExpbWl0RXhjZXB0fExvY2F0aW9ufExvY2F0aW9uTWF0Y2h8TWFjcm98UHJveHl8UmVxdWlyZSg/OkFsbHxBbnl8Tm9uZSl8VmlydHVhbEhvc3QpXFxiLio+L2ksXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZGlyZWN0aXZlLWJsb2NrJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXjxcXC8/XFx3Ky8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePFxcLz8vXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFsaWFzOiAndGFnJ1xuXHRcdFx0fSxcblx0XHRcdCdkaXJlY3RpdmUtYmxvY2stcGFyYW1ldGVyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvLipbXj5dLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzovLFxuXHRcdFx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKFwifCcpLipcXDEvLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdCd2YXJpYWJsZSc6IC9bJCVdXFx7Pyg/Olxcd1xcLj9bLSs6XT8pK1xcfT8vXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRhbGlhczogJ2F0dHItdmFsdWUnXG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogLz4vXG5cdFx0fSxcblx0XHRhbGlhczogJ3RhZydcblx0fSxcblx0J2RpcmVjdGl2ZS1mbGFncyc6IHtcblx0XHRwYXR0ZXJuOiAvXFxbKD86W1xcdz1dLD8pK1xcXS8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXCJ8JykuKlxcMS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndmFyaWFibGUnOiAvWyQlXVxcez8oPzpcXHdcXC4/Wy0rOl0/KStcXH0/L1xuXHRcdH1cblx0fSxcblx0J3ZhcmlhYmxlJzogL1skJV1cXHs/KD86XFx3XFwuP1stKzpdPykrXFx9Py8sXG5cdCdyZWdleCc6IC9cXF4/LipcXCR8XFxeLipcXCQ/L1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnNxbCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86XFwvXFwqW1xcc1xcU10qP1xcKlxcL3woPzotLXxcXC9cXC98IykuKikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3ZhcmlhYmxlJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9AKFtcIidgXSkoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pK1xcMS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdC9AW1xcdy4kXSsvXG5cdF0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteQFxcXFxdKShcInwnKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDIpW15cXFxcXXxcXDJcXDIpKlxcMi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2lkZW50aWZpZXInOiB7XG5cdFx0cGF0dGVybjogLyhefFteQFxcXFxdKWAoPzpcXFxcW1xcc1xcU118W15gXFxcXF18YGApKmAvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL15gfGAkL1xuXHRcdH1cblx0fSxcblx0J2Z1bmN0aW9uJzogL1xcYig/OkFWR3xDT1VOVHxGSVJTVHxGT1JNQVR8TEFTVHxMQ0FTRXxMRU58TUFYfE1JRHxNSU58TU9EfE5PV3xST1VORHxTVU18VUNBU0UpKD89XFxzKlxcKCkvaSwgLy8gU2hvdWxkIHdlIGhpZ2hsaWdodCB1c2VyIGRlZmluZWQgZnVuY3Rpb25zIHRvbz9cblx0J2tleXdvcmQnOiAvXFxiKD86QUNUSU9OfEFERHxBRlRFUnxBTEdPUklUSE18QUxMfEFMVEVSfEFOQUxZWkV8QU5ZfEFQUExZfEFTfEFTQ3xBVVRIT1JJWkFUSU9OfEFVVE9fSU5DUkVNRU5UfEJBQ0tVUHxCREJ8QkVHSU58QkVSS0VMRVlEQnxCSUdJTlR8QklOQVJZfEJJVHxCTE9CfEJPT0x8Qk9PTEVBTnxCUkVBS3xCUk9XU0V8QlRSRUV8QlVMS3xCWXxDQUxMfENBU0NBREVEP3xDQVNFfENIQUlOfENIQVIoPzpBQ1RFUnxTRVQpP3xDSEVDSyg/OlBPSU5UKT98Q0xPU0V8Q0xVU1RFUkVEfENPQUxFU0NFfENPTExBVEV8Q09MVU1OUz98Q09NTUVOVHxDT01NSVQoPzpURUQpP3xDT01QVVRFfENPTk5FQ1R8Q09OU0lTVEVOVHxDT05TVFJBSU5UfENPTlRBSU5TKD86VEFCTEUpP3xDT05USU5VRXxDT05WRVJUfENSRUFURXxDUk9TU3xDVVJSRU5UKD86X0RBVEV8X1RJTUV8X1RJTUVTVEFNUHxfVVNFUik/fENVUlNPUnxDWUNMRXxEQVRBKD86QkFTRVM/KT98REFURSg/OlRJTUUpP3xEQVl8REJDQ3xERUFMTE9DQVRFfERFQ3xERUNJTUFMfERFQ0xBUkV8REVGQVVMVHxERUZJTkVSfERFTEFZRUR8REVMRVRFfERFTElNSVRFUlM/fERFTll8REVTQ3xERVNDUklCRXxERVRFUk1JTklTVElDfERJU0FCTEV8RElTQ0FSRHxESVNLfERJU1RJTkNUfERJU1RJTkNUUk9XfERJU1RSSUJVVEVEfERPfERPVUJMRXxEUk9QfERVTU1ZfERVTVAoPzpGSUxFKT98RFVQTElDQVRFfEVMU0UoPzpJRik/fEVOQUJMRXxFTkNMT1NFRHxFTkR8RU5HSU5FfEVOVU18RVJSTFZMfEVSUk9SU3xFU0NBUEVEP3xFWENFUFR8RVhFQyg/OlVURSk/fEVYSVNUU3xFWElUfEVYUExBSU58RVhURU5ERUR8RkVUQ0h8RklFTERTfEZJTEV8RklMTEZBQ1RPUnxGSVJTVHxGSVhFRHxGTE9BVHxGT0xMT1dJTkd8Rk9SKD86IEVBQ0ggUk9XKT98Rk9SQ0V8Rk9SRUlHTnxGUkVFVEVYVCg/OlRBQkxFKT98RlJPTXxGVUxMfEZVTkNUSU9OfEdFT01FVFJZKD86Q09MTEVDVElPTik/fEdMT0JBTHxHT1RPfEdSQU5UfEdST1VQfEhBTkRMRVJ8SEFTSHxIQVZJTkd8SE9MRExPQ0t8SE9VUnxJREVOVElUWSg/OkNPTHxfSU5TRVJUKT98SUZ8SUdOT1JFfElNUE9SVHxJTkRFWHxJTkZJTEV8SU5ORVJ8SU5OT0RCfElOT1VUfElOU0VSVHxJTlR8SU5URUdFUnxJTlRFUlNFQ1R8SU5URVJWQUx8SU5UT3xJTlZPS0VSfElTT0xBVElPTnxJVEVSQVRFfEpPSU58S0VZUz98S0lMTHxMQU5HVUFHRXxMQVNUfExFQVZFfExFRlR8TEVWRUx8TElNSVR8TElORU5PfExJTkVTfExJTkVTVFJJTkd8TE9BRHxMT0NBTHxMT0NLfExPTkcoPzpCTE9CfFRFWFQpfExPT1B8TUFUQ0goPzpFRCk/fE1FRElVTSg/OkJMT0J8SU5UfFRFWFQpfE1FUkdFfE1JRERMRUlOVHxNSU5VVEV8TU9ERXxNT0RJRklFU3xNT0RJRll8TU9OVEh8TVVMVEkoPzpMSU5FU1RSSU5HfFBPSU5UfFBPTFlHT04pfE5BVElPTkFMfE5BVFVSQUx8TkNIQVJ8TkVYVHxOT3xOT05DTFVTVEVSRUR8TlVMTElGfE5VTUVSSUN8T0ZGP3xPRkZTRVRTP3xPTnxPUEVOKD86REFUQVNPVVJDRXxRVUVSWXxST1dTRVQpP3xPUFRJTUlaRXxPUFRJT04oPzpBTExZKT98T1JERVJ8T1VUKD86RVJ8RklMRSk/fE9WRVJ8UEFSVElBTHxQQVJUSVRJT058UEVSQ0VOVHxQSVZPVHxQTEFOfFBPSU5UfFBPTFlHT058UFJFQ0VESU5HfFBSRUNJU0lPTnxQUkVQQVJFfFBSRVZ8UFJJTUFSWXxQUklOVHxQUklWSUxFR0VTfFBST0MoPzpFRFVSRSk/fFBVQkxJQ3xQVVJHRXxRVUlDS3xSQUlTRVJST1J8UkVBRFM/fFJFQUx8UkVDT05GSUdVUkV8UkVGRVJFTkNFU3xSRUxFQVNFfFJFTkFNRXxSRVBFQVQoPzpBQkxFKT98UkVQTEFDRXxSRVBMSUNBVElPTnxSRVFVSVJFfFJFU0lHTkFMfFJFU1RPUkV8UkVTVFJJQ1R8UkVUVVJOKD86SU5HfFMpP3xSRVZPS0V8UklHSFR8Uk9MTEJBQ0t8Uk9VVElORXxST1coPzpDT1VOVHxHVUlEQ09MfFMpP3xSVFJFRXxSVUxFfFNBVkUoPzpQT0lOVCk/fFNDSEVNQXxTRUNPTkR8U0VMRUNUfFNFUklBTCg/OklaQUJMRSk/fFNFU1NJT04oPzpfVVNFUik/fFNFVCg/OlVTRVIpP3xTSEFSRXxTSE9XfFNIVVRET1dOfFNJTVBMRXxTTUFMTElOVHxTTkFQU0hPVHxTT01FfFNPTkFNRXxTUUx8U1RBUlQoPzpJTkcpP3xTVEFUSVNUSUNTfFNUQVRVU3xTVFJJUEVEfFNZU1RFTV9VU0VSfFRBQkxFUz98VEFCTEVTUEFDRXxURU1QKD86T1JBUll8VEFCTEUpP3xURVJNSU5BVEVEfFRFWFQoPzpTSVpFKT98VEhFTnxUSU1FKD86U1RBTVApP3xUSU5ZKD86QkxPQnxJTlR8VEVYVCl8VE9QP3xUUkFOKD86U0FDVElPTlM/KT98VFJJR0dFUnxUUlVOQ0FURXxUU0VRVUFMfFRZUEVTP3xVTkJPVU5ERUR8VU5DT01NSVRURUR8VU5ERUZJTkVEfFVOSU9OfFVOSVFVRXxVTkxPQ0t8VU5QSVZPVHxVTlNJR05FRHxVUERBVEUoPzpURVhUKT98VVNBR0V8VVNFfFVTRVJ8VVNJTkd8VkFMVUVTP3xWQVIoPzpCSU5BUll8Q0hBUnxDSEFSQUNURVJ8WUlORyl8VklFV3xXQUlURk9SfFdBUk5JTkdTfFdIRU58V0hFUkV8V0hJTEV8V0lUSCg/OiBST0xMVVB8SU4pP3xXT1JLfFdSSVRFKD86VEVYVCk/fFlFQVIpXFxiL2ksXG5cdCdib29sZWFuJzogL1xcYig/OkZBTFNFfE5VTEx8VFJVRSlcXGIvaSxcblx0J251bWJlcic6IC9cXGIweFtcXGRhLWZdK1xcYnxcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCtcXGIvaSxcblx0J29wZXJhdG9yJzogL1stKypcXC89JV5+XXwmJj98XFx8XFx8P3whPT98PCg/Oj0+P3w8fD4pP3w+Wz49XT98XFxiKD86QU5EfEJFVFdFRU58RElWfElMSUtFfElOfElTfExJS0V8Tk9UfE9SfFJFR0VYUHxSTElLRXxTT1VORFMgTElLRXxYT1IpXFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bO1tcXF0oKWAsLl0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGtleXdvcmRzID0gL1xcYig/Oig/OmFmdGVyfGJlZm9yZSkoPz1cXHMrW2Etel0pfGFic3RyYWN0fGFjdGl2YXRlfGFuZHxhbnl8YXJyYXl8YXN8YXNjfGF1dG9ub21vdXN8YmVnaW58YmlnZGVjaW1hbHxibG9ifGJvb2xlYW58YnJlYWt8YnVsa3xieXxieXRlfGNhc2V8Y2FzdHxjYXRjaHxjaGFyfGNsYXNzfGNvbGxlY3R8Y29tbWl0fGNvbnN0fGNvbnRpbnVlfGN1cnJlbmN5fGRhdGV8ZGF0ZXRpbWV8ZGVjaW1hbHxkZWZhdWx0fGRlbGV0ZXxkZXNjfGRvfGRvdWJsZXxlbHNlfGVuZHxlbnVtfGV4Y2VwdGlvbnxleGl0fGV4cG9ydHxleHRlbmRzfGZpbmFsfGZpbmFsbHl8ZmxvYXR8Zm9yfGZyb218Z2V0KD89XFxzKlt7fTtdKXxnbG9iYWx8Z290b3xncm91cHxoYXZpbmd8aGludHxpZnxpbXBsZW1lbnRzfGltcG9ydHxpbnxpbm5lcnxpbnNlcnR8aW5zdGFuY2VvZnxpbnR8aW50ZWdlcnxpbnRlcmZhY2V8aW50b3xqb2lufGxpa2V8bGltaXR8bGlzdHxsb25nfGxvb3B8bWFwfG1lcmdlfG5ld3xub3R8bnVsbHxudWxsc3xudW1iZXJ8b2JqZWN0fG9mfG9ufG9yfG91dGVyfG92ZXJyaWRlfHBhY2thZ2V8cGFyYWxsZWx8cHJhZ21hfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZXRyaWV2ZXxyZXR1cm58cm9sbGJhY2t8c2VsZWN0fHNldHxzaG9ydHxzT2JqZWN0fHNvcnR8c3RhdGljfHN0cmluZ3xzdXBlcnxzd2l0Y2h8c3luY2hyb25pemVkfHN5c3RlbXx0ZXN0bWV0aG9kfHRoZW58dGhpc3x0aHJvd3x0aW1lfHRyYW5zYWN0aW9ufHRyYW5zaWVudHx0cmlnZ2VyfHRyeXx1bmRlbGV0ZXx1cGRhdGV8dXBzZXJ0fHVzaW5nfHZpcnR1YWx8dm9pZHx3ZWJzZXJ2aWNlfHdoZW58d2hlcmV8d2hpbGV8KD86aW5oZXJpdGVkfHdpdGh8d2l0aG91dClcXHMrc2hhcmluZylcXGIvaTtcblxuXHR2YXIgY2xhc3NOYW1lID0gL1xcYig/Oig/PVthLXpfXVxcdypcXHMqWzxcXFtdKXwoPyE8a2V5d29yZD4pKVtBLVpfXVxcdyooPzpcXHMqXFwuXFxzKltBLVpfXVxcdyopKlxcYig/OlxccyooPzpcXFtcXHMqXFxdfDwoPzpbXjw+XXw8KD86W148Pl18PFtePD5dKj4pKj4pKj4pKSovLnNvdXJjZVxuXHRcdC5yZXBsYWNlKC88a2V5d29yZD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4ga2V5d29yZHMuc291cmNlOyB9KTtcblx0LyoqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuICovXG5cdGZ1bmN0aW9uIGluc2VydENsYXNzTmFtZShwYXR0ZXJuKSB7XG5cdFx0cmV0dXJuIFJlZ0V4cChwYXR0ZXJuLnJlcGxhY2UoLzxDTEFTUy1OQU1FPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBjbGFzc05hbWU7IH0pLCAnaScpO1xuXHR9XG5cblx0dmFyIGNsYXNzTmFtZUluc2lkZSA9IHtcblx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKClcXFtcXF17fTssOi48Pl0vXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmFwZXggPSB7XG5cdFx0J2NvbW1lbnQnOiBQcmlzbS5sYW5ndWFnZXMuY2xpa2UuY29tbWVudCxcblx0XHQnc3RyaW5nJzogUHJpc20ubGFuZ3VhZ2VzLmNsaWtlLnN0cmluZyxcblx0XHQnc3FsJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpbPSwoezpdfFxcYnJldHVybilcXHMqKVxcW1teXFxbXFxdXSpcXF0vaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2xhbmd1YWdlLXNxbCcsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5zcWxcblx0XHR9LFxuXG5cdFx0J2Fubm90YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvQFxcdytcXGIvLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBpbnNlcnRDbGFzc05hbWUoLyhcXGIoPzpjbGFzc3xlbnVtfGV4dGVuZHN8aW1wbGVtZW50c3xpbnN0YW5jZW9mfGludGVyZmFjZXxuZXd8dHJpZ2dlclxccytcXHcrXFxzK29uKVxccyspPENMQVNTLU5BTUU+Ly5zb3VyY2UpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGNsYXNzTmFtZUluc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gY2FzdFxuXHRcdFx0XHRwYXR0ZXJuOiBpbnNlcnRDbGFzc05hbWUoLyhcXChcXHMqKTxDTEFTUy1OQU1FPig/PVxccypcXClcXHMqW1xcdyhdKS8uc291cmNlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBjbGFzc05hbWVJbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIHZhcmlhYmxlL3BhcmFtZXRlciBkZWNsYXJhdGlvbiBhbmQgcmV0dXJuIHR5cGVzXG5cdFx0XHRcdHBhdHRlcm46IGluc2VydENsYXNzTmFtZSgvPENMQVNTLU5BTUU+KD89XFxzKlxcdytcXHMqWzs9LCgpezpdKS8uc291cmNlKSxcblx0XHRcdFx0aW5zaWRlOiBjbGFzc05hbWVJbnNpZGVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCd0cmlnZ2VyJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGJ0cmlnZ2VyXFxzKylcXHcrXFxiL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXG5cdFx0J251bWJlcic6IC8oPzpcXEJcXC5cXGQrfFxcYlxcZCsoPzpcXC5cXGQrfEwpPylcXGIvaSxcblx0XHQnb3BlcmF0b3InOiAvWyE9XSg/Oj09Pyk/fFxcP1xcLj98JiZ8XFx8XFx8fC0tfFxcK1xcK3xbLSsqL14mfF09P3w6fDw8Pz0/fD57MSwzfT0/Lyxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpXFxbXFxde307LC5dL1xuXHR9O1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5hcGwgPSB7XG5cdCdjb21tZW50JzogLyg/Olx1MjM1RHwjWyEgXSkuKiQvbSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlteJ1xcclxcbl18JycpKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnbnVtYmVyJzogL1x1MDBBRj8oPzpcXGQqXFwuP1xcYlxcZCsoPzplWytcdTAwQUZdP1xcZCspP3xcdTAwQUZ8XHUyMjFFKSg/OmpcdTAwQUY/KD86KD86XFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKSg/OmVbK1x1MDBBRl0/XFxkKyk/fFx1MDBBRnxcdTIyMUUpKT8vaSxcblx0J3N0YXRlbWVudCc6IC86W0EtWl1bYS16XVtBLVphLXpdKlxcYi8sXG5cdCdzeXN0ZW0tZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogL1x1MjM5NVtBLVpdKy9pLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdjb25zdGFudCc6IC9bXHUyMzZDXHUyMzNFI1x1MjM5NVx1MjM1RV0vLFxuXHQnZnVuY3Rpb24nOiAvWy0rXHUwMEQ3XHUwMEY3XHUyMzA4XHUyMzBBXHUyMjIzfFx1MjM3M1x1MjM3OD8qXHUyMzVGXHUyNUNCIVx1MjMzOTxcdTIyNjQ9Plx1MjI2NVx1MjI2MFx1MjI2MVx1MjI2Mlx1MjIwQVx1MjM3N1x1MjIyQVx1MjIyOX5cdTIyMjhcdTIyMjdcdTIzNzFcdTIzNzJcdTIzNzQsXHUyMzZBXHUyMzNEXHUyMjk2XHUyMzQ5XHUyMTkxXHUyMTkzXHUyMjgyXHUyMjgzXHUyMjg2XHUyMjg3XHUyMzM3XHUyMzRCXHUyMzUyXHUyMkE0XHUyMkE1XHUyMzU1XHUyMzRFXHUyMkEzXHUyMkEyXHUyMzQxXHUyMzQyXHUyMjQ4XHUyMzZGXHUyMTk3XHUwMEE0XHUyMTkyXS8sXG5cdCdtb25hZGljLW9wZXJhdG9yJzoge1xuXHRcdHBhdHRlcm46IC9bXFxcXFxcL1x1MjMzRlx1MjM0MFx1MDBBOFx1MjM2OFx1MjMzNiZcdTIyMjVdLyxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9LFxuXHQnZHlhZGljLW9wZXJhdG9yJzoge1xuXHRcdHBhdHRlcm46IC9bLlx1MjM2M1x1MjM2MFx1MjM2NFx1MjIxOFx1MjMzOEBcdTIzM0FcdTIzNjVdLyxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9LFxuXHQnYXNzaWdubWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXHUyMTkwLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9bXFxbO1xcXSgpXHUyNUM3XHUyMkM0XS8sXG5cdCdkZm4nOiB7XG5cdFx0cGF0dGVybjogL1t7fVx1MjM3QVx1MjM3NVx1MjM3Nlx1MjM3OVx1MjIwN1x1MjM2QjpdLyxcblx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdH1cbn07XG5cblByaXNtLmxhbmd1YWdlcy5hcHBsZXNjcmlwdCA9IHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0Ly8gQWxsb3cgb25lIGxldmVsIG9mIG5lc3Rpbmdcblx0XHQvXFwoXFwqKD86XFwoXFwqKD86W14qXXxcXCooPyFcXCkpKSpcXCpcXCl8KD8hXFwoXFwqKVtcXHNcXFNdKSo/XFwqXFwpLyxcblx0XHQvLS0uKy8sXG5cdFx0LyMuKy9cblx0XSxcblx0J3N0cmluZyc6IC9cIig/OlxcXFwufFteXCJcXFxcXFxyXFxuXSkqXCIvLFxuXHQnbnVtYmVyJzogLyg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplLT9cXGQrKT9cXGIvaSxcblx0J29wZXJhdG9yJzogW1xuXHRcdC9bJj1cdTIyNjBcdTIyNjRcdTIyNjUqK1xcLVxcL1x1MDBGN15dfFs8Pl09Py8sXG5cdFx0L1xcYig/Oig/OmJlZ2lufGVuZHxzdGFydClzPyB3aXRofCg/OmNvbnRhaW5zP3woPzpkb2VzIG5vdHxkb2Vzbid0KSBjb250YWluKXwoPzppc3xpc24ndHxpcyBub3QpICg/OmNvbnRhaW5lZCBieXxpbil8KD86KD86aXN8aXNuJ3R8aXMgbm90KSApPyg/OmdyZWF0ZXJ8bGVzcykgdGhhbig/OiBvciBlcXVhbCk/KD86IHRvKT98KD86Y29tZXN8KD86ZG9lcyBub3R8ZG9lc24ndCkgY29tZSkgKD86YWZ0ZXJ8YmVmb3JlKXwoPzppc3xpc24ndHxpcyBub3QpIGVxdWFsKD86IHRvKT98KD86KD86ZG9lcyBub3R8ZG9lc24ndCkgZXF1YWx8ZXF1YWwgdG98ZXF1YWxzfGlzIG5vdHxpc24ndCl8KD86YSApPyg/OnJlZig/OiB0byk/fHJlZmVyZW5jZSB0byl8KD86YW5kfGFzfGRpdnxtb2R8bm90fG9yKSlcXGIvXG5cdF0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFib3V0fGFib3ZlfGFmdGVyfGFnYWluc3R8YXBhcnQgZnJvbXxhcm91bmR8YXNpZGUgZnJvbXxhdHxiYWNrfGJlZm9yZXxiZWdpbm5pbmd8YmVoaW5kfGJlbG93fGJlbmVhdGh8YmVzaWRlfGJldHdlZW58YnV0fGJ5fGNvbnNpZGVyaW5nfGNvbnRpbnVlfGNvcHl8ZG9lc3xlaWdodGh8ZWxzZXxlbmR8ZXF1YWx8ZXJyb3J8ZXZlcnl8ZXhpdHxmYWxzZXxmaWZ0aHxmaXJzdHxmb3J8Zm91cnRofGZyb218ZnJvbnR8Z2V0fGdpdmVufGdsb2JhbHxpZnxpZ25vcmluZ3xpbnxpbnN0ZWFkIG9mfGludG98aXN8aXR8aXRzfGxhc3R8bG9jYWx8bWV8bWlkZGxlfG15fG5pbnRofG9mfG9ufG9udG98b3V0IG9mfG92ZXJ8cHJvcHxwcm9wZXJ0eXxwdXR8cmVwZWF0fHJldHVybnxyZXR1cm5pbmd8c2Vjb25kfHNldHxzZXZlbnRofHNpbmNlfHNpeHRofHNvbWV8dGVsbHx0ZW50aHx0aGF0fHRoZXx0aGVufHRoaXJkfHRocm91Z2h8dGhydXx0aW1lb3V0fHRpbWVzfHRvfHRyYW5zYWN0aW9ufHRydWV8dHJ5fHVudGlsfHdoZXJlfHdoaWxlfHdob3NlfHdpdGh8d2l0aG91dClcXGIvLFxuXHQnY2xhc3MtbmFtZSc6IC9cXGIoPzpQT1NJWCBmaWxlfFJHQiBjb2xvcnxhbGlhc3xhcHBsaWNhdGlvbnxib29sZWFufGNlbnRpbWV0ZXJzfGNlbnRpbWV0cmVzfGNsYXNzfGNvbnN0YW50fGN1YmljIGNlbnRpbWV0ZXJzfGN1YmljIGNlbnRpbWV0cmVzfGN1YmljIGZlZXR8Y3ViaWMgaW5jaGVzfGN1YmljIG1ldGVyc3xjdWJpYyBtZXRyZXN8Y3ViaWMgeWFyZHN8ZGF0ZXxkZWdyZWVzIENlbHNpdXN8ZGVncmVlcyBGYWhyZW5oZWl0fGRlZ3JlZXMgS2VsdmlufGZlZXR8ZmlsZXxnYWxsb25zfGdyYW1zfGluY2hlc3xpbnRlZ2VyfGtpbG9ncmFtc3xraWxvbWV0ZXJzfGtpbG9tZXRyZXN8bGlzdHxsaXRlcnN8bGl0cmVzfG1ldGVyc3xtZXRyZXN8bWlsZXN8bnVtYmVyfG91bmNlc3xwb3VuZHN8cXVhcnRzfHJlYWx8cmVjb3JkfHJlZmVyZW5jZXxzY3JpcHR8c3F1YXJlIGZlZXR8c3F1YXJlIGtpbG9tZXRlcnN8c3F1YXJlIGtpbG9tZXRyZXN8c3F1YXJlIG1ldGVyc3xzcXVhcmUgbWV0cmVzfHNxdWFyZSBtaWxlc3xzcXVhcmUgeWFyZHN8dGV4dHx5YXJkcylcXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9KCk6LFx1MDBBQ1x1MDBBQlx1MDBCQlx1MzAwQVx1MzAwQl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuYXFsID0ge1xuXHQnY29tbWVudCc6IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0J3Byb3BlcnR5Jzoge1xuXHRcdHBhdHRlcm46IC8oW3ssXVxccyopKD86KD8hXFxkKVxcdyt8KFtcIidcdTAwQjRgXSkoPzooPyFcXDIpW15cXFxcXFxyXFxuXXxcXFxcLikqXFwyKSg/PVxccyo6KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/Oig/IVxcMSlbXlxcXFxcXHJcXG5dfFxcXFwuKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnaWRlbnRpZmllcic6IHtcblx0XHRwYXR0ZXJuOiAvKFtcdTAwQjRgXSkoPzooPyFcXDEpW15cXFxcXFxyXFxuXXxcXFxcLikqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3ZhcmlhYmxlJzogL0BAP1xcdysvLFxuXHQna2V5d29yZCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYldJVEhcXHMrKUNPVU5UKD89XFxzK0lOVE9cXGIpL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvXFxiKD86QUdHUkVHQVRFfEFMTHxBTkR8QU5ZfEFTQ3xDT0xMRUNUfERFU0N8RElTVElOQ1R8RklMVEVSfEZPUnxHUkFQSHxJTnxJTkJPVU5EfElOU0VSVHxJTlRPfEtfUEFUSFN8S19TSE9SVEVTVF9QQVRIU3xMRVR8TElLRXxMSU1JVHxOT05FfE5PVHxOVUxMfE9SfE9VVEJPVU5EfFJFTU9WRXxSRVBMQUNFfFJFVFVSTnxTSE9SVEVTVF9QQVRIfFNPUlR8VVBEQVRFfFVQU0VSVHxXSU5ET1d8V0lUSClcXGIvaSxcblx0XHQvLyBwc2V1ZG8ga2V5d29yZHMgZ2V0IGEgbG9va2JlaGluZCB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXNcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHcuW10pKD86S0VFUHxQUlVORXxTRUFSQ0h8VE8pXFxiL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHcuW10pKD86Q1VSUkVOVHxORVd8T0xEKVxcYi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiT1BUSU9OUyg/PVxccypcXHspL2lcblx0XHR9XG5cdF0sXG5cdCdmdW5jdGlvbic6IC9cXGIoPyFcXGQpXFx3Kyg/PVxccypcXCgpLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblx0J3JhbmdlJzoge1xuXHRcdHBhdHRlcm46IC9cXC5cXC4vLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH0sXG5cdCdudW1iZXInOiBbXG5cdFx0L1xcYjBiWzAxXSsvaSxcblx0XHQvXFxiMHhbMC05YS1mXSsvaSxcblx0XHQvKD86XFxCXFwuXFxkK3xcXGIoPzowfFsxLTldXFxkKikoPzpcXC5cXGQrKT8pKD86ZVsrLV0/XFxkKyk/L2lcblx0XSxcblx0J29wZXJhdG9yJzogL1xcKnsyLH18Wz0hXX58WyE9PD5dPT98JiZ8XFx8XFx8fFstKyovJV0vLFxuXHQncHVuY3R1YXRpb24nOiAvOjp8Wz8uOiw7KClbXFxde31dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmMgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcLyg/OlteXFxyXFxuXFxcXF18XFxcXCg/Olxcclxcbj98XFxufCg/IVtcXHJcXG5dKSkpKnxcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHQvLyBodHRwczovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jL2xhbmd1YWdlL3N0cmluZ19saXRlcmFsXG5cdFx0cGF0dGVybjogL1wiKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cIlxcXFxcXHJcXG5dKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiKD86ZW51bXxzdHJ1Y3QpXFxzKyg/Ol9fYXR0cmlidXRlX19cXHMqXFwoXFwoW1xcc1xcU10qP1xcKVxcKVxccyopPylcXHcrfFxcYlthLXpdXFx3Kl90XFxiLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/Ol9BbGlnbmFzfF9BbGlnbm9mfF9BdG9taWN8X0Jvb2x8X0NvbXBsZXh8X0dlbmVyaWN8X0ltYWdpbmFyeXxfTm9yZXR1cm58X1N0YXRpY19hc3NlcnR8X1RocmVhZF9sb2NhbHxfX2F0dHJpYnV0ZV9ffGFzbXxhdXRvfGJyZWFrfGNhc2V8Y2hhcnxjb25zdHxjb250aW51ZXxkZWZhdWx0fGRvfGRvdWJsZXxlbHNlfGVudW18ZXh0ZXJufGZsb2F0fGZvcnxnb3RvfGlmfGlubGluZXxpbnR8bG9uZ3xyZWdpc3RlcnxyZXR1cm58c2hvcnR8c2lnbmVkfHNpemVvZnxzdGF0aWN8c3RydWN0fHN3aXRjaHx0eXBlZGVmfHR5cGVvZnx1bmlvbnx1bnNpZ25lZHx2b2lkfHZvbGF0aWxlfHdoaWxlKVxcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblx0J251bWJlcic6IC8oPzpcXGIweCg/OltcXGRhLWZdKyg/OlxcLltcXGRhLWZdKik/fFxcLltcXGRhLWZdKykoPzpwWystXT9cXGQrKT98KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspPylbZnVsXXswLDR9L2ksXG5cdCdvcGVyYXRvcic6IC8+Pj0/fDw8PT98LT58KFstKyZ8Ol0pXFwxfFs/On5dfFstKyovJSZ8XiE9PD5dPT8vXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnYycsICdzdHJpbmcnLCB7XG5cdCdjaGFyJzoge1xuXHRcdC8vIGh0dHBzOi8vZW4uY3BwcmVmZXJlbmNlLmNvbS93L2MvbGFuZ3VhZ2UvY2hhcmFjdGVyX2NvbnN0YW50XG5cdFx0cGF0dGVybjogLycoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXidcXFxcXFxyXFxuXSl7MCwzMn0nLyxcblx0XHRncmVlZHk6IHRydWVcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2MnLCAnc3RyaW5nJywge1xuXHQnbWFjcm8nOiB7XG5cdFx0Ly8gYWxsb3cgZm9yIG11bHRpbGluZSBtYWNybyBkZWZpbml0aW9uc1xuXHRcdC8vIHNwYWNlcyBhZnRlciB0aGUgIyBjaGFyYWN0ZXIgY29tcGlsZSBmaW5lIHdpdGggZ2NjXG5cdFx0cGF0dGVybjogLyheW1xcdCBdKikjXFxzKlthLXpdKD86W15cXHJcXG5cXFxcL118XFwvKD8hXFwqKXxcXC9cXCooPzpbXipdfFxcKig/IVxcLykpKlxcKlxcL3xcXFxcKD86XFxyXFxufFtcXHNcXFNdKSkqL2ltLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3N0cmluZyc6IFtcblx0XHRcdFx0e1xuXHRcdFx0XHRcdC8vIGhpZ2hsaWdodCB0aGUgcGF0aCBvZiB0aGUgaW5jbHVkZSBzdGF0ZW1lbnQgYXMgYSBzdHJpbmdcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXigjXFxzKmluY2x1ZGVcXHMqKTxbXj5dKz4vLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0UHJpc20ubGFuZ3VhZ2VzLmNbJ3N0cmluZyddXG5cdFx0XHRdLFxuXHRcdFx0J2NoYXInOiBQcmlzbS5sYW5ndWFnZXMuY1snY2hhciddLFxuXHRcdFx0J2NvbW1lbnQnOiBQcmlzbS5sYW5ndWFnZXMuY1snY29tbWVudCddLFxuXHRcdFx0J21hY3JvLW5hbWUnOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF4jXFxzKmRlZmluZVxccyspXFx3K1xcYig/IVxcKCkvaSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF4jXFxzKmRlZmluZVxccyspXFx3K1xcYig/PVxcKCkvaSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0XHRcdH1cblx0XHRcdF0sXG5cdFx0XHQvLyBoaWdobGlnaHQgbWFjcm8gZGlyZWN0aXZlcyBhcyBrZXl3b3Jkc1xuXHRcdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oI1xccyopW2Etel0rLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0fSxcblx0XHRcdCdkaXJlY3RpdmUtaGFzaCc6IC9eIy8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvIyN8XFxcXCg/PVtcXHJcXG5dKS8sXG5cdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcU1tcXHNcXFNdKi8sXG5cdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjJywgJ2Z1bmN0aW9uJywge1xuXHQvLyBoaWdobGlnaHQgcHJlZGVmaW5lZCBtYWNyb3MgYXMgY29uc3RhbnRzXG5cdCdjb25zdGFudCc6IC9cXGIoPzpFT0Z8TlVMTHxTRUVLX0NVUnxTRUVLX0VORHxTRUVLX1NFVHxfX0RBVEVfX3xfX0ZJTEVfX3xfX0xJTkVfX3xfX1RJTUVTVEFNUF9ffF9fVElNRV9ffF9fZnVuY19ffHN0ZGVycnxzdGRpbnxzdGRvdXQpXFxiL1xufSk7XG5cbmRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuY1snYm9vbGVhbiddO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGtleXdvcmQgPSAvXFxiKD86YWxpZ25hc3xhbGlnbm9mfGFzbXxhdXRvfGJvb2x8YnJlYWt8Y2FzZXxjYXRjaHxjaGFyfGNoYXIxNl90fGNoYXIzMl90fGNoYXI4X3R8Y2xhc3N8Y29fYXdhaXR8Y29fcmV0dXJufGNvX3lpZWxkfGNvbXBsfGNvbmNlcHR8Y29uc3R8Y29uc3RfY2FzdHxjb25zdGV2YWx8Y29uc3RleHByfGNvbnN0aW5pdHxjb250aW51ZXxkZWNsdHlwZXxkZWZhdWx0fGRlbGV0ZXxkb3xkb3VibGV8ZHluYW1pY19jYXN0fGVsc2V8ZW51bXxleHBsaWNpdHxleHBvcnR8ZXh0ZXJufGZpbmFsfGZsb2F0fGZvcnxmcmllbmR8Z290b3xpZnxpbXBvcnR8aW5saW5lfGludHxpbnQxNl90fGludDMyX3R8aW50NjRfdHxpbnQ4X3R8bG9uZ3xtb2R1bGV8bXV0YWJsZXxuYW1lc3BhY2V8bmV3fG5vZXhjZXB0fG51bGxwdHJ8b3BlcmF0b3J8b3ZlcnJpZGV8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJlZ2lzdGVyfHJlaW50ZXJwcmV0X2Nhc3R8cmVxdWlyZXN8cmV0dXJufHNob3J0fHNpZ25lZHxzaXplb2Z8c3RhdGljfHN0YXRpY19hc3NlcnR8c3RhdGljX2Nhc3R8c3RydWN0fHN3aXRjaHx0ZW1wbGF0ZXx0aGlzfHRocmVhZF9sb2NhbHx0aHJvd3x0cnl8dHlwZWRlZnx0eXBlaWR8dHlwZW5hbWV8dWludDE2X3R8dWludDMyX3R8dWludDY0X3R8dWludDhfdHx1bmlvbnx1bnNpZ25lZHx1c2luZ3x2aXJ0dWFsfHZvaWR8dm9sYXRpbGV8d2NoYXJfdHx3aGlsZSlcXGIvO1xuXHR2YXIgbW9kTmFtZSA9IC9cXGIoPyE8a2V5d29yZD4pXFx3Kyg/OlxccypcXC5cXHMqXFx3KykqXFxiLy5zb3VyY2UucmVwbGFjZSgvPGtleXdvcmQ+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGtleXdvcmQuc291cmNlOyB9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuY3BwID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnYycsIHtcblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXFxiKD86Y2xhc3N8Y29uY2VwdHxlbnVtfHN0cnVjdHx0eXBlbmFtZSlcXHMrKSg/ITxrZXl3b3JkPilcXHcrLy5zb3VyY2Vcblx0XHRcdFx0XHQucmVwbGFjZSgvPGtleXdvcmQ+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGtleXdvcmQuc291cmNlOyB9KSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQvLyBUaGlzIGlzIGludGVuZGVkIHRvIGNhcHR1cmUgdGhlIGNsYXNzIG5hbWUgb2YgbWV0aG9kIGltcGxlbWVudGF0aW9ucyBsaWtlOlxuXHRcdFx0Ly8gICB2b2lkIGZvbzo6YmFyKCkgY29uc3Qge31cblx0XHRcdC8vIEhvd2V2ZXIhIFRoZSBgZm9vYCBpbiB0aGUgYWJvdmUgZXhhbXBsZSBjb3VsZCBhbHNvIGJlIGEgbmFtZXNwYWNlLCBzbyB3ZSBvbmx5IGNhcHR1cmUgdGhlIGNsYXNzIG5hbWUgaWZcblx0XHRcdC8vIGl0IHN0YXJ0cyB3aXRoIGFuIHVwcGVyY2FzZSBsZXR0ZXIuIFRoaXMgYXBwcm94aW1hdGlvbiBzaG91bGQgZ2l2ZSBkZWNlbnQgcmVzdWx0cy5cblx0XHRcdC9cXGJbQS1aXVxcdyooPz1cXHMqOjpcXHMqXFx3K1xccypcXCgpLyxcblx0XHRcdC8vIFRoaXMgd2lsbCBjYXB0dXJlIHRoZSBjbGFzcyBuYW1lIGJlZm9yZSBkZXN0cnVjdG9ycyBsaWtlOlxuXHRcdFx0Ly8gICBGb286On5Gb28oKSB7fVxuXHRcdFx0L1xcYltBLVpfXVxcdyooPz1cXHMqOjpcXHMqflxcdytcXHMqXFwoKS9pLFxuXHRcdFx0Ly8gVGhpcyBhbHNvIGludGVuZHMgdG8gY2FwdHVyZSB0aGUgY2xhc3MgbmFtZSBvZiBtZXRob2QgaW1wbGVtZW50YXRpb25zIGJ1dCBoZXJlIHRoZSBjbGFzcyBoYXMgdGVtcGxhdGVcblx0XHRcdC8vIHBhcmFtZXRlcnMsIHNvIGl0IGNhbid0IGJlIGEgbmFtZXNwYWNlICh1bnRpbCBDKysgYWRkcyBnZW5lcmljIG5hbWVzcGFjZXMpLlxuXHRcdFx0L1xcYlxcdysoPz1cXHMqPCg/OltePD5dfDwoPzpbXjw+XXw8W148Pl0qPikqPikqPlxccyo6OlxccypcXHcrXFxzKlxcKCkvXG5cdFx0XSxcblx0XHQna2V5d29yZCc6IGtleXdvcmQsXG5cdFx0J251bWJlcic6IHtcblx0XHRcdHBhdHRlcm46IC8oPzpcXGIwYlswMSddK3xcXGIweCg/OltcXGRhLWYnXSsoPzpcXC5bXFxkYS1mJ10qKT98XFwuW1xcZGEtZiddKykoPzpwWystXT9bXFxkJ10rKT98KD86XFxiW1xcZCddKyg/OlxcLltcXGQnXSopP3xcXEJcXC5bXFxkJ10rKSg/OmVbKy1dP1tcXGQnXSspPylbZnVsXXswLDR9L2ksXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdvcGVyYXRvcic6IC8+Pj0/fDw8PT98LT58LS18XFwrXFwrfCYmfFxcfFxcfHxbPzp+XXw8PT58Wy0rKi8lJnxeIT08Pl09P3xcXGIoPzphbmR8YW5kX2VxfGJpdGFuZHxiaXRvcnxub3R8bm90X2VxfG9yfG9yX2VxfHhvcnx4b3JfZXEpXFxiLyxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3BwJywgJ3N0cmluZycsIHtcblx0XHQnbW9kdWxlJzoge1xuXHRcdFx0Ly8gaHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL21vZHVsZXNcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0LyhcXGIoPzppbXBvcnR8bW9kdWxlKVxccyspLy5zb3VyY2UgK1xuXHRcdFx0XHQnKD86JyArXG5cdFx0XHRcdC8vIGhlYWRlci1uYW1lXG5cdFx0XHRcdC9cIig/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXCJcXFxcXFxyXFxuXSkqXCJ8PFtePD5cXHJcXG5dKj4vLnNvdXJjZSArXG5cdFx0XHRcdCd8JyArXG5cdFx0XHRcdC8vIG1vZHVsZSBuYW1lIG9yIHBhcnRpdGlvbiBvciBib3RoXG5cdFx0XHRcdC88bW9kLW5hbWU+KD86XFxzKjpcXHMqPG1vZC1uYW1lPik/fDpcXHMqPG1vZC1uYW1lPi8uc291cmNlLnJlcGxhY2UoLzxtb2QtbmFtZT4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gbW9kTmFtZTsgfSkgK1xuXHRcdFx0XHQnKSdcblx0XHRcdCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdzdHJpbmcnOiAvXls8XCJdW1xcc1xcU10rLyxcblx0XHRcdFx0J29wZXJhdG9yJzogLzovLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3Jhdy1zdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvUlwiKFteKClcXFxcIF17MCwxNn0pXFwoW1xcc1xcU10qP1xcKVxcMVwiLyxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3BwJywgJ2tleXdvcmQnLCB7XG5cdFx0J2dlbmVyaWMtZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD8hb3BlcmF0b3JcXGIpW2Etel9dXFx3Klxccyo8KD86W148Pl18PFtePD5dKj4pKj4oPz1cXHMqXFwoKS9pLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmdW5jdGlvbic6IC9eXFx3Ky8sXG5cdFx0XHRcdCdnZW5lcmljJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC88W1xcc1xcU10rLyxcblx0XHRcdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNwcFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjcHAnLCAnb3BlcmF0b3InLCB7XG5cdFx0J2RvdWJsZS1jb2xvbic6IHtcblx0XHRcdHBhdHRlcm46IC86Oi8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3BwJywgJ2NsYXNzLW5hbWUnLCB7XG5cdFx0Ly8gdGhlIGJhc2UgY2xhdXNlIGlzIGFuIG9wdGlvbmFsIGxpc3Qgb2YgcGFyZW50IGNsYXNzZXNcblx0XHQvLyBodHRwczovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbGFuZ3VhZ2UvY2xhc3Ncblx0XHQnYmFzZS1jbGF1c2UnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmNsYXNzfHN0cnVjdClcXHMrXFx3K1xccyo6XFxzKilbXjt7fVwiJ1xcc10rKD86XFxzK1teO3t9XCInXFxzXSspKig/PVxccypbO3tdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjcHAnLCB7fSlcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2luc2lkZScsICdkb3VibGUtY29sb24nLCB7XG5cdFx0Ly8gQWxsIHVudG9rZW5pemVkIHdvcmRzIHRoYXQgYXJlIG5vdCBuYW1lc3BhY2VzIHNob3VsZCBiZSBjbGFzcyBuYW1lc1xuXHRcdCdjbGFzcy1uYW1lJzogL1xcYlthLXpfXVxcdypcXGIoPyFcXHMqOjopL2lcblx0fSwgUHJpc20ubGFuZ3VhZ2VzLmNwcFsnYmFzZS1jbGF1c2UnXSk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmFyZHVpbm8gPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjcHAnLCB7XG5cdCdrZXl3b3JkJzogL1xcYig/OlN0cmluZ3xhcnJheXxib29sfGJvb2xlYW58YnJlYWt8Ynl0ZXxjYXNlfGNhdGNofGNvbnRpbnVlfGRlZmF1bHR8ZG98ZG91YmxlfGVsc2V8ZmluYWxseXxmb3J8ZnVuY3Rpb258Z290b3xpZnxpbnxpbnN0YW5jZW9mfGludHxpbnRlZ2VyfGxvbmd8bG9vcHxuZXd8bnVsbHxyZXR1cm58c2V0dXB8c3RyaW5nfHN3aXRjaHx0aHJvd3x0cnl8dm9pZHx3aGlsZXx3b3JkKVxcYi8sXG5cdCdjb25zdGFudCc6IC9cXGIoPzpBTkFMT0dfTUVTU0FHRXxERUZBVUxUfERJR0lUQUxfTUVTU0FHRXxFWFRFUk5BTHxGSVJNQVRBX1NUUklOR3xISUdIfElOUFVUfElOUFVUX1BVTExVUHxJTlRFUk5BTHxJTlRFUk5BTDFWMXxJTlRFUk5BTDJWNTZ8TEVEX0JVSUxUSU58TE9XfE9VVFBVVHxSRVBPUlRfQU5BTE9HfFJFUE9SVF9ESUdJVEFMfFNFVF9QSU5fTU9ERXxTWVNFWF9TVEFSVHxTWVNURU1fUkVTRVQpXFxiLyxcblx0J2J1aWx0aW4nOiAvXFxiKD86QXVkaW98QlNTSUR8QnJpZGdlfENsaWVudHxDb25zb2xlfEVFUFJPTXxFc3Bsb3JhfEVzcGxvcmFURlR8RXRoZXJuZXR8RXRoZXJuZXRDbGllbnR8RXRoZXJuZXRTZXJ2ZXJ8RXRoZXJuZXRVRFB8RmlsZXxGaWxlSU98RmlsZVN5c3RlbXxGaXJtYXRhfEdQUlN8R1NNfEdTTUJhbmR8R1NNQ2xpZW50fEdTTU1vZGVtfEdTTVBJTnxHU01TY2FubmVyfEdTTVNlcnZlcnxHU01Wb2ljZUNhbGx8R1NNX1NNU3xIdHRwQ2xpZW50fElQQWRkcmVzc3xJUnJlYWR8S2V5Ym9hcmR8S2V5Ym9hcmRDb250cm9sbGVyfExpcXVpZENyeXN0YWx8TGlxdWlkQ3J5c3RhbF9JMkN8TWFpbGJveHxNb3VzZXxNb3VzZUNvbnRyb2xsZXJ8UEltYWdlfFByb2Nlc3N8UlNTSXxSb2JvdENvbnRyb2x8Um9ib3RNb3RvcnxTRHxTUEl8U1NJRHxTY2hlZHVsZXJ8U2VyaWFsfFNlcnZlcnxTZXJ2b3xTb2Z0d2FyZVNlcmlhbHxTdGVwcGVyfFN0cmVhbXxURlR8VGFza3xVU0JIb3N0fFdpRml8V2lGaUNsaWVudHxXaUZpU2VydmVyfFdpRmlVRFB8V2lyZXxZdW5DbGllbnR8WXVuU2VydmVyfGFic3xhZGRQYXJhbWV0ZXJ8YW5hbG9nUmVhZHxhbmFsb2dSZWFkUmVzb2x1dGlvbnxhbmFsb2dSZWZlcmVuY2V8YW5hbG9nV3JpdGV8YW5hbG9nV3JpdGVSZXNvbHV0aW9ufGFuc3dlckNhbGx8YXR0YWNofGF0dGFjaEdQUlN8YXR0YWNoSW50ZXJydXB0fGF0dGFjaGVkfGF1dG9zY3JvbGx8YXZhaWxhYmxlfGJhY2tncm91bmR8YmVlcHxiZWdpbnxiZWdpblBhY2tldHxiZWdpblNEfGJlZ2luU01TfGJlZ2luU3BlYWtlcnxiZWdpblRGVHxiZWdpblRyYW5zbWlzc2lvbnxiZWdpbldyaXRlfGJpdHxiaXRDbGVhcnxiaXRSZWFkfGJpdFNldHxiaXRXcml0ZXxibGlua3xibGlua1ZlcnNpb258YnVmZmVyfGNoYW5nZVBJTnxjaGVja1BJTnxjaGVja1BVS3xjaGVja1JlZ3xjaXJjbGV8Y2l0eU5hbWVSZWFkfGNpdHlOYW1lV3JpdGV8Y2xlYXJ8Y2xlYXJTY3JlZW58Y2xpY2t8Y2xvc2V8Y29tcGFzc1JlYWR8Y29uZmlnfGNvbm5lY3R8Y29ubmVjdGVkfGNvbnN0cmFpbnxjb3N8Y291bnRyeU5hbWVSZWFkfGNvdW50cnlOYW1lV3JpdGV8Y3JlYXRlQ2hhcnxjdXJzb3J8ZGVidWdQcmludHxkZWxheXxkZWxheU1pY3Jvc2Vjb25kc3xkZXRhY2h8ZGV0YWNoSW50ZXJydXB0fGRpZ2l0YWxSZWFkfGRpZ2l0YWxXcml0ZXxkaXNjb25uZWN0fGRpc3BsYXl8ZGlzcGxheUxvZ29zfGRyYXdCTVB8ZHJhd0NvbXBhc3N8ZW5jcnlwdGlvblR5cGV8ZW5kfGVuZFBhY2tldHxlbmRTTVN8ZW5kVHJhbnNtaXNzaW9ufGVuZFdyaXRlfGV4aXN0c3xleGl0VmFsdWV8ZmlsbHxmaW5kfGZpbmRVbnRpbHxmbHVzaHxnYXRld2F5SVB8Z2V0fGdldEFzeW5jaHJvbm91c2x5fGdldEJhbmR8Z2V0QnV0dG9ufGdldEN1cnJlbnRDYXJyaWVyfGdldElNRUl8Z2V0S2V5fGdldE1vZGlmaWVyc3xnZXRPZW1LZXl8Z2V0UElOVXNlZHxnZXRSZXN1bHR8Z2V0U2lnbmFsU3RyZW5ndGh8Z2V0U29ja2V0fGdldFZvaWNlQ2FsbFN0YXR1c3xnZXRYQ2hhbmdlfGdldFlDaGFuZ2V8aGFuZ0NhbGx8aGVpZ2h0fGhpZ2hCeXRlfGhvbWV8aW1hZ2V8aW50ZXJydXB0c3xpc0FjdGlvbkRvbmV8aXNEaXJlY3Rvcnl8aXNMaXN0ZW5pbmd8aXNQSU58aXNQcmVzc2VkfGlzVmFsaWR8a2V5UHJlc3NlZHxrZXlSZWxlYXNlZHxrZXlib2FyZFJlYWR8a25vYlJlYWR8bGVmdFRvUmlnaHR8bGluZXxsaW5lRm9sbG93Q29uZmlnfGxpc3RlbnxsaXN0ZW5PbkxvY2FsaG9zdHxsb2FkSW1hZ2V8bG9jYWxJUHxsb3dCeXRlfG1hY0FkZHJlc3N8bWFpbnRhaW58bWFwfG1heHxtZXNzYWdlQXZhaWxhYmxlfG1pY3Jvc3xtaWxsaXN8bWlufG1rZGlyfG1vdG9yc1N0b3B8bW90b3JzV3JpdGV8bW91c2VEcmFnZ2VkfG1vdXNlTW92ZWR8bW91c2VQcmVzc2VkfG1vdXNlUmVsZWFzZWR8bW92ZXxub0F1dG9zY3JvbGx8bm9CbGlua3xub0J1ZmZlcnxub0N1cnNvcnxub0Rpc3BsYXl8bm9GaWxsfG5vSW50ZXJydXB0c3xub0xpc3Rlbk9uTG9jYWxob3N0fG5vU3Ryb2tlfG5vVG9uZXxvblJlY2VpdmV8b25SZXF1ZXN0fG9wZW58b3Blbk5leHRGaWxlfG92ZXJmbG93fHBhcnNlQ29tbWFuZHxwYXJzZUZsb2F0fHBhcnNlSW50fHBhcnNlUGFja2V0fHBhdXNlTW9kZXxwZWVrfHBpbk1vZGV8cGxheUZpbGV8cGxheU1lbG9keXxwb2ludHxwb2ludFRvfHBvc2l0aW9ufHBvd3xwcmVwYXJlfHByZXNzfHByaW50fHByaW50RmlybXdhcmVWZXJzaW9ufHByaW50VmVyc2lvbnxwcmludGxufHByb2Nlc3N8cHJvY2Vzc0lucHV0fHB1bHNlSW58cHV0fHJhbmRvbXxyYW5kb21TZWVkfHJlYWR8cmVhZEFjY2VsZXJvbWV0ZXJ8cmVhZEJsdWV8cmVhZEJ1dHRvbnxyZWFkQnl0ZXN8cmVhZEJ5dGVzVW50aWx8cmVhZEdyZWVufHJlYWRKb3lzdGlja0J1dHRvbnxyZWFkSm95c3RpY2tTd2l0Y2h8cmVhZEpveXN0aWNrWHxyZWFkSm95c3RpY2tZfHJlYWRMaWdodFNlbnNvcnxyZWFkTWVzc2FnZXxyZWFkTWljcm9waG9uZXxyZWFkTmV0d29ya3N8cmVhZFJlZHxyZWFkU2xpZGVyfHJlYWRTdHJpbmd8cmVhZFN0cmluZ1VudGlsfHJlYWRUZW1wZXJhdHVyZXxyZWFkeXxyZWN0fHJlbGVhc2V8cmVsZWFzZUFsbHxyZW1vdGVJUHxyZW1vdGVOdW1iZXJ8cmVtb3RlUG9ydHxyZW1vdmV8cmVxdWVzdEZyb218cmV0cmlldmVDYWxsaW5nTnVtYmVyfHJld2luZERpcmVjdG9yeXxyaWdodFRvTGVmdHxybWRpcnxyb2JvdE5hbWVSZWFkfHJvYm90TmFtZVdyaXRlfHJ1bnxydW5Bc3luY2hyb25vdXNseXxydW5TaGVsbENvbW1hbmR8cnVuU2hlbGxDb21tYW5kQXN5bmNocm9ub3VzbHl8cnVubmluZ3xzY2FuTmV0d29ya3N8c2Nyb2xsRGlzcGxheUxlZnR8c2Nyb2xsRGlzcGxheVJpZ2h0fHNlZWt8c2VuZEFuYWxvZ3xzZW5kRGlnaXRhbFBvcnRQYWlyfHNlbmREaWdpdGFsUG9ydHN8c2VuZFN0cmluZ3xzZW5kU3lzZXh8c2VyaWFsRXZlbnR8c2V0QmFuZHxzZXRCaXRPcmRlcnxzZXRDbG9ja0RpdmlkZXJ8c2V0Q3Vyc29yfHNldEROU3xzZXREYXRhTW9kZXxzZXRGaXJtd2FyZVZlcnNpb258c2V0TW9kZXxzZXRQSU5Vc2VkfHNldFNwZWVkfHNldFRleHRTaXplfHNldFRpbWVvdXR8c2hpZnRJbnxzaGlmdE91dHxzaHV0ZG93bnxzaW58c2l6ZXxzcXJ0fHN0YXJ0TG9vcHxzdGVwfHN0b3B8c3Ryb2tlfHN1Ym5ldE1hc2t8c3dpdGNoUElOfHRhbnx0ZW1wb1dyaXRlfHRleHR8dG9uZXx0cmFuc2Zlcnx0dW5lV3JpdGV8dHVybnx1cGRhdGVJUnx1c2VyTmFtZVJlYWR8dXNlck5hbWVXcml0ZXx2b2ljZUNhbGx8d2FpdENvbnRpbnVlfHdpZHRofHdyaXRlfHdyaXRlQmx1ZXx3cml0ZUdyZWVufHdyaXRlSlNPTnx3cml0ZU1lc3NhZ2V8d3JpdGVNaWNyb3NlY29uZHN8d3JpdGVSR0J8d3JpdGVSZWR8eWllbGQpXFxiL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbm8gPSBQcmlzbS5sYW5ndWFnZXMuYXJkdWlubztcblxuUHJpc20ubGFuZ3VhZ2VzLmFyZmYgPSB7XG5cdCdjb21tZW50JzogLyUuKi8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInXSkoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvQCg/OmF0dHJpYnV0ZXxkYXRhfGVuZHxyZWxhdGlvbilcXGIvaSxcblx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKyk/XFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fSxdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmFybWFzbSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLzsuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cIlxcclxcbl18XCJcIikqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFteJF0pKD86XFwkezJ9KSopXFwkXFx3Ky8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdjaGFyJzoge1xuXHRcdHBhdHRlcm46IC8nKD86W14nXFxyXFxuXXswLDR9fCcnKScvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndmVyc2lvbi1zeW1ib2wnOiB7XG5cdFx0cGF0dGVybjogL1xcfFtcXHdAXStcXHwvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXG5cdCdib29sZWFuJzogL1xcYig/OkZBTFNFfFRSVUUpXFxiLyxcblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86QUxJQVN8QUxJR058QVJFQXxBUk18QVNTRVJUfEFUVFJ8Q058Q09ERXxDT0RFMTZ8Q09ERTMyfENPTU1PTnxDUHxEQVRBfERDQnxEQ0R8RENET3xEQ0RVfERDRkR8RENGRFV8RENJfERDUXxEQ1FVfERDV3xEQ1dVfEROfEVMSUZ8RUxTRXxFTkR8RU5ERlVOQ3xFTkRJRnxFTkRQfEVOVFJZfEVRVXxFWFBPUlR8RVhQT1JUQVN8RVhURVJOfEZJRUxEfEZJTEx8Rk58RlVOQ1RJT058R0JMQXxHQkxMfEdCTFN8R0VUfEdMT0JBTHxJRnxJTVBPUlR8SU5DQklOfElOQ0xVREV8SU5GT3xLRUVQfExDTEF8TENMTHxMQ0xTfExUT1JHfE1BQ1JPfE1BUHxNRU5EfE1FWElUfE5PRlB8T1BUfFBSRVNFUlZFOHxQUk9DfFFOfFJFQURPTkxZfFJFTE9DfFJFUVVJUkV8UkVRVUlSRTh8UkxJU1R8Uk9VVHxTRVRBfFNFVEx8U0VUU3xTTnxTUEFDRXxTVUJUfFRIVU1CfFRIVU1CWHxUVEx8V0VORHxXSElMRSlcXGIvLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCdpbnN0cnVjdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58KD86XnxbXlxcXFxdKSg/Olxcclxcbj98XFxuKSlbIFxcdF0qKD86KD86W0EtWl1bQS1aMC05X10qW2Etel1cXHcqfFthLXpdXFx3KnxcXGQrKVsgXFx0XSspPylcXGJbQS1aLl0rXFxiLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J3ZhcmlhYmxlJzogL1xcJFxcdysvLFxuXG5cdCdudW1iZXInOiAvKD86XFxiWzItOV1fXFxkK3woPzpcXGJcXGQrKD86XFwuXFxkKyk/fFxcQlxcLlxcZCspKD86ZS0/XFxkKyk/fFxcYjAoPzpbZmRdX3x4KVswLTlhLWZdK3wmWzAtOWEtZl0rKVxcYi9pLFxuXG5cdCdyZWdpc3Rlcic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86clxcZHxscilcXGIvLFxuXHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHR9LFxuXG5cdCdvcGVyYXRvcic6IC88Pnw8PHw+PnwmJnxcXHxcXHx8Wz0hPD4vXT0/fFsrXFwtKiUjPyZ8Xl18OltBLVpdKzovLFxuXHQncHVuY3R1YXRpb24nOiAvWygpW1xcXSxdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzWydhcm0tYXNtJ10gPSBQcmlzbS5sYW5ndWFnZXMuYXJtYXNtO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuXHQgKi9cblx0dmFyIGNyZWF0ZUxhbmd1YWdlU3RyaW5nID0gZnVuY3Rpb24gKGxhbmcsIHBhdHRlcm4pIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC9cXHshLy5zb3VyY2UgKyAnKD86JyArIChwYXR0ZXJuIHx8IGxhbmcpICsgJyknICsgLyRbXFxzXFxTXSpcXH0vLnNvdXJjZSwgJ20nKSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZW1iZWRkZWQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheXFx7IVxcdytcXGIpW1xcc1xcU10rKD89XFx9JCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS0nICsgbGFuZyxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlc1tsYW5nXVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHRcdH1cblx0XHR9O1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5hcnR1cm8gPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvOy4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnY2hhcmFjdGVyJzoge1xuXHRcdFx0cGF0dGVybjogL2AuYC8sXG5cdFx0XHRhbGlhczogJ2NoYXInLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblxuXHRcdCdudW1iZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiXFxkKyg/OlxcLlxcZCsoPzpcXC5cXGQrKD86LVtcXHcrLV0rKT8pPyk/XFxiLyxcblx0XHR9LFxuXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXFxyXFxuXXxcXFxcLikqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblxuXHRcdCdyZWdleCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXHtcXC8uKj9cXC9cXH0vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblxuXHRcdCdodG1sLXN0cmluZyc6IGNyZWF0ZUxhbmd1YWdlU3RyaW5nKCdodG1sJyksXG5cdFx0J2Nzcy1zdHJpbmcnOiBjcmVhdGVMYW5ndWFnZVN0cmluZygnY3NzJyksXG5cdFx0J2pzLXN0cmluZyc6IGNyZWF0ZUxhbmd1YWdlU3RyaW5nKCdqcycpLFxuXHRcdCdtZC1zdHJpbmcnOiBjcmVhdGVMYW5ndWFnZVN0cmluZygnbWQnKSxcblx0XHQnc3FsLXN0cmluZyc6IGNyZWF0ZUxhbmd1YWdlU3RyaW5nKCdzcWwnKSxcblx0XHQnc2gtc3RyaW5nJzogY3JlYXRlTGFuZ3VhZ2VTdHJpbmcoJ3NoZWxsJywgJ3NoJyksXG5cblx0XHQnbXVsdGlzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXHUwMEJCLip8XFx7OltcXHNcXFNdKj86XFx9fFxce1tcXHNcXFNdKj9cXH18Xi17Nn0kW1xcc1xcU10qL20sXG5cdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXG5cdFx0J2xhYmVsJzoge1xuXHRcdFx0cGF0dGVybjogL1xcdytcXGJcXD8/Oi8sXG5cdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdH0sXG5cblx0XHQnbGl0ZXJhbCc6IHtcblx0XHRcdHBhdHRlcm46IC8nKD86XFx3K1xcYlxcPz86PykvLFxuXHRcdFx0YWxpYXM6ICdjb25zdGFudCdcblx0XHR9LFxuXG5cdFx0J3R5cGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvOig/OlxcdytcXGJcXD8/Oj8pLyxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHR9LFxuXG5cdFx0J2NvbG9yJzogLyNcXHcrLyxcblxuXHRcdCdwcmVkaWNhdGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86YWxsfGFuZHxhbnl8YXNjaWl8YXR0cnxhdHRyaWJ1dGV8YXR0cmlidXRlTGFiZWx8YmluYXJ5fGJsb2NrfGNoYXJ8Y29udGFpbnN8ZGF0YWJhc2V8ZGF0ZXxkaWN0aW9uYXJ5fGVtcHR5fGVxdWFsfGV2ZW58ZXZlcnl8ZXhpc3RzfGZhbHNlfGZsb2F0aW5nfGZ1bmN0aW9ufGdyZWF0ZXJ8Z3JlYXRlck9yRXF1YWx8aWZ8aW58aW5saW5lfGludGVnZXJ8aXN8a2V5fGxhYmVsfGxlYXB8bGVzc3xsZXNzT3JFcXVhbHxsaXRlcmFsfGxvZ2ljYWx8bG93ZXJ8bmFuZHxuZWdhdGl2ZXxub3J8bm90fG5vdEVxdWFsfG51bGx8bnVtZXJpY3xvZGR8b3J8cGF0aHxwYXRoTGFiZWx8cG9zaXRpdmV8cHJlZml4fHByaW1lfHJlZ2V4fHNhbWV8c2V0fHNvbWV8c29ydGVkfHN0YW5kYWxvbmV8c3RyaW5nfHN1YnNldHxzdWZmaXh8c3VwZXJzZXR8c3ltYm9sfHN5bWJvbExpdGVyYWx8dHJ1ZXx0cnl8dHlwZXx1bmxlc3N8dXBwZXJ8d2hlbnx3aGl0ZXNwYWNlfHdvcmR8eG5vcnx4b3J8emVybylcXD8vLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cblx0XHQnYnVpbHRpbi1mdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzphYnN8YWNvc3xhY29zaHxhY3NlY3xhY3NlY2h8YWN0YW58YWN0YW5ofGFkZHxhZnRlcnxhbGVydHxhbGlhc3xhbmR8YW5nbGV8YXBwZW5kfGFyZ3xhcmdzfGFyaXR5fGFycmF5fGFzfGFzZWN8YXNlY2h8YXNpbnxhc2luaHxhdGFufGF0YW4yfGF0YW5ofGF0dHJ8YXR0cnN8YXZlcmFnZXxiZWZvcmV8YmVuY2htYXJrfGJsZW5kfGJyZWFrfGNhbGx8Y2FwaXRhbGl6ZXxjYXNlfGNlaWx8Y2hvcHxjbGVhcnxjbGlwfGNsb3NlfGNvbG9yfGNvbWJpbmV8Y29uanxjb250aW51ZXxjb3B5fGNvc3xjb3NofGNyY3xjc2VjfGNzZWNofGN0YW58Y3Rhbmh8Y3Vyc29yfGRhcmtlbnxkZWN8ZGVjb2RlfGRlZmluZXxkZWxldGV8ZGVzYXR1cmF0ZXxkZXZpYXRpb258ZGlhbG9nfGRpY3Rpb25hcnl8ZGlmZmVyZW5jZXxkaWdlc3R8ZGlnaXRzfGRpdnxkb3xkb3dubG9hZHxkcm9wfGR1cHxlfGVsc2V8ZW1wdHl8ZW5jb2RlfGVuc3VyZXxlbnZ8ZXNjYXBlfGV4ZWN1dGV8ZXhpdHxleHB8ZXh0ZW5kfGV4dHJhY3R8ZmFjdG9yc3xmZGl2fGZpbHRlcnxmaXJzdHxmbGF0dGVufGZsb29yfGZvbGR8ZnJvbXxmdW5jdGlvbnxnYW1tYXxnY2R8Z2V0fGdvdG98aGFzaHxoeXBvdHxpZnxpbmN8aW5kZW50fGluZGV4fGluZmluaXR5fGluZm98aW5wdXR8aW5zZXJ0fGluc3BlY3R8aW50ZXJzZWN0aW9ufGludmVydHxqYXJvfGpvaW58a2V5c3xrdXJ0b3Npc3xsYXN0fGxldHxsZXZlbnNodGVpbnxsaWdodGVufGxpc3R8bG58bG9nfGxvb3B8bG93ZXJ8bWFpbHxtYXB8bWF0Y2h8bWF4fG1lZGlhbnxtaW58bW9kfG1vZHVsZXxtdWx8bmFuZHxuZWd8bmV3fG5vcnxub3JtYWxpemV8bm90fG5vd3xudWxsfG9wZW58b3J8b3V0ZGVudHxwYWR8cGFsZXR0ZXxwYW5pY3xwYXRofHBhdXNlfHBlcm1pc3Npb25zfHBlcm11dGF0ZXxwaXxwb3B8cG9wdXB8cG93fHBvd2Vyc2V0fHBvd21vZHxwcmVmaXh8cHJpbnR8cHJpbnRzfHByb2Nlc3N8cHJvZHVjdHxxdWVyeXxyYW5kb218cmFuZ2V8cmVhZHxyZWxhdGl2ZXxyZW1vdmV8cmVuYW1lfHJlbmRlcnxyZXBlYXR8cmVwbGFjZXxyZXF1ZXN0fHJldHVybnxyZXZlcnNlfHJvdW5kfHNhbXBsZXxzYXR1cmF0ZXxzY3JpcHR8c2VjfHNlY2h8c2VsZWN0fHNlcnZlfHNldHxzaGx8c2hyfHNodWZmbGV8c2lufHNpbmh8c2l6ZXxza2V3bmVzc3xzbGljZXxzb3J0fHNwaW58c3BsaXR8c3FydHxzcXVlZXplfHN0YWNrfHN0cmlwfHN1YnxzdWZmaXh8c3VtfHN3aXRjaHxzeW1ib2xzfHN5bWxpbmt8c3lzfHRha2V8dGFufHRhbmh8dGVybWluYWx8dGVybWluYXRlfHRvfHRydW5jYXRlfHRyeXx0eXBlfHVuY2xpcHx1bmlvbnx1bmlxdWV8dW5sZXNzfHVudGlsfHVuemlwfHVwcGVyfHZhbHVlc3x2YXJ8dmFyaWFuY2V8dm9sdW1lfHdlYnZpZXd8d2hpbGV8d2l0aHx3b3Jkd3JhcHx3cml0ZXx4bm9yfHhvcnx6aXApXFxiLyxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXG5cdFx0J3N1Z2FyJzoge1xuXHRcdFx0cGF0dGVybjogLy0+fD0+fFxcfHw6Oi8sXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH0sXG5cblx0XHQncHVuY3R1YXRpb24nOiAvWygpW1xcXSxdLyxcblxuXHRcdCdzeW1ib2wnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvPDp8LTp8XHUwMEY4fEB8I3xcXCt8XFx8fFxcKnxcXCR8LS0tfC18JXxcXC98XFwuXFwufFxcXnx+fD18PHw+fFxcXFwvXG5cdFx0fSxcblxuXHRcdCdib29sZWFuJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmZhbHNlfG1heWJlfHRydWUpXFxiL1xuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuYXJ0ID0gUHJpc20ubGFuZ3VhZ2VzWydhcnR1cm8nXTtcbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBhdHRyaWJ1dGVzID0ge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSopXFxbKD8hXFxbKSg/OihbXCInJGBdKSg/Oig/IVxcMilbXlxcXFxdfFxcXFwuKSpcXDJ8XFxbKD86W15cXFtcXF1cXFxcXXxcXFxcLikqXFxdfFteXFxbXFxdXFxcXFwiJyRgXXxcXFxcLikqXFxdL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdxdW90ZWQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oWyRgXSkoPzooPyFcXDEpW15cXFxcXXxcXFxcLikqXFwxLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15bJGBdfFskYF0kL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J2ludGVycHJldGVkJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvJyg/OlteJ1xcXFxdfFxcXFwuKSonLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL14nfCckL1xuXHRcdFx0XHRcdC8vIFNlZSByZXN0IGJlbG93XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1wiKD86W15cIlxcXFxdfFxcXFwuKSpcIi8sXG5cdFx0XHQndmFyaWFibGUnOiAvXFx3Kyg/PT0pLyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFxbfFxcXSR8LC8sXG5cdFx0XHQnb3BlcmF0b3InOiAvPS8sXG5cdFx0XHQvLyBUaGUgbmVnYXRpdmUgbG9vay1haGVhZCBwcmV2ZW50cyBibGFuayBtYXRjaGVzXG5cdFx0XHQnYXR0ci12YWx1ZSc6IC8oPyFeXFxzKyQpLisvXG5cdFx0fVxuXHR9O1xuXG5cdHZhciBhc2NpaWRvYyA9IFByaXNtLmxhbmd1YWdlcy5hc2NpaWRvYyA9IHtcblx0XHQnY29tbWVudC1ibG9jayc6IHtcblx0XHRcdHBhdHRlcm46IC9eKFxcL3s0LH0pKD86XFxyP1xcbnxcXHIpKD86W1xcc1xcU10qKD86XFxyP1xcbnxcXHIpKT8/XFwxL20sXG5cdFx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdFx0fSxcblx0XHQndGFibGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlxcfD17Myx9KD86KD86XFxyP1xcbnxcXHIoPyFcXG4pKS4qKSo/KD86XFxyP1xcbnxcXHIpXFx8PXszLH0kL20sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3NwZWNpZmllcnMnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyg/Oig/Oig/OlxcZCsoPzpcXC5cXGQrKT98XFwuXFxkKylbKypdKD86WzxePl0oPzpcXC5bPF4+XSk/fFxcLls8Xj5dKT98WzxePl0oPzpcXC5bPF4+XSk/fFxcLls8Xj5dKVthLXpdKnxbYS16XSspKD89XFx8KS8sXG5cdFx0XHRcdFx0YWxpYXM6ICdhdHRyLXZhbHVlJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pW3whXT0qLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdFx0Ly8gU2VlIHJlc3QgYmVsb3dcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J3Bhc3N0aHJvdWdoLWJsb2NrJzoge1xuXHRcdFx0cGF0dGVybjogL14oXFwrezQsfSkoPzpcXHI/XFxufFxccikoPzpbXFxzXFxTXSooPzpcXHI/XFxufFxccikpPz9cXDEkL20sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXCsrfFxcKyskL1xuXHRcdFx0XHQvLyBTZWUgcmVzdCBiZWxvd1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Ly8gTGl0ZXJhbCBibG9ja3MgYW5kIGxpc3RpbmcgYmxvY2tzXG5cdFx0J2xpdGVyYWwtYmxvY2snOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXigtezQsfXxcXC57NCx9KSg/Olxccj9cXG58XFxyKSg/OltcXHNcXFNdKig/Olxccj9cXG58XFxyKSk/P1xcMSQvbSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXig/Oi0rfFxcLispfCg/Oi0rfFxcLispJC9cblx0XHRcdFx0Ly8gU2VlIHJlc3QgYmVsb3dcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8vIFNpZGViYXIgYmxvY2tzLCBxdW90ZSBibG9ja3MsIGV4YW1wbGUgYmxvY2tzIGFuZCBvcGVuIGJsb2Nrc1xuXHRcdCdvdGhlci1ibG9jayc6IHtcblx0XHRcdHBhdHRlcm46IC9eKC0tfFxcKns0LH18X3s0LH18PXs0LH0pKD86XFxyP1xcbnxcXHIpKD86W1xcc1xcU10qKD86XFxyP1xcbnxcXHIpKT8/XFwxJC9tLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eKD86LSt8XFwqK3xfK3w9Kyl8KD86LSt8XFwqK3xfK3w9KykkL1xuXHRcdFx0XHQvLyBTZWUgcmVzdCBiZWxvd1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBsaXN0LXB1bmN0dWF0aW9uIGFuZCBsaXN0LWxhYmVsIG11c3QgYXBwZWFyIGJlZm9yZSBpbmRlbnRlZC1ibG9ja1xuXHRcdCdsaXN0LXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKikoPzotfFxcKnsxLDV9fFxcLnsxLDV9fCg/OlthLXpdfFxcZCspXFwufFt4dmldK1xcKSkoPz0gKS9pbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J2xpc3QtbGFiZWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKVthLXpcXGRdLisoPzo6ezIsNH18OzspKD89XFxzKS9pbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHR9LFxuXHRcdCdpbmRlbnRlZC1ibG9jayc6IHtcblx0XHRcdHBhdHRlcm46IC8oKFxccj9cXG58XFxyKVxcMikoWyBcXHRdKylcXFMuKig/Oig/Olxccj9cXG58XFxyKVxcMy4rKSooPz1cXDJ7Mn18JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnY29tbWVudCc6IC9eXFwvXFwvLiovbSxcblx0XHQndGl0bGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXi4rKD86XFxyP1xcbnxcXHIpKD86PXszLH18LXszLH18fnszLH18XFxeezMsfXxcXCt7Myx9KSR8Xj17MSw1fSAuK3xeXFwuKD8hW1xccy5dKS4qL20sXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCcsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL14oPzpcXC58PSspfCg/Oj0rfC0rfH4rfFxcXit8XFwrKykkL1xuXHRcdFx0XHQvLyBTZWUgcmVzdCBiZWxvd1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2F0dHJpYnV0ZS1lbnRyeSc6IHtcblx0XHRcdHBhdHRlcm46IC9eOlteOlxcclxcbl0rOig/OiAuKj8oPzogXFwrKD86XFxyP1xcbnxcXHIpLio/KSopPyQvbSxcblx0XHRcdGFsaWFzOiAndGFnJ1xuXHRcdH0sXG5cdFx0J2F0dHJpYnV0ZXMnOiBhdHRyaWJ1dGVzLFxuXHRcdCdocic6IHtcblx0XHRcdHBhdHRlcm46IC9eJ3szLH0kL20sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J3BhZ2UtYnJlYWsnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXjx7Myx9JC9tLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdhZG1vbml0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL14oPzpDQVVUSU9OfElNUE9SVEFOVHxOT1RFfFRJUHxXQVJOSU5HKTovbSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXHRcdCdjYWxsb3V0JzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKTw/XFxkKj4vbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvPFxcZCs+Lyxcblx0XHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnbWFjcm8nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiW2EtelxcZF1bYS16XFxkLV0qOjo/KD86W15cXHNcXFtcXF1dKlxcWyg/OlteXFxdXFxcXFwiJ118KFtcIiddKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFwuKSpcXDF8XFxcXC4pKlxcXSkvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmdW5jdGlvbic6IC9eW2EtelxcZC1dKyg/PTopLyxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL146Oj8vLFxuXHRcdFx0XHQnYXR0cmlidXRlcyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKD86XFxbKD86W15cXF1cXFxcXCInXXwoW1wiJ10pKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKlxcMXxcXFxcLikqXFxdKS8sXG5cdFx0XHRcdFx0aW5zaWRlOiBhdHRyaWJ1dGVzLmluc2lkZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnaW5saW5lJzoge1xuXHRcdFx0Lypcblx0XHRcdFRoZSBpbml0aWFsIGxvb2stYmVoaW5kIHByZXZlbnRzIHRoZSBoaWdobGlnaHRpbmcgb2YgZXNjYXBlZCBxdW90ZWQgdGV4dC5cblxuXHRcdFx0UXVvdGVkIHRleHQgY2FuIGJlIG11bHRpLWxpbmUgYnV0IGNhbm5vdCBzcGFuIGFuIGVtcHR5IGxpbmUuXG5cdFx0XHRBbGwgcXVvdGVkIHRleHQgY2FuIGhhdmUgYXR0cmlidXRlcyBiZWZvcmUgW2Zvb2JhciwgJ2Zvb2JhcicsIGJhej1cImJhclwiXS5cblxuXHRcdFx0Rmlyc3QsIHdlIGhhbmRsZSB0aGUgY29uc3RyYWluZWQgcXVvdGVzLlxuXHRcdFx0VGhvc2UgbXVzdCBiZSBib3VuZGVkIGJ5IG5vbi13b3JkIGNoYXJzIGFuZCBjYW5ub3QgaGF2ZSBzcGFjZXMgYmV0d2VlbiB0aGUgZGVsaW1pdGVyIGFuZCB0aGUgZmlyc3QgY2hhci5cblx0XHRcdFRoZXkgYXJlLCBpbiBvcmRlcjogX2VtcGhhc2lzXywgYGBkb3VibGUgcXVvdGVzJycsIGBzaW5nbGUgcXVvdGVzJywgYG1vbm9zcGFjZWAsICdlbXBoYXNpcycsICpzdHJvbmcqLCArbW9ub3NwYWNlKyBhbmQgI3VucXVvdGVkI1xuXG5cdFx0XHRUaGVuIHdlIGhhbmRsZSB0aGUgdW5jb25zdHJhaW5lZCBxdW90ZXMuXG5cdFx0XHRUaG9zZSBkbyBub3QgaGF2ZSB0aGUgcmVzdHJpY3Rpb25zIG9mIHRoZSBjb25zdHJhaW5lZCBxdW90ZXMuXG5cdFx0XHRUaGV5IGFyZSwgaW4gb3JkZXI6IF9fZW1waGFzaXNfXywgKipzdHJvbmcqKiwgKyttb25vc3BhY2UrKywgKysrcGFzc3Rocm91Z2grKyssICMjdW5xdW90ZWQjIywgJCRwYXNzdGhyb3VnaCQkLCB+c3Vic2NyaXB0fiwgXnN1cGVyc2NyaXB0Xiwge2F0dHJpYnV0ZS1yZWZlcmVuY2V9LCBbW2FuY2hvcl1dLCBbW1tiaWJsaW9ncmFwaHkgYW5jaG9yXV1dLCA8PHhyZWY+PiwgKCgoaW5kZXhlcykpKSBhbmQgKChpbmRleGVzKSlcblx0XHRcdCAqL1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86KD86XFxCXFxbKD86W15cXF1cXFxcXCInXXwoW1wiJ10pKD86KD8hXFwyKVteXFxcXF18XFxcXC4pKlxcMnxcXFxcLikqXFxdKT8oPzpcXGJfKD8hXFxzKSg/OiBffFteX1xcXFxcXHJcXG5dfFxcXFwuKSsoPzooPzpcXHI/XFxufFxccikoPzogX3xbXl9cXFxcXFxyXFxuXXxcXFxcLikrKSpfXFxifFxcQmBgKD8hXFxzKS4rPyg/Oig/Olxccj9cXG58XFxyKS4rPykqJydcXEJ8XFxCYCg/IVxccykoPzpbXmAnXFxzXXxcXHMrXFxTKStbJ2BdXFxCfFxcQihbJyorI10pKD8hXFxzKSg/OiBcXDN8KD8hXFwzKVteXFxcXFxcclxcbl18XFxcXC4pKyg/Oig/Olxccj9cXG58XFxyKSg/OiBcXDN8KD8hXFwzKVteXFxcXFxcclxcbl18XFxcXC4pKykqXFwzXFxCKXwoPzpcXFsoPzpbXlxcXVxcXFxcIiddfChbXCInXSkoPzooPyFcXDQpW15cXFxcXXxcXFxcLikqXFw0fFxcXFwuKSpcXF0pPyg/OihfX3xcXCpcXCp8XFwrXFwrXFwrP3wjI3xcXCRcXCR8W35eXSkuKz8oPzooPzpcXHI/XFxufFxccikuKz8pKlxcNXxcXHtbXn1cXHJcXG5dK1xcfXxcXFtcXFtcXFs/Lis/KD86KD86XFxyP1xcbnxcXHIpLis/KSpcXF0/XFxdXFxdfDw8Lis/KD86KD86XFxyP1xcbnxcXHIpLis/KSo+PnxcXChcXChcXCg/Lis/KD86KD86XFxyP1xcbnxcXHIpLis/KSpcXCk/XFwpXFwpKSkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2F0dHJpYnV0ZXMnOiBhdHRyaWJ1dGVzLFxuXHRcdFx0XHQndXJsJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKD86XFxbXFxbXFxbPy4rP1xcXT9cXF1cXF18PDwuKz8+PikkLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eKD86XFxbXFxbXFxbP3w8PCl8KD86XFxdXFxdXFxdP3w+PikkL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2F0dHJpYnV0ZS1yZWYnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXHsuK1xcfSQvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXHspW2EtelxcZCwrXy1dKy8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnb3BlcmF0b3InOiAvXls9PyEjJUAkXXwhKD89Wzp9XSkvLFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXHt8XFx9JHw6Oj8vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaXRhbGljJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKFsnX10pW1xcc1xcU10rXFwxJC8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXig/OicnP3xfXz8pfCg/OicnP3xfXz8pJC9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdib2xkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFwqW1xcc1xcU10rXFwqJC8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRwdW5jdHVhdGlvbjogL15cXCpcXCo/fFxcKlxcKj8kL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL14oPzpgYD98XFwrezEsM318IyM/fFxcJFxcJHxbfl5dfFxcKFxcKFxcKD8pfCg/OicnP3xcXCt7MSwzfXwjIz98XFwkXFwkfFt+XmBdfFxcKT9cXClcXCkpJC9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdyZXBsYWNlbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXCgoPzpDfFJ8VE0pXFwpLyxcblx0XHRcdGFsaWFzOiAnYnVpbHRpbidcblx0XHR9LFxuXHRcdCdlbnRpdHknOiAvJiM/W1xcZGEtel17MSw4fTsvaSxcblx0XHQnbGluZS1jb250aW51YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58IClcXCskL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9XG5cdH07XG5cblxuXHQvLyBBbGxvdyBzb21lIG5lc3RpbmcuIFRoZXJlIGlzIG5vIHJlY3Vyc2lvbiB0aG91Z2gsIHNvIGNsb25pbmcgc2hvdWxkIG5vdCBiZSBuZWVkZWQuXG5cblx0ZnVuY3Rpb24gY29weUZyb21Bc2NpaURvYyhrZXlzKSB7XG5cdFx0a2V5cyA9IGtleXMuc3BsaXQoJyAnKTtcblxuXHRcdHZhciBvID0ge307XG5cdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSBrZXlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0b1trZXlzW2ldXSA9IGFzY2lpZG9jW2tleXNbaV1dO1xuXHRcdH1cblx0XHRyZXR1cm4gbztcblx0fVxuXG5cdGF0dHJpYnV0ZXMuaW5zaWRlWydpbnRlcnByZXRlZCddLmluc2lkZS5yZXN0ID0gY29weUZyb21Bc2NpaURvYygnbWFjcm8gaW5saW5lIHJlcGxhY2VtZW50IGVudGl0eScpO1xuXG5cdGFzY2lpZG9jWydwYXNzdGhyb3VnaC1ibG9jayddLmluc2lkZS5yZXN0ID0gY29weUZyb21Bc2NpaURvYygnbWFjcm8nKTtcblxuXHRhc2NpaWRvY1snbGl0ZXJhbC1ibG9jayddLmluc2lkZS5yZXN0ID0gY29weUZyb21Bc2NpaURvYygnY2FsbG91dCcpO1xuXG5cdGFzY2lpZG9jWyd0YWJsZSddLmluc2lkZS5yZXN0ID0gY29weUZyb21Bc2NpaURvYygnY29tbWVudC1ibG9jayBwYXNzdGhyb3VnaC1ibG9jayBsaXRlcmFsLWJsb2NrIG90aGVyLWJsb2NrIGxpc3QtcHVuY3R1YXRpb24gaW5kZW50ZWQtYmxvY2sgY29tbWVudCB0aXRsZSBhdHRyaWJ1dGUtZW50cnkgYXR0cmlidXRlcyBociBwYWdlLWJyZWFrIGFkbW9uaXRpb24gbGlzdC1sYWJlbCBjYWxsb3V0IG1hY3JvIGlubGluZSByZXBsYWNlbWVudCBlbnRpdHkgbGluZS1jb250aW51YXRpb24nKTtcblxuXHRhc2NpaWRvY1snb3RoZXItYmxvY2snXS5pbnNpZGUucmVzdCA9IGNvcHlGcm9tQXNjaWlEb2MoJ3RhYmxlIGxpc3QtcHVuY3R1YXRpb24gaW5kZW50ZWQtYmxvY2sgY29tbWVudCBhdHRyaWJ1dGUtZW50cnkgYXR0cmlidXRlcyBociBwYWdlLWJyZWFrIGFkbW9uaXRpb24gbGlzdC1sYWJlbCBtYWNybyBpbmxpbmUgcmVwbGFjZW1lbnQgZW50aXR5IGxpbmUtY29udGludWF0aW9uJyk7XG5cblx0YXNjaWlkb2NbJ3RpdGxlJ10uaW5zaWRlLnJlc3QgPSBjb3B5RnJvbUFzY2lpRG9jKCdtYWNybyBpbmxpbmUgcmVwbGFjZW1lbnQgZW50aXR5Jyk7XG5cblxuXHQvLyBQbHVnaW4gdG8gbWFrZSBlbnRpdHkgdGl0bGUgc2hvdyB0aGUgcmVhbCBlbnRpdHksIGlkZWEgYnkgUm9tYW4gS29tYXJvdlxuXHRQcmlzbS5ob29rcy5hZGQoJ3dyYXAnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0aWYgKGVudi50eXBlID09PSAnZW50aXR5Jykge1xuXHRcdFx0ZW52LmF0dHJpYnV0ZXNbJ3RpdGxlJ10gPSBlbnYuY29udGVudC5yZXBsYWNlKC8mYW1wOy8sICcmJyk7XG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuYWRvYyA9IFByaXNtLmxhbmd1YWdlcy5hc2NpaWRvYztcbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8qKlxuXHQgKiBSZXBsYWNlcyBhbGwgcGxhY2Vob2xkZXJzIFwiPDxuPj5cIiBvZiBnaXZlbiBwYXR0ZXJuIHdpdGggdGhlIG4tdGggcmVwbGFjZW1lbnQgKHplcm8gYmFzZWQpLlxuXHQgKlxuXHQgKiBOb3RlOiBUaGlzIGlzIGEgc2ltcGxlIHRleHQgYmFzZWQgcmVwbGFjZW1lbnQuIEJlIGNhcmVmdWwgd2hlbiB1c2luZyBiYWNrcmVmZXJlbmNlcyFcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm4gdGhlIGdpdmVuIHBhdHRlcm4uXG5cdCAqIEBwYXJhbSB7c3RyaW5nW119IHJlcGxhY2VtZW50cyBhIGxpc3Qgb2YgcmVwbGFjZW1lbnQgd2hpY2ggY2FuIGJlIGluc2VydGVkIGludG8gdGhlIGdpdmVuIHBhdHRlcm4uXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBwYXR0ZXJuIHdpdGggYWxsIHBsYWNlaG9sZGVycyByZXBsYWNlZCB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgcmVwbGFjZW1lbnRzLlxuXHQgKiBAZXhhbXBsZSByZXBsYWNlKC9hPDwwPj5hLy5zb3VyY2UsIFsvYisvLnNvdXJjZV0pID09PSAvYSg/OmIrKWEvLnNvdXJjZVxuXHQgKi9cblx0ZnVuY3Rpb24gcmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudHMpIHtcblx0XHRyZXR1cm4gcGF0dGVybi5yZXBsYWNlKC88PChcXGQrKT4+L2csIGZ1bmN0aW9uIChtLCBpbmRleCkge1xuXHRcdFx0cmV0dXJuICcoPzonICsgcmVwbGFjZW1lbnRzWytpbmRleF0gKyAnKSc7XG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG5cdCAqIEBwYXJhbSB7c3RyaW5nW119IHJlcGxhY2VtZW50c1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYWdzXVxuXHQgKiBAcmV0dXJucyB7UmVnRXhwfVxuXHQgKi9cblx0ZnVuY3Rpb24gcmUocGF0dGVybiwgcmVwbGFjZW1lbnRzLCBmbGFncykge1xuXHRcdHJldHVybiBSZWdFeHAocmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudHMpLCBmbGFncyB8fCAnJyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5lc3RlZCBwYXR0ZXJuIHdoZXJlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3RyaW5nIGA8PHNlbGY+PmAgYXJlIHJlcGxhY2VkIHdpdGggdGhlIHBhdHRlcm4gaXRzZWxmLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGVwdGhMb2cyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRmdW5jdGlvbiBuZXN0ZWQocGF0dGVybiwgZGVwdGhMb2cyKSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkZXB0aExvZzI7IGkrKykge1xuXHRcdFx0cGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSgvPDxzZWxmPj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gJyg/OicgKyBwYXR0ZXJuICsgJyknOyB9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHBhdHRlcm4ucmVwbGFjZSgvPDxzZWxmPj4vZywgJ1teXFxcXHNcXFxcU10nKTtcblx0fVxuXG5cdC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9jc2hhcnAvbGFuZ3VhZ2UtcmVmZXJlbmNlL2tleXdvcmRzL1xuXHR2YXIga2V5d29yZEtpbmRzID0ge1xuXHRcdC8vIGtleXdvcmRzIHdoaWNoIHJlcHJlc2VudCBhIHJldHVybiBvciB2YXJpYWJsZSB0eXBlXG5cdFx0dHlwZTogJ2Jvb2wgYnl0ZSBjaGFyIGRlY2ltYWwgZG91YmxlIGR5bmFtaWMgZmxvYXQgaW50IGxvbmcgb2JqZWN0IHNieXRlIHNob3J0IHN0cmluZyB1aW50IHVsb25nIHVzaG9ydCB2YXIgdm9pZCcsXG5cdFx0Ly8ga2V5d29yZHMgd2hpY2ggYXJlIHVzZWQgdG8gZGVjbGFyZSBhIHR5cGVcblx0XHR0eXBlRGVjbGFyYXRpb246ICdjbGFzcyBlbnVtIGludGVyZmFjZSByZWNvcmQgc3RydWN0Jyxcblx0XHQvLyBjb250ZXh0dWFsIGtleXdvcmRzXG5cdFx0Ly8gKFwidmFyXCIgYW5kIFwiZHluYW1pY1wiIGFyZSBtaXNzaW5nIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBsaWtlIHR5cGVzKVxuXHRcdGNvbnRleHR1YWw6ICdhZGQgYWxpYXMgYW5kIGFzY2VuZGluZyBhc3luYyBhd2FpdCBieSBkZXNjZW5kaW5nIGZyb20oPz1cXFxccyooPzpcXFxcd3wkKSkgZ2V0IGdsb2JhbCBncm91cCBpbnRvIGluaXQoPz1cXFxccyo7KSBqb2luIGxldCBuYW1lb2Ygbm90IG5vdG51bGwgb24gb3Igb3JkZXJieSBwYXJ0aWFsIHJlbW92ZSBzZWxlY3Qgc2V0IHVubWFuYWdlZCB2YWx1ZSB3aGVuIHdoZXJlIHdpdGgoPz1cXFxccyp7KScsXG5cdFx0Ly8gYWxsIG90aGVyIGtleXdvcmRzXG5cdFx0b3RoZXI6ICdhYnN0cmFjdCBhcyBiYXNlIGJyZWFrIGNhc2UgY2F0Y2ggY2hlY2tlZCBjb25zdCBjb250aW51ZSBkZWZhdWx0IGRlbGVnYXRlIGRvIGVsc2UgZXZlbnQgZXhwbGljaXQgZXh0ZXJuIGZpbmFsbHkgZml4ZWQgZm9yIGZvcmVhY2ggZ290byBpZiBpbXBsaWNpdCBpbiBpbnRlcm5hbCBpcyBsb2NrIG5hbWVzcGFjZSBuZXcgbnVsbCBvcGVyYXRvciBvdXQgb3ZlcnJpZGUgcGFyYW1zIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyByZWFkb25seSByZWYgcmV0dXJuIHNlYWxlZCBzaXplb2Ygc3RhY2thbGxvYyBzdGF0aWMgc3dpdGNoIHRoaXMgdGhyb3cgdHJ5IHR5cGVvZiB1bmNoZWNrZWQgdW5zYWZlIHVzaW5nIHZpcnR1YWwgdm9sYXRpbGUgd2hpbGUgeWllbGQnXG5cdH07XG5cblx0Ly8ga2V5d29yZHNcblx0ZnVuY3Rpb24ga2V5d29yZHNUb1BhdHRlcm4od29yZHMpIHtcblx0XHRyZXR1cm4gJ1xcXFxiKD86JyArIHdvcmRzLnRyaW0oKS5yZXBsYWNlKC8gL2csICd8JykgKyAnKVxcXFxiJztcblx0fVxuXHR2YXIgdHlwZURlY2xhcmF0aW9uS2V5d29yZHMgPSBrZXl3b3Jkc1RvUGF0dGVybihrZXl3b3JkS2luZHMudHlwZURlY2xhcmF0aW9uKTtcblx0dmFyIGtleXdvcmRzID0gUmVnRXhwKGtleXdvcmRzVG9QYXR0ZXJuKGtleXdvcmRLaW5kcy50eXBlICsgJyAnICsga2V5d29yZEtpbmRzLnR5cGVEZWNsYXJhdGlvbiArICcgJyArIGtleXdvcmRLaW5kcy5jb250ZXh0dWFsICsgJyAnICsga2V5d29yZEtpbmRzLm90aGVyKSk7XG5cdHZhciBub25UeXBlS2V5d29yZHMgPSBrZXl3b3Jkc1RvUGF0dGVybihrZXl3b3JkS2luZHMudHlwZURlY2xhcmF0aW9uICsgJyAnICsga2V5d29yZEtpbmRzLmNvbnRleHR1YWwgKyAnICcgKyBrZXl3b3JkS2luZHMub3RoZXIpO1xuXHR2YXIgbm9uQ29udGV4dHVhbEtleXdvcmRzID0ga2V5d29yZHNUb1BhdHRlcm4oa2V5d29yZEtpbmRzLnR5cGUgKyAnICcgKyBrZXl3b3JkS2luZHMudHlwZURlY2xhcmF0aW9uICsgJyAnICsga2V5d29yZEtpbmRzLm90aGVyKTtcblxuXHQvLyB0eXBlc1xuXHR2YXIgZ2VuZXJpYyA9IG5lc3RlZCgvPCg/OltePD47PStcXC0qLyUmfF5dfDw8c2VsZj4+KSo+Ly5zb3VyY2UsIDIpOyAvLyB0aGUgaWRlYSBiZWhpbmQgdGhlIG90aGVyIGZvcmJpZGRlbiBjaGFyYWN0ZXJzIGlzIHRvIHByZXZlbnQgZmFsc2UgcG9zaXRpdmVzLiBTYW1lIGZvciB0dXBsZUVsZW1lbnQuXG5cdHZhciBuZXN0ZWRSb3VuZCA9IG5lc3RlZCgvXFwoKD86W14oKV18PDxzZWxmPj4pKlxcKS8uc291cmNlLCAyKTtcblx0dmFyIG5hbWUgPSAvQD9cXGJbQS1aYS16X11cXHcqXFxiLy5zb3VyY2U7XG5cdHZhciBnZW5lcmljTmFtZSA9IHJlcGxhY2UoLzw8MD4+KD86XFxzKjw8MT4+KT8vLnNvdXJjZSwgW25hbWUsIGdlbmVyaWNdKTtcblx0dmFyIGlkZW50aWZpZXIgPSByZXBsYWNlKC8oPyE8PDA+Pik8PDE+Pig/OlxccypcXC5cXHMqPDwxPj4pKi8uc291cmNlLCBbbm9uVHlwZUtleXdvcmRzLCBnZW5lcmljTmFtZV0pO1xuXHR2YXIgYXJyYXkgPSAvXFxbXFxzKig/OixcXHMqKSpcXF0vLnNvdXJjZTtcblx0dmFyIHR5cGVFeHByZXNzaW9uV2l0aG91dFR1cGxlID0gcmVwbGFjZSgvPDwwPj4oPzpcXHMqKD86XFw/XFxzKik/PDwxPj4pKig/OlxccypcXD8pPy8uc291cmNlLCBbaWRlbnRpZmllciwgYXJyYXldKTtcblx0dmFyIHR1cGxlRWxlbWVudCA9IHJlcGxhY2UoL1teLCgpPD5bXFxdOz0rXFwtKi8lJnxeXXw8PDA+Pnw8PDE+Pnw8PDI+Pi8uc291cmNlLCBbZ2VuZXJpYywgbmVzdGVkUm91bmQsIGFycmF5XSk7XG5cdHZhciB0dXBsZSA9IHJlcGxhY2UoL1xcKDw8MD4+Kyg/Oiw8PDA+PispK1xcKS8uc291cmNlLCBbdHVwbGVFbGVtZW50XSk7XG5cdHZhciB0eXBlRXhwcmVzc2lvbiA9IHJlcGxhY2UoLyg/Ojw8MD4+fDw8MT4+KSg/OlxccyooPzpcXD9cXHMqKT88PDI+PikqKD86XFxzKlxcPyk/Ly5zb3VyY2UsIFt0dXBsZSwgaWRlbnRpZmllciwgYXJyYXldKTtcblxuXHR2YXIgdHlwZUluc2lkZSA9IHtcblx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bPD4oKT8sLjpbXFxdXS9cblx0fTtcblxuXHQvLyBzdHJpbmdzICYgY2hhcmFjdGVyc1xuXHQvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9kb3RuZXQvY3NoYXJwL2xhbmd1YWdlLXJlZmVyZW5jZS9sYW5ndWFnZS1zcGVjaWZpY2F0aW9uL2xleGljYWwtc3RydWN0dXJlI2NoYXJhY3Rlci1saXRlcmFsc1xuXHQvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9kb3RuZXQvY3NoYXJwL2xhbmd1YWdlLXJlZmVyZW5jZS9sYW5ndWFnZS1zcGVjaWZpY2F0aW9uL2xleGljYWwtc3RydWN0dXJlI3N0cmluZy1saXRlcmFsc1xuXHR2YXIgY2hhcmFjdGVyID0gLycoPzpbXlxcclxcbidcXFxcXXxcXFxcLnxcXFxcW1V1eF1bXFxkYS1mQS1GXXsxLDh9KScvLnNvdXJjZTsgLy8gc2ltcGxpZmllZCBwYXR0ZXJuXG5cdHZhciByZWd1bGFyU3RyaW5nID0gL1wiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcIi8uc291cmNlO1xuXHR2YXIgdmVyYmF0aW1TdHJpbmcgPSAvQFwiKD86XCJcInxcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcIig/IVwiKS8uc291cmNlO1xuXG5cblx0UHJpc20ubGFuZ3VhZ2VzLmNzaGFycCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHRcdCdzdHJpbmcnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXnxbXiRcXFxcXSk8PDA+Pi8uc291cmNlLCBbdmVyYmF0aW1TdHJpbmddKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKF58W15AJFxcXFxdKTw8MD4+Ly5zb3VyY2UsIFtyZWd1bGFyU3RyaW5nXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFVzaW5nIHN0YXRpY1xuXHRcdFx0XHQvLyB1c2luZyBzdGF0aWMgU3lzdGVtLk1hdGg7XG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXFxidXNpbmdcXHMrc3RhdGljXFxzKyk8PDA+Pig/PVxccyo7KS8uc291cmNlLCBbaWRlbnRpZmllcl0pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFVzaW5nIGFsaWFzICh0eXBlKVxuXHRcdFx0XHQvLyB1c2luZyBQcm9qZWN0ID0gUEMuTXlDb21wYW55LlByb2plY3Q7XG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXFxidXNpbmdcXHMrPDwwPj5cXHMqPVxccyopPDwxPj4oPz1cXHMqOykvLnNvdXJjZSwgW25hbWUsIHR5cGVFeHByZXNzaW9uXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gVXNpbmcgYWxpYXMgKGFsaWFzKVxuXHRcdFx0XHQvLyB1c2luZyBQcm9qZWN0ID0gUEMuTXlDb21wYW55LlByb2plY3Q7XG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXFxidXNpbmdcXHMrKTw8MD4+KD89XFxzKj0pLy5zb3VyY2UsIFtuYW1lXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFR5cGUgZGVjbGFyYXRpb25zXG5cdFx0XHRcdC8vIGNsYXNzIEZvbzxBLCBCPlxuXHRcdFx0XHQvLyBpbnRlcmZhY2UgRm9vPG91dCBBLCBCPlxuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKFxcYjw8MD4+XFxzKyk8PDE+Pi8uc291cmNlLCBbdHlwZURlY2xhcmF0aW9uS2V5d29yZHMsIGdlbmVyaWNOYW1lXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gU2luZ2xlIGNhdGNoIGV4Y2VwdGlvbiBkZWNsYXJhdGlvblxuXHRcdFx0XHQvLyBjYXRjaChGb28pXG5cdFx0XHRcdC8vICh0aGluZ3MgbGlrZSBjYXRjaChGb28gZSkgaXMgY292ZXJlZCBieSB2YXJpYWJsZSBkZWNsYXJhdGlvbilcblx0XHRcdFx0cGF0dGVybjogcmUoLyhcXGJjYXRjaFxccypcXChcXHMqKTw8MD4+Ly5zb3VyY2UsIFtpZGVudGlmaWVyXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gTmFtZSBvZiB0aGUgdHlwZSBwYXJhbWV0ZXIgb2YgZ2VuZXJpYyBjb25zdHJhaW50c1xuXHRcdFx0XHQvLyB3aGVyZSBGb28gOiBjbGFzc1xuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKFxcYndoZXJlXFxzKyk8PDA+Pi8uc291cmNlLCBbbmFtZV0pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBDYXN0cyBhbmQgY2hlY2tzIHZpYSBhcyBhbmQgaXMuXG5cdFx0XHRcdC8vIGFzIEZvbzxBPiwgaXMgQmFyPEI+XG5cdFx0XHRcdC8vICh0aGluZ3MgbGlrZSBpZihhIGlzIEZvbyBiKSBpcyBjb3ZlcmVkIGJ5IHZhcmlhYmxlIGRlY2xhcmF0aW9uKVxuXHRcdFx0XHRwYXR0ZXJuOiByZSgvKFxcYig/OmlzKD86XFxzK25vdCk/fGFzKVxccyspPDwwPj4vLnNvdXJjZSwgW3R5cGVFeHByZXNzaW9uV2l0aG91dFR1cGxlXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gVmFyaWFibGUsIGZpZWxkIGFuZCBwYXJhbWV0ZXIgZGVjbGFyYXRpb25cblx0XHRcdFx0Ly8gKEZvbyBiYXIsIEJhciBiYXosIEZvb1ssLF0gYmF5LCBGb288QmFyLCBGb29CYXI8QmFyPj4gYmF4KVxuXHRcdFx0XHRwYXR0ZXJuOiByZSgvXFxiPDwwPj4oPz1cXHMrKD8hPDwxPj58d2l0aFxccypcXHspPDwyPj4oPzpcXHMqWz0sOzp7KVxcXV18XFxzKyg/OmlufHdoZW4pXFxiKSkvLnNvdXJjZSwgW3R5cGVFeHByZXNzaW9uLCBub25Db250ZXh0dWFsS2V5d29yZHMsIG5hbWVdKSxcblx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9jc2hhcnAvbGFuZ3VhZ2UtcmVmZXJlbmNlL2xhbmd1YWdlLXNwZWNpZmljYXRpb24vbGV4aWNhbC1zdHJ1Y3R1cmUjbGl0ZXJhbHNcblx0XHQnbnVtYmVyJzogLyg/OlxcYjAoPzp4W1xcZGEtZl9dKltcXGRhLWZdfGJbMDFfXSpbMDFdKXwoPzpcXEJcXC5cXGQrKD86XytcXGQrKSp8XFxiXFxkKyg/Ol8rXFxkKykqKD86XFwuXFxkKyg/Ol8rXFxkKykqKT8pKD86ZVstK10/XFxkKyg/Ol8rXFxkKykqKT8pKD86W2RmbG11XXxsdXx1bCk/XFxiL2ksXG5cdFx0J29wZXJhdG9yJzogLz4+PT98PDw9P3xbLT1dPnwoWy0rJnxdKVxcMXx+fFxcP1xcPz0/fFstKyovJSZ8XiE9PD5dPT8vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9cXD9cXC4/fDo6fFt7fVtcXF07KCksLjpdL1xuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjc2hhcnAnLCAnbnVtYmVyJywge1xuXHRcdCdyYW5nZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXC5cXC4vLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NzaGFycCcsICdwdW5jdHVhdGlvbicsIHtcblx0XHQnbmFtZWQtcGFyYW1ldGVyJzoge1xuXHRcdFx0cGF0dGVybjogcmUoLyhbKCxdXFxzKik8PDA+Pig/PVxccyo6KS8uc291cmNlLCBbbmFtZV0pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjc2hhcnAnLCAnY2xhc3MtbmFtZScsIHtcblx0XHQnbmFtZXNwYWNlJzoge1xuXHRcdFx0Ly8gbmFtZXNwYWNlIEZvby5CYXIge31cblx0XHRcdC8vIHVzaW5nIEZvby5CYXI7XG5cdFx0XHRwYXR0ZXJuOiByZSgvKFxcYig/Om5hbWVzcGFjZXx1c2luZylcXHMrKTw8MD4+KD86XFxzKlxcLlxccyo8PDA+PikqKD89XFxzKls7e10pLy5zb3VyY2UsIFtuYW1lXSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQndHlwZS1leHByZXNzaW9uJzoge1xuXHRcdFx0Ly8gZGVmYXVsdChGb28pLCB0eXBlb2YoRm9vPEJhcj4pLCBzaXplb2YoaW50KVxuXHRcdFx0cGF0dGVybjogcmUoLyhcXGIoPzpkZWZhdWx0fHNpemVvZnx0eXBlb2YpXFxzKlxcKFxccyooPyFcXHMpKSg/OlteKClcXHNdfFxccyg/IVxccyl8PDwwPj4pKig/PVxccypcXCkpLy5zb3VyY2UsIFtuZXN0ZWRSb3VuZF0pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZScsXG5cdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHR9LFxuXHRcdCdyZXR1cm4tdHlwZSc6IHtcblx0XHRcdC8vIEZvbzxCYXI+IEZvckJhcigpOyBGb28gSUZvby5CYXIoKSA9PiAwXG5cdFx0XHQvLyBpbnQgdGhpc1tpbnQgaW5kZXhdID0+IDA7IFQgSVJlYWRPbmx5TGlzdDxUPi50aGlzW2ludCBpbmRleF0gPT4gdGhpc1tpbmRleF07XG5cdFx0XHQvLyBpbnQgRm9vID0+IDA7IGludCBGb28geyBnZXQ7IHNldCB9ID0gMDtcblx0XHRcdHBhdHRlcm46IHJlKC88PDA+Pig/PVxccysoPzo8PDE+PlxccyooPzo9PnxbKHtdfFxcLlxccyp0aGlzXFxzKlxcWyl8dGhpc1xccypcXFspKS8uc291cmNlLCBbdHlwZUV4cHJlc3Npb24sIGlkZW50aWZpZXJdKSxcblx0XHRcdGluc2lkZTogdHlwZUluc2lkZSxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHR9LFxuXHRcdCdjb25zdHJ1Y3Rvci1pbnZvY2F0aW9uJzoge1xuXHRcdFx0Ly8gbmV3IExpc3Q8Rm9vPEJhcltdPj4geyB9XG5cdFx0XHRwYXR0ZXJuOiByZSgvKFxcYm5ld1xccyspPDwwPj4oPz1cXHMqW1soe10pLy5zb3VyY2UsIFt0eXBlRXhwcmVzc2lvbl0pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogdHlwZUluc2lkZSxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHR9LFxuXHRcdC8qJ2V4cGxpY2l0LWltcGxlbWVudGF0aW9uJzoge1xuXHRcdFx0Ly8gaW50IElGb288Rm9vPi5CYXIgPT4gMDsgdm9pZCBJRm9vPEZvbzxGb28+Pi5Gb288VD4oKTtcblx0XHRcdHBhdHRlcm46IHJlcGxhY2UoL1xcYjw8MD4+KD89XFwuPDwxPj4pLywgY2xhc3NOYW1lLCBtZXRob2RPclByb3BlcnR5RGVjbGFyYXRpb24pLFxuXHRcdFx0aW5zaWRlOiBjbGFzc05hbWVJbnNpZGUsXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0fSwqL1xuXHRcdCdnZW5lcmljLW1ldGhvZCc6IHtcblx0XHRcdC8vIGZvbzxCYXI+KClcblx0XHRcdHBhdHRlcm46IHJlKC88PDA+Plxccyo8PDE+Pig/PVxccypcXCgpLy5zb3VyY2UsIFtuYW1lLCBnZW5lcmljXSksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Z1bmN0aW9uJzogcmUoL148PDA+Pi8uc291cmNlLCBbbmFtZV0pLFxuXHRcdFx0XHQnZ2VuZXJpYyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoZ2VuZXJpYyksXG5cdFx0XHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJyxcblx0XHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3R5cGUtbGlzdCc6IHtcblx0XHRcdC8vIFRoZSBsaXN0IG9mIHR5cGVzIGluaGVyaXRlZCBvciBvZiBnZW5lcmljIGNvbnN0cmFpbnRzXG5cdFx0XHQvLyBjbGFzcyBGb288Rj4gOiBCYXIsIElMaXN0PEZvb0Jhcj5cblx0XHRcdC8vIHdoZXJlIEYgOiBCYXIsIElMaXN0PGludD5cblx0XHRcdHBhdHRlcm46IHJlKFxuXHRcdFx0XHQvXFxiKCg/Ojw8MD4+XFxzKzw8MT4+fHJlY29yZFxccys8PDE+Plxccyo8PDU+Pnx3aGVyZVxccys8PDI+PilcXHMqOlxccyopKD86PDwzPj58PDw0Pj58PDwxPj5cXHMqPDw1Pj58PDw2Pj4pKD86XFxzKixcXHMqKD86PDwzPj58PDw0Pj58PDw2Pj4pKSooPz1cXHMqKD86d2hlcmV8W3s7XXw9PnwkKSkvLnNvdXJjZSxcblx0XHRcdFx0W3R5cGVEZWNsYXJhdGlvbktleXdvcmRzLCBnZW5lcmljTmFtZSwgbmFtZSwgdHlwZUV4cHJlc3Npb24sIGtleXdvcmRzLnNvdXJjZSwgbmVzdGVkUm91bmQsIC9cXGJuZXdcXHMqXFwoXFxzKlxcKS8uc291cmNlXVxuXHRcdFx0KSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3JlY29yZC1hcmd1bWVudHMnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogcmUoLyheKD8hbmV3XFxzKlxcKCk8PDA+PlxccyopPDwxPj4vLnNvdXJjZSwgW2dlbmVyaWNOYW1lLCBuZXN0ZWRSb3VuZF0pLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNzaGFycFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdFx0XHQnY2xhc3MtbmFtZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAodHlwZUV4cHJlc3Npb24pLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1ssKCldL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3ByZXByb2Nlc3Nvcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSopIy4qL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwcm9wZXJ0eScsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0Ly8gaGlnaGxpZ2h0IHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGFzIGtleXdvcmRzXG5cdFx0XHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLygjKVxcYig/OmRlZmluZXxlbGlmfGVsc2V8ZW5kaWZ8ZW5kcmVnaW9ufGVycm9yfGlmfGxpbmV8bnVsbGFibGV8cHJhZ21hfHJlZ2lvbnx1bmRlZnx3YXJuaW5nKVxcYi8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdC8vIGF0dHJpYnV0ZXNcblx0dmFyIHJlZ3VsYXJTdHJpbmdPckNoYXJhY3RlciA9IHJlZ3VsYXJTdHJpbmcgKyAnfCcgKyBjaGFyYWN0ZXI7XG5cdHZhciByZWd1bGFyU3RyaW5nQ2hhcmFjdGVyT3JDb21tZW50ID0gcmVwbGFjZSgvXFwvKD8hWyovXSl8XFwvXFwvW15cXHJcXG5dKltcXHJcXG5dfFxcL1xcKig/OlteKl18XFwqKD8hXFwvKSkqXFwqXFwvfDw8MD4+Ly5zb3VyY2UsIFtyZWd1bGFyU3RyaW5nT3JDaGFyYWN0ZXJdKTtcblx0dmFyIHJvdW5kRXhwcmVzc2lvbiA9IG5lc3RlZChyZXBsYWNlKC9bXlwiJy8oKV18PDwwPj58XFwoPDxzZWxmPj4qXFwpLy5zb3VyY2UsIFtyZWd1bGFyU3RyaW5nQ2hhcmFjdGVyT3JDb21tZW50XSksIDIpO1xuXG5cdC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2RvdG5ldC9jc2hhcnAvcHJvZ3JhbW1pbmctZ3VpZGUvY29uY2VwdHMvYXR0cmlidXRlcy8jYXR0cmlidXRlLXRhcmdldHNcblx0dmFyIGF0dHJUYXJnZXQgPSAvXFxiKD86YXNzZW1ibHl8ZXZlbnR8ZmllbGR8bWV0aG9kfG1vZHVsZXxwYXJhbXxwcm9wZXJ0eXxyZXR1cm58dHlwZSlcXGIvLnNvdXJjZTtcblx0dmFyIGF0dHIgPSByZXBsYWNlKC88PDA+Pig/OlxccypcXCg8PDE+PipcXCkpPy8uc291cmNlLCBbaWRlbnRpZmllciwgcm91bmRFeHByZXNzaW9uXSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3NoYXJwJywgJ2NsYXNzLW5hbWUnLCB7XG5cdFx0J2F0dHJpYnV0ZSc6IHtcblx0XHRcdC8vIEF0dHJpYnV0ZXNcblx0XHRcdC8vIFtGb29dLCBbRm9vKDEpLCBCYXIoMiwgUHJvcCA9IFwiZm9vXCIpXSwgW3JldHVybjogRm9vKDEpLCBCYXIoMildLCBbYXNzZW1ibHk6IEZvbyhCYXIpXVxuXHRcdFx0cGF0dGVybjogcmUoLygoPzpefFteXFxzXFx3Pik/XSlcXHMqXFxbXFxzKikoPzo8PDA+Plxccyo6XFxzKik/PDwxPj4oPzpcXHMqLFxccyo8PDE+PikqKD89XFxzKlxcXSkvLnNvdXJjZSwgW2F0dHJUYXJnZXQsIGF0dHJdKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3RhcmdldCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiByZSgvXjw8MD4+KD89XFxzKjopLy5zb3VyY2UsIFthdHRyVGFyZ2V0XSksXG5cdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnYXR0cmlidXRlLWFyZ3VtZW50cyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiByZSgvXFwoPDwwPj4qXFwpLy5zb3VyY2UsIFtyb3VuZEV4cHJlc3Npb25dKSxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5jc2hhcnBcblx0XHRcdFx0fSxcblx0XHRcdFx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKGlkZW50aWZpZXIpLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bOixdL1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblxuXHQvLyBzdHJpbmcgaW50ZXJwb2xhdGlvblxuXHR2YXIgZm9ybWF0U3RyaW5nID0gLzpbXn1cXHJcXG5dKy8uc291cmNlO1xuXHQvLyBtdWx0aSBsaW5lXG5cdHZhciBtSW50ZXJwb2xhdGlvblJvdW5kID0gbmVzdGVkKHJlcGxhY2UoL1teXCInLygpXXw8PDA+PnxcXCg8PHNlbGY+PipcXCkvLnNvdXJjZSwgW3JlZ3VsYXJTdHJpbmdDaGFyYWN0ZXJPckNvbW1lbnRdKSwgMik7XG5cdHZhciBtSW50ZXJwb2xhdGlvbiA9IHJlcGxhY2UoL1xceyg/IVxceykoPzooPyFbfTpdKTw8MD4+KSo8PDE+Pj9cXH0vLnNvdXJjZSwgW21JbnRlcnBvbGF0aW9uUm91bmQsIGZvcm1hdFN0cmluZ10pO1xuXHQvLyBzaW5nbGUgbGluZVxuXHR2YXIgc0ludGVycG9sYXRpb25Sb3VuZCA9IG5lc3RlZChyZXBsYWNlKC9bXlwiJy8oKV18XFwvKD8hXFwqKXxcXC9cXCooPzpbXipdfFxcKig/IVxcLykpKlxcKlxcL3w8PDA+PnxcXCg8PHNlbGY+PipcXCkvLnNvdXJjZSwgW3JlZ3VsYXJTdHJpbmdPckNoYXJhY3Rlcl0pLCAyKTtcblx0dmFyIHNJbnRlcnBvbGF0aW9uID0gcmVwbGFjZSgvXFx7KD8hXFx7KSg/Oig/IVt9Ol0pPDwwPj4pKjw8MT4+P1xcfS8uc291cmNlLCBbc0ludGVycG9sYXRpb25Sb3VuZCwgZm9ybWF0U3RyaW5nXSk7XG5cblx0ZnVuY3Rpb24gY3JlYXRlSW50ZXJwb2xhdGlvbkluc2lkZShpbnRlcnBvbGF0aW9uLCBpbnRlcnBvbGF0aW9uUm91bmQpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oKD86XnxbXntdKSg/Olxce1xceykqKTw8MD4+Ly5zb3VyY2UsIFtpbnRlcnBvbGF0aW9uXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdmb3JtYXQtc3RyaW5nJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogcmUoLyheXFx7KD86KD8hW306XSk8PDA+PikqKTw8MT4+KD89XFx9JCkvLnNvdXJjZSwgW2ludGVycG9sYXRpb25Sb3VuZCwgZm9ybWF0U3RyaW5nXSksXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eOi9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFx7fFxcfSQvLFxuXHRcdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLWNzaGFycCcsXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5jc2hhcnBcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9O1xuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3NoYXJwJywgJ3N0cmluZycsIHtcblx0XHQnaW50ZXJwb2xhdGlvbi1zdHJpbmcnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXnxbXlxcXFxdKSg/OlxcJEB8QFxcJClcIig/OlwiXCJ8XFxcXFtcXHNcXFNdfFxce1xce3w8PDA+PnxbXlxcXFx7XCJdKSpcIi8uc291cmNlLCBbbUludGVycG9sYXRpb25dKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGNyZWF0ZUludGVycG9sYXRpb25JbnNpZGUobUludGVycG9sYXRpb24sIG1JbnRlcnBvbGF0aW9uUm91bmQpLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogcmUoLyhefFteQFxcXFxdKVxcJFwiKD86XFxcXC58XFx7XFx7fDw8MD4+fFteXFxcXFwie10pKlwiLy5zb3VyY2UsIFtzSW50ZXJwb2xhdGlvbl0pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogY3JlYXRlSW50ZXJwb2xhdGlvbkluc2lkZShzSW50ZXJwb2xhdGlvbiwgc0ludGVycG9sYXRpb25Sb3VuZCksXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnY2hhcic6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChjaGFyYWN0ZXIpLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZG90bmV0ID0gUHJpc20ubGFuZ3VhZ2VzLmNzID0gUHJpc20ubGFuZ3VhZ2VzLmNzaGFycDtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuYXNwbmV0ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnbWFya3VwJywge1xuXHQncGFnZS1kaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogLzwlXFxzKkAuKiU+Lyxcblx0XHRhbGlhczogJ3RhZycsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncGFnZS1kaXJlY3RpdmUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC88JVxccypAXFxzKig/OkFzc2VtYmx5fENvbnRyb2x8SW1wbGVtZW50c3xJbXBvcnR8TWFzdGVyKD86VHlwZSk/fE91dHB1dENhY2hlfFBhZ2V8UHJldmlvdXNQYWdlVHlwZXxSZWZlcmVuY2V8UmVnaXN0ZXIpP3wlPi9pLFxuXHRcdFx0XHRhbGlhczogJ3RhZydcblx0XHRcdH0sXG5cdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMubWFya3VwLnRhZy5pbnNpZGVcblx0XHR9XG5cdH0sXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogLzwlLiolPi8sXG5cdFx0YWxpYXM6ICd0YWcnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLzwlXFxzKj9bJD0lIzpdezAsMn18JT4vLFxuXHRcdFx0XHRhbGlhczogJ3RhZydcblx0XHRcdH0sXG5cdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMuY3NoYXJwXG5cdFx0fVxuXHR9XG59KTtcbi8vIFJlZ2V4cCBjb3BpZWQgZnJvbSBwcmlzbS1tYXJrdXAsIHdpdGggYSBuZWdhdGl2ZSBsb29rLWFoZWFkIGFkZGVkXG5QcmlzbS5sYW5ndWFnZXMuYXNwbmV0LnRhZy5wYXR0ZXJuID0gLzwoPyElKVxcLz9bXlxccz5cXC9dKyg/OlxccytbXlxccz5cXC89XSsoPzo9KD86KFwifCcpKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKSpcXDF8W15cXHMnXCI+PV0rKSk/KSpcXHMqXFwvPz4vO1xuXG4vLyBtYXRjaCBkaXJlY3RpdmVzIG9mIGF0dHJpYnV0ZSB2YWx1ZSBmb289XCI8JSBCYXIgJT5cIlxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaW5zaWRlJywgJ3B1bmN0dWF0aW9uJywge1xuXHQnZGlyZWN0aXZlJzogUHJpc20ubGFuZ3VhZ2VzLmFzcG5ldFsnZGlyZWN0aXZlJ11cbn0sIFByaXNtLmxhbmd1YWdlcy5hc3BuZXQudGFnLmluc2lkZVsnYXR0ci12YWx1ZSddKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnYXNwbmV0JywgJ2NvbW1lbnQnLCB7XG5cdCdhc3AtY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvPCUtLVtcXHNcXFNdKj8tLSU+Lyxcblx0XHRhbGlhczogWydhc3AnLCAnY29tbWVudCddXG5cdH1cbn0pO1xuXG4vLyBzY3JpcHQgcnVuYXQ9XCJzZXJ2ZXJcIiBjb250YWlucyBjc2hhcnAsIG5vdCBqYXZhc2NyaXB0XG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdhc3BuZXQnLCBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdCA/ICdzY3JpcHQnIDogJ3RhZycsIHtcblx0J2FzcC1zY3JpcHQnOiB7XG5cdFx0cGF0dGVybjogLyg8c2NyaXB0KD89LipydW5hdD1bJ1wiXT9zZXJ2ZXJcXGIpW14+XSo+KVtcXHNcXFNdKj8oPz08XFwvc2NyaXB0PikvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiBbJ2FzcCcsICdzY3JpcHQnXSxcblx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5jc2hhcnAgfHwge31cblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5hc202NTAyID0ge1xuXHQnY29tbWVudCc6IC87LiovLFxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC9cXC5cXHcrKD89ICkvLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCdzdHJpbmcnOiAvKFtcIidgXSkoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0J29wLWNvZGUnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OkFEQ3xBTkR8QVNMfEJDQ3xCQ1N8QkVRfEJJVHxCTUl8Qk5FfEJQTHxCUkt8QlZDfEJWU3xDTEN8Q0xEfENMSXxDTFZ8Q01QfENQWHxDUFl8REVDfERFWHxERVl8RU9SfElOQ3xJTlh8SU5ZfEpNUHxKU1J8TERBfExEWHxMRFl8TFNSfE5PUHxPUkF8UEhBfFBIUHxQTEF8UExQfFJPTHxST1J8UlRJfFJUU3xTQkN8U0VDfFNFRHxTRUl8U1RBfFNUWHxTVFl8VEFYfFRBWXxUU1h8VFhBfFRYU3xUWUF8YWRjfGFuZHxhc2x8YmNjfGJjc3xiZXF8Yml0fGJtaXxibmV8YnBsfGJya3xidmN8YnZzfGNsY3xjbGR8Y2xpfGNsdnxjbXB8Y3B4fGNweXxkZWN8ZGV4fGRleXxlb3J8aW5jfGlueHxpbnl8am1wfGpzcnxsZGF8bGR4fGxkeXxsc3J8bm9wfG9yYXxwaGF8cGhwfHBsYXxwbHB8cm9sfHJvcnxydGl8cnRzfHNiY3xzZWN8c2VkfHNlaXxzdGF8c3R4fHN0eXx0YXh8dGF5fHRzeHx0eGF8dHhzfHR5YSlcXGIvLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2hleC1udW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyM/XFwkW1xcZGEtZl17MSw0fVxcYi9pLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQnYmluYXJ5LW51bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvIz8lWzAxXStcXGIvLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQnZGVjaW1hbC1udW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyM/XFxiXFxkK1xcYi8sXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdyZWdpc3Rlcic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW3h5YV1cXGIvaSxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvWygpLDpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmFzbWF0bWVsID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvOy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIidgXSkoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnY29uc3RhbnQnOiAvXFxiKD86UE9SVFtBLVpdfEREUltBLVpdfCg/OkREfFApW0EtWl0oPzpcXGR8WzAtMl1cXGR8M1swMV0pKVxcYi8sXG5cblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFwuXFx3Kyg/PSApLyxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQnci1yZWdpc3Rlcic6IHtcblx0XHRwYXR0ZXJuOiAvXFxicig/OlxcZHxbMTJdXFxkfDNbMDFdKVxcYi8sXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J29wLWNvZGUnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OkFEQ3xBRER8QURJV3xBTkR8QU5ESXxBU1J8QkNMUnxCTER8QlJCQ3xCUkJTfEJSQ0N8QlJDU3xCUkVBS3xCUkVRfEJSR0V8QlJIQ3xCUkhTfEJSSUR8QlJJRXxCUkxPfEJSTFR8QlJNSXxCUk5FfEJSUEx8QlJTSHxCUlRDfEJSVFN8QlJWQ3xCUlZTfEJTRVR8QlNUfENBTEx8Q0JJfENCUnxDTEN8Q0xIfENMSXxDTE58Q0xSfENMU3xDTFR8Q0xWfENMWnxDT018Q1B8Q1BDfENQSXxDUFNFfERFQ3xERVN8RUlDQUxMfEVJSk1QfEVMUE18RU9SfEZNVUx8Rk1VTFN8Rk1VTFNVfElDQUxMfElKTVB8SU58SU5DfEpNUHxMQUN8TEFTfExBVHxMRHxMRFtBLVphLXowLTldfExQTXxMU0x8TFNSfE1PVnxNT1ZXfE1VTHxNVUxTfE1VTFNVfE5FR3xOT1B8T1J8T1JJfE9VVHxQT1B8UFVTSHxSQ0FMTHxSRVR8UkVUSXxSSk1QfFJPTHxST1J8U0JDfFNCQ0l8U0JJfFNCSUN8U0JJU3xTQklXfFNCUnxTQlJDfFNCUlN8U0VDfFNFSHxTRUl8U0VOfFNFUnxTRVN8U0VUfFNFVnxTRVp8U0xFRVB8U1BNfFNUfFNUW0EtWjAtOV18U1VCfFNVQkl8U1dBUHxUU1R8V0RSfFhDSHxhZGN8YWRkfGFkaXd8YW5kfGFuZGl8YXNyfGJjbHJ8YmxkfGJyYmN8YnJic3xicmNjfGJyY3N8YnJlYWt8YnJlcXxicmdlfGJyaGN8YnJoc3xicmlkfGJyaWV8YnJsb3xicmx0fGJybWl8YnJuZXxicnBsfGJyc2h8YnJ0Y3xicnRzfGJydmN8YnJ2c3xic2V0fGJzdHxjYWxsfGNiaXxjYnJ8Y2xjfGNsaHxjbGl8Y2xufGNscnxjbHN8Y2x0fGNsdnxjbHp8Y29tfGNwfGNwY3xjcGl8Y3BzZXxkZWN8ZGVzfGVpY2FsbHxlaWptcHxlbHBtfGVvcnxmbXVsfGZtdWxzfGZtdWxzdXxpY2FsbHxpam1wfGlufGluY3xqbXB8bGFjfGxhc3xsYXR8bGR8bGRbYS16MC05XXxscG18bHNsfGxzcnxtb3Z8bW92d3xtdWx8bXVsc3xtdWxzdXxuZWd8bm9wfG9yfG9yaXxvdXR8cG9wfHB1c2h8cmNhbGx8cmV0fHJldGl8cmptcHxyb2x8cm9yfHNiY3xzYmNpfHNiaXxzYmljfHNiaXN8c2Jpd3xzYnJ8c2JyY3xzYnJzfHNlY3xzZWh8c2VpfHNlbnxzZXJ8c2VzfHNldHxzZXZ8c2V6fHNsZWVwfHNwbXxzdHxzdFthLXpBLVowLTldfHN1YnxzdWJpfHN3YXB8dHN0fHdkcnx4Y2gpXFxiLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdoZXgtbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8jP1xcJFtcXGRhLWZdezIsNH1cXGIvaSxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J2JpbmFyeS1udW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyM/JVswMV0rXFxiLyxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J2RlY2ltYWwtbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8jP1xcYlxcZCtcXGIvLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQncmVnaXN0ZXInOiB7XG5cdFx0cGF0dGVybjogL1xcYlthY3pudnNodGl4eV1cXGIvaSxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQnb3BlcmF0b3InOiAvPj49P3w8PD0/fCZbJj1dP3xcXHxbXFx8PV0/fFstKyovJV4hPTw+P109Py8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCksOl0vXG59O1xuXG4vLyBOT1RFUyAtIGZvbGxvd3MgZmlyc3QtZmlyc3QgaGlnaGxpZ2h0IG1ldGhvZCwgYmxvY2sgaXMgbG9ja2VkIGFmdGVyIGhpZ2hsaWdodCwgZGlmZmVyZW50IGZyb20gU3ludGF4SGxcblByaXNtLmxhbmd1YWdlcy5hdXRvaG90a2V5ID0ge1xuXHQnY29tbWVudCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKTsuKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKVxcL1xcKig/OltcXHJcXG5dKD8hWyBcXHRdKlxcKlxcLyl8W15cXHJcXG5dKSooPzpbXFxyXFxuXVsgXFx0XSpcXCpcXC8pPy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3RhZyc6IHtcblx0XHQvLyBsYWJlbHNcblx0XHRwYXR0ZXJuOiAvXihbIFxcdF0qKVteXFxzLGBcIjpdKyg/PTpbIFxcdF0qJCkvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiAvXCIoPzpbXlwiXFxuXFxyXXxcIlwiKSpcIi8sXG5cdCd2YXJpYWJsZSc6IC8lXFx3KyUvLFxuXHQnbnVtYmVyJzogL1xcYjB4W1xcZEEtRmEtZl0rXFxifCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpbRWVdLT9cXGQrKT8vLFxuXHQnb3BlcmF0b3InOiAvXFw/fFxcL1xcLz89P3w6PXxcXHxbPXxdP3wmWz0mXT98XFwrWz0rXT98LVs9LV0/fFxcKls9Kl0/fDwoPzo8PT98Pnw9KT98Pj4/PT98Wy5eIT1+XT0/fFxcYig/OkFORHxOT1R8T1IpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXG5cdCdjb21tYW5kJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpBdXRvVHJpbXxCbG9ja0lucHV0fEJyZWFrfENsaWNrfENsaXBXYWl0fENvbnRpbnVlfENvbnRyb2x8Q29udHJvbENsaWNrfENvbnRyb2xGb2N1c3xDb250cm9sR2V0fENvbnRyb2xHZXRGb2N1c3xDb250cm9sR2V0UG9zfENvbnRyb2xHZXRUZXh0fENvbnRyb2xNb3ZlfENvbnRyb2xTZW5kfENvbnRyb2xTZW5kUmF3fENvbnRyb2xTZXRUZXh0fENvb3JkTW9kZXxDcml0aWNhbHxEZXRlY3RIaWRkZW5UZXh0fERldGVjdEhpZGRlbldpbmRvd3N8RHJpdmV8RHJpdmVHZXR8RHJpdmVTcGFjZUZyZWV8RW52QWRkfEVudkRpdnxFbnZHZXR8RW52TXVsdHxFbnZTZXR8RW52U3VifEVudlVwZGF0ZXxFeGl0fEV4aXRBcHB8RmlsZUFwcGVuZHxGaWxlQ29weXxGaWxlQ29weURpcnxGaWxlQ3JlYXRlRGlyfEZpbGVDcmVhdGVTaG9ydGN1dHxGaWxlRGVsZXRlfEZpbGVFbmNvZGluZ3xGaWxlR2V0QXR0cmlifEZpbGVHZXRTaG9ydGN1dHxGaWxlR2V0U2l6ZXxGaWxlR2V0VGltZXxGaWxlR2V0VmVyc2lvbnxGaWxlSW5zdGFsbHxGaWxlTW92ZXxGaWxlTW92ZURpcnxGaWxlUmVhZHxGaWxlUmVhZExpbmV8RmlsZVJlY3ljbGV8RmlsZVJlY3ljbGVFbXB0eXxGaWxlUmVtb3ZlRGlyfEZpbGVTZWxlY3RGaWxlfEZpbGVTZWxlY3RGb2xkZXJ8RmlsZVNldEF0dHJpYnxGaWxlU2V0VGltZXxGb3JtYXRUaW1lfEdldEtleVN0YXRlfEdvc3VifEdvdG98R3JvdXBBY3RpdmF0ZXxHcm91cEFkZHxHcm91cENsb3NlfEdyb3VwRGVhY3RpdmF0ZXxHdWl8R3VpQ29udHJvbHxHdWlDb250cm9sR2V0fEhvdGtleXxJbWFnZVNlYXJjaHxJbmlEZWxldGV8SW5pUmVhZHxJbmlXcml0ZXxJbnB1dHxJbnB1dEJveHxLZXlXYWl0fExpc3RIb3RrZXlzfExpc3RMaW5lc3xMaXN0VmFyc3xMb29wfE1lbnV8TW91c2VDbGlja3xNb3VzZUNsaWNrRHJhZ3xNb3VzZUdldFBvc3xNb3VzZU1vdmV8TXNnQm94fE9uRXhpdHxPdXRwdXREZWJ1Z3xQYXVzZXxQaXhlbEdldENvbG9yfFBpeGVsU2VhcmNofFBvc3RNZXNzYWdlfFByb2Nlc3N8UHJvZ3Jlc3N8UmFuZG9tfFJlZ0RlbGV0ZXxSZWdSZWFkfFJlZ1dyaXRlfFJlbG9hZHxSZXBlYXR8UmV0dXJufFJ1bnxSdW5Bc3xSdW5XYWl0fFNlbmR8U2VuZEV2ZW50fFNlbmRJbnB1dHxTZW5kTWVzc2FnZXxTZW5kTW9kZXxTZW5kUGxheXxTZW5kUmF3fFNldEJhdGNoTGluZXN8U2V0Q2Fwc2xvY2tTdGF0ZXxTZXRDb250cm9sRGVsYXl8U2V0RGVmYXVsdE1vdXNlU3BlZWR8U2V0RW52fFNldEZvcm1hdHxTZXRLZXlEZWxheXxTZXRNb3VzZURlbGF5fFNldE51bWxvY2tTdGF0ZXxTZXRSZWdWaWV3fFNldFNjcm9sbExvY2tTdGF0ZXxTZXRTdG9yZUNhcHNsb2NrTW9kZXxTZXRUaW1lcnxTZXRUaXRsZU1hdGNoTW9kZXxTZXRXaW5EZWxheXxTZXRXb3JraW5nRGlyfFNodXRkb3dufFNsZWVwfFNvcnR8U291bmRCZWVwfFNvdW5kR2V0fFNvdW5kR2V0V2F2ZVZvbHVtZXxTb3VuZFBsYXl8U291bmRTZXR8U291bmRTZXRXYXZlVm9sdW1lfFNwbGFzaEltYWdlfFNwbGFzaFRleHRPZmZ8U3BsYXNoVGV4dE9ufFNwbGl0UGF0aHxTdGF0dXNCYXJHZXRUZXh0fFN0YXR1c0JhcldhaXR8U3RyaW5nQ2FzZVNlbnNlfFN0cmluZ0dldFBvc3xTdHJpbmdMZWZ0fFN0cmluZ0xlbnxTdHJpbmdMb3dlcnxTdHJpbmdNaWR8U3RyaW5nUmVwbGFjZXxTdHJpbmdSaWdodHxTdHJpbmdTcGxpdHxTdHJpbmdUcmltTGVmdHxTdHJpbmdUcmltUmlnaHR8U3RyaW5nVXBwZXJ8U3VzcGVuZHxTeXNHZXR8VGhyZWFkfFRvb2xUaXB8VHJhbnNmb3JtfFRyYXlUaXB8VVJMRG93bmxvYWRUb0ZpbGV8V2luQWN0aXZhdGV8V2luQWN0aXZhdGVCb3R0b218V2luQ2xvc2V8V2luR2V0fFdpbkdldEFjdGl2ZVN0YXRzfFdpbkdldEFjdGl2ZVRpdGxlfFdpbkdldENsYXNzfFdpbkdldFBvc3xXaW5HZXRUZXh0fFdpbkdldFRpdGxlfFdpbkhpZGV8V2luS2lsbHxXaW5NYXhpbWl6ZXxXaW5NZW51U2VsZWN0SXRlbXxXaW5NaW5pbWl6ZXxXaW5NaW5pbWl6ZUFsbHxXaW5NaW5pbWl6ZUFsbFVuZG98V2luTW92ZXxXaW5SZXN0b3JlfFdpblNldHxXaW5TZXRUaXRsZXxXaW5TaG93fFdpbldhaXR8V2luV2FpdEFjdGl2ZXxXaW5XYWl0Q2xvc2V8V2luV2FpdE5vdEFjdGl2ZSlcXGIvaSxcblx0XHRhbGlhczogJ3NlbGVjdG9yJ1xuXHR9LFxuXG5cdCdjb25zdGFudCc6IC9cXGIoPzphX2Foa3BhdGh8YV9haGt2ZXJzaW9ufGFfYXBwZGF0YXxhX2FwcGRhdGFjb21tb258YV9hdXRvdHJpbXxhX2JhdGNobGluZXN8YV9jYXJldHh8YV9jYXJldHl8YV9jb21wdXRlcm5hbWV8YV9jb250cm9sZGVsYXl8YV9jdXJzb3J8YV9kZHxhX2RkZHxhX2RkZGR8YV9kZWZhdWx0bW91c2VzcGVlZHxhX2Rlc2t0b3B8YV9kZXNrdG9wY29tbW9ufGFfZGV0ZWN0aGlkZGVudGV4dHxhX2RldGVjdGhpZGRlbndpbmRvd3N8YV9lbmRjaGFyfGFfZXZlbnRpbmZvfGFfZXhpdHJlYXNvbnxhX2ZpbGVlbmNvZGluZ3xhX2Zvcm1hdGZsb2F0fGFfZm9ybWF0aW50ZWdlcnxhX2d1aXxhX2d1aWNvbnRyb2x8YV9ndWljb250cm9sZXZlbnR8YV9ndWlldmVudHxhX2d1aWhlaWdodHxhX2d1aXdpZHRofGFfZ3VpeHxhX2d1aXl8YV9ob3VyfGFfaWNvbmZpbGV8YV9pY29uaGlkZGVufGFfaWNvbm51bWJlcnxhX2ljb250aXB8YV9pbmRleHxhX2lwYWRkcmVzczF8YV9pcGFkZHJlc3MyfGFfaXBhZGRyZXNzM3xhX2lwYWRkcmVzczR8YV9pczY0Yml0b3N8YV9pc2FkbWlufGFfaXNjb21waWxlZHxhX2lzY3JpdGljYWx8YV9pc3BhdXNlZHxhX2lzc3VzcGVuZGVkfGFfaXN1bmljb2RlfGFfa2V5ZGVsYXl8YV9sYW5ndWFnZXxhX2xhc3RlcnJvcnxhX2xpbmVmaWxlfGFfbGluZW51bWJlcnxhX2xvb3BmaWVsZHxhX2xvb3BmaWxlYXR0cmlifGFfbG9vcGZpbGVkaXJ8YV9sb29wZmlsZWV4dHxhX2xvb3BmaWxlZnVsbHBhdGh8YV9sb29wZmlsZWxvbmdwYXRofGFfbG9vcGZpbGVuYW1lfGFfbG9vcGZpbGVzaG9ydG5hbWV8YV9sb29wZmlsZXNob3J0cGF0aHxhX2xvb3BmaWxlc2l6ZXxhX2xvb3BmaWxlc2l6ZWtifGFfbG9vcGZpbGVzaXplbWJ8YV9sb29wZmlsZXRpbWVhY2Nlc3NlZHxhX2xvb3BmaWxldGltZWNyZWF0ZWR8YV9sb29wZmlsZXRpbWVtb2RpZmllZHxhX2xvb3ByZWFkbGluZXxhX2xvb3ByZWdrZXl8YV9sb29wcmVnbmFtZXxhX2xvb3ByZWdzdWJrZXl8YV9sb29wcmVndGltZW1vZGlmaWVkfGFfbG9vcHJlZ3R5cGV8YV9tZGF5fGFfbWlufGFfbW18YV9tbW18YV9tbW1tfGFfbW9ufGFfbW91c2VkZWxheXxhX21zZWN8YV9teWRvY3VtZW50c3xhX25vd3xhX25vd3V0Y3xhX251bWJhdGNobGluZXN8YV9vc3R5cGV8YV9vc3ZlcnNpb258YV9wcmlvcmhvdGtleXxhX3ByaW9ya2V5fGFfcHJvZ3JhbWZpbGVzfGFfcHJvZ3JhbXN8YV9wcm9ncmFtc2NvbW1vbnxhX3B0cnNpemV8YV9yZWd2aWV3fGFfc2NyZWVuZHBpfGFfc2NyZWVuaGVpZ2h0fGFfc2NyZWVud2lkdGh8YV9zY3JpcHRkaXJ8YV9zY3JpcHRmdWxscGF0aHxhX3NjcmlwdGh3bmR8YV9zY3JpcHRuYW1lfGFfc2VjfGFfc3BhY2V8YV9zdGFydG1lbnV8YV9zdGFydG1lbnVjb21tb258YV9zdGFydHVwfGFfc3RhcnR1cGNvbW1vbnxhX3N0cmluZ2Nhc2VzZW5zZXxhX3RhYnxhX3RlbXB8YV90aGlzZnVuY3xhX3RoaXNob3RrZXl8YV90aGlzbGFiZWx8YV90aGlzbWVudXxhX3RoaXNtZW51aXRlbXxhX3RoaXNtZW51aXRlbXBvc3xhX3RpY2tjb3VudHxhX3RpbWVpZGxlfGFfdGltZWlkbGVwaHlzaWNhbHxhX3RpbWVzaW5jZXByaW9yaG90a2V5fGFfdGltZXNpbmNldGhpc2hvdGtleXxhX3RpdGxlbWF0Y2htb2RlfGFfdGl0bGVtYXRjaG1vZGVzcGVlZHxhX3VzZXJuYW1lfGFfd2RheXxhX3dpbmRlbGF5fGFfd2luZGlyfGFfd29ya2luZ2RpcnxhX3lkYXl8YV95ZWFyfGFfeXdlZWt8YV95eXl5fGNsaXBib2FyZHxjbGlwYm9hcmRhbGx8Y29tc3BlY3xlcnJvcmxldmVsfHByb2dyYW1maWxlcylcXGIvaSxcblxuXHQnYnVpbHRpbic6IC9cXGIoPzphYnN8YWNvc3xhc2N8YXNpbnxhdGFufGNlaWx8Y2hyfGNsYXNzfGNvbW9iamFjdGl2ZXxjb21vYmphcnJheXxjb21vYmpjb25uZWN0fGNvbW9iamNyZWF0ZXxjb21vYmplcnJvcnxjb21vYmpmbGFnc3xjb21vYmpnZXR8Y29tb2JqcXVlcnl8Y29tb2JqdHlwZXxjb21vYmp2YWx1ZXxjb3N8ZGxsY2FsbHxleHB8ZmlsZWV4aXN0fEZpbGVvcGVufGZsb29yfGZvcm1hdHxpbF9hZGR8aWxfY3JlYXRlfGlsX2Rlc3Ryb3l8aW5zdHJ8aXNmdW5jfGlzbGFiZWx8SXNPYmplY3R8bG58bG9nfGx0cmltfGx2X2FkZHxsdl9kZWxldGV8bHZfZGVsZXRlY29sfGx2X2dldGNvdW50fGx2X2dldG5leHR8bHZfZ2V0dGV4dHxsdl9pbnNlcnR8bHZfaW5zZXJ0Y29sfGx2X21vZGlmeXxsdl9tb2RpZnljb2x8bHZfc2V0aW1hZ2VsaXN0fG1vZHxudW1nZXR8bnVtcHV0fG9ubWVzc2FnZXxyZWdleG1hdGNofHJlZ2V4cmVwbGFjZXxyZWdpc3RlcmNhbGxiYWNrfHJvdW5kfHJ0cmltfHNiX3NldGljb258c2Jfc2V0cGFydHN8c2Jfc2V0dGV4dHxzaW58c3FydHxzdHJsZW58c3RycmVwbGFjZXxzdHJzcGxpdHxzdWJzdHJ8dGFufHR2X2FkZHx0dl9kZWxldGV8dHZfZ2V0fHR2X2dldGNoaWxkfHR2X2dldGNvdW50fHR2X2dldG5leHR8dHZfZ2V0cGFyZW50fHR2X2dldHByZXZ8dHZfZ2V0c2VsZWN0aW9ufHR2X2dldHRleHR8dHZfbW9kaWZ5fHZhcnNldGNhcGFjaXR5fHdpbmFjdGl2ZXx3aW5leGlzdHxfX0NhbGx8X19HZXR8X19OZXd8X19TZXQpXFxiL2ksXG5cblx0J3N5bWJvbCc6IC9cXGIoPzphbHR8YWx0ZG93bnxhbHR1cHxhcHBza2V5fGJhY2tzcGFjZXxicm93c2VyX2JhY2t8YnJvd3Nlcl9mYXZvcml0ZXN8YnJvd3Nlcl9mb3J3YXJkfGJyb3dzZXJfaG9tZXxicm93c2VyX3JlZnJlc2h8YnJvd3Nlcl9zZWFyY2h8YnJvd3Nlcl9zdG9wfGJzfGNhcHNsb2NrfGN0cmx8Y3RybGJyZWFrfGN0cmxkb3dufGN0cmx1cHxkZWx8ZGVsZXRlfGRvd258ZW5kfGVudGVyfGVzY3xlc2NhcGV8ZjF8ZjEwfGYxMXxmMTJ8ZjEzfGYxNHxmMTV8ZjE2fGYxN3xmMTh8ZjE5fGYyfGYyMHxmMjF8ZjIyfGYyM3xmMjR8ZjN8ZjR8ZjV8ZjZ8Zjd8Zjh8Zjl8aG9tZXxpbnN8aW5zZXJ0fGpveTF8am95MTB8am95MTF8am95MTJ8am95MTN8am95MTR8am95MTV8am95MTZ8am95MTd8am95MTh8am95MTl8am95Mnxqb3kyMHxqb3kyMXxqb3kyMnxqb3kyM3xqb3kyNHxqb3kyNXxqb3kyNnxqb3kyN3xqb3kyOHxqb3kyOXxqb3kzfGpveTMwfGpveTMxfGpveTMyfGpveTR8am95NXxqb3k2fGpveTd8am95OHxqb3k5fGpveWF4ZXN8am95YnV0dG9uc3xqb3lpbmZvfGpveW5hbWV8am95cG92fGpveXJ8am95dXxqb3l2fGpveXh8am95eXxqb3l6fGxhbHR8bGF1bmNoX2FwcDF8bGF1bmNoX2FwcDJ8bGF1bmNoX21haWx8bGF1bmNoX21lZGlhfGxidXR0b258bGNvbnRyb2x8bGN0cmx8bGVmdHxsc2hpZnR8bHdpbnxsd2luZG93bnxsd2ludXB8bWJ1dHRvbnxtZWRpYV9uZXh0fG1lZGlhX3BsYXlfcGF1c2V8bWVkaWFfcHJldnxtZWRpYV9zdG9wfG51bWxvY2t8bnVtcGFkMHxudW1wYWQxfG51bXBhZDJ8bnVtcGFkM3xudW1wYWQ0fG51bXBhZDV8bnVtcGFkNnxudW1wYWQ3fG51bXBhZDh8bnVtcGFkOXxudW1wYWRhZGR8bnVtcGFkY2xlYXJ8bnVtcGFkZGVsfG51bXBhZGRpdnxudW1wYWRkb3R8bnVtcGFkZG93bnxudW1wYWRlbmR8bnVtcGFkZW50ZXJ8bnVtcGFkaG9tZXxudW1wYWRpbnN8bnVtcGFkbGVmdHxudW1wYWRtdWx0fG51bXBhZHBnZG58bnVtcGFkcGd1cHxudW1wYWRyaWdodHxudW1wYWRzdWJ8bnVtcGFkdXB8cGdkbnxwZ3VwfHByaW50c2NyZWVufHJhbHR8cmJ1dHRvbnxyY29udHJvbHxyY3RybHxyaWdodHxyc2hpZnR8cndpbnxyd2luZG93bnxyd2ludXB8c2Nyb2xsbG9ja3xzaGlmdHxzaGlmdGRvd258c2hpZnR1cHxzcGFjZXx0YWJ8dXB8dm9sdW1lX2Rvd258dm9sdW1lX211dGV8dm9sdW1lX3VwfHdoZWVsZG93bnx3aGVlbGxlZnR8d2hlZWxyaWdodHx3aGVlbHVwfHhidXR0b24xfHhidXR0b24yKVxcYi9pLFxuXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogLyNbYS16XStcXGIvaSxcblx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0fSxcblxuXHQna2V5d29yZCc6IC9cXGIoPzpBYm9ydHxBYm92ZU5vcm1hbHxBZGR8YWhrX2NsYXNzfGFoa19leGV8YWhrX2dyb3VwfGFoa19pZHxhaGtfcGlkfEFsbHxBbG51bXxBbHBoYXxBbHRTdWJtaXR8QWx0VGFifEFsdFRhYkFuZE1lbnV8QWx0VGFiTWVudXxBbHRUYWJNZW51RGlzbWlzc3xBbHdheXNPblRvcHxBdXRvU2l6ZXxCYWNrZ3JvdW5kfEJhY2tncm91bmRUcmFuc3xCZWxvd05vcm1hbHxiZXR3ZWVufEJpdEFuZHxCaXROb3R8Qml0T3J8Qml0U2hpZnRMZWZ0fEJpdFNoaWZ0UmlnaHR8Qml0WE9yfEJvbGR8Qm9yZGVyfEJ1dHRvbnxCeVJlZnxDYXRjaHxDaGVja2JveHxDaGVja2VkfENoZWNrZWRHcmF5fENob29zZXxDaG9vc2VTdHJpbmd8Q2xvc2V8Q29sb3J8Q29tYm9Cb3h8Q29udGFpbnN8Q29udHJvbExpc3R8Q291bnR8RGF0ZXxEYXRlVGltZXxEYXlzfERETHxEZWZhdWx0fERlbGV0ZUFsbHxEZWxpbWl0ZXJ8RGVyZWZ8RGVzdHJveXxEaWdpdHxEaXNhYmxlfERpc2FibGVkfERyb3BEb3duTGlzdHxFZGl0fEVqZWN0fEVsc2V8RW5hYmxlfEVuYWJsZWR8RXJyb3J8RXhpc3R8RXhwYW5kfEV4U3R5bGV8RmlsZVN5c3RlbXxGaW5hbGx5fEZpcnN0fEZsYXNofEZsb2F0fEZsb2F0RmFzdHxGb2N1c3xGb250fGZvcnxnbG9iYWx8R3JpZHxHcm91cHxHcm91cEJveHxHdWlDbG9zZXxHdWlDb250ZXh0TWVudXxHdWlEcm9wRmlsZXN8R3VpRXNjYXBlfEd1aVNpemV8SGRyfEhpZGRlbnxIaWRlfEhpZ2h8SEtDQ3xIS0NSfEhLQ1V8SEtFWV9DTEFTU0VTX1JPT1R8SEtFWV9DVVJSRU5UX0NPTkZJR3xIS0VZX0NVUlJFTlRfVVNFUnxIS0VZX0xPQ0FMX01BQ0hJTkV8SEtFWV9VU0VSU3xIS0xNfEhLVXxIb3Vyc3xIU2Nyb2xsfEljb258SWNvblNtYWxsfElEfElETGFzdHxJZnxJZkVxdWFsfElmRXhpc3R8SWZHcmVhdGVyfElmR3JlYXRlck9yRXF1YWx8SWZJblN0cmluZ3xJZkxlc3N8SWZMZXNzT3JFcXVhbHxJZk1zZ0JveHxJZk5vdEVxdWFsfElmTm90RXhpc3R8SWZOb3RJblN0cmluZ3xJZldpbkFjdGl2ZXxJZldpbkV4aXN0fElmV2luTm90QWN0aXZlfElmV2luTm90RXhpc3R8SWdub3JlfEltYWdlTGlzdHxpbnxJbnRlZ2VyfEludGVnZXJGYXN0fEludGVycnVwdHxpc3xpdGFsaWN8Sm9pbnxMYWJlbHxMYXN0Rm91bmR8TGFzdEZvdW5kRXhpc3R8TGltaXR8TGluZXN8TGlzdHxMaXN0Qm94fExpc3RWaWV3fGxvY2FsfExvY2t8TG9nb2ZmfExvd3xMb3dlcnxMb3dlcmNhc2V8TWFpbldpbmRvd3xNYXJnaW58TWF4aW1pemV8TWF4aW1pemVCb3h8TWF4U2l6ZXxNaW5pbWl6ZXxNaW5pbWl6ZUJveHxNaW5NYXh8TWluU2l6ZXxNaW51dGVzfE1vbnRoQ2FsfE1vdXNlfE1vdmV8TXVsdGl8TkF8Tm98Tm9BY3RpdmF0ZXxOb0RlZmF1bHR8Tm9IaWRlfE5vSWNvbnxOb01haW5XaW5kb3d8bm9ybXxOb3JtYWx8Tm9Tb3J0fE5vU29ydEhkcnxOb1N0YW5kYXJkfE5vdHxOb1RhYnxOb1RpbWVyc3xOdW1iZXJ8T2ZmfE9rfE9ufE93bkRpYWxvZ3N8T3duZXJ8UGFyc2V8UGFzc3dvcmR8UGljdHVyZXxQaXhlbHxQb3N8UG93fFByaW9yaXR5fFByb2Nlc3NOYW1lfFJhZGlvfFJhbmdlfFJlYWR8UmVhZE9ubHl8UmVhbHRpbWV8UmVkcmF3fFJlZ2lvbnxSRUdfQklOQVJZfFJFR19EV09SRHxSRUdfRVhQQU5EX1NafFJFR19NVUxUSV9TWnxSRUdfU1p8UmVsYXRpdmV8UmVuYW1lfFJlcG9ydHxSZXNpemV8UmVzdG9yZXxSZXRyeXxSR0J8U2NyZWVufFNlY29uZHN8U2VjdGlvbnxTZXJpYWx8U2V0TGFiZWx8U2hpZnRBbHRUYWJ8U2hvd3xTaW5nbGV8U2xpZGVyfFNvcnREZXNjfFN0YW5kYXJkfHN0YXRpY3xTdGF0dXN8U3RhdHVzQmFyfFN0YXR1c0NEfHN0cmlrZXxTdHlsZXxTdWJtaXR8U3lzTWVudXxUYWIyfFRhYlN0b3B8VGV4dHxUaGVtZXxUaHJvd3xUaWxlfFRvZ2dsZUNoZWNrfFRvZ2dsZUVuYWJsZXxUb29sV2luZG93fFRvcHxUb3Btb3N0fFRyYW5zQ29sb3J8VHJhbnNwYXJlbnR8VHJheXxUcmVlVmlld3xUcnl8VHJ5QWdhaW58VHlwZXxVbkNoZWNrfHVuZGVybGluZXxVbmljb2RlfFVubG9ja3xVbnRpbHxVcERvd258VXBwZXJ8VXBwZXJjYXNlfFVzZUVycm9yTGV2ZWx8VmlzfFZpc0ZpcnN0fFZpc2libGV8VlNjcm9sbHxXYWl0fFdhaXRDbG9zZXxXYW50Q3RybEF8V2FudEYyfFdhbnRSZXR1cm58V2hpbGV8V3JhcHxYZGlnaXR8eG18eHB8eHN8WWVzfHltfHlwfHlzKVxcYi9pLFxuXHQnZnVuY3Rpb24nOiAvW14oKTsgXFx0LFxcbisqXFwtPT8+OlxcXFxcXC88JiVcXFtcXF1dKyg/PVxcKCkvLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXSgpOixdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmF1dG9pdCA9IHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0LzsuKi8sXG5cdFx0e1xuXHRcdFx0Ly8gVGhlIG11bHRpLWxpbmUgY29tbWVudHMgZGVsaW1pdGVycyBjYW4gYWN0dWFsbHkgYmUgY29tbWVudGVkIG91dCB3aXRoIFwiO1wiXG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSMoPzpjb21tZW50cy1zdGFydHxjcylbXFxzXFxTXSo/XlsgXFx0XSojKD86Y2V8Y29tbWVudHMtZW5kKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3VybCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qI2luY2x1ZGVcXHMrKSg/OjxbXlxcclxcbj5dKz58XCJbXlxcclxcblwiXStcIikvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInXSkoPzpcXDFcXDF8KD8hXFwxKVteXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndmFyaWFibGUnOiAvKFslJEBdKVxcdytcXDEvXG5cdFx0fVxuXHR9LFxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopI1tcXHctXSsvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2Z1bmN0aW9uJzogL1xcYlxcdysoPz1cXCgpLyxcblx0Ly8gVmFyaWFibGVzIGFuZCBtYWNyb3Ncblx0J3ZhcmlhYmxlJzogL1skQF1cXHcrLyxcblx0J2tleXdvcmQnOiAvXFxiKD86Q2FzZXxDb25zdHxDb250aW51ZSg/OkNhc2V8TG9vcCl8RGVmYXVsdHxEaW18RG98RWxzZSg/OklmKT98RW5kKD86RnVuY3xJZnxTZWxlY3R8U3dpdGNofFdpdGgpfEVudW18RXhpdCg/Okxvb3ApP3xGb3J8RnVuY3xHbG9iYWx8SWZ8SW58TG9jYWx8TmV4dHxOdWxsfFJlRGltfFNlbGVjdHxTdGF0aWN8U3RlcHxTd2l0Y2h8VGhlbnxUb3xVbnRpbHxWb2xhdGlsZXxXRW5kfFdoaWxlfFdpdGgpXFxiL2ksXG5cdCdudW1iZXInOiAvXFxiKD86MHhbXFxkYS1mXSt8XFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspPylcXGIvaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86RmFsc2V8VHJ1ZSlcXGIvaSxcblx0J29wZXJhdG9yJzogLzxbPT5dP3xbLSsqXFwvPSY+XT0/fFs/Xl18XFxiKD86QW5kfE5vdHxPcilcXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF0oKS4sOl0vXG59O1xuXG4vLyBodHRwOi8vYXZpc3ludGgubmwvaW5kZXgucGhwL1RoZV9mdWxsX0F2aVN5bnRoX2dyYW1tYXJcbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRmdW5jdGlvbiByZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50cykge1xuXHRcdHJldHVybiBwYXR0ZXJuLnJlcGxhY2UoLzw8KFxcZCspPj4vZywgZnVuY3Rpb24gKG0sIGluZGV4KSB7XG5cdFx0XHRyZXR1cm4gcmVwbGFjZW1lbnRzWytpbmRleF07XG5cdFx0fSk7XG5cdH1cblxuXHRmdW5jdGlvbiByZShwYXR0ZXJuLCByZXBsYWNlbWVudHMsIGZsYWdzKSB7XG5cdFx0cmV0dXJuIFJlZ0V4cChyZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50cyksIGZsYWdzIHx8ICcnKTtcblx0fVxuXG5cdHZhciB0eXBlcyA9IC9ib29sfGNsaXB8ZmxvYXR8aW50fHN0cmluZ3x2YWwvLnNvdXJjZTtcblx0dmFyIGludGVybmFscyA9IFtcblx0XHQvLyBib29sc1xuXHRcdC9pcyg/OmJvb2x8Y2xpcHxmbG9hdHxpbnR8c3RyaW5nKXxkZWZpbmVkfCg/Oig/OmludGVybmFsKT9mdW5jdGlvbnx2YXIpP2V4aXN0cz8vLnNvdXJjZSxcblx0XHQvLyBjb250cm9sXG5cdFx0L2FwcGx5fGFzc2VydHxkZWZhdWx0fGV2YWx8aW1wb3J0fG5vcHxzZWxlY3R8dW5kZWZpbmVkLy5zb3VyY2UsXG5cdFx0Ly8gZ2xvYmFsXG5cdFx0L29wdF8oPzphbGxvd2Zsb2F0YXVkaW98YXZpcGFkc2NhbmxpbmVzfGR3Y2hhbm5lbG1hc2t8ZW5hYmxlXyg/OmI2NGF8cGxhbmFydG9wYWNrZWRyZ2J8djIxMHx5M18xMF8xMHx5M18xMF8xNil8dXNld2F2ZWV4dGVuc2libGV8dmR1YnBsYW5hcmhhY2spfHNldCg/OmNhY2hlbW9kZXxtYXhjcHV8bWVtb3J5bWF4fHBsYW5hcmxlZ2FjeWFsaWdubWVudHx3b3JraW5nZGlyKS8uc291cmNlLFxuXHRcdC8vIGNvbnZcblx0XHQvaGV4KD86dmFsdWUpP3x2YWx1ZS8uc291cmNlLFxuXHRcdC8vIG51bWVyaWNcblx0XHQvYWJzfGNlaWx8Y29udGludWVkKD86ZGVub21pbmF0b3J8bnVtZXJhdG9yKT98ZXhwfGZsb29yfGZtb2R8ZnJhY3xsb2coPzoxMCk/fG1heHxtaW58bXVsZGl2fHBpfHBvd3xyYW5kfHJvdW5kfHNpZ258c3BsaW5lfHNxcnQvLnNvdXJjZSxcblx0XHQvLyB0cmlnXG5cdFx0L2E/c2luaD98YT9jb3NoP3xhP3RhblsyaF0/Ly5zb3VyY2UsXG5cdFx0Ly8gYml0XG5cdFx0Lyg/OmJpdCg/OmFuZHxub3R8eD9vcnxbbHJdP3NoaWZ0W2FzbHVdP3xzaFtscl18c2FbbHJdfFtscl1yb3RhdGVsP3xyb1tybF18dGU/c3R8c2V0KD86Y291bnQpP3xjbCg/OmVhKT9yfGNoKD86YW4pP2dlPykpLy5zb3VyY2UsXG5cdFx0Ly8gcnVudGltZVxuXHRcdC9hdmVyYWdlKD86W2Jncl18Y2hyb21hW3V2XXxsdW1hKXwoPzpbcmdiXXxjaHJvbWFbdXZdfGx1bWF8cmdifFt5dXZdKD89ZGlmZmVyZW5jZSg/OmZyb21wcmV2aW91c3x0b25leHQpKSlkaWZmZXJlbmNlKD86ZnJvbXByZXZpb3VzfHRvbmV4dCk/fFt5dXZyZ2JdcGxhbmUoPzptZWRpYW58bWlufG1heHxtaW5tYXhkaWZmZXJlbmNlKS8uc291cmNlLFxuXHRcdC8vIHNjcmlwdFxuXHRcdC9nZXRwcm9jZXNzaW5mb3xsb2dtc2d8c2NyaXB0KD86ZGlyKD86dXRmOCk/fGZpbGUoPzp1dGY4KT98bmFtZSg/OnV0ZjgpPyl8c2V0bG9ncGFyYW1zLy5zb3VyY2UsXG5cdFx0Ly8gc3RyaW5nXG5cdFx0L2NocnwoPzpmaWxsfGZpbmR8bGVmdHxtaWR8cmVwbGFjZXxyZXZ8cmlnaHQpc3RyfGZvcm1hdHxbbHVdY2FzZXxvcmR8c3RyKD86Y21waT98ZnJvbXV0Zjh8bGVufHRvdXRmOCl8dGltZXx0cmltKD86YWxsfGxlZnR8cmlnaHQpLy5zb3VyY2UsXG5cdFx0Ly8gdmVyc2lvblxuXHRcdC9pc3ZlcnNpb25vcmdyZWF0ZXJ8dmVyc2lvbig/Om51bWJlcnxzdHJpbmcpLy5zb3VyY2UsXG5cdFx0Ly8gaGVscGVyXG5cdFx0L2J1aWxkcGl4ZWx0eXBlfGNvbG9yc3BhY2VuYW1ldG9waXhlbHR5cGUvLnNvdXJjZSxcblx0XHQvLyBhdnNwbHVzXG5cdFx0L2FkZGF1dG9sb2FkZGlyfG9uKD86Y3B1fGN1ZGEpfHByZWZldGNofHNldGZpbHRlcm10bW9kZS8uc291cmNlXG5cdF0uam9pbignfCcpO1xuXHR2YXIgcHJvcGVydGllcyA9IFtcblx0XHQvLyBjb250ZW50XG5cdFx0L2hhcyg/OmF1ZGlvfHZpZGVvKS8uc291cmNlLFxuXHRcdC8vIHJlc29sdXRpb25cblx0XHQvaGVpZ2h0fHdpZHRoLy5zb3VyY2UsXG5cdFx0Ly8gZnJhbWVyYXRlXG5cdFx0L2ZyYW1lKD86Y291bnR8cmF0ZSl8ZnJhbWVyYXRlKD86ZGVub21pbmF0b3J8bnVtZXJhdG9yKS8uc291cmNlLFxuXHRcdC8vIGludGVybGFjaW5nXG5cdFx0L2dldHBhcml0eXxpcyg/OmZpZWxkfGZyYW1lKWJhc2VkLy5zb3VyY2UsXG5cdFx0Ly8gY29sb3IgZm9ybWF0XG5cdFx0L2JpdHNwZXJjb21wb25lbnR8Y29tcG9uZW50c2l6ZXxoYXNhbHBoYXxpcyg/OnBsYW5hcig/OnJnYmE/KT98aW50ZXJsZWF2ZWR8cmdiKD86MjR8MzJ8NDh8NjQpP3x5KD86OHx1KD86dmE/fHkyKSk/fHl2KD86MTJ8MTZ8MjR8NDExKXw0MjB8NDIyfDQ0NHxwYWNrZWRyZ2IpfG51bWNvbXBvbmVudHN8cGl4ZWx0eXBlLy5zb3VyY2UsXG5cdFx0Ly8gYXVkaW9cblx0XHQvYXVkaW8oPzpiaXRzfGNoYW5uZWxzfGR1cmF0aW9ufGxlbmd0aCg/Oltmc118aGl8bG8pP3xyYXRlKXxpc2F1ZGlvKD86ZmxvYXR8aW50KS8uc291cmNlXG5cdF0uam9pbignfCcpO1xuXHR2YXIgZmlsdGVycyA9IFtcblx0XHQvLyBzb3VyY2Vcblx0XHQvYXZpKD86ZmlsZSk/c291cmNlfGRpcmVjdHNob3dzb3VyY2V8aW1hZ2UoPzpyZWFkZXJ8c291cmNlfHNvdXJjZWFuaW0pfG9wZW5kbWxzb3VyY2V8c2VnbWVudGVkKD86YXZpc291cmNlfGRpcmVjdHNob3dzb3VyY2UpfHdhdnNvdXJjZS8uc291cmNlLFxuXHRcdC8vIGNvbG9yXG5cdFx0L2NvbG9yeXV2fGNvbnZlcnRiYWNrdG95dXkyfGNvbnZlcnR0byg/OlJHQig/OjI0fDMyfDQ4fDY0KXwoPzpwbGFuYXIpP1JHQkE/fFk4P3xZVig/OjEyfDE2fDI0fDQxMSl8WVVWQT8oPzo0MTF8NDIwfDQyMnw0NDQpfFlVWTIpfGZpeGx1bWluYW5jZXxnclthZV15c2NhbGV8aW52ZXJ0fGxldmVsc3xsaW1pdGVyfG1lcmdlYT9yZ2J8bWVyZ2UoPzpjaHJvbWF8bHVtYSl8cmdiYWRqdXN0fHNob3coPzphbHBoYXxibHVlfGdyZWVufHJlZCl8c3dhcHV2fHR3ZWFrfFt1dl10b3k4P3x5dG91di8uc291cmNlLFxuXHRcdC8vIG92ZXJsYXlcblx0XHQvKD86Y29sb3JrZXl8cmVzZXQpbWFza3xsYXllcnxtYXNrKD86aHMpP3xtZXJnZXxvdmVybGF5fHN1YnRyYWN0Ly5zb3VyY2UsXG5cdFx0Ly8gZ2VvbWV0cnlcblx0XHQvYWRkYm9yZGVyc3woPzpiaWN1YmljfGJpbGluZWFyfGJsYWNrbWFufGdhdXNzfGxhbmN6b3M0fGxhbmN6b3N8cG9pbnR8c2luY3xzcGxpbmUoPzoxNnwzNnw2NCkpcmVzaXplfGNyb3AoPzpib3R0b20pP3xmbGlwKD86aG9yaXpvbnRhbHx2ZXJ0aWNhbCl8KD86aG9yaXpvbnRhbHx2ZXJ0aWNhbCk/cmVkdWNlYnkyfGxldHRlcmJveHxza2V3cm93c3x0dXJuKD86MTgwfGxlZnR8cmlnaHQpLy5zb3VyY2UsXG5cdFx0Ly8gcGl4ZWxcblx0XHQvYmx1cnxmaXhicm9rZW5jaHJvbWF1cHNhbXBsaW5nfGdlbmVyYWxjb252b2x1dGlvbnwoPzpzcGF0aWFsfHRlbXBvcmFsKXNvZnRlbnxzaGFycGVuLy5zb3VyY2UsXG5cdFx0Ly8gdGltZWxpbmVcblx0XHQvdHJpbXwoPzp1bik/YWxpZ25lZHNwbGljZXwoPzphc3N1bWV8YXNzdW1lc2NhbGVkfGNoYW5nZXxjb252ZXJ0KUZQU3woPzpkZWxldGV8ZHVwbGljYXRlKWZyYW1lfGRpc3NvbHZlfGZhZGUoPzppbnxpb3xvdXQpWzAyXT98ZnJlZXplZnJhbWV8aW50ZXJsZWF2ZXxsb29wfHJldmVyc2V8c2VsZWN0KD86ZXZlbnxvZGR8KD86cmFuZ2UpP2V2ZXJ5KS8uc291cmNlLFxuXHRcdC8vIGludGVybGFjZVxuXHRcdC9hc3N1bWVbYnRdZmZ8YXNzdW1lKD86ZmllbGR8ZnJhbWUpYmFzZWR8Ym9ifGNvbXBsZW1lbnRwYXJpdHl8ZG91Ymxld2VhdmV8cGVjdWxpYXJibGVuZHxwdWxsZG93bnxzZXBhcmF0ZSg/OmNvbHVtbnN8ZmllbGRzfHJvd3MpfHN3YXBmaWVsZHN8d2VhdmUoPzpjb2x1bW5zfHJvd3MpPy8uc291cmNlLFxuXHRcdC8vIGF1ZGlvXG5cdFx0L2FtcGxpZnkoPzpkYik/fGFzc3VtZXNhbXBsZXJhdGV8YXVkaW9kdWIoPzpleCk/fGF1ZGlvdHJpbXxjb252ZXJ0YXVkaW90byg/Oig/Ojh8MTZ8MjR8MzIpYml0fGZsb2F0KXxjb252ZXJ0dG9tb25vfGRlbGF5YXVkaW98ZW5zdXJldmJybXAzc3luY3xnZXQoPzpsZWZ0fHJpZ2h0KT9jaGFubmVsfGtpbGwoPzphdWRpb3x2aWRlbyl8bWVyZ2VjaGFubmVsc3xtaXhhdWRpb3xtb25vdG9zdGVyZW98bm9ybWFsaXplfHJlc2FtcGxlYXVkaW98c3NyY3xzdXBlcmVxfHRpbWVzdHJldGNoLy5zb3VyY2UsXG5cdFx0Ly8gY29uZGl0aW9uYWxcblx0XHQvYW5pbWF0ZXxhcHBseXJhbmdlfGNvbmRpdGlvbmFsKD86ZmlsdGVyfHJlYWRlcnxzZWxlY3QpfGZyYW1lZXZhbHVhdGV8c2NyaXB0Y2xpcHx0Y3AoPzpzZXJ2ZXJ8c291cmNlKXx3cml0ZWZpbGUoPzplbmR8aWZ8c3RhcnQpPy8uc291cmNlLFxuXHRcdC8vIGV4cG9ydFxuXHRcdC9pbWFnZXdyaXRlci8uc291cmNlLFxuXHRcdC8vIGRlYnVnXG5cdFx0L2JsYWNrbmVzc3xibGFua2NsaXB8Y29sb3JiYXJzKD86aGQpP3xjb21wYXJlfGR1bXBmaWx0ZXJncmFwaHxlY2hvfGhpc3RvZ3JhbXxpbmZvfG1lc3NhZ2VjbGlwfHByZXJvbGx8c2V0Z3JhcGhhbmFseXNpc3xzaG93KD86ZnJhbWVudW1iZXJ8c21wdGV8dGltZSl8c2hvd2ZpdmV2ZXJzaW9uc3xzdGFjayg/Omhvcml6b250YWx8dmVydGljYWwpfHN1YnRpdGxlfHRvbmV8dmVyc2lvbi8uc291cmNlXG5cdF0uam9pbignfCcpO1xuXHR2YXIgYWxsaW50ZXJuYWxzID0gW2ludGVybmFscywgcHJvcGVydGllcywgZmlsdGVyc10uam9pbignfCcpO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5hdmlzeW50aCA9IHtcblx0XHQnY29tbWVudCc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gTWF0Y2hlcyBbKiAqXSBuZXN0YWJsZSBibG9jayBjb21tZW50cywgYnV0IG9ubHkgc3VwcG9ydHMgMSBsZXZlbCBvZiBuZXN0ZWQgY29tbWVudHNcblx0XHRcdFx0Ly8gL1xcW1xcKig/OlteXFxbKl18XFxbKD8hXFwqKXxcXCooPyFcXF0pfDxzZWxmPikqXFwqXFxdL1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXFtcXCooPzpbXlxcWypdfFxcWyg/IVxcKil8XFwqKD8hXFxdKXxcXFtcXCooPzpbXlxcWypdfFxcWyg/IVxcKil8XFwqKD8hXFxdKSkqXFwqXFxdKSpcXCpcXF0vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIE1hdGNoZXMgLyogKi8gYmxvY2sgY29tbWVudHNcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gTWF0Y2hlcyAjIGNvbW1lbnRzXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFwkXSkjLiovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXG5cdFx0Ly8gSGFuZGxlIGJlZm9yZSBzdHJpbmdzIGJlY2F1c2Ugb3B0aW9uYWwgYXJndW1lbnRzIGFyZSBzdXJyb3VuZGVkIGJ5IGRvdWJsZSBxdW90ZXNcblx0XHQnYXJndW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiByZSgvXFxiKD86PDwwPj4pXFxzKyhcIj8pXFx3K1xcMS8uc291cmNlLCBbdHlwZXNdLCAnaScpLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdrZXl3b3JkJzogL15cXHcrL1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBPcHRpb25hbCBhcmd1bWVudCBhc3NpZ25tZW50XG5cdFx0J2FyZ3VtZW50LWxhYmVsJzoge1xuXHRcdFx0cGF0dGVybjogLyhbLChdW1xcc1xcXFxdKilcXHcrXFxzKj0oPyE9KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdhcmd1bWVudC1uYW1lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFx3Ky8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLz0kL1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQnc3RyaW5nJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyB0cmlwbGUgZG91YmxlLXF1b3RlZFxuXHRcdFx0XHRwYXR0ZXJuOiAvXCJcIlwiW1xcc1xcU10qP1wiXCJcIi8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIHNpbmdsZSBkb3VibGUtcXVvdGVkXG5cdFx0XHRcdHBhdHRlcm46IC9cIig/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXCJcXFxcXFxyXFxuXSkqXCIvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdjb25zdGFudCc6IHtcblx0XHRcdFx0XHRcdC8vIFRoZXNlICphcmUqIGNhc2Utc2Vuc2l0aXZlIVxuXHRcdFx0XHRcdFx0cGF0dGVybjogL1xcYig/OkRFRkFVTFRfTVRfTU9ERXwoPzpNQUlOU0NSSVBUfFBST0dSQU18U0NSSVBUKURJUnwoPzpNQUNISU5FfFVTRVIpXyg/OkNMQVNTSUN8UExVUylfUExVR0lOUylcXGIvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblxuXHRcdC8vIFRoZSBzcGVjaWFsIFwibGFzdFwiIHZhcmlhYmxlIHRoYXQgdGFrZXMgdGhlIHZhbHVlIG9mIHRoZSBsYXN0IGltcGxpY2l0bHkgcmV0dXJuZWQgY2xpcFxuXHRcdCd2YXJpYWJsZSc6IC9cXGIoPzpsYXN0KVxcYi9pLFxuXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bm98dHJ1ZXx5ZXMpXFxiL2ksXG5cblx0XHQna2V5d29yZCc6IC9cXGIoPzpjYXRjaHxlbHNlfGZvcnxmdW5jdGlvbnxnbG9iYWx8aWZ8cmV0dXJufHRyeXx3aGlsZXxfX0VORF9fKVxcYi9pLFxuXG5cdFx0J2NvbnN0YW50JzogL1xcYk1UXyg/Ok1VTFRJX0lOU1RBTkNFfE5JQ0VfRklMVEVSfFNFUklBTElaRUR8U1BFQ0lBTF9NVClcXGIvLFxuXG5cdFx0Ly8gQXZpU3ludGgncyBpbnRlcm5hbCBmdW5jdGlvbnMsIGZpbHRlcnMsIGFuZCBwcm9wZXJ0aWVzXG5cdFx0J2J1aWx0aW4tZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiByZSgvXFxiKD86PDwwPj4pXFxiLy5zb3VyY2UsIFthbGxpbnRlcm5hbHNdLCAnaScpLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXG5cdFx0J3R5cGUtY2FzdCc6IHtcblx0XHRcdHBhdHRlcm46IHJlKC9cXGIoPzo8PDA+PikoPz1cXHMqXFwoKS8uc291cmNlLCBbdHlwZXNdLCAnaScpLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cblx0XHQvLyBFeHRlcm5hbC91c2VyLWRlZmluZWQgZmlsdGVyc1xuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCl8KFxcLilbYS16X11cXHcqXFxiL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdC8vIE1hdGNoZXMgYSBcXCBhcyB0aGUgZmlyc3Qgb3IgbGFzdCBjaGFyYWN0ZXIgb24gYSBsaW5lXG5cdFx0J2xpbmUtY29udGludWF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKilcXFxcfFxcXFwoPz1bIFxcdF0qJCkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cblx0XHQnbnVtYmVyJzogL1xcQlxcJCg/OltcXGRhLWZdezZ9fFtcXGRhLWZdezh9KVxcYnwoPzooPzpcXGJ8XFxCLSlcXGQrKD86XFwuXFxkKik/XFxifFxcQlxcLlxcZCtcXGIpL2ksXG5cblx0XHQnb3BlcmF0b3InOiAvXFwrXFwrP3xbIT08Pl09P3wmJnxcXHxcXHx8Wz86Ki8lLV0vLFxuXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t7fVxcW1xcXSgpOywuXS9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuYXZzID0gUHJpc20ubGFuZ3VhZ2VzLmF2aXN5bnRoO1xuXG59KFByaXNtKSk7XG5cbi8vIEdpdEh1YjogaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9hdnJvXG4vLyBEb2NzOiBodHRwczovL2F2cm8uYXBhY2hlLm9yZy9kb2NzL2N1cnJlbnQvaWRsLmh0bWxcblxuUHJpc20ubGFuZ3VhZ2VzWydhdnJvLWlkbCddID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pXCIoPzpbXlxcclxcblwiXFxcXF18XFxcXC4pKlwiLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdhbm5vdGF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9AKD86WyRcXHcuLV18YFteXFxyXFxuYF0rYCkrLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J2Z1bmN0aW9uLWlkZW50aWZpZXInOiB7XG5cdFx0cGF0dGVybjogL2BbXlxcclxcbmBdK2AoPz1cXHMqXFwoKS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdpZGVudGlmaWVyJzoge1xuXHRcdHBhdHRlcm46IC9gW15cXHJcXG5gXStgLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYig/OmVudW18ZXJyb3J8cHJvdG9jb2x8cmVjb3JkfHRocm93cylcXGJcXHMrKVskXFx3XSsvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFycmF5fGJvb2xlYW58Ynl0ZXN8ZGF0ZXxkZWNpbWFsfGRvdWJsZXxlbnVtfGVycm9yfGZhbHNlfGZpeGVkfGZsb2F0fGlkbHxpbXBvcnR8aW50fGxvY2FsX3RpbWVzdGFtcF9tc3xsb25nfG1hcHxudWxsfG9uZXdheXxwcm90b2NvbHxyZWNvcmR8c2NoZW1hfHN0cmluZ3x0aHJvd3N8dGltZV9tc3x0aW1lc3RhbXBfbXN8dHJ1ZXx1bmlvbnx1dWlkfHZvaWQpXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXG5cdCdudW1iZXInOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3Ll0pLT8oPzooPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86ZVsrLV0/XFxkKyk/fDB4KD86W2EtZjAtOV0rKD86XFwuW2EtZjAtOV0qKT98XFwuW2EtZjAtOV0rKSg/OnBbKy1dP1xcZCspPylbZGZsXT8oPyFbXFx3Ll0pL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvLT9cXGIoPzpJbmZpbml0eXxOYU4pXFxiL1xuXHRdLFxuXG5cdCdvcGVyYXRvcic6IC89Lyxcblx0J3B1bmN0dWF0aW9uJzogL1soKVxcW1xcXXt9PD4uOiw7LV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuYXZkbCA9IFByaXNtLmxhbmd1YWdlc1snYXZyby1pZGwnXTtcblxuUHJpc20ubGFuZ3VhZ2VzLmF3ayA9IHtcblx0J2hhc2hiYW5nJzoge1xuXHRcdHBhdHRlcm46IC9eIyEuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnY29tbWVudCdcblx0fSxcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pXCIoPzpbXlxcXFxcIlxcclxcbl18XFxcXC4pKlwiLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQncmVnZXgnOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFteXFx3XFxzKV0pXFxzKilcXC8oPzpbXlxcL1xcXFxcXHJcXG5dfFxcXFwuKSpcXC8vLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J3ZhcmlhYmxlJzogL1xcJFxcdysvLFxuXHQna2V5d29yZCc6IC9cXGIoPzpCRUdJTnxCRUdJTkZJTEV8RU5EfEVOREZJTEV8YnJlYWt8Y2FzZXxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGV4aXR8Zm9yfGZ1bmN0aW9ufGdldGxpbmV8aWZ8aW58bmV4dHxuZXh0ZmlsZXxwcmludGY/fHJldHVybnxzd2l0Y2h8d2hpbGUpXFxifEAoPzppbmNsdWRlfGxvYWQpXFxiLyxcblxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cdCdudW1iZXInOiAvXFxiKD86XFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspP3wweFthLWZBLUYwLTldKylcXGIvLFxuXG5cdCdvcGVyYXRvcic6IC8tLXxcXCtcXCt8IT9+fD4mfD4+fDw8fCg/OlxcKlxcKnxbPD4hPStcXC0qLyVeXSk9P3wmJnxcXHxbfCZdfFs/Ol0vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpW1xcXXt9LDtdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmdhd2sgPSBQcmlzbS5sYW5ndWFnZXMuYXdrO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdC8vICQgc2V0IHwgZ3JlcCAnXltBLVpdW15bOnNwYWNlOl1dKj0nIHwgY3V0IC1kPSAtZjEgfCB0ciAnXFxuJyAnfCdcblx0Ly8gKyBMQ19BTEwsIFJBTkRPTSwgUkVQTFksIFNFQ09ORFMuXG5cdC8vICsgbWFrZSBzdXJlIFBTMS4uNCBhcmUgaGVyZSBhcyB0aGV5IGFyZSBub3QgYWx3YXlzIHNldCxcblx0Ly8gLSBzb21lIHVzZWxlc3MgdGhpbmdzLlxuXHR2YXIgZW52VmFycyA9ICdcXFxcYig/OkJBU0h8QkFTSE9QVFN8QkFTSF9BTElBU0VTfEJBU0hfQVJHQ3xCQVNIX0FSR1Z8QkFTSF9DTURTfEJBU0hfQ09NUExFVElPTl9DT01QQVRfRElSfEJBU0hfTElORU5PfEJBU0hfUkVNQVRDSHxCQVNIX1NPVVJDRXxCQVNIX1ZFUlNJTkZPfEJBU0hfVkVSU0lPTnxDT0xPUlRFUk18Q09MVU1OU3xDT01QX1dPUkRCUkVBS1N8REJVU19TRVNTSU9OX0JVU19BRERSRVNTfERFRkFVTFRTX1BBVEh8REVTS1RPUF9TRVNTSU9OfERJUlNUQUNLfERJU1BMQVl8RVVJRHxHRE1TRVNTSU9OfEdETV9MQU5HfEdOT01FX0tFWVJJTkdfQ09OVFJPTHxHTk9NRV9LRVlSSU5HX1BJRHxHUEdfQUdFTlRfSU5GT3xHUk9VUFN8SElTVENPTlRST0x8SElTVEZJTEV8SElTVEZJTEVTSVpFfEhJU1RTSVpFfEhPTUV8SE9TVE5BTUV8SE9TVFRZUEV8SUZTfElOU1RBTkNFfEpPQnxMQU5HfExBTkdVQUdFfExDX0FERFJFU1N8TENfQUxMfExDX0lERU5USUZJQ0FUSU9OfExDX01FQVNVUkVNRU5UfExDX01PTkVUQVJZfExDX05BTUV8TENfTlVNRVJJQ3xMQ19QQVBFUnxMQ19URUxFUEhPTkV8TENfVElNRXxMRVNTQ0xPU0V8TEVTU09QRU58TElORVN8TE9HTkFNRXxMU19DT0xPUlN8TUFDSFRZUEV8TUFJTENIRUNLfE1BTkRBVE9SWV9QQVRIfE5PX0FUX0JSSURHRXxPTERQV0R8T1BURVJSfE9QVElORHxPUkJJVF9TT0NLRVRESVJ8T1NUWVBFfFBBUEVSU0laRXxQQVRIfFBJUEVTVEFUVVN8UFBJRHxQUzF8UFMyfFBTM3xQUzR8UFdEfFJBTkRPTXxSRVBMWXxTRUNPTkRTfFNFTElOVVhfSU5JVHxTRVNTSU9OfFNFU1NJT05UWVBFfFNFU1NJT05fTUFOQUdFUnxTSEVMTHxTSEVMTE9QVFN8U0hMVkx8U1NIX0FVVEhfU09DS3xURVJNfFVJRHxVUFNUQVJUX0VWRU5UU3xVUFNUQVJUX0lOU1RBTkNFfFVQU1RBUlRfSk9CfFVQU1RBUlRfU0VTU0lPTnxVU0VSfFdJTkRPV0lEfFhBVVRIT1JJVFl8WERHX0NPTkZJR19ESVJTfFhER19DVVJSRU5UX0RFU0tUT1B8WERHX0RBVEFfRElSU3xYREdfR1JFRVRFUl9EQVRBX0RJUnxYREdfTUVOVV9QUkVGSVh8WERHX1JVTlRJTUVfRElSfFhER19TRUFUfFhER19TRUFUX1BBVEh8WERHX1NFU1NJT05fREVTS1RPUHxYREdfU0VTU0lPTl9JRHxYREdfU0VTU0lPTl9QQVRIfFhER19TRVNTSU9OX1RZUEV8WERHX1ZUTlJ8WE1PRElGSUVSUylcXFxcYic7XG5cblx0dmFyIGNvbW1hbmRBZnRlckhlcmVkb2MgPSB7XG5cdFx0cGF0dGVybjogLyheKFtcIiddPylcXHcrXFwyKVsgXFx0XStcXFMuKi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJywgLy8gdGhpcyBsb29rcyByZWFzb25hYmx5IHdlbGwgaW4gYWxsIHRoZW1lc1xuXHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0fTtcblxuXHR2YXIgaW5zaWRlU3RyaW5nID0ge1xuXHRcdCdiYXNoJzogY29tbWFuZEFmdGVySGVyZWRvYyxcblx0XHQnZW52aXJvbm1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJ1xcXFwkJyArIGVudlZhcnMpLFxuXHRcdFx0YWxpYXM6ICdjb25zdGFudCdcblx0XHR9LFxuXHRcdCd2YXJpYWJsZSc6IFtcblx0XHRcdC8vIFswXTogQXJpdGhtZXRpYyBFbnZpcm9ubWVudFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwkP1xcKFxcKFtcXHNcXFNdKz9cXClcXCkvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIGEgJCBzaWduIGF0IHRoZSBiZWdpbm5pbmcgaGlnaGxpZ2h0ICQoKCBhbmQgKSkgYXMgdmFyaWFibGVcblx0XHRcdFx0XHQndmFyaWFibGUnOiBbXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcJFxcKFxcKFtcXHNcXFNdKylcXClcXCkvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0L15cXCRcXChcXCgvXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHQnbnVtYmVyJzogL1xcYjB4W1xcZEEtRmEtZl0rXFxifCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpbRWVdLT9cXGQrKT8vLFxuXHRcdFx0XHRcdC8vIE9wZXJhdG9ycyBhY2NvcmRpbmcgdG8gaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9iYXNoL21hbnVhbC9iYXNocmVmLmh0bWwjU2hlbGwtQXJpdGhtZXRpY1xuXHRcdFx0XHRcdCdvcGVyYXRvcic6IC8tLXxcXCtcXCt8XFwqXFwqPT98PDw9P3w+Pj0/fCYmfFxcfFxcfHxbPSErXFwtKi8lPD5eJnxdPT98Wz9+Ol0vLFxuXHRcdFx0XHRcdC8vIElmIHRoZXJlIGlzIG5vICQgc2lnbiBhdCB0aGUgYmVnaW5uaW5nIGhpZ2hsaWdodCAoKCBhbmQgKSkgYXMgcHVuY3R1YXRpb25cblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwoXFwoP3xcXClcXCk/fCx8Oy9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdC8vIFsxXTogQ29tbWFuZCBTdWJzdGl0dXRpb25cblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcJFxcKCg/OlxcKFteKV0rXFwpfFteKCldKStcXCl8YFteYF0rYC8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3ZhcmlhYmxlJzogL15cXCRcXCh8XmB8XFwpJHxgJC9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdC8vIFsyXTogQnJhY2UgZXhwYW5zaW9uXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCRcXHtbXn1dK1xcfS8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J29wZXJhdG9yJzogLzpbLT0/K10/fFshXFwvXXwjIz98JSU/fFxcXlxcXj98LCw/Lyxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXV0vLFxuXHRcdFx0XHRcdCdlbnZpcm9ubWVudCc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnKFxcXFx7KScgKyBlbnZWYXJzKSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdC9cXCQoPzpcXHcrfFsjPyohQCRdKS9cblx0XHRdLFxuXHRcdC8vIEVzY2FwZSBzZXF1ZW5jZXMgZnJvbSBlY2hvIGFuZCBwcmludGYncyBtYW51YWxzLCBhbmQgZXNjYXBlZCBxdW90ZXMuXG5cdFx0J2VudGl0eSc6IC9cXFxcKD86W2FiY2VFZm5ydHZcXFxcXCJdfE8/WzAtN117MSwzfXxVWzAtOWEtZkEtRl17OH18dVswLTlhLWZBLUZdezR9fHhbMC05YS1mQS1GXXsxLDJ9KS9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuYmFzaCA9IHtcblx0XHQnc2hlYmFuZyc6IHtcblx0XHRcdHBhdHRlcm46IC9eIyFcXHMqXFwvLiovLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0fSxcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlwie1xcXFwkXSkjLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uLW5hbWUnOiBbXG5cdFx0XHQvLyBhKSBmdW5jdGlvbiBmb28ge1xuXHRcdFx0Ly8gYikgZm9vKCkge1xuXHRcdFx0Ly8gYykgZnVuY3Rpb24gZm9vKCkge1xuXHRcdFx0Ly8gYnV0IG5vdCBcdTIwMUNmb28ge1x1MjAxRFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBhKSBhbmQgYylcblx0XHRcdFx0cGF0dGVybjogLyhcXGJmdW5jdGlvblxccyspW1xcdy1dKyg/PSg/OlxccypcXCg/OlxccypcXCkpP1xccypcXHspLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGIpXG5cdFx0XHRcdHBhdHRlcm46IC9cXGJbXFx3LV0rKD89XFxzKlxcKFxccypcXClcXHMqXFx7KS8sXG5cdFx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQvLyBIaWdobGlnaHQgdmFyaWFibGUgbmFtZXMgYXMgdmFyaWFibGVzIGluIGZvciBhbmQgc2VsZWN0IGJlZ2lubmluZ3MuXG5cdFx0J2Zvci1vci1zZWxlY3QnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmZvcnxzZWxlY3QpXFxzKylcXHcrKD89XFxzK2luXFxzKS8sXG5cdFx0XHRhbGlhczogJ3ZhcmlhYmxlJyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC8vIEhpZ2hsaWdodCB2YXJpYWJsZSBuYW1lcyBhcyB2YXJpYWJsZXMgaW4gdGhlIGxlZnQtaGFuZCBwYXJ0XG5cdFx0Ly8gb2YgYXNzaWdubWVudHMgKFx1MjAxQz1cdTIwMUQgYW5kIFx1MjAxQys9XHUyMDFEKS5cblx0XHQnYXNzaWduLWxlZnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W1xcczt8Jl18Wzw+XVxcKClcXHcrKD89XFwrPz0pLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZW52aXJvbm1lbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCcoXnxbXFxcXHM7fCZdfFs8Pl1cXFxcKCknICsgZW52VmFycyksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0YWxpYXM6ICd2YXJpYWJsZScsXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnc3RyaW5nJzogW1xuXHRcdFx0Ly8gU3VwcG9ydCBmb3IgSGVyZS1kb2N1bWVudHMgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSGVyZV9kb2N1bWVudFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W148XSk8PC0/XFxzKikoXFx3KylcXHNbXFxzXFxTXSo/KD86XFxyP1xcbnxcXHIpXFwyLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGluc2lkZVN0cmluZ1xuXHRcdFx0fSxcblx0XHRcdC8vIEhlcmUtZG9jdW1lbnQgd2l0aCBxdW90ZXMgYXJvdW5kIHRoZSB0YWdcblx0XHRcdC8vIFx1MjE5MiBObyBleHBhbnNpb24gKHNvIG5vIFx1MjAxQ2luc2lkZVx1MjAxRCkuXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXjxdKTw8LT9cXHMqKShbXCInXSkoXFx3KylcXDJcXHNbXFxzXFxTXSo/KD86XFxyP1xcbnxcXHIpXFwzLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnYmFzaCc6IGNvbW1hbmRBZnRlckhlcmVkb2Ncblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdC8vIFx1MjAxQ05vcm1hbFx1MjAxRCBzdHJpbmdcblx0XHRcdHtcblx0XHRcdFx0Ly8gaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9iYXNoL21hbnVhbC9odG1sX25vZGUvRG91YmxlLVF1b3Rlcy5odG1sXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKD86XFxcXFxcXFwpKilcIig/OlxcXFxbXFxzXFxTXXxcXCRcXChbXildK1xcKXxcXCQoPyFcXCgpfGBbXmBdK2B8W15cIlxcXFxgJF0pKlwiLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGluc2lkZVN0cmluZ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9iYXNoL21hbnVhbC9odG1sX25vZGUvU2luZ2xlLVF1b3Rlcy5odG1sXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXiRcXFxcXSknW14nXSonLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2Jhc2gvbWFudWFsL2h0bWxfbm9kZS9BTlNJXzAwMmRDLVF1b3RpbmcuaHRtbFxuXHRcdFx0XHRwYXR0ZXJuOiAvXFwkJyg/OlteJ1xcXFxdfFxcXFxbXFxzXFxTXSkqJy8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2VudGl0eSc6IGluc2lkZVN0cmluZy5lbnRpdHlcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2Vudmlyb25tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCdcXFxcJD8nICsgZW52VmFycyksXG5cdFx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHRcdH0sXG5cdFx0J3ZhcmlhYmxlJzogaW5zaWRlU3RyaW5nLnZhcmlhYmxlLFxuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXFxzO3wmXXxbPD5dXFwoKSg/OmFkZHxhcHJvcG9zfGFwdHxhcHQtY2FjaGV8YXB0LWdldHxhcHRpdHVkZXxhc3BlbGx8YXV0b215c3FsYmFja3VwfGF3a3xiYXNlbmFtZXxiYXNofGJjfGJjb25zb2xlfGJnfGJ6aXAyfGNhbHxjYXR8Y2ZkaXNrfGNoZ3JwfGNoa2NvbmZpZ3xjaG1vZHxjaG93bnxjaHJvb3R8Y2tzdW18Y2xlYXJ8Y21wfGNvbHVtbnxjb21tfGNvbXBvc2VyfGNwfGNyb258Y3JvbnRhYnxjc3BsaXR8Y3VybHxjdXR8ZGF0ZXxkY3xkZHxkZHJlc2N1ZXxkZWJvb3RzdHJhcHxkZnxkaWZmfGRpZmYzfGRpZ3xkaXJ8ZGlyY29sb3JzfGRpcm5hbWV8ZGlyc3xkbWVzZ3xkb2NrZXJ8ZG9ja2VyLWNvbXBvc2V8ZHV8ZWdyZXB8ZWplY3R8ZW52fGV0aHRvb2x8ZXhwYW5kfGV4cGVjdHxleHByfGZkZm9ybWF0fGZkaXNrfGZnfGZncmVwfGZpbGV8ZmluZHxmbXR8Zm9sZHxmb3JtYXR8ZnJlZXxmc2NrfGZ0cHxmdXNlcnxnYXdrfGdpdHxncGFydGVkfGdyZXB8Z3JvdXBhZGR8Z3JvdXBkZWx8Z3JvdXBtb2R8Z3JvdXBzfGdydWItbWtjb25maWd8Z3ppcHxoYWx0fGhlYWR8aGd8aGlzdG9yeXxob3N0fGhvc3RuYW1lfGh0b3B8aWNvbnZ8aWR8aWZjb25maWd8aWZkb3dufGlmdXB8aW1wb3J0fGluc3RhbGx8aXB8am9ic3xqb2lufGtpbGx8a2lsbGFsbHxsZXNzfGxpbmt8bG58bG9jYXRlfGxvZ25hbWV8bG9ncm90YXRlfGxvb2t8bHBjfGxwcnxscHJpbnR8bHByaW50ZHxscHJpbnRxfGxwcm18bHN8bHNvZnxseW54fG1ha2V8bWFufG1jfG1kYWRtfG1rY29uZmlnfG1rZGlyfG1rZTJmc3xta2ZpZm98bWtmc3xta2lzb2ZzfG1rbm9kfG1rc3dhcHxtbXZ8bW9yZXxtb3N0fG1vdW50fG10b29sc3xtdHJ8bXV0dHxtdnxuYW5vfG5jfG5ldHN0YXR8bmljZXxubHxub2RlfG5vaHVwfG5vdGlmeS1zZW5kfG5wbXxuc2xvb2t1cHxvcHxvcGVufHBhcnRlZHxwYXNzd2R8cGFzdGV8cGF0aGNoa3xwaW5nfHBraWxsfHBucG18cG9kbWFufHBvZG1hbi1jb21wb3NlfHBvcGR8cHJ8cHJpbnRjYXB8cHJpbnRlbnZ8cHN8cHVzaGR8cHZ8cXVvdGF8cXVvdGFjaGVja3xxdW90YWN0bHxyYW18cmFyfHJjcHxyZWJvb3R8cmVtc3luY3xyZW5hbWV8cmVuaWNlfHJldnxybXxybWRpcnxycG18cnN5bmN8c2NwfHNjcmVlbnxzZGlmZnxzZWR8c2VuZG1haWx8c2VxfHNlcnZpY2V8c2Z0cHxzaHxzaGVsbGNoZWNrfHNodWZ8c2h1dGRvd258c2xlZXB8c2xvY2F0ZXxzb3J0fHNwbGl0fHNzaHxzdGF0fHN0cmFjZXxzdXxzdWRvfHN1bXxzdXNwZW5kfHN3YXBvbnxzeW5jfHRhY3x0YWlsfHRhcnx0ZWV8dGltZXx0aW1lb3V0fHRvcHx0b3VjaHx0cnx0cmFjZXJvdXRlfHRzb3J0fHR0eXx1bW91bnR8dW5hbWV8dW5leHBhbmR8dW5pcXx1bml0c3x1bnJhcnx1bnNoYXJ8dW56aXB8dXBkYXRlLWdydWJ8dXB0aW1lfHVzZXJhZGR8dXNlcmRlbHx1c2VybW9kfHVzZXJzfHV1ZGVjb2RlfHV1ZW5jb2RlfHZ8dmNwa2d8dmRpcnx2aXx2aW18dmlyc2h8dm1zdGF0fHdhaXR8d2F0Y2h8d2N8d2dldHx3aGVyZWlzfHdoaWNofHdob3x3aG9hbWl8d3JpdGV8eGFyZ3N8eGRnLW9wZW58eWFybnx5ZXN8emVuaXR5fHppcHx6c2h8enlwcGVyKSg/PSR8WylcXHM7fCZdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXFxzO3wmXXxbPD5dXFwoKSg/OmNhc2V8ZG98ZG9uZXxlbGlmfGVsc2V8ZXNhY3xmaXxmb3J8ZnVuY3Rpb258aWZ8aW58c2VsZWN0fHRoZW58dW50aWx8d2hpbGUpKD89JHxbKVxcczt8Jl0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC8vIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYmFzaC9tYW51YWwvaHRtbF9ub2RlL1NoZWxsLUJ1aWx0aW4tQ29tbWFuZHMuaHRtbFxuXHRcdCdidWlsdGluJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFtcXHM7fCZdfFs8Pl1cXCgpKD86XFwufDp8YWxpYXN8YmluZHxicmVha3xidWlsdGlufGNhbGxlcnxjZHxjb21tYW5kfGNvbnRpbnVlfGRlY2xhcmV8ZWNob3xlbmFibGV8ZXZhbHxleGVjfGV4aXR8ZXhwb3J0fGdldG9wdHN8aGFzaHxoZWxwfGxldHxsb2NhbHxsb2dvdXR8bWFwZmlsZXxwcmludGZ8cHdkfHJlYWR8cmVhZGFycmF5fHJlYWRvbmx5fHJldHVybnxzZXR8c2hpZnR8c2hvcHR8c291cmNlfHRlc3R8dGltZXN8dHJhcHx0eXBlfHR5cGVzZXR8dWxpbWl0fHVtYXNrfHVuYWxpYXN8dW5zZXQpKD89JHxbKVxcczt8Jl0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHQvLyBBbGlhcyBhZGRlZCB0byBtYWtlIHRob3NlIGVhc2llciB0byBkaXN0aW5ndWlzaCBmcm9tIHN0cmluZ3MuXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0fSxcblx0XHQnYm9vbGVhbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXFxzO3wmXXxbPD5dXFwoKSg/OmZhbHNlfHRydWUpKD89JHxbKVxcczt8Jl0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdmaWxlLWRlc2NyaXB0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxCJlxcZFxcYi8sXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHR9LFxuXHRcdCdvcGVyYXRvcic6IHtcblx0XHRcdC8vIExvdHMgb2YgcmVkaXJlY3Rpb25zIGhlcmUsIGJ1dCBub3QganVzdCB0aGF0LlxuXHRcdFx0cGF0dGVybjogL1xcZD88Pnw+XFx8fFxcKz18PVs9fl0/fCE9P3w8PFs8LV0/fFsmXFxkXT8+PnxcXGRbPD5dJj98Wzw+XVsmPV0/fCZbPiZdP3xcXHxbJnxdPy8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ZpbGUtZGVzY3JpcHRvcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcZC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC9cXCQ/XFwoXFwoP3xcXClcXCk/fFxcLlxcLnxbe31bXFxdO1xcXFxdLyxcblx0XHQnbnVtYmVyJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFxccykoPzpbMS05XVxcZCp8MCkoPzpbLixdXFxkKyk/XFxiLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdH07XG5cblx0Y29tbWFuZEFmdGVySGVyZWRvYy5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuYmFzaDtcblxuXHQvKiBQYXR0ZXJucyBpbiBjb21tYW5kIHN1YnN0aXR1dGlvbi4gKi9cblx0dmFyIHRvQmVDb3BpZWQgPSBbXG5cdFx0J2NvbW1lbnQnLFxuXHRcdCdmdW5jdGlvbi1uYW1lJyxcblx0XHQnZm9yLW9yLXNlbGVjdCcsXG5cdFx0J2Fzc2lnbi1sZWZ0Jyxcblx0XHQnc3RyaW5nJyxcblx0XHQnZW52aXJvbm1lbnQnLFxuXHRcdCdmdW5jdGlvbicsXG5cdFx0J2tleXdvcmQnLFxuXHRcdCdidWlsdGluJyxcblx0XHQnYm9vbGVhbicsXG5cdFx0J2ZpbGUtZGVzY3JpcHRvcicsXG5cdFx0J29wZXJhdG9yJyxcblx0XHQncHVuY3R1YXRpb24nLFxuXHRcdCdudW1iZXInXG5cdF07XG5cdHZhciBpbnNpZGUgPSBpbnNpZGVTdHJpbmcudmFyaWFibGVbMV0uaW5zaWRlO1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IHRvQmVDb3BpZWQubGVuZ3RoOyBpKyspIHtcblx0XHRpbnNpZGVbdG9CZUNvcGllZFtpXV0gPSBQcmlzbS5sYW5ndWFnZXMuYmFzaFt0b0JlQ29waWVkW2ldXTtcblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlcy5zaGVsbCA9IFByaXNtLmxhbmd1YWdlcy5iYXNoO1xufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuYmFzaWMgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oPzohfFJFTVxcYikuKy9pLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiAvXlJFTS9pXG5cdFx0fVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlwiXCJ8WyEjJCUmJygpKixcXC86Ozw9Pj9eXFx3ICtcXC0uXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnbnVtYmVyJzogLyg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpFWystXT9cXGQrKT8vaSxcblx0J2tleXdvcmQnOiAvXFxiKD86QVN8QkVFUHxCTE9BRHxCU0FWRXxDQUxMKD86IEFCU09MVVRFKT98Q0FTRXxDSEFJTnxDSERJUnxDTEVBUnxDTE9TRXxDTFN8Q09NfENPTU1PTnxDT05TVHxEQVRBfERFQ0xBUkV8REVGKD86IEZOfCBTRUd8REJMfElOVHxMTkd8U05HfFNUUil8RElNfERPfERPVUJMRXxFTFNFfEVMU0VJRnxFTkR8RU5WSVJPTnxFUkFTRXxFUlJPUnxFWElUfEZJRUxEfEZJTEVTfEZPUnxGVU5DVElPTnxHRVR8R09TVUJ8R09UT3xJRnxJTlBVVHxJTlRFR0VSfElPQ1RMfEtFWXxLSUxMfExJTkUgSU5QVVR8TE9DQVRFfExPQ0t8TE9OR3xMT09QfExTRVR8TUtESVJ8TkFNRXxORVhUfE9GRnxPTig/OiBDT018IEVSUk9SfCBLRVl8IFRJTUVSKT98T1BFTnxPUFRJT04gQkFTRXxPVVR8UE9LRXxQVVR8UkVBRHxSRURJTXxSRU18UkVTVE9SRXxSRVNVTUV8UkVUVVJOfFJNRElSfFJTRVR8UlVOfFNFTEVDVCBDQVNFfFNIQVJFRHxTSEVMTHxTSU5HTEV8U0xFRVB8U1RBVElDfFNURVB8U1RPUHxTVFJJTkd8U1VCfFNXQVB8U1lTVEVNfFRIRU58VElNRVJ8VE98VFJPRkZ8VFJPTnxUWVBFfFVOTE9DS3xVTlRJTHxVU0lOR3xWSUVXIFBSSU5UfFdBSVR8V0VORHxXSElMRXxXUklURSkoPzpcXCR8XFxiKS9pLFxuXHQnZnVuY3Rpb24nOiAvXFxiKD86QUJTfEFDQ0VTU3xBQ09TfEFOR0xFfEFSRUF8QVJJVEhNRVRJQ3xBUlJBWXxBU0lOfEFTS3xBVHxBVE58QkFTRXxCRUdJTnxCUkVBS3xDQVVTRXxDRUlMfENIUnxDTElQfENPTExBVEV8Q09MT1J8Q09OfENPU3xDT1NIfENPVHxDU0N8REFURXxEQVRVTXxERUJVR3xERUNJTUFMfERFRnxERUd8REVHUkVFU3xERUxFVEV8REVUfERFVklDRXxESVNQTEFZfERPVHxFTEFQU0VEfEVQU3xFUkFTQUJMRXxFWExJTkV8RVhQfEVYVEVSTkFMfEVYVFlQRXxGSUxFVFlQRXxGSVhFRHxGUHxHT3xHUkFQSHxIQU5ETEVSfElETnxJTUFHRXxJTnxJTlR8SU5URVJOQUx8SVB8SVN8S0VZRUR8TEJPVU5EfExDQVNFfExFRlR8TEVOfExFTkdUSHxMRVR8TElORXxMSU5FU3xMT0d8TE9HMTB8TE9HMnxMVFJJTXxNQVJHSU58TUFUfE1BWHxNQVhOVU18TUlEfE1JTnxNSVNTSU5HfE1PRHxOQVRJVkV8TlVMfE5VTUVSSUN8T0Z8T1BUSU9OfE9SRHxPUkdBTklaQVRJT058T1VUSU58T1VUUFVUfFBJfFBPSU5UfFBPSU5URVJ8UE9JTlRTfFBPU3xQUklOVHxQUk9HUkFNfFBST01QVHxSQUR8UkFESUFOU3xSQU5ET01JWkV8UkVDT1JEfFJFQ1NJWkV8UkVDVFlQRXxSRUxBVElWRXxSRU1BSU5ERVJ8UkVQRUFUfFJFU1R8UkVUUll8UkVXUklURXxSSUdIVHxSTkR8Uk9VTkR8UlRSSU18U0FNRXxTRUN8U0VMRUNUfFNFUVVFTlRJQUx8U0VUfFNFVFRFUnxTR058U0lOfFNJTkh8U0laRXxTS0lQfFNRUnxTVEFOREFSRHxTVEFUVVN8U1RSfFNUUkVBTXxTVFlMRXxUQUJ8VEFOfFRBTkh8VEVNUExBVEV8VEVYVHxUSEVSRXxUSU1FfFRJTUVPVVR8VFJBQ0V8VFJBTlNGT1JNfFRSVU5DQVRFfFVCT1VORHxVQ0FTRXxVU0V8VkFMfFZBUklBQkxFfFZJRVdQT1JUfFdIRU58V0lORE9XfFdJVEh8WkVSfFpPTkVXSURUSCkoPzpcXCR8XFxiKS9pLFxuXHQnb3BlcmF0b3InOiAvPFs9Pl0/fD49P3xbK1xcLSpcXC9ePSZdfFxcYig/OkFORHxFUVZ8SU1QfE5PVHxPUnxYT1IpXFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bLDs6KCldL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHR2YXIgdmFyaWFibGUgPSAvJSU/W346XFx3XSslP3whXFxTKyEvO1xuXHR2YXIgcGFyYW1ldGVyID0ge1xuXHRcdHBhdHRlcm46IC9cXC9bYS16P10rKD89WyA6XXwkKTo/fC1bYS16XVxcYnwtLVthLXotXStcXGIvaW0sXG5cdFx0YWxpYXM6ICdhdHRyLW5hbWUnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogLzovXG5cdFx0fVxuXHR9O1xuXHR2YXIgc3RyaW5nID0gL1wiKD86W1xcXFxcIl1cInxbXlwiXSkqXCIoPyFcIikvO1xuXHR2YXIgbnVtYmVyID0gLyg/OlxcYnwtKVxcZCtcXGIvO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5iYXRjaCA9IHtcblx0XHQnY29tbWVudCc6IFtcblx0XHRcdC9eOjouKi9tLFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58WyYoXSlbIFxcdF0qKXJlbVxcYig/OlteXiYpXFxyXFxuXXxcXF4oPzpcXHJcXG58W1xcc1xcU10pKSovaW0sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdsYWJlbCc6IHtcblx0XHRcdHBhdHRlcm46IC9eOi4qL20sXG5cdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdH0sXG5cdFx0J2NvbW1hbmQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEZPUiBjb21tYW5kXG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbJihdKVsgXFx0XSopZm9yKD86IFxcL1thLXo/XSg/OlsgOl0oPzpcIlteXCJdKlwifFteXFxzXCIvXVxcUyopKT8pKiBcXFMrIGluIFxcKFteKV0rXFwpIGRvL2ltLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQna2V5d29yZCc6IC9cXGIoPzpkb3xpbilcXGJ8XmZvclxcYi9pLFxuXHRcdFx0XHRcdCdzdHJpbmcnOiBzdHJpbmcsXG5cdFx0XHRcdFx0J3BhcmFtZXRlcic6IHBhcmFtZXRlcixcblx0XHRcdFx0XHQndmFyaWFibGUnOiB2YXJpYWJsZSxcblx0XHRcdFx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCknLF0vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIElGIGNvbW1hbmRcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFsmKF0pWyBcXHRdKilpZig/OiBcXC9bYS16P10oPzpbIDpdKD86XCJbXlwiXSpcInxbXlxcc1wiL11cXFMqKSk/KSogKD86bm90ICk/KD86Y21kZXh0dmVyc2lvbiBcXGQrfGRlZmluZWQgXFx3K3xlcnJvcmxldmVsIFxcZCt8ZXhpc3QgXFxTK3woPzpcIlteXCJdKlwifCg/IVwiKSg/Oig/IT09KVxcUykrKT8oPzo9PXwgKD86ZXF1fGdlcXxndHJ8bGVxfGxzc3xuZXEpICkoPzpcIlteXCJdKlwifFteXFxzXCJdXFxTKikpL2ltLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQna2V5d29yZCc6IC9cXGIoPzpjbWRleHR2ZXJzaW9ufGRlZmluZWR8ZXJyb3JsZXZlbHxleGlzdHxub3QpXFxifF5pZlxcYi9pLFxuXHRcdFx0XHRcdCdzdHJpbmcnOiBzdHJpbmcsXG5cdFx0XHRcdFx0J3BhcmFtZXRlcic6IHBhcmFtZXRlcixcblx0XHRcdFx0XHQndmFyaWFibGUnOiB2YXJpYWJsZSxcblx0XHRcdFx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdFx0XHRcdCdvcGVyYXRvcic6IC9cXF58PT18XFxiKD86ZXF1fGdlcXxndHJ8bGVxfGxzc3xuZXEpXFxiL2lcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gRUxTRSBjb21tYW5kXG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbJigpXSlbIFxcdF0qKWVsc2VcXGIvaW0sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdrZXl3b3JkJzogL15lbHNlXFxiL2lcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gU0VUIGNvbW1hbmRcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFsmKF0pWyBcXHRdKilzZXQoPzogXFwvW2Etel0oPzpbIDpdKD86XCJbXlwiXSpcInxbXlxcc1wiL11cXFMqKSk/KSogKD86W15eJilcXHJcXG5dfFxcXig/OlxcclxcbnxbXFxzXFxTXSkpKi9pbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2tleXdvcmQnOiAvXnNldFxcYi9pLFxuXHRcdFx0XHRcdCdzdHJpbmcnOiBzdHJpbmcsXG5cdFx0XHRcdFx0J3BhcmFtZXRlcic6IHBhcmFtZXRlcixcblx0XHRcdFx0XHQndmFyaWFibGUnOiBbXG5cdFx0XHRcdFx0XHR2YXJpYWJsZSxcblx0XHRcdFx0XHRcdC9cXHcrKD89KD86WypcXC8lK1xcLSZefF18PDx8Pj4pPz0pL1xuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0J251bWJlcic6IG51bWJlcixcblx0XHRcdFx0XHQnb3BlcmF0b3InOiAvWypcXC8lK1xcLSZefF09P3w8PD0/fD4+PT98WyF+Xz1dLyxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWygpJyxdL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBPdGhlciBjb21tYW5kc1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58WyYoXSlbIFxcdF0qQD8pXFx3K1xcYig/OlwiKD86W1xcXFxcIl1cInxbXlwiXSkqXCIoPyFcIil8W15cIl4mKVxcclxcbl18XFxeKD86XFxyXFxufFtcXHNcXFNdKSkqL20sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdrZXl3b3JkJzogL15cXHcrXFxiLyxcblx0XHRcdFx0XHQnc3RyaW5nJzogc3RyaW5nLFxuXHRcdFx0XHRcdCdwYXJhbWV0ZXInOiBwYXJhbWV0ZXIsXG5cdFx0XHRcdFx0J2xhYmVsJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyheXFxzKik6XFxTKy9tLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQndmFyaWFibGUnOiB2YXJpYWJsZSxcblx0XHRcdFx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdFx0XHRcdCdvcGVyYXRvcic6IC9cXF4vXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdvcGVyYXRvcic6IC9bJkBdLyxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpJ10vXG5cdH07XG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5iYmNvZGUgPSB7XG5cdCd0YWcnOiB7XG5cdFx0cGF0dGVybjogL1xcW1xcLz9bXlxccz1cXF1dKyg/Olxccyo9XFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXlxccydcIlxcXT1dKykpPyg/OlxccytbXlxccz1cXF1dK1xccyo9XFxzKig/OlwiW15cIl0qXCJ8J1teJ10qJ3xbXlxccydcIlxcXT1dKykpKlxccypcXF0vLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3RhZyc6IHtcblx0XHRcdFx0cGF0dGVybjogL15cXFtcXC8/W15cXHM9XFxdXSsvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcW1xcLz8vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnYXR0ci12YWx1ZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLz1cXHMqKD86XCJbXlwiXSpcInwnW14nXSonfFteXFxzJ1wiXFxdPV0rKS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IFtcblx0XHRcdFx0XHRcdC9ePS8sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccyopW1wiJ118W1wiJ10kLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdF1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXF0vLFxuXHRcdFx0J2F0dHItbmFtZSc6IC9bXlxccz1cXF1dKy9cblx0XHR9XG5cdH1cbn07XG5cblByaXNtLmxhbmd1YWdlcy5zaG9ydGNvZGUgPSBQcmlzbS5sYW5ndWFnZXMuYmJjb2RlO1xuXG4vLyBiYXNlZCBsb29zZWx5IHVwb246IGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZS9iaWNlcC9ibG9iL21haW4vc3JjL3RleHRtYXRlL2JpY2VwLnRtbGFuZ3VhZ2VcblByaXNtLmxhbmd1YWdlcy5iaWNlcCA9IHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0e1xuXHRcdFx0Ly8gbXVsdGlsaW5lIGNvbW1lbnRzIGVnIC8qIEFTREYgKi9cblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gc2luZ2xlbGluZSBjb21tZW50cyBlZyAvLyBBU0RGXG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcOl0pXFwvXFwvLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblxuXHQncHJvcGVydHknOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhbXFxyXFxuXVsgXFx0XSopW2Etel9dXFx3Kig/PVsgXFx0XSo6KS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhbXFxyXFxuXVsgXFx0XSopJyg/OlxcXFwufFxcJCg/IVxceyl8W14nXFxcXFxcclxcbiRdKSonKD89WyBcXHRdKjopLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdzdHJpbmcnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLycnJ1teJ11bXFxzXFxTXSo/JycnLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXCddKScoPzpcXFxcLnxcXCQoPyFcXHspfFteJ1xcXFxcXHJcXG4kXSkqJy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdH1cblx0XSxcblx0J2ludGVycG9sYXRlZC1zdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXCddKScoPzpcXFxcLnxcXCQoPzooPyFcXHspfFxce1tee31cXHJcXG5dKlxcfSl8W14nXFxcXFxcclxcbiRdKSonLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwkXFx7W157fVxcclxcbl0qXFx9Lyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXCRcXHspW1xcc1xcU10rKD89XFx9JCkvLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXCRcXHt8XFx9JC8sXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH0sXG5cblx0J2RhdGF0eXBlJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiKD86b3V0cHV0fHBhcmFtKVxcYlsgXFx0XStcXHcrWyBcXHRdKylcXHcrXFxiLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fSxcblxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZS9iaWNlcC9ibG9iLzExNGEzMjUxYjRlNmUzMDA4MmE1ODcyOWYxOWE4Y2M0ZTM3NGZmYTYvc3JjL3RleHRtYXRlL2JpY2VwLnRtbGFuZ3VhZ2UjTDE4NFxuXHQna2V5d29yZCc6IC9cXGIoPzpleGlzdGluZ3xmb3J8aWZ8aW58bW9kdWxlfG51bGx8b3V0cHV0fHBhcmFtfHJlc291cmNlfHRhcmdldFNjb3BlfHZhcilcXGIvLFxuXG5cdCdkZWNvcmF0b3InOiAvQFxcdytcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVsgXFx0XSpcXCgpL2ksXG5cblx0J251bWJlcic6IC8oPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86RVsrLV0/XFxkKyk/L2ksXG5cdCdvcGVyYXRvcic6IC8tLXxcXCtcXCt8XFwqXFwqPT98PT58JiY9P3xcXHxcXHw9P3xbIT1dPT18PDw9P3w+Pj4/PT98Wy0rKi8lJnxeIT08Pl09P3xcXC57M318XFw/XFw/PT98XFw/XFwuP3xbfjpdLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjpdLyxcbn07XG5cblByaXNtLmxhbmd1YWdlcy5iaWNlcFsnaW50ZXJwb2xhdGVkLXN0cmluZyddLmluc2lkZVsnaW50ZXJwb2xhdGlvbiddLmluc2lkZVsnZXhwcmVzc2lvbiddLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5iaWNlcDtcblxuUHJpc20ubGFuZ3VhZ2VzLmJpcmIgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvcj8oXCJ8JykoPzpcXFxcLnwoPyFcXDEpW15cXFxcXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0L1xcYltBLVpdKD86W1xcZF9dKlthLXpBLVpdXFx3Kik/XFxiLyxcblxuXHRcdC8vIG1hdGNoZXMgdmFyaWFibGUgYW5kIGZ1bmN0aW9uIHJldHVybiB0eXBlcyAocGFyYW1ldGVycyBhcyB3ZWxsKS5cblx0XHQvXFxiKD86W0EtWl1cXHcqfCg/ISg/OnZhcnx2b2lkKVxcYilbYS16XVxcdyopKD89XFxzK1xcdytcXHMqWzssPSgpXSkvXG5cdF0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFzc2VydHxicmVha3xjYXNlfGNsYXNzfGNvbnN0fGRlZmF1bHR8ZWxzZXxlbnVtfGZpbmFsfGZvbGxvd3N8Zm9yfGdyYWJ8aWZ8bmVzdHxuZXd8bmV4dHxub1NlZWJ8cmV0dXJufHN0YXRpY3xzd2l0Y2h8dGhyb3d8dmFyfHZvaWR8d2hpbGUpXFxiLyxcblx0J29wZXJhdG9yJzogL1xcK1xcK3wtLXwmJnxcXHxcXHx8PDw9P3w+Pj0/fH4oPzpcXC89Pyk/fFsrXFwtKlxcLyUmXnw9ITw+XT0/fFxcP3w6Lyxcblx0J3ZhcmlhYmxlJzogL1xcYlthLXpfXVxcdypcXGIvLFxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2JpcmInLCAnZnVuY3Rpb24nLCB7XG5cdCdtZXRhZGF0YSc6IHtcblx0XHRwYXR0ZXJuOiAvPFxcdys+Lyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdzeW1ib2wnXG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuYmlzb24gPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjJywge30pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdiaXNvbicsICdjb21tZW50Jywge1xuXHQnYmlzb24nOiB7XG5cdFx0Ly8gVGhpcyBzaG91bGQgbWF0Y2ggYWxsIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGVcblx0XHQvLyBpbmNsdWRpbmcgdGhlIHByb2xvZ3VlKHMpLCB0aGUgYmlzb24gZGVjbGFyYXRpb25zIGFuZFxuXHRcdC8vIHRoZSBncmFtbWFyIHJ1bGVzLlxuXHRcdHBhdHRlcm46IC9eKD86W14lXXwlKD8hJSkpKiUlW1xcc1xcU10qPyUlLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdjJzoge1xuXHRcdFx0XHQvLyBBbGxvdyBmb3Igb25lIGxldmVsIG9mIG5lc3RlZCBicmFjZXNcblx0XHRcdFx0cGF0dGVybjogLyVcXHtbXFxzXFxTXSo/JVxcfXxcXHsoPzpcXHtbXn1dKlxcfXxbXnt9XSkqXFx9Lyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eJT9cXHt8JT9cXH0kLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnYmlzb24tdmFyaWFibGUnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvWyRAXSg/OjxbXlxccz5dKz4pP1tcXHckXSsvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZScsXG5cdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzx8Pi9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy5jXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnY29tbWVudCc6IFByaXNtLmxhbmd1YWdlcy5jLmNvbW1lbnQsXG5cdFx0XHQnc3RyaW5nJzogUHJpc20ubGFuZ3VhZ2VzLmMuc3RyaW5nLFxuXHRcdFx0J3Byb3BlcnR5JzogL1xcUysoPz06KS8sXG5cdFx0XHQna2V5d29yZCc6IC8lXFx3Ky8sXG5cdFx0XHQnbnVtYmVyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15AXSlcXGIoPzoweFtcXGRhLWZdK3xcXGQrKS9pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogLyVbJT9dfFt8OjtcXFtcXF08Pl0vXG5cdFx0fVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmJuZiA9IHtcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJbXlxcclxcblwiXSpcInwnW15cXHJcXG4nXSonL1xuXHR9LFxuXHQnZGVmaW5pdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvPFtePD5cXHJcXG5cXHRdKz4oPz1cXHMqOjo9KS8sXG5cdFx0YWxpYXM6IFsncnVsZScsICdrZXl3b3JkJ10sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXjx8PiQvXG5cdFx0fVxuXHR9LFxuXHQncnVsZSc6IHtcblx0XHRwYXR0ZXJuOiAvPFtePD5cXHJcXG5cXHRdKz4vLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL148fD4kL1xuXHRcdH1cblx0fSxcblx0J29wZXJhdG9yJzogLzo6PXxbfCgpW1xcXXt9Kis/XXxcXC57M30vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucmJuZiA9IFByaXNtLmxhbmd1YWdlcy5ibmY7XG5cblByaXNtLmxhbmd1YWdlcy5icmFpbmZ1Y2sgPSB7XG5cdCdwb2ludGVyJzoge1xuXHRcdHBhdHRlcm46IC88fD4vLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2luY3JlbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwrLyxcblx0XHRhbGlhczogJ2luc2VydGVkJ1xuXHR9LFxuXHQnZGVjcmVtZW50Jzoge1xuXHRcdHBhdHRlcm46IC8tLyxcblx0XHRhbGlhczogJ2RlbGV0ZWQnXG5cdH0sXG5cdCdicmFuY2hpbmcnOiB7XG5cdFx0cGF0dGVybjogL1xcW3xcXF0vLFxuXHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHR9LFxuXHQnb3BlcmF0b3InOiAvWy4sXS8sXG5cdCdjb21tZW50JzogL1xcUysvXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuYnJpZ2h0c2NyaXB0ID0ge1xuXHQnY29tbWVudCc6IC8oPzpcXGJyZW18JykuKi9pLFxuXHQnZGlyZWN0aXZlLXN0YXRlbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSMoPzpjb25zdHxlbHNlKD86W1xcdCBdK2lmKT98ZW5kW1xcdCBdK2lmfGVycm9yfGlmKS4qL2ltLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eScsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZXJyb3ItbWVzc2FnZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyheI2Vycm9yKS4rLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eIyg/OmNvbnN0fGVsc2UoPzpbXFx0IF0raWYpP3xlbmRbXFx0IF0raWZ8ZXJyb3J8aWYpLyxcblx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0fSxcblx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J3Byb3BlcnR5Jzoge1xuXHRcdHBhdHRlcm46IC8oW1xcclxcbnssXVtcXHQgXSopKD86KD8hXFxkKVxcdyt8XCIoPzpbXlwiXFxyXFxuXXxcIlwiKSpcIig/IVwiKSkoPz1bIFxcdF0qOikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cIlxcclxcbl18XCJcIikqXCIoPyFcIikvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYkFzW1xcdCBdKylcXHcrL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpBc3xEaW18RWFjaHxFbHNlfEVsc2VpZnxFbmR8RXhpdHxGb3J8RnVuY3Rpb258R290b3xJZnxJbnxQcmludHxSZXR1cm58U3RlcHxTdG9wfFN1YnxUaGVufFRvfFdoaWxlKVxcYi9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXHQnZnVuY3Rpb24nOiAvXFxiKD8hXFxkKVxcdysoPz1bXFx0IF0qXFwoKS8sXG5cdCdudW1iZXInOiAvKD86XFxiXFxkKyg/OlxcLlxcZCspPyg/OltlZF1bKy1dXFxkKyk/fCZoW2EtZlxcZF0rKVxcYlslJiEjXT8vaSxcblx0J29wZXJhdG9yJzogLy0tfFxcK1xcK3w+Pj0/fDw8PT98PD58Wy0rKi9cXFxcPD5dPT98WzpePT9dfFxcYig/OmFuZHxtb2R8bm90fG9yKVxcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvWy4sOygpW1xcXXt9XS8sXG5cdCdjb25zdGFudCc6IC9cXGIoPzpMSU5FX05VTSlcXGIvaVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmJyaWdodHNjcmlwdFsnZGlyZWN0aXZlLXN0YXRlbWVudCddLmluc2lkZS5leHByZXNzaW9uLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5icmlnaHRzY3JpcHQ7XG5cblByaXNtLmxhbmd1YWdlcy5icm8gPSB7XG5cblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXCRdKSMuKi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpdGFsaWMnOiAvXFxiKD86RklYTUV8VE9ET3xYWFgpXFxiL1xuXHRcdH1cblx0fSxcblxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2Jvb2xlYW4nOiAvXFxiW1RGXVxcYi8sXG5cblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiKD86ZXZlbnR8ZnVuY3Rpb258aG9vaylbIFxcdF0rKVxcdysoPzo6OlxcdyspPy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXG5cdCdidWlsdGluJzogLyg/OkAoPzpsb2FkKD86LSg/OnBsdWdpbnxzaWdzKSk/fHVubG9hZHxwcmVmaXhlc3xpZm4/ZGVmfGVsc2V8KD86ZW5kKT9pZnxESVJ8RklMRU5BTUUpKXwoPzomPyg/OmFkZF9mdW5jfGNyZWF0ZV9leHBpcmV8ZGVmYXVsdHxkZWxldGVfZnVuY3xlbmNyeXB0fGVycm9yX2hhbmRsZXJ8ZXhwaXJlX2Z1bmN8Z3JvdXB8bG9nfG1lcmdlYWJsZXxvcHRpb25hbHxwZXJzaXN0ZW50fHByaW9yaXR5fHJhd19vdXRwdXR8cmVhZF9leHBpcmV8cmVkZWZ8cm90YXRlX2ludGVydmFsfHJvdGF0ZV9zaXplfHN5bmNocm9uaXplZHx0eXBlX2NvbHVtbnx3cml0ZV9leHBpcmUpKS8sXG5cblx0J2NvbnN0YW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXFxiY29uc3RbIFxcdF0rKVxcdysvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cblx0J2tleXdvcmQnOiAvXFxiKD86YWRkfGFkZHJ8YWxhcm18YW55fGJvb2x8YnJlYWt8Y29uc3R8Y29udGludWV8Y291bnR8ZGVsZXRlfGRvdWJsZXxlbHNlfGVudW18ZXZlbnR8ZXhwb3J0fGZpbGV8Zm9yfGZ1bmN0aW9ufGdsb2JhbHxob29rfGlmfGlufGludHxpbnRlcnZhbHxsb2NhbHxtb2R1bGV8bmV4dHxvZnxvcGFxdWV8cGF0dGVybnxwb3J0fHByaW50fHJlY29yZHxyZXR1cm58c2NoZWR1bGV8c2V0fHN0cmluZ3xzdWJuZXR8dGFibGV8dGltZXx0aW1lb3V0fHVzaW5nfHZlY3Rvcnx3aGVuKVxcYi8sXG5cblx0J29wZXJhdG9yJzogLy0tP3xcXCtcXCs/fCE9Pz0/fDw9P3w+PT98PT0/PT98JiZ8XFx8XFx8P3xcXD98XFwqfFxcL3x+fFxcXnwlLyxcblxuXHQnbnVtYmVyJzogL1xcYjB4W1xcZGEtZl0rXFxifCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT8vaSxcblxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOl0vXG59O1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1taXNsZWFkaW5nLWNoYXJhY3Rlci1jbGFzcyAqL1xuXG4vLyAxQzpFbnRlcnByaXNlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vRGl2ZXJzdXMyMy9cbi8vXG5QcmlzbS5sYW5ndWFnZXMuYnNsID0ge1xuXHQnY29tbWVudCc6IC9cXC9cXC8uKi8sXG5cdCdzdHJpbmcnOiBbXG5cdFx0Ly8gXHUwNDIxXHUwNDQyXHUwNDQwXHUwNDNFXHUwNDNBXHUwNDM4XG5cdFx0Ly8gU3RyaW5nc1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlteXCJdfFwiXCIpKlwiKD8hXCIpLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly8gXHUwNDE0XHUwNDMwXHUwNDQyXHUwNDMwIFx1MDQzOCBcdTA0MzJcdTA0NDBcdTA0MzVcdTA0M0NcdTA0NEZcblx0XHQvLyBEYXRlICYgdGltZVxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8nKD86W14nXFxyXFxuXFxcXF18XFxcXC4pKicvXG5cdFx0fVxuXHRdLFxuXHQna2V5d29yZCc6IFtcblx0XHR7XG5cdFx0XHQvLyBSVVxuXHRcdFx0cGF0dGVybjogLyhefFteXFx3XFx1MDQwMC1cXHUwNDg0XFx1MDQ4Ny1cXHUwNTJmXFx1MWQyYlxcdTFkNzhcXHUyZGUwLVxcdTJkZmZcXHVhNjQwLVxcdWE2OWZcXHVmZTJlXFx1ZmUyZl0pKD86XHUwNDNGXHUwNDNFXHUwNDNBXHUwNDMwfFx1MDQzNFx1MDQzQlx1MDQ0RnxcdTA0M0RcdTA0M0VcdTA0MzJcdTA0NEJcdTA0Mzl8XHUwNDNGXHUwNDQwXHUwNDM1XHUwNDQwXHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDfFx1MDQzRlx1MDQzRVx1MDQzRlx1MDQ0Qlx1MDQ0Mlx1MDQzQVx1MDQzMHxcdTA0MzhcdTA0NDFcdTA0M0FcdTA0M0JcdTA0NEVcdTA0NDdcdTA0MzVcdTA0M0RcdTA0MzhcdTA0MzV8XHUwNDMyXHUwNDRCXHUwNDM3XHUwNDMyXHUwNDMwXHUwNDQyXHUwNDRDXHUwNDM4XHUwNDQxXHUwNDNBXHUwNDNCXHUwNDRFXHUwNDQ3XHUwNDM1XHUwNDNEXHUwNDM4XHUwNDM1fFx1MDQzOFx1MDQzRFx1MDQzMFx1MDQ0N1x1MDQzNXxcdTA0M0FcdTA0M0VcdTA0M0RcdTA0MzVcdTA0NDZcdTA0M0ZcdTA0M0VcdTA0M0ZcdTA0NEJcdTA0NDJcdTA0M0FcdTA0Mzh8XHUwNDNEXHUwNDM1XHUwNDNFXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM1XHUwNDNCXHUwNDM1XHUwNDNEXHUwNDNFfFx1MDQ0NFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQ0RnxcdTA0M0ZcdTA0MzVcdTA0NDBcdTA0MzVcdTA0M0N8XHUwNDMyXHUwNDNFXHUwNDM3XHUwNDMyXHUwNDQwXHUwNDMwXHUwNDQyfFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzNVx1MDQ0Nlx1MDQ0NFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQzOHxcdTA0MzVcdTA0NDFcdTA0M0JcdTA0Mzh8XHUwNDM4XHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDM1XHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4fFx1MDQzRlx1MDQ0MFx1MDQzRVx1MDQ0Nlx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQ0MFx1MDQzMHxcdTA0M0FcdTA0M0VcdTA0M0RcdTA0MzVcdTA0NDZcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDZcdTA0MzVcdTA0MzRcdTA0NDNcdTA0NDBcdTA0NEJ8XHUwNDQyXHUwNDNFXHUwNDMzXHUwNDM0XHUwNDMwfFx1MDQzN1x1MDQzRFx1MDQzMFx1MDQ0N3xcdTA0NERcdTA0M0FcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0NDBcdTA0NDJ8XHUwNDNBXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDNCXHUwNDM4fFx1MDQzOFx1MDQzN3xcdTA0M0FcdTA0MzBcdTA0MzZcdTA0MzRcdTA0M0VcdTA0MzNcdTA0M0V8XHUwNDM4XHUwNDQxXHUwNDQyXHUwNDM4XHUwNDNEXHUwNDMwfFx1MDQzQlx1MDQzRVx1MDQzNlx1MDQ0Q3xcdTA0M0ZcdTA0M0V8XHUwNDQ2XHUwNDM4XHUwNDNBXHUwNDNCfFx1MDQzQVx1MDQzRVx1MDQzRFx1MDQzNVx1MDQ0Nlx1MDQ0Nlx1MDQzOFx1MDQzQVx1MDQzQlx1MDQzMHxcdTA0MzJcdTA0NEJcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0M0RcdTA0MzhcdTA0NDJcdTA0NEMpKD8hW1xcd1xcdTA0MDAtXFx1MDQ4NFxcdTA0ODctXFx1MDUyZlxcdTFkMmJcXHUxZDc4XFx1MmRlMC1cXHUyZGZmXFx1YTY0MC1cXHVhNjlmXFx1ZmUyZVxcdWZlMmZdKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gRU5cblx0XHRcdHBhdHRlcm46IC9cXGIoPzpicmVha3xkb3xlYWNofGVsc2V8ZWxzZWlmfGVuZGRvfGVuZGZ1bmN0aW9ufGVuZGlmfGVuZHByb2NlZHVyZXxlbmR0cnl8ZXhjZXB0fGV4ZWN1dGV8ZXhwb3J0fGZhbHNlfGZvcnxmdW5jdGlvbnxpZnxpbnxuZXd8bnVsbHxwcm9jZWR1cmV8cmFpc2V8cmV0dXJufHRoZW58dG98dHJ1ZXx0cnl8dW5kZWZpbmVkfHZhbHx2YXJ8d2hpbGUpXFxiL2lcblx0XHR9XG5cdF0sXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyheKD89XFxkKXxbXlxcd1xcdTA0MDAtXFx1MDQ4NFxcdTA0ODctXFx1MDUyZlxcdTFkMmJcXHUxZDc4XFx1MmRlMC1cXHUyZGZmXFx1YTY0MC1cXHVhNjlmXFx1ZmUyZVxcdWZlMmZdKSg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzpFWystXT9cXGQrKT8vaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdvcGVyYXRvcic6IFtcblx0XHQvWzw+K1xcLSovXT0/fFslPV0vLFxuXHRcdC8vIFJVXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3XFx1MDQwMC1cXHUwNDg0XFx1MDQ4Ny1cXHUwNTJmXFx1MWQyYlxcdTFkNzhcXHUyZGUwLVxcdTJkZmZcXHVhNjQwLVxcdWE2OWZcXHVmZTJlXFx1ZmUyZl0pKD86XHUwNDM4fFx1MDQzOFx1MDQzQlx1MDQzOHxcdTA0M0RcdTA0MzUpKD8hW1xcd1xcdTA0MDAtXFx1MDQ4NFxcdTA0ODctXFx1MDUyZlxcdTFkMmJcXHUxZDc4XFx1MmRlMC1cXHUyZGZmXFx1YTY0MC1cXHVhNjlmXFx1ZmUyZVxcdWZlMmZdKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly8gRU5cblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86YW5kfG5vdHxvcilcXGIvaVxuXHRcdH1cblx0XSxcblx0J3B1bmN0dWF0aW9uJzogL1xcKFxcLnxcXC5cXCl8WygpXFxbXFxdOjssLl0vLFxuXHQnZGlyZWN0aXZlJzogW1xuXHRcdC8vIFx1MDQyMlx1MDQzNVx1MDQzM1x1MDQzOCBcdTA0M0ZcdTA0NDBcdTA0MzVcdTA0M0ZcdTA0NDBcdTA0M0VcdTA0NDZcdTA0MzVcdTA0NDFcdTA0NDFcdTA0M0VcdTA0NDBcdTA0MzAgXHUwNDMyXHUwNDM4XHUwNDM0XHUwNDMwICZcdTA0MUFcdTA0M0JcdTA0MzhcdTA0MzVcdTA0M0RcdTA0NDIsICZcdTA0MjFcdTA0MzVcdTA0NDBcdTA0MzJcdTA0MzVcdTA0NDAsIC4uLlxuXHRcdC8vIFByZXByb2Nlc3NvciB0YWdzIG9mIHRoZSB0eXBlICZDbGllbnQsICZTZXJ2ZXIsIC4uLlxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9eKFsgXFx0XSopJi4qL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0fSxcblx0XHQvLyBcdTA0MThcdTA0M0RcdTA0NDFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M0FcdTA0NDZcdTA0MzhcdTA0MzggXHUwNDNGXHUwNDQwXHUwNDM1XHUwNDNGXHUwNDQwXHUwNDNFXHUwNDQ2XHUwNDM1XHUwNDQxXHUwNDQxXHUwNDNFXHUwNDQwXHUwNDMwIFx1MDQzMlx1MDQzOFx1MDQzNFx1MDQzMDpcblx0XHQvLyAjXHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4IFx1MDQyMVx1MDQzNVx1MDQ0MFx1MDQzMlx1MDQzNVx1MDQ0MCBcdTA0MjJcdTA0M0VcdTA0MzNcdTA0MzRcdTA0MzBcblx0XHQvLyAuLi5cblx0XHQvLyAjXHUwNDFBXHUwNDNFXHUwNDNEXHUwNDM1XHUwNDQ2XHUwNDE1XHUwNDQxXHUwNDNCXHUwNDM4XG5cdFx0Ly8gUHJlcHJvY2Vzc29yIGluc3RydWN0aW9ucyBvZiB0aGUgZm9ybTpcblx0XHQvLyAjSWYgU2VydmVyIFRoZW5cblx0XHQvLyAuLi5cblx0XHQvLyAjRW5kSWZcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXihbIFxcdF0qKSMuKi9nbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHR9XG5cdF1cbn07XG5cblByaXNtLmxhbmd1YWdlcy5vc2NyaXB0ID0gUHJpc20ubGFuZ3VhZ2VzWydic2wnXTtcblxuLy8gaHR0cHM6Ly9jZmRvY3Mub3JnL3NjcmlwdFxuUHJpc20ubGFuZ3VhZ2VzLmNmc2NyaXB0ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdjb21tZW50JzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnYW5ub3RhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKD86XnxbXi5dKUBbXFx3XFwuXSsvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6XSlcXC9cXC8uKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQna2V5d29yZCc6IC9cXGIoPzphYnN0cmFjdHxicmVha3xjYXRjaHxjb21wb25lbnR8Y29udGludWV8ZGVmYXVsdHxkb3xlbHNlfGV4dGVuZHN8ZmluYWx8ZmluYWxseXxmb3J8ZnVuY3Rpb258aWZ8aW58aW5jbHVkZXxwYWNrYWdlfHByaXZhdGV8cHJvcGVydHl8cHVibGljfHJlbW90ZXxyZXF1aXJlZHxyZXRocm93fHJldHVybnxzdGF0aWN8c3dpdGNofHRocm93fHRyeXx2YXJ8d2hpbGV8eG1sKVxcYig/IVxccyo9KS8sXG5cdCdvcGVyYXRvcic6IFtcblx0XHQvXFwrXFwrfC0tfCYmfFxcfFxcfHw6Onw9PnxbIT1dPT18Wy0rKi8lJnxeIT08Pl09P3xcXD8oPzpcXC58Oik/fDovLFxuXHRcdC9cXGIoPzphbmR8Y29udGFpbnN8ZXF8ZXF1YWx8ZXF2fGd0fGd0ZXxpbXB8aXN8bHR8bHRlfG1vZHxub3R8b3J8eG9yKVxcYi9cblx0XSxcblx0J3Njb3BlJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzphcHBsaWNhdGlvbnxhcmd1bWVudHN8Y2dpfGNsaWVudHxjb29raWV8bG9jYWx8c2Vzc2lvbnxzdXBlcnx0aGlzfHZhcmlhYmxlcylcXGIvLFxuXHRcdGFsaWFzOiAnZ2xvYmFsJ1xuXHR9LFxuXHQndHlwZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86YW55fGFycmF5fGJpbmFyeXxib29sZWFufGRhdGV8Z3VpZHxudW1lcmljfHF1ZXJ5fHN0cmluZ3xzdHJ1Y3R8dXVpZHx2b2lkfHhtbClcXGIvLFxuXHRcdGFsaWFzOiAnYnVpbHRpbidcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2Nmc2NyaXB0JywgJ2tleXdvcmQnLCB7XG5cdC8vIFRoaXMgbXVzdCBiZSBkZWNsYXJlZCBiZWZvcmUga2V5d29yZCBiZWNhdXNlIHdlIHVzZSBcImZ1bmN0aW9uXCIgaW5zaWRlIHRoZSBsb29rYWhlYWRcblx0J2Z1bmN0aW9uLXZhcmlhYmxlJzoge1xuXHRcdHBhdHRlcm46IC9bXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSooPz1cXHMqWz06XVxccyooPzpcXGJmdW5jdGlvblxcYnwoPzpcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKXwoPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKVxccyo9PikpLyxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9XG59KTtcblxuZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5jZnNjcmlwdFsnY2xhc3MtbmFtZSddO1xuUHJpc20ubGFuZ3VhZ2VzLmNmYyA9IFByaXNtLmxhbmd1YWdlc1snY2ZzY3JpcHQnXTtcblxuUHJpc20ubGFuZ3VhZ2VzLmNoYWlzY3JpcHQgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSknKD86W14nXFxcXF18XFxcXFtcXHNcXFNdKSonLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IFtcblx0XHR7XG5cdFx0XHQvLyBlLmcuIGNsYXNzIFJlY3RhbmdsZSB7IC4uLiB9XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYmNsYXNzXFxzKylcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIGUuZy4gYXR0ciBSZWN0YW5nbGU6OmhlaWdodCwgZGVmIFJlY3RhbmdsZTo6YXJlYSgpIHsgLi4uIH1cblx0XHRcdHBhdHRlcm46IC8oXFxiKD86YXR0cnxkZWYpXFxzKylcXHcrKD89XFxzKjo6KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQna2V5d29yZCc6IC9cXGIoPzphdHRyfGF1dG98YnJlYWt8Y2FzZXxjYXRjaHxjbGFzc3xjb250aW51ZXxkZWZ8ZGVmYXVsdHxlbHNlfGZpbmFsbHl8Zm9yfGZ1bnxnbG9iYWx8aWZ8cmV0dXJufHN3aXRjaHx0aGlzfHRyeXx2YXJ8d2hpbGUpXFxiLyxcblx0J251bWJlcic6IFtcblx0XHRQcmlzbS5sYW5ndWFnZXMuY3BwLm51bWJlcixcblx0XHQvXFxiKD86SW5maW5pdHl8TmFOKVxcYi9cblx0XSxcblx0J29wZXJhdG9yJzogLz4+PT98PDw9P3xcXHxcXHx8JiZ8Ols6PV0/fC0tfFxcK1xcK3xbPSE8PitcXC0qLyV8Jl5dPT98Wz9+XXxgW15gXFxyXFxuXXsxLDR9YC8sXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY2hhaXNjcmlwdCcsICdvcGVyYXRvcicsIHtcblx0J3BhcmFtZXRlci10eXBlJzoge1xuXHRcdC8vIGUuZy4gZGVmIGZvbyhpbnQgeCwgVmVjdG9yIHkpIHsuLi59XG5cdFx0cGF0dGVybjogLyhbLChdXFxzKilcXHcrKD89XFxzK1xcdykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9LFxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NoYWlzY3JpcHQnLCAnc3RyaW5nJywge1xuXHQnc3RyaW5nLWludGVycG9sYXRpb24nOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pXCIoPzpbXlwiJFxcXFxdfFxcXFxbXFxzXFxTXXxcXCQoPyFcXHspfFxcJFxceyg/Oltee31dfFxceyg/Oltee31dfFxce1tee31dKlxcfSkqXFx9KSpcXH0pKlwiLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopXFwkXFx7KD86W157fV18XFx7KD86W157fV18XFx7W157fV0qXFx9KSpcXH0pKlxcfS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLWV4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXCRcXHspW1xcc1xcU10rKD89XFx9JCkvLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNoYWlzY3JpcHRcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL15cXCRcXHt8XFx9JC8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fSxcbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuY2lsID0ge1xuXHQnY29tbWVudCc6IC9cXC9cXC8uKi8sXG5cblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogLyhefFxcVylcXC5bYS16XSsoPz1cXHMpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0fSxcblxuXHQvLyBBY3R1YWxseSBhbiBhc3NlbWJseSByZWZlcmVuY2Vcblx0J3ZhcmlhYmxlJzogL1xcW1tcXHdcXC5dK1xcXS8sXG5cblxuXHQna2V5d29yZCc6IC9cXGIoPzphYnN0cmFjdHxhbnNpfGFzc2VtYmx5fGF1dG98YXV0b2NoYXJ8YmVmb3JlZmllbGRpbml0fGJvb2x8YnN0cnxieXZhbHN0cnxjYXRjaHxjaGFyfGNpbHxjbGFzc3xjdXJyZW5jeXxkYXRlfGRlY2ltYWx8ZGVmYXVsdHxlbnVtfGVycm9yfGV4cGxpY2l0fGV4dGVuZHN8ZXh0ZXJufGZhbWFuZGFzc2VtfGZhbWlseXxmYW1vcmFzc2VtfGZpbmFsKD86bHkpP3xmbG9hdDMyfGZsb2F0NjR8aGlkZWJ5c2lnfHU/aW50KD86OHwxNnwzMnw2NCk/fGlhbnR8aWRpc3BhdGNofGltcGxlbWVudHN8aW1wb3J0fGluaXRvbmx5fGluc3RhbmNlfGludGVyZmFjZXxpdW5rbm93bnxsaXRlcmFsfGxwc3RyfGxwc3RydWN0fGxwdHN0cnxscHdzdHJ8bWFuYWdlZHxtZXRob2R8bmF0aXZlKD86VHlwZSk/fG5lc3RlZHxuZXdzbG90fG9iamVjdCg/OnJlZik/fHBpbnZva2VpbXBsfHByaXZhdGV8cHJpdmF0ZXNjb3BlfHB1YmxpY3xyZXFzZWNvYmp8cnRzcGVjaWFsbmFtZXxydW50aW1lfHNlYWxlZHxzZXF1ZW50aWFsfHNlcmlhbGl6YWJsZXxzcGVjaWFsbmFtZXxzdGF0aWN8c3RyaW5nfHN0cnVjdHxzeXNjaGFyfHRic3RyfHVuaWNvZGV8dW5tYW5hZ2VkZXhwfHVuc2lnbmVkfHZhbHVlKD86dHlwZSk/fHZhcmlhbnR8dmlydHVhbHx2b2lkKVxcYi8sXG5cblx0J2Z1bmN0aW9uJzogL1xcYig/Oig/OmNvbnN0cmFpbmVkfG5vfHJlYWRvbmx5fHRhaWx8dW5hbGlnbmVkfHZvbGF0aWxlKVxcLik/KD86Y29udlxcLig/OltpdV1bMTI0OF0/fG92ZlxcLltpdV1bMTI0OF0/KD86XFwudW4pP3xyXFwudW58cjR8cjgpfGxkY1xcLig/Omk0KD86XFwuXFxkK3xcXC5bbU1dMXxcXC5zKT98aTh8cjR8cjgpfGxkZWxlbSg/OlxcLltpdV1bMTI0OF0/fFxcLnJbNDhdfFxcLnJlZnxhKT98bGRpbmRcXC4oPzpbaXVdWzEyNDhdP3xyWzQ4XXxyZWYpfHN0ZWxlbVxcLj8oPzppWzEyNDhdP3xyWzQ4XXxyZWYpP3xzdGluZFxcLig/OmlbMTI0OF0/fHJbNDhdfHJlZik/fGVuZCg/OmZhdWx0fGZpbHRlcnxmaW5hbGx5KXxsZGFyZyg/OlxcLlswLTNzXXxhKD86XFwucyk/KT98bGRsb2MoPzpcXC5cXGQrfFxcLnMpP3xzdWIoPzpcXC5vdmYoPzpcXC51bik/KT98bXVsKD86XFwub3ZmKD86XFwudW4pPyk/fGFkZCg/OlxcLm92Zig/OlxcLnVuKT8pP3xzdGxvYyg/OlxcLlswLTNzXSk/fHJlZmFueSg/OnR5cGV8dmFsKXxibHQoPzpcXC51bik/KD86XFwucyk/fGJsZSg/OlxcLnVuKT8oPzpcXC5zKT98Ymd0KD86XFwudW4pPyg/OlxcLnMpP3xiZ2UoPzpcXC51bik/KD86XFwucyk/fHVuYm94KD86XFwuYW55KT98aW5pdCg/OmJsa3xvYmopfGNhbGwoPzppfHZpcnQpP3xicmZhbHNlKD86XFwucyk/fGJuZVxcLnVuKD86XFwucyk/fGxkbG9jYSg/OlxcLnMpP3xicnplcm8oPzpcXC5zKT98YnJ0cnVlKD86XFwucyk/fGJybnVsbCg/OlxcLnMpP3xicmluc3QoPzpcXC5zKT98c3RhcmcoPzpcXC5zKT98bGVhdmUoPzpcXC5zKT98c2hyKD86XFwudW4pP3xyZW0oPzpcXC51bik/fGRpdig/OlxcLnVuKT98Y2x0KD86XFwudW4pP3xhbGlnbm1lbnR8Y2FzdGNsYXNzfGxkdmlydGZ0bnxiZXEoPzpcXC5zKT98Y2tmaW5pdGV8bGRzZmxkYXxsZHRva2VufGxvY2FsbG9jfG1rcmVmYW55fHJldGhyb3d8Y2d0XFwudW58YXJnbGlzdHxzd2l0Y2h8c3RzZmxkfHNpemVvZnxuZXdvYmp8bmV3YXJyfGxkc2ZsZHxsZG51bGx8bGRmbGRhfGlzaW5zdHx0aHJvd3xzdG9ianxzdGZsZHxsZHN0cnxsZG9ianxsZGxlbnxsZGZ0bnxsZGZsZHxjcG9ianxjcGJsa3xicmVha3xiclxcLnN8eG9yfHNobHxyZXR8cG9wfG5vdHxub3B8bmVnfGptcHxkdXB8Y2d0fGNlcXxib3h8YW5kfG9yfGJyKVxcYi8sXG5cblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogL1xcYi0/KD86MHhbMC05YS1mXSt8XFxkKykoPzpcXC5bMC05YS1mXSspP1xcYi9pLFxuXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLDo9XXxJTF9bMC05QS1aYS16XSsvXG59O1xuXG4vLyBDb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vamVsdWFyZC9wcmlzbS1jbG9qdXJlXG5QcmlzbS5sYW5ndWFnZXMuY2xvanVyZSA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLzsuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxdfFxcXFwuKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjaGFyJzogL1xcXFxcXHcrLyxcblx0J3N5bWJvbCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W1xccygpXFxbXFxde30sXSk6Oj9bXFx3KishPyc8Pj0vLi1dKy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcKCkoPzotfC0+fC0+PnxcXC58XFwuXFwufFxcKnxcXC98XFwrfDx8PD18PXw9PXw+fD49fGFjY2Vzc29yfGFnZW50fGFnZW50LWVycm9yc3xhZ2V0fGFsZW5ndGh8YWxsLW5zfGFsdGVyfGFuZHxhcHBlbmQtY2hpbGR8YXBwbHl8YXJyYXktbWFwfGFzZXR8YXNldC1ib29sZWFufGFzZXQtYnl0ZXxhc2V0LWNoYXJ8YXNldC1kb3VibGV8YXNldC1mbG9hdHxhc2V0LWludHxhc2V0LWxvbmd8YXNldC1zaG9ydHxhc3NlcnR8YXNzb2N8YXdhaXR8YXdhaXQtZm9yfGJlYW58YmluZGluZ3xiaXQtYW5kfGJpdC1ub3R8Yml0LW9yfGJpdC1zaGlmdC1sZWZ0fGJpdC1zaGlmdC1yaWdodHxiaXQteG9yfGJvb2xlYW58YnJhbmNoXFw/fGJ1dGxhc3R8Ynl0ZXxjYXN0fGNoYXJ8Y2hpbGRyZW58Y2xhc3N8Y2xlYXItYWdlbnQtZXJyb3JzfGNvbW1lbnR8Y29tbXV0ZXxjb21wfGNvbXBhcmF0b3J8Y29tcGxlbWVudHxjb25jYXR8Y29uZHxjb25qfGNvbnN8Y29uc3RhbnRseXxjb25zdHJ1Y3QtcHJveHl8Y29udGFpbnNcXD98Y291bnR8Y3JlYXRlLW5zfGNyZWF0ZS1zdHJ1Y3R8Y3ljbGV8ZGVjfGRlY2xhcmV8ZGVmfGRlZi18ZGVmaW5saW5lfGRlZmludGVyZmFjZXxkZWZtYWNyb3xkZWZtZXRob2R8ZGVmbXVsdGl8ZGVmbnxkZWZuLXxkZWZvbmNlfGRlZnByb2plY3R8ZGVmcHJvdG9jb2x8ZGVmcmVjb3JkfGRlZnN0cnVjdHxkZWZ0eXBlfGRlcmVmfGRpZmZlcmVuY2V8ZGlzanxkaXNzb2N8ZGlzdGluY3R8ZG98ZG9hbGx8ZG9jfGRvcnVufGRvc2VxfGRvc3luY3xkb3RpbWVzfGRvdG98ZG91YmxlfGRvd258ZHJvcHxkcm9wLXdoaWxlfGVkaXR8ZW5kXFw/fGVuc3VyZXxldmFsfGV2ZXJ5XFw/fGZhbHNlXFw/fGZmaXJzdHxmaWxlLXNlcXxmaWx0ZXJ8ZmluZHxmaW5kLWRvY3xmaW5kLW5zfGZpbmQtdmFyfGZpcnN0fGZsb2F0fGZsdXNofGZufGZuc2VxfGZvcnxmcmVzdHxnZW5zeW18Z2V0fGdldC1wcm94eS1jbGFzc3xoYXNoLW1hcHxoYXNoLXNldHxpZGVudGljYWxcXD98aWRlbnRpdHl8aWZ8aWYtbGV0fGlmLW5vdHxpbXBvcnR8aW4tbnN8aW5jfGluZGV4fGluc2VydC1jaGlsZHxpbnNlcnQtbGVmdHxpbnNlcnQtcmlnaHR8aW5zcGVjdC10YWJsZXxpbnNwZWN0LXRyZWV8aW5zdGFuY2VcXD98aW50fGludGVybGVhdmV8aW50ZXJzZWN0aW9ufGludG98aW50by1hcnJheXxpdGVyYXRlfGpvaW58a2V5fGtleXN8a2V5d29yZHxrZXl3b3JkXFw/fGxhc3R8bGF6eS1jYXR8bGF6eS1jb25zfGxlZnR8bGVmdHN8bGV0fGxpbmUtc2VxfGxpc3R8bGlzdFxcKnxsb2FkfGxvYWQtZmlsZXxsb2NraW5nfGxvbmd8bG9vcHxtYWNyb2V4cGFuZHxtYWNyb2V4cGFuZC0xfG1ha2UtYXJyYXl8bWFrZS1ub2RlfG1hcHxtYXAtaW52ZXJ0fG1hcFxcP3xtYXBjYXR8bWF4fG1heC1rZXl8bWVtZm58bWVyZ2V8bWVyZ2Utd2l0aHxtZXRhfG1pbnxtaW4ta2V5fG1vbml0b3ItZW50ZXJ8bmFtZXxuYW1lc3BhY2V8bmVnXFw/fG5ld3xuZXdsaW5lfG5leHR8bmlsXFw/fG5vZGV8bm90fG5vdC1hbnlcXD98bm90LWV2ZXJ5XFw/fG5vdD18bnN8bnMtaW1wb3J0c3xucy1pbnRlcm5zfG5zLW1hcHxucy1uYW1lfG5zLXB1YmxpY3N8bnMtcmVmZXJzfG5zLXJlc29sdmV8bnMtdW5tYXB8bnRofG50aHJlc3R8b3J8cGFyc2V8cGFydGlhbHxwYXRofHBlZWt8cG9wfHBvc1xcP3xwcnxwci1zdHJ8cHJpbnR8cHJpbnQtc3RyfHByaW50bG58cHJpbnRsbi1zdHJ8cHJufHBybi1zdHJ8cHJvamVjdHxwcm94eXxwcm94eS1tYXBwaW5nc3xxdW90fHF1b3RlfHJhbmR8cmFuZC1pbnR8cmFuZ2V8cmUtZmluZHxyZS1ncm91cHN8cmUtbWF0Y2hlcnxyZS1tYXRjaGVzfHJlLXBhdHRlcm58cmUtc2VxfHJlYWR8cmVhZC1saW5lfHJlY3VyfHJlZHVjZXxyZWZ8cmVmLXNldHxyZWZlcnxyZW18cmVtb3ZlfHJlbW92ZS1tZXRob2R8cmVtb3ZlLW5zfHJlbmFtZXxyZW5hbWUta2V5c3xyZXBlYXR8cmVwbGFjZXxyZXBsaWNhdGV8cmVzb2x2ZXxyZXN0fHJlc3VsdHNldC1zZXF8cmV2ZXJzZXxyZmlyc3R8cmlnaHR8cmlnaHRzfHJvb3R8cnJlc3R8cnNlcXxzZWNvbmR8c2VsZWN0fHNlbGVjdC1rZXlzfHNlbmR8c2VuZC1vZmZ8c2VxfHNlcS16aXB8c2VxXFw/fHNldHxzZXQhfHNob3J0fHNsdXJwfHNvbWV8c29ydHxzb3J0LWJ5fHNvcnRlZC1tYXB8c29ydGVkLW1hcC1ieXxzb3J0ZWQtc2V0fHNwZWNpYWwtc3ltYm9sXFw/fHNwbGl0LWF0fHNwbGl0LXdpdGh8c3RyfHN0cmluZ1xcP3xzdHJ1Y3R8c3RydWN0LW1hcHxzdWJzfHN1YnZlY3xzeW1ib2x8c3ltYm9sXFw/fHN5bmN8dGFrZXx0YWtlLW50aHx0YWtlLXdoaWxlfHRlc3R8dGhyb3d8dGltZXx0by1hcnJheXx0by1hcnJheS0yZHx0cmVlLXNlcXx0cnVlXFw/fHRyeXx1bmlvbnx1cHx1cGRhdGUtcHJveHl8dmFsfHZhbHN8dmFyfHZhci1nZXR8dmFyLXNldHx2YXJcXD98dmVjdG9yfHZlY3Rvci16aXB8dmVjdG9yXFw/fHdoZW58d2hlbi1maXJzdHx3aGVuLWxldHx3aGVuLW5vdHx3aXRoLWxvY2FsLXZhcnN8d2l0aC1tZXRhfHdpdGgtb3Blbnx3aXRoLW91dC1zdHJ8eG1sLXNlcXx4bWwtemlwfHplcm9cXD98emlwbWFwfHppcHBlcikoPz1bXFxzKV18JCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bmlsfHRydWUpXFxiLyxcblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHckQF0pKD86XFxkKyg/OlsvLl1cXGQrKT8oPzplWystXT9cXGQrKT98MHhbYS1mMC05XSt8WzEtOV1cXGQ/clthLXowLTldKylbbG1uXT8oPyFbXFx3JEBdKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxbXiddKVxcKClbXFx3KishPyc8Pj0vLi1dKyg/PVtcXHMpXXwkKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnb3BlcmF0b3InOiAvWyNAXmB+XS8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31cXFtcXF0oKSxdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmNtYWtlID0ge1xuXHQnY29tbWVudCc6IC8jLiovLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXFxcXFwiXXxcXFxcLikqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwkXFx7KD86W157fSRdfFxcJFxce1tee30kXSpcXH0pKlxcfS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXCRcXHt8XFx9Lyxcblx0XHRcdFx0XHQndmFyaWFibGUnOiAvXFx3Ky9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J3ZhcmlhYmxlJzogL1xcYig/OkNNQUtFX1xcdyt8XFx3K18oPzooPzpCSU5BUll8U09VUkNFKV9ESVJ8REVTQ1JJUFRJT058SE9NRVBBR0VfVVJMfFJPT1R8VkVSU0lPTig/Ol9NQUpPUnxfTUlOT1J8X1BBVENIfF9UV0VBSyk/KXwoPzpBTkRST0lEfEFQUExFfEJPUkxBTkR8QlVJTERfU0hBUkVEX0xJQlN8Q0FDSEV8Q1BBQ0tfKD86QUJTT0xVVEVfREVTVElOQVRJT05fRklMRVN8Q09NUE9ORU5UX0lOQ0xVREVfVE9QTEVWRUxfRElSRUNUT1JZfEVSUk9SX09OX0FCU09MVVRFX0lOU1RBTExfREVTVElOQVRJT058SU5DTFVERV9UT1BMRVZFTF9ESVJFQ1RPUll8SU5TVEFMTF9ERUZBVUxUX0RJUkVDVE9SWV9QRVJNSVNTSU9OU3xJTlNUQUxMX1NDUklQVHxQQUNLQUdJTkdfSU5TVEFMTF9QUkVGSVh8U0VUX0RFU1RESVJ8V0FSTl9PTl9BQlNPTFVURV9JTlNUQUxMX0RFU1RJTkFUSU9OKXxDVEVTVF8oPzpCSU5BUllfRElSRUNUT1JZfEJVSUxEX0NPTU1BTkR8QlVJTERfTkFNRXxCWlJfQ09NTUFORHxCWlJfVVBEQVRFX09QVElPTlN8Q0hBTkdFX0lEfENIRUNLT1VUX0NPTU1BTkR8Q09ORklHVVJBVElPTl9UWVBFfENPTkZJR1VSRV9DT01NQU5EfENPVkVSQUdFX0NPTU1BTkR8Q09WRVJBR0VfRVhUUkFfRkxBR1N8Q1VSTF9PUFRJT05TfENVU1RPTV8oPzpDT1ZFUkFHRV9FWENMVURFfEVSUk9SX0VYQ0VQVElPTnxFUlJPUl9NQVRDSHxFUlJPUl9QT1NUX0NPTlRFWFR8RVJST1JfUFJFX0NPTlRFWFR8TUFYSU1VTV9GQUlMRURfVEVTVF9PVVRQVVRfU0laRXxNQVhJTVVNX05VTUJFUl9PRl8oPzpFUlJPUlN8V0FSTklOR1MpfE1BWElNVU1fUEFTU0VEX1RFU1RfT1VUUFVUX1NJWkV8TUVNQ0hFQ0tfSUdOT1JFfFBPU1RfTUVNQ0hFQ0t8UE9TVF9URVNUfFBSRV9NRU1DSEVDS3xQUkVfVEVTVHxURVNUU19JR05PUkV8V0FSTklOR19FWENFUFRJT058V0FSTklOR19NQVRDSCl8Q1ZTX0NIRUNLT1VUfENWU19DT01NQU5EfENWU19VUERBVEVfT1BUSU9OU3xEUk9QX0xPQ0FUSU9OfERST1BfTUVUSE9EfERST1BfU0lURXxEUk9QX1NJVEVfQ0RBU0h8RFJPUF9TSVRFX1BBU1NXT1JEfERST1BfU0lURV9VU0VSfEVYVFJBX0NPVkVSQUdFX0dMT0J8R0lUX0NPTU1BTkR8R0lUX0lOSVRfU1VCTU9EVUxFU3xHSVRfVVBEQVRFX0NVU1RPTXxHSVRfVVBEQVRFX09QVElPTlN8SEdfQ09NTUFORHxIR19VUERBVEVfT1BUSU9OU3xMQUJFTFNfRk9SX1NVQlBST0pFQ1RTfE1FTU9SWUNIRUNLXyg/OkNPTU1BTkR8Q09NTUFORF9PUFRJT05TfFNBTklUSVpFUl9PUFRJT05TfFNVUFBSRVNTSU9OU19GSUxFfFRZUEUpfE5JR0hUTFlfU1RBUlRfVElNRXxQNF9DTElFTlR8UDRfQ09NTUFORHxQNF9PUFRJT05TfFA0X1VQREFURV9PUFRJT05TfFJVTl9DVVJSRU5UX1NDUklQVHxTQ1BfQ09NTUFORHxTSVRFfFNPVVJDRV9ESVJFQ1RPUll8U1VCTUlUX1VSTHxTVk5fQ09NTUFORHxTVk5fT1BUSU9OU3xTVk5fVVBEQVRFX09QVElPTlN8VEVTVF9MT0FEfFRFU1RfVElNRU9VVHxUUklHR0VSX1NJVEV8VVBEQVRFX0NPTU1BTkR8VVBEQVRFX09QVElPTlN8VVBEQVRFX1ZFUlNJT05fT05MWXxVU0VfTEFVTkNIRVJTKXxDWUdXSU58RU5WfEVYRUNVVEFCTEVfT1VUUFVUX1BBVEh8R0hTLU1VTFRJfElPU3xMSUJSQVJZX09VVFBVVF9QQVRIfE1JTkdXfE1TVkMoPzoxMHwxMXwxMnwxNHw2MHw3MHw3MXw4MHw5MHxfSURFfF9UT09MU0VUX1ZFUlNJT058X1ZFUlNJT04pP3xNU1lTfFBST0pFQ1RfTkFNRXxVTklYfFdJTjMyfFdJTkNFfFdJTkRPV1NfUEhPTkV8V0lORE9XU19TVE9SRXxYQ09ERSkpXFxiLyxcblx0J3Byb3BlcnR5JzogL1xcYig/OmN4eF9cXHcrfCg/OkFSQ0hJVkVfT1VUUFVUXyg/OkRJUkVDVE9SWXxOQU1FKXxDT01QSUxFX0RFRklOSVRJT05TfENPTVBJTEVfUERCX05BTUV8Q09NUElMRV9QREJfT1VUUFVUX0RJUkVDVE9SWXxFWENMVURFX0ZST01fREVGQVVMVF9CVUlMRHxJTVBPUlRFRF8oPzpJTVBMSUJ8TElCTkFNRXxMSU5LX0RFUEVOREVOVF9MSUJSQVJJRVN8TElOS19JTlRFUkZBQ0VfTEFOR1VBR0VTfExJTktfSU5URVJGQUNFX0xJQlJBUklFU3xMSU5LX0lOVEVSRkFDRV9NVUxUSVBMSUNJVFl8TE9DQVRJT058Tk9fU09OQU1FfE9CSkVDVFN8U09OQU1FKXxJTlRFUlBST0NFRFVSQUxfT1BUSU1JWkFUSU9OfExJQlJBUllfT1VUUFVUX0RJUkVDVE9SWXxMSUJSQVJZX09VVFBVVF9OQU1FfExJTktfRkxBR1N8TElOS19JTlRFUkZBQ0VfTElCUkFSSUVTfExJTktfSU5URVJGQUNFX01VTFRJUExJQ0lUWXxMT0NBVElPTnxNQVBfSU1QT1JURURfQ09ORklHfE9TWF9BUkNISVRFQ1RVUkVTfE9VVFBVVF9OQU1FfFBEQl9OQU1FfFBEQl9PVVRQVVRfRElSRUNUT1JZfFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWXxSVU5USU1FX09VVFBVVF9OQU1FfFNUQVRJQ19MSUJSQVJZX0ZMQUdTfFZTX0NTSEFSUHxWU19ET1RORVRfUkVGRVJFTkNFUFJPUHxWU19ET1RORVRfUkVGRVJFTkNFfFZTX0dMT0JBTF9TRUNUSU9OX1BPU1R8VlNfR0xPQkFMX1NFQ1RJT05fUFJFfFZTX0dMT0JBTHxYQ09ERV9BVFRSSUJVVEUpX1xcdyt8XFx3K18oPzpDTEFOR19USURZfENPTVBJTEVSX0xBVU5DSEVSfENQUENIRUNLfENQUExJTlR8SU5DTFVERV9XSEFUX1lPVV9VU0V8T1VUUFVUX05BTUV8UE9TVEZJWHxWSVNJQklMSVRZX1BSRVNFVCl8QUJTVFJBQ1R8QURESVRJT05BTF9NQUtFX0NMRUFOX0ZJTEVTfEFEVkFOQ0VEfEFMSUFTRURfVEFSR0VUfEFMTE9XX0RVUExJQ0FURV9DVVNUT01fVEFSR0VUU3xBTkRST0lEXyg/OkFOVF9BRERJVElPTkFMX09QVElPTlN8QVBJfEFQSV9NSU58QVJDSHxBU1NFVFNfRElSRUNUT1JJRVN8R1VJfEpBUl9ERVBFTkRFTkNJRVN8TkFUSVZFX0xJQl9ERVBFTkRFTkNJRVN8TkFUSVZFX0xJQl9ESVJFQ1RPUklFU3xQUk9DRVNTX01BWHxQUk9HVUFSRHxQUk9HVUFSRF9DT05GSUdfUEFUSHxTRUNVUkVfUFJPUFNfUEFUSHxTS0lQX0FOVF9TVEVQfFNUTF9UWVBFKXxBUkNISVZFX09VVFBVVF9ESVJFQ1RPUll8QVRUQUNIRURfRklMRVN8QVRUQUNIRURfRklMRVNfT05fRkFJTHxBVVRPR0VOXyg/OkJVSUxEX0RJUnxPUklHSU5fREVQRU5EU3xQQVJBTExFTHxTT1VSQ0VfR1JPVVB8VEFSR0VUU19GT0xERVJ8VEFSR0VUX0RFUEVORFMpfEFVVE9NT0N8QVVUT01PQ18oPzpDT01QSUxFUl9QUkVERUZJTkVTfERFUEVORF9GSUxURVJTfEVYRUNVVEFCTEV8TUFDUk9fTkFNRVN8TU9DX09QVElPTlN8U09VUkNFX0dST1VQfFRBUkdFVFNfRk9MREVSKXxBVVRPUkNDfEFVVE9SQ0NfRVhFQ1VUQUJMRXxBVVRPUkNDX09QVElPTlN8QVVUT1JDQ19TT1VSQ0VfR1JPVVB8QVVUT1VJQ3xBVVRPVUlDX0VYRUNVVEFCTEV8QVVUT1VJQ19PUFRJT05TfEFVVE9VSUNfU0VBUkNIX1BBVEhTfEJJTkFSWV9ESVJ8QlVJTERTWVNURU1fVEFSR0VUU3xCVUlMRF9SUEFUSHxCVUlMRF9SUEFUSF9VU0VfT1JJR0lOfEJVSUxEX1dJVEhfSU5TVEFMTF9OQU1FX0RJUnxCVUlMRF9XSVRIX0lOU1RBTExfUlBBVEh8QlVORExFfEJVTkRMRV9FWFRFTlNJT058Q0FDSEVfVkFSSUFCTEVTfENMRUFOX05PX0NVU1RPTXxDT01NT05fTEFOR1VBR0VfUlVOVElNRXxDT01QQVRJQkxFX0lOVEVSRkFDRV8oPzpCT09MfE5VTUJFUl9NQVh8TlVNQkVSX01JTnxTVFJJTkcpfENPTVBJTEVfKD86REVGSU5JVElPTlN8RkVBVFVSRVN8RkxBR1N8T1BUSU9OU3xQREJfTkFNRXxQREJfT1VUUFVUX0RJUkVDVE9SWSl8Q09TVHxDUEFDS19ERVNLVE9QX1NIT1JUQ1VUU3xDUEFDS19ORVZFUl9PVkVSV1JJVEV8Q1BBQ0tfUEVSTUFORU5UfENQQUNLX1NUQVJUVVBfU0hPUlRDVVRTfENQQUNLX1NUQVJUX01FTlVfU0hPUlRDVVRTfENQQUNLX1dJWF9BQ0x8Q1JPU1NDT01QSUxJTkdfRU1VTEFUT1J8Q1VEQV9FWFRFTlNJT05TfENVREFfUFRYX0NPTVBJTEFUSU9OfENVREFfUkVTT0xWRV9ERVZJQ0VfU1lNQk9MU3xDVURBX1NFUEFSQUJMRV9DT01QSUxBVElPTnxDVURBX1NUQU5EQVJEfENVREFfU1RBTkRBUkRfUkVRVUlSRUR8Q1hYX0VYVEVOU0lPTlN8Q1hYX1NUQU5EQVJEfENYWF9TVEFOREFSRF9SRVFVSVJFRHxDX0VYVEVOU0lPTlN8Q19TVEFOREFSRHxDX1NUQU5EQVJEX1JFUVVJUkVEfERFQlVHX0NPTkZJR1VSQVRJT05TfERFRklORV9TWU1CT0x8REVGSU5JVElPTlN8REVQRU5EU3xERVBMT1lNRU5UX0FERElUSU9OQUxfRklMRVN8REVQTE9ZTUVOVF9SRU1PVEVfRElSRUNUT1JZfERJU0FCTEVEfERJU0FCTEVEX0ZFQVRVUkVTfEVDTElQU0VfRVhUUkFfQ1BST0pFQ1RfQ09OVEVOVFN8RUNMSVBTRV9FWFRSQV9OQVRVUkVTfEVOQUJMRURfRkVBVFVSRVN8RU5BQkxFRF9MQU5HVUFHRVN8RU5BQkxFX0VYUE9SVFN8RU5WSVJPTk1FTlR8RVhDTFVERV9GUk9NX0FMTHxFWENMVURFX0ZST01fREVGQVVMVF9CVUlMRHxFWFBPUlRfTkFNRXxFWFBPUlRfUFJPUEVSVElFU3xFWFRFUk5BTF9PQkpFQ1R8RWNob1N0cmluZ3xGQUlMX1JFR1VMQVJfRVhQUkVTU0lPTnxGSU5EX0xJQlJBUllfVVNFX0xJQjMyX1BBVEhTfEZJTkRfTElCUkFSWV9VU0VfTElCNjRfUEFUSFN8RklORF9MSUJSQVJZX1VTRV9MSUJYMzJfUEFUSFN8RklORF9MSUJSQVJZX1VTRV9PUEVOQlNEX1ZFUlNJT05JTkd8RklYVFVSRVNfQ0xFQU5VUHxGSVhUVVJFU19SRVFVSVJFRHxGSVhUVVJFU19TRVRVUHxGT0xERVJ8RlJBTUVXT1JLfEZvcnRyYW5fRk9STUFUfEZvcnRyYW5fTU9EVUxFX0RJUkVDVE9SWXxHRU5FUkFURUR8R0VORVJBVE9SX0ZJTEVfTkFNRXxHRU5FUkFUT1JfSVNfTVVMVElfQ09ORklHfEdIU19JTlRFR1JJVFlfQVBQfEdIU19OT19TT1VSQ0VfR1JPVVBfRklMRXxHTE9CQUxfREVQRU5EU19ERUJVR19NT0RFfEdMT0JBTF9ERVBFTkRTX05PX0NZQ0xFU3xHTlV0b01TfEhBU19DWFh8SEVBREVSX0ZJTEVfT05MWXxIRUxQU1RSSU5HfElNUExJQ0lUX0RFUEVORFNfSU5DTFVERV9UUkFOU0ZPUk18SU1QT1JURUR8SU1QT1JURURfKD86Q09NTU9OX0xBTkdVQUdFX1JVTlRJTUV8Q09ORklHVVJBVElPTlN8R0xPQkFMfElNUExJQnxMSUJOQU1FfExJTktfREVQRU5ERU5UX0xJQlJBUklFU3xMSU5LX0lOVEVSRkFDRV8oPzpMQU5HVUFHRVN8TElCUkFSSUVTfE1VTFRJUExJQ0lUWSl8TE9DQVRJT058Tk9fU09OQU1FfE9CSkVDVFN8U09OQU1FKXxJTVBPUlRfUFJFRklYfElNUE9SVF9TVUZGSVh8SU5DTFVERV9ESVJFQ1RPUklFU3xJTkNMVURFX1JFR1VMQVJfRVhQUkVTU0lPTnxJTlNUQUxMX05BTUVfRElSfElOU1RBTExfUlBBVEh8SU5TVEFMTF9SUEFUSF9VU0VfTElOS19QQVRIfElOVEVSRkFDRV8oPzpBVVRPVUlDX09QVElPTlN8Q09NUElMRV9ERUZJTklUSU9OU3xDT01QSUxFX0ZFQVRVUkVTfENPTVBJTEVfT1BUSU9OU3xJTkNMVURFX0RJUkVDVE9SSUVTfExJTktfREVQRU5EU3xMSU5LX0RJUkVDVE9SSUVTfExJTktfTElCUkFSSUVTfExJTktfT1BUSU9OU3xQT1NJVElPTl9JTkRFUEVOREVOVF9DT0RFfFNPVVJDRVN8U1lTVEVNX0lOQ0xVREVfRElSRUNUT1JJRVMpfElOVEVSUFJPQ0VEVVJBTF9PUFRJTUlaQVRJT058SU5fVFJZX0NPTVBJTEV8SU9TX0lOU1RBTExfQ09NQklORUR8Sk9CX1BPT0xTfEpPQl9QT09MX0NPTVBJTEV8Sk9CX1BPT0xfTElOS3xLRUVQX0VYVEVOU0lPTnxMQUJFTFN8TEFOR1VBR0V8TElCUkFSWV9PVVRQVVRfRElSRUNUT1JZfExJTktFUl9MQU5HVUFHRXxMSU5LXyg/OkRFUEVORFN8REVQRU5EU19OT19TSEFSRUR8RElSRUNUT1JJRVN8RkxBR1N8SU5URVJGQUNFX0xJQlJBUklFU3xJTlRFUkZBQ0VfTVVMVElQTElDSVRZfExJQlJBUklFU3xPUFRJT05TfFNFQVJDSF9FTkRfU1RBVElDfFNFQVJDSF9TVEFSVF9TVEFUSUN8V0hBVF9ZT1VfVVNFKXxMSVNURklMRV9TVEFDS3xMT0NBVElPTnxNQUNPU1hfQlVORExFfE1BQ09TWF9CVU5ETEVfSU5GT19QTElTVHxNQUNPU1hfRlJBTUVXT1JLX0lORk9fUExJU1R8TUFDT1NYX1BBQ0tBR0VfTE9DQVRJT058TUFDT1NYX1JQQVRIfE1BQ1JPU3xNQU5VQUxMWV9BRERFRF9ERVBFTkRFTkNJRVN8TUVBU1VSRU1FTlR8TU9ESUZJRUR8TkFNRXxOT19TT05BTUV8Tk9fU1lTVEVNX0ZST01fSU1QT1JURUR8T0JKRUNUX0RFUEVORFN8T0JKRUNUX09VVFBVVFN8T1NYX0FSQ0hJVEVDVFVSRVN8T1VUUFVUX05BTUV8UEFDS0FHRVNfRk9VTkR8UEFDS0FHRVNfTk9UX0ZPVU5EfFBBUkVOVF9ESVJFQ1RPUll8UEFTU19SRUdVTEFSX0VYUFJFU1NJT058UERCX05BTUV8UERCX09VVFBVVF9ESVJFQ1RPUll8UE9TSVRJT05fSU5ERVBFTkRFTlRfQ09ERXxQT1NUX0lOU1RBTExfU0NSSVBUfFBSRURFRklORURfVEFSR0VUU19GT0xERVJ8UFJFRklYfFBSRV9JTlNUQUxMX1NDUklQVHxQUklWQVRFX0hFQURFUnxQUk9DRVNTT1JTfFBST0NFU1NPUl9BRkZJTklUWXxQUk9KRUNUX0xBQkVMfFBVQkxJQ19IRUFERVJ8UkVQT1JUX1VOREVGSU5FRF9QUk9QRVJUSUVTfFJFUVVJUkVEX0ZJTEVTfFJFU09VUkNFfFJFU09VUkNFX0xPQ0t8UlVMRV9MQVVOQ0hfQ09NUElMRXxSVUxFX0xBVU5DSF9DVVNUT018UlVMRV9MQVVOQ0hfTElOS3xSVUxFX01FU1NBR0VTfFJVTlRJTUVfT1VUUFVUX0RJUkVDVE9SWXxSVU5fU0VSSUFMfFNLSVBfQVVUT0dFTnxTS0lQX0FVVE9NT0N8U0tJUF9BVVRPUkNDfFNLSVBfQVVUT1VJQ3xTS0lQX0JVSUxEX1JQQVRIfFNLSVBfUkVUVVJOX0NPREV8U09VUkNFU3xTT1VSQ0VfRElSfFNPVkVSU0lPTnxTVEFUSUNfTElCUkFSWV9GTEFHU3xTVEFUSUNfTElCUkFSWV9PUFRJT05TfFNUUklOR1N8U1VCRElSRUNUT1JJRVN8U1VGRklYfFNZTUJPTElDfFRBUkdFVF9BUkNISVZFU19NQVlfQkVfU0hBUkVEX0xJQlN8VEFSR0VUX01FU1NBR0VTfFRBUkdFVF9TVVBQT1JUU19TSEFSRURfTElCU3xURVNUU3xURVNUX0lOQ0xVREVfRklMRXxURVNUX0lOQ0xVREVfRklMRVN8VElNRU9VVHxUSU1FT1VUX0FGVEVSX01BVENIfFRZUEV8VVNFX0ZPTERFUlN8VkFMVUV8VkFSSUFCTEVTfFZFUlNJT058VklTSUJJTElUWV9JTkxJTkVTX0hJRERFTnxWU18oPzpDT05GSUdVUkFUSU9OX1RZUEV8Q09QWV9UT19PVVRfRElSfERFQlVHR0VSXyg/OkNPTU1BTkR8Q09NTUFORF9BUkdVTUVOVFN8RU5WSVJPTk1FTlR8V09SS0lOR19ESVJFQ1RPUlkpfERFUExPWU1FTlRfQ09OVEVOVHxERVBMT1lNRU5UX0xPQ0FUSU9OfERPVE5FVF9SRUZFUkVOQ0VTfERPVE5FVF9SRUZFUkVOQ0VTX0NPUFlfTE9DQUx8SU5DTFVERV9JTl9WU0lYfElPVF9TVEFSVFVQX1RBU0t8S0VZV09SRHxSRVNPVVJDRV9HRU5FUkFUT1J8U0NDX0FVWFBBVEh8U0NDX0xPQ0FMUEFUSHxTQ0NfUFJPSkVDVE5BTUV8U0NDX1BST1ZJREVSfFNES19SRUZFUkVOQ0VTfFNIQURFUl8oPzpESVNBQkxFX09QVElNSVpBVElPTlN8RU5BQkxFX0RFQlVHfEVOVFJZUE9JTlR8RkxBR1N8TU9ERUx8T0JKRUNUX0ZJTEVfTkFNRXxPVVRQVVRfSEVBREVSX0ZJTEV8VFlQRXxWQVJJQUJMRV9OQU1FKXxTVEFSVFVQX1BST0pFQ1R8VE9PTF9PVkVSUklERXxVU0VSX1BST1BTfFdJTlJUX0NPTVBPTkVOVHxXSU5SVF9FWFRFTlNJT05TfFdJTlJUX1JFRkVSRU5DRVN8WEFNTF9UWVBFKXxXSUxMX0ZBSUx8V0lOMzJfRVhFQ1VUQUJMRXxXSU5ET1dTX0VYUE9SVF9BTExfU1lNQk9MU3xXT1JLSU5HX0RJUkVDVE9SWXxXUkFQX0VYQ0xVREV8WENPREVfKD86RU1JVF9FRkZFQ1RJVkVfUExBVEZPUk1fTkFNRXxFWFBMSUNJVF9GSUxFX1RZUEV8RklMRV9BVFRSSUJVVEVTfExBU1RfS05PV05fRklMRV9UWVBFfFBST0RVQ1RfVFlQRXxTQ0hFTUVfKD86QUREUkVTU19TQU5JVElaRVJ8QUREUkVTU19TQU5JVElaRVJfVVNFX0FGVEVSX1JFVFVSTnxBUkdVTUVOVFN8RElTQUJMRV9NQUlOX1RIUkVBRF9DSEVDS0VSfERZTkFNSUNfTElCUkFSWV9MT0FEU3xEWU5BTUlDX0xJTktFUl9BUElfVVNBR0V8RU5WSVJPTk1FTlR8RVhFQ1VUQUJMRXxHVUFSRF9NQUxMT0N8TUFJTl9USFJFQURfQ0hFQ0tFUl9TVE9QfE1BTExPQ19HVUFSRF9FREdFU3xNQUxMT0NfU0NSSUJCTEV8TUFMTE9DX1NUQUNLfFRIUkVBRF9TQU5JVElaRVIoPzpfU1RPUCk/fFVOREVGSU5FRF9CRUhBVklPVVJfU0FOSVRJWkVSKD86X1NUT1ApP3xaT01CSUVfT0JKRUNUUykpfFhDVEVTVClcXGIvLFxuXHQna2V5d29yZCc6IC9cXGIoPzphZGRfY29tcGlsZV9kZWZpbml0aW9uc3xhZGRfY29tcGlsZV9vcHRpb25zfGFkZF9jdXN0b21fY29tbWFuZHxhZGRfY3VzdG9tX3RhcmdldHxhZGRfZGVmaW5pdGlvbnN8YWRkX2RlcGVuZGVuY2llc3xhZGRfZXhlY3V0YWJsZXxhZGRfbGlicmFyeXxhZGRfbGlua19vcHRpb25zfGFkZF9zdWJkaXJlY3Rvcnl8YWRkX3Rlc3R8YXV4X3NvdXJjZV9kaXJlY3Rvcnl8YnJlYWt8YnVpbGRfY29tbWFuZHxidWlsZF9uYW1lfGNtYWtlX2hvc3Rfc3lzdGVtX2luZm9ybWF0aW9ufGNtYWtlX21pbmltdW1fcmVxdWlyZWR8Y21ha2VfcGFyc2VfYXJndW1lbnRzfGNtYWtlX3BvbGljeXxjb25maWd1cmVfZmlsZXxjb250aW51ZXxjcmVhdGVfdGVzdF9zb3VyY2VsaXN0fGN0ZXN0X2J1aWxkfGN0ZXN0X2NvbmZpZ3VyZXxjdGVzdF9jb3ZlcmFnZXxjdGVzdF9lbXB0eV9iaW5hcnlfZGlyZWN0b3J5fGN0ZXN0X21lbWNoZWNrfGN0ZXN0X3JlYWRfY3VzdG9tX2ZpbGVzfGN0ZXN0X3J1bl9zY3JpcHR8Y3Rlc3Rfc2xlZXB8Y3Rlc3Rfc3RhcnR8Y3Rlc3Rfc3VibWl0fGN0ZXN0X3Rlc3R8Y3Rlc3RfdXBkYXRlfGN0ZXN0X3VwbG9hZHxkZWZpbmVfcHJvcGVydHl8ZWxzZXxlbHNlaWZ8ZW5hYmxlX2xhbmd1YWdlfGVuYWJsZV90ZXN0aW5nfGVuZGZvcmVhY2h8ZW5kZnVuY3Rpb258ZW5kaWZ8ZW5kbWFjcm98ZW5kd2hpbGV8ZXhlY19wcm9ncmFtfGV4ZWN1dGVfcHJvY2Vzc3xleHBvcnR8ZXhwb3J0X2xpYnJhcnlfZGVwZW5kZW5jaWVzfGZpbGV8ZmluZF9maWxlfGZpbmRfbGlicmFyeXxmaW5kX3BhY2thZ2V8ZmluZF9wYXRofGZpbmRfcHJvZ3JhbXxmbHRrX3dyYXBfdWl8Zm9yZWFjaHxmdW5jdGlvbnxnZXRfY21ha2VfcHJvcGVydHl8Z2V0X2RpcmVjdG9yeV9wcm9wZXJ0eXxnZXRfZmlsZW5hbWVfY29tcG9uZW50fGdldF9wcm9wZXJ0eXxnZXRfc291cmNlX2ZpbGVfcHJvcGVydHl8Z2V0X3RhcmdldF9wcm9wZXJ0eXxnZXRfdGVzdF9wcm9wZXJ0eXxpZnxpbmNsdWRlfGluY2x1ZGVfZGlyZWN0b3JpZXN8aW5jbHVkZV9leHRlcm5hbF9tc3Byb2plY3R8aW5jbHVkZV9ndWFyZHxpbmNsdWRlX3JlZ3VsYXJfZXhwcmVzc2lvbnxpbnN0YWxsfGluc3RhbGxfZmlsZXN8aW5zdGFsbF9wcm9ncmFtc3xpbnN0YWxsX3RhcmdldHN8bGlua19kaXJlY3Rvcmllc3xsaW5rX2xpYnJhcmllc3xsaXN0fGxvYWRfY2FjaGV8bG9hZF9jb21tYW5kfG1hY3JvfG1ha2VfZGlyZWN0b3J5fG1hcmtfYXNfYWR2YW5jZWR8bWF0aHxtZXNzYWdlfG9wdGlvbnxvdXRwdXRfcmVxdWlyZWRfZmlsZXN8cHJvamVjdHxxdF93cmFwX2NwcHxxdF93cmFwX3VpfHJlbW92ZXxyZW1vdmVfZGVmaW5pdGlvbnN8cmV0dXJufHNlcGFyYXRlX2FyZ3VtZW50c3xzZXR8c2V0X2RpcmVjdG9yeV9wcm9wZXJ0aWVzfHNldF9wcm9wZXJ0eXxzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXN8c2V0X3RhcmdldF9wcm9wZXJ0aWVzfHNldF90ZXN0c19wcm9wZXJ0aWVzfHNpdGVfbmFtZXxzb3VyY2VfZ3JvdXB8c3RyaW5nfHN1YmRpcl9kZXBlbmRzfHN1YmRpcnN8dGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnN8dGFyZ2V0X2NvbXBpbGVfZmVhdHVyZXN8dGFyZ2V0X2NvbXBpbGVfb3B0aW9uc3x0YXJnZXRfaW5jbHVkZV9kaXJlY3Rvcmllc3x0YXJnZXRfbGlua19kaXJlY3Rvcmllc3x0YXJnZXRfbGlua19saWJyYXJpZXN8dGFyZ2V0X2xpbmtfb3B0aW9uc3x0YXJnZXRfc291cmNlc3x0cnlfY29tcGlsZXx0cnlfcnVufHVuc2V0fHVzZV9tYW5nbGVkX21lc2F8dXRpbGl0eV9zb3VyY2V8dmFyaWFibGVfcmVxdWlyZXN8dmFyaWFibGVfd2F0Y2h8d2hpbGV8d3JpdGVfZmlsZSkoPz1cXHMqXFwoKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OkZBTFNFfE9GRnxPTnxUUlVFKVxcYi8sXG5cdCduYW1lc3BhY2UnOiAvXFxiKD86SU5URVJGQUNFfFBSSVZBVEV8UFJPUEVSVElFU3xQVUJMSUN8U0hBUkVEfFNUQVRJQ3xUQVJHRVRfT0JKRUNUUylcXGIvLFxuXHQnb3BlcmF0b3InOiAvXFxiKD86QU5EfERFRklORUR8RVFVQUx8R1JFQVRFUnxMRVNTfE1BVENIRVN8Tk9UfE9SfFNUUkVRVUFMfFNUUkdSRUFURVJ8U1RSTEVTU3xWRVJTSU9OX0VRVUFMfFZFUlNJT05fR1JFQVRFUnxWRVJTSU9OX0xFU1MpXFxiLyxcblx0J2luc2VydGVkJzoge1xuXHRcdHBhdHRlcm46IC9cXGJcXHcrOjpcXHcrXFxiLyxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH0sXG5cdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCspKlxcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKClcXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1soKT59XXxcXCRbPHtdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmNvYm9sID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwqPi4qfCheWyBcXHRdKilcXCouKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1t4emduXT8oPzpcIig/OlteXFxyXFxuXCJdfFwiXCIpKlwiKD8hXCIpfCcoPzpbXlxcclxcbiddfCcnKSonKD8hJykpL2ksXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2xldmVsJzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSopXFxkK1xcYi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbnRsci9ncmFtbWFycy12NC9ibG9iLzQyZWRkNWI2ODdkMTgzYjVmYTY3OWU4NThhODIyOTdiZDI3MTQxZTcvY29ib2w4NS9Db2JvbDg1Lmc0I0wxMDE1XG5cdFx0cGF0dGVybjogLyhcXGJwaWMoPzp0dXJlKT9cXHMrKSg/Oig/OlstXFx3JC8sOiorPD5dfFxcLig/IVxcc3wkKSkoPzpcXChcXGQrXFwpKT8pKy9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnbnVtYmVyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcKClcXGQrLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCldL1xuXHRcdH1cblx0fSxcblxuXHQna2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHctXSkoPzpBQk9SVHxBQ0NFUFR8QUNDRVNTfEFERHxBRERSRVNTfEFEVkFOQ0lOR3xBRlRFUnxBTElHTkVEfEFMTHxBTFBIQUJFVHxBTFBIQUJFVElDfEFMUEhBQkVUSUMtTE9XRVJ8QUxQSEFCRVRJQy1VUFBFUnxBTFBIQU5VTUVSSUN8QUxQSEFOVU1FUklDLUVESVRFRHxBTFNPfEFMVEVSfEFMVEVSTkFURXxBTll8QVJFfEFSRUF8QVJFQVN8QVN8QVNDRU5ESU5HfEFTQ0lJfEFTU0lHTnxBU1NPQ0lBVEVELURBVEF8QVNTT0NJQVRFRC1EQVRBLUxFTkdUSHxBVHxBVFRSSUJVVEV8QVVUSE9SfEFVVE98QVVUTy1TS0lQfEJBQ0tHUk9VTkQtQ09MT1J8QkFDS0dST1VORC1DT0xPVVJ8QkFTSVN8QkVFUHxCRUZPUkV8QkVHSU5OSU5HfEJFTEx8QklOQVJZfEJJVHxCTEFOS3xCTElOS3xCTE9DS3xCT1RUT018Qk9VTkRTfEJZfEJZRlVOQ1RJT058QllUSVRMRXxDQUxMfENBTkNFTHxDQVBBQkxFfENDU1ZFUlNJT058Q0R8Q0Z8Q0h8Q0hBSU5JTkd8Q0hBTkdFRHxDSEFOTkVMfENIQVJBQ1RFUnxDSEFSQUNURVJTfENMQVNTfENMQVNTLUlEfENMT0NLLVVOSVRTfENMT1NFfENMT1NFLURJU1BPU0lUSU9OfENPQk9MfENPREV8Q09ERS1TRVR8Q09MfENPTExBVElOR3xDT0xVTU58Q09NLVJFR3xDT01NQXxDT01NSVRNRU5UfENPTU1PTnxDT01NVU5JQ0FUSU9OfENPTVB8Q09NUC0xfENPTVAtMnxDT01QLTN8Q09NUC00fENPTVAtNXxDT01QVVRBVElPTkFMfENPTVBVVEFUSU9OQUwtMXxDT01QVVRBVElPTkFMLTJ8Q09NUFVUQVRJT05BTC0zfENPTVBVVEFUSU9OQUwtNHxDT01QVVRBVElPTkFMLTV8Q09NUFVURXxDT05GSUdVUkFUSU9OfENPTlRBSU5TfENPTlRFTlR8Q09OVElOVUV8Q09OVFJPTHxDT05UUk9MLVBPSU5UfENPTlRST0xTfENPTlZFTlRJT058Q09OVkVSVElOR3xDT1BZfENPUlJ8Q09SUkVTUE9ORElOR3xDT1VOVHxDUlVOQ0h8Q1VSUkVOQ1l8Q1VSU09SfERBVEF8REFUQS1CQVNFfERBVEV8REFURS1DT01QSUxFRHxEQVRFLVdSSVRURU58REFZfERBWS1PRi1XRUVLfERCQ1N8REV8REVCVUctQ09OVEVOVFN8REVCVUctSVRFTXxERUJVRy1MSU5FfERFQlVHLU5BTUV8REVCVUctU1VCLTF8REVCVUctU1VCLTJ8REVCVUctU1VCLTN8REVCVUdHSU5HfERFQ0lNQUwtUE9JTlR8REVDTEFSQVRJVkVTfERFRkFVTFR8REVGQVVMVC1ESVNQTEFZfERFRklOSVRJT058REVMRVRFfERFTElNSVRFRHxERUxJTUlURVJ8REVQRU5ESU5HfERFU0NFTkRJTkd8REVTVElOQVRJT058REVUQUlMfERGSFJFU1B8REZIVkFMVUV8RElTQUJMRXxESVNLfERJU1BMQVl8RElTUExBWS0xfERJVklERXxESVZJU0lPTnxET05UQ0FSRXxET1VCTEV8RE9XTnxEVVBMSUNBVEVTfERZTkFNSUN8RUJDRElDfEVHQ1N8RUdJfEVMU0V8RU1JfEVNUFRZLUNIRUNLfEVOQUJMRXxFTkR8RU5ELUFDQ0VQVHxFTkQtQUREfEVORC1DQUxMfEVORC1DT01QVVRFfEVORC1ERUxFVEV8RU5ELURJVklERXxFTkQtRVZBTFVBVEV8RU5ELUlGfEVORC1NVUxUSVBMWXxFTkQtT0YtUEFHRXxFTkQtUEVSRk9STXxFTkQtUkVBRHxFTkQtUkVDRUlWRXxFTkQtUkVUVVJOfEVORC1SRVdSSVRFfEVORC1TRUFSQ0h8RU5ELVNUQVJUfEVORC1TVFJJTkd8RU5ELVNVQlRSQUNUfEVORC1VTlNUUklOR3xFTkQtV1JJVEV8RU5ESU5HfEVOVEVSfEVOVFJZfEVOVFJZLVBST0NFRFVSRXxFTlZJUk9OTUVOVHxFT0x8RU9QfEVPU3xFUkFTRXxFUlJPUnxFU0NBUEV8RVNJfEVWQUxVQVRFfEVWRU5UfEVWRVJZfEVYQ0VQVElPTnxFWENMVVNJVkV8RVhISUJJVHxFWElUfEVYUE9SVHxFWFRFTkR8RVhURU5ERUR8RVhURVJOQUx8RkR8RklMRXxGSUxFLUNPTlRST0x8RklMTEVSfEZJTkFMfEZJUlNUfEZPT1RJTkd8Rk9SfEZPUkVHUk9VTkQtQ09MT1J8Rk9SRUdST1VORC1DT0xPVVJ8RlJPTXxGVUxMfEZVTkNUSU9OfEZVTkNUSU9OLVBPSU5URVJ8RlVOQ1RJT05OQU1FfEdFTkVSQVRFfEdJVklOR3xHTE9CQUx8R098R09CQUNLfEdSSUR8R1JPVVB8SEVBRElOR3xISUdILVZBTFVFfEhJR0gtVkFMVUVTfEhJR0hMSUdIVHxJLU98SS1PLUNPTlRST0x8SUR8SURFTlRJRklDQVRJT058SUZ8SU1QTElDSVR8SU1QT1JUfElOfElOREVYfElOREVYRUR8SU5ESUNBVEV8SU5JVElBTHxJTklUSUFMSVpFfElOSVRJQVRFfElOUFVUfElOUFVULU9VVFBVVHxJTlNQRUNUfElOU1RBTExBVElPTnxJTlRFR0VSfElOVE98SU5WQUxJRHxJTlZPS0V8SVN8SlVTVHxKVVNUSUZJRUR8S0FOSkl8S0VQVHxLRVl8S0VZQk9BUkR8TEFCRUx8TEFOR1VBR0V8TEFTVHxMQnxMRHxMRUFESU5HfExFRlR8TEVGVExJTkV8TEVOR1RIfExFTkdUSC1DSEVDS3xMSUJBQ0NFU1N8TElCUEFSQU1FVEVSfExJQlJBUll8TElNSVR8TElNSVRTfExJTkFHRXxMSU5BR0UtQ09VTlRFUnxMSU5FfExJTkUtQ09VTlRFUnxMSU5FU3xMSU5LQUdFfExJU1R8TE9DQUx8TE9DQUwtU1RPUkFHRXxMT0NLfExPTkctREFURXxMT05HLVRJTUV8TE9XLVZBTFVFfExPVy1WQUxVRVN8TE9XRVJ8TE9XTElHSFR8TUVNT1JZfE1FUkdFfE1FU1NBR0V8TU1ERFlZWVl8TU9ERXxNT0RVTEVTfE1PUkUtTEFCRUxTfE1PVkV8TVVMVElQTEV8TVVMVElQTFl8TkFNRUR8TkFUSU9OQUx8TkFUSU9OQUwtRURJVEVEfE5BVElWRXxORUdBVElWRXxORVRXT1JLfE5FWFR8Tk98Tk8tRUNIT3xOVUxMfE5VTExTfE5VTUJFUnxOVU1FUklDfE5VTUVSSUMtREFURXxOVU1FUklDLUVESVRFRHxOVU1FUklDLVRJTUV8T0JKRUNULUNPTVBVVEVSfE9DQ1VSU3xPRFR8T0Z8T0ZGfE9NSVRURUR8T058T1BFTnxPUFRJT05BTHxPUkRFUnxPUkRFUkxZfE9SR0FOSVpBVElPTnxPVEhFUnxPVVRQVVR8T1ZFUkZMT1d8T1ZFUkxJTkV8T1dOfFBBQ0tFRC1ERUNJTUFMfFBBRERJTkd8UEFHRXxQQUdFLUNPVU5URVJ8UEFTU1dPUkR8UEVSRk9STXxQRnxQSHxQSUN8UElDVFVSRXxQTFVTfFBPSU5URVJ8UE9SVHxQT1NJVElPTnxQT1NJVElWRXxQUklOVEVSfFBSSU5USU5HfFBSSVZBVEV8UFJPQ0VEVVJFfFBST0NFRFVSRS1QT0lOVEVSfFBST0NFRFVSRVN8UFJPQ0VFRHxQUk9DRVNTfFBST0dSQU18UFJPR1JBTS1JRHxQUk9HUkFNLUxJQlJBUll8UFJPTVBUfFBVUkdFfFFVRVVFfFFVT1RFfFFVT1RFU3xSQU5ET018UkR8UkVBRHxSRUFERVJ8UkVBTHxSRUNFSVZFfFJFQ0VJVkVEfFJFQ09SRHxSRUNPUkRJTkd8UkVDT1JEU3xSRUNVUlNJVkV8UkVERUZJTkVTfFJFRUx8UkVGfFJFRkVSRU5DRXxSRUZFUkVOQ0VTfFJFTEFUSVZFfFJFTEVBU0V8UkVNQUlOREVSfFJFTUFSS1N8UkVNT1RFfFJFTU9WQUx8UkVNT1ZFfFJFTkFNRVN8UkVQTEFDRXxSRVBMQUNJTkd8UkVQT1JUfFJFUE9SVElOR3xSRVBPUlRTfFJFUVVJUkVEfFJFUlVOfFJFU0VSVkV8UkVTRVR8UkVUVVJOfFJFVFVSTi1DT0RFfFJFVFVSTklOR3xSRVZFUlNFLVZJREVPfFJFVkVSU0VEfFJFV0lORHxSRVdSSVRFfFJGfFJIfFJJR0hUfFJPVU5ERUR8UlVOfFNBTUV8U0FWRXxTQ1JFRU58U0R8U0VBUkNIfFNFQ1RJT058U0VDVVJFfFNFQ1VSSVRZfFNFR01FTlR8U0VHTUVOVC1MSU1JVHxTRUxFQ1R8U0VORHxTRU5URU5DRXxTRVBBUkFURXxTRVFVRU5DRXxTRVFVRU5USUFMfFNFVHxTSEFSRUR8U0hBUkVEQllBTEx8U0hBUkVEQllSVU5VTklUfFNIQVJJTkd8U0hJRlQtSU58U0hJRlQtT1VUfFNIT1JULURBVEV8U0lHTnxTSVpFfFNPUlR8U09SVC1DT05UUk9MfFNPUlQtQ09SRS1TSVpFfFNPUlQtRklMRS1TSVpFfFNPUlQtTUVSR0V8U09SVC1NRVNTQUdFfFNPUlQtTU9ERS1TSVpFfFNPUlQtUkVUVVJOfFNPVVJDRXxTT1VSQ0UtQ09NUFVURVJ8U1BBQ0V8U1BBQ0VTfFNQRUNJQUwtTkFNRVN8U1RBTkRBUkR8U1RBTkRBUkQtMXxTVEFOREFSRC0yfFNUQVJUfFNUQVRVU3xTVE9QfFNUUklOR3xTVUItUVVFVUUtMXxTVUItUVVFVUUtMnxTVUItUVVFVUUtM3xTVUJUUkFDVHxTVU18U1VQUFJFU1N8U1lNQk9MfFNZTUJPTElDfFNZTkN8U1lOQ0hST05JWkVEfFRBQkxFfFRBTExZfFRBTExZSU5HfFRBUEV8VEFTS3xURVJNSU5BTHxURVJNSU5BVEV8VEVTVHxURVhUfFRIRU58VEhSRUFEfFRIUkVBRC1MT0NBTHxUSFJPVUdIfFRIUlV8VElNRXxUSU1FUnxUSU1FU3xUSVRMRXxUT3xUT0RBWVMtREFURXxUT0RBWVMtTkFNRXxUT1B8VFJBSUxJTkd8VFJVTkNBVEVEfFRZUEV8VFlQRURFRnxVTkRFUkxJTkV8VU5JVHxVTlNUUklOR3xVTlRJTHxVUHxVUE9OfFVTQUdFfFVTRXxVU0lOR3xWQUxVRXxWQUxVRVN8VkFSWUlOR3xWSVJUVUFMfFdBSVR8V0hFTnxXSEVOLUNPTVBJTEVEfFdJVEh8V09SRFN8V09SS0lORy1TVE9SQUdFfFdSSVRFfFlFQVJ8WVlZWURERHxZWVlZTU1ERHxaRVJPLUZJTEx8WkVST0VTfFpFUk9TKSg/IVtcXHctXSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cblx0J2Jvb2xlYW4nOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3LV0pKD86ZmFsc2V8dHJ1ZSkoPyFbXFx3LV0pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdy1dKSg/OlsrLV0/KD86KD86XFxkKyg/OlsuLF1cXGQrKT98Wy4sXVxcZCspKD86ZVsrLV0/XFxkKyk/fHplcm8pKSg/IVtcXHctXSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdvcGVyYXRvcic6IFtcblx0XHQvPD58Wzw+XT0/fFs9KyovJl0vLFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy1dKSg/Oi18YW5kfGVxdWFsfGdyZWF0ZXJ8bGVzc3xub3R8b3J8dGhhbikoPyFbXFx3LV0pL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQncHVuY3R1YXRpb24nOiAvWy46LCgpXS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvLyBJZ25vcmUgY29tbWVudHMgc3RhcnRpbmcgd2l0aCB7IHRvIHByaXZpbGVnZSBzdHJpbmcgaW50ZXJwb2xhdGlvbiBoaWdobGlnaHRpbmdcblx0dmFyIGNvbW1lbnQgPSAvIyg/IVxceykuKy87XG5cdHZhciBpbnRlcnBvbGF0aW9uID0ge1xuXHRcdHBhdHRlcm46IC8jXFx7W159XStcXH0vLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmNvZmZlZXNjcmlwdCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2phdmFzY3JpcHQnLCB7XG5cdFx0J2NvbW1lbnQnOiBjb21tZW50LFxuXHRcdCdzdHJpbmcnOiBbXG5cblx0XHRcdC8vIFN0cmluZ3MgYXJlIG11bHRpbGluZVxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvJyg/OlxcXFxbXFxzXFxTXXxbXlxcXFwnXSkqJy8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblxuXHRcdFx0e1xuXHRcdFx0XHQvLyBTdHJpbmdzIGFyZSBtdWx0aWxpbmVcblx0XHRcdFx0cGF0dGVybjogL1wiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCIvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogaW50ZXJwb2xhdGlvblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzphbmR8YnJlYWt8Ynl8Y2F0Y2h8Y2xhc3N8Y29udGludWV8ZGVidWdnZXJ8ZGVsZXRlfGRvfGVhY2h8ZWxzZXxleHRlbmR8ZXh0ZW5kc3xmYWxzZXxmaW5hbGx5fGZvcnxpZnxpbnxpbnN0YW5jZW9mfGlzfGlzbnR8bGV0fGxvb3B8bmFtZXNwYWNlfG5ld3xub3xub3R8bnVsbHxvZnxvZmZ8b258b3J8b3dufHJldHVybnxzdXBlcnxzd2l0Y2h8dGhlbnx0aGlzfHRocm93fHRydWV8dHJ5fHR5cGVvZnx1bmRlZmluZWR8dW5sZXNzfHVudGlsfHdoZW58d2hpbGV8d2luZG93fHdpdGh8eWVzfHlpZWxkKVxcYi8sXG5cdFx0J2NsYXNzLW1lbWJlcic6IHtcblx0XHRcdHBhdHRlcm46IC9AKD8hXFxkKVxcdysvLFxuXHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NvZmZlZXNjcmlwdCcsICdjb21tZW50Jywge1xuXHRcdCdtdWx0aWxpbmUtY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8jIyNbXFxzXFxTXSs/IyMjLyxcblx0XHRcdGFsaWFzOiAnY29tbWVudCdcblx0XHR9LFxuXG5cdFx0Ly8gQmxvY2sgcmVnZXhwIGNhbiBjb250YWluIGNvbW1lbnRzIGFuZCBpbnRlcnBvbGF0aW9uXG5cdFx0J2Jsb2NrLXJlZ2V4Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcL3szfVtcXHNcXFNdKj9cXC97M30vLFxuXHRcdFx0YWxpYXM6ICdyZWdleCcsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvbW1lbnQnOiBjb21tZW50LFxuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IGludGVycG9sYXRpb25cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NvZmZlZXNjcmlwdCcsICdzdHJpbmcnLCB7XG5cdFx0J2lubGluZS1qYXZhc2NyaXB0Jzoge1xuXHRcdFx0cGF0dGVybjogL2AoPzpcXFxcW1xcc1xcU118W15cXFxcYF0pKmAvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15gfGAkLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnc2NyaXB0Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtamF2YXNjcmlwdCcsXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdC8vIEJsb2NrIHN0cmluZ3Ncblx0XHQnbXVsdGlsaW5lLXN0cmluZyc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLycnJ1tcXHNcXFNdKj8nJycvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1wiXCJcIltcXHNcXFNdKj9cIlwiXCIvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0aW50ZXJwb2xhdGlvbjogaW50ZXJwb2xhdGlvblxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XVxuXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NvZmZlZXNjcmlwdCcsICdrZXl3b3JkJywge1xuXHRcdC8vIE9iamVjdCBwcm9wZXJ0eVxuXHRcdCdwcm9wZXJ0eSc6IC8oPyFcXGQpXFx3Kyg/PVxccyo6KD8hOikpL1xuXHR9KTtcblxuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLmNvZmZlZXNjcmlwdFsndGVtcGxhdGUtc3RyaW5nJ107XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmNvZmZlZSA9IFByaXNtLmxhbmd1YWdlcy5jb2ZmZWVzY3JpcHQ7XG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5jb25jdXJuYXMgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OlxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCl8XFwvXFwvLiopLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnbGFuZ2V4dCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiXFx3K1xccypcXHxcXHxbXFxzXFxTXSs/XFx8XFx8Lyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnY2xhc3MtbmFtZSc6IC9eXFx3Ky8sXG5cdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF5cXHMqXFx8XFx8KVtcXHNcXFNdKyg/PVxcfFxcfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXHxcXHwvXG5cdFx0fVxuXHR9LFxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFxccylkZWZbIFxcdF0rKVthLXpBLVpfXVxcdyooPz1cXHMqXFwoKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphYnN0cmFjdHxhY3RvcnxhbHNvfGFubm90YXRpb258YXNzZXJ0fGFzeW5jfGF3YWl0fGJvb2x8Ym9vbGVhbnxicmVha3xieXRlfGNhc2V8Y2F0Y2h8Y2hhbmdlZHxjaGFyfGNsYXNzfGNsb3NlZHxjb25zdGFudHxjb250aW51ZXxkZWZ8ZGVmYXVsdHxkZWx8ZG91YmxlfGVsaWZ8ZWxzZXxlbnVtfGV2ZXJ5fGV4dGVuZHN8ZmFsc2V8ZmluYWxseXxmbG9hdHxmb3J8ZnJvbXxnbG9iYWx8Z3B1ZGVmfGdwdWtlcm5lbHxpZnxpbXBvcnR8aW58aW5pdHxpbmplY3R8aW50fGxhbWJkYXxsb2NhbHxsb25nfGxvb3B8bWF0Y2h8bmV3fG5vZGVmYXVsdHxudWxsfG9mfG9uY2hhbmdlfG9wZW58b3V0fG92ZXJyaWRlfHBhY2thZ2V8cGFyZm9yfHBhcmZvcnN5bmN8cG9zdHxwcmV8cHJpdmF0ZXxwcm90ZWN0ZWR8cHJvdmlkZXxwcm92aWRlcnxwdWJsaWN8cmV0dXJufHNoYXJlZHxzaG9ydHxzaW5nbGV8c2l6ZV90fHNpemVvZnxzdXBlcnxzeW5jfHRoaXN8dGhyb3d8dHJhaXR8dHJhbnN8dHJhbnNpZW50fHRydWV8dHJ5fHR5cGVkZWZ8dW5jaGVja2VkfHVzaW5nfHZhbHx2YXJ8dm9pZHx3aGlsZXx3aXRoKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J251bWJlcic6IC9cXGIwYlswMV1bMDFfXSpMP1xcYnxcXGIweCg/OltcXGRhLWZfXSpcXC4pP1tcXGRhLWZfcCstXStcXGJ8KD86XFxiXFxkW1xcZF9dKig/OlxcLltcXGRfXSopP3xcXEJcXC5cXGRbXFxkX10qKSg/OmVbKy1dP1xcZFtcXGRfXSopP1tkZmxzXT8vaSxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjpdLyxcblx0J29wZXJhdG9yJzogLzw9PXw+PT18PT58LT58PC18PD58Jj09fCY8PnxcXD86P3xcXC5cXD98XFwrXFwrfC0tfFstKyovPTw+XT0/fFshXn5dfFxcYig/OmFuZHxhc3xiYW5kfGJvcnxieG9yfGNvbXB8aXN8aXNub3R8bW9kfG9yKVxcYj0/Lyxcblx0J2Fubm90YXRpb24nOiB7XG5cdFx0cGF0dGVybjogL0AoPzpcXHcrOik/KD86XFx3K3xcXFtbXlxcXV0rXFxdKT8vLFxuXHRcdGFsaWFzOiAnYnVpbHRpbidcblx0fVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY29uY3VybmFzJywgJ2xhbmdleHQnLCB7XG5cdCdyZWdleC1saXRlcmFsJzoge1xuXHRcdHBhdHRlcm46IC9cXGJyKFwifCcpKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKilcXHsoPzpbXnt9XXxcXHsoPzpbXnt9XXxcXHtbXn1dKlxcfSkqXFx9KStcXH0vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5jb25jdXJuYXNcblx0XHRcdH0sXG5cdFx0XHQncmVnZXgnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fSxcblx0J3N0cmluZy1saXRlcmFsJzoge1xuXHRcdHBhdHRlcm46IC8oPzpcXEJ8XFxicykoXCJ8JykoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKVxceyg/Oltee31dfFxceyg/Oltee31dfFxce1tefV0qXFx9KSpcXH0pK1xcfS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNvbmN1cm5hc1xuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5jb25jID0gUHJpc20ubGFuZ3VhZ2VzLmNvbmN1cm5hcztcblxuLyoqXG4gKiBPcmlnaW5hbCBieSBTY290dCBIZWxtZS5cbiAqXG4gKiBSZWZlcmVuY2U6IGh0dHBzOi8vc2NvdHRoZWxtZS5jby51ay9jc3AtY2hlYXQtc2hlZXQvXG4gKlxuICogU3VwcG9ydHMgdGhlIGZvbGxvd2luZzpcbiAqICAtIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9DU1AxL1xuICogIC0gaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUDIvXG4gKiAgLSBodHRwczovL3d3dy53My5vcmcvVFIvQ1NQMy9cbiAqL1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2Vcblx0ICogQHJldHVybnMge1JlZ0V4cH1cblx0ICovXG5cdGZ1bmN0aW9uIHZhbHVlKHNvdXJjZSkge1xuXHRcdHJldHVybiBSZWdFeHAoLyhbIFxcdF0pLy5zb3VyY2UgKyAnKD86JyArIHNvdXJjZSArICcpJyArIC8oPz1bXFxzO118JCkvLnNvdXJjZSwgJ2knKTtcblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlcy5jc3AgPSB7XG5cdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXFxzO10pKD86YmFzZS11cml8YmxvY2stYWxsLW1peGVkLWNvbnRlbnR8KD86Y2hpbGR8Y29ubmVjdHxkZWZhdWx0fGZvbnR8ZnJhbWV8aW1nfG1hbmlmZXN0fG1lZGlhfG9iamVjdHxwcmVmZXRjaHxzY3JpcHR8c3R5bGV8d29ya2VyKS1zcmN8ZGlzb3duLW9wZW5lcnxmb3JtLWFjdGlvbnxmcmFtZS0oPzphbmNlc3RvcnN8b3B0aW9ucyl8aW5wdXQtcHJvdGVjdGlvbig/Oi0oPzpjbGlwfHNlbGVjdG9ycykpP3xuYXZpZ2F0ZS10b3xwbHVnaW4tdHlwZXN8cG9saWN5LXVyaXxyZWZlcnJlcnxyZWZsZWN0ZWQteHNzfHJlcG9ydC0oPzp0b3x1cmkpfHJlcXVpcmUtc3JpLWZvcnxzYW5kYm94fCg/OnNjcmlwdHxzdHlsZSktc3JjLSg/OmF0dHJ8ZWxlbSl8dXBncmFkZS1pbnNlY3VyZS1yZXF1ZXN0cykoPz1bXFxzO118JCkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdH0sXG5cdFx0J3NjaGVtZSc6IHtcblx0XHRcdHBhdHRlcm46IHZhbHVlKC9bYS16XVthLXowLTkuKy1dKjovLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnbm9uZSc6IHtcblx0XHRcdHBhdHRlcm46IHZhbHVlKC8nbm9uZScvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cdFx0J25vbmNlJzoge1xuXHRcdFx0cGF0dGVybjogdmFsdWUoLydub25jZS1bLSsvXFx3PV0rJy8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ251bWJlcidcblx0XHR9LFxuXHRcdCdoYXNoJzoge1xuXHRcdFx0cGF0dGVybjogdmFsdWUoLydzaGEoPzoyNTZ8Mzg0fDUxMiktWy0rL1xcdz1dKycvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0fSxcblx0XHQnaG9zdCc6IHtcblx0XHRcdHBhdHRlcm46IHZhbHVlKFxuXHRcdFx0XHQvW2Etel1bYS16MC05ListXSo6XFwvXFwvW15cXHM7LCddKi8uc291cmNlICtcblx0XHRcdFx0J3wnICtcblx0XHRcdFx0L1xcKlteXFxzOywnXSovLnNvdXJjZSArXG5cdFx0XHRcdCd8JyArXG5cdFx0XHRcdC9bYS16MC05LV0rKD86XFwuW2EtejAtOS1dKykrKD86OltcXGQqXSspPyg/OlxcL1teXFxzOywnXSopPy8uc291cmNlXG5cdFx0XHQpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAndXJsJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW1wb3J0YW50JzogL1xcKi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiB2YWx1ZSgvJ3Vuc2FmZS1bYS16LV0rJy8uc291cmNlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICd1bnNhZmUnXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiB2YWx1ZSgvJ1thLXotXSsnLy5zb3VyY2UpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3NhZmUnXG5cdFx0XHR9LFxuXHRcdF0sXG5cdFx0J3B1bmN0dWF0aW9uJzogLzsvXG5cdH07XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vY29va2xhbmcvc3BlYy9ibG9iL21haW4vRUJORi5tZFxuXG5cdHZhciBzaW5nbGVfdG9rZW5fc3VmZml4ID0gLyg/Oig/IVxccylbXFxkJCs8PWEtekEtWlxceDgwLVxcdUZGRkZdKSsvLnNvdXJjZTtcblx0dmFyIG11bHRpX3Rva2VuX2luZml4ID0gL1tee31AI10rLy5zb3VyY2U7XG5cdHZhciBtdWx0aV90b2tlbl9zdWZmaXggPSAvXFx7W159I0BdKlxcfS8uc291cmNlO1xuXG5cdHZhciBtdWx0aV90b2tlbiA9IG11bHRpX3Rva2VuX2luZml4ICsgbXVsdGlfdG9rZW5fc3VmZml4O1xuXG5cdHZhciB0aW1lcl91bml0cyA9IC8oPzpofGhvdXJzfGhyc3xtfG1pbnxtaW51dGVzKS8uc291cmNlO1xuXG5cdHZhciBhbW91bnRfZ3JvdXBfaW1wbCA9IHtcblx0XHRwYXR0ZXJuOiAvXFx7W157fV0qXFx9Lyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdhbW91bnQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oW1xce3xdKVtee318KiVdKy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnbnVtYmVyJyxcblx0XHRcdH0sXG5cdFx0XHQndW5pdCc6IHtcblx0XHRcdFx0cGF0dGVybjogLyglKVtefV0rLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzeW1ib2wnLFxuXHRcdFx0fSxcblx0XHRcdCdzZXJ2aW5ncy1zY2FsZXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCovLFxuXHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJyxcblx0XHRcdH0sXG5cdFx0XHQnc2VydmluZ3MtYWx0ZXJuYXRpdmUtc2VwYXJhdG9yJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFx8Lyxcblx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcicsXG5cdFx0XHR9LFxuXHRcdFx0J3VuaXQtc2VwYXJhdG9yJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKD86JXwoXFwqKSUpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcicsXG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1t7fV0vLFxuXHRcdH1cblx0fTtcblxuXG5cdFByaXNtLmxhbmd1YWdlcy5jb29rbGFuZyA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdC8vIFstIGNvbW1lbnQgLV1cblx0XHRcdC8vIC0tIGNvbW1lbnRcblx0XHRcdHBhdHRlcm46IC9cXFstW1xcc1xcU10qPy1cXF18LS0uKi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0fSxcblx0XHQnbWV0YSc6IHsgLy8gPj4ga2V5OiB2YWx1ZVxuXHRcdFx0cGF0dGVybjogLz4+Lio6LiovLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwcm9wZXJ0eSc6IHsgLy8ga2V5OlxuXHRcdFx0XHRcdHBhdHRlcm46IC8oPj5cXHMqKVteXFxzOl0oPzpbXjpdKlteXFxzOl0pPy8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2Nvb2t3YXJlLWdyb3VwJzogeyAvLyAjLi4uey4uLn0sICMuLi5cblx0XHRcdHBhdHRlcm46IG5ldyBSZWdFeHAoJyMoPzonXG5cdFx0XHRcdCsgbXVsdGlfdG9rZW5cblx0XHRcdFx0KyAnfCdcblx0XHRcdFx0KyBzaW5nbGVfdG9rZW5fc3VmZml4XG5cdFx0XHRcdCsgJyknXG5cdFx0XHQpLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb29rd2FyZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBuZXcgUmVnRXhwKCcoXiMpKD86J1xuXHRcdFx0XHRcdFx0KyBtdWx0aV90b2tlbl9pbmZpeFxuXHRcdFx0XHRcdFx0KyAnKSdcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjb29rd2FyZS1rZXl3b3JkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eIy8sXG5cdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0J3F1YW50aXR5LWdyb3VwJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IG5ldyBSZWdFeHAoL1xce1tee31AI10qXFx9LyksXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncXVhbnRpdHknOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IG5ldyBSZWdFeHAoLyheXFx7KS8uc291cmNlICsgbXVsdGlfdG9rZW5faW5maXgpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ251bWJlcicsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1t7fV0vLFxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHR9LFxuXHRcdCdpbmdyZWRpZW50LWdyb3VwJzogeyAvLyBALi4uey4uLn0sIEAuLi5cblx0XHRcdHBhdHRlcm46IG5ldyBSZWdFeHAoJ0AoPzonXG5cdFx0XHRcdCsgbXVsdGlfdG9rZW5cblx0XHRcdFx0KyAnfCdcblx0XHRcdFx0KyBzaW5nbGVfdG9rZW5fc3VmZml4XG5cdFx0XHRcdCsgJyknKSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW5ncmVkaWVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBuZXcgUmVnRXhwKCcoXkApKD86J1xuXHRcdFx0XHRcdFx0KyBtdWx0aV90b2tlbl9pbmZpeFxuXHRcdFx0XHRcdFx0KyAnKScpLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdpbmdyZWRpZW50LWtleXdvcmQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15ALyxcblx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnYW1vdW50LWdyb3VwJzogYW1vdW50X2dyb3VwX2ltcGwsXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQndGltZXItZ3JvdXAnOiB7IC8vIH50aW1lcnsuLi59XG5cdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3NvcnQtYWx0ZXJuYXRpdmVzXG5cdFx0XHRwYXR0ZXJuOiAvfig/IVxccylbXkAjfnt9XSpcXHtbXnt9XSpcXH0vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd0aW1lcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5+KVtee10rLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnZHVyYXRpb24tZ3JvdXAnOiB7IC8vIHsuLi59XG5cdFx0XHRcdFx0cGF0dGVybjogL1xce1tee31dKlxcfS8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvW3t9XS8sXG5cdFx0XHRcdFx0XHQndW5pdCc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogbmV3IFJlZ0V4cCgvKCVcXHMqKS8uc291cmNlICsgdGltZXJfdW5pdHMgKyAvXFxiLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ3N5bWJvbCcsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J29wZXJhdG9yJzogLyUvLFxuXHRcdFx0XHRcdFx0J2R1cmF0aW9uJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxkKy8sXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAnbnVtYmVyJyxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQndGltZXIta2V5d29yZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXn4vLFxuXHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCcsXG5cdFx0XHRcdH0sXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2NvcS9jb3FcblxuXHR2YXIgY29tbWVudFNvdXJjZSA9IC9cXChcXCooPzpbXigqXXxcXCgoPyFcXCopfFxcKig/IVxcKSl8PHNlbGY+KSpcXCpcXCkvLnNvdXJjZTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCAyOyBpKyspIHtcblx0XHRjb21tZW50U291cmNlID0gY29tbWVudFNvdXJjZS5yZXBsYWNlKC88c2VsZj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gY29tbWVudFNvdXJjZTsgfSk7XG5cdH1cblx0Y29tbWVudFNvdXJjZSA9IGNvbW1lbnRTb3VyY2UucmVwbGFjZSgvPHNlbGY+L2csICdbXScpO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5jb3EgPSB7XG5cdFx0J2NvbW1lbnQnOiBSZWdFeHAoY29tbWVudFNvdXJjZSksXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlteXCJdfFwiXCIpKlwiKD8hXCIpLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2F0dHJpYnV0ZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHRcdC8jXFxbKD86W15cXFtcXF0oXCJdfFwiKD86W15cIl18XCJcIikqXCIoPyFcIil8XFwoKD8hXFwqKXw8Y29tbWVudD4pKlxcXS8uc291cmNlXG5cdFx0XHRcdFx0XHQucmVwbGFjZSgvPGNvbW1lbnQ+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbW1lbnRTb3VyY2U7IH0pXG5cdFx0XHRcdCksXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdhdHRyLW5hbWUnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnY29tbWVudCc6IFJlZ0V4cChjb21tZW50U291cmNlKSxcblx0XHRcdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1wiKD86W15cIl18XCJcIikqXCIoPyFcIikvLFxuXHRcdFx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdCdvcGVyYXRvcic6IC89Lyxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXiNcXFt8XFxdJHxbLCgpXS9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcYig/OkN1bXVsYXRpdmV8R2xvYmFsfExvY2FsfE1vbm9tb3JwaGljfE5vbkN1bXVsYXRpdmV8UG9seW1vcnBoaWN8UHJpdmF0ZXxQcm9ncmFtKVxcYi8sXG5cdFx0XHRcdGFsaWFzOiAnYXR0ci1uYW1lJ1xuXHRcdFx0fVxuXHRcdF0sXG5cblx0XHQna2V5d29yZCc6IC9cXGIoPzpBYm9ydHxBYm91dHxBZGR8QWRtaXR8QWRtaXR0ZWR8QWxsfEFyZ3VtZW50c3xBc3xBc3N1bXB0aW9uc3xBeGlvbXxBeGlvbXN8QmFja3xCYWNrVG98QmFja3RyYWNlfEJpbk9wfEJpbk9wU3BlY3xCaW5SZWx8QmluZHxCbGFja2xpc3R8Q2Fub25pY2FsfENhc2V8Q2R8Q2hlY2t8Q2xhc3N8Q2xhc3Nlc3xDbG9zZXxDb0ZpeHBvaW50fENvSW5kdWN0aXZlfENvZXJjaW9ufENvZXJjaW9uc3xDb2xsZWN0aW9ufENvbWJpbmVkfENvbXB1dGV8Q29uamVjdHVyZXxDb25qZWN0dXJlc3xDb25zdGFudHxDb25zdGFudHN8Q29uc3RyYWludHxDb25zdHJ1Y3RvcnN8Q29udGV4dHxDb3JvbGxhcnl8Q3JlYXRlfENzdE9wfEN1c3RvbXxDdXR8RGVidWd8RGVjbGFyZXxEZWZpbmVkfERlZmluaXRpb258RGVsaW1pdHxEZXBlbmRlbmNpZXN8RGVwZW5kZW50fERlcml2ZXxEaWZmc3xEcm9wfEVsaW1pbmF0aW9ufEVuZHxFbnRyeXxFcXVhbGl0eXxFdmFsfEV4YW1wbGV8RXhpc3RlbnRpYWx8RXhpc3RlbnRpYWxzfEV4aXN0aW5nfEV4cG9ydHxFeHRlcm58RXh0cmFjdGlvbnxGYWN0fEZhaWx8RmllbGR8RmlsZXxGaXJzdG9yZGVyfEZpeHBvaW50fEZsYWdzfEZvY3VzfEZyb218RnVuY2xhc3N8RnVuY3Rpb258RnVuY3Rpb25hbHxHQ3xHZW5lcmFsaXphYmxlfEdvYWx8R3JhYnxHcmFtbWFyfEdyYXBofEd1YXJkZWR8SGFza2VsbHxIZWFwfEhpZGV8SGludHxIaW50RGJ8SGludHN8SHlwb3RoZXNlc3xIeXBvdGhlc2lzfElGfElkZW50aXR5fEltbWVkaWF0ZXxJbXBsaWNpdHxJbXBsaWNpdHN8SW1wb3J0fEluY2x1ZGV8SW5kdWN0aW9ufEluZHVjdGl2ZXxJbmZpeHxJbmZvfEluaXRpYWx8SW5qVHlwfElubGluZXxJbnNwZWN0fEluc3RhbmNlfEluc3RhbmNlc3xJbnRyb3xJbnRyb3N8SW52ZXJzaW9ufEludmVyc2lvbl9jbGVhcnxKU09OfExhbmd1YWdlfExlZnR8TGVtbWF8TGV0fExpYXxMaWJyYXJpZXN8TGlicmFyeXxMb2FkfExvYWRQYXRofExvY2F0ZXxMdGFjfEx0YWMyfE1MfE1hdGNofE1ldGhvZHxNaW5pbWFsaXR5fE1vZHVsZXxNb2R1bGVzfE1vcnBoaXNtfE5leHR8Tm9JbmxpbmV8Tm90YXRpb258TnVtYmVyfE9DYW1sfE9ibGlnYXRpb258T2JsaWdhdGlvbnN8T3BhcXVlfE9wZW58T3B0aW1pemV8UGFyYW1ldGVyfFBhcmFtZXRlcnN8UGFyYW1ldHJpY3xQYXRofFBhdGhzfFByZW5leHxQcmV0ZXJtfFByaW1pdGl2ZXxQcmludHxQcm9maWxlfFByb2plY3Rpb25zfFByb29mfFByb3B8UHJvcEJpbk9wfFByb3BPcHxQcm9wVU9wfFByb3BlcnR5fFByb3Bvc2l0aW9ufFB3ZHxRZWR8UXVpdHxSZWN8UmVjb3JkfFJlY3Vyc2l2ZXxSZWRpcmVjdHxSZWR1Y3Rpb258UmVnaXN0ZXJ8UmVsYXRpb258UmVtYXJrfFJlbW92ZXxSZXF1aXJlfFJlc2VydmVkfFJlc2V0fFJlc29sdmV8UmVzdGFydHxSZXdyaXRlfFJpZ2h0fFJpbmd8UmluZ3N8U1Byb3B8U2F0dXJhdGV8U2F2ZXxTY2hlbWV8U2NvcGV8U2NvcGVzfFNlYXJjaHxTZWFyY2hIZWFkfFNlYXJjaFBhdHRlcm58U2VhcmNoUmV3cml0ZXxTZWN0aW9ufFNlcGFyYXRlfFNldHxTZXRvaWR8U2hvd3xTaWduYXR1cmVzfFNvbHZlfFNvbHZlcnxTb3J0fFNvcnRjbGFzc3xTb3J0ZWR8U3BlY3xTdGVwfFN0cmF0ZWdpZXN8U3RyYXRlZ3l8U3RyaW5nfFN0cnVjdHVyZXxTdWJDbGFzc3xTdWJncmFwaHxTdWNoVGhhdHxUYWN0aWN8VGVybXxUZXN0Q29tcGlsZXxUaGVvcmVtfFRpbWV8VGltZW91dHxUb3xUcmFuc3BhcmVudHxUeXBlfFR5cGVjbGFzc2VzfFR5cGVzfFR5cGluZ3xVbk9wfFVuT3BTcGVjfFVuZGVsaW1pdHxVbmRvfFVuZm9jdXN8VW5mb2N1c2VkfFVuZm9sZHxVbml2ZXJzZXxVbml2ZXJzZXN8VW5zaGVsdmV8VmFyaWFibGV8VmFyaWFibGVzfFZhcmlhbnR8VmVyYm9zZXxWaWV3fFZpc2liaWxpdHl8WmlmeXxffGFwcGx5fGFzfGF0fGJ5fGNvZml4fGVsc2V8ZW5kfGV4aXN0c3xleGlzdHMyfGZpeHxmb3J8Zm9yYWxsfGZ1bnxpZnxpbnxsZXR8bWF0Y2h8bWVhc3VyZXxtb3ZlfHJlbW92ZWR8cmV0dXJufHN0cnVjdHx0aGVufHVzaW5nfHdmfHdoZXJlfHdpdGgpXFxiLyxcblxuXHRcdCdudW1iZXInOiAvXFxiKD86MHhbYS1mMC05XVthLWYwLTlfXSooPzpcXC5bYS1mMC05X10rKT8oPzpwWystXT9cXGRbXFxkX10qKT98XFxkW1xcZF9dKig/OlxcLltcXGRfXSspPyg/OmVbKy1dP1xcZFtcXGRfXSopPylcXGIvaSxcblxuXHRcdCdwdW5jdCc6IHtcblx0XHRcdHBhdHRlcm46IC9AXFx7fFxce1xcfHxcXFs9fDo+Lyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQnb3BlcmF0b3InOiAvXFwvXFxcXHxcXFxcXFwvfFxcLnsyLDN9fDp7MSwyfT18XFwqXFwqfFstPV0+fDwoPzotPj98Wys6PT5dfDw6KXw+KD86PXwtPil8XFx8Wy18XT98Wy0hJSYqKy88PT4/QF5+J10vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9cXC5cXCh8YFxcKHxAXFx7fGBcXHt8XFx7XFx8fFxcWz18Oj58WzouLDsoKXt9XFxbXFxdXS9cblx0fTtcblxufShQcmlzbSkpO1xuXG4vKipcbiAqIE9yaWdpbmFsIGJ5IFNhbXVlbCBGbG9yZXNcbiAqXG4gKiBBZGRzIHRoZSBmb2xsb3dpbmcgbmV3IHRva2VuIGNsYXNzZXM6XG4gKiAgICAgY29uc3RhbnQsIGJ1aWx0aW4sIHZhcmlhYmxlLCBzeW1ib2wsIHJlZ2V4XG4gKi9cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0UHJpc20ubGFuZ3VhZ2VzLnJ1YnkgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8jLip8Xj1iZWdpblxcc1tcXHNcXFNdKj9ePWVuZC9tLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnY2xhc3MtbmFtZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86Y2xhc3N8bW9kdWxlKVxccyt8XFxiY2F0Y2hcXHMrXFwoKVtcXHcuXFxcXF0rfFxcYltBLVpfXVxcdyooPz1cXHMqXFwuXFxzKm5ld1xcYikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWy5cXFxcXS9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OkJFR0lOfEVORHxhbGlhc3xhbmR8YmVnaW58YnJlYWt8Y2FzZXxjbGFzc3xkZWZ8ZGVmaW5lX21ldGhvZHxkZWZpbmVkfGRvfGVhY2h8ZWxzZXxlbHNpZnxlbmR8ZW5zdXJlfGV4dGVuZHxmb3J8aWZ8aW58aW5jbHVkZXxtb2R1bGV8bmV3fG5leHR8bmlsfG5vdHxvcnxwcmVwZW5kfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyYWlzZXxyZWRvfHJlcXVpcmV8cmVzY3VlfHJldHJ5fHJldHVybnxzZWxmfHN1cGVyfHRoZW58dGhyb3d8dW5kZWZ8dW5sZXNzfHVudGlsfHdoZW58d2hpbGV8eWllbGQpXFxiLyxcblx0XHQnb3BlcmF0b3InOiAvXFwuezIsM318JlxcLnw9PT18PD89PnxbIT1dP358KD86JiZ8XFx8XFx8fDw8fD4+fFxcKlxcKnxbK1xcLSovJTw+IV4mfD1dKT0/fFs/Ol0vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKCl7fVtcXF0uLDtdLyxcblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncnVieScsICdvcGVyYXRvcicsIHtcblx0XHQnZG91YmxlLWNvbG9uJzoge1xuXHRcdFx0cGF0dGVybjogLzo6Lyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0fSk7XG5cblx0dmFyIGludGVycG9sYXRpb24gPSB7XG5cdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKSNcXHsoPzpbXnt9XXxcXHtbXnt9XSpcXH0pKlxcfS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdjb250ZW50Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXigjXFx7KVtcXHNcXFNdKyg/PVxcfSQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucnVieVxuXHRcdFx0fSxcblx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eI1xce3xcXH0kLyxcblx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5ydWJ5LmZ1bmN0aW9uO1xuXG5cdHZhciBwZXJjZW50RXhwcmVzc2lvbiA9ICcoPzonICsgW1xuXHRcdC8oW15hLXpBLVowLTlcXHN7KFxcWzw9XSkoPzooPyFcXDEpW15cXFxcXXxcXFxcW1xcc1xcU10pKlxcMS8uc291cmNlLFxuXHRcdC9cXCgoPzpbXigpXFxcXF18XFxcXFtcXHNcXFNdfFxcKCg/OlteKClcXFxcXXxcXFxcW1xcc1xcU10pKlxcKSkqXFwpLy5zb3VyY2UsXG5cdFx0L1xceyg/Oltee31cXFxcXXxcXFxcW1xcc1xcU118XFx7KD86W157fVxcXFxdfFxcXFxbXFxzXFxTXSkqXFx9KSpcXH0vLnNvdXJjZSxcblx0XHQvXFxbKD86W15cXFtcXF1cXFxcXXxcXFxcW1xcc1xcU118XFxbKD86W15cXFtcXF1cXFxcXXxcXFxcW1xcc1xcU10pKlxcXSkqXFxdLy5zb3VyY2UsXG5cdFx0LzwoPzpbXjw+XFxcXF18XFxcXFtcXHNcXFNdfDwoPzpbXjw+XFxcXF18XFxcXFtcXHNcXFNdKSo+KSo+Ly5zb3VyY2Vcblx0XS5qb2luKCd8JykgKyAnKSc7XG5cblx0dmFyIHN5bWJvbE5hbWUgPSAvKD86XCIoPzpcXFxcLnxbXlwiXFxcXFxcclxcbl0pKlwifCg/OlxcYlthLXpBLVpfXVxcdyp8W15cXHNcXDAtXFx4N0ZdKylbPyFdP3xcXCQuKS8uc291cmNlO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3J1YnknLCAna2V5d29yZCcsIHtcblx0XHQncmVnZXgtbGl0ZXJhbCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8lci8uc291cmNlICsgcGVyY2VudEV4cHJlc3Npb24gKyAvW2VnaW1ub3N1eF17MCw2fS8uc291cmNlKSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IGludGVycG9sYXRpb24sXG5cdFx0XHRcdFx0J3JlZ2V4JzogL1tcXHNcXFNdKy9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteL10pXFwvKD8hXFwvKSg/OlxcW1teXFxyXFxuXFxdXStcXF18XFxcXC58W15bL1xcXFxcXHJcXG5dKStcXC9bZWdpbW5vc3V4XXswLDZ9KD89XFxzKig/OiR8W1xcclxcbiwuO30pI10pKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBpbnRlcnBvbGF0aW9uLFxuXHRcdFx0XHRcdCdyZWdleCc6IC9bXFxzXFxTXSsvXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCd2YXJpYWJsZSc6IC9bQCRdK1thLXpBLVpfXVxcdyooPzpbPyFdfFxcYikvLFxuXHRcdCdzeW1ib2wnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKF58W146XSk6Ly5zb3VyY2UgKyBzeW1ib2xOYW1lKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhbXFxyXFxueygsXVsgXFx0XSopLy5zb3VyY2UgKyBzeW1ib2xOYW1lICsgLyg/PTooPyE6KSkvLnNvdXJjZSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRdLFxuXHRcdCdtZXRob2QtZGVmaW5pdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiZGVmXFxzKylcXHcrKD86XFxzKlxcLlxccypcXHcrKT8vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZnVuY3Rpb24nOiAvXFxiXFx3KyQvLFxuXHRcdFx0XHQna2V5d29yZCc6IC9ec2VsZlxcYi8sXG5cdFx0XHRcdCdjbGFzcy1uYW1lJzogL15cXHcrLyxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3J1YnknLCAnc3RyaW5nJywge1xuXHRcdCdzdHJpbmctbGl0ZXJhbCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8lW3FRaUl3V3NdPy8uc291cmNlICsgcGVyY2VudEV4cHJlc3Npb24pLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogaW50ZXJwb2xhdGlvbixcblx0XHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcInwnKSg/OiNcXHtbXn1dK1xcfXwjKD8hXFx7KXxcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDEpW15cXFxcI1xcclxcbl0pKlxcMS8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBpbnRlcnBvbGF0aW9uLFxuXHRcdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvPDxbLX5dPyhbYS16X11cXHcqKVtcXHJcXG5dKD86LipbXFxyXFxuXSkqP1tcXHQgXSpcXDEvaSxcblx0XHRcdFx0YWxpYXM6ICdoZXJlZG9jLXN0cmluZycsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9ePDxbLX5dP1thLXpfXVxcdyp8XFxiW2Etel9dXFx3KiQvaSxcblx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHQnc3ltYm9sJzogL1xcYlxcdysvLFxuXHRcdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXjw8Wy1+XT8vXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IGludGVycG9sYXRpb24sXG5cdFx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC88PFstfl0/JyhbYS16X11cXHcqKSdbXFxyXFxuXSg/Oi4qW1xcclxcbl0pKj9bXFx0IF0qXFwxL2ksXG5cdFx0XHRcdGFsaWFzOiAnaGVyZWRvYy1zdHJpbmcnLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXjw8Wy1+XT8nW2Etel9dXFx3Kid8XFxiW2Etel9dXFx3KiQvaSxcblx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHQnc3ltYm9sJzogL1xcYlxcdysvLFxuXHRcdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXjw8Wy1+XT8nfCckLyxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnY29tbWFuZC1saXRlcmFsJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyV4Ly5zb3VyY2UgKyBwZXJjZW50RXhwcmVzc2lvbiksXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBpbnRlcnBvbGF0aW9uLFxuXHRcdFx0XHRcdCdjb21tYW5kJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9gKD86I1xce1tefV0rXFx9fCMoPyFcXHspfFxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXFxcXGAjXFxyXFxuXSkqYC8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBpbnRlcnBvbGF0aW9uLFxuXHRcdFx0XHRcdCdjb21tYW5kJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdXG5cdH0pO1xuXG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMucnVieS5zdHJpbmc7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncnVieScsICdudW1iZXInLCB7XG5cdFx0J2J1aWx0aW4nOiAvXFxiKD86QXJyYXl8QmlnbnVtfEJpbmRpbmd8Q2xhc3N8Q29udGludWF0aW9ufERpcnxFeGNlcHRpb258RmFsc2VDbGFzc3xGaWxlfEZpeG51bXxGbG9hdHxIYXNofElPfEludGVnZXJ8TWF0Y2hEYXRhfE1ldGhvZHxNb2R1bGV8TmlsQ2xhc3N8TnVtZXJpY3xPYmplY3R8UHJvY3xSYW5nZXxSZWdleHB8U3RhdHxTdHJpbmd8U3RydWN0fFN5bWJvbHxUTVN8VGhyZWFkfFRocmVhZEdyb3VwfFRpbWV8VHJ1ZUNsYXNzKVxcYi8sXG5cdFx0J2NvbnN0YW50JzogL1xcYltBLVpdW0EtWjAtOV9dKig/Ols/IV18XFxiKS9cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnJiID0gUHJpc20ubGFuZ3VhZ2VzLnJ1Ynk7XG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0UHJpc20ubGFuZ3VhZ2VzLmNyeXN0YWwgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdydWJ5Jywge1xuXHRcdCdrZXl3b3JkJzogW1xuXHRcdFx0L1xcYig/Ol9fRElSX198X19FTkRfTElORV9ffF9fRklMRV9ffF9fTElORV9ffGFic3RyYWN0fGFsaWFzfGFubm90YXRpb258YXN8YXNtfGJlZ2lufGJyZWFrfGNhc2V8Y2xhc3N8ZGVmfGRvfGVsc2V8ZWxzaWZ8ZW5kfGVuc3VyZXxlbnVtfGV4dGVuZHxmb3J8ZnVufGlmfGlmZGVmfGluY2x1ZGV8aW5zdGFuY2Vfc2l6ZW9mfGxpYnxtYWNyb3xtb2R1bGV8bmV4dHxvZnxvdXR8cG9pbnRlcm9mfHByaXZhdGV8cHJvdGVjdGVkfHB0cnxyZXF1aXJlfHJlc2N1ZXxyZXR1cm58c2VsZWN0fHNlbGZ8c2l6ZW9mfHN0cnVjdHxzdXBlcnx0aGVufHR5cGV8dHlwZW9mfHVuZGVmfHVuaW5pdGlhbGl6ZWR8dW5pb258dW5sZXNzfHVudGlsfHdoZW58d2hpbGV8d2l0aHx5aWVsZClcXGIvLFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcLlxccyopKD86aXNfYXxyZXNwb25kc190bylcXD8vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnbnVtYmVyJzogL1xcYig/OjBiWzAxX10qWzAxXXwwb1swLTdfXSpbMC03XXwweFtcXGRhLWZBLUZfXSpbXFxkYS1mQS1GXXwoPzpcXGQoPzpbXFxkX10qXFxkKT8pKD86XFwuW1xcZF9dKlxcZCk/KD86W2VFXVsrLV0/W1xcZF9dKlxcZCk/KSg/Ol8oPzpbdWlmXSg/Ojh8MTZ8MzJ8NjQpKT8pP1xcYi8sXG5cdFx0J29wZXJhdG9yJzogW1xuXHRcdFx0Ly0+Lyxcblx0XHRcdFByaXNtLmxhbmd1YWdlcy5ydWJ5Lm9wZXJhdG9yLFxuXHRcdF0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKXt9W1xcXS4sO1xcXFxdLyxcblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3J5c3RhbCcsICdzdHJpbmctbGl0ZXJhbCcsIHtcblx0XHQnYXR0cmlidXRlJzoge1xuXHRcdFx0cGF0dGVybjogL0BcXFsuKj9cXF0vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15AXFxbfFxcXSQvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdhdHRyaWJ1dGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKilcXHcrLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0J2FyZ3MnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcUyg/OltcXHNcXFNdKlxcUyk/Lyxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5jcnlzdGFsXG5cdFx0XHRcdH0sXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnZXhwYW5zaW9uJzoge1xuXHRcdFx0cGF0dGVybjogL1xceyg/Olxcey4qP1xcfXwlLio/JSlcXH0vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb250ZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKFxcey4pW1xcc1xcU10rKD89LlxcfSQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNyeXN0YWxcblx0XHRcdFx0fSxcblx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxce1tcXHslXXxbXFx9JV1cXH0kLyxcblx0XHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY2hhcic6IHtcblx0XHRcdHBhdHRlcm46IC8nKD86W15cXFxcXFxyXFxuXXsxLDJ9fFxcXFwoPzoufHUoPzpbQS1GYS1mMC05XXsxLDR9fFxce1tBLUZhLWYwLTldezEsNn1cXH0pKSknLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0fSk7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBzdHJpbmcgPSAvKFwifCcpKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS87XG5cdHZhciBzZWxlY3Rvckluc2lkZTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuY3NzLnNlbGVjdG9yID0ge1xuXHRcdHBhdHRlcm46IFByaXNtLmxhbmd1YWdlcy5jc3Muc2VsZWN0b3IucGF0dGVybixcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZTogc2VsZWN0b3JJbnNpZGUgPSB7XG5cdFx0XHQncHNldWRvLWVsZW1lbnQnOiAvOig/OmFmdGVyfGJlZm9yZXxmaXJzdC1sZXR0ZXJ8Zmlyc3QtbGluZXxzZWxlY3Rpb24pfDo6Wy1cXHddKy8sXG5cdFx0XHQncHNldWRvLWNsYXNzJzogLzpbLVxcd10rLyxcblx0XHRcdCdjbGFzcyc6IC9cXC5bLVxcd10rLyxcblx0XHRcdCdpZCc6IC8jWy1cXHddKy8sXG5cdFx0XHQnYXR0cmlidXRlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJ1xcXFxbKD86W15bXFxcXF1cIlxcJ118JyArIHN0cmluZy5zb3VyY2UgKyAnKSpcXFxcXScpLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFxbfFxcXSQvLFxuXHRcdFx0XHRcdCdjYXNlLXNlbnNpdGl2aXR5Jzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyhcXHMpW3NpXSQvaSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnbmFtZXNwYWNlJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKikoPzooPyFcXHMpWy0qXFx3XFx4QTAtXFx1RkZGRl0pKlxcfCg/IT0pLyxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcfCQvXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnYXR0ci1uYW1lJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKikoPzooPyFcXHMpWy1cXHdcXHhBMC1cXHVGRkZGXSkrLyxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdhdHRyLXZhbHVlJzogW1xuXHRcdFx0XHRcdFx0c3RyaW5nLFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKD1cXHMqKSg/Oig/IVxccylbLVxcd1xceEEwLVxcdUZGRkZdKSsoPz1cXHMqJCkvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0XHQnb3BlcmF0b3InOiAvW3x+Kl4kXT89L1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J24tdGgnOiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxcKFxccyopWystXT9cXGQqW1xcZG5dKD86XFxzKlsrLV1cXHMqXFxkKyk/KD89XFxzKlxcKSkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnbnVtYmVyJzogL1tcXGRuXSsvLFxuXHRcdFx0XHRcdFx0J29wZXJhdG9yJzogL1srLV0vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhcXChcXHMqKSg/OmV2ZW58b2RkKSg/PVxccypcXCkpL2ksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHRdLFxuXHRcdFx0J2NvbWJpbmF0b3InOiAvPnxcXCt8fnxcXHxcXHwvLFxuXG5cdFx0XHQvLyB0aGUgYHRhZ2AgdG9rZW4gaGFzIGJlZW4gZXhpc3RlZCBhbmQgcmVtb3ZlZC5cblx0XHRcdC8vIGJlY2F1c2Ugd2UgY2FuJ3QgZmluZCBhIHBlcmZlY3QgdG9rZW5pemUgdG8gbWF0Y2ggaXQuXG5cdFx0XHQvLyBpZiB5b3Ugd2FudCB0byBhZGQgaXQsIHBsZWFzZSByZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9QcmlzbUpTL3ByaXNtL3B1bGwvMjM3MyBmaXJzdC5cblxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKSxdLyxcblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmNzc1snYXRydWxlJ10uaW5zaWRlWydzZWxlY3Rvci1mdW5jdGlvbi1hcmd1bWVudCddLmluc2lkZSA9IHNlbGVjdG9ySW5zaWRlO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2NzcycsICdwcm9wZXJ0eScsIHtcblx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14tXFx3XFx4QTAtXFx1RkZGRl0pLS0oPyFcXHMpWy1fYS16XFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWy1cXHdcXHhBMC1cXHVGRkZGXSkqL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHR9KTtcblxuXHR2YXIgdW5pdCA9IHtcblx0XHRwYXR0ZXJuOiAvKFxcYlxcZCspKD86JXxbYS16XSsoPyFbXFx3LV0pKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9O1xuXHQvLyAxMjMgLTEyMyAuMTIzIC0uMTIzIDEyLjMgLTEyLjNcblx0dmFyIG51bWJlciA9IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHcuLV0pLT8oPzpcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3NzJywgJ2Z1bmN0aW9uJywge1xuXHRcdCdvcGVyYXRvcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxzKVsrXFwtKlxcL10oPz1cXHMpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC8vIENBUkVGVUwhXG5cdFx0Ly8gUHJldmlld2VycyBhbmQgSW5saW5lIGNvbG9yIHVzZSBoZXhjb2RlIGFuZCBjb2xvci5cblx0XHQnaGV4Y29kZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXEIjW1xcZGEtZl17Myw4fVxcYi9pLFxuXHRcdFx0YWxpYXM6ICdjb2xvcidcblx0XHR9LFxuXHRcdCdjb2xvcic6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFx3LV0pKD86QWxpY2VCbHVlfEFudGlxdWVXaGl0ZXxBcXVhfEFxdWFtYXJpbmV8QXp1cmV8QmVpZ2V8QmlzcXVlfEJsYWNrfEJsYW5jaGVkQWxtb25kfEJsdWV8Qmx1ZVZpb2xldHxCcm93bnxCdXJseVdvb2R8Q2FkZXRCbHVlfENoYXJ0cmV1c2V8Q2hvY29sYXRlfENvcmFsfENvcm5mbG93ZXJCbHVlfENvcm5zaWxrfENyaW1zb258Q3lhbnxEYXJrQmx1ZXxEYXJrQ3lhbnxEYXJrR29sZGVuUm9kfERhcmtHclthZV15fERhcmtHcmVlbnxEYXJrS2hha2l8RGFya01hZ2VudGF8RGFya09saXZlR3JlZW58RGFya09yYW5nZXxEYXJrT3JjaGlkfERhcmtSZWR8RGFya1NhbG1vbnxEYXJrU2VhR3JlZW58RGFya1NsYXRlQmx1ZXxEYXJrU2xhdGVHclthZV15fERhcmtUdXJxdW9pc2V8RGFya1Zpb2xldHxEZWVwUGlua3xEZWVwU2t5Qmx1ZXxEaW1HclthZV15fERvZGdlckJsdWV8RmlyZUJyaWNrfEZsb3JhbFdoaXRlfEZvcmVzdEdyZWVufEZ1Y2hzaWF8R2FpbnNib3JvfEdob3N0V2hpdGV8R29sZHxHb2xkZW5Sb2R8R3JbYWVdeXxHcmVlbnxHcmVlblllbGxvd3xIb25leURld3xIb3RQaW5rfEluZGlhblJlZHxJbmRpZ298SXZvcnl8S2hha2l8TGF2ZW5kZXJ8TGF2ZW5kZXJCbHVzaHxMYXduR3JlZW58TGVtb25DaGlmZm9ufExpZ2h0Qmx1ZXxMaWdodENvcmFsfExpZ2h0Q3lhbnxMaWdodEdvbGRlblJvZFllbGxvd3xMaWdodEdyW2FlXXl8TGlnaHRHcmVlbnxMaWdodFBpbmt8TGlnaHRTYWxtb258TGlnaHRTZWFHcmVlbnxMaWdodFNreUJsdWV8TGlnaHRTbGF0ZUdyW2FlXXl8TGlnaHRTdGVlbEJsdWV8TGlnaHRZZWxsb3d8TGltZXxMaW1lR3JlZW58TGluZW58TWFnZW50YXxNYXJvb258TWVkaXVtQXF1YU1hcmluZXxNZWRpdW1CbHVlfE1lZGl1bU9yY2hpZHxNZWRpdW1QdXJwbGV8TWVkaXVtU2VhR3JlZW58TWVkaXVtU2xhdGVCbHVlfE1lZGl1bVNwcmluZ0dyZWVufE1lZGl1bVR1cnF1b2lzZXxNZWRpdW1WaW9sZXRSZWR8TWlkbmlnaHRCbHVlfE1pbnRDcmVhbXxNaXN0eVJvc2V8TW9jY2FzaW58TmF2YWpvV2hpdGV8TmF2eXxPbGRMYWNlfE9saXZlfE9saXZlRHJhYnxPcmFuZ2V8T3JhbmdlUmVkfE9yY2hpZHxQYWxlR29sZGVuUm9kfFBhbGVHcmVlbnxQYWxlVHVycXVvaXNlfFBhbGVWaW9sZXRSZWR8UGFwYXlhV2hpcHxQZWFjaFB1ZmZ8UGVydXxQaW5rfFBsdW18UG93ZGVyQmx1ZXxQdXJwbGV8UmViZWNjYVB1cnBsZXxSZWR8Um9zeUJyb3dufFJveWFsQmx1ZXxTYWRkbGVCcm93bnxTYWxtb258U2FuZHlCcm93bnxTZWFHcmVlbnxTZWFTaGVsbHxTaWVubmF8U2lsdmVyfFNreUJsdWV8U2xhdGVCbHVlfFNsYXRlR3JbYWVdeXxTbm93fFNwcmluZ0dyZWVufFN0ZWVsQmx1ZXxUYW58VGVhbHxUaGlzdGxlfFRvbWF0b3xUcmFuc3BhcmVudHxUdXJxdW9pc2V8VmlvbGV0fFdoZWF0fFdoaXRlfFdoaXRlU21va2V8WWVsbG93fFllbGxvd0dyZWVuKSg/IVtcXHctXSkvaSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcYig/OmhzbHxyZ2IpXFwoXFxzKlxcZHsxLDN9XFxzKixcXHMqXFxkezEsM30lP1xccyosXFxzKlxcZHsxLDN9JT9cXHMqXFwpXFxCfFxcYig/OmhzbHxyZ2IpYVxcKFxccypcXGR7MSwzfVxccyosXFxzKlxcZHsxLDN9JT9cXHMqLFxccypcXGR7MSwzfSU/XFxzKixcXHMqKD86MHwwP1xcLlxcZCt8MSlcXHMqXFwpXFxCL2ksXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCd1bml0JzogdW5pdCxcblx0XHRcdFx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdFx0XHRcdCdmdW5jdGlvbic6IC9bXFx3LV0rKD89XFwoKS8sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKSxdL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQvLyBpdCdzIGltcG9ydGFudCB0aGF0IHRoZXJlIGlzIG5vIGJvdW5kYXJ5IGFzc2VydGlvbiBhZnRlciB0aGUgaGV4IGRpZ2l0c1xuXHRcdCdlbnRpdHknOiAvXFxcXFtcXGRhLWZdezEsOH0vaSxcblx0XHQndW5pdCc6IHVuaXQsXG5cdFx0J251bWJlcic6IG51bWJlclxuXHR9KTtcblxufShQcmlzbSkpO1xuXG4vLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDE4MFxuXG5QcmlzbS5sYW5ndWFnZXMuY3N2ID0ge1xuXHQndmFsdWUnOiAvW15cXHJcXG4sXCJdK3xcIig/OlteXCJdfFwiXCIpKlwiKD8hXCIpLyxcblx0J3B1bmN0dWF0aW9uJzogLywvXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0Ly8gaHR0cHM6Ly9jdWVsYW5nLm9yZy9kb2NzL3JlZmVyZW5jZXMvc3BlYy9cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHR2YXIgc3RyaW5nRXNjYXBlID0gL1xcXFwoPzooPyFcXDIpfFxcMig/OlteKClcXHJcXG5dfFxcKFteKCldKlxcKSkpLy5zb3VyY2U7XG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdHZhciBzdHJpbmdUeXBlcyA9IC9cIlwiXCIoPzpbXlxcXFxcIl18XCIoPyFcIlwiXFwyKXw8ZXNjPikqXCJcIlwiLy5zb3VyY2UgK1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0J3wnICsgLycnJyg/OlteXFxcXCddfCcoPyEnJ1xcMil8PGVzYz4pKicnJy8uc291cmNlICtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdCd8JyArIC9cIig/OlteXFxcXFxcclxcblwiXXxcIig/IVxcMil8PGVzYz4pKlwiLy5zb3VyY2UgK1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0J3wnICsgLycoPzpbXlxcXFxcXHJcXG4nXXwnKD8hXFwyKXw8ZXNjPikqJy8uc291cmNlO1xuXHR2YXIgc3RyaW5nTGl0ZXJhbCA9ICcoPzonICsgc3RyaW5nVHlwZXMucmVwbGFjZSgvPGVzYz4vZywgc3RyaW5nRXNjYXBlKSArICcpJztcblxuXHRQcmlzbS5sYW5ndWFnZXMuY3VlID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcL1xcLy4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3N0cmluZy1saXRlcmFsJzoge1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKF58W14jXCInXFxcXF0pKCMqKS8uc291cmNlICsgc3RyaW5nTGl0ZXJhbCArIC8oPyFbXCInXSlcXDIvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdC8vIEknbSB1c2luZyBkaXJ0eSBoYWNrIGhlcmUuIFdlIGhhdmUgdG8ga25vdyB0aGUgbnVtYmVyIGhhc2hlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZyBzb21laG93LFxuXHRcdFx0XHQvLyBidXQgd2UgY2FuJ3QgbG9vayBiYWNrLiBTbyBpbnN0ZWFkLCB3ZSB3aWxsIHVzZSBhIGxvb2thaGVhZCwgZ28gdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBhbmRcblx0XHRcdFx0Ly8gY2FwdHVyZSB0aGUgaGFzaGVzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy5cblx0XHRcdFx0J2VzY2FwZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKD89W1xcc1xcU10qW1wiJ10oIyopJClcXFxcXFwxKD86VVthLWZBLUYwLTldezEsOH18dVthLWZBLUYwLTldezEsNH18eFthLWZBLUYwLTldezEsMn18XFxkezIsM318W14oXSkvLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdFx0fSxcblx0XHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyg/PVtcXHNcXFNdKltcIiddKCMqKSQpXFxcXFxcMVxcKFteKCldKlxcKS8sXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXFxcIypcXCh8XFwpJC8sXG5cdFx0XHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogbnVsbFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3JF0pKD86Zm9yfGlmfGltcG9ydHxpbnxsZXR8bnVsbHxwYWNrYWdlKSg/IVtcXHckXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2Jvb2xlYW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHckXSkoPzpmYWxzZXx0cnVlKSg/IVtcXHckXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2J1aWx0aW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHckXSkoPzpib29sfGJ5dGVzfGZsb2F0fGZsb2F0KD86MzJ8NjQpfHU/aW50KD86OHwxNnwzMnw2NHwxMjgpP3xudW1iZXJ8cnVuZXxzdHJpbmcpKD8hW1xcdyRdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdCdhdHRyaWJ1dGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvQFtcXHckXSsoPz1cXHMqXFwoKS8sXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3JF0pW2Etel8kXVtcXHckXSooPz1cXHMqXFwoKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnbnVtYmVyJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3JC5dKSg/OjBiWzAxXSsoPzpfWzAxXSspKnwwb1swLTddKyg/Ol9bMC03XSspKnwwW3hYXVswLTlBLUZhLWZdKyg/Ol9bMC05QS1GYS1mXSspKnwoPzpcXGQrKD86X1xcZCspKig/OlxcLig/OlxcZCsoPzpfXFxkKykqKT8pP3xcXC5cXGQrKD86X1xcZCspKikoPzpbZUVdWystXT9cXGQrKD86X1xcZCspKik/KD86W0tNR1RQXWk/KT8pKD8hW1xcdyRdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdCdvcGVyYXRvcic6IC9cXC57M318X1xcfF98JiY/fFxcfFxcfD98Wz0hXX58Wzw+PSFdPT98WytcXC0qLz9dLyxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpW1xcXXt9LC46XS9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuY3VlWydzdHJpbmctbGl0ZXJhbCddLmluc2lkZS5pbnRlcnBvbGF0aW9uLmluc2lkZS5leHByZXNzaW9uLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5jdWU7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmN5cGhlciA9IHtcblx0Ly8gaHR0cHM6Ly9uZW80ai5jb20vZG9jcy9jeXBoZXItbWFudWFsL2N1cnJlbnQvc3ludGF4L2NvbW1lbnRzL1xuXHQnY29tbWVudCc6IC9cXC9cXC8uKi8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxcXHJcXG5dfFxcXFwuKSpcInwnKD86W14nXFxcXFxcclxcbl18XFxcXC4pKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKDpcXHMqKSg/Olxcdyt8YCg/OlteYFxcXFxcXHJcXG5dKSpgKSg/PVxccypbeyk6XSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdyZWxhdGlvbnNoaXAnOiB7XG5cdFx0cGF0dGVybjogLygtXFxbXFxzKig/OlxcdytcXHMqfGAoPzpbXmBcXFxcXFxyXFxuXSkqYFxccyopPzpcXHMqfFxcfFxccyo6XFxzKikoPzpcXHcrfGAoPzpbXmBcXFxcXFxyXFxuXSkqYCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCdpZGVudGlmaWVyJzoge1xuXHRcdHBhdHRlcm46IC9gKD86W15gXFxcXFxcclxcbl0pKmAvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCd2YXJpYWJsZSc6IC9cXCRcXHcrLyxcblxuXHQvLyBodHRwczovL25lbzRqLmNvbS9kb2NzL2N5cGhlci1tYW51YWwvY3VycmVudC9zeW50YXgvcmVzZXJ2ZWQvXG5cdCdrZXl3b3JkJzogL1xcYig/OkFERHxBTEx8QU5EfEFTfEFTQ3xBU0NFTkRJTkd8QVNTRVJUfEJZfENBTEx8Q0FTRXxDT01NSVR8Q09OU1RSQUlOVHxDT05UQUlOU3xDUkVBVEV8Q1NWfERFTEVURXxERVNDfERFU0NFTkRJTkd8REVUQUNIfERJU1RJTkNUfERPfERST1B8RUxTRXxFTkR8RU5EU3xFWElTVFN8Rk9SfEZPUkVBQ0h8SU58SU5ERVh8SVN8Sk9JTnxLRVl8TElNSVR8TE9BRHxNQU5EQVRPUll8TUFUQ0h8TUVSR0V8Tk9ERXxOT1R8T0Z8T058T1BUSU9OQUx8T1J8T1JERVIoPz1cXHMrQlkpfFBFUklPRElDfFJFTU9WRXxSRVFVSVJFfFJFVFVSTnxTQ0FMQVJ8U0NBTnxTRVR8U0tJUHxTVEFSVHxTVEFSVFN8VEhFTnxVTklPTnxVTklRVUV8VU5XSU5EfFVTSU5HfFdIRU58V0hFUkV8V0lUSHxYT1J8WUlFTEQpXFxiL2ksXG5cblx0J2Z1bmN0aW9uJzogL1xcYlxcdytcXGIoPz1cXHMqXFwoKS8sXG5cblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bnVsbHx0cnVlKVxcYi9pLFxuXHQnbnVtYmVyJzogL1xcYig/OjB4W1xcZGEtZkEtRl0rfFxcZCsoPzpcXC5cXGQrKT8oPzpbZUVdWystXT9cXGQrKT8pXFxiLyxcblx0Ly8gaHR0cHM6Ly9uZW80ai5jb20vZG9jcy9jeXBoZXItbWFudWFsL2N1cnJlbnQvc3ludGF4L29wZXJhdG9ycy9cblx0J29wZXJhdG9yJzogLzp8PC0tP3wtLT8+P3w8Pnw9fj98Wzw+XT0/fFsrKi8lXnxdfFxcLlxcLlxcLj8vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpW1xcXXt9LDsuXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5kID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdjb21tZW50JzogW1xuXHRcdHtcblx0XHRcdC8vIFNoZWJhbmdcblx0XHRcdHBhdHRlcm46IC9eXFxzKiMhLisvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhefFteXFxcXF0pLy5zb3VyY2UgKyAnKD86JyArIFtcblx0XHRcdFx0Ly8gLysgY29tbWVudCArL1xuXHRcdFx0XHQvLyBBbGxvdyBvbmUgbGV2ZWwgb2YgbmVzdGluZ1xuXHRcdFx0XHQvXFwvXFwrKD86XFwvXFwrKD86W14rXXxcXCsoPyFcXC8pKSpcXCtcXC98KD8hXFwvXFwrKVtcXHNcXFNdKSo/XFwrXFwvLy5zb3VyY2UsXG5cdFx0XHRcdC8vIC8vIGNvbW1lbnRcblx0XHRcdFx0L1xcL1xcLy4qLy5zb3VyY2UsXG5cdFx0XHRcdC8vIC8qIGNvbW1lbnQgKi9cblx0XHRcdFx0L1xcL1xcKltcXHNcXFNdKj9cXCpcXC8vLnNvdXJjZVxuXHRcdFx0XS5qb2luKCd8JykgKyAnKScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3N0cmluZyc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoW1xuXHRcdFx0XHQvLyByXCJcIiwgeFwiXCJcblx0XHRcdFx0L1xcYltyeF1cIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwiW2N3ZF0/Ly5zb3VyY2UsXG5cblx0XHRcdFx0Ly8gcVwiW11cIiwgcVwiKClcIiwgcVwiPD5cIiwgcVwie31cIlxuXHRcdFx0XHQvXFxicVwiKD86XFxbW1xcc1xcU10qP1xcXXxcXChbXFxzXFxTXSo/XFwpfDxbXFxzXFxTXSo/PnxcXHtbXFxzXFxTXSo/XFx9KVwiLy5zb3VyY2UsXG5cblx0XHRcdFx0Ly8gcVwiSURFTlRcblx0XHRcdFx0Ly8gLi4uXG5cdFx0XHRcdC8vIElERU5UXCJcblx0XHRcdFx0L1xcYnFcIigoPyFcXGQpXFx3KykkW1xcc1xcU10qP15cXDFcIi8uc291cmNlLFxuXG5cdFx0XHRcdC8vIHFcIi8vXCIsIHFcInx8XCIsIGV0Yy5cblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHRcdFx0L1xcYnFcIiguKVtcXHNcXFNdKj9cXDJcIi8uc291cmNlLFxuXG5cdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0XHRcdC8oW1wiYF0pKD86XFxcXFtcXHNcXFNdfCg/IVxcMylbXlxcXFxdKSpcXDNbY3dkXT8vLnNvdXJjZVxuXHRcdFx0XS5qb2luKCd8JyksICdtJyksXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGJxXFx7KD86XFx7W157fV0qXFx9fFtee31dKSpcXH0vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICd0b2tlbi1zdHJpbmcnXG5cdFx0fVxuXHRdLFxuXG5cdC8vIEluIG9yZGVyOiAkLCBrZXl3b3JkcyBhbmQgc3BlY2lhbCB0b2tlbnMsIGdsb2JhbGx5IGRlZmluZWQgc3ltYm9sc1xuXHQna2V5d29yZCc6IC9cXCR8XFxiKD86X18oPzooPzpEQVRFfEVPRnxGSUxFfEZVTkNUSU9OfExJTkV8TU9EVUxFfFBSRVRUWV9GVU5DVElPTnxUSU1FU1RBTVB8VElNRXxWRU5ET1J8VkVSU0lPTilfX3xnc2hhcmVkfHBhcmFtZXRlcnN8dHJhaXRzfHZlY3Rvcil8YWJzdHJhY3R8YWxpYXN8YWxpZ258YXNtfGFzc2VydHxhdXRvfGJvZHl8Ym9vbHxicmVha3xieXRlfGNhc2V8Y2FzdHxjYXRjaHxjZG91YmxlfGNlbnR8Y2Zsb2F0fGNoYXJ8Y2xhc3N8Y29uc3R8Y29udGludWV8Y3JlYWx8ZGNoYXJ8ZGVidWd8ZGVmYXVsdHxkZWxlZ2F0ZXxkZWxldGV8ZGVwcmVjYXRlZHxkb3xkb3VibGV8ZHN0cmluZ3xlbHNlfGVudW18ZXhwb3J0fGV4dGVybnxmYWxzZXxmaW5hbHxmaW5hbGx5fGZsb2F0fGZvcnxmb3JlYWNofGZvcmVhY2hfcmV2ZXJzZXxmdW5jdGlvbnxnb3RvfGlkb3VibGV8aWZ8aWZsb2F0fGltbXV0YWJsZXxpbXBvcnR8aW5vdXR8aW50fGludGVyZmFjZXxpbnZhcmlhbnR8aXJlYWx8bGF6eXxsb25nfG1hY3JvfG1peGlufG1vZHVsZXxuZXd8bm90aHJvd3xudWxsfG91dHxvdmVycmlkZXxwYWNrYWdlfHByYWdtYXxwcml2YXRlfHByb3RlY3RlZHxwdHJkaWZmX3R8cHVibGljfHB1cmV8cmVhbHxyZWZ8cmV0dXJufHNjb3BlfHNoYXJlZHxzaG9ydHxzaXplX3R8c3RhdGljfHN0cmluZ3xzdHJ1Y3R8c3VwZXJ8c3dpdGNofHN5bmNocm9uaXplZHx0ZW1wbGF0ZXx0aGlzfHRocm93fHRydWV8dHJ5fHR5cGVkZWZ8dHlwZWlkfHR5cGVvZnx1Ynl0ZXx1Y2VudHx1aW50fHVsb25nfHVuaW9ufHVuaXR0ZXN0fHVzaG9ydHx2ZXJzaW9ufHZvaWR8dm9sYXRpbGV8d2NoYXJ8d2hpbGV8d2l0aHx3c3RyaW5nKVxcYi8sXG5cblx0J251bWJlcic6IFtcblx0XHQvLyBUaGUgbG9va2JlaGluZCBhbmQgdGhlIG5lZ2F0aXZlIGxvb2stYWhlYWQgdHJ5IHRvIHByZXZlbnQgYmFkIGhpZ2hsaWdodGluZyBvZiB0aGUgLi4gb3BlcmF0b3Jcblx0XHQvLyBIZXhhZGVjaW1hbCBudW1iZXJzIG11c3QgYmUgaGFuZGxlZCBzZXBhcmF0ZWx5IHRvIGF2b2lkIHByb2JsZW1zIHdpdGggZXhwb25lbnQgXCJlXCJcblx0XHQvXFxiMHhcXC4/W2EtZlxcZF9dKyg/Oig/IVxcLlxcLilcXC5bYS1mXFxkX10qKT8oPzpwWystXT9bYS1mXFxkX10rKT9bdWxmaV17MCw0fS9pLFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oKD86XFwuXFwuKT8pKD86XFxiMGJcXC4/fFxcYnxcXC4pXFxkW1xcZF9dKig/Oig/IVxcLlxcLilcXC5bXFxkX10qKT8oPzplWystXT9cXGRbXFxkX10qKT9bdWxmaV17MCw0fS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblxuXHQnb3BlcmF0b3InOiAvXFx8W3w9XT98JlsmPV0/fFxcK1srPV0/fC1bLT1dP3xcXC4/XFwuXFwufD1bPj1dP3whKD86aVtuc11cXGJ8PD4/PT98Pj0/fD0pP3xcXGJpW25zXVxcYnwoPzo8Wzw+XT98Pj4/Pj98XFxeXFxefFsqXFwvJV5+XSk9Py9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdkJywgJ3N0cmluZycsIHtcblx0Ly8gQ2hhcmFjdGVyc1xuXHQvLyAnYScsICdcXFxcJywgJ1xcbicsICdcXHhGRicsICdcXDM3NycsICdcXHVGRkZGJywgJ1xcVTAwMTBGRkZGJywgJ1xccXVvdCdcblx0J2NoYXInOiAvJyg/OlxcXFwoPzpcXFd8XFx3Kyl8W15cXFxcXSknL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2QnLCAna2V5d29yZCcsIHtcblx0J3Byb3BlcnR5JzogL1xcQkBcXHcqL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2QnLCAnZnVuY3Rpb24nLCB7XG5cdCdyZWdpc3Rlcic6IHtcblx0XHQvLyBJYXNtIHJlZ2lzdGVyc1xuXHRcdHBhdHRlcm46IC9cXGIoPzpbQUJDRF1bTEhYXXxFPyg/OkJQfERJfFNJfFNQKXxbQlNdUEx8W0VDU0RHRl1TfENSWzAyMzRdfFtEU11JTHxEUlswMTIzNjddfEVbQUJDRF1YfFg/TU1bMC03XXxSKD86MVswLTVdfFs4OV0pW0JXRF0/fFJbQUJDRF1YfFJbQlNdUHxSW0RTXUl8VFJbMy03XXxYTU0oPzoxWzAtNV18Wzg5XSl8WU1NKD86MVswLTVdfFxcZCkpXFxifFxcYlNUKD86XFwoWzAtN11cXCl8XFxiKS8sXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fVxufSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0dmFyIGtleXdvcmRzID0gW1xuXHRcdC9cXGIoPzphc3luY3xzeW5jfHlpZWxkKVxcKi8sXG5cdFx0L1xcYig/OmFic3RyYWN0fGFzc2VydHxhc3luY3xhd2FpdHxicmVha3xjYXNlfGNhdGNofGNsYXNzfGNvbnN0fGNvbnRpbnVlfGNvdmFyaWFudHxkZWZhdWx0fGRlZmVycmVkfGRvfGR5bmFtaWN8ZWxzZXxlbnVtfGV4cG9ydHxleHRlbmRzfGV4dGVuc2lvbnxleHRlcm5hbHxmYWN0b3J5fGZpbmFsfGZpbmFsbHl8Zm9yfGdldHxoaWRlfGlmfGltcGxlbWVudHN8aW1wb3J0fGlufGludGVyZmFjZXxsaWJyYXJ5fG1peGlufG5ld3xudWxsfG9ufG9wZXJhdG9yfHBhcnR8cmV0aHJvd3xyZXR1cm58c2V0fHNob3d8c3RhdGljfHN1cGVyfHN3aXRjaHxzeW5jfHRoaXN8dGhyb3d8dHJ5fHR5cGVkZWZ8dmFyfHZvaWR8d2hpbGV8d2l0aHx5aWVsZClcXGIvXG5cdF07XG5cblx0Ly8gSGFuZGxlcyBuYW1lZCBpbXBvcnRzLCBzdWNoIGFzIGh0dHAuQ2xpZW50XG5cdHZhciBwYWNrYWdlUHJlZml4ID0gLyhefFteXFx3Ll0pKD86W2Etel1cXHcqXFxzKlxcLlxccyopKig/OltBLVpdXFx3KlxccypcXC5cXHMqKSovLnNvdXJjZTtcblxuXHQvLyBiYXNlZCBvbiB0aGUgZGFydCBuYW1pbmcgY29udmVudGlvbnNcblx0dmFyIGNsYXNzTmFtZSA9IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAocGFja2FnZVByZWZpeCArIC9bQS1aXSg/OltcXGRfQS1aXSpbYS16XVxcdyopP1xcYi8uc291cmNlKSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J25hbWVzcGFjZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL15bYS16XVxcdyooPzpcXHMqXFwuXFxzKlthLXpdXFx3KikqKD86XFxzKlxcLik/Lyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmRhcnQgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdGNsYXNzTmFtZSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gdmFyaWFibGVzIGFuZCBwYXJhbWV0ZXJzXG5cdFx0XHRcdC8vIHRoaXMgdG8gc3VwcG9ydCBjbGFzcyBuYW1lcyAob3IgZ2VuZXJpYyBwYXJhbWV0ZXJzKSB3aGljaCBkbyBub3QgY29udGFpbiBhIGxvd2VyIGNhc2UgbGV0dGVyIChhbHNvIHdvcmtzIGZvciBtZXRob2RzKVxuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAocGFja2FnZVByZWZpeCArIC9bQS1aXVxcdyooPz1cXHMrXFx3K1xccypbOyw9KCldKS8uc291cmNlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBjbGFzc05hbWUuaW5zaWRlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdCdvcGVyYXRvcic6IC9cXGJpcyF8XFxiKD86YXN8aXMpXFxifFxcK1xcK3wtLXwmJnxcXHxcXHx8PDw9P3w+Pj0/fH4oPzpcXC89Pyk/fFsrXFwtKlxcLyUmXnw9ITw+XT0/fFxcPy9cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZGFydCcsICdzdHJpbmcnLCB7XG5cdFx0J3N0cmluZy1saXRlcmFsJzoge1xuXHRcdFx0cGF0dGVybjogL3I/KD86KFwiXCJcInwnJycpW1xcc1xcU10qP1xcMXwoW1wiJ10pKD86XFxcXC58KD8hXFwyKVteXFxcXFxcclxcbl0pKlxcMig/IVxcMikpLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopXFwkKD86XFx3K3xcXHsoPzpbXnt9XXxcXHtbXnt9XSpcXH0pKlxcfSkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcJFxcez98XFx9JC8sXG5cdFx0XHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmRhcnRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHVuZGVmaW5lZFxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdkYXJ0JywgJ2NsYXNzLW5hbWUnLCB7XG5cdFx0J21ldGFkYXRhJzoge1xuXHRcdFx0cGF0dGVybjogL0BcXHcrLyxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdkYXJ0JywgJ2NsYXNzLW5hbWUnLCB7XG5cdFx0J2dlbmVyaWNzJzoge1xuXHRcdFx0cGF0dGVybjogLzwoPzpbXFx3XFxzLC4mP118PCg/OltcXHdcXHMsLiY/XXw8KD86W1xcd1xccywuJj9dfDxbXFx3XFxzLC4mP10qPikqPikqPikqPi8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NsYXNzLW5hbWUnOiBjbGFzc05hbWUsXG5cdFx0XHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bPD4oKSwuOl0vLFxuXHRcdFx0XHQnb3BlcmF0b3InOiAvWz8mfF0vXG5cdFx0XHR9XG5cdFx0fSxcblx0fSk7XG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0UHJpc20ubGFuZ3VhZ2VzLmRhdGF3ZWF2ZSA9IHtcblx0XHQndXJsJzogL1xcYltBLVphLXpdKzpcXC9cXC9bXFx3LzouPz0mLV0rfFxcYnVybjpbXFx3Oi4/PSYtXSsvLFxuXHRcdCdwcm9wZXJ0eSc6IHtcblx0XHRcdHBhdHRlcm46IC8oPzpcXGJcXHcrIyk/KD86XCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwifFxcYlxcdyspKD89XFxzKls6QF0pLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oW1wiJ2BdKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkqXFwxLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J21pbWUtdHlwZSc6IC9cXGIoPzphcHBsaWNhdGlvbnxhdWRpb3xpbWFnZXxtdWx0aXBhcnR8dGV4dHx2aWRlbylcXC9bXFx3Ky1dKy8sXG5cdFx0J2RhdGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFx8W1xcdzorLV0rXFx8Lyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2NvbW1lbnQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFw6XSlcXC9cXC8uKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3JlZ2V4Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcLyg/OlteXFxcXFxcL1xcclxcbl18XFxcXFteXFxyXFxuXSkrXFwvLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86YW5kfGFzfGF0fGNhc2V8ZG98ZWxzZXxmdW58aWZ8aW5wdXR8aXN8bWF0Y2h8bm90fG5zfG51bGx8b3J8b3V0cHV0fHR5cGV8dW5sZXNzfHVwZGF0ZXx1c2luZ3x2YXIpXFxiLyxcblx0XHQnZnVuY3Rpb24nOiAvXFxiW0EtWl9dXFx3Kig/PVxccypcXCgpL2ksXG5cdFx0J251bWJlcic6IC8tP1xcYlxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT9cXGIvaSxcblx0XHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOkBdLyxcblx0XHQnb3BlcmF0b3InOiAvPDx8Pj58LT58Wzw+fj1dPT98IT18LS0/LT98XFwrXFwrP3whfFxcPy8sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHR9O1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5kYXggPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OlxcL1xcKltcXHNcXFNdKj9cXCpcXC98KD86LS18XFwvXFwvKS4qKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnZGF0YS1maWVsZCc6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlteJ118JycpKicoPyEnKSg/OlxcW1sgXFx3XFx4QTAtXFx1RkZGRl0rXFxdKT98XFx3K1xcW1sgXFx3XFx4QTAtXFx1RkZGRl0rXFxdLyxcblx0XHRhbGlhczogJ3N5bWJvbCdcblx0fSxcblx0J21lYXN1cmUnOiB7XG5cdFx0cGF0dGVybjogL1xcW1sgXFx3XFx4QTAtXFx1RkZGRl0rXFxdLyxcblx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXCJdfFwiXCIpKlwiKD8hXCIpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2Z1bmN0aW9uJzogL1xcYig/OkFCU3xBQ09TfEFDT1NIfEFDT1R8QUNPVEh8QUREQ09MVU1OU3xBRERNSVNTSU5HSVRFTVN8QUxMfEFMTENST1NTRklMVEVSRUR8QUxMRVhDRVBUfEFMTE5PQkxBTktST1d8QUxMU0VMRUNURUR8QU5EfEFQUFJPWElNQVRFRElTVElOQ1RDT1VOVHxBU0lOfEFTSU5IfEFUQU58QVRBTkh8QVZFUkFHRXxBVkVSQUdFQXxBVkVSQUdFWHxCRVRBXFwuRElTVHxCRVRBXFwuSU5WfEJMQU5LfENBTENVTEFURXxDQUxDVUxBVEVUQUJMRXxDQUxFTkRBUnxDQUxFTkRBUkFVVE98Q0VJTElOR3xDSElTUVxcLkRJU1R8Q0hJU1FcXC5ESVNUXFwuUlR8Q0hJU1FcXC5JTlZ8Q0hJU1FcXC5JTlZcXC5SVHxDTE9TSU5HQkFMQU5DRU1PTlRIfENMT1NJTkdCQUxBTkNFUVVBUlRFUnxDTE9TSU5HQkFMQU5DRVlFQVJ8Q09BTEVTQ0V8Q09NQklOfENPTUJJTkF8Q09NQklORVZBTFVFU3xDT05DQVRFTkFURXxDT05DQVRFTkFURVh8Q09ORklERU5DRVxcLk5PUk18Q09ORklERU5DRVxcLlR8Q09OVEFJTlN8Q09OVEFJTlNST1d8Q09OVEFJTlNTVFJJTkd8Q09OVEFJTlNTVFJJTkdFWEFDVHxDT05WRVJUfENPU3xDT1NIfENPVHxDT1RIfENPVU5UfENPVU5UQXxDT1VOVEFYfENPVU5UQkxBTkt8Q09VTlRST1dTfENPVU5UWHxDUk9TU0ZJTFRFUnxDUk9TU0pPSU58Q1VSUkVOQ1l8Q1VSUkVOVEdST1VQfENVU1RPTURBVEF8REFUQVRBQkxFfERBVEV8REFURUFERHxEQVRFRElGRnxEQVRFU0JFVFdFRU58REFURVNJTlBFUklPRHxEQVRFU01URHxEQVRFU1FURHxEQVRFU1lURHxEQVRFVkFMVUV8REFZfERFR1JFRVN8REVUQUlMUk9XU3xESVNUSU5DVHxESVNUSU5DVENPVU5UfERJU1RJTkNUQ09VTlROT0JMQU5LfERJVklERXxFQVJMSUVSfEVBUkxJRVNUfEVEQVRFfEVORE9GTU9OVEh8RU5ET0ZRVUFSVEVSfEVORE9GWUVBUnxFT01PTlRIfEVSUk9SfEVWRU58RVhBQ1R8RVhDRVBUfEVYUHxFWFBPTlxcLkRJU1R8RkFDVHxGQUxTRXxGSUxURVJ8RklMVEVSU3xGSU5EfEZJUlNUREFURXxGSVJTVE5PTkJMQU5LfEZJUlNUTk9OQkxBTktWQUxVRXxGSVhFRHxGTE9PUnxGT1JNQVR8R0NEfEdFTkVSQVRFfEdFTkVSQVRFQUxMfEdFTkVSQVRFU0VSSUVTfEdFT01FQU58R0VPTUVBTlh8R1JPVVBCWXxIQVNPTkVGSUxURVJ8SEFTT05FVkFMVUV8SE9VUnxJRnxJRlxcLkVBR0VSfElGRVJST1J8SUdOT1JFfElOVHxJTlRFUlNFQ1R8SVNCTEFOS3xJU0NST1NTRklMVEVSRUR8SVNFTVBUWXxJU0VSUk9SfElTRVZFTnxJU0ZJTFRFUkVEfElTSU5TQ09QRXxJU0xPR0lDQUx8SVNOT05URVhUfElTTlVNQkVSfElTT1xcLkNFSUxJTkd8SVNPRER8SVNPTk9SQUZURVJ8SVNTRUxFQ1RFRE1FQVNVUkV8SVNTVUJUT1RBTHxJU1RFWFR8S0VFUEZJTFRFUlN8S0VZV09SRE1BVENIfExBU1REQVRFfExBU1ROT05CTEFOS3xMQVNUTk9OQkxBTktWQUxVRXxMQ018TEVGVHxMRU58TE58TE9HfExPRzEwfExPT0tVUFZBTFVFfExPV0VSfE1BWHxNQVhBfE1BWFh8TUVESUFOfE1FRElBTlh8TUlEfE1JTnxNSU5BfE1JTlVURXxNSU5YfE1PRHxNT05USHxNUk9VTkR8TkFUVVJBTElOTkVSSk9JTnxOQVRVUkFMTEVGVE9VVEVSSk9JTnxORVhUREFZfE5FWFRNT05USHxORVhUUVVBUlRFUnxORVhUWUVBUnxOT05WSVNVQUx8Tk9STVxcLkRJU1R8Tk9STVxcLklOVnxOT1JNXFwuU1xcLkRJU1R8Tk9STVxcLlNcXC5JTlZ8Tk9UfE5PV3xPRER8T1BFTklOR0JBTEFOQ0VNT05USHxPUEVOSU5HQkFMQU5DRVFVQVJURVJ8T1BFTklOR0JBTEFOQ0VZRUFSfE9SfFBBUkFMTEVMUEVSSU9EfFBBVEh8UEFUSENPTlRBSU5TfFBBVEhJVEVNfFBBVEhJVEVNUkVWRVJTRXxQQVRITEVOR1RIfFBFUkNFTlRJTEVcXC5FWEN8UEVSQ0VOVElMRVxcLklOQ3xQRVJDRU5USUxFWFxcLkVYQ3xQRVJDRU5USUxFWFxcLklOQ3xQRVJNVVR8UEl8UE9JU1NPTlxcLkRJU1R8UE9XRVJ8UFJFVklPVVNEQVl8UFJFVklPVVNNT05USHxQUkVWSU9VU1FVQVJURVJ8UFJFVklPVVNZRUFSfFBST0RVQ1R8UFJPRFVDVFh8UVVBUlRFUnxRVU9USUVOVHxSQURJQU5TfFJBTkR8UkFOREJFVFdFRU58UkFOS1xcLkVRfFJBTktYfFJFTEFURUR8UkVMQVRFRFRBQkxFfFJFTU9WRUZJTFRFUlN8UkVQTEFDRXxSRVBUfFJJR0hUfFJPTExVUHxST0xMVVBBRERJU1NVQlRPVEFMfFJPTExVUEdST1VQfFJPTExVUElTU1VCVE9UQUx8Uk9VTkR8Uk9VTkRET1dOfFJPVU5EVVB8Uk9XfFNBTUVQRVJJT0RMQVNUWUVBUnxTQU1QTEV8U0VBUkNIfFNFQ09ORHxTRUxFQ1RDT0xVTU5TfFNFTEVDVEVETUVBU1VSRXxTRUxFQ1RFRE1FQVNVUkVGT1JNQVRTVFJJTkd8U0VMRUNURURNRUFTVVJFTkFNRXxTRUxFQ1RFRFZBTFVFfFNJR058U0lOfFNJTkh8U1FSVHxTUVJUUEl8U1RBUlRPRk1PTlRIfFNUQVJUT0ZRVUFSVEVSfFNUQVJUT0ZZRUFSfFNUREVWXFwuUHxTVERFVlxcLlN8U1RERVZYXFwuUHxTVERFVlhcXC5TfFNVQlNUSVRVVEV8U1VCU1RJVFVURVdJVEhJTkRFWHxTVU18U1VNTUFSSVpFfFNVTU1BUklaRUNPTFVNTlN8U1VNWHxTV0lUQ0h8VFxcLkRJU1R8VFxcLkRJU1RcXC4yVHxUXFwuRElTVFxcLlJUfFRcXC5JTlZ8VFxcLklOVlxcLjJUfFRBTnxUQU5IfFRJTUV8VElNRVZBTFVFfFRPREFZfFRPUE58VE9QTlBFUkxFVkVMfFRPUE5TS0lQfFRPVEFMTVREfFRPVEFMUVREfFRPVEFMWVREfFRSRUFUQVN8VFJJTXxUUlVFfFRSVU5DfFVOSUNIQVJ8VU5JQ09ERXxVTklPTnxVUFBFUnxVU0VSRUxBVElPTlNISVB8VVNFUk5BTUV8VVNFUk9CSkVDVElEfFVTRVJQUklOQ0lQQUxOQU1FfFVUQ05PV3xVVENUT0RBWXxWQUxVRXxWQUxVRVN8VkFSXFwuUHxWQVJcXC5TfFZBUlhcXC5QfFZBUlhcXC5TfFdFRUtEQVl8V0VFS05VTXxYSVJSfFhOUFZ8WUVBUnxZRUFSRlJBQykoPz1cXHMqXFwoKS9pLFxuXHQna2V5d29yZCc6IC9cXGIoPzpERUZJTkV8RVZBTFVBVEV8TUVBU1VSRXxPUkRFUlxccytCWXxSRVRVUk58VkFSfFNUQVJUXFxzK0FUfEFTQ3xERVNDKVxcYi9pLFxuXHQnYm9vbGVhbic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86RkFMU0V8TlVMTHxUUlVFKVxcYi9pLFxuXHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdH0sXG5cdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrXFxiLyxcblx0J29wZXJhdG9yJzogLzo9fFstKypcXC89Xl18JiY/fFxcfFxcfHw8KD86PT4/fDx8Pik/fD5bPj1dP3xcXGIoPzpJTnxOT1QpXFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9bO1xcW1xcXSgpe31gLC5dL1xufTtcblxuLy8gQUJORiBncmFtbWFyOlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RoYWxsLWxhbmcvZGhhbGwtbGFuZy9ibG9iL21hc3Rlci9zdGFuZGFyZC9kaGFsbC5hYm5mXG5cblByaXNtLmxhbmd1YWdlcy5kaGFsbCA9IHtcblx0Ly8gTXVsdGktbGluZSBjb21tZW50cyBjYW4gYmUgbmVzdGVkLiBFLmcuIHstIGZvbyB7LSBiYXIgLX0gLX1cblx0Ly8gVGhlIG11bHRpLWxpbmUgcGF0dGVybiBpcyBlc3NlbnRpYWxseSB0aGlzOlxuXHQvLyAgIFxcey0oPzpbXi17XXwtKD8hXFx9KXxcXHsoPyEtKXw8U0VMRj4pKi1cXH1cblx0J2NvbW1lbnQnOiAvLS0uKnxcXHstKD86W14te118LSg/IVxcfSl8XFx7KD8hLSl8XFx7LSg/OlteLXtdfC0oPyFcXH0pfFxceyg/IS0pKSotXFx9KSotXFx9Lyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXF18XFxcXC4pKlwifCcnKD86W14nXXwnKD8hJyl8JycnfCcnXFwkXFx7KSonJyg/ISd8XFwkKS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCRcXHtbXnt9XSpcXH0vLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcJFxceylbXFxzXFxTXSsoPz1cXH0kKS8sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1kaGFsbCcsXG5cdFx0XHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJsb3dcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXCRcXHt8XFx9L1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQnbGFiZWwnOiB7XG5cdFx0cGF0dGVybjogL2BbXmBdKmAvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndXJsJzoge1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kaGFsbC1sYW5nL2RoYWxsLWxhbmcvYmxvYi81ZmRlOGVmMWJlYWQ2ZmI0ZTk5OWQzYzFmZmU3MDQ0Y2QwMTlkNjNhL3N0YW5kYXJkL2RoYWxsLmFibmYjTDU5NlxuXHRcdHBhdHRlcm46IC9cXGJodHRwcz86XFwvXFwvW1xcdy46JSEkJicqKzs9QH4tXSsoPzpcXC9bXFx3LjolISQmJyorOz1Afi1dKikqKD86XFw/Wy8/XFx3LjolISQmJyorOz1Afi1dKik/Lyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2Vudic6IHtcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vZGhhbGwtbGFuZy9kaGFsbC1sYW5nL2Jsb2IvNWZkZThlZjFiZWFkNmZiNGU5OTlkM2MxZmZlNzA0NGNkMDE5ZDYzYS9zdGFuZGFyZC9kaGFsbC5hYm5mI0w2NjFcblx0XHRwYXR0ZXJuOiAvXFxiZW52Oig/Oig/IVxcZClcXHcrfFwiKD86W15cIlxcXFw9XXxcXFxcLikqXCIpLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZnVuY3Rpb24nOiAvXmVudi8sXG5cdFx0XHQnb3BlcmF0b3InOiAvXjovLFxuXHRcdFx0J3ZhcmlhYmxlJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH0sXG5cdCdoYXNoJzoge1xuXHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kaGFsbC1sYW5nL2RoYWxsLWxhbmcvYmxvYi81ZmRlOGVmMWJlYWQ2ZmI0ZTk5OWQzYzFmZmU3MDQ0Y2QwMTlkNjNhL3N0YW5kYXJkL2RoYWxsLmFibmYjTDcyNVxuXHRcdHBhdHRlcm46IC9cXGJzaGEyNTY6W1xcZGEtZkEtRl17NjR9XFxiLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdmdW5jdGlvbic6IC9zaGEyNTYvLFxuXHRcdFx0J29wZXJhdG9yJzogLzovLFxuXHRcdFx0J251bWJlcic6IC9bXFxkYS1mQS1GXXs2NH0vXG5cdFx0fVxuXHR9LFxuXG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kaGFsbC1sYW5nL2RoYWxsLWxhbmcvYmxvYi81ZmRlOGVmMWJlYWQ2ZmI0ZTk5OWQzYzFmZmU3MDQ0Y2QwMTlkNjNhL3N0YW5kYXJkL2RoYWxsLmFibmYjTDM1OVxuXHQna2V5d29yZCc6IC9cXGIoPzphc3xhc3NlcnR8ZWxzZXxmb3JhbGx8aWZ8aW58bGV0fG1lcmdlfG1pc3Npbmd8dGhlbnx0b01hcHx1c2luZ3x3aXRoKVxcYnxcXHUyMjAwLyxcblx0J2J1aWx0aW4nOiAvXFxiKD86Tm9uZXxTb21lKVxcYi8sXG5cblx0J2Jvb2xlYW4nOiAvXFxiKD86RmFsc2V8VHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogL1xcYk5hTlxcYnwtP1xcYkluZmluaXR5XFxifFsrLV0/XFxiKD86MHhbXFxkYS1mQS1GXSt8XFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspPylcXGIvLFxuXHQnb3BlcmF0b3InOiAvXFwvXFxcXHxcXC9cXC9cXFxcXFxcXHwmJnxcXHxcXHx8PT09fFshPV09fFxcL1xcL3wtPnxcXCtcXCt8Ojp8WysqI0A9Oj88PnxcXFxcXFx1MjIyN1xcdTJhNTNcXHUyMjYxXFx1MmFmZFxcdTAzYmJcXHUyMTkyXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9cXC5cXC58W3t9XFxbXFxdKCksLi9dLyxcblxuXHQvLyB3ZSdsbCBqdXN0IGFzc3VtZSB0aGF0IGV2ZXJ5IGNhcGl0YWwgd29yZCBsZWZ0IGlzIGEgdHlwZSBuYW1lXG5cdCdjbGFzcy1uYW1lJzogL1xcYltBLVpdXFx3KlxcYi9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5kaGFsbC5zdHJpbmcuaW5zaWRlLmludGVycG9sYXRpb24uaW5zaWRlLmV4cHJlc3Npb24uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLmRoYWxsO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmRpZmYgPSB7XG5cdFx0J2Nvb3JkJzogW1xuXHRcdFx0Ly8gTWF0Y2ggYWxsIGtpbmRzIG9mIGNvb3JkIGxpbmVzIChwcmVmaXhlZCBieSBcIisrK1wiLCBcIi0tLVwiIG9yIFwiKioqXCIpLlxuXHRcdFx0L14oPzpcXCp7M318LXszfXxcXCt7M30pLiokL20sXG5cdFx0XHQvLyBNYXRjaCBcIkBAIC4uLiBAQFwiIGNvb3JkIGxpbmVzIGluIHVuaWZpZWQgZGlmZi5cblx0XHRcdC9eQEAuKkBAJC9tLFxuXHRcdFx0Ly8gTWF0Y2ggY29vcmQgbGluZXMgaW4gbm9ybWFsIGRpZmYgKHN0YXJ0cyB3aXRoIGEgbnVtYmVyKS5cblx0XHRcdC9eXFxkLiokL21cblx0XHRdXG5cblx0XHQvLyBkZWxldGVkLCBpbnNlcnRlZCwgdW5jaGFuZ2VkLCBkaWZmXG5cdH07XG5cblx0LyoqXG5cdCAqIEEgbWFwIGZyb20gdGhlIG5hbWUgb2YgYSBibG9jayB0byBpdHMgbGluZSBwcmVmaXguXG5cdCAqXG5cdCAqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fVxuXHQgKi9cblx0dmFyIFBSRUZJWEVTID0ge1xuXHRcdCdkZWxldGVkLXNpZ24nOiAnLScsXG5cdFx0J2RlbGV0ZWQtYXJyb3cnOiAnPCcsXG5cdFx0J2luc2VydGVkLXNpZ24nOiAnKycsXG5cdFx0J2luc2VydGVkLWFycm93JzogJz4nLFxuXHRcdCd1bmNoYW5nZWQnOiAnICcsXG5cdFx0J2RpZmYnOiAnIScsXG5cdH07XG5cblx0Ly8gYWRkIGEgdG9rZW4gZm9yIGVhY2ggcHJlZml4XG5cdE9iamVjdC5rZXlzKFBSRUZJWEVTKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG5cdFx0dmFyIHByZWZpeCA9IFBSRUZJWEVTW25hbWVdO1xuXG5cdFx0dmFyIGFsaWFzID0gW107XG5cdFx0aWYgKCEvXlxcdyskLy50ZXN0KG5hbWUpKSB7IC8vIFwiZGVsZXRlZC1zaWduXCIgLT4gXCJkZWxldGVkXCJcblx0XHRcdGFsaWFzLnB1c2goL1xcdysvLmV4ZWMobmFtZSlbMF0pO1xuXHRcdH1cblx0XHRpZiAobmFtZSA9PT0gJ2RpZmYnKSB7XG5cdFx0XHRhbGlhcy5wdXNoKCdib2xkJyk7XG5cdFx0fVxuXG5cdFx0UHJpc20ubGFuZ3VhZ2VzLmRpZmZbbmFtZV0gPSB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJ14oPzpbJyArIHByZWZpeCArICddLiooPzpcXHJcXG4/fFxcbnwoPyFbXFxcXHNcXFxcU10pKSkrJywgJ20nKSxcblx0XHRcdGFsaWFzOiBhbGlhcyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnbGluZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKC4pKD89W1xcc1xcU10pLiooPzpcXHJcXG4/fFxcbik/Lyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwcmVmaXgnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdLyxcblx0XHRcdFx0XHRhbGlhczogL1xcdysvLmV4ZWMobmFtZSlbMF1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cblx0fSk7XG5cblx0Ly8gbWFrZSBwcmVmaXhlcyBhdmFpbGFibGUgdG8gRGlmZiBwbHVnaW5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KFByaXNtLmxhbmd1YWdlcy5kaWZmLCAnUFJFRklYRVMnLCB7XG5cdFx0dmFsdWU6IFBSRUZJWEVTXG5cdH0pO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcGxhY2Vob2xkZXIgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZSBpZCBhbmQgaW5kZXguXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZVxuXHQgKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGluZGV4XG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRQbGFjZWhvbGRlcihsYW5ndWFnZSwgaW5kZXgpIHtcblx0XHRyZXR1cm4gJ19fXycgKyBsYW5ndWFnZS50b1VwcGVyQ2FzZSgpICsgaW5kZXggKyAnX19fJztcblx0fVxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXSA9IHt9LCB7XG5cdFx0YnVpbGRQbGFjZWhvbGRlcnM6IHtcblx0XHRcdC8qKlxuXHRcdFx0ICogVG9rZW5pemUgYWxsIGlubGluZSB0ZW1wbGF0aW5nIGV4cHJlc3Npb25zIG1hdGNoaW5nIGBwbGFjZWhvbGRlclBhdHRlcm5gLlxuXHRcdFx0ICpcblx0XHRcdCAqIElmIGByZXBsYWNlRmlsdGVyYCBpcyBwcm92aWRlZCwgb25seSBtYXRjaGVzIG9mIGBwbGFjZWhvbGRlclBhdHRlcm5gIGZvciB3aGljaCBgcmVwbGFjZUZpbHRlcmAgcmV0dXJuc1xuXHRcdFx0ICogYHRydWVgIHdpbGwgYmUgcmVwbGFjZWQuXG5cdFx0XHQgKlxuXHRcdFx0ICogQHBhcmFtIHtvYmplY3R9IGVudiBUaGUgZW52aXJvbm1lbnQgb2YgdGhlIGBiZWZvcmUtdG9rZW5pemVgIGhvb2suXG5cdFx0XHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgVGhlIGxhbmd1YWdlIGlkLlxuXHRcdFx0ICogQHBhcmFtIHtSZWdFeHB9IHBsYWNlaG9sZGVyUGF0dGVybiBUaGUgbWF0Y2hlcyBvZiB0aGlzIHBhdHRlcm4gd2lsbCBiZSByZXBsYWNlZCBieSBwbGFjZWhvbGRlcnMuXG5cdFx0XHQgKiBAcGFyYW0geyhtYXRjaDogc3RyaW5nKSA9PiBib29sZWFufSBbcmVwbGFjZUZpbHRlcl1cblx0XHRcdCAqL1xuXHRcdFx0dmFsdWU6IGZ1bmN0aW9uIChlbnYsIGxhbmd1YWdlLCBwbGFjZWhvbGRlclBhdHRlcm4sIHJlcGxhY2VGaWx0ZXIpIHtcblx0XHRcdFx0aWYgKGVudi5sYW5ndWFnZSAhPT0gbGFuZ3VhZ2UpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgdG9rZW5TdGFjayA9IGVudi50b2tlblN0YWNrID0gW107XG5cblx0XHRcdFx0ZW52LmNvZGUgPSBlbnYuY29kZS5yZXBsYWNlKHBsYWNlaG9sZGVyUGF0dGVybiwgZnVuY3Rpb24gKG1hdGNoKSB7XG5cdFx0XHRcdFx0aWYgKHR5cGVvZiByZXBsYWNlRmlsdGVyID09PSAnZnVuY3Rpb24nICYmICFyZXBsYWNlRmlsdGVyKG1hdGNoKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHR2YXIgaSA9IHRva2VuU3RhY2subGVuZ3RoO1xuXHRcdFx0XHRcdHZhciBwbGFjZWhvbGRlcjtcblxuXHRcdFx0XHRcdC8vIENoZWNrIGZvciBleGlzdGluZyBzdHJpbmdzXG5cdFx0XHRcdFx0d2hpbGUgKGVudi5jb2RlLmluZGV4T2YocGxhY2Vob2xkZXIgPSBnZXRQbGFjZWhvbGRlcihsYW5ndWFnZSwgaSkpICE9PSAtMSkge1xuXHRcdFx0XHRcdFx0KytpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIENyZWF0ZSBhIHNwYXJzZSBhcnJheVxuXHRcdFx0XHRcdHRva2VuU3RhY2tbaV0gPSBtYXRjaDtcblxuXHRcdFx0XHRcdHJldHVybiBwbGFjZWhvbGRlcjtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Ly8gU3dpdGNoIHRoZSBncmFtbWFyIHRvIG1hcmt1cFxuXHRcdFx0XHRlbnYuZ3JhbW1hciA9IFByaXNtLmxhbmd1YWdlcy5tYXJrdXA7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR0b2tlbml6ZVBsYWNlaG9sZGVyczoge1xuXHRcdFx0LyoqXG5cdFx0XHQgKiBSZXBsYWNlIHBsYWNlaG9sZGVycyB3aXRoIHByb3BlciB0b2tlbnMgYWZ0ZXIgdG9rZW5pemluZy5cblx0XHRcdCAqXG5cdFx0XHQgKiBAcGFyYW0ge29iamVjdH0gZW52IFRoZSBlbnZpcm9ubWVudCBvZiB0aGUgYGFmdGVyLXRva2VuaXplYCBob29rLlxuXHRcdFx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlIFRoZSBsYW5ndWFnZSBpZC5cblx0XHRcdCAqL1xuXHRcdFx0dmFsdWU6IGZ1bmN0aW9uIChlbnYsIGxhbmd1YWdlKSB7XG5cdFx0XHRcdGlmIChlbnYubGFuZ3VhZ2UgIT09IGxhbmd1YWdlIHx8ICFlbnYudG9rZW5TdGFjaykge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN3aXRjaCB0aGUgZ3JhbW1hciBiYWNrXG5cdFx0XHRcdGVudi5ncmFtbWFyID0gUHJpc20ubGFuZ3VhZ2VzW2xhbmd1YWdlXTtcblxuXHRcdFx0XHR2YXIgaiA9IDA7XG5cdFx0XHRcdHZhciBrZXlzID0gT2JqZWN0LmtleXMoZW52LnRva2VuU3RhY2spO1xuXG5cdFx0XHRcdGZ1bmN0aW9uIHdhbGtUb2tlbnModG9rZW5zKSB7XG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdC8vIGFsbCBwbGFjZWhvbGRlcnMgYXJlIHJlcGxhY2VkIGFscmVhZHlcblx0XHRcdFx0XHRcdGlmIChqID49IGtleXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR2YXIgdG9rZW4gPSB0b2tlbnNbaV07XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJyB8fCAodG9rZW4uY29udGVudCAmJiB0eXBlb2YgdG9rZW4uY29udGVudCA9PT0gJ3N0cmluZycpKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBrID0ga2V5c1tqXTtcblx0XHRcdFx0XHRcdFx0dmFyIHQgPSBlbnYudG9rZW5TdGFja1trXTtcblx0XHRcdFx0XHRcdFx0dmFyIHMgPSB0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnID8gdG9rZW4gOiB0b2tlbi5jb250ZW50O1xuXHRcdFx0XHRcdFx0XHR2YXIgcGxhY2Vob2xkZXIgPSBnZXRQbGFjZWhvbGRlcihsYW5ndWFnZSwgayk7XG5cblx0XHRcdFx0XHRcdFx0dmFyIGluZGV4ID0gcy5pbmRleE9mKHBsYWNlaG9sZGVyKTtcblx0XHRcdFx0XHRcdFx0aWYgKGluZGV4ID4gLTEpIHtcblx0XHRcdFx0XHRcdFx0XHQrK2o7XG5cblx0XHRcdFx0XHRcdFx0XHR2YXIgYmVmb3JlID0gcy5zdWJzdHJpbmcoMCwgaW5kZXgpO1xuXHRcdFx0XHRcdFx0XHRcdHZhciBtaWRkbGUgPSBuZXcgUHJpc20uVG9rZW4obGFuZ3VhZ2UsIFByaXNtLnRva2VuaXplKHQsIGVudi5ncmFtbWFyKSwgJ2xhbmd1YWdlLScgKyBsYW5ndWFnZSwgdCk7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIGFmdGVyID0gcy5zdWJzdHJpbmcoaW5kZXggKyBwbGFjZWhvbGRlci5sZW5ndGgpO1xuXG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJlcGxhY2VtZW50ID0gW107XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGJlZm9yZSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVwbGFjZW1lbnQucHVzaC5hcHBseShyZXBsYWNlbWVudCwgd2Fsa1Rva2VucyhbYmVmb3JlXSkpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRyZXBsYWNlbWVudC5wdXNoKG1pZGRsZSk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKGFmdGVyKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXBsYWNlbWVudC5wdXNoLmFwcGx5KHJlcGxhY2VtZW50LCB3YWxrVG9rZW5zKFthZnRlcl0pKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdFx0XHRcdFx0dG9rZW5zLnNwbGljZS5hcHBseSh0b2tlbnMsIFtpLCAxXS5jb25jYXQocmVwbGFjZW1lbnQpKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0dG9rZW4uY29udGVudCA9IHJlcGxhY2VtZW50O1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0b2tlbi5jb250ZW50IC8qICYmIHR5cGVvZiB0b2tlbi5jb250ZW50ICE9PSAnc3RyaW5nJyAqLykge1xuXHRcdFx0XHRcdFx0XHR3YWxrVG9rZW5zKHRva2VuLmNvbnRlbnQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0b2tlbnM7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR3YWxrVG9rZW5zKGVudi50b2tlbnMpO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cbn0oUHJpc20pKTtcblxuLy8gRGphbmdvL0ppbmphMiBzeW50YXggZGVmaW5pdGlvbiBmb3IgUHJpc20uanMgPGh0dHA6Ly9wcmlzbWpzLmNvbT4gc3ludGF4IGhpZ2hsaWdodGVyLlxuLy8gTW9zdGx5IGl0IHdvcmtzIE9LIGJ1dCBjYW4gcGFpbnQgY29kZSBpbmNvcnJlY3RseSBvbiBjb21wbGV4IGh0bWwvdGVtcGxhdGUgdGFnIGNvbWJpbmF0aW9ucy5cblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy5kamFuZ28gPSB7XG5cdFx0J2NvbW1lbnQnOiAvXlxceyNbXFxzXFxTXSo/I1xcfSQvLFxuXHRcdCd0YWcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5cXHslWystXT9cXHMqKVxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlxce1t7JV1bKy1dP3xbKy1dP1t9JV1cXH0kLyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyhcInwnKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnZmlsdGVyJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXHwpXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCd0ZXN0Jzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGJpc1xccysoPzpub3RcXHMrKT8pKD8hbm90XFxiKVxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kyg/PVxccypcXCgpL2ksXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86YW5kfGFzfGJ5fGVsc2V8Zm9yfGlmfGltcG9ydHxpbnxpc3xsb29wfG5vdHxvcnxyZWN1cnNpdmV8d2l0aHx3aXRob3V0KVxcYi8sXG5cdFx0J29wZXJhdG9yJzogL1stKyU9XT0/fCE9fFxcKlxcKj89P3xcXC9cXC8/PT98PFs8PT5dP3w+Wz0+XT98WyZ8Xn5dLyxcblx0XHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQrKT9cXGIvLFxuXHRcdCdib29sZWFuJzogL1tGZl1hbHNlfFtObl1vbmV8W1R0XXJ1ZS8sXG5cdFx0J3ZhcmlhYmxlJzogL1xcYlxcdytcXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9be31bXFxdKCksLjo7XS9cblx0fTtcblxuXG5cdHZhciBwYXR0ZXJuID0gL1xce1xce1tcXHNcXFNdKj9cXH1cXH18XFx7JVtcXHNcXFNdKj8lXFx9fFxceyNbXFxzXFxTXSo/I1xcfS9nO1xuXHR2YXIgbWFya3VwVGVtcGxhdGluZyA9IFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRtYXJrdXBUZW1wbGF0aW5nLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ2RqYW5nbycsIHBhdHRlcm4pO1xuXHR9KTtcblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRtYXJrdXBUZW1wbGF0aW5nLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ2RqYW5nbycpO1xuXHR9KTtcblxuXHQvLyBBZGQgYW4gSmluamEyIGFsaWFzXG5cdFByaXNtLmxhbmd1YWdlcy5qaW5qYTIgPSBQcmlzbS5sYW5ndWFnZXMuZGphbmdvO1xuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRtYXJrdXBUZW1wbGF0aW5nLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ2ppbmphMicsIHBhdHRlcm4pO1xuXHR9KTtcblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRtYXJrdXBUZW1wbGF0aW5nLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ2ppbmphMicpO1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXNbJ2Rucy16b25lLWZpbGUnXSA9IHtcblx0J2NvbW1lbnQnOiAvOy4qLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcLnxbXlwiXFxcXFxcclxcbl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3ZhcmlhYmxlJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXlxcJE9SSUdJTlsgXFx0XSspXFxTKy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpQCg/PVxcc3wkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdH1cblx0XSxcblx0J2tleXdvcmQnOiAvXlxcJCg/OklOQ0xVREV8T1JJR0lOfFRUTCkoPz1cXHN8JCkvbSxcblx0J2NsYXNzJzoge1xuXHRcdC8vIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxMDM1I3BhZ2UtMTNcblx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/OkNIfENTfEhTfElOKSg/PVxcc3wkKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCd0eXBlJzoge1xuXHRcdC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xpc3Rfb2ZfRE5TX3JlY29yZF90eXBlc1xuXHRcdHBhdHRlcm46IC8oXnxcXHMpKD86QXxBNnxBQUFBfEFGU0RCfEFQTHxBVE1BfENBQXxDRE5TS0VZfENEU3xDRVJUfENOQU1FfERIQ0lEfERMVnxETkFNRXxETlNLRVl8RFN8RUlEfEdJRHxHUE9TfEhJTkZPfEhJUHxJUFNFQ0tFWXxJU0ROfEtFWXxLWHxMT0N8TUFJTEF8TUFJTEJ8TUJ8TUR8TUZ8TUd8TUlORk98TVJ8TVh8TkFQVFJ8TkJ8TkJTVEFUfE5JTUxPQ3xOSU5GT3xOU3xOU0FQfE5TQVAtUFRSfE5TRUN8TlNFQzN8TlNFQzNQQVJBTXxOVUxMfE5YVHxPUEVOUEdQS0VZfFBUUnxQWHxSS0VZfFJQfFJSU0lHfFJUfFNJR3xTSU5LfFNNSU1FQXxTT0F8U1BGfFNSVnxTU0hGUHxUQXxUS0VZfFRMU0F8VFNJR3xUWFR8VUlEfFVJTkZPfFVOU1BFQ3xVUkl8V0tTfFgyNSkoPz1cXHN8JCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvWygpXS9cbn07XG5cblByaXNtLmxhbmd1YWdlc1snZG5zLXpvbmUnXSA9IFByaXNtLmxhbmd1YWdlc1snZG5zLXpvbmUtZmlsZSddO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0Ly8gTWFueSBvZiB0aGUgZm9sbG93aW5nIHJlZ2V4ZXMgd2lsbCBjb250YWluIG5lZ2F0ZWQgbG9va2FoZWFkcyBsaWtlIGBbIFxcdF0rKD8hWyBcXHRdKWAuIFRoaXMgaXMgYSB0cmljayB0byBlbnN1cmVcblx0Ly8gdGhhdCBxdWFudGlmaWVycyBiZWhhdmUgKmF0b21pY2FsbHkqLiBBdG9taWMgcXVhbnRpZmllcnMgYXJlIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGV4cG9uZW50aWFsIGJhY2t0cmFja2luZy5cblxuXHR2YXIgc3BhY2VBZnRlckJhY2tTbGFzaCA9IC9cXFxcW1xcclxcbl0oPzpcXHN8XFxcXFtcXHJcXG5dfCMuKig/IS4pKSooPyFbXFxzI118XFxcXFtcXHJcXG5dKS8uc291cmNlO1xuXHQvLyBBdCBsZWFzdCBvbmUgc3BhY2UsIGNvbW1lbnQsIG9yIGxpbmUgYnJlYWtcblx0dmFyIHNwYWNlID0gLyg/OlsgXFx0XSsoPyFbIFxcdF0pKD86PFNQX0JTPik/fDxTUF9CUz4pLy5zb3VyY2Vcblx0XHQucmVwbGFjZSgvPFNQX0JTPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzcGFjZUFmdGVyQmFja1NsYXNoOyB9KTtcblxuXHR2YXIgc3RyaW5nID0gL1wiKD86W15cIlxcXFxcXHJcXG5dfFxcXFwoPzpcXHJcXG58W1xcc1xcU10pKSpcInwnKD86W14nXFxcXFxcclxcbl18XFxcXCg/OlxcclxcbnxbXFxzXFxTXSkpKicvLnNvdXJjZTtcblx0dmFyIG9wdGlvbiA9IC8tLVtcXHctXSs9KD86PFNUUj58KD8hW1wiJ10pKD86W15cXHNcXFxcXXxcXFxcLikrKS8uc291cmNlLnJlcGxhY2UoLzxTVFI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0cmluZzsgfSk7XG5cblx0dmFyIHN0cmluZ1J1bGUgPSB7XG5cdFx0cGF0dGVybjogUmVnRXhwKHN0cmluZyksXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH07XG5cdHZhciBjb21tZW50UnVsZSA9IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSMuKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2Vcblx0ICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG5cdCAqIEByZXR1cm5zIHtSZWdFeHB9XG5cdCAqL1xuXHRmdW5jdGlvbiByZShzb3VyY2UsIGZsYWdzKSB7XG5cdFx0c291cmNlID0gc291cmNlXG5cdFx0XHQucmVwbGFjZSgvPE9QVD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gb3B0aW9uOyB9KVxuXHRcdFx0LnJlcGxhY2UoLzxTUD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc3BhY2U7IH0pO1xuXG5cdFx0cmV0dXJuIFJlZ0V4cChzb3VyY2UsIGZsYWdzKTtcblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlcy5kb2NrZXIgPSB7XG5cdFx0J2luc3RydWN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKikoPzpBRER8QVJHfENNRHxDT1BZfEVOVFJZUE9JTlR8RU5WfEVYUE9TRXxGUk9NfEhFQUxUSENIRUNLfExBQkVMfE1BSU5UQUlORVJ8T05CVUlMRHxSVU58U0hFTEx8U1RPUFNJR05BTHxVU0VSfFZPTFVNRXxXT1JLRElSKSg/PVxccykoPzpcXFxcLnxbXlxcclxcblxcXFxdKSooPzpcXFxcJCg/Olxcc3wjLiokKSooPyFbXFxzI10pKD86XFxcXC58W15cXHJcXG5cXFxcXSkqKSovaW0sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdvcHRpb25zJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IHJlKC8oXig/Ok9OQlVJTEQ8U1A+KT9cXHcrPFNQPik8T1BUPig/OjxTUD48T1BUPikqLy5zb3VyY2UsICdpJyksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHJvcGVydHknOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpLS1bXFx3LV0rLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdzdHJpbmcnOiBbXG5cdFx0XHRcdFx0XHRcdHN0cmluZ1J1bGUsXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKD0pKD8hW1wiJ10pKD86W15cXHNcXFxcXXxcXFxcLikrLyxcblx0XHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHQnb3BlcmF0b3InOiAvXFxcXCQvbSxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC89L1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2tleXdvcmQnOiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9idWlsZGVyLyNoZWFsdGhjaGVja1xuXHRcdFx0XHRcdFx0cGF0dGVybjogcmUoLyheKD86T05CVUlMRDxTUD4pP0hFQUxUSENIRUNLPFNQPig/OjxPUFQ+PFNQPikqKSg/OkNNRHxOT05FKVxcYi8uc291cmNlLCAnaScpLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9kb2NzLmRvY2tlci5jb20vZW5naW5lL3JlZmVyZW5jZS9idWlsZGVyLyNmcm9tXG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiByZSgvKF4oPzpPTkJVSUxEPFNQPik/RlJPTTxTUD4oPzo8T1BUPjxTUD4pKig/IS0tKVteIFxcdFxcXFxdKzxTUD4pQVMvLnNvdXJjZSwgJ2knKSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vZG9jcy5kb2NrZXIuY29tL2VuZ2luZS9yZWZlcmVuY2UvYnVpbGRlci8jb25idWlsZFxuXHRcdFx0XHRcdFx0cGF0dGVybjogcmUoLyheT05CVUlMRDxTUD4pXFx3Ky8uc291cmNlLCAnaScpLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL15cXHcrLyxcblx0XHRcdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XSxcblx0XHRcdFx0J2NvbW1lbnQnOiBjb21tZW50UnVsZSxcblx0XHRcdFx0J3N0cmluZyc6IHN0cmluZ1J1bGUsXG5cdFx0XHRcdCd2YXJpYWJsZSc6IC9cXCQoPzpcXHcrfFxce1tee31cIidcXFxcXSpcXH0pLyxcblx0XHRcdFx0J29wZXJhdG9yJzogL1xcXFwkL21cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjb21tZW50JzogY29tbWVudFJ1bGVcblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZG9ja2VyZmlsZSA9IFByaXNtLmxhbmd1YWdlcy5kb2NrZXI7XG5cbn0oUHJpc20pKTtcblxuLy8gaHR0cHM6Ly93d3cuZ3JhcGh2aXoub3JnL2RvYy9pbmZvL2xhbmcuaHRtbFxuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIElEID0gJyg/OicgKyBbXG5cdFx0Ly8gYW4gaWRlbnRpZmllclxuXHRcdC9bYS16QS1aX1xceDgwLVxcdUZGRkZdW1xcd1xceDgwLVxcdUZGRkZdKi8uc291cmNlLFxuXHRcdC8vIGEgbnVtYmVyXG5cdFx0Ly0/KD86XFwuXFxkK3xcXGQrKD86XFwuXFxkKik/KS8uc291cmNlLFxuXHRcdC8vIGEgZG91YmxlLXF1b3RlZCBzdHJpbmdcblx0XHQvXCJbXlwiXFxcXF0qKD86XFxcXFtcXHNcXFNdW15cIlxcXFxdKikqXCIvLnNvdXJjZSxcblx0XHQvLyBIVE1MLWxpa2Ugc3RyaW5nXG5cdFx0LzwoPzpbXjw+XXwoPyE8IS0tKTwoPzpbXjw+XCInXXxcIlteXCJdKlwifCdbXiddKicpKz58PCEtLSg/OlteLV18LSg/IS0+KSkqLS0+KSo+Ly5zb3VyY2Vcblx0XS5qb2luKCd8JykgKyAnKSc7XG5cblx0dmFyIElESW5zaWRlID0ge1xuXHRcdCdtYXJrdXAnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF48KVtcXHNcXFNdKyg/PT4kKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6IFsnbGFuZ3VhZ2UtbWFya3VwJywgJ2xhbmd1YWdlLWh0bWwnLCAnbGFuZ3VhZ2UteG1sJ10sXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5tYXJrdXBcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2Vcblx0ICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG5cdCAqIEByZXR1cm5zIHtSZWdFeHB9XG5cdCAqL1xuXHRmdW5jdGlvbiB3aXRoSUQoc291cmNlLCBmbGFncykge1xuXHRcdHJldHVybiBSZWdFeHAoc291cmNlLnJlcGxhY2UoLzxJRD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gSUQ7IH0pLCBmbGFncyk7XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXMuZG90ID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC98XiMuKi9tLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnZ3JhcGgtbmFtZSc6IHtcblx0XHRcdHBhdHRlcm46IHdpdGhJRCgvKFxcYig/OmRpZ3JhcGh8Z3JhcGh8c3ViZ3JhcGgpWyBcXHRcXHJcXG5dKyk8SUQ+Ly5zb3VyY2UsICdpJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJyxcblx0XHRcdGluc2lkZTogSURJbnNpZGVcblx0XHR9LFxuXHRcdCdhdHRyLXZhbHVlJzoge1xuXHRcdFx0cGF0dGVybjogd2l0aElEKC8oPVsgXFx0XFxyXFxuXSopPElEPi8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IElESW5zaWRlXG5cdFx0fSxcblx0XHQnYXR0ci1uYW1lJzoge1xuXHRcdFx0cGF0dGVybjogd2l0aElEKC8oW1xcWzssIFxcdFxcclxcbl0pPElEPig/PVsgXFx0XFxyXFxuXSo9KS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IElESW5zaWRlXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzpkaWdyYXBofGVkZ2V8Z3JhcGh8bm9kZXxzdHJpY3R8c3ViZ3JhcGgpXFxiL2ksXG5cdFx0J2NvbXBhc3MtcG9pbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKDpbIFxcdFxcclxcbl0qKSg/Oltld2NfXXxbbnNdW2V3XT8pKD8hW1xcd1xceDgwLVxcdUZGRkZdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdidWlsdGluJ1xuXHRcdH0sXG5cdFx0J25vZGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiB3aXRoSUQoLyhefFteLS5cXHdcXHg4MC1cXHVGRkZGXFxcXF0pPElEPi8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IElESW5zaWRlXG5cdFx0fSxcblx0XHQnb3BlcmF0b3InOiAvWz06XXwtWy0+XS8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF17fTssXS9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZ3YgPSBQcmlzbS5sYW5ndWFnZXMuZG90O1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5lYm5mID0ge1xuXHQnY29tbWVudCc6IC9cXChcXCpbXFxzXFxTXSo/XFwqXFwpLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJbXlwiXFxyXFxuXSpcInwnW14nXFxyXFxuXSonLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3NwZWNpYWwnOiB7XG5cdFx0cGF0dGVybjogL1xcP1teP1xcclxcbl0qXFw/Lyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9LFxuXG5cdCdkZWZpbml0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9eKFtcXHQgXSopW2Etel1cXHcqKD86WyBcXHRdK1thLXpdXFx3KikqKD89XFxzKj0pL2ltLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6IFsncnVsZScsICdrZXl3b3JkJ11cblx0fSxcblx0J3J1bGUnOiAvXFxiW2Etel1cXHcqKD86WyBcXHRdK1thLXpdXFx3KikqXFxiL2ksXG5cblx0J3B1bmN0dWF0aW9uJzogL1xcKFs6L118WzovXVxcKXxbLiw7KClbXFxde31dLyxcblx0J29wZXJhdG9yJzogL1stPXwqLyFdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmVkaXRvcmNvbmZpZyA9IHtcblx0Ly8gaHR0cHM6Ly9lZGl0b3Jjb25maWctc3BlY2lmaWNhdGlvbi5yZWFkdGhlZG9jcy5pb1xuXHQnY29tbWVudCc6IC9bOyNdLiovLFxuXHQnc2VjdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKVxcWy4rXFxdL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3NlbGVjdG9yJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdyZWdleCc6IC9cXFxcXFxcXFtcXFtcXF17fSwhPy4qXS8sIC8vIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgd2l0aCAnXFxcXCdcblx0XHRcdCdvcGVyYXRvcic6IC9bIT9dfFxcLlxcLnxcXCp7MSwyfS8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXXt9LF0vXG5cdFx0fVxuXHR9LFxuXHQna2V5Jzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSopW15cXHM9XSsoPz1bIFxcdF0qPSkvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnYXR0ci1uYW1lJ1xuXHR9LFxuXHQndmFsdWUnOiB7XG5cdFx0cGF0dGVybjogLz0uKi8sXG5cdFx0YWxpYXM6ICdhdHRyLXZhbHVlJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9ePS9cblx0XHR9XG5cdH1cbn07XG5cblByaXNtLmxhbmd1YWdlcy5laWZmZWwgPSB7XG5cdCdjb21tZW50JzogLy0tLiovLFxuXHQnc3RyaW5nJzogW1xuXHRcdC8vIEFsaWduZWQtdmVyYmF0aW0tc3RyaW5nc1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cIihbXltdKilcXFtbXFxzXFxTXSo/XFxdXFwxXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQvLyBOb24tYWxpZ25lZC12ZXJiYXRpbS1zdHJpbmdzXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1wiKFtee10qKVxce1tcXHNcXFNdKj9cXH1cXDFcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdC8vIFNpbmdsZS1saW5lIHN0cmluZ1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cIig/OiUoPzooPyFcXG4pXFxzKSpcXG5cXHMqJXwlXFxTfFteJVwiXFxyXFxuXSkqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQvLyBub3JtYWwgY2hhciB8IHNwZWNpYWwgY2hhciB8IGNoYXIgY29kZVxuXHQnY2hhcic6IC8nKD86JS58W14lJ1xcclxcbl0pKycvLFxuXHQna2V5d29yZCc6IC9cXGIoPzphY3Jvc3N8YWdlbnR8YWxpYXN8YWxsfGFuZHxhc3xhc3NpZ258YXR0YWNoZWR8YXR0cmlidXRlfGNoZWNrfGNsYXNzfGNvbnZlcnR8Y3JlYXRlfEN1cnJlbnR8ZGVidWd8ZGVmZXJyZWR8ZGV0YWNoYWJsZXxkb3xlbHNlfGVsc2VpZnxlbmR8ZW5zdXJlfGV4cGFuZGVkfGV4cG9ydHxleHRlcm5hbHxmZWF0dXJlfGZyb218ZnJvemVufGlmfGltcGxpZXN8aW5oZXJpdHxpbnNwZWN0fGludmFyaWFudHxsaWtlfGxvY2FsfGxvb3B8bm90fG5vdGV8b2Jzb2xldGV8b2xkfG9uY2V8b3J8UHJlY3Vyc29yfHJlZGVmaW5lfHJlbmFtZXxyZXF1aXJlfHJlc2N1ZXxSZXN1bHR8cmV0cnl8c2VsZWN0fHNlcGFyYXRlfHNvbWV8dGhlbnx1bmRlZmluZXx1bnRpbHx2YXJpYW50fFZvaWR8d2hlbnx4b3IpXFxiL2ksXG5cdCdib29sZWFuJzogL1xcYig/OkZhbHNlfFRydWUpXFxiL2ksXG5cdC8vIENvbnZlbnRpb246IGNsYXNzLW5hbWVzIGFyZSBhbHdheXMgYWxsIHVwcGVyLWNhc2UgY2hhcmFjdGVyc1xuXHQnY2xhc3MtbmFtZSc6IC9cXGJbQS1aXVtcXGRBLVpfXSpcXGIvLFxuXHQnbnVtYmVyJzogW1xuXHRcdC8vIGhleGEgfCBvY3RhbCB8IGJpblxuXHRcdC9cXGIwW3hjYl1bXFxkYS1mXSg/Ol8qW1xcZGEtZl0pKlxcYi9pLFxuXHRcdC8vIERlY2ltYWxcblx0XHQvKD86XFxiXFxkKD86XypcXGQpKik/XFwuKD86KD86XFxkKD86XypcXGQpKik/ZVsrLV0/KT9cXGQoPzpfKlxcZCkqXFxifFxcYlxcZCg/Ol8qXFxkKSpcXGJcXC4/L2lcblx0XSxcblx0J3B1bmN0dWF0aW9uJzogLzo9fDw8fD4+fFxcKFxcfHxcXHxcXCl8LT58XFwuKD89XFx3KXxbe31bXFxdOygpLDo/XS8sXG5cdCdvcGVyYXRvcic6IC9cXFxcXFxcXHxcXHxcXC5cXC5cXHx8XFwuXFwufFxcL1t+XFwvPV0/fFs+PF09P3xbLSsqXj1+XS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZWpzID0ge1xuXHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXjwlWy1fPV0/fFstX10/JT4kLyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQnY29tbWVudCc6IC9eI1tcXHNcXFNdKi8sXG5cdFx0J2xhbmd1YWdlLWphdmFzY3JpcHQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHR9XG5cdH07XG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0dmFyIGVqc1BhdHRlcm4gPSAvPCUoPyElKVtcXHNcXFNdKz8lPi9nO1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS5idWlsZFBsYWNlaG9sZGVycyhlbnYsICdlanMnLCBlanNQYXR0ZXJuKTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10udG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAnZWpzJyk7XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5ldGEgPSBQcmlzbS5sYW5ndWFnZXMuZWpzO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5lbGl4aXIgPSB7XG5cdCdkb2MnOiB7XG5cdFx0cGF0dGVybjogL0AoPzpkb2N8bW9kdWxlZG9jKVxccysoPzooXCJcIlwifCcnJylbXFxzXFxTXSo/XFwxfChcInwnKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMilbXlxcXFxcXHJcXG5dKSpcXDIpLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdhdHRyaWJ1dGUnOiAvXkBcXHcrLyxcblx0XHRcdCdzdHJpbmcnOiAvWydcIl1bXFxzXFxTXSsvXG5cdFx0fVxuXHR9LFxuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0Ly8gfnJcIlwiXCJmb29cIlwiXCIgKG11bHRpLWxpbmUpLCB+cicnJ2ZvbycnJyAobXVsdGktbGluZSksIH5yL2Zvby8sIH5yfGZvb3wsIH5yXCJmb29cIiwgfnInZm9vJywgfnIoZm9vKSwgfnJbZm9vXSwgfnJ7Zm9vfSwgfnI8Zm9vPlxuXHQncmVnZXgnOiB7XG5cdFx0cGF0dGVybjogL35bclJdKD86KFwiXCJcInwnJycpKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKStcXDF8KFtcXC98XCInXSkoPzpcXFxcLnwoPyFcXDIpW15cXFxcXFxyXFxuXSkrXFwyfFxcKCg/OlxcXFwufFteXFxcXClcXHJcXG5dKStcXCl8XFxbKD86XFxcXC58W15cXFxcXFxdXFxyXFxuXSkrXFxdfFxceyg/OlxcXFwufFteXFxcXH1cXHJcXG5dKStcXH18PCg/OlxcXFwufFteXFxcXD5cXHJcXG5dKSs+KVt1aXNteGZyXSovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzogW1xuXHRcdHtcblx0XHRcdC8vIH5zXCJcIlwiZm9vXCJcIlwiIChtdWx0aS1saW5lKSwgfnMnJydmb28nJycgKG11bHRpLWxpbmUpLCB+cy9mb28vLCB+c3xmb298LCB+c1wiZm9vXCIsIH5zJ2ZvbycsIH5zKGZvbyksIH5zW2Zvb10sIH5ze2Zvb30gKHdpdGggaW50ZXJwb2xhdGlvbiBjYXJlKSwgfnM8Zm9vPlxuXHRcdFx0cGF0dGVybjogL35bY0NzU3dXXSg/OihcIlwiXCJ8JycnKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkrXFwxfChbXFwvfFwiJ10pKD86XFxcXC58KD8hXFwyKVteXFxcXFxcclxcbl0pK1xcMnxcXCgoPzpcXFxcLnxbXlxcXFwpXFxyXFxuXSkrXFwpfFxcWyg/OlxcXFwufFteXFxcXFxcXVxcclxcbl0pK1xcXXxcXHsoPzpcXFxcLnwjXFx7W159XStcXH18Iyg/IVxceyl8W14jXFxcXH1cXHJcXG5dKStcXH18PCg/OlxcXFwufFteXFxcXD5cXHJcXG5dKSs+KVtjc2FdPy8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0Ly8gU2VlIGludGVycG9sYXRpb24gYmVsb3dcblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXCJcIlwifCcnJylbXFxzXFxTXSo/XFwxLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQvLyBTZWUgaW50ZXJwb2xhdGlvbiBiZWxvd1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gTXVsdGktbGluZSBzdHJpbmdzIGFyZSBhbGxvd2VkXG5cdFx0XHRwYXR0ZXJuOiAvKFwifCcpKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0Ly8gU2VlIGludGVycG9sYXRpb24gYmVsb3dcblx0XHRcdH1cblx0XHR9XG5cdF0sXG5cdCdhdG9tJzoge1xuXHRcdC8vIExvb2stYmVoaW5kIHByZXZlbnRzIGJhZCBoaWdobGlnaHRpbmcgb2YgdGhlIDo6IG9wZXJhdG9yXG5cdFx0cGF0dGVybjogLyhefFteOl0pOlxcdysvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdzeW1ib2wnXG5cdH0sXG5cdCdtb2R1bGUnOiB7XG5cdFx0cGF0dGVybjogL1xcYltBLVpdXFx3KlxcYi8sXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9LFxuXHQvLyBMb29rLWFoZWFkIHByZXZlbnRzIGJhZCBoaWdobGlnaHRpbmcgb2YgdGhlIDo6IG9wZXJhdG9yXG5cdCdhdHRyLW5hbWUnOiAvXFxiXFx3K1xcPz86KD8hOikvLFxuXHQnYXJndW1lbnQnOiB7XG5cdFx0Ly8gTG9vay1iZWhpbmQgcHJldmVudHMgYmFkIGhpZ2hsaWdodGluZyBvZiB0aGUgJiYgb3BlcmF0b3Jcblx0XHRwYXR0ZXJuOiAvKF58W14mXSkmXFxkKy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQnYXR0cmlidXRlJzoge1xuXHRcdHBhdHRlcm46IC9AXFx3Ky8sXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J2Z1bmN0aW9uJzogL1xcYltfYS16QS1aXVxcdypbPyFdPyg/Oig/PVxccyooPzpcXC5cXHMqKT9cXCgpfCg/PVxcL1xcZCkpLyxcblx0J251bWJlcic6IC9cXGIoPzowW2JveF1bYS1mXFxkX10rfFxcZFtcXGRfXSopKD86XFwuW1xcZF9dKyk/KD86ZVsrLV0/W1xcZF9dKyk/XFxiL2ksXG5cdCdrZXl3b3JkJzogL1xcYig/OmFmdGVyfGFsaWFzfGFuZHxjYXNlfGNhdGNofGNvbmR8ZGVmKD86Y2FsbGJhY2t8ZGVsZWdhdGV8ZXhjZXB0aW9ufGltcGx8bWFjcm98bW9kdWxlfG58bnB8cHxwcm90b2NvbHxzdHJ1Y3QpP3xkb3xlbHNlfGVuZHxmbnxmb3J8aWZ8aW1wb3J0fG5vdHxvcnxxdW90ZXxyYWlzZXxyZXF1aXJlfHJlc2N1ZXx0cnl8dW5sZXNzfHVucXVvdGV8dXNlfHdoZW4pXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bmlsfHRydWUpXFxiLyxcblx0J29wZXJhdG9yJzogW1xuXHRcdC9cXGJpblxcYnwmJj98XFx8W3w+XT98XFxcXFxcXFx8Ojp8XFwuXFwuXFwuP3xcXCtcXCs/fC1bLT5dP3w8Wy09Pl18Pj18IT09P3xcXEIhfD0oPzo9PT98Wz5+XSk/fFsqXFwvXl0vLFxuXHRcdHtcblx0XHRcdC8vIFdlIGRvbid0IHdhbnQgdG8gbWF0Y2ggPDxcblx0XHRcdHBhdHRlcm46IC8oW148XSk8KD8hPCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gV2UgZG9uJ3Qgd2FudCB0byBtYXRjaCA+PlxuXHRcdFx0cGF0dGVybjogLyhbXj5dKT4oPyE+KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQncHVuY3R1YXRpb24nOiAvPDx8Pj58Wy4sJVxcW1xcXXt9KCldL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmVsaXhpci5zdHJpbmcuZm9yRWFjaChmdW5jdGlvbiAobykge1xuXHRvLmluc2lkZSA9IHtcblx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8jXFx7W159XStcXH0vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14jXFx7fFxcfSQvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy5lbGl4aXJcblx0XHRcdH1cblx0XHR9XG5cdH07XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmVsbSA9IHtcblx0J2NvbW1lbnQnOiAvLS0uKnxcXHstW1xcc1xcU10qPy1cXH0vLFxuXHQnY2hhcic6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlteXFxcXCdcXHJcXG5dfFxcXFwoPzpbYWJmbnJ0dlxcXFwnXXxcXGQrfHhbMC05YS1mQS1GXSt8dVxce1swLTlhLWZBLUZdK1xcfSkpJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiBbXG5cdFx0e1xuXHRcdFx0Ly8gTXVsdGlsaW5lIHN0cmluZ3MgYXJlIHdyYXBwZWQgaW4gdHJpcGxlIFwiLiBRdW90ZXMgbWF5IGFwcGVhciB1bmVzY2FwZWQuXG5cdFx0XHRwYXR0ZXJuOiAvXCJcIlwiW1xcc1xcU10qP1wiXCJcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlteXFxcXFwiXFxyXFxuXXxcXFxcLikqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnaW1wb3J0LXN0YXRlbWVudCc6IHtcblx0XHQvLyBUaGUgaW1wb3J0ZWQgb3IgaGlkZGVuIG5hbWVzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhpcyBpbXBvcnRcblx0XHQvLyBzdGF0ZW1lbnQuIFRoaXMgaXMgYmVjYXVzZSB3ZSB3YW50IHRvIGhpZ2hsaWdodCB0aG9zZSBleGFjdGx5IGxpa2Vcblx0XHQvLyB3ZSBkbyBmb3IgdGhlIG5hbWVzIGluIHRoZSBwcm9ncmFtLlxuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopaW1wb3J0XFxzK1tBLVpdXFx3Kig/OlxcLltBLVpdXFx3KikqKD86XFxzK2FzXFxzKyg/OltBLVpdXFx3KikoPzpcXC5bQS1aXVxcdyopKik/KD86XFxzK2V4cG9zaW5nXFxzKyk/L20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzogL1xcYig/OmFzfGV4cG9zaW5nfGltcG9ydClcXGIvXG5cdFx0fVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphbGlhc3xhc3xjYXNlfGVsc2V8ZXhwb3Npbmd8aWZ8aW58aW5maXhsfGluZml4cnxsZXR8bW9kdWxlfG9mfHRoZW58dHlwZSlcXGIvLFxuXHQvLyBUaGVzZSBhcmUgYnVpbHRpbiB2YXJpYWJsZXMgb25seS4gQ29uc3RydWN0b3JzIGFyZSBoaWdobGlnaHRlZCBsYXRlciBhcyBhIGNvbnN0YW50LlxuXHQnYnVpbHRpbic6IC9cXGIoPzphYnN8YWNvc3xhbHdheXN8YXNpbnxhdGFufGF0YW4yfGNlaWxpbmd8Y2xhbXB8Y29tcGFyZXxjb3N8Y3Vycnl8ZGVncmVlc3xlfGZsaXB8Zmxvb3J8ZnJvbVBvbGFyfGlkZW50aXR5fGlzSW5maW5pdGV8aXNOYU58bG9nQmFzZXxtYXh8bWlufG5lZ2F0ZXxuZXZlcnxub3R8cGl8cmFkaWFuc3xyZW18cm91bmR8c2lufHNxcnR8dGFufHRvRmxvYXR8dG9Qb2xhcnx0b1N0cmluZ3x0cnVuY2F0ZXx0dXJuc3x1bmN1cnJ5fHhvcilcXGIvLFxuXHQvLyBkZWNpbWFsIGludGVnZXJzIGFuZCBmbG9hdGluZyBwb2ludCBudW1iZXJzIHwgaGV4YWRlY2ltYWwgaW50ZWdlcnNcblx0J251bWJlcic6IC9cXGIoPzpcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/fDB4WzAtOWEtZl0rKVxcYi9pLFxuXHQvLyBNb3N0IG9mIHRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIG1lYW5pbmcgb2YgYSBzaW5nbGUgJy4nLlxuXHQvLyBJZiBpdCBzdGFuZHMgYWxvbmUgZnJlZWx5LCBpdCBpcyB0aGUgZnVuY3Rpb24gY29tcG9zaXRpb24uXG5cdC8vIEl0IG1heSBhbHNvIGJlIGEgc2VwYXJhdG9yIGJldHdlZW4gYSBtb2R1bGUgbmFtZSBhbmQgYW4gaWRlbnRpZmllciA9PiBub1xuXHQvLyBvcGVyYXRvci4gSWYgaXQgY29tZXMgdG9nZXRoZXIgd2l0aCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgaXQgaXMgYW5cblx0Ly8gb3BlcmF0b3IgdG9vLlxuXHQvLyBWYWxpZCBvcGVyYXRvciBjaGFyYWN0ZXJzIGluIDAuMTg6ICstLyo9LiQ8PjomfF4/JSNAfiFcblx0Ly8gUmVmOiBodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2ZvcnVtLyMhbXNnL2VsbS1kZXYvMEFIU25EZGtTa1EvRTBTVlU3MEpFUUFKXG5cdCdvcGVyYXRvcic6IC9cXHNcXC5cXHN8WytcXC0vKj0uJDw+OiZ8Xj8lI0B+IV17Mix9fFsrXFwtLyo9JDw+OiZ8Xj8lI0B+IV0vLFxuXHQvLyBJbiBFbG0sIG5lYXJseSBldmVyeXRoaW5nIGlzIGEgdmFyaWFibGUsIGRvIG5vdCBoaWdobGlnaHQgdGhlc2UuXG5cdCdodmFyaWFibGUnOiAvXFxiKD86W0EtWl1cXHcqXFwuKSpbYS16XVxcdypcXGIvLFxuXHQnY29uc3RhbnQnOiAvXFxiKD86W0EtWl1cXHcqXFwuKSpbQS1aXVxcdypcXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXXwoKSwuOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubHVhID0ge1xuXHQnY29tbWVudCc6IC9eIyEuK3wtLSg/OlxcWyg9KilcXFtbXFxzXFxTXSo/XFxdXFwxXFxdfC4qKS9tLFxuXHQvLyBcXHogbWF5IGJlIHVzZWQgdG8gc2tpcCB0aGUgZm9sbG93aW5nIHNwYWNlXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInXSkoPzooPyFcXDEpW15cXFxcXFxyXFxuXXxcXFxceig/OlxcclxcbnxcXHMpfFxcXFwoPzpcXHJcXG58W156XSkpKlxcMXxcXFsoPSopXFxbW1xcc1xcU10qP1xcXVxcMlxcXS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdudW1iZXInOiAvXFxiMHhbYS1mXFxkXSsoPzpcXC5bYS1mXFxkXSopPyg/OnBbKy1dP1xcZCspP1xcYnxcXGJcXGQrKD86XFwuXFxCfCg/OlxcLlxcZCopPyg/OmVbKy1dP1xcZCspP1xcYil8XFxCXFwuXFxkKyg/OmVbKy1dP1xcZCspP1xcYi9pLFxuXHQna2V5d29yZCc6IC9cXGIoPzphbmR8YnJlYWt8ZG98ZWxzZXxlbHNlaWZ8ZW5kfGZhbHNlfGZvcnxmdW5jdGlvbnxnb3RvfGlmfGlufGxvY2FsfG5pbHxub3R8b3J8cmVwZWF0fHJldHVybnx0aGVufHRydWV8dW50aWx8d2hpbGUpXFxiLyxcblx0J2Z1bmN0aW9uJzogLyg/IVxcZClcXHcrKD89XFxzKig/Olsoe10pKS8sXG5cdCdvcGVyYXRvcic6IFtcblx0XHQvWy0rKiVeJnwjXXxcXC9cXC8/fDxbPD1dP3w+Wz49XT98Wz1+XT0/Lyxcblx0XHR7XG5cdFx0XHQvLyBNYXRjaCBcIi4uXCIgYnV0IGRvbid0IGJyZWFrIFwiLi4uXCJcblx0XHRcdHBhdHRlcm46IC8oXnxbXi5dKVxcLlxcLig/IVxcLikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF0oKXt9LDtdfFxcLit8OisvXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmV0bHVhID0ge1xuXHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXjwlWy09XT98LT8lPiQvLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdsYW5ndWFnZS1sdWEnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmx1YVxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHR2YXIgcGF0dGVybiA9IC88JVtcXHNcXFNdKz8lPi9nO1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS5idWlsZFBsYWNlaG9sZGVycyhlbnYsICdldGx1YScsIHBhdHRlcm4pO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICdldGx1YScpO1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmVyYiA9IHtcblx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0cGF0dGVybjogL14oXFxzKik8JT0/fCU+KD89XFxzKiQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J3J1YnknOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxzKlxcU1tcXHNcXFNdKi8sXG5cdFx0XHRhbGlhczogJ2xhbmd1YWdlLXJ1YnknLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucnVieVxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHR2YXIgZXJiUGF0dGVybiA9IC88JT0/KD86W15cXHJcXG5dfFtcXHJcXG5dKD8hPWJlZ2luKXxbXFxyXFxuXT1iZWdpblxccyg/OlteXFxyXFxuXXxbXFxyXFxuXSg/IT1lbmQpKSpbXFxyXFxuXT1lbmQpKz8lPi9nO1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS5idWlsZFBsYWNlaG9sZGVycyhlbnYsICdlcmInLCBlcmJQYXR0ZXJuKTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10udG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAnZXJiJyk7XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5lcmxhbmcgPSB7XG5cdCdjb21tZW50JzogLyUuKy8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdxdW90ZWQtZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLycoPzpcXFxcLnxbXlxcXFwnXFxyXFxuXSkrJyg/PVxcKCkvLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdxdW90ZWQtYXRvbSc6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlxcXFwufFteXFxcXCdcXHJcXG5dKSsnLyxcblx0XHRhbGlhczogJ2F0b20nXG5cdH0sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J2tleXdvcmQnOiAvXFxiKD86YWZ0ZXJ8YmVnaW58Y2FzZXxjYXRjaHxlbmR8ZnVufGlmfG9mfHJlY2VpdmV8dHJ5fHdoZW4pXFxiLyxcblx0J251bWJlcic6IFtcblx0XHQvXFwkXFxcXD8uLyxcblx0XHQvXFxiXFxkKyNbYS16MC05XSsvaSxcblx0XHQvKD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspPy9pXG5cdF0sXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16XVtcXHdAXSooPz1cXCgpLyxcblx0J3ZhcmlhYmxlJzoge1xuXHRcdC8vIExvb2stYmVoaW5kIGlzIHVzZWQgdG8gcHJldmVudCB3cm9uZyBoaWdobGlnaHRpbmcgb2YgYXRvbXMgY29udGFpbmluZyBcIkBcIlxuXHRcdHBhdHRlcm46IC8oXnxbXkBdKSg/OlxcYnxcXD8pW0EtWl9dW1xcd0BdKi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnb3BlcmF0b3InOiBbXG5cdFx0L1s9XFwvPD46XT18PVs6XFwvXT18XFwrXFwrP3wtLT98Wz0qXFwvIV18XFxiKD86YW5kfGFuZGFsc298YmFuZHxibm90fGJvcnxic2x8YnNyfGJ4b3J8ZGl2fG5vdHxvcnxvcmVsc2V8cmVtfHhvcilcXGIvLFxuXHRcdHtcblx0XHRcdC8vIFdlIGRvbid0IHdhbnQgdG8gbWF0Y2ggPDxcblx0XHRcdHBhdHRlcm46IC8oXnxbXjxdKTwoPyE8KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBXZSBkb24ndCB3YW50IHRvIG1hdGNoID4+XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14+XSk+KD8hPikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J2F0b20nOiAvXFxiW2Etel1bXFx3QF0qLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF17fTo7LC4jfF18PDx8Pj4vXG5cbn07XG5cblByaXNtLmxhbmd1YWdlc1snZXhjZWwtZm9ybXVsYSddID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYk5cXChcXHMqKVwiKD86W15cIl18XCJcIikqXCIoPz1cXHMqXFwpKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cIl18XCJcIikqXCIoPyFcIikvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQncmVmZXJlbmNlJzoge1xuXHRcdC8vIGh0dHBzOi8vd3d3LmFibGViaXRzLmNvbS9vZmZpY2UtYWRkaW5zLWJsb2cvMjAxNS8xMi8wOC9leGNlbC1yZWZlcmVuY2UtYW5vdGhlci1zaGVldC13b3JrYm9vay9cblxuXHRcdC8vIFNhbGVzIUIyXG5cdFx0Ly8gJ1dpbnRlciBzYWxlcychQjJcblx0XHQvLyBbU2FsZXMueGxzeF1KYW4hQjI6QjVcblx0XHQvLyBEOlxcUmVwb3J0c1xcW1NhbGVzLnhsc3hdSmFuIUIyOkI1XG5cdFx0Ly8gJ1tTYWxlcy54bHN4XUphbiBzYWxlcychQjI6QjVcblx0XHQvLyAnRDpcXFJlcG9ydHNcXFtTYWxlcy54bHN4XUphbiBzYWxlcychQjI6QjVcblxuXHRcdHBhdHRlcm46IC8oPzonW14nXSonfCg/OlteXFxzKClbXFxde308Pio/XCInOywkJl0qXFxbW15eXFxzKClbXFxde308Pio/XCInXStcXF0pP1xcdyspIS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdvcGVyYXRvcic6IC8hJC8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvJy8sXG5cdFx0XHQnc2hlZXQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9bXltcXF1dKyQvLFxuXHRcdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdFx0fSxcblx0XHRcdCdmaWxlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxbW15bXFxdXStcXF0kLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1tbXFxdXS9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdwYXRoJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH0sXG5cdCdmdW5jdGlvbi1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbQS1aXVxcdyooPz1cXCgpL2ksXG5cdFx0YWxpYXM6ICdidWlsdGluJ1xuXHR9LFxuXHQncmFuZ2UnOiB7XG5cdFx0cGF0dGVybjogL1xcJD9cXGIoPzpbQS1aXStcXCQ/XFxkKzpcXCQ/W0EtWl0rXFwkP1xcZCt8W0EtWl0rOlxcJD9bQS1aXSt8XFxkKzpcXCQ/XFxkKylcXGIvaSxcblx0XHRhbGlhczogJ3NlbGVjdG9yJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdvcGVyYXRvcic6IC86Lyxcblx0XHRcdCdjZWxsJzogL1xcJD9bQS1aXStcXCQ/XFxkKy9pLFxuXHRcdFx0J2NvbHVtbic6IC9cXCQ/W0EtWl0rL2ksXG5cdFx0XHQncm93JzogL1xcJD9cXGQrL1xuXHRcdH1cblx0fSxcblx0J2NlbGwnOiB7XG5cdFx0Ly8gRXhjZWwgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgc28gdGhlIHN0cmluZyBcImZvbzFcIiBjb3VsZCBiZSBlaXRoZXIgYSB2YXJpYWJsZSBvciBhIGNlbGwuXG5cdFx0Ly8gVG8gY29tYmF0IHRoaXMsIHdlIG1hdGNoIGNlbGxzIGNhc2UgaW5zZW5zaXRpdmUsIGlmIHRoZSBjb250YWluIGF0IGxlYXN0IG9uZSBcIiRcIiwgYW5kIGNhc2Ugc2Vuc2l0aXZlIG90aGVyd2lzZS5cblx0XHRwYXR0ZXJuOiAvXFxiW0EtWl0rXFxkK1xcYnxcXCRbQS1aYS16XStcXCQ/XFxkK1xcYnxcXGJbQS1aYS16XStcXCRcXGQrXFxiLyxcblx0XHRhbGlhczogJ3NlbGVjdG9yJ1xuXHR9LFxuXHQnbnVtYmVyJzogLyg/OlxcYlxcZCsoPzpcXC5cXGQrKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT9cXGIvaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86RkFMU0V8VFJVRSlcXGIvaSxcblx0J29wZXJhdG9yJzogL1stKyovXiU9JixdfDxbPT5dP3w+PT8vLFxuXHQncHVuY3R1YXRpb24nOiAvW1tcXF0oKTt7fXxdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzWyd4bHN4J10gPSBQcmlzbS5sYW5ndWFnZXNbJ3hscyddID0gUHJpc20ubGFuZ3VhZ2VzWydleGNlbC1mb3JtdWxhJ107XG5cblByaXNtLmxhbmd1YWdlcy5mc2hhcnAgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwoXFwqKD8hXFwpKVtcXHNcXFNdKj9cXCpcXCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXDpdKVxcL1xcLy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyg/OlwiXCJcIltcXHNcXFNdKj9cIlwiXCJ8QFwiKD86XCJcInxbXlwiXSkqXCJ8XCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcIilCPy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiKD86ZXhjZXB0aW9ufGluaGVyaXR8aW50ZXJmYWNlfG5ld3xvZnx0eXBlKVxccyt8XFx3XFxzKjpcXHMqfFxcczpcXD8/PlxccyopWy5cXHddK1xcYig/OlxccyooPzotPnxcXCopXFxzKlsuXFx3XStcXGIpKig/IVxccypbOi5dKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdvcGVyYXRvcic6IC8tPnxcXCovLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHR9XG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmxldHxyZXR1cm58dXNlfHlpZWxkKSg/OiFcXEJ8XFxiKXxcXGIoPzphYnN0cmFjdHxhbmR8YXN8YXNyfGFzc2VydHxhdG9taWN8YmFzZXxiZWdpbnxicmVha3xjaGVja2VkfGNsYXNzfGNvbXBvbmVudHxjb25zdHxjb25zdHJhaW50fGNvbnN0cnVjdG9yfGNvbnRpbnVlfGRlZmF1bHR8ZGVsZWdhdGV8ZG98ZG9uZXxkb3duY2FzdHxkb3dudG98ZWFnZXJ8ZWxpZnxlbHNlfGVuZHxldmVudHxleGNlcHRpb258ZXh0ZXJufGV4dGVybmFsfGZhbHNlfGZpbmFsbHl8Zml4ZWR8Zm9yfGZ1bnxmdW5jdGlvbnxmdW5jdG9yfGdsb2JhbHxpZnxpbnxpbmNsdWRlfGluaGVyaXR8aW5saW5lfGludGVyZmFjZXxpbnRlcm5hbHxsYW5kfGxhenl8bG9yfGxzbHxsc3J8bHhvcnxtYXRjaHxtZW1iZXJ8bWV0aG9kfG1peGlufG1vZHxtb2R1bGV8bXV0YWJsZXxuYW1lc3BhY2V8bmV3fG5vdHxudWxsfG9iamVjdHxvZnxvcGVufG9yfG92ZXJyaWRlfHBhcmFsbGVsfHByaXZhdGV8cHJvY2Vzc3xwcm90ZWN0ZWR8cHVibGljfHB1cmV8cmVjfHNlYWxlZHxzZWxlY3R8c2lnfHN0YXRpY3xzdHJ1Y3R8dGFpbGNhbGx8dGhlbnx0b3x0cmFpdHx0cnVlfHRyeXx0eXBlfHVwY2FzdHx2YWx8dmlydHVhbHx2b2lkfHZvbGF0aWxlfHdoZW58d2hpbGV8d2l0aClcXGIvLFxuXHQnbnVtYmVyJzogW1xuXHRcdC9cXGIweFtcXGRhLWZBLUZdKyg/OkxGfGxmfHVuKT9cXGIvLFxuXHRcdC9cXGIwYlswMV0rKD86dXl8eSk/XFxiLyxcblx0XHQvKD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OltmbV18ZVsrLV0/XFxkKyk/XFxiL2ksXG5cdFx0L1xcYlxcZCsoPzpbSWxMc3ldfFVMfHVbbHN5XT8pP1xcYi9cblx0XSxcblx0J29wZXJhdG9yJzogLyhbPD5+Jl5dKVxcMVxcMXwoWyouOjw+Jl0pXFwyfDwtfC0+fFshPTpdPXw8P1xcfHsxLDN9Pj98XFw/Pyg/Ojw9fD49fDw+fFstKyovJT08Pl0pXFw/P3xbIT9eJl18flsrfi1dfDo+fDpcXD8+Py9cbn0pO1xuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZnNoYXJwJywgJ2tleXdvcmQnLCB7XG5cdCdwcmVwcm9jZXNzb3InOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKikjLiovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyheIylcXGIoPzplbHNlfGVuZGlmfGlmfGxpZ2h0fGxpbmV8bm93YXJuKVxcYi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0pO1xuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZnNoYXJwJywgJ3B1bmN0dWF0aW9uJywge1xuXHQnY29tcHV0YXRpb24tZXhwcmVzc2lvbic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW19hLXpdXFx3Kig/PVxccypcXHspL2ksXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9XG59KTtcblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2ZzaGFycCcsICdzdHJpbmcnLCB7XG5cdCdhbm5vdGF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9cXFs8Lis/PlxcXS8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXFs8fD5cXF0kLyxcblx0XHRcdCdjbGFzcy1uYW1lJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXlxcdyskfChefDtcXHMqKVtBLVpdXFx3Kig/PVxcKCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J2Fubm90YXRpb24tY29udGVudCc6IHtcblx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmZzaGFycFxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J2NoYXInOiB7XG5cdFx0cGF0dGVybjogLycoPzpbXlxcXFwnXXxcXFxcKD86LnxcXGR7M318eFthLWZBLUZcXGRdezJ9fHVbYS1mQS1GXFxkXXs0fXxVW2EtZkEtRlxcZF17OH0pKSdCPy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH1cbn0pO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGNvbW1lbnRfaW5zaWRlID0ge1xuXHRcdCdmdW5jdGlvbic6IC9cXGIoPzpCVUdTP3xGSVgoPzpNRVM/KT98Tk9URVM/fFRPRE9TP3xYWCt8SEFDS1M/fFdBUk4oPzpJTkcpP3xcXD97Mix9fCF7Mix9KVxcYi9cblx0fTtcblx0dmFyIHN0cmluZ19pbnNpZGUgPSB7XG5cdFx0J251bWJlcic6IC9cXFxcW15cXHMnXXwlXFx3L1xuXHR9O1xuXG5cdHZhciBmYWN0b3IgPSB7XG5cdFx0J2NvbW1lbnQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vICEgc2luZ2xlLWxpbmUgZXhjbGFtYXRpb24gcG9pbnQgY29tbWVudHMgd2l0aCB3aGl0ZXNwYWNlIGFmdGVyL2Fyb3VuZCB0aGUgIVxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/OiEgLip8ISQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBjb21tZW50X2luc2lkZVxuXHRcdFx0fSxcblxuXHRcdFx0LyogZnJvbSBiYXNpcy9tdWx0aWxpbmU6ICovXG5cdFx0XHR7XG5cdFx0XHRcdC8vIC8qIGNvbW1lbnQgKi8sIC8qIGNvbW1lbnQqL1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVxcL1xcKlxcc1tcXHNcXFNdKj9cXCpcXC8oPz1cXHN8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogY29tbWVudF9pbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vICFbWyBjb21tZW50IF1dICwgIVs9PT1bIGNvbW1lbnRdPT09XVxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKSFcXFsoPXswLDZ9KVxcW1xcc1tcXHNcXFNdKj9cXF1cXDJcXF0oPz1cXHN8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogY29tbWVudF9pbnNpZGVcblx0XHRcdH1cblx0XHRdLFxuXG5cdFx0J251bWJlcic6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gYmFzaWMgYmFzZSAxMCBpbnRlZ2VycyA5LCAtOVxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVsrLV0/XFxkKyg/PVxcc3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGJhc2UgcHJlZml4IGludGVnZXJzIDBiMDEwIDBvNzAgMHhhZCAwZDEwIDBYQUQgLTB4YTlcblx0XHRcdFx0cGF0dGVybjogLyhefFxccylbKy1dPzAoPzpiWzAxXSt8b1swLTddK3xkXFxkK3x4W1xcZEEtRl0rKSg/PVxcc3wkKS9pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBmcmFjdGlvbmFsIHJhdGlvcyAxLzUgLTEvNSBhbmQgdGhlIGxpdGVyYWwgZmxvYXQgYXBwcm94aW1hdGlvbnMgMS81LiAtMS81LlxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVsrLV0/XFxkK1xcL1xcZCtcXC4/KD89XFxzfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gcG9zaXRpdmUgbWl4ZWQgbnVtYmVycyAyMysxLzUgKzIzKzEvNVxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVxcKz9cXGQrXFwrXFxkK1xcL1xcZCsoPz1cXHN8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBuZWdhdGl2ZSBtaXhlZCBudW1iZXJzIC0yMy0xLzVcblx0XHRcdFx0cGF0dGVybjogLyhefFxccyktXFxkKy1cXGQrXFwvXFxkKyg/PVxcc3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGJhc2ljIGRlY2ltYWwgZmxvYXRzIC0wLjAxIDAuIC4wIC4xIC0uMSAtMS4gLTEyLjEzICsxMi4xM1xuXHRcdFx0XHQvLyBhbmQgc2NpZW50aWZpYyBub3RhdGlvbiB3aXRoIGJhc2UgMTAgZXhwb25lbnRzIDNlNCAzZS00IC4zZS00XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpWystXT8oPzpcXGQqXFwuXFxkK3xcXGQrXFwuXFxkKnxcXGQrKSg/OmVbKy1dP1xcZCspPyg/PVxcc3wkKS9pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBOQU4gbGl0ZXJhbCBzeW50YXggTkFOOiA4MDAwMGRlYWRiZWVmLCBOQU46IGFcblx0XHRcdFx0cGF0dGVybjogLyhefFxccylOQU46XFxzK1tcXGRhLWZBLUZdKyg/PVxcc3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8qXG5cdFx0XHRcdFx0YmFzZSBwcmVmaXggZmxvYXRzIDB4MS4wcDMgKDguMCkgMGIxLjAxMHAyICg1LjApIDB4MS5wMSAwYjEuMTExMTExMTFwMTExMTEuLi5cblx0XHRcdFx0XHRcIlRoZSBub3JtYWxpemVkIGhleCBmb3JtIFx1MDBCMTB4MS5NTU1NTU1NTU1NTU1NW3BQXVx1MDBCMUVFRUUgYWxsb3dzIGFueSBmbG9hdGluZy1wb2ludCBudW1iZXIgdG8gYmUgc3BlY2lmaWVkIHByZWNpc2VseS5cblx0XHRcdFx0XHRUaGUgdmFsdWVzIG9mIE1NTU1NTU1NTU1NTU0gYW5kIEVFRUUgbWFwIGRpcmVjdGx5IHRvIHRoZSBtYW50aXNzYSBhbmQgZXhwb25lbnQgZmllbGRzIG9mIHRoZSBiaW5hcnkgSUVFRSA3NTQgcmVwcmVzZW50YXRpb24uXCJcblx0XHRcdFx0XHQ8aHR0cHM6Ly9kb2NzLmZhY3RvcmNvZGUub3JnL2NvbnRlbnQvYXJ0aWNsZS1zeW50YXgtZmxvYXRzLmh0bWw+XG5cdFx0XHRcdCovXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpWystXT8wKD86YjFcXC5bMDFdKnxvMVxcLlswLTddKnxkMVxcLlxcZCp8eDFcXC5bXFxkQS1GXSopcFxcZCsoPz1cXHN8JCkvaSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cblx0XHQvLyBSLyByZWdleHA/XFwvXFxcXC9cblx0XHQncmVnZXhwJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFxccylSXFwvXFxzKD86XFxcXFxcU3xbXlxcXFwvXSkqXFwvKD86W2lkbXNyXSp8W2lkbXNyXSstW2lkbXNyXSspKD89XFxzfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ251bWJlcicsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3ZhcmlhYmxlJzogL1xcXFxcXFMvLFxuXHRcdFx0XHQna2V5d29yZCc6IC9bKz8qXFxbXFxdXiQoKXt9LnxdLyxcblx0XHRcdFx0J29wZXJhdG9yJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXFwvKVtpZG1zcl0rKD86LVtpZG1zcl0rKT8vLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQnYm9vbGVhbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpW3RmXSg/PVxcc3wkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdC8vIFNCVUZcIiBhc2RcIiwgVVJMXCIgOi8vLi4uXCIsIFBcIiAvZXRjL1wiXG5cdFx0J2N1c3RvbS1zdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVtBLVowLTlcXC1dK1wiXFxzKD86XFxcXFxcU3xbXlwiXFxcXF0pKlwiLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J251bWJlcic6IC9cXFxcXFxTfCVcXHd8XFwvL1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQnbXVsdGlsaW5lLXN0cmluZyc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gU1RSSU5HOiBuYW1lIFxcbiBjb250ZW50IFxcbiA7IC0+IENPTlNUQU5UOiBuYW1lIFwiY29udGVudFwiIChzeW1ib2wpXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpU1RSSU5HOlxccytcXFMrKD86XFxufFxcclxcbikuKig/OlxcbnxcXHJcXG4pXFxzKjsoPz1cXHN8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J251bWJlcic6IHN0cmluZ19pbnNpZGUubnVtYmVyLFxuXHRcdFx0XHRcdC8vIHRyYWlsaW5nIHNlbWljb2xvbiBvbiBpdHMgb3duIGxpbmVcblx0XHRcdFx0XHQnc2VtaWNvbG9uLW9yLXNldGxvY2FsJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyhbXFxyXFxuXVsgXFx0XSopOyg/PVxcc3wkKS8sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIEhFUkVET0M6IG1hcmtlciBcXG4gY29udGVudCBcXG4gbWFya2VyIDsgLT4gXCJjb250ZW50XCIgKGltbWVkaWF0ZSlcblx0XHRcdFx0cGF0dGVybjogLyhefFxccylIRVJFRE9DOlxccytcXFMrKD86XFxufFxcclxcbikuKig/OlxcbnxcXHJcXG4pXFxzKlxcUysoPz1cXHN8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdFx0aW5zaWRlOiBzdHJpbmdfaW5zaWRlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBbWyBzdHJpbmcgXV0sIFs9PVsgc3RyaW5nXT09XVxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVxcWyg9ezAsNn0pXFxbXFxzW1xcc1xcU10qP1xcXVxcMlxcXSg/PVxcc3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0XHRpbnNpZGU6IHN0cmluZ19pbnNpZGVcblx0XHRcdH1cblx0XHRdLFxuXG5cdFx0J3NwZWNpYWwtdXNpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVVTSU5HOig/Olxcc1xcUyspKig/PVxccys7KD86XFxzfCQpKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbicsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0Ly8gdGhpcyBpcyBlc3NlbnRpYWxseSBhIHJlZ2V4IGZvciB2b2NhYiBuYW1lcywgd2hpY2ggaSBkb24ndCB3YW50IHRvIHNwZWNpZnlcblx0XHRcdFx0Ly8gYnV0IHRoZSBVU0lORzogZ2V0cyBwaWNrZWQgdXAgYXMgYSB2b2NhYiBuYW1lXG5cdFx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhcXHMpW146XFxzXSsvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvKiB0aGlzIGRlc2NyaXB0aW9uIG9mIHN0YWNrIGVmZmVjdCBsaXRlcmFsIHN5bnRheCBpcyBub3QgY29tcGxldGUgYW5kIG5vdCBhcyBzcGVjaWZpYyBhcyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlXG5cdFx0XHR0cnlpbmcgdG8gZG8gYmV0dGVyIGlzIG1vcmUgd29yayBhbmQgcmVnZXgtY29tcHV0YXRpb24tdGltZSB0aGFuIGl0J3Mgd29ydGggdGhvdWdoLlxuXHRcdFx0LSB3ZSdkIGxpa2UgdG8gaGF2ZSB0aGUgXCJkZWxpbWl0ZXJcIiBwYXJ0cyBvZiB0aGUgc3RhY2sgZWZmZWN0IFsgKCwgLS0sIGFuZCApIF0gYmUgYSBkaWZmZXJlbnQgKGxlc3MtaW1wb3J0YW50IG9yIGNvbW1lbnQtbGlrZSkgY29sb3VyIHRvIHRoZSBzdGFjayBlZmZlY3QgY29udGVudHNcblx0XHRcdC0gd2UnZCBsaWtlIGlmIG5lc3RlZCBzdGFjayBlZmZlY3RzIHdlcmUgdHJlYXRlZCBhcyBzdWNoIHJhdGhlciB0aGFuIGp1c3QgYXBwZWFyaW5nIGZsYXQgKHdpdGggYGluc2lkZWApXG5cdFx0XHQtIHdlJ2QgbGlrZSBpZiB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIG5hbWUgY29udmVudGlvbnMgd2VyZSByZWNvZ25pc2VkIHNwZWNpZmljYWxseTpcblx0XHRcdFx0c3BlY2lhbCByb3cgdmFyaWFibGVzID0gLi5hIGIuLlxuXHRcdFx0XHR0eXBlIGFuZCBzdGFjayBlZmZlY3QgYW5ub3RhdGlvbnMgZW5kIHdpdGggYSBjb2xvbiA9ICggcXVvdDogKCBhOiAoIC0tICkgLS0gYiApIC0tIHggKSwgKCB4OiBudW1iZXIgLS0gKVxuXHRcdFx0XHR3b3JkIHRocm93cyB1bmNvbmRpdGlvbmFsIGVycm9yID0gKlxuXHRcdFx0XHRhbnkgb3RoZXIgd29yZC1saWtlIHZhcmlhYmxlIG5hbWUgPSBhID8gcScgZXRjXG5cblx0XHRcdGh0dHBzOi8vZG9jcy5mYWN0b3Jjb2RlLm9yZy9jb250ZW50L2FydGljbGUtZWZmZWN0cy5odG1sXG5cblx0XHRcdHRoZXNlIGFyZSBwcmV0dHkgY29tcGxpY2F0ZWQgdG8gaGlnaGxpZ2h0IHByb3Blcmx5IHdpdGhvdXQgYSByZWFsIHBhcnNlciwgYW5kIHRoZXJlZm9yZSBvdXQgb2Ygc2NvcGVcblx0XHRcdHRoZSBvbGQgcGF0dGVybiwgd2hpY2ggbWF5IGJlIGxhdGVyIHVzZWZ1bCwgd2FzOiAoXnxcXHMpKD86Y2FsbHxleGVjdXRlfGV2YWwpP1xcKCg/OlxccytbXlwiXFxyXFxuXFx0IF1cXFMqKSo/XFxzKy0tKD86XFxzK1teXCJcXG5cXHQgXVxcUyopKj9cXHMrXFwpKD89XFxzfCQpXG5cdFx0Ki9cblxuXHRcdC8vIGN1cnJlbnQgc29sdXRpb24gaXMgbm90IGdyZWF0XG5cdFx0J3N0YWNrLWVmZmVjdC1kZWxpbWl0ZXInOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIG9wZW5pbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0cGF0dGVybjogLyhefFxccykoPzpjYWxsfGV2YWx8ZXhlY3V0ZSk/XFwoKD89XFxzKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBtaWRkbGUgLS1cblx0XHRcdFx0cGF0dGVybjogLyhcXHMpLS0oPz1cXHMpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0cGF0dGVybjogLyhcXHMpXFwpKD89XFxzfCQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdH1cblx0XHRdLFxuXG5cdFx0J2NvbWJpbmF0b3JzJzoge1xuXHRcdFx0cGF0dGVybjogbnVsbCxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblxuXHRcdCdrZXJuZWwtYnVpbHRpbic6IHtcblx0XHRcdHBhdHRlcm46IG51bGwsXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHR9LFxuXG5cdFx0J3NlcXVlbmNlcy1idWlsdGluJzoge1xuXHRcdFx0cGF0dGVybjogbnVsbCxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdH0sXG5cblx0XHQnbWF0aC1idWlsdGluJzoge1xuXHRcdFx0cGF0dGVybjogbnVsbCxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdH0sXG5cblx0XHQnY29uc3RydWN0b3Itd29yZCc6IHtcblx0XHRcdC8vIDxhcnJheT4gYnV0IG5vdCA8PT5cblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpPCg/IT0rPnwtKz4pXFxTKz4oPz1cXHN8JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXG5cdFx0J290aGVyLWJ1aWx0aW4tc3ludGF4Jzoge1xuXHRcdFx0cGF0dGVybjogbnVsbCxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH0sXG5cblx0XHQvKlxuXHRcdFx0ZnVsbCBsaXN0IG9mIHN1cHBvcnRlZCB3b3JkIG5hbWluZyBjb252ZW50aW9uczogKHRoZSBjb252ZW50aW9uIGFwcGVhcnMgb3V0c2lkZSBvZiB0aGUgW2JyYWNrZXRzXSlcblx0XHRcdFx0c2V0LVt4XVxuXHRcdFx0XHRjaGFuZ2UtW3hdXG5cdFx0XHRcdHdpdGgtW3hdXG5cdFx0XHRcdG5ldy1beF1cblx0XHRcdFx0PltzdHJpbmddXG5cdFx0XHRcdFtiYXNlXT5cblx0XHRcdFx0W3N0cmluZ10+W251bWJlcl1cblx0XHRcdFx0K1tzeW1ib2xdK1xuXHRcdFx0XHRbYm9vbGVhbi13b3JkXT9cblx0XHRcdFx0P1tvZl1cblx0XHRcdFx0W3Nsb3QtcmVhZGVyXT4+XG5cdFx0XHRcdD4+W3Nsb3Qtc2V0dGVyXVxuXHRcdFx0XHRbc2xvdC13cml0ZXJdPDxcblx0XHRcdFx0KFtpbXBsZW1lbnRhdGlvbi1kZXRhaWxdKVxuXHRcdFx0XHRbbXV0YXRlcl0hXG5cdFx0XHRcdFt2YXJpYW50XSpcblx0XHRcdFx0W3ByZXR0eXByaW50XS5cblx0XHRcdFx0JFtoZWxwLW1hcmt1cF1cblxuXHRcdFx0PGNvbnN0cnVjdG9ycz4sIFNZTlRBWDosIGV0YyBhcmUgc3VwcG9ydGVkIGJ5IHRoZWlyIG93biBwYXR0ZXJucy5cblxuXHRcdFx0YHdpdGhgIGFuZCBgbmV3YCBmcm9tIGBrZXJuZWxgIGFyZSB0aGVpciBvd24gYnVpbHRpbnMuXG5cblx0XHRcdHNlZSA8aHR0cHM6Ly9kb2NzLmZhY3RvcmNvZGUub3JnL2NvbnRlbnQvYXJ0aWNsZS1jb252ZW50aW9ucy5odG1sPlxuXHRcdCovXG5cdFx0J2NvbnZlbnRpb25hbGx5LW5hbWVkLXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/IVwiKSg/Oig/OmNoYW5nZXxuZXd8c2V0fHdpdGgpLVxcUyt8XFwkXFxTK3w+W14+XFxzXSt8W146Plxcc10rPnxbXj5cXHNdKz5bXj5cXHNdK3xcXCtbXitcXHNdK1xcK3xbXj9cXHNdK1xcP3xcXD9bXj9cXHNdK3xbXj5cXHNdKz4+fD4+W14+XFxzXSt8W148XFxzXSs8PHxcXChbXigpXFxzXStcXCl8W14hXFxzXSshfFteKlxcc11cXFMqXFwqfFteLlxcc11cXFMqXFwuKSg/PVxcc3wkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cblx0XHQnY29sb24tc3ludGF4Jzoge1xuXHRcdFx0cGF0dGVybjogLyhefFxccykoPzpbQS1aMC05XFwtXSsjPyk/OnsxLDJ9XFxzKyg/OjtcXFMrfCg/ITspXFxTKykoPz1cXHN8JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblxuXHRcdCdzZW1pY29sb24tb3Itc2V0bG9jYWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxccykoPzo7fDo+KSg/PVxcc3wkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXG5cdFx0Ly8gZG8gbm90IGhpZ2hsaWdodCBsZWFkaW5nIH0gb3IgdHJhaWxpbmcgWHsgYXQgdGhlIGJlZ2luL2VuZCBvZiB0aGUgZmlsZSBhcyBpdCdzIGludmFsaWQgc3ludGF4XG5cdFx0J2N1cmx5LWJyYWNlLWxpdGVyYWwtZGVsaW1pdGVyJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBvcGVuaW5nXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpW2Etel0qXFx7KD89XFxzKS9pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gY2xvc2luZ1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxccylcXH0oPz1cXHN8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdFx0fSxcblxuXHRcdF0sXG5cblx0XHQvLyBkbyBub3QgaGlnaGxpZ2h0IGxlYWRpbmcgXSBvciB0cmFpbGluZyBbIGF0IHRoZSBiZWdpbi9lbmQgb2YgdGhlIGZpbGUgYXMgaXQncyBpbnZhbGlkIHN5bnRheFxuXHRcdCdxdW90YXRpb24tZGVsaW1pdGVyJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBvcGVuaW5nXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxcXHMpXFxbKD89XFxzKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBjbG9zaW5nXG5cdFx0XHRcdHBhdHRlcm46IC8oXFxzKVxcXSg/PVxcc3wkKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHR9LFxuXHRcdF0sXG5cblx0XHQnbm9ybWFsLXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxzKVteXCJcXHNdXFxTKig/PVxcc3wkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdC8qXG5cdFx0XHRiYXNpYyBmaXJzdC1jbGFzcyBzdHJpbmcgXCJhXCJcblx0XHRcdFx0d2l0aCBlc2NhcGVkIGRvdWJsZS1xdW90ZSBcImFcXFwiXCJcblx0XHRcdFx0ZXNjYXBlZCBiYWNrc2xhc2ggXCJcXFxcXCJcblx0XHRcdFx0YW5kIGdlbmVyYWwgZXNjYXBlcyBzaW5jZSBGYWN0b3IgaGFzIHNvIG1hbnkgXCJcXE5cIlxuXG5cdFx0XHRzeW50YXggdGhhdCB3b3JrcyBpbiB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHRoYXQgaXNuJ3QgZnVsbHlcblx0XHRcdHN1cHBvcnRlZCBiZWNhdXNlIGl0J3MgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsOlxuXHRcdFx0XHRcInN0cmluZyAxXCJcInN0cmluZyAyXCIgLT4gMiBzdHJpbmdzICh3b3JrcyBhbnl3YXkpXG5cdFx0XHRcdFwic3RyaW5nXCI1IC0+IHN0cmluZywgNVxuXHRcdFx0XHRcInN0cmluZ1wiWyBdIC0+IHN0cmluZywgcXVvdGF0aW9uXG5cdFx0XHRcdHsgXCJhXCJ9IC0+IGFycmF5PHN0cmluZz5cblxuXHRcdFx0dGhlIHJlc3Qgb2YgdGhvc2UgZXhhbXBsZXMgYWxsIHByb3Blcmx5IHJlY29nbmlzZSB0aGUgc3RyaW5nLCBidXQgbm90XG5cdFx0XHRcdHRoZSBvdGhlciBvYmplY3QgKG51bWJlciwgcXVvdGF0aW9uLCBldGMpXG5cdFx0XHR0aGlzIGlzIGZpbmUgZm9yIGEgcmVnZXgtb25seSBpbXBsZW1lbnRhdGlvbi5cblx0XHQqL1xuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcXFxTfFteXCJcXFxcXSkqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBzdHJpbmdfaW5zaWRlXG5cdFx0fVxuXHR9O1xuXG5cdHZhciBlc2NhcGUgPSBmdW5jdGlvbiAoc3RyKSB7XG5cdFx0cmV0dXJuIChzdHIgKyAnJykucmVwbGFjZSgvKFsuPyorXFxeJFxcW1xcXVxcXFwoKXt9fFxcLV0pL2csICdcXFxcJDEnKTtcblx0fTtcblxuXHR2YXIgYXJyVG9Xb3Jkc1JlZ0V4cCA9IGZ1bmN0aW9uIChhcnIpIHtcblx0XHRyZXR1cm4gbmV3IFJlZ0V4cChcblx0XHRcdCcoXnxcXFxccykoPzonICsgYXJyLm1hcChlc2NhcGUpLmpvaW4oJ3wnKSArICcpKD89XFxcXHN8JCknXG5cdFx0KTtcblx0fTtcblxuXHR2YXIgYnVpbHRpbnMgPSB7XG5cdFx0J2tlcm5lbC1idWlsdGluJzogW1xuXHRcdFx0J29yJywgJzJuaXBkJywgJzRkcm9wJywgJ3R1Y2snLCAnd3JhcHBlcicsICduaXAnLCAnd3JhcHBlcj8nLCAnY2FsbHN0YWNrPmFycmF5JywgJ2RpZScsICdkdXBkJywgJ2NhbGxzdGFjaycsICdjYWxsc3RhY2s/JywgJzNkdXAnLCAnaGFzaGNvZGUnLCAncGljaycsICc0bmlwJywgJ2J1aWxkJywgJz5ib29sZWFuJywgJ25pcGQnLCAnY2xvbmUnLCAnNW5pcCcsICdlcT8nLCAnPycsICc9JywgJ3N3YXBkJywgJzJvdmVyJywgJ2NsZWFyJywgJzJkdXAnLCAnZ2V0LXJldGFpbnN0YWNrJywgJ25vdCcsICd0dXBsZT8nLCAnZHVwJywgJzNuaXBkJywgJ2NhbGwnLCAnLXJvdGQnLCAnb2JqZWN0JywgJ2Ryb3AnLCAnYXNzZXJ0PScsICdhc3NlcnQ/JywgJy1yb3QnLCAnZXhlY3V0ZScsICdib2EnLCAnZ2V0LWNhbGxzdGFjaycsICdjdXJyaWVkPycsICczZHJvcCcsICdwaWNrZCcsICdvdmVyZCcsICdvdmVyJywgJ3JvbGwnLCAnM25pcCcsICdzd2FwJywgJ2FuZCcsICcybmlwJywgJ3JvdGQnLCAndGhyb3cnLCAnKGNsb25lKScsICdoYXNoY29kZSonLCAnc3BpbicsICdyZWFjaCcsICc0ZHVwJywgJ2VxdWFsPycsICdnZXQtZGF0YXN0YWNrJywgJ2Fzc2VydCcsICcyZHJvcCcsICc8d3JhcHBlcj4nLCAnYm9vbGVhbj8nLCAnaWRlbnRpdHktaGFzaGNvZGUnLCAnaWRlbnRpdHktdHVwbGU/JywgJ251bGwnLCAnY29tcG9zZWQ/JywgJ25ldycsICc1ZHJvcCcsICdyb3QnLCAnLXJvbGwnLCAneG9yJywgJ2lkZW50aXR5LXR1cGxlJywgJ2Jvb2xlYW4nXG5cdFx0XSxcblx0XHQnb3RoZXItYnVpbHRpbi1zeW50YXgnOiBbXG5cdFx0XHQvLyBzeW50YXhcblx0XHRcdCc9PT09PT09JywgJ3JlY3Vyc2l2ZScsICdmbHVzaGFibGUnLCAnPj4nLCAnPDw8PDw8JywgJ01cXFxcJywgJ0InLCAnUFJJVkFURT4nLCAnXFxcXCcsICc9PT09PT0nLCAnZmluYWwnLCAnaW5saW5lJywgJ2RlbGltaXRlcicsICdkZXByZWNhdGVkJywgJzxQUklWQVRFJywgJz4+Pj4+PicsICc8PDw8PDw8JywgJ3BhcnNlLWNvbXBsZXgnLCAnbWFsZm9ybWVkLWNvbXBsZXgnLCAncmVhZC1vbmx5JywgJz4+Pj4+Pj4nLCAnY2FsbC1uZXh0LW1ldGhvZCcsICc8PCcsICdmb2xkYWJsZScsXG5cdFx0XHQvLyBsaXRlcmFsc1xuXHRcdFx0JyQnLCAnJFsnLCAnJHsnXG5cdFx0XSxcblx0XHQnc2VxdWVuY2VzLWJ1aWx0aW4nOiBbXG5cdFx0XHQnbWVtYmVyLWVxPycsICdtaXNtYXRjaCcsICdhcHBlbmQnLCAnYXNzZXJ0LXNlcXVlbmNlPScsICdsb25nZXInLCAncmVwZXRpdGlvbicsICdjbG9uZS1saWtlJywgJzNzZXF1ZW5jZScsICdhc3NlcnQtc2VxdWVuY2U/JywgJ2xhc3QtaW5kZXgtZnJvbScsICdyZXZlcnNlZCcsICdpbmRleC1mcm9tJywgJ2N1dConLCAncGFkLXRhaWwnLCAnam9pbi1hcycsICdyZW1vdmUtZXEhJywgJ2NvbmNhdC1hcycsICdidXQtbGFzdCcsICdzbmlwJywgJ250aHMnLCAnbnRoJywgJ3NlcXVlbmNlJywgJ2xvbmdlc3QnLCAnc2xpY2U/JywgJzxzbGljZT4nLCAncmVtb3ZlLW50aCcsICd0YWlsLXNsaWNlJywgJ2VtcHR5PycsICd0YWlsKicsICdtZW1iZXI/JywgJ3ZpcnR1YWwtc2VxdWVuY2U/JywgJ3NldC1sZW5ndGgnLCAnZHJvcC1wcmVmaXgnLCAnaW90YScsICd1bmNsaXAnLCAnYm91bmRzLWVycm9yPycsICd1bmNsaXAtbGFzdC1zbGljZScsICdub24tbmVnYXRpdmUtaW50ZWdlci1leHBlY3RlZCcsICdub24tbmVnYXRpdmUtaW50ZWdlci1leHBlY3RlZD8nLCAnbWlkcG9pbnRAJywgJ2xvbmdlcj8nLCAnP3NldC1udGgnLCAnP2ZpcnN0JywgJ3Jlc3Qtc2xpY2UnLCAncHJlcGVuZC1hcycsICdwcmVwZW5kJywgJ2ZvdXJ0aCcsICdzaWZ0JywgJ3N1YnNlcS1zdGFydCcsICduZXctc2VxdWVuY2UnLCAnP2xhc3QnLCAnbGlrZScsICdmaXJzdDQnLCAnMXNlcXVlbmNlJywgJ3JldmVyc2UnLCAnc2xpY2UnLCAndmlydHVhbEAnLCAncmVwZXRpdGlvbj8nLCAnc2V0LWxhc3QnLCAnaW5kZXgnLCAnNHNlcXVlbmNlJywgJ21heC1sZW5ndGgnLCAnc2V0LXNlY29uZCcsICdpbW11dGFibGUtc2VxdWVuY2UnLCAnZmlyc3QyJywgJ2ZpcnN0MycsICdzdXByZW11bScsICd1bmNsaXAtc2xpY2UnLCAnc3VmZml4IScsICdpbnNlcnQtbnRoJywgJ3RhaWwnLCAnM2FwcGVuZCcsICdzaG9ydCcsICdzdWZmaXgnLCAnY29uY2F0JywgJ2ZsaXAnLCAnaW1tdXRhYmxlPycsICdyZXZlcnNlIScsICcyc2VxdWVuY2UnLCAnc3VtJywgJ2RlbGV0ZS1hbGwnLCAnaW5kaWNlcycsICdzbmlwLXNsaWNlJywgJzxpb3RhPicsICdjaGVjay1zbGljZScsICdzZXF1ZW5jZT8nLCAnaGVhZCcsICdhcHBlbmQtYXMnLCAnaGFsdmVzJywgJ3NlcXVlbmNlPScsICdjb2xsYXBzZS1zbGljZScsICc/c2Vjb25kJywgJ3NsaWNlLWVycm9yPycsICdwcm9kdWN0JywgJ2JvdW5kcy1jaGVjaz8nLCAnYm91bmRzLWNoZWNrJywgJ2ltbXV0YWJsZScsICd2aXJ0dWFsLWV4ZW1wbGFyJywgJ2hhcnZlc3QnLCAncmVtb3ZlJywgJ3BhZC1oZWFkJywgJ2xhc3QnLCAnc2V0LWZvdXJ0aCcsICdjYXJ0ZXNpYW4tcHJvZHVjdCcsICdyZW1vdmUtZXEnLCAnc2hvcnRlbicsICdzaG9ydGVyJywgJ3JldmVyc2VkPycsICdzaG9ydGVyPycsICdzaG9ydGVzdCcsICdoZWFkLXNsaWNlJywgJ3BvcConLCAndGFpbC1zbGljZSonLCAnYnV0LWxhc3Qtc2xpY2UnLCAnaW90YT8nLCAnYXBwZW5kIScsICdjdXQtc2xpY2UnLCAnbmV3LXJlc2l6YWJsZScsICdoZWFkLXNsaWNlKicsICdzZXF1ZW5jZS1oYXNoY29kZScsICdwb3AnLCAnc2V0LW50aCcsICc/bnRoJywgJ3NlY29uZCcsICdqb2luJywgJ2ltbXV0YWJsZS1zZXF1ZW5jZT8nLCAnPHJldmVyc2VkPicsICczYXBwZW5kLWFzJywgJ3ZpcnR1YWwtc2VxdWVuY2UnLCAnc3Vic2VxPycsICdyZW1vdmUtbnRoIScsICdsZW5ndGgnLCAnbGFzdC1pbmRleCcsICdsZW5ndGhlbicsICdhc3NlcnQtc2VxdWVuY2UnLCAnY29weScsICdtb3ZlJywgJ3RoaXJkJywgJ2ZpcnN0JywgJ3RhaWw/JywgJ3NldC1maXJzdCcsICdwcmVmaXgnLCAnYm91bmRzLWVycm9yJywgJzxyZXBldGl0aW9uPicsICdleGNoYW5nZScsICdzdXJyb3VuZCcsICdjdXQnLCAnbWluLWxlbmd0aCcsICdzZXQtdGhpcmQnLCAncHVzaC1hbGwnLCAnaGVhZD8nLCAnc3Vic2VxLXN0YXJ0LWZyb20nLCAnZGVsZXRlLXNsaWNlJywgJ3Jlc3QnLCAnc3VtLWxlbmd0aHMnLCAnaGVhZConLCAnaW5maW11bScsICdyZW1vdmUhJywgJ2dsdWUnLCAnc2xpY2UtZXJyb3InLCAnc3Vic2VxJywgJ3B1c2gnLCAncmVwbGFjZS1zbGljZScsICdzdWJzZXEtYXMnLCAndW5jbGlwLWxhc3QnXG5cdFx0XSxcblx0XHQnbWF0aC1idWlsdGluJzogW1xuXHRcdFx0J251bWJlcj0nLCAnbmV4dC1wb3dlci1vZi0yJywgJz8xKycsICdmcC1zcGVjaWFsPycsICdpbWFnaW5hcnktcGFydCcsICdmbG9hdD5iaXRzJywgJ251bWJlcj8nLCAnZnAtaW5maW5pdHk/JywgJ2JpZ251bT8nLCAnZnAtc25hbj8nLCAnZGVub21pbmF0b3InLCAnZ2NkJywgJyonLCAnKycsICdmcC1iaXR3aXNlPScsICctJywgJ3U+PScsICcvJywgJz49JywgJ2JpdGFuZCcsICdwb3dlci1vZi0yPycsICdsb2cyLWV4cGVjdHMtcG9zaXRpdmUnLCAnbmVnPycsICc8JywgJ2xvZzInLCAnPicsICdpbnRlZ2VyPycsICdudW1iZXInLCAnYml0cz5kb3VibGUnLCAnMi8nLCAnemVybz8nLCAnYml0cz5mbG9hdCcsICdmbG9hdD8nLCAnc2hpZnQnLCAncmF0aW8/JywgJ3JlY3Q+JywgJ2V2ZW4/JywgJ3JhdGlvJywgJ2ZwLXNpZ24nLCAnYml0bm90JywgJz5maXhudW0nLCAnY29tcGxleD8nLCAnL2knLCAnaW50ZWdlcj5maXhudW0nLCAnL2YnLCAnc2duJywgJz5iaWdudW0nLCAnbmV4dC1mbG9hdCcsICd1PCcsICd1PicsICdtb2QnLCAncmVjaXAnLCAncmF0aW9uYWwnLCAnPmZsb2F0JywgJzJeJywgJ2ludGVnZXInLCAnZml4bnVtPycsICduZWcnLCAnZml4bnVtJywgJ3NxJywgJ2JpZ251bScsICc+cmVjdCcsICdiaXQ/JywgJ2ZwLXFuYW4/JywgJ3NpbXBsZS1nY2QnLCAnY29tcGxleCcsICc8ZnAtbmFuPicsICdyZWFsJywgJz5mcmFjdGlvbicsICdkb3VibGU+Yml0cycsICdiaXRvcicsICdyZW0nLCAnZnAtbmFuLXBheWxvYWQnLCAncmVhbC1wYXJ0JywgJ2xvZzItZXhwZWN0cy1wb3NpdGl2ZT8nLCAncHJldi1mbG9hdCcsICdhbGlnbicsICd1bm9yZGVyZWQ/JywgJ2Zsb2F0JywgJ2ZwLW5hbj8nLCAnYWJzJywgJ2JpdHhvcicsICdpbnRlZ2VyPmZpeG51bS1zdHJpY3QnLCAndTw9JywgJ29kZD8nLCAnPD0nLCAnL21vZCcsICc+aW50ZWdlcicsICdyZWFsPycsICdyYXRpb25hbD8nLCAnbnVtZXJhdG9yJ1xuXHRcdF1cblx0XHQvLyB0aGF0J3MgYWxsIGZvciBub3dcblx0fTtcblxuXHRPYmplY3Qua2V5cyhidWlsdGlucykuZm9yRWFjaChmdW5jdGlvbiAoaykge1xuXHRcdGZhY3RvcltrXS5wYXR0ZXJuID0gYXJyVG9Xb3Jkc1JlZ0V4cChidWlsdGluc1trXSk7XG5cdH0pO1xuXG5cdHZhciBjb21iaW5hdG9ycyA9IFtcblx0XHQvLyBrZXJuZWxcblx0XHQnMmJpJywgJ3doaWxlJywgJzJ0cmknLCAnYmkqJywgJzRkaXAnLCAnYm90aD8nLCAnc2FtZT8nLCAndHJpQCcsICdjdXJyeScsICdwcmVwb3NlJywgJzNiaScsICc/aWYnLCAndHJpKicsICcya2VlcCcsICcza2VlcCcsICdjdXJyaWVkJywgJzJrZWVwZCcsICd3aGVuJywgJzJiaSonLCAnMnRyaSonLCAnNGtlZXAnLCAnYmlAJywgJ2tlZXBkZCcsICdkbycsICd1bmxlc3MqJywgJ3RyaS1jdXJyeScsICdpZionLCAnbG9vcCcsICdiaS1jdXJyeSonLCAnd2hlbionLCAnMmJpQCcsICcydHJpQCcsICd3aXRoJywgJzJ3aXRoJywgJ2VpdGhlcj8nLCAnYmknLCAndW50aWwnLCAnM2RpcCcsICczY3VycnknLCAndHJpLWN1cnJ5KicsICd0cmktY3VycnlAJywgJ2JpLWN1cnJ5JywgJ2tlZXBkJywgJ2NvbXBvc2UnLCAnMmRpcCcsICdpZicsICczdHJpJywgJ3VubGVzcycsICd0dXBsZScsICdrZWVwJywgJzJjdXJyeScsICd0cmknLCAnbW9zdCcsICd3aGlsZSonLCAnZGlwJywgJ2NvbXBvc2VkJywgJ2JpLWN1cnJ5QCcsXG5cdFx0Ly8gc2VxdWVuY2VzXG5cdFx0J2ZpbmQtbGFzdC1mcm9tJywgJ3RyaW0taGVhZC1zbGljZScsICdtYXAtYXMnLCAnZWFjaC1mcm9tJywgJ25vbmU/JywgJ3RyaW0tdGFpbCcsICdwYXJ0aXRpb24nLCAnaWYtZW1wdHknLCAnYWNjdW11bGF0ZSonLCAncmVqZWN0IScsICdmaW5kLWZyb20nLCAnYWNjdW11bGF0ZS1hcycsICdjb2xsZWN0b3ItZm9yLWFzJywgJ3JlamVjdCcsICdtYXAnLCAnbWFwLXN1bScsICdhY2N1bXVsYXRlIScsICcyZWFjaC1mcm9tJywgJ2ZvbGxvdycsICdzdXByZW11bS1ieScsICdtYXAhJywgJ3VubGVzcy1lbXB0eScsICdjb2xsZWN0b3InLCAncGFkZGluZycsICdyZWR1Y2UtaW5kZXgnLCAncmVwbGljYXRlLWFzJywgJ2luZmltdW0tYnknLCAndHJpbS10YWlsLXNsaWNlJywgJ2NvdW50JywgJ2ZpbmQtaW5kZXgnLCAnZmlsdGVyJywgJ2FjY3VtdWxhdGUqIScsICdyZWplY3QtYXMnLCAnbWFwLWludGVnZXJzJywgJ21hcC1maW5kJywgJ3JlZHVjZScsICdzZWxlY3RvcicsICdpbnRlcmxlYXZlJywgJzJtYXAnLCAnZmlsdGVyLWFzJywgJ2JpbmFyeS1yZWR1Y2UnLCAnbWFwLWluZGV4LWFzJywgJ2ZpbmQnLCAncHJvZHVjZScsICdmaWx0ZXIhJywgJ3JlcGxpY2F0ZScsICdjYXJ0ZXNpYW4tbWFwJywgJ2NhcnRlc2lhbi1lYWNoJywgJ2ZpbmQtaW5kZXgtZnJvbScsICdtYXAtZmluZC1sYXN0JywgJzNtYXAtYXMnLCAnM21hcCcsICdmaW5kLWxhc3QnLCAnc2VsZWN0b3ItYXMnLCAnMm1hcC1hcycsICcybWFwLXJlZHVjZScsICdhY2N1bXVsYXRlJywgJ2VhY2gnLCAnZWFjaC1pbmRleCcsICdhY2N1bXVsYXRlKi1hcycsICd3aGVuLWVtcHR5JywgJ2FsbD8nLCAnY29sbGVjdG9yLWFzJywgJ3B1c2gtZWl0aGVyJywgJ25ldy1saWtlJywgJ2NvbGxlY3Rvci1mb3InLCAnMnNlbGVjdG9yJywgJ3B1c2gtaWYnLCAnMmFsbD8nLCAnbWFwLXJlZHVjZScsICczZWFjaCcsICdhbnk/JywgJ3RyaW0tc2xpY2UnLCAnMnJlZHVjZScsICdjaGFuZ2UtbnRoJywgJ3Byb2R1Y2UtYXMnLCAnMmVhY2gnLCAndHJpbScsICd0cmltLWhlYWQnLCAnY2FydGVzaWFuLWZpbmQnLCAnbWFwLWluZGV4Jyxcblx0XHQvLyBtYXRoXG5cdFx0J2lmLXplcm8nLCAnZWFjaC1pbnRlZ2VyJywgJ3VubGVzcy16ZXJvJywgJyhmaW5kLWludGVnZXIpJywgJ3doZW4temVybycsICdmaW5kLWxhc3QtaW50ZWdlcicsICcoYWxsLWludGVnZXJzPyknLCAndGltZXMnLCAnKGVhY2gtaW50ZWdlciknLCAnZmluZC1pbnRlZ2VyJywgJ2FsbC1pbnRlZ2Vycz8nLFxuXHRcdC8vIG1hdGguY29tYmluYXRvcnNcblx0XHQndW5sZXNzLW5lZ2F0aXZlJywgJ2lmLXBvc2l0aXZlJywgJ3doZW4tcG9zaXRpdmUnLCAnd2hlbi1uZWdhdGl2ZScsICd1bmxlc3MtcG9zaXRpdmUnLCAnaWYtbmVnYXRpdmUnLFxuXHRcdC8vIGNvbWJpbmF0b3JzXG5cdFx0J2Nhc2UnLCAnMmNsZWF2ZScsICdjb25kPnF1b3QnLCAnY2FzZT5xdW90JywgJzNjbGVhdmUnLCAnd3JvbmctdmFsdWVzJywgJ3RvLWZpeGVkLXBvaW50JywgJ2FsaXN0PnF1b3QnLCAnY29uZCcsICdjbGVhdmUnLCAnY2FsbC1lZmZlY3QnLCAncmVjdXJzaXZlLWhhc2hjb2RlJywgJ3NwcmVhZCcsICdkZWVwLXNwcmVhZD5xdW90Jyxcblx0XHQvLyBjb21iaW5hdG9ycy5zaG9ydC1jaXJjdWl0XG5cdFx0JzJ8fCcsICcwfHwnLCAnbnx8JywgJzAmJicsICcyJiYnLCAnM3x8JywgJzF8fCcsICcxJiYnLCAnbiYmJywgJzMmJicsXG5cdFx0Ly8gY29tYmluYXRvcnMuc21hcnRcblx0XHQnc21hcnQtdW5sZXNzKicsICdrZWVwLWlucHV0cycsICdyZWR1Y2Utb3V0cHV0cycsICdzbWFydC13aGVuKicsICdjbGVhdmU+YXJyYXknLCAnc21hcnQtd2l0aCcsICdzbWFydC1hcHBseScsICdzbWFydC1pZicsICdpbnB1dHMvb3V0cHV0cycsICdvdXRwdXQ+c2VxdWVuY2UtbicsICdtYXAtb3V0cHV0cycsICdtYXAtcmVkdWNlLW91dHB1dHMnLCAnZHJvcHBpbmcnLCAnb3V0cHV0PmFycmF5JywgJ3NtYXJ0LW1hcC1yZWR1Y2UnLCAnc21hcnQtMm1hcC1yZWR1Y2UnLCAnb3V0cHV0PmFycmF5LW4nLCAnbnVsbGFyeScsICdpbnB1dDxzZXF1ZW5jZScsICdhcHBlbmQtb3V0cHV0cycsICdkcm9wLWlucHV0cycsICdpbnB1dHMnLCAnc21hcnQtMnJlZHVjZScsICdkcm9wLW91dHB1dHMnLCAnc21hcnQtcmVkdWNlJywgJ3ByZXNlcnZpbmcnLCAnc21hcnQtd2hlbicsICdvdXRwdXRzJywgJ2FwcGVuZC1vdXRwdXRzLWFzJywgJ3NtYXJ0LXVubGVzcycsICdzbWFydC1pZionLCAnc3VtLW91dHB1dHMnLCAnaW5wdXQ8c2VxdWVuY2UtdW5zYWZlJywgJ291dHB1dD5zZXF1ZW5jZScsXG5cdFx0Ly8gdGFmblxuXHRdO1xuXG5cdGZhY3Rvci5jb21iaW5hdG9ycy5wYXR0ZXJuID0gYXJyVG9Xb3Jkc1JlZ0V4cChjb21iaW5hdG9ycyk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmZhY3RvciA9IGZhY3RvcjtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdC8qKlxuXHQgKiBCYXNlZCBvbiB0aGUgbWFudWFsIGJ5IFdvdXRlciB2YW4gT29ydG1lcnNzZW4uXG5cdCAqXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9QcmlzbUpTL3ByaXNtL2lzc3Vlcy8yODAxI2lzc3VlLTgyOTcxNzUwNH1cblx0ICovXG5cdFByaXNtLmxhbmd1YWdlc1snZmFsc2UnXSA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXHtbXn1dKlxcfS9cblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCJbXlwiXSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdjaGFyYWN0ZXItY29kZSc6IHtcblx0XHRcdHBhdHRlcm46IC8nKD86W15cXHJdfFxcclxcbj8pLyxcblx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdH0sXG5cdFx0J2Fzc2VtYmxlci1jb2RlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcZCtgLyxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdH0sXG5cdFx0J251bWJlcic6IC9cXGQrLyxcblx0XHQnb3BlcmF0b3InOiAvWy0hIyQlJicqKywuLzo7PT4/QFxcXFxeX2B8flx1MDBERlx1MDBGOF0vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9cXFt8XFxdLyxcblx0XHQndmFyaWFibGUnOiAvW2Etel0vLFxuXHRcdCdub24tc3RhbmRhcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvWygpPEJET1x1MDBBRV0vLFxuXHRcdFx0YWxpYXM6ICdib2xkJ1xuXHRcdH1cblx0fTtcbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzWydmaXJlc3RvcmUtc2VjdXJpdHktcnVsZXMnXSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnY29tbWVudCc6IC9cXC9cXC8uKi8sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFsbG93fGZ1bmN0aW9ufGlmfG1hdGNofG51bGx8cmV0dXJufHJ1bGVzX3ZlcnNpb258c2VydmljZSlcXGIvLFxuXHQnb3BlcmF0b3InOiAvJiZ8XFx8XFx8fFs8PiE9XT0/fFstKyovJV18XFxiKD86aW58aXMpXFxiLyxcbn0pO1xuXG5kZWxldGUgUHJpc20ubGFuZ3VhZ2VzWydmaXJlc3RvcmUtc2VjdXJpdHktcnVsZXMnXVsnY2xhc3MtbmFtZSddO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdmaXJlc3RvcmUtc2VjdXJpdHktcnVsZXMnLCAna2V5d29yZCcsIHtcblx0J3BhdGgnOiB7XG5cdFx0cGF0dGVybjogLyhefFtcXHMoKSxdKSg/OlxcLyg/OltcXHdcXHhBMC1cXHVGRkZGXSt8XFx7W1xcd1xceEEwLVxcdUZGRkZdKyg/Oj1cXCpcXCopP1xcfXxcXCRcXChbXFx3XFx4QTAtXFx1RkZGRi5dK1xcKSkpKy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXHtbXFx3XFx4QTAtXFx1RkZGRl0rKD86PVxcKlxcKik/XFx9fFxcJFxcKFtcXHdcXHhBMC1cXHVGRkZGLl0rXFwpLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J29wZXJhdG9yJzogLz0vLFxuXHRcdFx0XHRcdCdrZXl3b3JkJzogL1xcKlxcKi8sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1suJCgpe31dL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLy9cblx0XHR9XG5cdH0sXG5cdCdtZXRob2QnOiB7XG5cdFx0Ly8gdG8gbWFrZSB0aGUgcGF0dGVybiBzaG9ydGVyLCB0aGUgYWN0dWFsIG1ldGhvZCBuYW1lcyBhcmUgb21pdHRlZFxuXHRcdHBhdHRlcm46IC8oXFxiYWxsb3dcXHMrKVthLXpdKyg/OlxccyosXFxzKlthLXpdKykqKD89XFxzKls6O10pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnYnVpbHRpbicsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvLC9cblx0XHR9XG5cdH0sXG59KTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHRQcmlzbS5sYW5ndWFnZXMuZmxvdyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2phdmFzY3JpcHQnLCB7fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZmxvdycsICdrZXl3b3JkJywge1xuXHRcdCd0eXBlJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86W0JiXW9vbGVhbnxGdW5jdGlvbnxbTm5ddW1iZXJ8W1NzXXRyaW5nfFtTc115bWJvbHxhbnl8bWl4ZWR8bnVsbHx2b2lkKVxcYi8sXG5cdFx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHRcdH1cblx0XHRdXG5cdH0pO1xuXHRQcmlzbS5sYW5ndWFnZXMuZmxvd1snZnVuY3Rpb24tdmFyaWFibGUnXS5wYXR0ZXJuID0gLyg/IVxccylbXyRhLXpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSooPz1cXHMqPVxccyooPzpmdW5jdGlvblxcYnwoPzpcXChbXigpXSpcXCkoPzpcXHMqOlxccypcXHcrKT98KD8hXFxzKVtfJGEtelxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKilcXHMqPT4pKS9pO1xuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLmZsb3dbJ3BhcmFtZXRlciddO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2Zsb3cnLCAnb3BlcmF0b3InLCB7XG5cdFx0J2Zsb3ctcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFx7XFx8fFxcfFxcfS8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH1cblx0fSk7XG5cblx0aWYgKCFBcnJheS5pc0FycmF5KFByaXNtLmxhbmd1YWdlcy5mbG93LmtleXdvcmQpKSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzLmZsb3cua2V5d29yZCA9IFtQcmlzbS5sYW5ndWFnZXMuZmxvdy5rZXl3b3JkXTtcblx0fVxuXHRQcmlzbS5sYW5ndWFnZXMuZmxvdy5rZXl3b3JkLnVuc2hpZnQoXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteJF1cXGIpKD86Q2xhc3N8ZGVjbGFyZXxvcGFxdWV8dHlwZSlcXGIoPyFcXCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXiRdXFxCKVxcJCg/OkRpZmZ8RW51bXxFeGFjdHxLZXlzfE9iak1hcHxQcm9wZXJ0eVR5cGV8UmVjb3JkfFNoYXBlfFN1YnR5cGV8U3VwZXJ0eXBlfGF3YWl0KVxcYig/IVxcJCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0KTtcbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmZvcnRyYW4gPSB7XG5cdCdxdW90ZWQtbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC9bQk9aXShbJ1wiXSlbQS1GMC05XStcXDEvaSxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKD86XFxiXFx3K18pPyhbJ1wiXSkoPzpcXDFcXDF8Jig/Olxcclxcbj98XFxuKSg/OlsgXFx0XSohLiooPzpcXHJcXG4/fFxcbil8KD8hWyBcXHRdKiEpKXwoPyFcXDEpLikqKD86XFwxfCYpLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdjb21tZW50Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCYoPzpcXHJcXG4/fFxcbilcXHMqKSEuKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8hLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnYm9vbGVhbic6IC9cXC4oPzpGQUxTRXxUUlVFKVxcLig/Ol9cXHcrKT8vaSxcblx0J251bWJlcic6IC8oPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86W0VEXVsrLV0/XFxkKyk/KD86X1xcdyspPy9pLFxuXHQna2V5d29yZCc6IFtcblx0XHQvLyBUeXBlc1xuXHRcdC9cXGIoPzpDSEFSQUNURVJ8Q09NUExFWHxET1VCTEUgP1BSRUNJU0lPTnxJTlRFR0VSfExPR0lDQUx8UkVBTClcXGIvaSxcblx0XHQvLyBFTkQgc3RhdGVtZW50c1xuXHRcdC9cXGIoPzpFTkQgPyk/KD86QkxPQ0sgP0RBVEF8RE98RklMRXxGT1JBTEx8RlVOQ1RJT058SUZ8SU5URVJGQUNFfE1PRFVMRSg/ISBQUk9DRURVUkUpfFBST0dSQU18U0VMRUNUfFNVQlJPVVRJTkV8VFlQRXxXSEVSRSlcXGIvaSxcblx0XHQvLyBTdGF0ZW1lbnRzXG5cdFx0L1xcYig/OkFMTE9DQVRBQkxFfEFMTE9DQVRFfEJBQ0tTUEFDRXxDQUxMfENBU0V8Q0xPU0V8Q09NTU9OfENPTlRBSU5TfENPTlRJTlVFfENZQ0xFfERBVEF8REVBTExPQ0FURXxESU1FTlNJT058RE98RU5EfEVRVUlWQUxFTkNFfEVYSVR8RVhURVJOQUx8Rk9STUFUfEdPID9UT3xJTVBMSUNJVCg/OiBOT05FKT98SU5RVUlSRXxJTlRFTlR8SU5UUklOU0lDfE1PRFVMRSBQUk9DRURVUkV8TkFNRUxJU1R8TlVMTElGWXxPUEVOfE9QVElPTkFMfFBBUkFNRVRFUnxQT0lOVEVSfFBSSU5UfFBSSVZBVEV8UFVCTElDfFJFQUR8UkVUVVJOfFJFV0lORHxTQVZFfFNFTEVDVHxTVE9QfFRBUkdFVHxXSElMRXxXUklURSlcXGIvaSxcblx0XHQvLyBPdGhlcnNcblx0XHQvXFxiKD86QVNTSUdOTUVOVHxERUZBVUxUfEVMRU1FTlRBTHxFTFNFfEVMU0VJRnxFTFNFV0hFUkV8RU5UUll8SU58SU5DTFVERXxJTk9VVHxLSU5EfE5VTEx8T05MWXxPUEVSQVRPUnxPVVR8UFVSRXxSRUNVUlNJVkV8UkVTVUxUfFNFUVVFTkNFfFNUQVR8VEhFTnxVU0UpXFxiL2lcblx0XSxcblx0J29wZXJhdG9yJzogW1xuXHRcdC9cXCpcXCp8XFwvXFwvfD0+fFs9XFwvXT18Wzw+XT0/fDo6fFsrXFwtKj0lXXxcXC5bQS1aXStcXC4vaSxcblx0XHR7XG5cdFx0XHQvLyBVc2UgbG9va2JlaGluZCB0byBwcmV2ZW50IGNvbmZ1c2lvbiB3aXRoICgvIC8pXG5cdFx0XHRwYXR0ZXJuOiAvKF58KD8hXFwoKS4pXFwvKD8hXFwpKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQncHVuY3R1YXRpb24nOiAvXFwoXFwvfFxcL1xcKXxbKCksOzomXS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvLyBodHRwczovL2ZyZWVtYXJrZXIuYXBhY2hlLm9yZy9kb2NzL2RndWlfdGVtcGxhdGVfZXhwLmh0bWxcblxuXHQvLyBGVEwgZXhwcmVzc2lvbiB3aXRoIDQgbGV2ZWxzIG9mIG5lc3Rpbmcgc3VwcG9ydGVkXG5cdHZhciBGVExfRVhQUiA9IC9bXjwoKVwiJ118XFwoKD86PGV4cHI+KSpcXCl8PCg/ISMtLSl8PCMtLSg/OlteLV18LSg/IS0+KSkqLS0+fFwiKD86W15cXFxcXCJdfFxcXFwuKSpcInwnKD86W15cXFxcJ118XFxcXC4pKicvLnNvdXJjZTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCAyOyBpKyspIHtcblx0XHRGVExfRVhQUiA9IEZUTF9FWFBSLnJlcGxhY2UoLzxleHByPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBGVExfRVhQUjsgfSk7XG5cdH1cblx0RlRMX0VYUFIgPSBGVExfRVhQUi5yZXBsYWNlKC88ZXhwcj4vZywgL1teXFxzXFxTXS8uc291cmNlKTtcblxuXHR2YXIgZnRsID0ge1xuXHRcdCdjb21tZW50JzogLzwjLS1bXFxzXFxTXSo/LS0+Lyxcblx0XHQnc3RyaW5nJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyByYXcgc3RyaW5nXG5cdFx0XHRcdHBhdHRlcm46IC9cXGJyKFwifCcpKD86KD8hXFwxKVteXFxcXF18XFxcXC4pKlxcMS8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXCJ8JykoPzooPyFcXDF8XFwkXFx7KVteXFxcXF18XFxcXC58XFwkXFx7KD86KD8hXFx9KSg/OjxleHByPikpKlxcfSkqXFwxLy5zb3VyY2UucmVwbGFjZSgvPGV4cHI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIEZUTF9FWFBSOyB9KSksXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLygoPzpefFteXFxcXF0pKD86XFxcXFxcXFwpKilcXCRcXHsoPzooPyFcXH0pKD86PGV4cHI+KSkqXFx9Ly5zb3VyY2UucmVwbGFjZSgvPGV4cHI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIEZUTF9FWFBSOyB9KSksXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9eXFwkXFx7fFxcfSQvLFxuXHRcdFx0XHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHJlc3Q6IG51bGxcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmFzKVxcYi8sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdCdidWlsdGluLWZ1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFteP10pXFw/XFxzKilcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uJzogL1xcYlxcdysoPz1cXHMqXFwoKS8sXG5cdFx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKyk/XFxiLyxcblx0XHQnb3BlcmF0b3InOiAvXFwuXFwuWzwqIV0/fC0+fC0tfFxcK1xcK3wmJnxcXHxcXHx8XFw/ezEsMn18Wy0rKi8lIT08Pl09P3xcXGIoPzpndHxndGV8bHR8bHRlKVxcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1ssOy46KClbXFxde31dL1xuXHR9O1xuXG5cdGZ0bC5zdHJpbmdbMV0uaW5zaWRlLmludGVycG9sYXRpb24uaW5zaWRlLnJlc3QgPSBmdGw7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmZ0bCA9IHtcblx0XHQnZnRsLWNvbW1lbnQnOiB7XG5cdFx0XHQvLyB0aGUgcGF0dGVybiBpcyBzaG9ydGVuZWQgdG8gYmUgbW9yZSBlZmZpY2llbnRcblx0XHRcdHBhdHRlcm46IC9ePCMtLVtcXHNcXFNdKi8sXG5cdFx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdFx0fSxcblx0XHQnZnRsLWRpcmVjdGl2ZSc6IHtcblx0XHRcdHBhdHRlcm46IC9ePFtcXHNcXFNdKz4kLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXjxcXC8/KVsjQF1bYS16XVxcdyovaSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL148XFwvP3xcXC8/PiQvLFxuXHRcdFx0XHQnY29udGVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxzKlxcU1tcXHNcXFNdKi8sXG5cdFx0XHRcdFx0YWxpYXM6ICdmdGwnLFxuXHRcdFx0XHRcdGluc2lkZTogZnRsXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdmdGwtaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9eXFwkXFx7W1xcc1xcU10qXFx9JC8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXCRcXHt8XFx9JC8sXG5cdFx0XHRcdCdjb250ZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXHMqXFxTW1xcc1xcU10qLyxcblx0XHRcdFx0XHRhbGlhczogJ2Z0bCcsXG5cdFx0XHRcdFx0aW5zaWRlOiBmdGxcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXVzZWxlc3MtbGF6eVxuXHRcdHZhciBwYXR0ZXJuID0gUmVnRXhwKC88Iy0tW1xcc1xcU10qPy0tPnw8XFwvP1sjQF1bYS16QS1aXSg/OjxleHByPikqPz58XFwkXFx7KD86PGV4cHI+KSo/XFx9Ly5zb3VyY2UucmVwbGFjZSgvPGV4cHI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIEZUTF9FWFBSOyB9KSwgJ2dpJyk7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ2Z0bCcsIHBhdHRlcm4pO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS50b2tlbml6ZVBsYWNlaG9sZGVycyhlbnYsICdmdGwnKTtcblx0fSk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmdhbWVtYWtlcmxhbmd1YWdlID0gUHJpc20ubGFuZ3VhZ2VzLmdtbCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQna2V5d29yZCc6IC9cXGIoPzpicmVha3xjYXNlfGNvbnRpbnVlfGRlZmF1bHR8ZG98ZWxzZXxlbnVtfGV4aXR8Zm9yfGdsb2JhbHZhcnxpZnxyZXBlYXR8cmV0dXJufHN3aXRjaHx1bnRpbHx2YXJ8d2hpbGUpXFxiLyxcblx0J251bWJlcic6IC8oPzpcXGIweFtcXGRhLWZdK3woPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KVt1bGZdezAsNH0vaSxcblx0J29wZXJhdG9yJzogLy0tfFxcK1xcK3xbLSslLz1dPT98IT18XFwqXFwqPz0/fDxbPD0+XT98Pls9Pl0/fCYmP3xcXF5cXF4/fFxcfFxcfD98fnxcXGIoPzphbmR8YXR8bm90fG9yfHdpdGh8eG9yKVxcYi8sXG5cdCdjb25zdGFudCc6IC9cXGIoPzpHTV9idWlsZF9kYXRlfEdNX3ZlcnNpb258YWN0aW9uXyg/OmNvbnRpbnVlfHJlc3RhcnR8cmV2ZXJzZXxzdG9wKXxhbGx8Z2FtZXNwZWVkXyg/OmZwc3xtaWNyb3NlY29uZHMpfGdsb2JhbHxsb2NhbHxub29uZXxvdGhlcnxwaXxwb2ludGVyXyg/OmludmFsaWR8bnVsbCl8c2VsZnx0aW1lem9uZV8oPzpsb2NhbHx1dGMpfHVuZGVmaW5lZHxldl8oPzpjcmVhdGV8ZGVzdHJveXxzdGVwfGFsYXJtfGtleWJvYXJkfG1vdXNlfGNvbGxpc2lvbnxvdGhlcnxkcmF3fGRyYXdfKD86YmVnaW58ZW5kfHBvc3R8cHJlKXxrZXlwcmVzc3xrZXlyZWxlYXNlfHRyaWdnZXJ8KD86bGVmdHxtaWRkbGV8bm98cmlnaHQpX2J1dHRvbnwoPzpsZWZ0fG1pZGRsZXxyaWdodClfcHJlc3N8KD86bGVmdHxtaWRkbGV8cmlnaHQpX3JlbGVhc2V8bW91c2VfKD86ZW50ZXJ8bGVhdmV8d2hlZWxfZG93bnx3aGVlbF91cCl8Z2xvYmFsXyg/OmxlZnR8bWlkZGxlfHJpZ2h0KV9idXR0b258Z2xvYmFsXyg/OmxlZnR8bWlkZGxlfHJpZ2h0KV9wcmVzc3xnbG9iYWxfKD86bGVmdHxtaWRkbGV8cmlnaHQpX3JlbGVhc2V8am95c3RpY2soPzoxfDIpXyg/OmJ1dHRvbjF8YnV0dG9uMnxidXR0b24zfGJ1dHRvbjR8YnV0dG9uNXxidXR0b242fGJ1dHRvbjd8YnV0dG9uOHxkb3dufGxlZnR8cmlnaHR8dXApfG91dHNpZGV8Ym91bmRhcnl8Z2FtZV9zdGFydHxnYW1lX2VuZHxyb29tX3N0YXJ0fHJvb21fZW5kfG5vX21vcmVfbGl2ZXN8YW5pbWF0aW9uX2VuZHxlbmRfb2ZfcGF0aHxub19tb3JlX2hlYWx0aHx1c2VyXFxkfGd1aXxndWlfYmVnaW58Z3VpX2VuZHxzdGVwXyg/OmJlZ2lufGVuZHxub3JtYWwpKXx2a18oPzphbHR8YW55a2V5fGJhY2tzcGFjZXxjb250cm9sfGRlbGV0ZXxkb3dufGVuZHxlbnRlcnxlc2NhcGV8aG9tZXxpbnNlcnR8bGVmdHxub2tleXxwYWdlZG93bnxwYWdldXB8cGF1c2V8cHJpbnRzY3JlZW58cmV0dXJufHJpZ2h0fHNoaWZ0fHNwYWNlfHRhYnx1cHxmXFxkfG51bXBhZFxcZHxhZGR8ZGVjaW1hbHxkaXZpZGV8bGFsdHxsY29udHJvbHxsc2hpZnR8bXVsdGlwbHl8cmFsdHxyY29udHJvbHxyc2hpZnR8c3VidHJhY3QpfGFjaGlldmVtZW50Xyg/OmZpbHRlcl8oPzphbGxfcGxheWVyc3xmYXZvcml0ZXNfb25seXxmcmllbmRzX29ubHkpfGZyaWVuZHNfaW5mb3xpbmZvfGxlYWRlcmJvYXJkX2luZm98b3VyX2luZm98cGljX2xvYWRlZHxzaG93Xyg/OmFjaGlldmVtZW50fGJhbmt8ZnJpZW5kX3BpY2tlcnxsZWFkZXJib2FyZHxwcm9maWxlfHB1cmNoYXNlX3Byb21wdHx1aSl8dHlwZV9jaGFsbGVuZ2V8dHlwZV9zY29yZV9jaGFsbGVuZ2UpfGFzc2V0Xyg/OmZvbnR8b2JqZWN0fHBhdGh8cm9vbXxzY3JpcHR8c2hhZGVyfHNvdW5kfHNwcml0ZXx0aWxlc3x0aW1lbGluZXx1bmtub3duKXxhdWRpb18oPzozZHxmYWxsb2ZmXyg/OmV4cG9uZW50X2Rpc3RhbmNlfGV4cG9uZW50X2Rpc3RhbmNlX2NsYW1wZWR8aW52ZXJzZV9kaXN0YW5jZXxpbnZlcnNlX2Rpc3RhbmNlX2NsYW1wZWR8bGluZWFyX2Rpc3RhbmNlfGxpbmVhcl9kaXN0YW5jZV9jbGFtcGVkfG5vbmUpfG1vbm98bmV3X3N5c3RlbXxvbGRfc3lzdGVtfHN0ZXJlbyl8Ym1fKD86YWRkfGNvbXBsZXh8ZGVzdF9hbHBoYXxkZXN0X2NvbG9yfGRlc3RfY29sb3VyfGludl9kZXN0X2FscGhhfGludl9kZXN0X2NvbG9yfGludl9kZXN0X2NvbG91cnxpbnZfc3JjX2FscGhhfGludl9zcmNfY29sb3J8aW52X3NyY19jb2xvdXJ8bWF4fG5vcm1hbHxvbmV8c3JjX2FscGhhfHNyY19hbHBoYV9zYXR8c3JjX2NvbG9yfHNyY19jb2xvdXJ8c3VidHJhY3R8emVybyl8YnJvd3Nlcl8oPzpjaHJvbWV8ZmlyZWZveHxpZXxpZV9tb2JpbGV8bm90X2FfYnJvd3NlcnxvcGVyYXxzYWZhcml8c2FmYXJpX21vYmlsZXx0aXplbnx1bmtub3dufHdpbmRvd3Nfc3RvcmUpfGJ1ZmZlcl8oPzpib29sfGYxNnxmMzJ8ZjY0fGZhc3R8Zml4ZWR8Z2VuZXJhbGVycm9yfGdyb3d8aW52YWxpZHR5cGV8bmV0d29ya3xvdXRvZmJvdW5kc3xvdXRvZnNwYWNlfHMxNnxzMzJ8czh8c2Vla19lbmR8c2Vla19yZWxhdGl2ZXxzZWVrX3N0YXJ0fHN0cmluZ3x0ZXh0fHUxNnx1MzJ8dTY0fHU4fHZidWZmZXJ8d3JhcCl8Y18oPzphcXVhfGJsYWNrfGJsdWV8ZGtncmF5fGZ1Y2hzaWF8Z3JheXxncmVlbnxsaW1lfGx0Z3JheXxtYXJvb258bmF2eXxvbGl2ZXxvcmFuZ2V8cHVycGxlfHJlZHxzaWx2ZXJ8dGVhbHx3aGl0ZXx5ZWxsb3cpfGNtcGZ1bmNfKD86YWx3YXlzfGVxdWFsfGdyZWF0ZXJ8Z3JlYXRlcmVxdWFsfGxlc3N8bGVzc2VxdWFsfG5ldmVyfG5vdGVxdWFsKXxjcl8oPzphcHBzdGFydHxhcnJvd3xiZWFtfGNyb3NzfGRlZmF1bHR8ZHJhZ3xoYW5kcG9pbnR8aG91cmdsYXNzfG5vbmV8c2l6ZV9hbGx8c2l6ZV9uZXN3fHNpemVfbnN8c2l6ZV9ud3NlfHNpemVfd2V8dXBhcnJvdyl8Y3VsbF8oPzpjbG9ja3dpc2V8Y291bnRlcmNsb2Nrd2lzZXxub2N1bGxpbmcpfGRldmljZV8oPzplbXVsYXRvcnx0YWJsZXQpfGRldmljZV9pb3NfKD86aXBhZHxpcGFkX3JldGluYXxpcGhvbmV8aXBob25lNXxpcGhvbmU2fGlwaG9uZTZwbHVzfGlwaG9uZV9yZXRpbmF8dW5rbm93bil8ZGlzcGxheV8oPzpsYW5kc2NhcGV8bGFuZHNjYXBlX2ZsaXBwZWR8cG9ydHJhaXR8cG9ydHJhaXRfZmxpcHBlZCl8ZGxsXyg/OmNkZWNsfGNkZWx8c3RkY2FsbCl8ZHNfdHlwZV8oPzpncmlkfGxpc3R8bWFwfHByaW9yaXR5fHF1ZXVlfHN0YWNrKXxlZl8oPzpjbG91ZHxlbGxpcHNlfGV4cGxvc2lvbnxmaXJld29ya3xmbGFyZXxyYWlufHJpbmd8c21va2V8c21va2V1cHxzbm93fHNwYXJrfHN0YXIpfGZhXyg/OmFyY2hpdmV8Ym90dG9tfGNlbnRlcnxkaXJlY3Rvcnl8aGlkZGVufGxlZnR8bWlkZGxlfHJlYWRvbmx5fHJpZ2h0fHN5c2ZpbGV8dG9wfHZvbHVtZWlkKXxmYl9sb2dpbl8oPzpkZWZhdWx0fGZhbGxiYWNrX3RvX3dlYnZpZXd8Zm9yY2luZ19zYWZhcml8Zm9yY2luZ193ZWJ2aWV3fG5vX2ZhbGxiYWNrX3RvX3dlYnZpZXd8dXNlX3N5c3RlbV9hY2NvdW50KXxpYXBfKD86YXZhaWxhYmxlfGNhbmNlbGVkfGV2X2NvbnN1bWV8ZXZfcHJvZHVjdHxldl9wdXJjaGFzZXxldl9yZXN0b3JlfGV2X3N0b3JlbG9hZHxmYWlsZWR8cHVyY2hhc2VkfHJlZnVuZGVkfHN0YXR1c19hdmFpbGFibGV8c3RhdHVzX2xvYWRpbmd8c3RhdHVzX3Byb2Nlc3Npbmd8c3RhdHVzX3Jlc3RvcmluZ3xzdGF0dXNfdW5hdmFpbGFibGV8c3RhdHVzX3VuaW5pdGlhbGlzZWR8c3RvcmVsb2FkX2ZhaWxlZHxzdG9yZWxvYWRfb2t8dW5hdmFpbGFibGUpfGxlYWRlcmJvYXJkX3R5cGVfKD86bnVtYmVyfHRpbWVfbWluc19zZWNzKXxsaWdodHR5cGVfKD86ZGlyfHBvaW50KXxtYXRyaXhfKD86cHJvamVjdGlvbnx2aWV3fHdvcmxkKXxtYl8oPzphbnl8bGVmdHxtaWRkbGV8bm9uZXxyaWdodCl8bmV0d29ya18oPzpjb25maWdfKD86Y29ubmVjdF90aW1lb3V0fGRpc2FibGVfcmVsaWFibGVfdWRwfGVuYWJsZV9yZWxpYWJsZV91ZHB8dXNlX25vbl9ibG9ja2luZ19zb2NrZXQpfHNvY2tldF8oPzpibHVldG9vdGh8dGNwfHVkcCl8dHlwZV8oPzpjb25uZWN0fGRhdGF8ZGlzY29ubmVjdHxub25fYmxvY2tpbmdfY29ubmVjdCkpfG9mX2NoYWxsZW5nZV8oPzpsb3NlfHRpZXx3aW4pfG9zXyg/OmFuZHJvaWR8aW9zfGxpbnV4fG1hY29zeHxwczN8cHM0fHBzdml0YXx1bmtub3dufHV3cHx3aW4zMnx3aW44bmF0aXZlfHdpbmRvd3N8d2lucGhvbmV8eGJveG9uZSl8cGh5X2RlYnVnX3JlbmRlcl8oPzphYWJifGNvbGxpc2lvbl9wYWlyc3xjb21zfGNvcmVfc2hhcGVzfGpvaW50c3xvYmJ8c2hhcGVzKXxwaHlfam9pbnRfKD86YW5jaG9yXzFfeHxhbmNob3JfMV95fGFuY2hvcl8yX3h8YW5jaG9yXzJfeXxhbmdsZXxhbmdsZV9saW1pdHN8ZGFtcGluZ19yYXRpb3xmcmVxdWVuY3l8bGVuZ3RoXzF8bGVuZ3RoXzJ8bG93ZXJfYW5nbGVfbGltaXR8bWF4X2ZvcmNlfG1heF9sZW5ndGh8bWF4X21vdG9yX2ZvcmNlfG1heF9tb3Rvcl90b3JxdWV8bWF4X3RvcnF1ZXxtb3Rvcl9mb3JjZXxtb3Rvcl9zcGVlZHxtb3Rvcl90b3JxdWV8cmVhY3Rpb25fZm9yY2VfeHxyZWFjdGlvbl9mb3JjZV95fHJlYWN0aW9uX3RvcnF1ZXxzcGVlZHx0cmFuc2xhdGlvbnx1cHBlcl9hbmdsZV9saW1pdCl8cGh5X3BhcnRpY2xlX2RhdGFfZmxhZ18oPzpjYXRlZ29yeXxjb2xvcnxjb2xvdXJ8cG9zaXRpb258dHlwZWZsYWdzfHZlbG9jaXR5KXxwaHlfcGFydGljbGVfZmxhZ18oPzpjb2xvcm1peGluZ3xjb2xvdXJtaXhpbmd8ZWxhc3RpY3xwb3dkZXJ8c3ByaW5nfHRlbnNpbGV8dmlzY291c3x3YWxsfHdhdGVyfHpvbWJpZSl8cGh5X3BhcnRpY2xlX2dyb3VwX2ZsYWdfKD86cmlnaWR8c29saWQpfHByXyg/OmxpbmVsaXN0fGxpbmVzdHJpcHxwb2ludGxpc3R8dHJpYW5nbGVmYW58dHJpYW5nbGVsaXN0fHRyaWFuZ2xlc3RyaXApfHBzXyg/OmRpc3RyfHNoYXBlKV8oPzpkaWFtb25kfGVsbGlwc2V8Z2F1c3NpYW58aW52Z2F1c3NpYW58bGluZXxsaW5lYXJ8cmVjdGFuZ2xlKXxwdF9zaGFwZV8oPzpjaXJjbGV8Y2xvdWR8ZGlza3xleHBsb3Npb258ZmxhcmV8bGluZXxwaXhlbHxyaW5nfHNtb2tlfHNub3d8c3Bhcmt8c3BoZXJlfHNxdWFyZXxzdGFyKXx0eV8oPzpyZWFsfHN0cmluZyl8Z3BfKD86ZmFjZVxcZHxheGlzbGh8YXhpc2x2fGF4aXNyaHxheGlzcnZ8cGFkZHxwYWRsfHBhZHJ8cGFkdXxzZWxlY3R8c2hvdWxkZXJsfHNob3VsZGVybGJ8c2hvdWxkZXJyfHNob3VsZGVycmJ8c3RhcnR8c3RpY2tsfHN0aWNrcil8bGJfZGlzcF8oPzpub25lfG51bWVyaWN8dGltZV9tc3x0aW1lX3NlYyl8bGJfc29ydF8oPzphc2NlbmRpbmd8ZGVzY2VuZGluZ3xub25lKXxvdl8oPzphY2hpZXZlbWVudHN8Y29tbXVuaXR5fGZyaWVuZHN8Z2FtZWdyb3VwfHBsYXllcnN8c2V0dGluZ3MpfHVnY18oPzpmaWxldHlwZV8oPzpjb21tdW5pdHl8bWljcm90cmFucyl8bGlzdF8oPzpGYXZvcml0ZWR8Rm9sbG93ZWR8UHVibGlzaGVkfFN1YnNjcmliZWR8VXNlZE9yUGxheWVkfFZvdGVkRG93bnxWb3RlZE9ufFZvdGVkVXB8V2lsbFZvdGVMYXRlcil8bWF0Y2hfKD86QWxsR3VpZGVzfEFydHdvcmt8Q29sbGVjdGlvbnN8Q29udHJvbGxlckJpbmRpbmdzfEludGVncmF0ZWRHdWlkZXN8SXRlbXN8SXRlbXNfTXR4fEl0ZW1zX1JlYWR5VG9Vc2V8U2NyZWVuc2hvdHN8VXNhYmxlSW5HYW1lfFZpZGVvc3xXZWJHdWlkZXMpfHF1ZXJ5Xyg/OkFjY2VwdGVkRm9yR2FtZVJhbmtlZEJ5QWNjZXB0YW5jZURhdGV8Q3JlYXRlZEJ5RnJpZW5kc1JhbmtlZEJ5UHVibGljYXRpb25EYXRlfEZhdm9yaXRlZEJ5RnJpZW5kc1JhbmtlZEJ5UHVibGljYXRpb25EYXRlfE5vdFlldFJhdGVkKXxxdWVyeV9SYW5rZWRCeSg/Ok51bVRpbWVzUmVwb3J0ZWR8UHVibGljYXRpb25EYXRlfFRleHRTZWFyY2h8VG90YWxWb3Rlc0FzY3xUcmVuZHxWb3RlfFZvdGVzVXApfHJlc3VsdF9zdWNjZXNzfHNvcnRvcmRlcl9DcmVhdGlvbk9yZGVyKD86QXNjfERlc2MpfHNvcnRvcmRlcl8oPzpGb3JNb2RlcmF0aW9ufExhc3RVcGRhdGVkRGVzY3xTdWJzY3JpcHRpb25EYXRlRGVzY3xUaXRsZUFzY3xWb3RlU2NvcmVEZXNjKXx2aXNpYmlsaXR5Xyg/OmZyaWVuZHNfb25seXxwcml2YXRlfHB1YmxpYykpfHZlcnRleF91c2FnZV8oPzpiaW5vcm1hbHxibGVuZGluZGljZXN8YmxlbmR3ZWlnaHR8Y29sb3J8Y29sb3VyfGRlcHRofGZvZ3xub3JtYWx8cG9zaXRpb258cHNpemV8c2FtcGxlfHRhbmdlbnR8dGV4Y29vcmR8dGV4dGNvb3JkKXx2ZXJ0ZXhfdHlwZV8oPzpmbG9hdFxcZHxjb2xvcnxjb2xvdXJ8dWJ5dGU0KXxpbnB1dF90eXBlfGxheWVyZWxlbWVudHR5cGVfKD86YmFja2dyb3VuZHxpbnN0YW5jZXxvbGR0aWxlbWFwfHBhcnRpY2xlc3lzdGVtfHNwcml0ZXx0aWxlfHRpbGVtYXB8dW5kZWZpbmVkKXxzZV8oPzpjaG9ydXN8Y29tcHJlc3NvcnxlY2hvfGVxdWFsaXplcnxmbGFuZ2VyfGdhcmdsZXxub25lfHJldmVyYil8dGV4dF90eXBlfHRpbGVfKD86ZmxpcHxpbmRleF9tYXNrfG1pcnJvcnxyb3RhdGUpfCg/Om9ianxybXxzY3J8c3ByKVxcdyspXFxiLyxcblx0J3ZhcmlhYmxlJzogL1xcYig/OmFsYXJtfGFwcGxpY2F0aW9uX3N1cmZhY2V8YXN5bmNfbG9hZHxiYWNrZ3JvdW5kXyg/OmFscGhhfGJsZW5kfGNvbG9yfGNvbG91cnxmb3JlZ3JvdW5kfGhlaWdodHxoc3BlZWR8aHRpbGVkfGluZGV4fHNob3djb2xvcnxzaG93Y29sb3VyfHZpc2libGV8dnNwZWVkfHZ0aWxlZHx3aWR0aHx4fHhzY2FsZXx5fHlzY2FsZSl8YmJveF8oPzpib3R0b218bGVmdHxyaWdodHx0b3ApfGJyb3dzZXJfKD86aGVpZ2h0fHdpZHRoKXxjYXB0aW9uXyg/OmhlYWx0aHxsaXZlc3xzY29yZSl8Y3VycmVudF8oPzpkYXl8aG91cnxtaW51dGV8bW9udGh8c2Vjb25kfHRpbWV8d2Vla2RheXx5ZWFyKXxjdXJzb3Jfc3ByaXRlfGRlYnVnX21vZGV8ZGVsdGFfdGltZXxkaXJlY3Rpb258ZGlzcGxheV9hYXxlcnJvcl8oPzpsYXN0fG9jY3VycmVkKXxldmVudF8oPzphY3Rpb258bnVtYmVyfG9iamVjdHx0eXBlKXxmcHN8ZnBzX3JlYWx8ZnJpY3Rpb258Z2FtZV8oPzpkaXNwbGF5fHByb2plY3R8c2F2ZSlfKD86aWR8bmFtZSl8Z2FtZW1ha2VyXyg/OnByb3xyZWdpc3RlcmVkfHZlcnNpb24pfGdyYXZpdHl8Z3Jhdml0eV9kaXJlY3Rpb258KD86aHx2KXNwZWVkfGhlYWx0aHxpYXBfZGF0YXxpZHxpbWFnZV8oPzphbHBoYXxhbmdsZXxibGVuZHxkZXB0aHxpbmRleHxudW1iZXJ8c3BlZWR8eHNjYWxlfHlzY2FsZSl8aW5zdGFuY2VfKD86Y291bnR8aWQpfGtleWJvYXJkXyg/OmtleXxsYXN0Y2hhcnxsYXN0a2V5fHN0cmluZyl8bGF5ZXJ8bGl2ZXN8bWFza19pbmRleHxtb3VzZV8oPzpidXR0b258bGFzdGJ1dHRvbnx4fHkpfG9iamVjdF9pbmRleHxvc18oPzpicm93c2VyfGRldmljZXx0eXBlfHZlcnNpb24pfHBhdGhfKD86ZW5kYWN0aW9ufGluZGV4fG9yaWVudGF0aW9ufHBvc2l0aW9ufHBvc2l0aW9ucHJldmlvdXN8c2NhbGV8c3BlZWQpfHBlcnNpc3RlbnR8cGh5Xyg/OnJvdGF0aW9ufCg/OmNvbF9ub3JtYWx8Y29sbGlzaW9ufGNvbXxsaW5lYXJfdmVsb2NpdHl8cG9zaXRpb258c3BlZWQpXyg/Onh8eSl8YW5ndWxhcl8oPzpkYW1waW5nfHZlbG9jaXR5KXxwb3NpdGlvbl8oPzp4fHkpcHJldmlvdXN8c3BlZWR8bGluZWFyX2RhbXBpbmd8YnVsbGV0fGZpeGVkX3JvdGF0aW9ufGFjdGl2ZXxtYXNzfGluZXJ0aWF8ZHluYW1pY3xraW5lbWF0aWN8c2xlZXBpbmd8Y29sbGlzaW9uX3BvaW50cyl8cG9pbnRlcl8oPzppbnZhbGlkfG51bGwpfHJvb218cm9vbV8oPzpjYXB0aW9ufGZpcnN0fGhlaWdodHxsYXN0fHBlcnNpc3RlbnR8c3BlZWR8d2lkdGgpfHNjb3JlfHNlY3VyZV9tb2RlfHNob3dfKD86aGVhbHRofGxpdmVzfHNjb3JlKXxzb2xpZHxzcGVlZHxzcHJpdGVfKD86aGVpZ2h0fGluZGV4fHdpZHRofHhvZmZzZXR8eW9mZnNldCl8dGVtcF9kaXJlY3Rvcnl8dGltZWxpbmVfKD86aW5kZXh8bG9vcHxwb3NpdGlvbnxydW5uaW5nfHNwZWVkKXx0cmFuc2l0aW9uXyg/OmNvbG9yfGtpbmR8c3RlcHMpfHVuZGVmaW5lZHx2aWV3Xyg/OmFuZ2xlfGN1cnJlbnR8ZW5hYmxlZHwoPzpofHYpKD86Ym9yZGVyfHNwZWVkKXwoPzpofHd8eHx5KXBvcnR8KD86aHx3fHh8eSl2aWV3fG9iamVjdHxzdXJmYWNlX2lkfHZpc2libGUpfHZpc2libGV8d2ViZ2xfZW5hYmxlZHx3b3JraW5nX2RpcmVjdG9yeXwoPzp4fHkpKD86cHJldmlvdXN8c3RhcnQpfHh8eXxhcmd1bWVudCg/Ol9yZWxpdGl2ZXxfY291bnR8XFxkKXxhcmd1bWVudHxnbG9iYWx8bG9jYWx8b3RoZXJ8c2VsZilcXGIvXG59KTtcblxuLy8gaHR0cHM6Ly93d3cuZ2FwLXN5c3RlbS5vcmcvTWFudWFscy9kb2MvcmVmL2NoYXA0Lmh0bWxcbi8vIGh0dHBzOi8vd3d3LmdhcC1zeXN0ZW0ub3JnL01hbnVhbHMvZG9jL3JlZi9jaGFwMjcuaHRtbFxuXG5QcmlzbS5sYW5ndWFnZXMuZ2FwID0ge1xuXHQnc2hlbGwnOiB7XG5cdFx0cGF0dGVybjogL15nYXA+W1xcc1xcU10qPyg/PV5nYXA+fCQoPyFbXFxzXFxTXSkpL20sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2dhcCc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oZ2FwPikuKyg/Oig/Olxccig/OlxcbnwoPyFcXG4pKXxcXG4pPi4qKSovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL15nYXA+L1xuXHRcdH1cblx0fSxcblxuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcJ1wiXSkoPzonKD86W15cXHJcXG5cXFxcJ118XFxcXC4pezEsMTB9J3xcIig/OlteXFxyXFxuXFxcXFwiXXxcXFxcLikqXCIoPyFcIil8XCJcIlwiW1xcc1xcU10qP1wiXCJcIikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2NvbnRpbnVhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogLyhbXFxyXFxuXSk+Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0J2tleXdvcmQnOiAvXFxiKD86QXNzZXJ0fEluZm98SXNCb3VuZHxRVUlUfFRyeU5leHRNZXRob2R8VW5iaW5kfGFuZHxhdG9taWN8YnJlYWt8Y29udGludWV8ZG98ZWxpZnxlbHNlfGVuZHxmaXxmb3J8ZnVuY3Rpb258aWZ8aW58bG9jYWx8bW9kfG5vdHxvZHxvcnxxdWl0fHJlYWRvbmx5fHJlYWR3cml0ZXxyZWN8cmVwZWF0fHJldHVybnx0aGVufHVudGlsfHdoaWxlKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHcuXXxcXC5cXC4pKD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OltlRV1bKy1dP1xcZCspPyg/Ol9bYS16XT8pPyg/PSR8W15cXHcuXXxcXC5cXC4pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cblx0J2NvbnRpbnVhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKFtcXHJcXG5dKT4vLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0fSxcblx0J29wZXJhdG9yJzogLy0+fFstKyovXn49IV18PD58Wzw+XT0/fDo9fFxcLlxcLi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClbXFxde30sOy46XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5nYXAuc2hlbGwuaW5zaWRlLmdhcC5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuZ2FwO1xuXG5QcmlzbS5sYW5ndWFnZXMuZ2NvZGUgPSB7XG5cdCdjb21tZW50JzogLzsuKnxcXEJcXCguKj9cXClcXEIvLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlwiXCJ8W15cIl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiW0dNXVxcZCsoPzpcXC5cXGQrKT9cXGIvLFxuXHQncHJvcGVydHknOiAvXFxiW0EtWl0vLFxuXHQnY2hlY2tzdW0nOiB7XG5cdFx0cGF0dGVybjogLyhcXCopXFxkKy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0Ly8gVDA6MDowXG5cdCdwdW5jdHVhdGlvbic6IC9bOipdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmdkc2NyaXB0ID0ge1xuXHQnY29tbWVudCc6IC8jLiovLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9APyg/OihcInwnKSg/Oig/IVxcMSlbXlxcblxcXFxdfFxcXFxbXFxzXFxTXSkqXFwxKD8hXCJ8Jyl8XCJcIlwiKD86W15cXFxcXXxcXFxcW1xcc1xcU10pKj9cIlwiXCIpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0Ly8gY2xhc3NfbmFtZSBGb28sIGV4dGVuZHMgQmFyLCBjbGFzcyBJbm5lckNsYXNzXG5cdFx0Ly8gZXhwb3J0KGludCkgdmFyIGJheiwgZXhwb3J0KGludCwgMCkgdmFyIGlcblx0XHQvLyBhcyBOb2RlXG5cdFx0Ly8gY29uc3QgRk9POiBpbnQgPSA5LCB2YXIgYmFyOiBib29sID0gdHJ1ZVxuXHRcdC8vIGZ1bmMgYWRkKHJlZmVyZW5jZTogSXRlbSwgYW1vdW50OiBpbnQpIC0+IEl0ZW06XG5cdFx0cGF0dGVybjogLyheKD86Y2xhc3N8Y2xhc3NfbmFtZXxleHRlbmRzKVsgXFx0XSt8XmV4cG9ydFxcKFsgXFx0XSp8XFxiYXNbIFxcdF0rfCg/OlxcYig/OmNvbnN0fHZhcilbIFxcdF18WywoXSlbIFxcdF0qXFx3K1sgXFx0XSo6WyBcXHRdKnwtPlsgXFx0XSopW2EtekEtWl9dXFx3Ki9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YW5kfGFzfGFzc2VydHxicmVha3xicmVha3BvaW50fGNsYXNzfGNsYXNzX25hbWV8Y29uc3R8Y29udGludWV8ZWxpZnxlbHNlfGVudW18ZXhwb3J0fGV4dGVuZHN8Zm9yfGZ1bmN8aWZ8aW58aXN8bWFzdGVyfG1hc3RlcnN5bmN8bWF0Y2h8bm90fG51bGx8b25yZWFkeXxvcnxwYXNzfHByZWxvYWR8cHVwcGV0fHB1cHBldHN5bmN8cmVtb3RlfHJlbW90ZXN5bmN8cmV0dXJufHNlbGZ8c2V0Z2V0fHNpZ25hbHxzdGF0aWN8dG9vbHx2YXJ8d2hpbGV8eWllbGQpXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1bIFxcdF0qXFwoKS9pLFxuXHQndmFyaWFibGUnOiAvXFwkXFx3Ky8sXG5cdCdudW1iZXInOiBbXG5cdFx0L1xcYjBiWzAxX10rXFxifFxcYjB4W1xcZGEtZkEtRl9dK1xcYnwoPzpcXGJcXGRbXFxkX10qKD86XFwuW1xcZF9dKik/fFxcQlxcLltcXGRfXSspKD86ZVsrLV0/W1xcZF9dKyk/XFxiLyxcblx0XHQvXFxiKD86SU5GfE5BTnxQSXxUQVUpXFxiL1xuXHRdLFxuXHQnY29uc3RhbnQnOiAvXFxiW0EtWl1bQS1aX1xcZF0qXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnb3BlcmF0b3InOiAvLT58Oj18JiZ8XFx8XFx8fDw8fD4+fFstKyovJSZ8ITw+PV09P3xbfl5dLyxcblx0J3B1bmN0dWF0aW9uJzogL1suOiw7KClbXFxde31dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmdlZGNvbSA9IHtcblx0J2xpbmUtdmFsdWUnOiB7XG5cdFx0Ly8gUHJlY2VkZWQgYnkgbGV2ZWwsIG9wdGlvbmFsIHBvaW50ZXIsIGFuZCB0YWdcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qXFxkKyArKD86QFxcd1tcXHchXCIkJSYnKCkqKyxcXC0uLzo7PD0+P1tcXFxcXFxdXmB7fH1+XFx4ODAtXFx4ZmUgI10qQCArKT9cXHcrICkuKy9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncG9pbnRlcic6IHtcblx0XHRcdFx0cGF0dGVybjogL15AXFx3W1xcdyFcIiQlJicoKSorLFxcLS4vOjs8PT4/W1xcXFxcXF1eYHt8fX5cXHg4MC1cXHhmZSAjXSpAJC8sXG5cdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQncmVjb3JkJzoge1xuXHRcdC8vIFByZWNlZGVkIGJ5IGxldmVsIGFuZCBvcHRpb25hbCBwb2ludGVyXG5cdFx0cGF0dGVybjogLyheW1xcdCBdKlxcZCsgKyg/OkBcXHdbXFx3IVwiJCUmJygpKissXFwtLi86Ozw9Pj9bXFxcXFxcXV5ge3x9flxceDgwLVxceGZlICNdKkAgKyk/KVxcdysvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAndGFnJ1xuXHR9LFxuXHQnbGV2ZWwnOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKilcXGQrL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J3BvaW50ZXInOiB7XG5cdFx0cGF0dGVybjogL0BcXHdbXFx3IVwiJCUmJygpKissXFwtLi86Ozw9Pj9bXFxcXFxcXV5ge3x9flxceDgwLVxceGZlICNdKkAvLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH1cbn07XG5cblByaXNtLmxhbmd1YWdlcy5nZXR0ZXh0ID0ge1xuXHQnY29tbWVudCc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvIyAuKi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3RyYW5zbGF0b3ItY29tbWVudCdcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8jXFwuLiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdleHRyYWN0ZWQtY29tbWVudCdcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8jOi4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncmVmZXJlbmNlLWNvbW1lbnQnXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvIywuKi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2ZsYWctY29tbWVudCdcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8jXFx8LiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwcmV2aW91c2x5LXVudHJhbnNsYXRlZC1jb21tZW50J1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRdLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVwiKD86W15cIlxcXFxdfFxcXFwuKSpcIi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXm1zZyg/OmN0eHR8aWR8aWRfcGx1cmFsfHN0cilcXGIvbSxcblx0J251bWJlcic6IC9cXGJcXGQrXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF1dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnBvID0gUHJpc20ubGFuZ3VhZ2VzLmdldHRleHQ7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgdGFibGVSb3cgPSAvKD86XFxyP1xcbnxcXHIpWyBcXHRdKlxcfC4rXFx8KD86KD8hXFx8KS4pKi8uc291cmNlO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5naGVya2luID0ge1xuXHRcdCdweXN0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXCJcIlwifCcnJylbXFxzXFxTXSs/XFwxLyxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdH0sXG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSMuKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3RhZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopQFxcUyovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdmZWF0dXJlJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFxccj9cXG58XFxyKVsgXFx0XSopKD86QWJpbGl0eXxBaG95IG1hdGV5IXxBcndlZGR8QXNwZWt0fEJlc2lnaGVpZCBCZWhvZWZ0ZXxCdXNpbmVzcyBOZWVkfENhcmFjdGVyaXN0aWNhfENhcmFjdGVyXHUwMEVEc3RpY2F8RWdlbnNrYWJ8RWdlbnNrYXB8RWlnaW5sZWlraXxGZWF0dXJlfEZcdTAxMkJcdTAxMERhfEZpdHVyfEZvbmN0aW9ubmFsaXRcdTAwRTl8Rm9ua3N5b25hbGl0ZXxGdW5jaW9uYWxpZGFkZXxGdW5jaW9uYWxpdGF0fEZ1bmN0aW9uYWxpdGF0ZXxGdW5jXHUwMTYzaW9uYWxpdGF0ZXxGdW5jXHUwMjFCaW9uYWxpdGF0ZXxGdW5jdGlvbmFsaXRlaXR8RnVuZ3NpfEZ1bmtjaWF8RnVua2NpamF8RnVua2Npb25hbGl0XHUwMTAxdGV8RnVua2Npb25hbG5vc3R8RnVua2NqYXxGdW5rc2llfEZ1bmt0aW9uYWxpdFx1MDBFNHR8RnVua3Rpb25hbGl0XHUwMEU5aXR8RnVuemlvbmFsaXRcdTAwRTB8SHdhZXR8SHdcdTAwRTZ0fEplbGxlbXpcdTAxNTF8S2FyYWt0ZXJpc3Rpa3xMYXN0bm9zdHxNYWt8TW9ndWNub3N0fGxhSHxNb2d1XHUwMTA3bm9zdHxNb3pub3N0aXxNb1x1MDE3RW5vc3RpfE9IIEhBSXxPbWFkdXN8T21pbmFpc3V1c3xPc29iaW5hfFx1MDBENnplbGxpa3xQb3RyemViYSBiaXpuZXNvd2F8cGVyYm9naHxwb1Fib2doIG1hbGphJ3xQb1x1MDE3RWFkYXZla3xQb1x1MDE3RWlhZGF2a2F8UHJldHR5IG11Y2h8UWFwfFF1J21lSCAndXR8U2F2eWJcdTAxMTd8VFx1MDBFRG5oIG5cdTAxMDNuZ3xUcmFqdG98VmVybW9cdTAwRUJ8Vmxhc3Rub3NcdTAxNjV8V1x1MDE0MmFcdTAxNUJjaXdvXHUwMTVCXHUwMTA3fFpuYVx1MDEwRGlsbm9zdHxcdTAzOTRcdTAzQzVcdTAzQkRcdTAzQjFcdTAzQzRcdTAzQ0NcdTAzQzRcdTAzQjdcdTAzQzRcdTAzQjF8XHUwMzlCXHUwM0I1XHUwM0I5XHUwM0M0XHUwM0JGXHUwM0M1XHUwM0MxXHUwM0IzXHUwM0FGXHUwM0IxfFx1MDQxQ1x1MDQzRVx1MDQzM1x1MDQ0M1x1MDQ1Qlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQ0MnxcdTA0MUNcdTA0RTlcdTA0M0NcdTA0M0FcdTA0MzhcdTA0M0RcdTA0M0JcdTA0MzVcdTA0M0F8XHUwNDFFXHUwNDQxXHUwNDNFXHUwNDMxXHUwNDM4XHUwNDNEXHUwNDMwfFx1MDQyMVx1MDQzMlx1MDQzRVx1MDQzOVx1MDQ0MVx1MDQ0Mlx1MDQzMlx1MDQzRXxcdTA0QUVcdTA0MzdcdTA0MzVcdTA0M0RcdTA0NDdcdTA0RDlcdTA0M0JcdTA0MzVcdTA0M0FcdTA0M0JcdTA0MzVcdTA0M0JcdTA0MzVcdTA0M0F8XHUwNDI0XHUwNDQzXHUwNDNEXHUwNDNBXHUwNDQ2XHUwNDM4XHUwNDNFXHUwNDNEXHUwNDMwXHUwNDNCfFx1MDQyNFx1MDQ0M1x1MDQzRFx1MDQzQVx1MDQ0Nlx1MDQzOFx1MDQzRVx1MDQzRFx1MDQzMFx1MDQzQlx1MDQzRFx1MDQzRVx1MDQ0MVx1MDQ0MnxcdTA0MjRcdTA0NDNcdTA0M0RcdTA0M0FcdTA0NDZcdTA0MzhcdTA0NEZ8XHUwNDI0XHUwNDQzXHUwNDNEXHUwNDNBXHUwNDQ2XHUwNDU2XHUwNDNFXHUwNDNEXHUwNDMwXHUwNDNCfFx1MDVFQVx1MDVEQlx1MDVENVx1MDVFMFx1MDVENHxcdTA2MkVcdTA2MjdcdTA2MzVcdTA2NEFcdTA2Mjl8XHUwNjJFXHUwNjM1XHUwNjQ4XHUwNjM1XHUwNkNDXHUwNjJBfFx1MDYzNVx1MDY0NFx1MDYyN1x1MDYyRFx1MDZDQ1x1MDYyQXxcdTA2QTlcdTA2MjdcdTA2MzFcdTA2NDhcdTA2MjhcdTA2MjdcdTA2MzEgXHUwNkE5XHUwNkNDIFx1MDYzNlx1MDYzMVx1MDY0OFx1MDYzMVx1MDYyQXxcdTA2NDhcdTA2NTBcdTA2Q0NcdTA2OThcdTA2QUZcdTA2Q0N8XHUwOTMwXHUwOTQyXHUwOTJBIFx1MDkzMlx1MDk0N1x1MDkxNnxcdTBBMTZcdTBBM0VcdTBBMzhcdTBBNDBcdTBBMDVcdTBBMjR8XHUwQTI4XHUwQTE1XHUwQTM2IFx1MEEyOFx1MEE0MVx1MEEzOVx1MEEzRVx1MEEzMHxcdTBBMkVcdTBBNDFcdTBBMzlcdTBBM0VcdTBBMDJcdTBBMjZcdTBBMzBcdTBBM0V8XHUwQzE3XHUwQzQxXHUwQzIzXHUwQzJFXHUwQzQxfFx1MENCOVx1MENDNlx1MEM5QVx1MENDRFx1MEM5QVx1MENCM3xcdTBFMDRcdTBFMjdcdTBFMzJcdTBFMjFcdTBFMTVcdTBFNDlcdTBFMkRcdTBFMDdcdTBFMDFcdTBFMzJcdTBFMjNcdTBFMTdcdTBFMzJcdTBFMDdcdTBFMThcdTBFMzhcdTBFMjNcdTBFMDFcdTBFMzRcdTBFMDh8XHUwRTA0XHUwRTI3XHUwRTMyXHUwRTIxXHUwRTJBXHUwRTMyXHUwRTIxXHUwRTMyXHUwRTIzXHUwRTE2fFx1MEU0Mlx1MEUwNFx1MEUyM1x1MEUwN1x1MEUyQlx1MEUyNVx1MEUzMVx1MEUwMXxcdUFFMzBcdUIyQTV8XHUzMEQ1XHUzMEEzXHUzMEZDXHUzMEMxXHUzMEUzfFx1NTI5Rlx1ODBGRHxcdTZBNUZcdTgwRkQpOig/OlteOlxcclxcbl0rKD86XFxyP1xcbnxcXHJ8JCkpKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbXBvcnRhbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyg6KVteXFxyXFxuXSsvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J2tleXdvcmQnOiAvW146XFxyXFxuXSs6L1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3NjZW5hcmlvJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKikoPzpBYnN0cmFjdCBTY2VuYXJpb3xBYnN0cmFrdCBTY2VuYXJpb3xBY2h0ZXJncm9uZHxBZXJ8XHUwMEM2cnxBZ3Rlcmdyb25kfEFsbCB5J2FsbHxBbnRlY2VkZW50ZXN8QW50ZWNlZGVudHN8QXRidXJcdTAwRjBhclx1MDBFMXN8QXRidXJcdTAwRjBhclx1MDBFMXNpcnxBd3d3LCBsb29rIG1hdGV8QjR8QmFja2dyb3VuZHxCYWdncnVuZHxCYWtncnVuZHxCYWtncnVubnxCYWtncnVubnVyfEJlaXNwaWVsZXxCZWlzcGlsbGVyfEJcdTFFRDFpIGNcdTFFQTNuaHxDZWZuZGlyfENlbmFyaW98Q2VuXHUwMEUxcmlvfENlbmFyaW8gZGUgRnVuZG98Q2VuXHUwMEUxcmlvIGRlIEZ1bmRvfENlbmFyaW9zfENlblx1MDBFMXJpb3N8Q29udGVzdG98Q29udGV4dHxDb250ZXh0ZXxDb250ZXh0b3xDb250b3xDb250b2h8Q29udG9uZXxEXHUwMEU2bWl8RGFzYXJ8RGVhZCBtZW4gdGVsbCBubyB0YWxlc3xEZWxpbmVhY2FvIGRvIENlbmFyaW98RGVsaW5lYVx1MDBFN1x1MDBFM28gZG8gQ2VuXHUwMEUxcmlvfERpcyBpcyB3aGF0IHdlbnQgZG93bnxEXHUxRUVGIGxpXHUxRUM3dXxEeWFncmFtIFNlbmFyeW98RHlhZ3JhbSBzZW5hcnlvfEVnemFucHxFamVtcGxvc3xFa3NlbXBsZXJ8RWt6ZW1wbG9qfEVuZ2hyZWlmZnRpYXV8RXNib3pvIGRvIGVzY2VuYXJpb3xFc2NlbmFyaXxFc2NlbmFyaW98RXNlbXBpfEVzcXVlbWEgZGUgbCdlc2NlbmFyaXxFc3F1ZW1hIGRlbCBlc2NlbmFyaW98RXNxdWVtYSBkbyBDZW5hcmlvfEVzcXVlbWEgZG8gQ2VuXHUwMEUxcmlvfEVYQU1QTFp8RXhhbXBsZXN8RXhlbXBlbHxFeGVtcGxlfEV4ZW1wbGVzfEV4ZW1wbG9zfEZpcnN0IG9mZnxGb25vfEZvcmdhdFx1MDBGM2tcdTAwRjZueXZ8Rm9yZ2F0XHUwMEYza1x1MDBGNm55diB2XHUwMEUxemxhdHxGdW5kb3xHZVx1MDBFN21pXHUwMTVGfEdydW5kbGFnZXxIYW5uZXJncm9uZHxnaGFudG9IfEhcdTAwRTF0dFx1MDBFOXJ8SGVhdmUgdG98SXN0b3Jpa3xKdWh0dW1pZHxLZWFkYWFufEtodW5nIGtcdTFFQ0JjaCBiXHUxRUEzbnxLaHVuZyB0XHUwMEVDbmggaHVcdTFFRDFuZ3xLXHUxRUNCY2ggYlx1MUVBM258S29uY2VwdHxLb25zZXAgc2tlbmFyaW98S29udFx1MDBFOGtzfEtvbnRla3N0fEtvbnRla3N0YXN8S29udGVrc3RzfEtvbnRleHR8S29udHVybyBkZSBsYSBzY2VuYXJvfExhdGFyIEJlbGFrYW5nfGx1dCBjaG92bmF0bGh8bHV0fGx1dG1leXxMXHUwMEZEc2luZyBBdGJ1clx1MDBGMGFyXHUwMEUxc2FyfExcdTAwRkRzaW5nIERcdTAwRTZtYXxNSVNIVU4gU1JTTFl8TUlTSFVOfE1lbmdnYXJpc2thbiBTZW5hcmlvfG1vJ3xOXHUwMEUxXHUwMTBEcnQgU2Nlblx1MDBFMXJhfE5cdTAwRTFcdTAxMERydCBTY1x1MDBFOW5cdTAwRTFcdTAxNTllfE5cdTAwRTFcdTAxMERydCBTY2VuXHUwMEUxcnV8T3JpcyBzY2VuYXJpamF8XHUwMEQ2cm5la2xlcnxPc25vdmF8T3Nub3ZhIFNjZW5cdTAwRTFyYXxPc25vdmEgc2NcdTAwRTluXHUwMEUxXHUwMTU5ZXxPc251dGVrfE96YWRqZXxQYXJhdWdzfFBhdnl6ZFx1MDE3RWlhaXxQXHUwMEU5bGRcdTAwRTFrfFBpZW1cdTAxMTNyaXxQbGFuIGR1IHNjXHUwMEU5bmFyaW98UGxhbiBkdSBTY1x1MDBFOW5hcmlvfFBsYW4gU2VuYXJ5b3xQbGFuIHNlbmFyeW98UGxhbmcgdnVtIFN6ZW5hcmlvfFBvemFkXHUwMEVEfFBvemFkaWV8UG96YWRpbmF8UHJcdTAwRURrbGFkeXxQXHUwMTU5XHUwMEVEa2xhZHl8UHJpbWVyfFByaW1lcml8UHJpbWplcml8UHJ6eWtcdTAxNDJhZHl8UmFhbXN0c2VuYWFyaXVtfFJlY2tvbiBpdCdzIGxpa2V8UmVyZWZvbnN8U2Nlblx1MDBFMXJ8U2NcdTAwRTluXHUwMEUxXHUwMTU5fFNjZW5hcmllfFNjZW5hcmlqfFNjZW5hcmlqYWl8U2NlbmFyaWphdXMgXHUwMTYxYWJsb25hc3xTY2VuYXJpaml8U2Nlblx1MDEwMXJpanN8U2Nlblx1MDEwMXJpanMgcFx1MDExM2MgcGFyYXVnYXxTY2VuYXJpanVzfFNjZW5hcmlvfFNjXHUwMEU5bmFyaW98U2NlbmFyaW8gQW1saW5lbGxvbHxTY2VuYXJpbyBPdXRsaW5lfFNjZW5hcmlvIFRlbXBsYXRlfFNjZW5hcmlvbWFsfFNjZW5hcmlvbWFsbHxTY2VuYXJpb3N8U2NlbmFyaXV8U2NlbmFyaXVzenxTY2VuYXJvfFNjaGVtYSBkZWxsbyBzY2VuYXJpb3xTZSBcdTAwRjBlfFNlIHRoZXxTZSBcdTAwRkVlfFNlbmFyaW98U2VuYXJ5byBEZXNrcmlwc3lvbnxTZW5hcnlvIGRlc2tyaXBzeW9ufFNlbmFyeW98U2VuYXJ5byB0YXNsYVx1MDExRlx1MDEzMXxTaGl2ZXIgbWUgdGltYmVyc3xTaXR1XHUwMTAxY2lqYXxTaXR1YWl8U2l0dWFzaWUgVWl0ZWVuc2V0dGluZ3xTaXR1YXNpZXxTa2VuYXJpbyBrb25zZXB8U2tlbmFyaW98U2tpY2F8U3RydWN0dXJhIHNjZW5hcml1fFN0cnVjdHVyXHUwMTAzIHNjZW5hcml1fFN0cnVrdHVyYSBzY2VuYXJpamF8U3RzZW5hYXJpdW18U3dhIGh3YWVyIHN3YXxTd2F8U3dhIGh3XHUwMEU2ciBzd2F8U3phYmxvbiBzY2VuYXJpdXN6YXxTemVuYXJpb3xTemVuYXJpb2dydW5kcmlzc3xUYXBhdWtzZXR8VGFwYXVzfFRhcGF1c2FpaGlvfFRhdXN0fFRhdXN0YXxUZW1wbGF0ZSBLZWFkYWFufFRlbXBsYXRlIFNlbmFyaW98VGVtcGxhdGUgU2l0dWFpfFRoZSB0aGluZyBvZiBpdCBpc3xUXHUwMEVDbmggaHVcdTFFRDFuZ3xWYXJpYW50YWl8Vm9vcmJlZWxkZXxWb29yYmVlbGRlbnxXaGFycmltZWFuIGlzfFlvLWhvLWhvfFlvdSdsbCB3YW5uYXxaYVx1MDE0Mm9cdTAxN0NlbmlhfFx1MDNBMFx1MDNCMVx1MDNDMVx1MDNCMVx1MDNCNFx1MDNCNVx1MDNBRlx1MDNCM1x1MDNCQ1x1MDNCMVx1MDNDNFx1MDNCMXxcdTAzQTBcdTAzQjVcdTAzQzFcdTAzQjlcdTAzQjNcdTAzQzFcdTAzQjFcdTAzQzZcdTAzQUUgXHUwM0EzXHUwM0I1XHUwM0JEXHUwM0IxXHUwM0MxXHUwM0FGXHUwM0JGXHUwM0M1fFx1MDNBM1x1MDNCNVx1MDNCRFx1MDNBQ1x1MDNDMVx1MDNCOVx1MDNCMXxcdTAzQTNcdTAzQjVcdTAzQkRcdTAzQUNcdTAzQzFcdTAzQjlcdTAzQkZ8XHUwM0E1XHUwM0MwXHUwM0NDXHUwM0IyXHUwM0IxXHUwM0I4XHUwM0MxXHUwM0JGfFx1MDQxQVx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQ0OHxcdTA0MUFcdTA0M0VcdTA0M0RcdTA0NDJcdTA0MzVcdTA0M0FcdTA0NDFcdTA0NDJ8XHUwNDFBXHUwNDNFXHUwNDNEXHUwNDQ2XHUwNDM1XHUwNDNGXHUwNDQyfFx1MDQxQ1x1MDQzOFx1MDQ0MVx1MDQzMFx1MDQzQlx1MDQzQlx1MDQzMFx1MDQ0MHxcdTA0MUNcdTA0MzhcdTA0NDFcdTA0M0VcdTA0M0JcdTA0M0JcdTA0MzBcdTA0NDB8XHUwNDFFXHUwNDQxXHUwNDNEXHUwNDNFXHUwNDMyXHUwNDMwfFx1MDQxRlx1MDQzNVx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0M1x1MDQzQ1x1MDQzRVx1MDQzMlx1MDQzMHxcdTA0MUZcdTA0M0VcdTA0MzdcdTA0MzBcdTA0MzRcdTA0MzhcdTA0M0RcdTA0MzB8XHUwNDFGXHUwNDQwXHUwNDM1XHUwNDM0XHUwNDM4XHUwNDQxXHUwNDQyXHUwNDNFXHUwNDQwXHUwNDM4XHUwNDRGfFx1MDQxRlx1MDQ0MFx1MDQzNVx1MDQzNFx1MDQ0Qlx1MDQ0MVx1MDQ0Mlx1MDQzRVx1MDQ0MFx1MDQzOFx1MDQ0RnxcdTA0MUZcdTA0NDBcdTA0MzhcdTA0M0FcdTA0M0JcdTA0MzBcdTA0MzRcdTA0Mzh8XHUwNDFGXHUwNDQwXHUwNDM4XHUwNDNDXHUwNDM1XHUwNDQwfFx1MDQxRlx1MDQ0MFx1MDQzOFx1MDQzQ1x1MDQzNVx1MDQ0MFx1MDQzOHxcdTA0MUZcdTA0NDBcdTA0MzhcdTA0M0NcdTA0MzVcdTA0NDBcdTA0NEJ8XHUwNDIwXHUwNDMwXHUwNDNDXHUwNDNBXHUwNDMwIFx1MDQzRFx1MDQzMCBcdTA0NDFcdTA0NDZcdTA0MzVcdTA0M0RcdTA0MzBcdTA0NDBcdTA0MzhcdTA0Mzl8XHUwNDIxXHUwNDNBXHUwNDM4XHUwNDQ2XHUwNDMwfFx1MDQyMVx1MDQ0Mlx1MDQ0MFx1MDQ0M1x1MDQzQVx1MDQ0Mlx1MDQ0M1x1MDQ0MFx1MDQzMCBcdTA0NDFcdTA0NDZcdTA0MzVcdTA0M0RcdTA0MzBcdTA0NDBcdTA0MzhcdTA0NThcdTA0MzB8XHUwNDIxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNBXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDMwIFx1MDQ0MVx1MDQ0Nlx1MDQzNVx1MDQzRFx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQ0RnxcdTA0MjFcdTA0NDJcdTA0NDBcdTA0NDNcdTA0M0FcdTA0NDJcdTA0NDNcdTA0NDBcdTA0MzAgXHUwNDQxXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDMwXHUwNDQwXHUwNDU2XHUwNDRFfFx1MDQyMVx1MDQ0Nlx1MDQzNVx1MDQzRFx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQzOXxcdTA0MjFcdTA0NDZcdTA0MzVcdTA0M0RcdTA0MzBcdTA0NDBcdTA0MzhcdTA0MzkgXHUwNDQxXHUwNDQyXHUwNDQwXHUwNDQzXHUwNDNBXHUwNDQyXHUwNDQzXHUwNDQwXHUwNDMwXHUwNDQxXHUwNDM4fFx1MDQyMVx1MDQ0Nlx1MDQzNVx1MDQzRFx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQzOVx1MDQzRFx1MDQ0Qlx1MDRBMyBcdTA0NDJcdTA0RTlcdTA0MzdcdTA0MzVcdTA0M0JcdTA0MzVcdTA0NDhcdTA0MzV8XHUwNDIxXHUwNDQ2XHUwNDM1XHUwNDNEXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDU4XHUwNDM4fFx1MDQyMVx1MDQ0Nlx1MDQzNVx1MDQzRFx1MDQzMFx1MDQ0MFx1MDQzOFx1MDQzRXxcdTA0MjFcdTA0NDZcdTA0MzVcdTA0M0RcdTA0MzBcdTA0NDBcdTA0NTZcdTA0Mzl8XHUwNDIyXHUwNDMwXHUwNDQwXHUwNDM4XHUwNDQ1fFx1MDRBRVx1MDQ0MFx1MDQzRFx1MDREOVx1MDQzQVx1MDQzQlx1MDREOVx1MDQ0MHxcdTA1RDNcdTA1RDVcdTA1RDJcdTA1REVcdTA1RDBcdTA1RDVcdTA1RUF8XHUwNUU4XHUwNUU3XHUwNUUyfFx1MDVFQVx1MDVEMVx1MDVFMFx1MDVEOVx1MDVFQSBcdTA1RUFcdTA1RThcdTA1RDdcdTA1RDlcdTA1RTl8XHUwNUVBXHUwNUU4XHUwNUQ3XHUwNUQ5XHUwNUU5fFx1MDYyN1x1MDY0NFx1MDYyRVx1MDY0NFx1MDY0MVx1MDY0QVx1MDYyOXxcdTA2MjdcdTA2NDRcdTA2QUZcdTA2NDhcdTA2Q0MgXHUwNjMzXHUwNjQ2XHUwNjI3XHUwNjMxXHUwNkNDXHUwNjQ4fFx1MDYyN1x1MDY0NVx1MDYyQlx1MDY0NFx1MDYyOXxcdTA2N0VcdTA2MzMgXHUwNjQ1XHUwNjQ2XHUwNjM4XHUwNjMxfFx1MDYzMlx1MDY0NVx1MDZDQ1x1MDY0Nlx1MDY0N3xcdTA2MzNcdTA2NDZcdTA2MjdcdTA2MzFcdTA2Q0NcdTA2NDh8XHUwNjMzXHUwNjRBXHUwNjQ2XHUwNjI3XHUwNjMxXHUwNjRBXHUwNjQ4fFx1MDYzM1x1MDY0QVx1MDY0Nlx1MDYyN1x1MDYzMVx1MDY0QVx1MDY0OCBcdTA2NDVcdTA2MkVcdTA2MzdcdTA2Mzd8XHUwNjQ1XHUwNjJCXHUwNjI3XHUwNjQ0XHUwNkNDXHUwNkJBfFx1MDY0NVx1MDY0Nlx1MDYzOFx1MDYzMSBcdTA2NDZcdTA2MjdcdTA2NDVcdTA2RDIgXHUwNkE5XHUwNjI3IFx1MDYyRVx1MDYyN1x1MDZBOVx1MDZDMXxcdTA2NDVcdTA2NDZcdTA2MzhcdTA2MzFcdTA2NDZcdTA2MjdcdTA2NDVcdTA2QzF8XHUwNjQ2XHUwNjQ1XHUwNjQ4XHUwNjQ2XHUwNjQ3IFx1MDY0N1x1MDYyN3xcdTA5MDlcdTA5MjZcdTA5M0VcdTA5MzlcdTA5MzBcdTA5MjN8XHUwOTJBXHUwOTMwXHUwOTNGXHUwOTI2XHUwOTQzXHUwOTM2XHUwOTREXHUwOTJGfFx1MDkyQVx1MDkzMFx1MDkzRlx1MDkyNlx1MDk0M1x1MDkzNlx1MDk0RFx1MDkyRiBcdTA5MzBcdTA5NDJcdTA5MkFcdTA5MzBcdTA5NDdcdTA5MTZcdTA5M0V8XHUwOTJBXHUwOTQzXHUwOTM3XHUwOTREXHUwOTIwXHUwOTJEXHUwOTQyXHUwOTJFXHUwOTNGfFx1MEEwOVx1MEEyNlx1MEEzRVx1MEEzOVx1MEEzMFx1MEEyOFx1MEEzRVx1MEEwMnxcdTBBMkFcdTBBMUZcdTBBMTVcdTBBMjVcdTBBM0V8XHUwQTJBXHUwQTFGXHUwQTE1XHUwQTI1XHUwQTNFIFx1MEEyMlx1MEEzRVx1MEEwMlx1MEExQVx1MEEzRXxcdTBBMkFcdTBBMUZcdTBBMTVcdTBBMjVcdTBBM0UgXHUwQTMwXHUwQTQyXHUwQTJBIFx1MEEzMFx1MEE0N1x1MEExNlx1MEEzRXxcdTBBMkFcdTBBM0ZcdTBBMUJcdTBBNEJcdTBBMTVcdTBBNUN8XHUwQzA5XHUwQzI2XHUwQzNFXHUwQzM5XHUwQzMwXHUwQzIzXHUwQzMyXHUwQzQxfFx1MEMxNVx1MEMyNVx1MEMyOFx1MEMwMnxcdTBDMjhcdTBDNDdcdTBDMkFcdTBDMjVcdTBDNERcdTBDMkZcdTBDMDJ8XHUwQzM4XHUwQzI4XHUwQzREXHUwQzI4XHUwQzNGXHUwQzM1XHUwQzQ3XHUwQzM2XHUwQzAyfFx1MEM4OVx1MENBNlx1MENCRVx1MENCOVx1MENCMFx1MENBM1x1MENDNlx1MEM5N1x1MENCM1x1MENDMXxcdTBDOTVcdTBDQTVcdTBDQkVcdTBDQjhcdTBDQkVcdTBDQjBcdTBDQkVcdTBDODJcdTBDQjZ8XHUwQ0I1XHUwQ0JGXHUwQ0I1XHUwQ0IwXHUwQ0EzXHUwQ0M2fFx1MENCOVx1MENCRlx1MENBOFx1MENDRFx1MENBOFx1MENDNlx1MENCMlx1MENDNnxcdTBFNDJcdTBFMDRcdTBFMjNcdTBFMDdcdTBFMkFcdTBFMjNcdTBFNDlcdTBFMzJcdTBFMDdcdTBFMDJcdTBFMkRcdTBFMDdcdTBFNDBcdTBFMkJcdTBFMTVcdTBFMzhcdTBFMDFcdTBFMzJcdTBFMjNcdTBFMTNcdTBFNEN8XHUwRTBBXHUwRTM4XHUwRTE0XHUwRTAyXHUwRTJEXHUwRTA3XHUwRTE1XHUwRTMxXHUwRTI3XHUwRTJEXHUwRTIyXHUwRTQ4XHUwRTMyXHUwRTA3fFx1MEUwQVx1MEUzOFx1MEUxNFx1MEUwMlx1MEUyRFx1MEUwN1x1MEU0MFx1MEUyQlx1MEUxNVx1MEUzOFx1MEUwMVx1MEUzMlx1MEUyM1x1MEUxM1x1MEU0Q3xcdTBFNDFcdTBFMTlcdTBFMjdcdTBFMDRcdTBFMzRcdTBFMTR8XHUwRTJBXHUwRTIzXHUwRTM4XHUwRTFCXHUwRTQwXHUwRTJCXHUwRTE1XHUwRTM4XHUwRTAxXHUwRTMyXHUwRTIzXHUwRTEzXHUwRTRDfFx1MEU0MFx1MEUyQlx1MEUxNVx1MEUzOFx1MEUwMVx1MEUzMlx1MEUyM1x1MEUxM1x1MEU0Q3xcdUJDMzBcdUFDQkR8XHVDMkRDXHVCMDk4XHVCOUFDXHVDNjI0fFx1QzJEQ1x1QjA5OFx1QjlBQ1x1QzYyNCBcdUFDMUNcdUM2OTR8XHVDNjA4fFx1MzBCNVx1MzBGM1x1MzBEN1x1MzBFQnxcdTMwQjdcdTMwQ0FcdTMwRUFcdTMwQUF8XHUzMEI3XHUzMENBXHUzMEVBXHUzMEFBXHUzMEEyXHUzMEE2XHUzMEM4XHUzMEU5XHUzMEE0XHUzMEYzfFx1MzBCN1x1MzBDQVx1MzBFQVx1MzBBQVx1MzBDNlx1MzBGM1x1MzBEN1x1MzBFQ3xcdTMwQjdcdTMwQ0FcdTMwRUFcdTMwQUFcdTMwQzZcdTMwRjNcdTMwRDdcdTMwRUNcdTMwRkNcdTMwQzh8XHUzMEM2XHUzMEYzXHUzMEQ3XHUzMEVDfFx1NEY4QnxcdTRGOEJcdTVCNTB8XHU1MjY3XHU2NzJDfFx1NTI2N1x1NjcyQ1x1NTkyN1x1N0VCMnxcdTUyODdcdTY3MkN8XHU1Mjg3XHU2NzJDXHU1OTI3XHU3REIxfFx1NTczQVx1NjY2RnxcdTU3M0FcdTY2NkZcdTU5MjdcdTdFQjJ8XHU1ODM0XHU2NjZGfFx1NTgzNFx1NjY2Rlx1NTkyN1x1N0RCMXxcdTgwQ0NcdTY2NkYpOlteOlxcclxcbl0qL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbXBvcnRhbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyg6KVteXFxyXFxuXSovLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J2tleXdvcmQnOiAvW146XFxyXFxuXSs6L1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3RhYmxlLWJvZHknOiB7XG5cdFx0XHQvLyBMb29rLWJlaGluZCBpcyB1c2VkIHRvIHNraXAgdGhlIHRhYmxlIGhlYWQsIHdoaWNoIGhhcyB0aGUgc2FtZSBmb3JtYXQgYXMgYW55IHRhYmxlIHJvd1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCcoJyArIHRhYmxlUm93ICsgJykoPzonICsgdGFibGVSb3cgKyAnKSsnKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J291dGxpbmUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLzxbXj5dKz4vLFxuXHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd0ZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxzKlteXFxzfF1bXnxdKi8sXG5cdFx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXHwvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQndGFibGUtaGVhZCc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCh0YWJsZVJvdyksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3RoJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXHMqW15cXHN8XVtefF0qLyxcblx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFx8L1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2F0cnVsZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSspKD86J2F8J2FjaHwnZWp8N3xhfEEgdGFrXHUwMEU5fEEgdGFrdGllXHUwMTdFfEEgdGllXHUwMTdFfEEgelx1MDBFMXJvdmVcdTAxNDh8QWJlcnxBY3xBZG90dHxBa2tvcnxBa3xBbGVzaG9yZXN8QWxlfEFsaXxBbGxvcmF8QWxvcnN8QWxzfEFtYXxBbWVubnlpYmVufEFtaWtvcnxBbXBha3xhbnxBTnxBbmFuZ2luZ3xBbmQgeSdhbGx8QW5kfEFuZ2Vub21tZW58QW5yaGVnZWRpZyBhfEFufEFwYWJpbGF8QXRcdTAwRThzfEF0ZXNhfEF0dW5jaXxBdmFzdCF8QXllfEF8YXdlcnxCYWdpfEJhbmp1cnxCZXR8QmlcdTFFQkZ0fEJsaW1leSF8QnVofEJ1dCBhdCB0aGUgZW5kIG9mIHRoZSBkYXkgSSByZWNrb258QnV0IHknYWxsfEJ1dHxCVVR8Q2FsfENcdTAwRTJuZHxDYW5kfENhbmRvfENlfEN1YW5kb3xcdTAxMENlfFx1MDBEMGEgXHUwMEYwZXxcdTAwRDBhfERhZGFzfERhZGF8RGFkb3N8RGFkb3xEYUggZ2h1JyBiZWpsdSd8ZGFubnxEYW5ufERhbm98RGFufERhcnxEYXQgZmlpbmR8RGF0YXxEYXRlIGZpaW5kfERhdGV8RGF0aSBmaWluZHxEYXRpfERhXHUwMTYzaSBmaWluZHxEYVx1MDIxQmkgZmlpbmR8REVOfERhdG98RGV8RGVuIHlvdXNlIGdvdHRhfERlbmdhbnxEaWJlcml8RGl5ZWxpbSBraXxEb25hZGF8RG9uYXR8RG9uaXRhXHUwMTM1b3xEb3xEdW58RHVvdGF8XHUwMEQwdXJofEVlbGRhZGVzfEVmfEVcdTAxMUZlciBraXxFbnRhb3xFbnRcdTAwRTNvfEVudFx1MDBGM258RXxFbnxFbnRvbmNlc3xFcGl8XHUwMEM5c3xFdGFudCBkb25uXHUwMEU5ZXxFdGFudCBkb25uXHUwMEU5fEV0fFx1MDBDOXRhbnQgZG9ublx1MDBFOWVzfFx1MDBDOXRhbnQgZG9ublx1MDBFOWV8XHUwMEM5dGFudCBkb25uXHUwMEU5fEV0YW50IGRvbm5cdTAwRTllc3xFdGFudCBkb25uXHUwMEU5c3xcdTAwQzl0YW50IGRvbm5cdTAwRTlzfEZha2F0fEdhbmd3YXkhfEdkeXxHZWdlYmVuIHNlaWVufEdlZ2ViZW4gc2VpfEdlZ2V2ZW58R2VnZXdlfGdodScgbm9ibHUnfEdpdHR8R2l2ZW4geSdhbGx8R2l2ZW58R2l2ZXR8R2l2dW58SGF8Q2hvfEkgQ0FOIEhBWnxJbnxJcnxJdCdzIGp1c3QgdW5iZWxpZXZhYmxlfEl8SmF8SmVcdTAxNUJsaXxKZVx1MDE3Q2VsaXxLYWR8S2FkYXxLYWRhcnxLYWl8S2FqfEtkeVx1MDE3RXxLZVx1MDEwRnxLZW11ZGlhbnxLZXRpa2F8S2hpfEtpZWR5fEtvfEt1aWR8S3VpfEt1bnxMYW58bGF0bGh8TGUgc2EgYXxMZXQgZ28gYW5kIGhhdWx8TGV8TFx1MDBFOCBzYSBhfExcdTAwRTh8TG9nb3xMb3JzcXUnPHxMb3JzcXVlfG1cdTAwRTR8TWFhcnxNYWlzfE1halx1MDEwNWN8TWF8TWFqZHxNYWthfE1hbmF3YXxNYXN8TWVufE1lbmF3YXxNdXR0YXxOYWxpa2F8TmFsaWthbmluZ3xOYW5naW5nfE5cdTAwRTVyfE5cdTAwRTRyfE5hdG98TmhcdTAxQjBuZ3xOaWlufE5qdWt8TyB6YW1hbnxPY2h8T2d8T2xldGV0YWFufE9uZHxPbmRhfE9yYXp8UGFrfFBlcm98UGVyXHUwMEYyfFBvZGFub3xQb2tpYVx1MDEzRXxQb2t1ZHxQb3RlbXxQb3RvbXxQcml2emV0b3xQcnlkfFF1YW58UXVhbmR8UXVhbmRvfHFhU0RJJ3xTXHUwMEU1fFNlZHxTZXxTaWlzfFNpcG96ZSBrZXxTaXBvemUgS2V8U2lwb3plfFNpfFx1MDE1RWl8XHUwMjE4aXxTb2l0fFN0ZWx8VGFkYXxUYWR8VGFrcmF0fFRha3xUYXBpfFRlcnxUZXRhcGl8VGhhIHRoZXxUaGF8VGhlbiB5J2FsbHxUaGVufFRoXHUwMEVDfFRodXJofFRvZGF8VG9vIHJpZ2h0fFVufFVuZHx1Z2Vob2xsfFZcdTAwRTB8dmFqfFZlbmRhcnxWZXx3YW5ufFdhbm5lZXJ8V0VOfFdlbm58V2hlbiB5J2FsbHxXaGVufFd0ZWR5fFd1bnxZJ2tub3d8WWVhaCBuYWh8WW5hfFlvdXNlIGtub3cgbGlrZSB3aGVufFlvdXNlIGtub3cgd2hlbiB5b3VzZSBnb3R8WXxaYSBwcmVkcG9rbGFkdXxaYSBwXHUwMTU5ZWRwb2tsYWR1fFphZGFufFphZGFuaXxaYWRhbm98WmFkYXRlfFphZGF0b3xaYWtcdTAxNDJhZGFqXHUwMTA1Y3xaYXJhZGl8WmF0YXRpfFx1MDBERWEgXHUwMEZFZXxcdTAwREVhfFx1MDBERVx1MDBFMXxcdTAwREVlZ2FyfFx1MDBERXVyaHxcdTAzOTFcdTAzQkJcdTAzQkJcdTAzQUN8XHUwMzk0XHUwM0I1XHUwM0I0XHUwM0JGXHUwM0JDXHUwM0FEXHUwM0JEXHUwM0JGXHUwM0M1fFx1MDM5QVx1MDNCMVx1MDNCOXxcdTAzOENcdTAzQzRcdTAzQjFcdTAzQkR8XHUwM0E0XHUwM0NDXHUwM0M0XHUwM0I1fFx1MDQxMCBcdTA0NDJcdTA0MzBcdTA0M0FcdTA0M0VcdTA0MzZ8XHUwNDEwXHUwNDMzXHUwNDMwXHUwNDQwfFx1MDQxMFx1MDQzQlx1MDQzNXxcdTA0MTBcdTA0M0JcdTA0Mzh8XHUwNDEwXHUwNDNDXHUwNDNDXHUwNDNFfFx1MDQxMHxcdTA0RDhcdTA0MzNcdTA0RDlcdTA0NDB8XHUwNEQ4XHUwNDM5XHUwNDQyXHUwNDM4XHUwNDNBfFx1MDREOFx1MDQzQ1x1MDQzQ1x1MDQzMHxcdTA0MTFcdTA0MzhcdTA0NDBcdTA0M0VcdTA0M0F8XHUwNDEyXHUwNDMwfFx1MDQxMlx1MDREOXxcdTA0MTRcdTA0MzBcdTA0MzRcdTA0MzVcdTA0M0RcdTA0M0V8XHUwNDE0XHUwNDMwXHUwNDNEXHUwNDNFfFx1MDQxNFx1MDQzRVx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzQ3xcdTA0MTVcdTA0NDFcdTA0M0JcdTA0Mzh8XHUwNDE3XHUwNDMwXHUwNDM0XHUwNDMwXHUwNDQyXHUwNDM1fFx1MDQxN1x1MDQzMFx1MDQzNFx1MDQzMFx1MDQ0Mlx1MDQzOHxcdTA0MTdcdTA0MzBcdTA0MzRcdTA0MzBcdTA0NDJcdTA0M0V8XHUwNDE4fFx1MDQwNnxcdTA0MUEgXHUwNDQyXHUwNDNFXHUwNDNDXHUwNDQzIFx1MDQzNlx1MDQzNXxcdTA0MUFcdTA0MzBcdTA0MzRcdTA0MzB8XHUwNDFBXHUwNDMwXHUwNDM0fFx1MDQxQVx1MDQzRVx1MDQzM1x1MDQzMFx1MDQ0Mlx1MDQzRXxcdTA0MUFcdTA0M0VcdTA0MzNcdTA0MzRcdTA0MzB8XHUwNDFBXHUwNDNFXHUwNDNCXHUwNDM4fFx1MDQxQlx1MDREOVx1MDQzQVx1MDQzOFx1MDQzRHxcdTA0MUJcdTA0MzVcdTA0M0FcdTA0MzhcdTA0M0R8XHUwNDFEXHUwNEQ5XHUwNDQyXHUwNDM4XHUwNDk3XHUwNEQ5XHUwNDM0XHUwNEQ5fFx1MDQxRFx1MDQzNVx1MDQ0NVx1MDQzMFx1MDQzOXxcdTA0MURcdTA0M0V8XHUwNDFFXHUwNDNEXHUwNDM0XHUwNDMwfFx1MDQxRlx1MDQ0MFx1MDQzOFx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzQ1x1MDQzRSwgXHUwNDQ5XHUwNDNFfFx1MDQxRlx1MDQ0MFx1MDQzOFx1MDQzRlx1MDQ0M1x1MDQ0MVx1MDQ0Mlx1MDQzOFx1MDQzQ1x1MDQzRXxcdTA0MUZcdTA0NDNcdTA0NDFcdTA0NDJcdTA0NEN8XHUwNDIyXHUwNDMwXHUwNDNBXHUwNDM2XHUwNDM1fFx1MDQyMlx1MDQzMHxcdTA0MjJcdTA0M0VcdTA0MzNcdTA0MzRcdTA0MzB8XHUwNDIyXHUwNDNFXHUwNDM0XHUwNDU2fFx1MDQyMlx1MDQzRXxcdTA0MjNcdTA0M0RcdTA0MzRcdTA0MzB8XHUwNEJBXHUwNEQ5XHUwNDNDfFx1MDQyRlx1MDQzQVx1MDQ0OVx1MDQzRXxcdTA1RDBcdTA1RDFcdTA1REN8XHUwNUQwXHUwNUQ2XHUwNUQ5fFx1MDVEMFx1MDVENnxcdTA1RDFcdTA1RDRcdTA1RDlcdTA1RTBcdTA1RUFcdTA1REZ8XHUwNUQ1XHUwNUQyXHUwNUREfFx1MDVEQlx1MDVEMFx1MDVFOVx1MDVFOHxcdTA2MjJcdTA2NDZcdTA2QUZcdTA2MjdcdTA2NDd8XHUwNjI3XHUwNjMwXHUwNjI3XHUwNjRCfFx1MDYyN1x1MDZBRlx1MDYzMXxcdTA2MjdcdTA2NDVcdTA2Mjd8XHUwNjI3XHUwNjQ4XHUwNjMxfFx1MDYyOFx1MDYyNyBcdTA2NDFcdTA2MzFcdTA2MzZ8XHUwNjI4XHUwNjI3XHUwNjQ0XHUwNjQxXHUwNjMxXHUwNjM2fFx1MDYyOFx1MDY0MVx1MDYzMVx1MDYzNnxcdTA2N0VcdTA2QkVcdTA2MzF8XHUwNjJBXHUwNjI4fFx1MDYyQlx1MDY0NXxcdTA2MkNcdTA2Mjh8XHUwNjM5XHUwNjQ2XHUwNjJGXHUwNjQ1XHUwNjI3fFx1MDY0MVx1MDYzMVx1MDYzNiBcdTA2QTlcdTA2Q0NcdTA2Mjd8XHUwNjQ0XHUwNjQzXHUwNjQ2fFx1MDY0NFx1MDZDQ1x1MDZBOVx1MDY0NnxcdTA2NDVcdTA2MkFcdTA2NDl8XHUwNjQ3XHUwNjQ2XHUwNkFGXHUwNjI3XHUwNjQ1XHUwNkNDfFx1MDY0OHxcdTA5MDVcdTA5MTdcdTA5MzB8XHUwOTE0XHUwOTMwfFx1MDkxNVx1MDkyNlx1MDkzRXxcdTA5MTVcdTA5M0ZcdTA5MjhcdTA5NERcdTA5MjRcdTA5NDF8XHUwOTFBXHUwOTQyXHUwOTAyXHUwOTE1XHUwOTNGfFx1MDkxQ1x1MDkyQ3xcdTA5MjRcdTA5MjVcdTA5M0V8XHUwOTI0XHUwOTI2XHUwOTNFfFx1MDkyNFx1MDkyQ3xcdTA5MkFcdTA5MzBcdTA5MjhcdTA5NERcdTA5MjRcdTA5NDF8XHUwOTJBXHUwOTMwfFx1MDkyRlx1MDkyNlx1MDkzRnxcdTBBMDVcdTBBMjRcdTBBNDd8XHUwQTFDXHUwQTI2XHUwQTRCXHUwQTAyfFx1MEExQ1x1MEEzRlx1MEEzNVx1MEE0N1x1MEEwMiBcdTBBMTVcdTBBM0Z8XHUwQTFDXHUwQTQ3XHUwQTE1XHUwQTMwfFx1MEEyNFx1MEEyNnxcdTBBMkFcdTBBMzB8XHUwQzA1XHUwQzJBXHUwQzREXHUwQzJBXHUwQzQxXHUwQzIxXHUwQzQxfFx1MEMwOCBcdTBDMkFcdTBDMzBcdTBDM0ZcdTBDMzhcdTBDNERcdTBDMjVcdTBDM0ZcdTBDMjRcdTBDM0ZcdTBDMzJcdTBDNEJ8XHUwQzE1XHUwQzNFXHUwQzI4XHUwQzNGfFx1MEMxQVx1MEM0Nlx1MEMyQVx1MEM0RFx1MEMyQVx1MEMyQ1x1MEMyMVx1MEMzRlx1MEMyOFx1MEMyNlx1MEMzRnxcdTBDMkVcdTBDMzBcdTBDM0ZcdTBDMkZcdTBDNDF8XHUwQzg2XHUwQ0E2XHUwQ0IwXHUwQ0M2fFx1MENBOFx1MEM4Mlx1MENBNFx1MENCMHxcdTBDQThcdTBDQkZcdTBDRDVcdTBDQTFcdTBDQkZcdTBDQTZ8XHUwQ0FFXHUwQ0E0XHUwQ0NEXHUwQ0E0XHUwQ0MxfFx1MENCOFx1MENDRFx1MENBNVx1MENCRlx1MENBNFx1MENCRlx1MENBRlx1MENBOFx1MENDRFx1MENBOFx1MENDMXxcdTBFMDFcdTBFMzNcdTBFMkJcdTBFMTlcdTBFMTRcdTBFNDNcdTBFMkJcdTBFNDl8XHUwRTE0XHUwRTMxXHUwRTA3XHUwRTE5XHUwRTMxXHUwRTQ5XHUwRTE5fFx1MEU0MVx1MEUxNVx1MEU0OHxcdTBFNDBcdTBFMjFcdTBFMzdcdTBFNDhcdTBFMkR8XHUwRTQxXHUwRTI1XHUwRTMwfFx1QURGOFx1QjdFQ1x1QkE3NDx8XHVBREY4XHVCOUFDXHVBQ0UwPHxcdUIyRTg8fFx1QjlDQ1x1QzU3RDx8XHVCOUNDXHVDNzdDPHxcdUJBM0NcdUM4MDA8fFx1Qzg3MFx1QUM3NDx8XHVENTU4XHVDOUMwXHVCOUNDPHxcdTMwNEJcdTMwNjQ8fFx1MzA1N1x1MzA0Qlx1MzA1Nzx8XHUzMDVGXHUzMDYwXHUzMDU3PHxcdTMwNkFcdTMwODlcdTMwNzA8fFx1MzA4Mlx1MzA1Nzx8XHU0RTI2XHU0RTE0PHxcdTRGNDZcdTMwNTc8fFx1NEY0Nlx1NjYyRjx8XHU1MDQ3XHU1OTgyPHxcdTUwNDdcdTVCOUE8fFx1NTA0N1x1OEEyRDx8XHU1MDQ3XHU4QkJFPHxcdTUyNERcdTYzRDA8fFx1NTQwQ1x1NjVGNjx8XHU1NDBDXHU2NjQyPHxcdTVFNzZcdTRFMTQ8fFx1NUY1Mzx8XHU3NTc2PHxcdTgwMENcdTRFMTQ8fFx1OTBBM1x1NEU0ODx8XHU5MEEzXHU5RUJDPCkoPz1bIFxcdF0pL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiKD86XFxcXC58W15cIlxcXFxcXHJcXG5dKSpcInwnKD86XFxcXC58W14nXFxcXFxcclxcbl0pKicvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdvdXRsaW5lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC88W14+XSs+Lyxcblx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnb3V0bGluZSc6IHtcblx0XHRcdHBhdHRlcm46IC88W14+XSs+Lyxcblx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0fVxuXHR9O1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5naXQgPSB7XG5cdC8qXG5cdCAqIEEgc2ltcGxlIG9uZSBsaW5lIGNvbW1lbnQgbGlrZSBpbiBhIGdpdCBzdGF0dXMgY29tbWFuZFxuXHQgKiBGb3IgaW5zdGFuY2U6XG5cdCAqICQgZ2l0IHN0YXR1c1xuXHQgKiAjIE9uIGJyYW5jaCBpbmZpbml0ZS1zY3JvbGxcblx0ICogIyBZb3VyIGJyYW5jaCBhbmQgJ29yaWdpbi9zaGFyZWRCcmFuY2hlcy9mcm9udGVuZFRlYW0vaW5maW5pdGUtc2Nyb2xsJyBoYXZlIGRpdmVyZ2VkLFxuXHQgKiAjIGFuZCBoYXZlIDEgYW5kIDIgZGlmZmVyZW50IGNvbW1pdHMgZWFjaCwgcmVzcGVjdGl2ZWx5LlxuXHQgKiBub3RoaW5nIHRvIGNvbW1pdCAod29ya2luZyBkaXJlY3RvcnkgY2xlYW4pXG5cdCAqL1xuXHQnY29tbWVudCc6IC9eIy4qL20sXG5cblx0Lypcblx0ICogUmVnZXhwIHRvIG1hdGNoIHRoZSBjaGFuZ2VkIGxpbmVzIGluIGEgZ2l0IGRpZmYgb3V0cHV0LiBDaGVjayB0aGUgZXhhbXBsZSBiZWxvdy5cblx0ICovXG5cdCdkZWxldGVkJzogL15bLVx1MjAxM10uKi9tLFxuXHQnaW5zZXJ0ZWQnOiAvXlxcKy4qL20sXG5cblx0Lypcblx0ICogYSBzdHJpbmcgKGRvdWJsZSBhbmQgc2ltcGxlIHF1b3RlKVxuXHQgKi9cblx0J3N0cmluZyc6IC8oXCJ8JykoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblxuXHQvKlxuXHQgKiBhIGdpdCBjb21tYW5kLiBJdCBzdGFydHMgd2l0aCBhIHJhbmRvbSBwcm9tcHQgZmluaXNoaW5nIGJ5IGEgJCwgdGhlbiBcImdpdFwiIHRoZW4gc29tZSBvdGhlciBwYXJhbWV0ZXJzXG5cdCAqIEZvciBpbnN0YW5jZTpcblx0ICogJCBnaXQgYWRkIGZpbGUudHh0XG5cdCAqL1xuXHQnY29tbWFuZCc6IHtcblx0XHRwYXR0ZXJuOiAvXi4qXFwkIGdpdCAuKiQvbSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdC8qXG5cdFx0XHQgKiBBIGdpdCBjb21tYW5kIGNhbiBjb250YWluIGEgcGFyYW1ldGVyIHN0YXJ0aW5nIGJ5IGEgc2luZ2xlIG9yIGEgZG91YmxlIGRhc2ggZm9sbG93ZWQgYnkgYSBzdHJpbmdcblx0XHRcdCAqIEZvciBpbnN0YW5jZTpcblx0XHRcdCAqICQgZ2l0IGRpZmYgLS1jYWNoZWRcblx0XHRcdCAqICQgZ2l0IGxvZyAtcFxuXHRcdFx0ICovXG5cdFx0XHQncGFyYW1ldGVyJzogL1xccy0tP1xcdysvXG5cdFx0fVxuXHR9LFxuXG5cdC8qXG5cdCAqIENvb3JkaW5hdGVzIGRpc3BsYXllZCBpbiBhIGdpdCBkaWZmIGNvbW1hbmRcblx0ICogRm9yIGluc3RhbmNlOlxuXHQgKiAkIGdpdCBkaWZmXG5cdCAqIGRpZmYgLS1naXQgZmlsZS50eHQgZmlsZS50eHRcblx0ICogaW5kZXggNjIxNDk1My4uMWQ1NGE1MiAxMDA2NDRcblx0ICogLS0tIGZpbGUudHh0XG5cdCAqICsrKyBmaWxlLnR4dFxuXHQgKiBAQCAtMSArMSwyIEBAXG5cdCAqIC1IZXJlJ3MgbXkgdGV0eCBmaWxlXG5cdCAqICtIZXJlJ3MgbXkgdGV4dCBmaWxlXG5cdCAqICtBbmQgdGhpcyBpcyB0aGUgc2Vjb25kIGxpbmVcblx0ICovXG5cdCdjb29yZCc6IC9eQEAuKkBAJC9tLFxuXG5cdC8qXG5cdCAqIE1hdGNoIGEgXCJjb21taXQgW1NIQTFdXCIgbGluZSBpbiBhIGdpdCBsb2cgb3V0cHV0LlxuXHQgKiBGb3IgaW5zdGFuY2U6XG5cdCAqICQgZ2l0IGxvZ1xuXHQgKiBjb21taXQgYTExYTE0ZWY3ZTI2ZjJjYTYyZDRiMzVlYWM0NTVjZTYzNmQwZGMwOVxuXHQgKiBBdXRob3I6IGxnaXJhdWRlbFxuXHQgKiBEYXRlOiAgIE1vbiBGZWIgMTcgMTE6MTg6MzQgMjAxNCArMDEwMFxuXHQgKlxuXHQgKiAgICAgQWRkIG9mIGEgbmV3IGxpbmVcblx0ICovXG5cdCdjb21taXQtc2hhMSc6IC9eY29tbWl0IFxcd3s0MH0kL21cbn07XG5cblByaXNtLmxhbmd1YWdlcy5nbHNsID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnYycsIHtcblx0J2tleXdvcmQnOiAvXFxiKD86YWN0aXZlfGFzbXxhdG9taWNfdWludHxhdHRyaWJ1dGV8W2liZHVdP3ZlY1syMzRdfGJvb2x8YnJlYWt8YnVmZmVyfGNhc2V8Y2FzdHxjZW50cm9pZHxjbGFzc3xjb2hlcmVudHxjb21tb258Y29uc3R8Y29udGludWV8ZD9tYXRbMjM0XSg/OnhbMjM0XSk/fGRlZmF1bHR8ZGlzY2FyZHxkb3xkb3VibGV8ZWxzZXxlbnVtfGV4dGVybnxleHRlcm5hbHxmYWxzZXxmaWx0ZXJ8Zml4ZWR8ZmxhdHxmbG9hdHxmb3J8ZnZlY1syMzRdfGdvdG98aGFsZnxoaWdocHxodmVjWzIzNF18W2l1XT9zYW1wbGVyMkRNUyg/OkFycmF5KT98W2l1XT9zYW1wbGVyMkRSZWN0fFtpdV0/c2FtcGxlckJ1ZmZlcnxbaXVdP3NhbXBsZXJDdWJlfFtpdV0/c2FtcGxlckN1YmVBcnJheXxbaXVdP3NhbXBsZXJbMTIzXUR8W2l1XT9zYW1wbGVyWzEyXURBcnJheXxbaXVdP2ltYWdlMkRNUyg/OkFycmF5KT98W2l1XT9pbWFnZTJEUmVjdHxbaXVdP2ltYWdlQnVmZmVyfFtpdV0/aW1hZ2VDdWJlfFtpdV0/aW1hZ2VDdWJlQXJyYXl8W2l1XT9pbWFnZVsxMjNdRHxbaXVdP2ltYWdlWzEyXURBcnJheXxpZnxpbnxpbmxpbmV8aW5vdXR8aW5wdXR8aW50fGludGVyZmFjZXxpbnZhcmlhbnR8bGF5b3V0fGxvbmd8bG93cHxtZWRpdW1wfG5hbWVzcGFjZXxub2lubGluZXxub3BlcnNwZWN0aXZlfG91dHxvdXRwdXR8cGFydGl0aW9ufHBhdGNofHByZWNpc2V8cHJlY2lzaW9ufHB1YmxpY3xyZWFkb25seXxyZXNvdXJjZXxyZXN0cmljdHxyZXR1cm58c2FtcGxlfHNhbXBsZXJbMTJdREFycmF5U2hhZG93fHNhbXBsZXJbMTJdRFNoYWRvd3xzYW1wbGVyMkRSZWN0U2hhZG93fHNhbXBsZXIzRFJlY3R8c2FtcGxlckN1YmVBcnJheVNoYWRvd3xzYW1wbGVyQ3ViZVNoYWRvd3xzaGFyZWR8c2hvcnR8c2l6ZW9mfHNtb290aHxzdGF0aWN8c3RydWN0fHN1YnJvdXRpbmV8c3VwZXJwfHN3aXRjaHx0ZW1wbGF0ZXx0aGlzfHRydWV8dHlwZWRlZnx1aW50fHVuaWZvcm18dW5pb258dW5zaWduZWR8dXNpbmd8dmFyeWluZ3x2b2lkfHZvbGF0aWxlfHdoaWxlfHdyaXRlb25seSlcXGIvXG59KTtcblxuLy8gaHR0cHM6Ly9nbi5nb29nbGVzb3VyY2UuY29tL2duLysvcmVmcy9oZWFkcy9tYWluL2RvY3MvcmVmZXJlbmNlLm1kI2dyYW1tYXJcblxuUHJpc20ubGFuZ3VhZ2VzLmduID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZy1saXRlcmFsJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxcIl0pXCIoPzpbXlxcclxcblwiXFxcXF18XFxcXC4pKlwiLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopXFwkKD86XFx7W1xcc1xcU10qP1xcfXxbYS16QS1aX11cXHcqfDB4W2EtZkEtRjAtOV17Mn0pLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J251bWJlcic6IC9eXFwkMHhbXFxzXFxTXXsyfSQvLFxuXHRcdFx0XHRcdCd2YXJpYWJsZSc6IC9eXFwkXFx3KyQvLFxuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL15cXCRcXHt8XFx9JC8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH0sXG5cblx0J2tleXdvcmQnOiAvXFxiKD86ZWxzZXxpZilcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdidWlsdGluLWZ1bmN0aW9uJzoge1xuXHRcdC8vIGEgZmV3IGZ1bmN0aW9ucyBnZXQgc3BlY2lhbCBoaWdobGlnaHRpbmcgdG8gaW1wcm92ZSByZWFkYWJpbGl0eVxuXHRcdHBhdHRlcm46IC9cXGIoPzphc3NlcnR8ZGVmaW5lZHxmb3JlYWNofGltcG9ydHxwb29sfHByaW50fHRlbXBsYXRlfHRvb2x8dG9vbGNoYWluKSg/PVxccypcXCgpL2ksXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cdCdjb25zdGFudCc6IC9cXGIoPzpjdXJyZW50X2NwdXxjdXJyZW50X29zfGN1cnJlbnRfdG9vbGNoYWlufGRlZmF1bHRfdG9vbGNoYWlufGhvc3RfY3B1fGhvc3Rfb3N8cm9vdF9idWlsZF9kaXJ8cm9vdF9nZW5fZGlyfHJvb3Rfb3V0X2Rpcnx0YXJnZXRfY3B1fHRhcmdldF9nZW5fZGlyfHRhcmdldF9vc3x0YXJnZXRfb3V0X2RpcilcXGIvLFxuXG5cdCdudW1iZXInOiAvLT9cXGJcXGQrXFxiLyxcblxuXHQnb3BlcmF0b3InOiAvWy0rIT08Pl09P3wmJnxcXHxcXHwvLFxuXHQncHVuY3R1YXRpb24nOiAvWygpe31bXFxdLC5dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmduWydzdHJpbmctbGl0ZXJhbCddLmluc2lkZVsnaW50ZXJwb2xhdGlvbiddLmluc2lkZVsnZXhwcmVzc2lvbiddLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5nbjtcblxuUHJpc20ubGFuZ3VhZ2VzLmduaSA9IFByaXNtLmxhbmd1YWdlcy5nbjtcblxuUHJpc20ubGFuZ3VhZ2VzWydsaW5rZXItc2NyaXB0J10gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxcXHMpXFwvXFwqW1xcc1xcU10qPyg/OiR8XFwqXFwvKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2lkZW50aWZpZXInOiB7XG5cdFx0cGF0dGVybjogL1wiW15cIlxcclxcbl0qXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdsb2NhdGlvbi1jb3VudGVyJzoge1xuXHRcdHBhdHRlcm46IC9cXEJcXC5cXEIvLFxuXHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHR9LFxuXG5cdCdzZWN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdypdKVxcLlxcdytcXGIvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnZnVuY3Rpb24nOiAvXFxiW0EtWl1bQS1aX10qKD89XFxzKlxcKCkvLFxuXG5cdCdudW1iZXInOiAvXFxiKD86MFt4WF1bYS1mQS1GMC05XSt8XFxkKylbS01dP1xcYi8sXG5cblx0J29wZXJhdG9yJzogLz4+PT98PDw9P3wtPnxcXCtcXCt8LS18JiZ8XFx8XFx8fDo6fFs/On5dfFstKyovJSZ8XiE9PD5dPT8vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpe30sO10vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXNbJ2xkJ10gPSBQcmlzbS5sYW5ndWFnZXNbJ2xpbmtlci1zY3JpcHQnXTtcblxuUHJpc20ubGFuZ3VhZ2VzLmdvID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pXCIoPzpcXFxcLnxbXlwiXFxcXFxcclxcbl0pKlwifGBbXmBdKmAvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmJyZWFrfGNhc2V8Y2hhbnxjb25zdHxjb250aW51ZXxkZWZhdWx0fGRlZmVyfGVsc2V8ZmFsbHRocm91Z2h8Zm9yfGZ1bmN8Z28oPzp0byk/fGlmfGltcG9ydHxpbnRlcmZhY2V8bWFwfHBhY2thZ2V8cmFuZ2V8cmV0dXJufHNlbGVjdHxzdHJ1Y3R8c3dpdGNofHR5cGV8dmFyKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/Ol98ZmFsc2V8aW90YXxuaWx8dHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogW1xuXHRcdC8vIGJpbmFyeSBhbmQgb2N0YWwgaW50ZWdlcnNcblx0XHQvXFxiMCg/OmJbMDFfXSt8b1swLTdfXSspaT9cXGIvaSxcblx0XHQvLyBoZXhhZGVjaW1hbCBpbnRlZ2VycyBhbmQgZmxvYXRzXG5cdFx0L1xcYjB4KD86W2EtZlxcZF9dKyg/OlxcLlthLWZcXGRfXSopP3xcXC5bYS1mXFxkX10rKSg/OnBbKy1dP1xcZCsoPzpfXFxkKykqKT9pPyg/IVxcdykvaSxcblx0XHQvLyBkZWNpbWFsIGludGVnZXJzIGFuZCBmbG9hdHNcblx0XHQvKD86XFxiXFxkW1xcZF9dKig/OlxcLltcXGRfXSopP3xcXEJcXC5cXGRbXFxkX10qKSg/OmVbKy1dP1tcXGRfXSspP2k/KD8hXFx3KS9pXG5cdF0sXG5cdCdvcGVyYXRvcic6IC9bKlxcLyVeIT1dPT98XFwrWz0rXT98LVs9LV0/fFxcfFs9fF0/fCYoPzo9fCZ8XFxePT8pP3w+KD86Pj0/fD0pP3w8KD86PD0/fD18LSk/fDo9fFxcLlxcLlxcLi8sXG5cdCdidWlsdGluJzogL1xcYig/OmFwcGVuZHxib29sfGJ5dGV8Y2FwfGNsb3NlfGNvbXBsZXh8Y29tcGxleCg/OjY0fDEyOCl8Y29weXxkZWxldGV8ZXJyb3J8ZmxvYXQoPzozMnw2NCl8dT9pbnQoPzo4fDE2fDMyfDY0KT98aW1hZ3xsZW58bWFrZXxuZXd8cGFuaWN8cHJpbnQoPzpsbik/fHJlYWx8cmVjb3ZlcnxydW5lfHN0cmluZ3x1aW50cHRyKVxcYi9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdnbycsICdzdHJpbmcnLCB7XG5cdCdjaGFyJzoge1xuXHRcdHBhdHRlcm46IC8nKD86XFxcXC58W14nXFxcXFxcclxcbl0pezAsMTB9Jy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH1cbn0pO1xuXG5kZWxldGUgUHJpc20ubGFuZ3VhZ2VzLmdvWydjbGFzcy1uYW1lJ107XG5cbi8vIGh0dHBzOi8vZ28uZGV2L3JlZi9tb2QjZ28tbW9kLWZpbGUtbW9kdWxlXG5cblByaXNtLmxhbmd1YWdlc1snZ28tbW9kJ10gPSBQcmlzbS5sYW5ndWFnZXNbJ2dvLW1vZHVsZSddID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwvLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndmVyc2lvbic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W1xccygpW1xcXSxdKXZcXGQrXFwuXFxkK1xcLlxcZCsoPzpbKy1dWy0rLlxcd10qKT8oPyFbXlxccygpW1xcXSxdKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J2dvLXZlcnNpb24nOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFxccylnb1xccyspXFxkKyg/OlxcLlxcZCspezEsMn0vLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdrZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC9eKFsgXFx0XSopKD86ZXhjbHVkZXxnb3xtb2R1bGV8cmVwbGFjZXxyZXF1aXJlfHJldHJhY3QpXFxiL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnb3BlcmF0b3InOiAvPT4vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpW1xcXSxdL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHR2YXIgaW50ZXJwb2xhdGlvbiA9IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcJF0pKD86XFxcXHsyfSkqKVxcJCg/Olxcdyt8XFx7W157fV0qXFx9KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXlxcJFxcez98XFx9JC8sXG5cdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nLFxuXHRcdFx0fSxcblx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0aW5zaWRlOiBudWxsLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5ncmFkbGUgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLycnJyg/OlteXFxcXF18XFxcXFtcXHNcXFNdKSo/JycnfCcoPzpcXFxcLnxbXlxcXFwnXFxyXFxuXSkqJy8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0fSxcblx0XHQna2V5d29yZCc6XG5cdFx0XHQvXFxiKD86YXBwbHl8ZGVmfGRlcGVuZGVuY2llc3xlbHNlfGlmfGltcGxlbWVudGF0aW9ufGltcG9ydHxwbHVnaW58cGx1Z2luc3xwcm9qZWN0fHJlcG9zaXRvcmllc3xyZXBvc2l0b3J5fHNvdXJjZVNldHN8dGFza3N8dmFsKVxcYi8sXG5cdFx0J251bWJlcic6IC9cXGIoPzowYlswMV9dK3wweFtcXGRhLWZfXSsoPzpcXC5bXFxkYS1mX3BcXC1dKyk/fFtcXGRfXSsoPzpcXC5bXFxkX10rKT8oPzplWystXT9cXGQrKT8pW2dsaWRmXT9cXGIvaSxcblx0XHQnb3BlcmF0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOlxuXHRcdFx0XHQvKF58W14uXSkoPzp+fD09P34/fFxcP1suOl0/fFxcKig/OlsuPV18XFwqPT8pP3xcXC5bQCZdfFxcLlxcLjx8XFwuXFwuKD8hXFwuKXwtWy09Pl0/fFxcK1srPV0/fCE9P3w8KD86PD0/fD0+Pyk/fD4oPzo+Pj89P3w9KT98JlsmPV0/fFxcfFt8PV0/fFxcLz0/fFxcXj0/fCU9PykvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC9cXC4rfFt7fVtcXF07KCksOiRdLyxcblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZ3JhZGxlJywgJ3N0cmluZycsIHtcblx0XHQnc2hlYmFuZyc6IHtcblx0XHRcdHBhdHRlcm46IC8jIS4rLyxcblx0XHRcdGFsaWFzOiAnY29tbWVudCcsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0fSxcblx0XHQnaW50ZXJwb2xhdGlvbi1zdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOlxuXHRcdFx0XHQvXCJcIlwiKD86W15cXFxcXXxcXFxcW1xcc1xcU10pKj9cIlwiXCJ8KFtcIi9dKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDF8XFwkXFwvKD86W14vJF18XFwkKD86Wy8kXXwoPyFbLyRdKSl8XFwvKD8hXFwkKSkqXFwvXFwkLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IGludGVycG9sYXRpb24sXG5cdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rLyxcblx0XHRcdH0sXG5cdFx0fSxcblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnZ3JhZGxlJywgJ3B1bmN0dWF0aW9uJywge1xuXHRcdCdzcG9jay1ibG9jayc6IC9cXGIoPzphbmR8Y2xlYW51cHxleHBlY3R8Z2l2ZW58c2V0dXB8dGhlbnx3aGVufHdoZXJlKTovLFxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdncmFkbGUnLCAnZnVuY3Rpb24nLCB7XG5cdFx0J2Fubm90YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14uXSlAXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbicsXG5cdFx0fSxcblx0fSk7XG5cblx0aW50ZXJwb2xhdGlvbi5pbnNpZGUuZXhwcmVzc2lvbi5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuZ3JhZGxlO1xufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuZ3JhcGhxbCA9IHtcblx0J2NvbW1lbnQnOiAvIy4qLyxcblx0J2Rlc2NyaXB0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oPzpcIlwiXCIoPzpbXlwiXXwoPyFcIlwiXCIpXCIpKlwiXCJcInxcIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCIpKD89XFxzKlthLXpfXSkvaSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2xhbmd1YWdlLW1hcmtkb3duJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF5cIig/OlwiXCIpPykoPyFcXDEpW1xcc1xcU10rKD89XFwxJCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5tYXJrZG93blxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCJcIlwiKD86W15cIl18KD8hXCJcIlwiKVwiKSpcIlwiXCJ8XCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J251bWJlcic6IC8oPzpcXEItfFxcYilcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/XFxiL2ksXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J3ZhcmlhYmxlJzogL1xcJFthLXpfXVxcdyovaSxcblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvQFthLXpfXVxcdyovaSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQnYXR0ci1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqKD89XFxzKig/OlxcKCg/OlteKClcIl18XCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiKSpcXCkpPzopL2ksXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdhdG9tLWlucHV0Jzoge1xuXHRcdHBhdHRlcm46IC9cXGJbQS1aXVxcdypJbnB1dFxcYi8sXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9LFxuXHQnc2NhbGFyJzogL1xcYig/OkJvb2xlYW58RmxvYXR8SUR8SW50fFN0cmluZylcXGIvLFxuXHQnY29uc3RhbnQnOiAvXFxiW0EtWl1bQS1aX1xcZF0qXFxiLyxcblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyhcXGIoPzplbnVtfGltcGxlbWVudHN8aW50ZXJmYWNlfG9ufHNjYWxhcnx0eXBlfHVuaW9uKVxccyt8Jlxccyp8Olxccyp8XFxbKVtBLVpfXVxcdyovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2ZyYWdtZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXFxiZnJhZ21lbnRcXHMrfFxcLnszfVxccyooPyFvblxcYikpW2EtekEtWl9dXFx3Ki8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQnZGVmaW5pdGlvbi1tdXRhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYm11dGF0aW9uXFxzKylbYS16QS1aX11cXHcqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdkZWZpbml0aW9uLXF1ZXJ5Jzoge1xuXHRcdHBhdHRlcm46IC8oXFxicXVlcnlcXHMrKVthLXpBLVpfXVxcdyovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86ZGlyZWN0aXZlfGVudW18ZXh0ZW5kfGZyYWdtZW50fGltcGxlbWVudHN8aW5wdXR8aW50ZXJmYWNlfG11dGF0aW9ufG9ufHF1ZXJ5fHJlcGVhdGFibGV8c2NhbGFyfHNjaGVtYXxzdWJzY3JpcHRpb258dHlwZXx1bmlvbilcXGIvLFxuXHQnb3BlcmF0b3InOiAvWyE9fCZdfFxcLnszfS8sXG5cdCdwcm9wZXJ0eS1xdWVyeSc6IC9cXHcrKD89XFxzKlxcKCkvLFxuXHQnb2JqZWN0JzogL1xcdysoPz1cXHMqXFx7KS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bISgpe31cXFtcXF06PSxdLyxcblx0J3Byb3BlcnR5JzogL1xcdysvXG59O1xuXG5QcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gYWZ0ZXJUb2tlbml6ZUdyYXBocWwoZW52KSB7XG5cdGlmIChlbnYubGFuZ3VhZ2UgIT09ICdncmFwaHFsJykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8qKlxuXHQgKiBnZXQgdGhlIGdyYXBocWwgdG9rZW4gc3RyZWFtIHRoYXQgd2Ugd2FudCB0byBjdXN0b21pemVcblx0ICpcblx0ICogQHR5cGVkZWYge0luc3RhbmNlVHlwZTxpbXBvcnQoXCIuL3ByaXNtLWNvcmVcIilbXCJUb2tlblwiXT59IFRva2VuXG5cdCAqIEB0eXBlIHtUb2tlbltdfVxuXHQgKi9cblx0dmFyIHZhbGlkVG9rZW5zID0gZW52LnRva2Vucy5maWx0ZXIoZnVuY3Rpb24gKHRva2VuKSB7XG5cdFx0cmV0dXJuIHR5cGVvZiB0b2tlbiAhPT0gJ3N0cmluZycgJiYgdG9rZW4udHlwZSAhPT0gJ2NvbW1lbnQnICYmIHRva2VuLnR5cGUgIT09ICdzY2FsYXInO1xuXHR9KTtcblxuXHR2YXIgY3VycmVudEluZGV4ID0gMDtcblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoZSB0b2tlbiByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBpbmRleCBoYXMgdGhlIGdpdmVuIHR5cGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcblx0ICogQHJldHVybnMge1Rva2VuIHwgdW5kZWZpbmVkfVxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0VG9rZW4ob2Zmc2V0KSB7XG5cdFx0cmV0dXJuIHZhbGlkVG9rZW5zW2N1cnJlbnRJbmRleCArIG9mZnNldF07XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoZSB0b2tlbiByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBpbmRleCBoYXMgdGhlIGdpdmVuIHR5cGUuXG5cdCAqXG5cdCAqIEBwYXJhbSB7cmVhZG9ubHkgc3RyaW5nW119IHR5cGVzXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBbb2Zmc2V0PTBdXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0ZnVuY3Rpb24gaXNUb2tlblR5cGUodHlwZXMsIG9mZnNldCkge1xuXHRcdG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciB0b2tlbiA9IGdldFRva2VuKGkgKyBvZmZzZXQpO1xuXHRcdFx0aWYgKCF0b2tlbiB8fCB0b2tlbi50eXBlICE9PSB0eXBlc1tpXSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjbG9zaW5nIGJyYWNrZXQgdG8gYW4gb3BlbmluZyBicmFja2V0LlxuXHQgKlxuXHQgKiBJdCBpcyBhc3N1bWVkIHRoYXQgYHRva2VuW2N1cnJlbnRJbmRleCAtIDFdYCBpcyBhbiBvcGVuaW5nIGJyYWNrZXQuXG5cdCAqXG5cdCAqIElmIG5vIGNsb3NpbmcgYnJhY2tldCBjb3VsZCBiZSBmb3VuZCwgYC0xYCB3aWxsIGJlIHJldHVybmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0ge1JlZ0V4cH0gb3BlblxuXHQgKiBAcGFyYW0ge1JlZ0V4cH0gY2xvc2Vcblx0ICogQHJldHVybnMge251bWJlcn1cblx0ICovXG5cdGZ1bmN0aW9uIGZpbmRDbG9zaW5nQnJhY2tldChvcGVuLCBjbG9zZSkge1xuXHRcdHZhciBzdGFja0hlaWdodCA9IDE7XG5cblx0XHRmb3IgKHZhciBpID0gY3VycmVudEluZGV4OyBpIDwgdmFsaWRUb2tlbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciB0b2tlbiA9IHZhbGlkVG9rZW5zW2ldO1xuXHRcdFx0dmFyIGNvbnRlbnQgPSB0b2tlbi5jb250ZW50O1xuXG5cdFx0XHRpZiAodG9rZW4udHlwZSA9PT0gJ3B1bmN0dWF0aW9uJyAmJiB0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0aWYgKG9wZW4udGVzdChjb250ZW50KSkge1xuXHRcdFx0XHRcdHN0YWNrSGVpZ2h0Kys7XG5cdFx0XHRcdH0gZWxzZSBpZiAoY2xvc2UudGVzdChjb250ZW50KSkge1xuXHRcdFx0XHRcdHN0YWNrSGVpZ2h0LS07XG5cblx0XHRcdFx0XHRpZiAoc3RhY2tIZWlnaHQgPT09IDApIHtcblx0XHRcdFx0XHRcdHJldHVybiBpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAtMTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGFuIGFsaWFzIHRvIHRoZSBnaXZlbiB0b2tlbi5cblx0ICpcblx0ICogQHBhcmFtIHtUb2tlbn0gdG9rZW5cblx0ICogQHBhcmFtIHtzdHJpbmd9IGFsaWFzXG5cdCAqIEByZXR1cm5zIHt2b2lkfVxuXHQgKi9cblx0ZnVuY3Rpb24gYWRkQWxpYXModG9rZW4sIGFsaWFzKSB7XG5cdFx0dmFyIGFsaWFzZXMgPSB0b2tlbi5hbGlhcztcblx0XHRpZiAoIWFsaWFzZXMpIHtcblx0XHRcdHRva2VuLmFsaWFzID0gYWxpYXNlcyA9IFtdO1xuXHRcdH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYWxpYXNlcykpIHtcblx0XHRcdHRva2VuLmFsaWFzID0gYWxpYXNlcyA9IFthbGlhc2VzXTtcblx0XHR9XG5cdFx0YWxpYXNlcy5wdXNoKGFsaWFzKTtcblx0fVxuXG5cdGZvciAoOyBjdXJyZW50SW5kZXggPCB2YWxpZFRva2Vucy5sZW5ndGg7KSB7XG5cdFx0dmFyIHN0YXJ0VG9rZW4gPSB2YWxpZFRva2Vuc1tjdXJyZW50SW5kZXgrK107XG5cblx0XHQvLyBhZGQgc3BlY2lhbCBhbGlhc2VzIGZvciBtdXRhdGlvbiB0b2tlbnNcblx0XHRpZiAoc3RhcnRUb2tlbi50eXBlID09PSAna2V5d29yZCcgJiYgc3RhcnRUb2tlbi5jb250ZW50ID09PSAnbXV0YXRpb24nKSB7XG5cdFx0XHQvLyBhbnkgYXJyYXkgb2YgdGhlIG5hbWVzIG9mIGFsbCBpbnB1dCB2YXJpYWJsZXMgKGlmIGFueSlcblx0XHRcdHZhciBpbnB1dFZhcmlhYmxlcyA9IFtdO1xuXG5cdFx0XHRpZiAoaXNUb2tlblR5cGUoWydkZWZpbml0aW9uLW11dGF0aW9uJywgJ3B1bmN0dWF0aW9uJ10pICYmIGdldFRva2VuKDEpLmNvbnRlbnQgPT09ICcoJykge1xuXHRcdFx0XHQvLyBkZWZpbml0aW9uXG5cblx0XHRcdFx0Y3VycmVudEluZGV4ICs9IDI7IC8vIHNraXAgJ2RlZmluaXRpb24tbXV0YXRpb24nIGFuZCAncHVuY3R1YXRpb24nXG5cblx0XHRcdFx0dmFyIGRlZmluaXRpb25FbmQgPSBmaW5kQ2xvc2luZ0JyYWNrZXQoL15cXCgkLywgL15cXCkkLyk7XG5cdFx0XHRcdGlmIChkZWZpbml0aW9uRW5kID09PSAtMSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gZmluZCBhbGwgaW5wdXQgdmFyaWFibGVzXG5cdFx0XHRcdGZvciAoOyBjdXJyZW50SW5kZXggPCBkZWZpbml0aW9uRW5kOyBjdXJyZW50SW5kZXgrKykge1xuXHRcdFx0XHRcdHZhciB0ID0gZ2V0VG9rZW4oMCk7XG5cdFx0XHRcdFx0aWYgKHQudHlwZSA9PT0gJ3ZhcmlhYmxlJykge1xuXHRcdFx0XHRcdFx0YWRkQWxpYXModCwgJ3ZhcmlhYmxlLWlucHV0Jyk7XG5cdFx0XHRcdFx0XHRpbnB1dFZhcmlhYmxlcy5wdXNoKHQuY29udGVudCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y3VycmVudEluZGV4ID0gZGVmaW5pdGlvbkVuZCArIDE7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpc1Rva2VuVHlwZShbJ3B1bmN0dWF0aW9uJywgJ3Byb3BlcnR5LXF1ZXJ5J10pICYmIGdldFRva2VuKDApLmNvbnRlbnQgPT09ICd7Jykge1xuXHRcdFx0XHRjdXJyZW50SW5kZXgrKzsgLy8gc2tpcCBvcGVuaW5nIGJyYWNrZXRcblxuXHRcdFx0XHRhZGRBbGlhcyhnZXRUb2tlbigwKSwgJ3Byb3BlcnR5LW11dGF0aW9uJyk7XG5cblx0XHRcdFx0aWYgKGlucHV0VmFyaWFibGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHR2YXIgbXV0YXRpb25FbmQgPSBmaW5kQ2xvc2luZ0JyYWNrZXQoL15cXHskLywgL15cXH0kLyk7XG5cdFx0XHRcdFx0aWYgKG11dGF0aW9uRW5kID09PSAtMSkge1xuXHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gZ2l2ZSByZWZlcmVuY2VzIHRvIGlucHV0IHZhcmlhYmxlcyBhIHNwZWNpYWwgYWxpYXNcblx0XHRcdFx0XHRmb3IgKHZhciBpID0gY3VycmVudEluZGV4OyBpIDwgbXV0YXRpb25FbmQ7IGkrKykge1xuXHRcdFx0XHRcdFx0dmFyIHZhclRva2VuID0gdmFsaWRUb2tlbnNbaV07XG5cdFx0XHRcdFx0XHRpZiAodmFyVG9rZW4udHlwZSA9PT0gJ3ZhcmlhYmxlJyAmJiBpbnB1dFZhcmlhYmxlcy5pbmRleE9mKHZhclRva2VuLmNvbnRlbnQpID49IDApIHtcblx0XHRcdFx0XHRcdFx0YWRkQWxpYXModmFyVG9rZW4sICd2YXJpYWJsZS1pbnB1dCcpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgaW50ZXJwb2xhdGlvbiA9IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcJF0pKD86XFxcXHsyfSkqKVxcJCg/Olxcdyt8XFx7W157fV0qXFx9KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXlxcJFxcez98XFx9JC8sXG5cdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHR9LFxuXHRcdFx0J2V4cHJlc3Npb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5ncm9vdnkgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0Ly8gaHR0cHM6Ly9ncm9vdnktbGFuZy5vcmcvc3ludGF4Lmh0bWwjX2RvbGxhcl9zbGFzaHlfc3RyaW5nXG5cdFx0XHRwYXR0ZXJuOiAvJycnKD86W15cXFxcXXxcXFxcW1xcc1xcU10pKj8nJyd8Jyg/OlxcXFwufFteXFxcXCdcXHJcXG5dKSonLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86YWJzdHJhY3R8YXN8YXNzZXJ0fGJvb2xlYW58YnJlYWt8Ynl0ZXxjYXNlfGNhdGNofGNoYXJ8Y2xhc3N8Y29uc3R8Y29udGludWV8ZGVmfGRlZmF1bHR8ZG98ZG91YmxlfGVsc2V8ZW51bXxleHRlbmRzfGZpbmFsfGZpbmFsbHl8ZmxvYXR8Zm9yfGdvdG98aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW58aW5zdGFuY2VvZnxpbnR8aW50ZXJmYWNlfGxvbmd8bmF0aXZlfG5ld3xwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZXR1cm58c2hvcnR8c3RhdGljfHN0cmljdGZwfHN1cGVyfHN3aXRjaHxzeW5jaHJvbml6ZWR8dGhpc3x0aHJvd3x0aHJvd3N8dHJhaXR8dHJhbnNpZW50fHRyeXx2b2lkfHZvbGF0aWxlfHdoaWxlKVxcYi8sXG5cdFx0J251bWJlcic6IC9cXGIoPzowYlswMV9dK3wweFtcXGRhLWZfXSsoPzpcXC5bXFxkYS1mX3BcXC1dKyk/fFtcXGRfXSsoPzpcXC5bXFxkX10rKT8oPzplWystXT9cXGQrKT8pW2dsaWRmXT9cXGIvaSxcblx0XHQnb3BlcmF0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14uXSkoPzp+fD09P34/fFxcP1suOl0/fFxcKig/OlsuPV18XFwqPT8pP3xcXC5bQCZdfFxcLlxcLjx8XFwuXFwuKD8hXFwuKXwtWy09Pl0/fFxcK1srPV0/fCE9P3w8KD86PD0/fD0+Pyk/fD4oPzo+Pj89P3w9KT98JlsmPV0/fFxcfFt8PV0/fFxcLz0/fFxcXj0/fCU9PykvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1xcLit8W3t9W1xcXTsoKSw6JF0vXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2dyb292eScsICdzdHJpbmcnLCB7XG5cdFx0J3NoZWJhbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvIyEuKy8sXG5cdFx0XHRhbGlhczogJ2NvbW1lbnQnLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnaW50ZXJwb2xhdGlvbi1zdHJpbmcnOiB7XG5cdFx0XHQvLyBUT0RPOiBTbGFzaCBzdHJpbmdzIChlLmcuIC9mb28vKSBjYW4gY29udGFpbiBsaW5lIGJyZWFrcyBidXQgdGhpcyB3aWxsIGNhdXNlIGEgbG90IG9mIHRyb3VibGUgd2l0aFxuXHRcdFx0Ly8gc2ltcGxlIGRpdmlzaW9uIChzZWUgSlMgcmVnZXgpLCBzbyBmaW5kIGEgZml4IG1heWJlP1xuXHRcdFx0cGF0dGVybjogL1wiXCJcIig/OlteXFxcXF18XFxcXFtcXHNcXFNdKSo/XCJcIlwifChbXCIvXSkoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxfFxcJFxcLyg/OlteLyRdfFxcJCg/OlsvJF18KD8hWy8kXSkpfFxcLyg/IVxcJCkpKlxcL1xcJC8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBpbnRlcnBvbGF0aW9uLFxuXHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2dyb292eScsICdwdW5jdHVhdGlvbicsIHtcblx0XHQnc3BvY2stYmxvY2snOiAvXFxiKD86YW5kfGNsZWFudXB8ZXhwZWN0fGdpdmVufHNldHVwfHRoZW58d2hlbnx3aGVyZSk6L1xuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdncm9vdnknLCAnZnVuY3Rpb24nLCB7XG5cdFx0J2Fubm90YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W14uXSlAXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9XG5cdH0pO1xuXG5cdGludGVycG9sYXRpb24uaW5zaWRlLmV4cHJlc3Npb24uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLmdyb292eTtcblxufShQcmlzbSkpO1xuXG4vKiBUT0RPXG5cdEhhbmRsZSBtdWx0aWxpbmUgY29kZSBhZnRlciB0YWdcblx0ICAgICVmb289IHNvbWUgfFxuXHRcdFx0bXVsdGlsaW5lIHxcblx0XHRcdGNvZGUgfFxuKi9cblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy5oYW1sID0ge1xuXHRcdC8vIE11bHRpbGluZSBzdHVmZiBzaG91bGQgYXBwZWFyIGJlZm9yZSB0aGUgcmVzdFxuXG5cdFx0J211bHRpbGluZS1jb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFxccj9cXG58XFxyKShbXFx0IF0qKSkoPzpcXC98LSMpLiooPzooPzpcXHI/XFxufFxccilcXDJbXFx0IF0uKykqLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdFx0fSxcblxuXHRcdCdtdWx0aWxpbmUtY29kZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFxccj9cXG58XFxyKShbXFx0IF0qKSg/Olt+LV18WyYhXT89KSkuKixbXFx0IF0qKD86KD86XFxyP1xcbnxcXHIpXFwyW1xcdCBdLiosW1xcdCBdKikqKD86KD86XFxyP1xcbnxcXHIpXFwyW1xcdCBdLispLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucnVieVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFxccj9cXG58XFxyKShbXFx0IF0qKSg/Olt+LV18WyYhXT89KSkuKlxcfFtcXHQgXSooPzooPzpcXHI/XFxufFxccilcXDJbXFx0IF0uKlxcfFtcXHQgXSopKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnJ1Ynlcblx0XHRcdH1cblx0XHRdLFxuXG5cdFx0Ly8gU2VlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgZm9yIGtub3duIGZpbHRlcnNcblx0XHQnZmlsdGVyJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFxccj9cXG58XFxyKShbXFx0IF0qKSk6W1xcdy1dKyg/Oig/Olxccj9cXG58XFxyKSg/OlxcMltcXHQgXS4rfFxccyo/KD89XFxyP1xcbnxcXHIpKSkrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ZpbHRlci1uYW1lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eOltcXHctXSsvLFxuXHRcdFx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdtYXJrdXAnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxyP1xcbnxcXHIpW1xcdCBdKik8LisvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLm1hcmt1cFxuXHRcdH0sXG5cdFx0J2RvY3R5cGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxyP1xcbnxcXHIpW1xcdCBdKikhISEoPzogLispPy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQndGFnJzoge1xuXHRcdFx0Ly8gQWxsb3dzIGZvciBvbmUgbmVzdGVkIGdyb3VwIG9mIGJyYWNlc1xuXHRcdFx0cGF0dGVybjogLygoPzpefFxccj9cXG58XFxyKVtcXHQgXSopWyUuI11bXFx3XFwtIy5dKltcXHdcXC1dKD86XFwoW14pXStcXCl8XFx7KD86XFx7W159XStcXH18W157fV0pK1xcfXxcXFtbXlxcXV0rXFxdKSpbXFwvPD5dKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdhdHRyaWJ1dGVzJzogW1xuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdC8vIExvb2tiZWhpbmQgdHJpZXMgdG8gcHJldmVudCBpbnRlcnBvbGF0aW9ucyBmcm9tIGJyZWFraW5nIGl0IGFsbFxuXHRcdFx0XHRcdFx0Ly8gQWxsb3dzIGZvciBvbmUgbmVzdGVkIGdyb3VwIG9mIGJyYWNlc1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyhefFteI10pXFx7KD86XFx7W159XStcXH18W157fV0pK1xcfS8sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucnVieVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1xcKFteKV0rXFwpLyxcblx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHQnYXR0ci12YWx1ZSc6IHtcblx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKD1cXHMqKSg/OlwiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcInxbXilcXHNdKykvLFxuXHRcdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0J2F0dHItbmFtZSc6IC9bXFx3Oi1dKyg/PVxccyohPz18XFxzKlssKV0pLyxcblx0XHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1s9KCksXS9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXFtbXlxcXV0rXFxdLyxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnJ1Ynlcblx0XHRcdFx0XHR9XG5cdFx0XHRcdF0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bPD5dL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NvZGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxyP1xcbnxcXHIpW1xcdCBdKig/Olt+LV18WyYhXT89KSkuKy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucnVieVxuXHRcdH0sXG5cdFx0Ly8gSW50ZXJwb2xhdGlvbnMgaW4gcGxhaW4gdGV4dFxuXHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyNcXHtbXn1dK1xcfS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXiNcXHt8XFx9JC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fSxcblx0XHRcdFx0J3J1YnknOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucnVieVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxyP1xcbnxcXHIpW1xcdCBdKilbfj1cXC0mIV0rLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdH07XG5cblx0dmFyIGZpbHRlcl9wYXR0ZXJuID0gJygoPzpefFxcXFxyP1xcXFxufFxcXFxyKShbXFxcXHQgXSopKTp7e2ZpbHRlcl9uYW1lfX0oPzooPzpcXFxccj9cXFxcbnxcXFxccikoPzpcXFxcMltcXFxcdCBdLit8XFxcXHMqPyg/PVxcXFxyP1xcXFxufFxcXFxyKSkpKyc7XG5cblx0Ly8gTm9uIGV4aGF1c3RpdmUgbGlzdCBvZiBhdmFpbGFibGUgZmlsdGVycyBhbmQgYXNzb2NpYXRlZCBsYW5ndWFnZXNcblx0dmFyIGZpbHRlcnMgPSBbXG5cdFx0J2NzcycsXG5cdFx0eyBmaWx0ZXI6ICdjb2ZmZWUnLCBsYW5ndWFnZTogJ2NvZmZlZXNjcmlwdCcgfSxcblx0XHQnZXJiJyxcblx0XHQnamF2YXNjcmlwdCcsXG5cdFx0J2xlc3MnLFxuXHRcdCdtYXJrZG93bicsXG5cdFx0J3J1YnknLFxuXHRcdCdzY3NzJyxcblx0XHQndGV4dGlsZSdcblx0XTtcblx0dmFyIGFsbF9maWx0ZXJzID0ge307XG5cdGZvciAodmFyIGkgPSAwLCBsID0gZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcblx0XHR2YXIgZmlsdGVyID0gZmlsdGVyc1tpXTtcblx0XHRmaWx0ZXIgPSB0eXBlb2YgZmlsdGVyID09PSAnc3RyaW5nJyA/IHsgZmlsdGVyOiBmaWx0ZXIsIGxhbmd1YWdlOiBmaWx0ZXIgfSA6IGZpbHRlcjtcblx0XHRpZiAoUHJpc20ubGFuZ3VhZ2VzW2ZpbHRlci5sYW5ndWFnZV0pIHtcblx0XHRcdGFsbF9maWx0ZXJzWydmaWx0ZXItJyArIGZpbHRlci5maWx0ZXJdID0ge1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoZmlsdGVyX3BhdHRlcm4ucmVwbGFjZSgne3tmaWx0ZXJfbmFtZX19JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZmlsdGVyLmZpbHRlcjsgfSkpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZmlsdGVyLW5hbWUnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXjpbXFx3LV0rLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3RleHQnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdGFsaWFzOiBbZmlsdGVyLmxhbmd1YWdlLCAnbGFuZ3VhZ2UtJyArIGZpbHRlci5sYW5ndWFnZV0sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlc1tmaWx0ZXIubGFuZ3VhZ2VdXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2hhbWwnLCAnZmlsdGVyJywgYWxsX2ZpbHRlcnMpO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaGFuZGxlYmFycyA9IHtcblx0XHQnY29tbWVudCc6IC9cXHtcXHshW1xcc1xcU10qP1xcfVxcfS8sXG5cdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdHBhdHRlcm46IC9eXFx7XFx7XFx7P3xcXH1cXH1cXH0/JC8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J3N0cmluZyc6IC8oW1wiJ10pKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0J251bWJlcic6IC9cXGIweFtcXGRBLUZhLWZdK1xcYnwoPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86W0VlXVsrLV0/XFxkKyk/Lyxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0J2Jsb2NrJzoge1xuXHRcdFx0cGF0dGVybjogL14oXFxzKig/On5cXHMqKT8pWyNcXC9dXFxTKz8oPz1cXHMqKD86flxccyopPyR8XFxzKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cdFx0J2JyYWNrZXRzJzoge1xuXHRcdFx0cGF0dGVybjogL1xcW1teXFxdXStcXF0vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdHB1bmN0dWF0aW9uOiAvXFxbfFxcXS8sXG5cdFx0XHRcdHZhcmlhYmxlOiAvW1xcc1xcU10rL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1shXCIjJSYnOigpKissLlxcLzs8PT5AXFxbXFxcXFxcXV5ge3x9fl0vLFxuXHRcdCd2YXJpYWJsZSc6IC9bXiFcIiMlJicoKSorLFxcLzs8PT5AXFxbXFxcXFxcXV5ge3x9flxcc10rL1xuXHR9O1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdHZhciBoYW5kbGViYXJzUGF0dGVybiA9IC9cXHtcXHtcXHtbXFxzXFxTXSs/XFx9XFx9XFx9fFxce1xce1tcXHNcXFNdKz9cXH1cXH0vZztcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10uYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAnaGFuZGxlYmFycycsIGhhbmRsZWJhcnNQYXR0ZXJuKTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10udG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAnaGFuZGxlYmFycycpO1xuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaGJzID0gUHJpc20ubGFuZ3VhZ2VzLmhhbmRsZWJhcnM7XG5cdFByaXNtLmxhbmd1YWdlcy5tdXN0YWNoZSA9IFByaXNtLmxhbmd1YWdlcy5oYW5kbGViYXJzO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5oYXNrZWxsID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14tISMkJSorPT8mQHx+Ljo8Pl5cXFxcXFwvXSkoPzotLSg/Oig/PS4pW14tISMkJSorPT8mQHx+Ljo8Pl5cXFxcXFwvXS4qfCQpfFxcey1bXFxzXFxTXSo/LVxcfSkvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdjaGFyJzoge1xuXHRcdHBhdHRlcm46IC8nKD86W15cXFxcJ118XFxcXCg/OlthYmZucnR2XFxcXFwiJyZdfFxcXltBLVpAW1xcXV5fXXxBQ0t8QkVMfEJTfENBTnxDUnxEQzF8REMyfERDM3xEQzR8REVMfERMRXxFTXxFTlF8RU9UfEVTQ3xFVEJ8RVRYfEZGfEZTfEdTfEhUfExGfE5BS3xOVUx8UlN8U0l8U098U09IfFNQfFNUWHxTVUJ8U1lOfFVTfFZUfFxcZCt8b1swLTddK3x4WzAtOWEtZkEtRl0rKSknLyxcblx0XHRhbGlhczogJ3N0cmluZydcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlxcXFxcIl18XFxcXCg/OlxcU3xcXHMrXFxcXCkpKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86Y2FzZXxjbGFzc3xkYXRhfGRlcml2aW5nfGRvfGVsc2V8aWZ8aW58aW5maXhsfGluZml4cnxpbnN0YW5jZXxsZXR8bW9kdWxlfG5ld3R5cGV8b2Z8cHJpbWl0aXZlfHRoZW58dHlwZXx3aGVyZSlcXGIvLFxuXHQnaW1wb3J0LXN0YXRlbWVudCc6IHtcblx0XHQvLyBUaGUgaW1wb3J0ZWQgb3IgaGlkZGVuIG5hbWVzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhpcyBpbXBvcnRcblx0XHQvLyBzdGF0ZW1lbnQuIFRoaXMgaXMgYmVjYXVzZSB3ZSB3YW50IHRvIGhpZ2hsaWdodCB0aG9zZSBleGFjdGx5IGxpa2Vcblx0XHQvLyB3ZSBkbyBmb3IgdGhlIG5hbWVzIGluIHRoZSBwcm9ncmFtLlxuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopaW1wb3J0XFxzKyg/OnF1YWxpZmllZFxccyspPyg/OltBLVpdW1xcdyddKikoPzpcXC5bQS1aXVtcXHcnXSopKig/Olxccythc1xccysoPzpbQS1aXVtcXHcnXSopKD86XFwuW0EtWl1bXFx3J10qKSopPyg/OlxccytoaWRpbmdcXGIpPy9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IC9cXGIoPzphc3xoaWRpbmd8aW1wb3J0fHF1YWxpZmllZClcXGIvLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHR9XG5cdH0sXG5cdC8vIFRoZXNlIGFyZSBidWlsdGluIHZhcmlhYmxlcyBvbmx5LiBDb25zdHJ1Y3RvcnMgYXJlIGhpZ2hsaWdodGVkIGxhdGVyIGFzIGEgY29uc3RhbnQuXG5cdCdidWlsdGluJzogL1xcYig/OmFic3xhY29zfGFjb3NofGFsbHxhbmR8YW55fGFwcGVuZEZpbGV8YXBwcm94UmF0aW9uYWx8YXNUeXBlT2Z8YXNpbnxhc2luaHxhdGFufGF0YW4yfGF0YW5ofGJhc2ljSU9SdW58YnJlYWt8Y2F0Y2h8Y2VpbGluZ3xjaHJ8Y29tcGFyZXxjb25jYXR8Y29uY2F0TWFwfGNvbnN0fGNvc3xjb3NofGN1cnJ5fGN5Y2xlfGRlY29kZUZsb2F0fGRlbm9taW5hdG9yfGRpZ2l0VG9JbnR8ZGl2fGRpdk1vZHxkcm9wfGRyb3BXaGlsZXxlaXRoZXJ8ZWxlbXxlbmNvZGVGbG9hdHxlbnVtRnJvbXxlbnVtRnJvbVRoZW58ZW51bUZyb21UaGVuVG98ZW51bUZyb21Ub3xlcnJvcnxldmVufGV4cHxleHBvbmVudHxmYWlsfGZpbHRlcnxmbGlwfGZsb2F0RGlnaXRzfGZsb2F0UmFkaXh8ZmxvYXRSYW5nZXxmbG9vcnxmbWFwfGZvbGRsfGZvbGRsMXxmb2xkcnxmb2xkcjF8ZnJvbURvdWJsZXxmcm9tRW51bXxmcm9tSW50fGZyb21JbnRlZ2VyfGZyb21JbnRlZ3JhbHxmcm9tUmF0aW9uYWx8ZnN0fGdjZHxnZXRDaGFyfGdldENvbnRlbnRzfGdldExpbmV8Z3JvdXB8aGVhZHxpZHxpblJhbmdlfGluZGV4fGluaXR8aW50VG9EaWdpdHxpbnRlcmFjdHxpb0Vycm9yfGlzQWxwaGF8aXNBbHBoYU51bXxpc0FzY2lpfGlzQ29udHJvbHxpc0Rlbm9ybWFsaXplZHxpc0RpZ2l0fGlzSGV4RGlnaXR8aXNJRUVFfGlzSW5maW5pdGV8aXNMb3dlcnxpc05hTnxpc05lZ2F0aXZlWmVyb3xpc09jdERpZ2l0fGlzUHJpbnR8aXNTcGFjZXxpc1VwcGVyfGl0ZXJhdGV8bGFzdHxsY218bGVuZ3RofGxleHxsZXhEaWdpdHN8bGV4TGl0Q2hhcnxsaW5lc3xsb2d8bG9nQmFzZXxsb29rdXB8bWFwfG1hcE18bWFwTV98bWF4fG1heEJvdW5kfG1heGltdW18bWF5YmV8bWlufG1pbkJvdW5kfG1pbmltdW18bW9kfG5lZ2F0ZXxub3R8bm90RWxlbXxudWxsfG51bWVyYXRvcnxvZGR8b3J8b3JkfG90aGVyd2lzZXxwYWNrfHBpfHByZWR8cHJpbUV4aXRXaXRofHByaW50fHByb2R1Y3R8cHJvcGVyRnJhY3Rpb258cHV0Q2hhcnxwdXRTdHJ8cHV0U3RyTG58cXVvdHxxdW90UmVtfHJhbmdlfHJhbmdlU2l6ZXxyZWFkfHJlYWREZWN8cmVhZEZpbGV8cmVhZEZsb2F0fHJlYWRIZXh8cmVhZElPfHJlYWRJbnR8cmVhZExpc3R8cmVhZExpdENoYXJ8cmVhZExufHJlYWRPY3R8cmVhZFBhcmVufHJlYWRTaWduZWR8cmVhZHN8cmVhZHNQcmVjfHJlYWxUb0ZyYWN8cmVjaXB8cmVtfHJlcGVhdHxyZXBsaWNhdGV8cmV0dXJufHJldmVyc2V8cm91bmR8c2NhbGVGbG9hdHxzY2FubHxzY2FubDF8c2NhbnJ8c2NhbnIxfHNlcXxzZXF1ZW5jZXxzZXF1ZW5jZV98c2hvd3xzaG93Q2hhcnxzaG93SW50fHNob3dMaXN0fHNob3dMaXRDaGFyfHNob3dQYXJlbnxzaG93U2lnbmVkfHNob3dTdHJpbmd8c2hvd3N8c2hvd3NQcmVjfHNpZ25pZmljYW5kfHNpZ251bXxzaW58c2luaHxzbmR8c29ydHxzcGFufHNwbGl0QXR8c3FydHxzdWJ0cmFjdHxzdWNjfHN1bXx0YWlsfHRha2V8dGFrZVdoaWxlfHRhbnx0YW5ofHRocmVhZFRvSU9SZXN1bHR8dG9FbnVtfHRvSW50fHRvSW50ZWdlcnx0b0xvd2VyfHRvUmF0aW9uYWx8dG9VcHBlcnx0cnVuY2F0ZXx1bmN1cnJ5fHVuZGVmaW5lZHx1bmxpbmVzfHVudGlsfHVud29yZHN8dW56aXB8dW56aXAzfHVzZXJFcnJvcnx3b3Jkc3x3cml0ZUZpbGV8emlwfHppcDN8emlwV2l0aHx6aXBXaXRoMylcXGIvLFxuXHQvLyBkZWNpbWFsIGludGVnZXJzIGFuZCBmbG9hdGluZyBwb2ludCBudW1iZXJzIHwgb2N0YWwgaW50ZWdlcnMgfCBoZXhhZGVjaW1hbCBpbnRlZ2Vyc1xuXHQnbnVtYmVyJzogL1xcYig/OlxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT98MG9bMC03XSt8MHhbMC05YS1mXSspXFxiL2ksXG5cdCdvcGVyYXRvcic6IFtcblx0XHR7XG5cdFx0XHQvLyBpbmZpeCBvcGVyYXRvclxuXHRcdFx0cGF0dGVybjogL2AoPzpbQS1aXVtcXHcnXSpcXC4pKltfYS16XVtcXHcnXSpgLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gZnVuY3Rpb24gY29tcG9zaXRpb25cblx0XHRcdHBhdHRlcm46IC8oXFxzKVxcLig/PVxccykvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly8gTW9zdCBvZiB0aGlzIGlzIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBtZWFuaW5nIG9mIGEgc2luZ2xlICcuJy5cblx0XHQvLyBJZiBpdCBzdGFuZHMgYWxvbmUgZnJlZWx5LCBpdCBpcyB0aGUgZnVuY3Rpb24gY29tcG9zaXRpb24uXG5cdFx0Ly8gSXQgbWF5IGFsc28gYmUgYSBzZXBhcmF0b3IgYmV0d2VlbiBhIG1vZHVsZSBuYW1lIGFuZCBhbiBpZGVudGlmaWVyID0+IG5vXG5cdFx0Ly8gb3BlcmF0b3IuIElmIGl0IGNvbWVzIHRvZ2V0aGVyIHdpdGggb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIGl0IGlzIGFuXG5cdFx0Ly8gb3BlcmF0b3IgdG9vLlxuXHRcdC8vXG5cdFx0Ly8gVGhpcyByZWdleCBtZWFuczogL1stISMkJSorPT8mQHx+Ljo8Pl5cXFxcXFwvXSsvIHdpdGhvdXQgL1xcLi8uXG5cdFx0L1stISMkJSorPT8mQHx+Ojw+XlxcXFxcXC9dWy0hIyQlKis9PyZAfH4uOjw+XlxcXFxcXC9dKnxcXC5bLSEjJCUqKz0/JkB8fi46PD5eXFxcXFxcL10rLyxcblx0XSxcblx0Ly8gSW4gSGFza2VsbCwgbmVhcmx5IGV2ZXJ5dGhpbmcgaXMgYSB2YXJpYWJsZSwgZG8gbm90IGhpZ2hsaWdodCB0aGVzZS5cblx0J2h2YXJpYWJsZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86W0EtWl1bXFx3J10qXFwuKSpbX2Etel1bXFx3J10qLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0fVxuXHR9LFxuXHQnY29uc3RhbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OltBLVpdW1xcdyddKlxcLikqW0EtWl1bXFx3J10qLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0fVxuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuaHMgPSBQcmlzbS5sYW5ndWFnZXMuaGFza2VsbDtcblxuUHJpc20ubGFuZ3VhZ2VzLmhheGUgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J3N0cmluZyc6IHtcblx0XHQvLyBTdHJpbmdzIGNhbiBiZSBtdWx0aS1saW5lXG5cdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxdfFxcXFxbXFxzXFxTXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmFic3RyYWN0fGNsYXNzfGVudW18ZXh0ZW5kc3xpbXBsZW1lbnRzfGludGVyZmFjZXxuZXd8dHlwZWRlZilcXHMrKVtBLVpfXVxcdyovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHR9LFxuXHRcdC8vIGJhc2VkIG9uIG5hbWluZyBjb252ZW50aW9uXG5cdFx0L1xcYltBLVpdXFx3Ki9cblx0XSxcblx0Ly8gVGhlIGZpbmFsIGxvb2stYWhlYWQgcHJldmVudHMgaGlnaGxpZ2h0aW5nIG9mIGtleXdvcmRzIGlmIGV4cHJlc3Npb25zIHN1Y2ggYXMgXCJoYXhlLm1hY3JvLkV4cHJcIlxuXHQna2V5d29yZCc6IC9cXGJ0aGlzXFxifFxcYig/OmFic3RyYWN0fGFzfGJyZWFrfGNhc2V8Y2FzdHxjYXRjaHxjbGFzc3xjb250aW51ZXxkZWZhdWx0fGRvfGR5bmFtaWN8ZWxzZXxlbnVtfGV4dGVuZHN8ZXh0ZXJufGZpbmFsfGZvcnxmcm9tfGZ1bmN0aW9ufGlmfGltcGxlbWVudHN8aW1wb3J0fGlufGlubGluZXxpbnRlcmZhY2V8bWFjcm98bmV3fG51bGx8b3BlcmF0b3J8b3ZlcmxvYWR8b3ZlcnJpZGV8cGFja2FnZXxwcml2YXRlfHB1YmxpY3xyZXR1cm58c3RhdGljfHN1cGVyfHN3aXRjaHx0aHJvd3x0b3x0cnl8dHlwZWRlZnx1bnR5cGVkfHVzaW5nfHZhcnx3aGlsZSkoPyFcXC4pXFxiLyxcblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqKD89XFxzKig/OjxbXjw+XSo+XFxzKik/XFwoKS9pLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnb3BlcmF0b3InOiAvXFwuezN9fFxcK1xcK3wtLXwmJnxcXHxcXHx8LT58PT58KD86PDw/fD57MSwzfXxbLSsqLyUhPSZ8Xl0pPT98Wz86fl0vXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaGF4ZScsICdzdHJpbmcnLCB7XG5cdCdzdHJpbmctaW50ZXJwb2xhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvJyg/OlteJ1xcXFxdfFxcXFxbXFxzXFxTXSkqJy8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcJCg/Olxcdyt8XFx7W157fV0rXFx9KS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL15cXCRcXHs/fFxcfSQvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5oYXhlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdH1cblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2hheGUnLCAnY2xhc3MtbmFtZScsIHtcblx0J3JlZ2V4Jzoge1xuXHRcdHBhdHRlcm46IC9+XFwvKD86W15cXC9cXFxcXFxyXFxuXXxcXFxcLikrXFwvW2Etel0qLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncmVnZXgtZmxhZ3MnOiAvXFxiW2Etel0rJC8sXG5cdFx0XHQncmVnZXgtc291cmNlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXih+XFwvKVtcXHNcXFNdKyg/PVxcLyQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1yZWdleCcsXG5cdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnJlZ2V4XG5cdFx0XHR9LFxuXHRcdFx0J3JlZ2V4LWRlbGltaXRlcic6IC9eflxcL3xcXC8kLyxcblx0XHR9XG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdoYXhlJywgJ2tleXdvcmQnLCB7XG5cdCdwcmVwcm9jZXNzb3InOiB7XG5cdFx0cGF0dGVybjogLyMoPzplbHNlfGVsc2VpZnxlbmR8aWYpXFxiLiovLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCdtZXRhZGF0YSc6IHtcblx0XHRwYXR0ZXJuOiAvQDo/W1xcdy5dKy8sXG5cdFx0YWxpYXM6ICdzeW1ib2wnXG5cdH0sXG5cdCdyZWlmaWNhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvXFwkKD86XFx3K3woPz1cXHspKS8sXG5cdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaGNsID0ge1xuXHQnY29tbWVudCc6IC8oPzpcXC9cXC98IykuKnxcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0J2hlcmVkb2MnOiB7XG5cdFx0cGF0dGVybjogLzw8LT8oXFx3K1xcYilbXFxzXFxTXSo/XlsgXFx0XSpcXDEvbSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnXG5cdH0sXG5cdCdrZXl3b3JkJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oPzpkYXRhfHJlc291cmNlKVxccysoPzpcIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwiKSg/PVxccytcIltcXHctXStcIlxccytcXHspL2ksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3R5cGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhyZXNvdXJjZXxkYXRhfFxccyspKD86XCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcIikvaSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oPzpiYWNrZW5kfG1vZHVsZXxvdXRwdXR8cHJvdmlkZXJ8cHJvdmlzaW9uZXJ8dmFyaWFibGUpXFxzKyg/OltcXHctXSt8XCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcIilcXHMrKD89XFx7KS9pLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd0eXBlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oYmFja2VuZHxtb2R1bGV8b3V0cHV0fHByb3ZpZGVyfHByb3Zpc2lvbmVyfHZhcmlhYmxlKVxccysoPzpbXFx3LV0rfFwiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCIpXFxzKy9pLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0L1tcXHctXSsoPz1cXHMrXFx7KS9cblx0XSxcblx0J3Byb3BlcnR5JzogW1xuXHRcdC9bLVxcd1xcLl0rKD89XFxzKj0oPyE9KSkvLFxuXHRcdC9cIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pK1wiKD89XFxzKls6PV0pLyxcblx0XSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlxcXFwkXCJdfFxcXFxbXFxzXFxTXXxcXCQoPzooPz1cIil8XFwkKyg/IVxcJCl8W15cIiR7XSl8XFwkXFx7KD86W157fVwiXXxcIig/OlteXFxcXFwiXXxcXFxcW1xcc1xcU10pKlwiKSpcXH0pKlwiLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteJF0pXFwkXFx7KD86W157fVwiXXxcIig/OlteXFxcXFwiXXxcXFxcW1xcc1xcU10pKlwiKSpcXH0vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQndHlwZSc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXFxiKD86Y291bnR8ZGF0YXxsb2NhbHxtb2R1bGV8cGF0aHxzZWxmfHRlcnJhZm9ybXx2YXIpXFxiXFwuKVtcXHdcXCpdKy9pLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQna2V5d29yZCc6IC9cXGIoPzpjb3VudHxkYXRhfGxvY2FsfG1vZHVsZXxwYXRofHNlbGZ8dGVycmFmb3JtfHZhcilcXGIvaSxcblx0XHRcdFx0XHQnZnVuY3Rpb24nOiAvXFx3Kyg/PVxcKCkvLFxuXHRcdFx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcIi8sXG5cdFx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnbnVtYmVyJzogL1xcYjB4W1xcZGEtZl0rXFxifFxcYlxcZCsoPzpcXC5cXGQqKT8oPzplWystXT9cXGQrKT8vaSxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWyFcXCQjJSYnKCkqKywuXFwvOzw9PkBcXFtcXFxcXFxdXmB7fH1+PzpdLyxcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHR9XG5cdH0sXG5cdCdudW1iZXInOiAvXFxiMHhbXFxkYS1mXStcXGJ8XFxiXFxkKyg/OlxcLlxcZCopPyg/OmVbKy1dP1xcZCspPy9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvWz1cXFtcXF17fV0vLFxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmhsc2wgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjJywge1xuXG5cdC8vIFJlZ2FyZGluZyBrZXl3b3JkcyBhbmQgY2xhc3MgbmFtZXM6XG5cdC8vIFRoZSBsaXN0IG9mIGFsbCBrZXl3b3JkcyB3YXMgc3BsaXQgaW50byAna2V5d29yZCcgYW5kICdjbGFzcy1uYW1lJyB0b2tlbnMgYmFzZWQgb24gd2hldGhlciB0aGV5IGFyZSBjYXBpdGFsaXplZC5cblx0Ly8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG93cy93aW4zMi9kaXJlY3QzZGhsc2wvZHgtZ3JhcGhpY3MtaGxzbC1hcHBlbmRpeC1rZXl3b3Jkc1xuXHQvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dzL3dpbjMyL2RpcmVjdDNkaGxzbC9keC1ncmFwaGljcy1obHNsLWFwcGVuZGl4LXJlc2VydmVkLXdvcmRzXG5cdCdjbGFzcy1uYW1lJzogW1xuXHRcdFByaXNtLmxhbmd1YWdlcy5jWydjbGFzcy1uYW1lJ10sXG5cdFx0L1xcYig/OkFwcGVuZFN0cnVjdHVyZWRCdWZmZXJ8QmxlbmRTdGF0ZXxCdWZmZXJ8Qnl0ZUFkZHJlc3NCdWZmZXJ8Q29tcGlsZVNoYWRlcnxDb21wdXRlU2hhZGVyfENvbnN1bWVTdHJ1Y3R1cmVkQnVmZmVyfERlcHRoU3RlbmNpbFN0YXRlfERlcHRoU3RlbmNpbFZpZXd8RG9tYWluU2hhZGVyfEdlb21ldHJ5U2hhZGVyfEh1bGxzaGFkZXJ8SW5wdXRQYXRjaHxMaW5lU3RyZWFtfE91dHB1dFBhdGNofFBpeGVsU2hhZGVyfFBvaW50U3RyZWFtfFJXQnVmZmVyfFJXQnl0ZUFkZHJlc3NCdWZmZXJ8UldTdHJ1Y3R1cmVkQnVmZmVyfFJXVGV4dHVyZSg/OjFEfDFEQXJyYXl8MkR8MkRBcnJheXwzRCl8UmFzdGVyaXplclN0YXRlfFJlbmRlclRhcmdldFZpZXd8U2FtcGxlckNvbXBhcmlzb25TdGF0ZXxTYW1wbGVyU3RhdGV8U3RydWN0dXJlZEJ1ZmZlcnxUZXh0dXJlKD86MUR8MURBcnJheXwyRHwyREFycmF5fDJETVN8MkRNU0FycmF5fDNEfEN1YmV8Q3ViZUFycmF5KXxUcmlhbmdsZVN0cmVhbXxWZXJ0ZXhTaGFkZXIpXFxiL1xuXHRdLFxuXHQna2V5d29yZCc6IFtcblx0XHQvLyBITFNMIGtleXdvcmRcblx0XHQvXFxiKD86YXNtfGFzbV9mcmFnbWVudHxhdXRvfGJyZWFrfGNhc2V8Y2F0Y2h8Y2J1ZmZlcnxjZW50cm9pZHxjaGFyfGNsYXNzfGNvbHVtbl9tYWpvcnxjb21waWxlfGNvbXBpbGVfZnJhZ21lbnR8Y29uc3R8Y29uc3RfY2FzdHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkaXNjYXJkfGRvfGR5bmFtaWNfY2FzdHxlbHNlfGVudW18ZXhwbGljaXR8ZXhwb3J0fGV4dGVybnxmb3J8ZnJpZW5kfGZ4Z3JvdXB8Z290b3xncm91cHNoYXJlZHxpZnxpbnxpbmxpbmV8aW5vdXR8aW50ZXJmYWNlfGxpbmV8bGluZWFkanxsaW5lYXJ8bG9uZ3xtYXRyaXh8bXV0YWJsZXxuYW1lc3BhY2V8bmV3fG5vaW50ZXJwb2xhdGlvbnxub3BlcnNwZWN0aXZlfG9wZXJhdG9yfG91dHxwYWNrb2Zmc2V0fHBhc3N8cGl4ZWxmcmFnbWVudHxwb2ludHxwcmVjaXNlfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZWdpc3RlcnxyZWludGVycHJldF9jYXN0fHJldHVybnxyb3dfbWFqb3J8c2FtcGxlfHNhbXBsZXJ8c2hhcmVkfHNob3J0fHNpZ25lZHxzaXplb2Z8c25vcm18c3RhdGVibG9ja3xzdGF0ZWJsb2NrX3N0YXRlfHN0YXRpY3xzdGF0aWNfY2FzdHxzdHJpbmd8c3RydWN0fHN3aXRjaHx0YnVmZmVyfHRlY2huaXF1ZXx0ZWNobmlxdWUxMHx0ZWNobmlxdWUxMXx0ZW1wbGF0ZXx0ZXh0dXJlfHRoaXN8dGhyb3d8dHJpYW5nbGV8dHJpYW5nbGVhZGp8dHJ5fHR5cGVkZWZ8dHlwZW5hbWV8dW5pZm9ybXx1bmlvbnx1bm9ybXx1bnNpZ25lZHx1c2luZ3x2ZWN0b3J8dmVydGV4ZnJhZ21lbnR8dmlydHVhbHx2b2lkfHZvbGF0aWxlfHdoaWxlKVxcYi8sXG5cdFx0Ly8gc2NhbGFyLCB2ZWN0b3IsIGFuZCBtYXRyaXggdHlwZXNcblx0XHQvXFxiKD86Ym9vbHxkb3VibGV8ZHdvcmR8ZmxvYXR8aGFsZnxpbnR8bWluKD86MTBmbG9hdHwxMmludHwxNig/OmZsb2F0fGludHx1aW50KSl8dWludCkoPzpbMS00XSg/OnhbMS00XSk/KT9cXGIvXG5cdF0sXG5cdC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3dpbmRvd3Mvd2luMzIvZGlyZWN0M2RobHNsL2R4LWdyYXBoaWNzLWhsc2wtYXBwZW5kaXgtZ3JhbW1hciNmbG9hdGluZy1wb2ludC1udW1iZXJzXG5cdCdudW1iZXInOiAvKD86KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OltlRV1bKy1dP1xcZCspP3xcXGIweFtcXGRhLWZBLUZdKylbZkZoSGxMdVVdP1xcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5ob29uID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvOjouKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiW15cIl0qXCJ8J1teJ10qJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjb25zdGFudCc6IC8lKD86XFwuW255XXxbXFx3LV0rKS8sXG5cdCdjbGFzcy1uYW1lJzogL0AoPzpbYS16MC05LV0qW2EtejAtOV0pP3xcXCovaSxcblx0J2Z1bmN0aW9uJzogLyg/OlxcK1stK10gezJ9KT8oPzpbYS16XSg/OlthLXowLTktXSpbYS16MC05XSk/KS8sXG5cdCdrZXl3b3JkJzogL1xcLltcXF5cXCtcXCo9XFw/XXwhWz48OlxcLj1cXD8hXXw9Wz58OixcXC5cXC1cXF48KzsvflxcKlxcP118XFw/Wz58OlxcLlxcLVxcXjxcXCsmfj1AIV18XFx8W1xcJF8lOlxcLlxcLVxcXn5cXCo9QFxcP118XFwrW3xcXCRcXCtcXCpdfDpbX1xcLVxcXlxcK35cXCpdfCVbXzpcXC5cXC1cXF5cXCt+XFwqPV18XFxeW3w6XFwuXFwtXFwrJn5cXCo9XFw/XXxcXCRbfF8lOjw+XFwtXFxeJn5APVxcP118O1s6PFxcKztcXC9+XFwqPV18fls+fFxcJF8lPFxcK1xcLyY9XFw/IV18LS18PT0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG5cdCAqIEByZXR1cm5zIHtSZWdFeHB9XG5cdCAqL1xuXHRmdW5jdGlvbiBoZWFkZXJWYWx1ZU9mKG5hbWUpIHtcblx0XHRyZXR1cm4gUmVnRXhwKCcoXig/OicgKyBuYW1lICsgJyk6WyBcXHRdKig/IVsgXFx0XSkpW15dKycsICdpJyk7XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXMuaHR0cCA9IHtcblx0XHQncmVxdWVzdC1saW5lJzoge1xuXHRcdFx0cGF0dGVybjogL14oPzpDT05ORUNUfERFTEVURXxHRVR8SEVBRHxPUFRJT05TfFBBVENIfFBPU1R8UFJJfFBVVHxTRUFSQ0h8VFJBQ0UpXFxzKD86aHR0cHM/OlxcL1xcL3xcXC8pXFxTKlxcc0hUVFBcXC9bXFxkLl0rL20sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0Ly8gSFRUUCBNZXRob2Rcblx0XHRcdFx0J21ldGhvZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXltBLVpdK1xcYi8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHRcdFx0fSxcblx0XHRcdFx0Ly8gUmVxdWVzdCBUYXJnZXQgZS5nLiBodHRwOi8vZXhhbXBsZS5jb20sIC9wYXRoL3RvL2ZpbGVcblx0XHRcdFx0J3JlcXVlc3QtdGFyZ2V0Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccykoPzpodHRwcz86XFwvXFwvfFxcLylcXFMqKD89XFxzKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3VybCcsXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMudXJpXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIEhUVFAgVmVyc2lvblxuXHRcdFx0XHQnaHR0cC12ZXJzaW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKFxccylIVFRQXFwvW1xcZC5dKy8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdFx0XHR9LFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3Jlc3BvbnNlLXN0YXR1cyc6IHtcblx0XHRcdHBhdHRlcm46IC9eSFRUUFxcL1tcXGQuXSsgXFxkKyAuKy9tLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdC8vIEhUVFAgVmVyc2lvblxuXHRcdFx0XHQnaHR0cC12ZXJzaW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eSFRUUFxcL1tcXGQuXSsvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFN0YXR1cyBDb2RlXG5cdFx0XHRcdCdzdGF0dXMtY29kZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMpXFxkKyg/PVxccykvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0XHRcdH0sXG5cdFx0XHRcdC8vIFJlYXNvbiBQaHJhc2Vcblx0XHRcdFx0J3JlYXNvbi1waHJhc2UnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKS4rLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnaGVhZGVyJzoge1xuXHRcdFx0cGF0dGVybjogL15bXFx3LV0rOi4rKD86KD86XFxyXFxuP3xcXG4pWyBcXHRdLispKi9tLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdoZWFkZXItdmFsdWUnOiBbXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cGF0dGVybjogaGVhZGVyVmFsdWVPZigvQ29udGVudC1TZWN1cml0eS1Qb2xpY3kvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0YWxpYXM6IFsnY3NwJywgJ2xhbmd1YWdlcy1jc3AnXSxcblx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmNzcFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cGF0dGVybjogaGVhZGVyVmFsdWVPZigvUHVibGljLUtleS1QaW5zKD86LVJlcG9ydC1Pbmx5KT8vLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0YWxpYXM6IFsnaHBrcCcsICdsYW5ndWFnZXMtaHBrcCddLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuaHBrcFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cGF0dGVybjogaGVhZGVyVmFsdWVPZigvU3RyaWN0LVRyYW5zcG9ydC1TZWN1cml0eS8uc291cmNlKSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRhbGlhczogWydoc3RzJywgJ2xhbmd1YWdlcy1oc3RzJ10sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5oc3RzXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiBoZWFkZXJWYWx1ZU9mKC9bXjpdKy8uc291cmNlKSxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdF0sXG5cdFx0XHRcdCdoZWFkZXItbmFtZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlteOl0rLyxcblx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eOi9cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0Ly8gQ3JlYXRlIGEgbWFwcGluZyBvZiBDb250ZW50LVR5cGUgaGVhZGVycyB0byBsYW5ndWFnZSBkZWZpbml0aW9uc1xuXHR2YXIgbGFuZ3MgPSBQcmlzbS5sYW5ndWFnZXM7XG5cdHZhciBodHRwTGFuZ3VhZ2VzID0ge1xuXHRcdCdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JzogbGFuZ3MuamF2YXNjcmlwdCxcblx0XHQnYXBwbGljYXRpb24vanNvbic6IGxhbmdzLmpzb24gfHwgbGFuZ3MuamF2YXNjcmlwdCxcblx0XHQnYXBwbGljYXRpb24veG1sJzogbGFuZ3MueG1sLFxuXHRcdCd0ZXh0L3htbCc6IGxhbmdzLnhtbCxcblx0XHQndGV4dC9odG1sJzogbGFuZ3MuaHRtbCxcblx0XHQndGV4dC9jc3MnOiBsYW5ncy5jc3MsXG5cdFx0J3RleHQvcGxhaW4nOiBsYW5ncy5wbGFpblxuXHR9O1xuXG5cdC8vIERlY2xhcmUgd2hpY2ggdHlwZXMgY2FuIGFsc28gYmUgc3VmZml4ZXNcblx0dmFyIHN1ZmZpeFR5cGVzID0ge1xuXHRcdCdhcHBsaWNhdGlvbi9qc29uJzogdHJ1ZSxcblx0XHQnYXBwbGljYXRpb24veG1sJzogdHJ1ZVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgcGF0dGVybiBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZSB3aGljaCBtYXRjaGVzIGl0IGFuZCBhbnkgdHlwZSB3aGljaCBoYXMgaXQgYXMgYSBzdWZmaXguXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50VHlwZVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0ZnVuY3Rpb24gZ2V0U3VmZml4UGF0dGVybihjb250ZW50VHlwZSkge1xuXHRcdHZhciBzdWZmaXggPSBjb250ZW50VHlwZS5yZXBsYWNlKC9eW2Etel0rXFwvLywgJycpO1xuXHRcdHZhciBzdWZmaXhQYXR0ZXJuID0gJ1xcXFx3Ky8oPzpbXFxcXHcuLV0rXFxcXCspKycgKyBzdWZmaXggKyAnKD8hWytcXFxcdy4tXSknO1xuXHRcdHJldHVybiAnKD86JyArIGNvbnRlbnRUeXBlICsgJ3wnICsgc3VmZml4UGF0dGVybiArICcpJztcblx0fVxuXG5cdC8vIEluc2VydCBlYWNoIGNvbnRlbnQgdHlwZSBwYXJzZXIgdGhhdCBoYXMgaXRzIGFzc29jaWF0ZWQgbGFuZ3VhZ2Vcblx0Ly8gY3VycmVudGx5IGxvYWRlZC5cblx0dmFyIG9wdGlvbnM7XG5cdGZvciAodmFyIGNvbnRlbnRUeXBlIGluIGh0dHBMYW5ndWFnZXMpIHtcblx0XHRpZiAoaHR0cExhbmd1YWdlc1tjb250ZW50VHlwZV0pIHtcblx0XHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0XHR2YXIgcGF0dGVybiA9IHN1ZmZpeFR5cGVzW2NvbnRlbnRUeXBlXSA/IGdldFN1ZmZpeFBhdHRlcm4oY29udGVudFR5cGUpIDogY29udGVudFR5cGU7XG5cdFx0XHRvcHRpb25zW2NvbnRlbnRUeXBlLnJlcGxhY2UoL1xcLy9nLCAnLScpXSA9IHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHRcdCcoJyArIC9jb250ZW50LXR5cGU6XFxzKi8uc291cmNlICsgcGF0dGVybiArIC8oPzooPzpcXHJcXG4/fFxcbilbXFx3LV0uKikqKD86XFxyKD86XFxufCg/IVxcbikpfFxcbikvLnNvdXJjZSArICcpJyArXG5cdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIGxpdHRsZSBpbnRlcmVzdGluZzpcblx0XHRcdFx0XHQvLyBUaGUgSFRUUCBmb3JtYXQgc3BlYyByZXF1aXJlZCAxIGVtcHR5IGxpbmUgYmVmb3JlIHRoZSBib2R5IHRvIG1ha2UgZXZlcnl0aGluZyB1bmFtYmlndW91cy5cblx0XHRcdFx0XHQvLyBIb3dldmVyLCB3aGVuIHdyaXRpbmcgY29kZSBieSBoYW5kIChlLmcuIHRvIGRpc3BsYXkgb24gYSB3ZWJzaXRlKSBwZW9wbGUgY2FuIGZvcmdldCBhYm91dCB0aGlzLFxuXHRcdFx0XHRcdC8vIHNvIHdlIHdhbnQgdG8gYmUgbGliZXJhbCBoZXJlLiBXZSB3aWxsIGFsbG93IHRoZSBlbXB0eSBsaW5lIHRvIGJlIG9taXR0ZWQgaWYgdGhlIGZpcnN0IGxpbmUgb2Zcblx0XHRcdFx0XHQvLyB0aGUgYm9keSBkb2VzIG5vdCBzdGFydCB3aXRoIGEgW1xcdy1dIGNoYXJhY3RlciAoYXMgaGVhZGVycyBkbykuXG5cdFx0XHRcdFx0L1teIFxcdFxcdy1dW1xcc1xcU10qLy5zb3VyY2UsXG5cdFx0XHRcdFx0J2knXG5cdFx0XHRcdCksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogaHR0cExhbmd1YWdlc1tjb250ZW50VHlwZV1cblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cdGlmIChvcHRpb25zKSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaHR0cCcsICdoZWFkZXInLCBvcHRpb25zKTtcblx0fVxuXG59KFByaXNtKSk7XG5cbi8qKlxuICogT3JpZ2luYWwgYnkgU2NvdHQgSGVsbWUuXG4gKlxuICogUmVmZXJlbmNlOiBodHRwczovL3Njb3R0aGVsbWUuY28udWsvaHBrcC1jaGVhdC1zaGVldC9cbiAqL1xuXG5QcmlzbS5sYW5ndWFnZXMuaHBrcCA9IHtcblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86aW5jbHVkZVN1YkRvbWFpbnN8bWF4LWFnZXxwaW4tc2hhMjU2fHByZWxvYWR8cmVwb3J0LXRvfHJlcG9ydC11cml8c3RyaWN0KSg/PVtcXHM7PV18JCkvaSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQnb3BlcmF0b3InOiAvPS8sXG5cdCdwdW5jdHVhdGlvbic6IC87L1xufTtcblxuLyoqXG4gKiBPcmlnaW5hbCBieSBTY290dCBIZWxtZS5cbiAqXG4gKiBSZWZlcmVuY2U6IGh0dHBzOi8vc2NvdHRoZWxtZS5jby51ay9oc3RzLWNoZWF0LXNoZWV0L1xuICovXG5cblByaXNtLmxhbmd1YWdlcy5oc3RzID0ge1xuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzppbmNsdWRlU3ViRG9tYWluc3xtYXgtYWdlfHByZWxvYWQpKD89W1xcczs9XXwkKS9pLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCdvcGVyYXRvcic6IC89Lyxcblx0J3B1bmN0dWF0aW9uJzogLzsvXG59O1xuXG4vLyBhY2NvcmRpbmcgdG8gdGhlIG9mZmljYWwgcmVmZXJlbmNlIChFTilcbi8vIGh0dHBzOi8vaWNoaWdvamFtLm5ldC9JY2hpZ29KYW0tZW4uaHRtbFxuUHJpc20ubGFuZ3VhZ2VzLmljaGlnb2phbSA9IHtcblx0J2NvbW1lbnQnOiAvKD86XFxCJ3xSRU0pKD86W15cXG5cXHJdKikvaSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcIlwifFshIyQlJicoKSosXFwvOjs8PT4/XlxcdyArXFwtLl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J251bWJlcic6IC9cXEIjWzAtOUEtRl0rfFxcQmBbMDFdK3woPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86RVsrLV0/XFxkKyk/L2ksXG5cdCdrZXl3b3JkJzogL1xcYig/OkJFRVB8QlBTfENBU0V8Q0xFQVJ8Q0xLfENMT3xDTFB8Q0xTfENMVHxDTFZ8Q09OVHxDT1BZfEVMU0V8RU5EfEZJTEV8RklMRVN8Rk9SfEdPU1VCfEdPVE98R1NCfElGfElOUFVUfEtCRHxMRUR8TEVUfExJU1R8TE9BRHxMT0NBVEV8TFJVTnxORVd8TkVYVHxPVVR8UExBWXxQT0tFfFBSSU5UfFBXTXxSRU18UkVOVU18UkVTRVR8UkVUVVJOfFJJR0hUfFJUTnxSVU58U0FWRXxTQ1JPTEx8U0xFRVB8U1JORHxTVEVQfFNUT1B8U1VCfFRFTVBPfFRIRU58VE98VUFSVHxWSURFT3xXQUlUKSg/OlxcJHxcXGIpL2ksXG5cdCdmdW5jdGlvbic6IC9cXGIoPzpBQlN8QU5BfEFTQ3xCSU58QlROfERFQ3xFTkR8RlJFRXxIRUxQfEhFWHxJMkNSfEkyQ1d8SU58SU5LRVl8TEVOfExJTkV8UEVFS3xSTkR8U0NSfFNPVU5EfFNUUnxUSUNLfFVTUnxWRVJ8VlBFRUt8WkVSKSg/OlxcJHxcXGIpL2ksXG5cdCdsYWJlbCc6IC8oPzpcXEJAXFxTKykvLFxuXHQnb3BlcmF0b3InOiAvPFs9Pl0/fD49P3xcXHxcXHx8JiZ8WytcXC0qXFwvPXwmXn4hXXxcXGIoPzpBTkR8Tk9UfE9SKVxcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvW1xcWyw7OigpXFxdXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5pY29uID0ge1xuXHQnY29tbWVudCc6IC8jLiovLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKD86KD8hXFwxKVteXFxcXFxcclxcbl9dfFxcXFwufF8oPyFcXDEpKD86XFxyXFxufFtcXHNcXFNdKSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J251bWJlcic6IC9cXGIoPzpcXGQrclthLXpcXGRdK3xcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/KVxcYnxcXC5cXGQrXFxiL2ksXG5cdCdidWlsdGluLWtleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogLyYoPzphbGxvY2F0ZWR8YXNjaWl8Y2xvY2t8Y29sbGVjdGlvbnN8Y3NldHxjdXJyZW50fGRhdGV8ZGF0ZWxpbmV8ZGlnaXRzfGR1bXB8ZXxlcnJvcig/Om51bWJlcnx0ZXh0fHZhbHVlKT98ZXJyb3V0fGZhaWx8ZmVhdHVyZXN8ZmlsZXxob3N0fGlucHV0fGxjYXNlfGxldHRlcnN8bGV2ZWx8bGluZXxtYWlufG51bGx8b3V0cHV0fHBoaXxwaXxwb3N8cHJvZ25hbWV8cmFuZG9tfHJlZ2lvbnN8c291cmNlfHN0b3JhZ2V8c3ViamVjdHx0aW1lfHRyYWNlfHVjYXNlfHZlcnNpb24pXFxiLyxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC9cXCRcXHcrLyxcblx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmJyZWFrfGJ5fGNhc2V8Y3JlYXRlfGRlZmF1bHR8ZG98ZWxzZXxlbmR8ZXZlcnl8ZmFpbHxnbG9iYWx8aWZ8aW5pdGlhbHxpbnZvY2FibGV8bGlua3xsb2NhbHxuZXh0fG5vdHxvZnxwcm9jZWR1cmV8cmVjb3JkfHJlcGVhdHxyZXR1cm58c3RhdGljfHN1c3BlbmR8dGhlbnx0b3x1bnRpbHx3aGlsZSlcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiKD8hXFxkKVxcdysoPz1cXHMqWyh7XXxcXHMqIVxccypcXFspLyxcblx0J29wZXJhdG9yJzogL1srLV06KD8hPSl8KD86W1xcLz9AXiUmXXxcXCtcXCs/fC0tP3w9PT89P3x+PT0/PT98XFwqXFwqP3xcXHxcXHxcXHw/fDwoPzotPj98PD89Pyl8Pj4/PT8pKD86Oj0pP3w6KD86PTo/KT98WyEuXFxcXHx+XS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdKCl7fSw7XS9cbn07XG5cbi8vIGh0dHBzOi8vdW5pY29kZS1vcmcuZ2l0aHViLmlvL2ljdS91c2VyZ3VpZGUvZm9ybWF0X3BhcnNlL21lc3NhZ2VzL1xuLy8gaHR0cHM6Ly91bmljb2RlLW9yZy5naXRodWIuaW8vaWN1LWRvY3MvYXBpZG9jL3JlbGVhc2VkL2ljdTRqL2NvbS9pYm0vaWN1L3RleHQvTWVzc2FnZUZvcm1hdC5odG1sXG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuXHQgKiBAcGFyYW0ge251bWJlcn0gbGV2ZWxcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGZ1bmN0aW9uIG5lc3RlZChzb3VyY2UsIGxldmVsKSB7XG5cdFx0aWYgKGxldmVsIDw9IDApIHtcblx0XHRcdHJldHVybiAvW10vLnNvdXJjZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHNvdXJjZS5yZXBsYWNlKC88U0VMRj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmVzdGVkKHNvdXJjZSwgbGV2ZWwgLSAxKTsgfSk7XG5cdFx0fVxuXHR9XG5cblx0dmFyIHN0cmluZ1BhdHRlcm4gPSAvJ1t7fTo9LF0oPzpbXiddfCcnKSonKD8hJykvO1xuXG5cdHZhciBlc2NhcGUgPSB7XG5cdFx0cGF0dGVybjogLycnLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fTtcblx0dmFyIHN0cmluZyA9IHtcblx0XHRwYXR0ZXJuOiBzdHJpbmdQYXR0ZXJuLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdlc2NhcGUnOiBlc2NhcGVcblx0XHR9XG5cdH07XG5cblx0dmFyIGFyZ3VtZW50U291cmNlID0gbmVzdGVkKFxuXHRcdC9cXHsoPzpbXnt9J118Jyg/IVt7fSwnXSl8Jyd8PFNUUj58PFNFTEY+KSpcXH0vLnNvdXJjZVxuXHRcdFx0LnJlcGxhY2UoLzxTVFI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0cmluZ1BhdHRlcm4uc291cmNlOyB9KSxcblx0XHQ4XG5cdCk7XG5cblx0dmFyIG5lc3RlZE1lc3NhZ2UgPSB7XG5cdFx0cGF0dGVybjogUmVnRXhwKGFyZ3VtZW50U291cmNlKSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdtZXNzYWdlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihcXHspW1xcc1xcU10rKD89XFx9JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9LFxuXHRcdFx0J21lc3NhZ2UtZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvLi8sXG5cdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlc1snaWN1LW1lc3NhZ2UtZm9ybWF0J10gPSB7XG5cdFx0J2FyZ3VtZW50Jzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKGFyZ3VtZW50U291cmNlKSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29udGVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHspW1xcc1xcU10rKD89XFx9JCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnYXJndW1lbnQtbmFtZSc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKilbXnt9Oj0sXFxzXSsvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J2Nob2ljZS1zdHlsZSc6IHtcblx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly91bmljb2RlLW9yZy5naXRodWIuaW8vaWN1LWRvY3MvYXBpZG9jL3JlbGVhc2VkL2ljdTRjL2NsYXNzaWN1XzFfMUNob2ljZUZvcm1hdC5odG1sI2RldGFpbHNcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKixcXHMqY2hvaWNlXFxzKixcXHMqKVxcUyg/OltcXHNcXFNdKlxcUyk/Lyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcfC8sXG5cdFx0XHRcdFx0XHRcdFx0J3JhbmdlJzoge1xuXHRcdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKilbKy1dPyg/OlxcZCsoPzpcXC5cXGQqKT98XFx1MjIxZSlcXHMqWzwjXFx1MjI2NF0vLFxuXHRcdFx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHQnb3BlcmF0b3InOiAvWzwjXFx1MjI2NF0vLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQnbnVtYmVyJzogL1xcUysvXG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0XHRyZXN0OiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3BsdXJhbC1zdHlsZSc6IHtcblx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly91bmljb2RlLW9yZy5naXRodWIuaW8vaWN1LWRvY3MvYXBpZG9jL3JlbGVhc2VkL2ljdTRqL2NvbS9pYm0vaWN1L3RleHQvUGx1cmFsRm9ybWF0Lmh0bWwjOn46dGV4dD1QYXR0ZXJucyUyMGFuZCUyMFRoZWlyJTIwSW50ZXJwcmV0YXRpb25cblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL14oXFxzKixcXHMqKD86cGx1cmFsfHNlbGVjdG9yZGluYWwpXFxzKixcXHMqKVxcUyg/OltcXHNcXFNdKlxcUyk/Lyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdFx0J29mZnNldCc6IC9eb2Zmc2V0OlxccypcXGQrLyxcblx0XHRcdFx0XHRcdFx0XHQnbmVzdGVkLW1lc3NhZ2UnOiBuZXN0ZWRNZXNzYWdlLFxuXHRcdFx0XHRcdFx0XHRcdCdzZWxlY3Rvcic6IHtcblx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC89XFxkK3xbXnt9Oj0sXFxzXSsvLFxuXHRcdFx0XHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdrZXl3b3JkJzogL14oPzpmZXd8bWFueXxvbmV8b3RoZXJ8dHdvfHplcm8pJC9cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnc2VsZWN0LXN0eWxlJzoge1xuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3VuaWNvZGUtb3JnLmdpdGh1Yi5pby9pY3UtZG9jcy9hcGlkb2MvcmVsZWFzZWQvaWN1NGovY29tL2libS9pY3UvdGV4dC9TZWxlY3RGb3JtYXQuaHRtbCM6fjp0ZXh0PVBhdHRlcm5zJTIwYW5kJTIwVGhlaXIlMjBJbnRlcnByZXRhdGlvblxuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqLFxccypzZWxlY3RcXHMqLFxccyopXFxTKD86W1xcc1xcU10qXFxTKT8vLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0XHQnbmVzdGVkLW1lc3NhZ2UnOiBuZXN0ZWRNZXNzYWdlLFxuXHRcdFx0XHRcdFx0XHRcdCdzZWxlY3Rvcic6IHtcblx0XHRcdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXnt9Oj0sXFxzXSsvLFxuXHRcdFx0XHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCdrZXl3b3JkJzogL15vdGhlciQvXG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J2tleXdvcmQnOiAvXFxiKD86Y2hvaWNlfHBsdXJhbHxzZWxlY3R8c2VsZWN0b3JkaW5hbClcXGIvLFxuXHRcdFx0XHRcdFx0J2FyZy10eXBlJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86ZGF0ZXxkdXJhdGlvbnxudW1iZXJ8b3JkaW5hbHxzcGVsbG91dHx0aW1lKVxcYi8sXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnYXJnLXNrZWxldG9uJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKCxcXHMqKTo6W157fTo9LFxcc10rLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdhcmctc3R5bGUnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oLFxccyopKD86Y3VycmVuY3l8ZnVsbHxpbnRlZ2VyfGxvbmd8bWVkaXVtfHBlcmNlbnR8c2hvcnQpKD89XFxzKiQpLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdhcmctc3R5bGUtdGV4dCc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXlxccyosXFxzKig/PVxcUykpLy5zb3VyY2UgKyBuZXN0ZWQoLyg/Oltee30nXXwnW14nXSonfFxceyg/OjxTRUxGPik/XFx9KSsvLnNvdXJjZSwgOCkgKyAnJCcpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvLC9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdhcmd1bWVudC1kZWxpbWl0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLy4vLFxuXHRcdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdlc2NhcGUnOiBlc2NhcGUsXG5cdFx0J3N0cmluZyc6IHN0cmluZ1xuXHR9O1xuXG5cdG5lc3RlZE1lc3NhZ2UuaW5zaWRlLm1lc3NhZ2UuaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzWydpY3UtbWVzc2FnZS1mb3JtYXQnXTtcblx0UHJpc20ubGFuZ3VhZ2VzWydpY3UtbWVzc2FnZS1mb3JtYXQnXS5hcmd1bWVudC5pbnNpZGUuY29udGVudC5pbnNpZGVbJ2Nob2ljZS1zdHlsZSddLmluc2lkZS5yZXN0ID0gUHJpc20ubGFuZ3VhZ2VzWydpY3UtbWVzc2FnZS1mb3JtYXQnXTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuaWRyaXMgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdoYXNrZWxsJywge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKD86KD86LS18XFx8XFx8XFx8KS4qJHxcXHstW1xcc1xcU10qPy1cXH0pL20sXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OlR5cGV8Y2FzZXxjbGFzc3xjb2RhdGF8Y29uc3RydWN0b3J8Y29yZWNvcmR8ZGF0YXxkb3xkc2x8ZWxzZXxleHBvcnR8aWZ8aW1wbGVtZW50YXRpb258aW1wbGljaXR8aW1wb3J0fGltcG9zc2libGV8aW58aW5maXh8aW5maXhsfGluZml4cnxpbnN0YW5jZXxpbnRlcmZhY2V8bGV0fG1vZHVsZXxtdXR1YWx8bmFtZXNwYWNlfG9mfHBhcmFtZXRlcnN8cGFydGlhbHxwb3N0dWxhdGV8cHJpdmF0ZXxwcm9vZnxwdWJsaWN8cXVvdGVHb2FsfHJlY29yZHxyZXdyaXRlfHN5bnRheHx0aGVufHRvdGFsfHVzaW5nfHdoZXJlfHdpdGgpXFxiLyxcblx0J2J1aWx0aW4nOiB1bmRlZmluZWRcbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdpZHJpcycsICdrZXl3b3JkJywge1xuXHQnaW1wb3J0LXN0YXRlbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5cXHMqaW1wb3J0XFxzKykoPzpbQS1aXVtcXHcnXSopKD86XFwuW0EtWl1bXFx3J10qKSovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHR9XG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaWRyID0gUHJpc20ubGFuZ3VhZ2VzLmlkcmlzO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5pZ25vcmUgPSB7XG5cdFx0Ly8gaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdGlnbm9yZVxuXHRcdCdjb21tZW50JzogL14jLiovbSxcblx0XHQnZW50cnknOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxTKD86LiooPzooPzpcXFxcICl8XFxTKSk/Lyxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnb3BlcmF0b3InOiAvXiF8XFwqXFwqP3xcXD8vLFxuXHRcdFx0XHQncmVnZXgnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFxbW15cXFtcXF1dKlxcXS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwvL1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuZ2l0aWdub3JlID0gUHJpc20ubGFuZ3VhZ2VzLmlnbm9yZTtcblx0UHJpc20ubGFuZ3VhZ2VzLmhnaWdub3JlID0gUHJpc20ubGFuZ3VhZ2VzLmlnbm9yZTtcblx0UHJpc20ubGFuZ3VhZ2VzLm5wbWlnbm9yZSA9IFByaXNtLmxhbmd1YWdlcy5pZ25vcmU7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluZm9ybTcgPSB7XG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiW15cIl0qXCIvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3N1YnN0aXR1dGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcW1teXFxbXFxdXStcXF0vLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1xcW3xcXF0vLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Ly8gU2VlIHJlc3QgYmVsb3dcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcW1teXFxbXFxdXStcXF0vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndGl0bGUnOiB7XG5cdFx0cGF0dGVybjogL15bIFxcdF0qKD86Ym9va3xjaGFwdGVyfHBhcnQoPyEgb2YpfHNlY3Rpb258dGFibGV8dm9sdW1lKVxcYi4rL2ltLFxuXHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHR9LFxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi1dKSg/OlxcYlxcZCsoPzpcXC5cXGQrKT8oPzpcXF5cXGQrKT8oPzooPyFcXGQpXFx3Kyk/fFxcYig/OmVpZ2h0fGVsZXZlbnxmaXZlfGZvdXJ8bmluZXxvbmV8c2V2ZW58c2l4fHRlbnx0aHJlZXx0d2VsdmV8dHdvKSlcXGIoPyEtKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3ZlcmInOiB7XG5cdFx0cGF0dGVybjogLyhefFteLV0pXFxiKD86YW5zd2VyaW5nfGFwcGx5aW5nIHRvfGFyZXxhc2tpbmd8YXR0YWNraW5nfGJlKD86aW5nKT98YnVybmluZ3xidXlpbmd8Y2FsbGVkfGNhcnJpZXN8Y2FycnkoPyEgb3V0KXxjYXJyeWluZ3xjbGltYmluZ3xjbG9zaW5nfGNvbmNlYWwoPzppbmd8cyk/fGNvbnN1bHRpbmd8Y29udGFpbig/OmluZ3xzKT98Y3V0dGluZ3xkcmlua2luZ3xkcm9wcGluZ3xlYXRpbmd8ZW5jbG9zKD86ZXM/fGluZyl8ZW50ZXJpbmd8ZXhhbWluaW5nfGV4aXRpbmd8Z2V0dGluZ3xnaXZpbmd8Z29pbmd8aGEoPzpzfHZlfHZpbmcpfGhvbGQoPzppbmd8cyk/fGltcGwoPzppZXN8eSl8aW5jb3Jwb3JhdCg/OmVzP3xpbmcpfGluc2VydGluZ3xpc3xqdW1waW5nfGtpc3Npbmd8bGlzdGVuaW5nfGxvY2tpbmd8bG9va2luZ3xtZWFuKD86aW5nfHMpP3xvcGVuaW5nfHByb3ZpZCg/OmVzP3xpbmcpfHB1bGxpbmd8cHVzaGluZ3xwdXR0aW5nfHJlbGF0KD86ZXM/fGluZyl8cmVtb3Zpbmd8c2VhcmNoaW5nfHNlZSg/OmluZ3xzKT98c2V0dGluZ3xzaG93aW5nfHNpbmdpbmd8c2xlZXBpbmd8c21lbGxpbmd8c3F1ZWV6aW5nfHN1cHBvcnQoPzppbmd8cyk/fHN3ZWFyaW5nfHN3aXRjaGluZ3x0YWtpbmd8dGFzdGluZ3x0ZWxsaW5nfHRoaW5raW5nfHRocm93aW5nfHRvdWNoaW5nfHR1cm5pbmd8dHlpbmd8dW5sb2NrKD86aW5nfHMpP3x2YXIoPzppZXN8eXx5aW5nKXx3YWl0aW5nfHdha2luZ3x3YXZpbmd8d2Vhcig/OmluZ3xzKT8pXFxiKD8hLSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH0sXG5cdCdrZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi1dKVxcYig/OmFmdGVyfGJlZm9yZXxjYXJyeSBvdXR8Y2hlY2t8Y29udGludWUgdGhlIGFjdGlvbnxkZWZpbml0aW9uKD89ICo6KXxkbyBub3RoaW5nfGVsc2V8ZW5kICg/OmlmfHRoZSBzdG9yeXx1bmxlc3MpfGV2ZXJ5IHR1cm58aWZ8aW5jbHVkZXxpbnN0ZWFkKD86IG9mKT98bGV0fG1vdmV8bm98bm93fG90aGVyd2lzZXxyZXBlYXR8cmVwb3J0fHJlc3VtZSB0aGUgc3Rvcnl8cnVsZSBmb3J8cnVubmluZyB0aHJvdWdofHNheSg/OmluZyk/fHN0b3AgdGhlIGFjdGlvbnx0ZXN0fHRyeSg/OmluZyk/fHVuZGVyc3RhbmR8dW5sZXNzfHVzZXx3aGVufHdoaWxlfHllcylcXGIoPyEtKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3Byb3BlcnR5Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi1dKVxcYig/OmFkamFjZW50KD8hIHRvKXxjYXJyaWVkfGNsb3NlZHxjb25jZWFsZWR8Y29udGFpbmVkfGRhcmt8ZGVzY3JpYmVkfGVkaWJsZXxlbXB0eXxlbmNsb3NlZHxlbnRlcmFibGV8ZXZlbnxmZW1hbGV8Zml4ZWQgaW4gcGxhY2V8ZnVsbHxoYW5kbGVkfGhlbGR8aW1wcm9wZXItbmFtZWR8aW5jb3Jwb3JhdGVkfGluZWRpYmxlfGludmlzaWJsZXxsaWdodGVkfGxpdHxsb2NrKD86YWJsZXxlZCl8bWFsZXxtYXJrZWQgZm9yIGxpc3Rpbmd8bWVudGlvbmVkfG5lZ2F0aXZlfG5ldXRlcnxub24tKD86ZW1wdHl8ZnVsbHxyZWN1cnJpbmcpfG9kZHxvcGFxdWV8b3Blbig/OmFibGUpP3xwbHVyYWwtbmFtZWR8cG9ydGFibGV8cG9zaXRpdmV8cHJpdmF0ZWx5LW5hbWVkfHByb3Blci1uYW1lZHxwcm92aWRlZHxwdWJsaWNhbGx5LW5hbWVkfHB1c2hhYmxlIGJldHdlZW4gcm9vbXN8cmVjdXJyaW5nfHJlbGF0ZWR8cnViYmluZ3xzY2VuZXJ5fHNlZW58c2luZ3VsYXItbmFtZWR8c3VwcG9ydGVkfHN3aW5naW5nfHN3aXRjaCg/OmFibGV8ZWQoPzogb2ZmfCBvbik/KXx0b3VjaCg/OmFibGV8ZWQpfHRyYW5zcGFyZW50fHVuY29uY2VhbGVkfHVuZGVzY3JpYmVkfHVubGl0fHVubG9ja2VkfHVubWFya2VkIGZvciBsaXN0aW5nfHVubWVudGlvbmVkfHVub3BlbmFibGV8dW50b3VjaGFibGV8dW52aXNpdGVkfHZhcmlhYmxlfHZpc2libGV8dmlzaXRlZHx3ZWFyYWJsZXx3b3JuKVxcYig/IS0pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3N5bWJvbCdcblx0fSxcblx0J3Bvc2l0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi1dKVxcYig/OmFib3ZlfGFkamFjZW50IHRvfGJhY2sgc2lkZSBvZnxiZWxvd3xiZXR3ZWVufGRvd258ZWFzdHxldmVyeXdoZXJlfGZyb250IHNpZGV8aGVyZXxpbnxpbnNpZGUoPzogZnJvbSk/fG5vcnRoKD86ZWFzdHx3ZXN0KT98bm93aGVyZXxvbig/OiB0b3Agb2YpP3xvdGhlciBzaWRlfG91dHNpZGUoPzogZnJvbSk/fHBhcnRzPyBvZnxyZWdpb25hbGx5IGlufHNvdXRoKD86ZWFzdHx3ZXN0KT98dGhyb3VnaHx1cHx3ZXN0fHdpdGhpbilcXGIoPyEtKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQndHlwZSc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14tXSlcXGIoPzphY3Rpb25zP3xhY3Rpdml0KD86aWVzfHkpfGFjdG9ycz98YW5pbWFscz98YmFja2Ryb3BzP3xjb250YWluZXJzP3xkZXZpY2VzP3xkaXJlY3Rpb25zP3xkb29ycz98aG9sZGVycz98a2luZHM/fGxpc3RzP3xtW2FlXW58bm9ib2R5fG5vdGhpbmd8bm91bnM/fG51bWJlcnM/fG9iamVjdHM/fHBlb3BsZXxwZXJzb25zP3xwbGF5ZXIoPzoncyBob2xkYWxsKT98cmVnaW9ucz98cmVsYXRpb25zP3xyb29tcz98cnVsZSg/OmJvb2spP3M/fHNjZW5lcz98c29tZW9uZXxzb21ldGhpbmd8c3VwcG9ydGVycz98dGFibGVzP3x0ZXh0cz98dGhpbmdzP3x0aW1lfHZlaGljbGVzP3x3b21bYWVdbilcXGIoPyEtKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1suLDo7KCl7fV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5mb3JtN1snc3RyaW5nJ10uaW5zaWRlWydzdWJzdGl0dXRpb24nXS5pbnNpZGUucmVzdCA9IFByaXNtLmxhbmd1YWdlcy5pbmZvcm03O1xuLy8gV2UgZG9uJ3Qgd2FudCB0aGUgcmVtYWluaW5nIHRleHQgaW4gdGhlIHN1YnN0aXR1dGlvbiB0byBiZSBoaWdobGlnaHRlZCBhcyB0aGUgc3RyaW5nLlxuUHJpc20ubGFuZ3VhZ2VzLmluZm9ybTdbJ3N0cmluZyddLmluc2lkZVsnc3Vic3RpdHV0aW9uJ10uaW5zaWRlLnJlc3QudGV4dCA9IHtcblx0cGF0dGVybjogL1xcUyg/OlxccypcXFMpKi8sXG5cdGFsaWFzOiAnY29tbWVudCdcbn07XG5cblByaXNtLmxhbmd1YWdlcy5pbmkgPSB7XG5cblx0LyoqXG5cdCAqIFRoZSBjb21wb25lbnQgbWltaWNzIHRoZSBiZWhhdmlvciBvZiB0aGUgV2luMzIgQVBJIHBhcnNlci5cblx0ICpcblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL1ByaXNtSlMvcHJpc20vaXNzdWVzLzI3NzUjaXNzdWVjb21tZW50LTc4NzQ3NzcyM31cblx0ICovXG5cblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXGZcXHRcXHZdKilbIztdW15cXG5cXHJdKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J3NlY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXGZcXHRcXHZdKilcXFtbXlxcblxcclxcXV0qXFxdPy9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnc2VjdGlvbi1uYW1lJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF5cXFtbIFxcZlxcdFxcdl0qKVteIFxcZlxcdFxcdlxcXV0rKD86WyBcXGZcXHRcXHZdK1teIFxcZlxcdFxcdlxcXV0rKSovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3NlbGVjdG9yJ1xuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFt8XFxdL1xuXHRcdH1cblx0fSxcblx0J2tleSc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcZlxcdFxcdl0qKVteIFxcZlxcblxcclxcdFxcdj1dKyg/OlsgXFxmXFx0XFx2XStbXiBcXGZcXG5cXHJcXHRcXHY9XSspKig/PVsgXFxmXFx0XFx2XSo9KS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdhdHRyLW5hbWUnXG5cdH0sXG5cdCd2YWx1ZSc6IHtcblx0XHRwYXR0ZXJuOiAvKD1bIFxcZlxcdFxcdl0qKVteIFxcZlxcblxcclxcdFxcdl0rKD86WyBcXGZcXHRcXHZdK1teIFxcZlxcblxcclxcdFxcdl0rKSovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdhdHRyLXZhbHVlJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpbm5lci12YWx1ZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oXCJ8JykuKyg/PVxcMSQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J3B1bmN0dWF0aW9uJzogLz0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuaW8gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OlxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCl8XFwvXFwvLip8Iy4qKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3RyaXBsZS1xdW90ZWQtc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlwiXCIoPzpcXFxcW1xcc1xcU118KD8hXCJcIlwiKVteXFxcXF0pKlwiXCJcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlxcXFwufFteXFxcXFxcclxcblwiXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphY3RpdmF0ZXxhY3RpdmVDb3JvQ291bnR8YXNTdHJpbmd8YmxvY2t8YnJlYWt8Y2FsbHxjYXRjaHxjbG9uZXxjb2xsZWN0R2FyYmFnZXxjb21waWxlU3RyaW5nfGNvbnRpbnVlfGRvfGRvRmlsZXxkb01lc3NhZ2V8ZG9TdHJpbmd8ZWxzZXxlbHNlaWZ8ZXhpdHxmb3J8Zm9yZWFjaHxmb3J3YXJkfGdldEVudmlyb25tZW50VmFyaWFibGV8Z2V0U2xvdHxoYXNTbG90fGlmfGlmRmFsc2V8aWZOaWx8aWZOaWxFdmFsfGlmVHJ1ZXxpc0FjdGl2ZXxpc05pbHxpc1Jlc3VtYWJsZXxsaXN0fG1lc3NhZ2V8bWV0aG9kfHBhcmVudHxwYXNzfHBhdXNlfHBlcmZvcm18cGVyZm9ybVdpdGhBcmdMaXN0fHByaW50fHByaW50bG58cHJvdG98cmFpc2V8cmFpc2VSZXN1bWFibGV8cmVtb3ZlU2xvdHxyZXNlbmR8cmVzdW1lfHNjaGVkdWxlclNsZWVwU2Vjb25kc3xzZWxmfHNlbmRlcnxzZXRTY2hlZHVsZXJTbGVlcFNlY29uZHN8c2V0U2xvdHxzaGFsbG93Q29weXxzbG90TmFtZXN8c3VwZXJ8c3lzdGVtfHRoZW58dGhpc0Jsb2NrfHRoaXNDb250ZXh0fHRyeXx0eXBlfHVuaXF1ZUlkfHVwZGF0ZVNsb3R8d2FpdHx3aGlsZXx3cml0ZXx5aWVsZClcXGIvLFxuXHQnYnVpbHRpbic6IC9cXGIoPzpBcnJheXxBdWRpb0RldmljZXxBdWRpb01peGVyfEJpZ051bXxCbG9ja3xCb3h8QnVmZmVyfENGdW5jdGlvbnxDR0l8Q29sb3J8Q3Vyc2VzfERCTXxETlNSZXNvbHZlcnxET0Nvbm5lY3Rpb258RE9Qcm94eXxET1NlcnZlcnxEYXRlfERpcmVjdG9yeXxEdXJhdGlvbnxEeW5MaWJ8RXJyb3J8RXhjZXB0aW9ufEZGVHxGaWxlfEZubWF0Y2h8Rm9udHxGdXR1cmV8R0x8R0xFfEdMU2Npc3NvcnxHTFV8R0xVQ3lsaW5kZXJ8R0xVUXVhZHJpY3xHTFVTcGhlcmV8R0xVVHxIb3N0fEltYWdlfEltcG9ydGVyfExpbmtMaXN0fExpc3R8TG9iYnl8TG9jYWxzfE1ENXxNUDNEZWNvZGVyfE1QM0VuY29kZXJ8TWFwfE1lc3NhZ2V8TW92aWV8Tm90aWZpY2F0aW9ufE51bWJlcnxPYmplY3R8T3BlbkdMfFBvaW50fFByb3Rvc3xSYW5kb218UmVnZXh8U0dNTHxTR01MRWxlbWVudHxTR01MUGFyc2VyfFNRTGl0ZXxTZXF1ZW5jZXxTZXJ2ZXJ8U2hvd01lc3NhZ2V8U2xlZXB5Q2F0fFNsZWVweUNhdEN1cnNvcnxTb2NrZXR8U29ja2V0TWFuYWdlcnxTb3VuZHxTb3VwfFN0b3JlfFN0cmluZ3xUcmVlfFVEUFNlbmRlcnxVUERSZWNlaXZlcnxVUkx8VXNlcnxXYXJuaW5nfFdlYWtMaW5rKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG5pbHx0cnVlKVxcYi8sXG5cdCdudW1iZXInOiAvXFxiMHhbXFxkYS1mXStcXGJ8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmUtP1xcZCspPy9pLFxuXHQnb3BlcmF0b3InOiAvWz0hKi8lK1xcLV4mfF09fD4+Pz0/fDw8Pz0/fDo/Oj89fFxcK1xcKz98LS0/fFxcKlxcKj98XFwvXFwvP3wlfFxcfFxcfD98JiY/fFxcYig/OmFuZHxub3R8b3J8cmV0dXJuKVxcYnxAQD98XFw/XFw/P3xcXC5cXC4vLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuaiA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcYk5CXFwuLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8nKD86Jyd8W14nXFxyXFxuXSkqJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/Oig/OkNSfExGfGFkdmVyYnxjb25qdW5jdGlvbnxkZWZ8ZGVmaW5lfGR5YWR8bW9uYWR8bm91bnx2ZXJiKVxcYnwoPzphc3NlcnR8YnJlYWt8Y2FzZXxjYXRjaFtkdF0/fGNvbnRpbnVlfGRvfGVsc2V8ZWxzZWlmfGVuZHxmY2FzZXxmb3J8Zm9yX1xcdyt8Z290b19cXHcrfGlmfGxhYmVsX1xcdyt8cmV0dXJufHNlbGVjdHx0aHJvd3x0cnl8d2hpbGV8d2hpbHN0KVxcLikvLFxuXHQndmVyYic6IHtcblx0XHQvLyBOZWdhdGl2ZSBsb29rLWFoZWFkIHByZXZlbnRzIGJhZCBoaWdobGlnaHRpbmdcblx0XHQvLyBvZiBeOiA7LiA9LiA9OiAhLiAhOlxuXHRcdHBhdHRlcm46IC8oPyFcXF46fDtcXC58Wz0hXVsuOl0pKD86XFx7KD86XFwufDo6Pyk/fHAoPzpcXC5cXC4/fDopfFs9IVxcXV18Wzw+KypcXC0lJHwsI11bLjpdP3xbP15dXFwuP3xbO1xcW106P3xbfn1cImldWy46XXxbQUNlRUlqTG9yXVxcLnwoPzpbX1xcL1xcXFxxc3V4XXxfP1xcZCk6KS8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnbnVtYmVyJzogL1xcYl8/KD86KD8hXFxkOilcXGQrKD86XFwuXFxkKyk/KD86KD86YWR8YXJ8W2VqcHhdKV8/XFxkKyg/OlxcLlxcZCspPykqKD86Yl8/W1xcZGEtel0rKD86XFwuW1xcZGEtel0rKT8pP3xfXFxiKD8hXFwuKSkvLFxuXHQnYWR2ZXJiJzoge1xuXHRcdHBhdHRlcm46IC9bfn1dfFtcXC9cXFxcXVxcLj98W2JmTV1cXC58dFsuOl0vLFxuXHRcdGFsaWFzOiAnYnVpbHRpbidcblx0fSxcblx0J29wZXJhdG9yJzogL1s9YV1bLjpdfF9cXC4vLFxuXHQnY29uanVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLyYoPzpcXC46P3w6KT98Wy46QF1bLjpdP3xbIURdWy46XXxbO2RIVF1cXC58YDo/fFtcXF5MU106fFwiLyxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvWygpXS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIga2V5d29yZHMgPSAvXFxiKD86YWJzdHJhY3R8YXNzZXJ0fGJvb2xlYW58YnJlYWt8Ynl0ZXxjYXNlfGNhdGNofGNoYXJ8Y2xhc3N8Y29uc3R8Y29udGludWV8ZGVmYXVsdHxkb3xkb3VibGV8ZWxzZXxlbnVtfGV4cG9ydHN8ZXh0ZW5kc3xmaW5hbHxmaW5hbGx5fGZsb2F0fGZvcnxnb3RvfGlmfGltcGxlbWVudHN8aW1wb3J0fGluc3RhbmNlb2Z8aW50fGludGVyZmFjZXxsb25nfG1vZHVsZXxuYXRpdmV8bmV3fG5vbi1zZWFsZWR8bnVsbHxvcGVufG9wZW5zfHBhY2thZ2V8cGVybWl0c3xwcml2YXRlfHByb3RlY3RlZHxwcm92aWRlc3xwdWJsaWN8cmVjb3JkKD8hXFxzKlsoKXt9W1xcXTw+PSV+LjosOz8rXFwtKi8mfF5dKXxyZXF1aXJlc3xyZXR1cm58c2VhbGVkfHNob3J0fHN0YXRpY3xzdHJpY3RmcHxzdXBlcnxzd2l0Y2h8c3luY2hyb25pemVkfHRoaXN8dGhyb3d8dGhyb3dzfHRvfHRyYW5zaWVudHx0cmFuc2l0aXZlfHRyeXx1c2VzfHZhcnx2b2lkfHZvbGF0aWxlfHdoaWxlfHdpdGh8eWllbGQpXFxiLztcblxuXHQvLyBmdWxsIHBhY2thZ2UgKG9wdGlvbmFsKSArIHBhcmVudCBjbGFzc2VzIChvcHRpb25hbClcblx0dmFyIGNsYXNzTmFtZVByZWZpeCA9IC8oPzpbYS16XVxcdypcXHMqXFwuXFxzKikqKD86W0EtWl1cXHcqXFxzKlxcLlxccyopKi8uc291cmNlO1xuXG5cdC8vIGJhc2VkIG9uIHRoZSBqYXZhIG5hbWluZyBjb252ZW50aW9uc1xuXHR2YXIgY2xhc3NOYW1lID0ge1xuXHRcdHBhdHRlcm46IFJlZ0V4cCgvKF58W15cXHcuXSkvLnNvdXJjZSArIGNsYXNzTmFtZVByZWZpeCArIC9bQS1aXSg/OltcXGRfQS1aXSpbYS16XVxcdyopP1xcYi8uc291cmNlKSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J25hbWVzcGFjZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL15bYS16XVxcdyooPzpcXHMqXFwuXFxzKlthLXpdXFx3KikqKD86XFxzKlxcLik/Lyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5qYXZhID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVwiKD86XFxcXC58W15cIlxcXFxcXHJcXG5dKSpcIi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdGNsYXNzTmFtZSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gdmFyaWFibGVzLCBwYXJhbWV0ZXJzLCBhbmQgY29uc3RydWN0b3IgcmVmZXJlbmNlc1xuXHRcdFx0XHQvLyB0aGlzIHRvIHN1cHBvcnQgY2xhc3MgbmFtZXMgKG9yIGdlbmVyaWMgcGFyYW1ldGVycykgd2hpY2ggZG8gbm90IGNvbnRhaW4gYSBsb3dlciBjYXNlIGxldHRlciAoYWxzbyB3b3JrcyBmb3IgbWV0aG9kcylcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXnxbXlxcdy5dKS8uc291cmNlICsgY2xhc3NOYW1lUHJlZml4ICsgL1tBLVpdXFx3Kig/PVxccytcXHcrXFxzKls7LD0oKV18XFxzKig/OlxcW1tcXHMsXSpcXF1cXHMqKT86OlxccypuZXdcXGIpLy5zb3VyY2UpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGNsYXNzTmFtZS5pbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGNsYXNzIG5hbWVzIGJhc2VkIG9uIGtleXdvcmRcblx0XHRcdFx0Ly8gdGhpcyB0byBzdXBwb3J0IGNsYXNzIG5hbWVzIChvciBnZW5lcmljIHBhcmFtZXRlcnMpIHdoaWNoIGRvIG5vdCBjb250YWluIGEgbG93ZXIgY2FzZSBsZXR0ZXIgKGFsc28gd29ya3MgZm9yIG1ldGhvZHMpXG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFxcYig/OmNsYXNzfGVudW18ZXh0ZW5kc3xpbXBsZW1lbnRzfGluc3RhbmNlb2Z8aW50ZXJmYWNlfG5ld3xyZWNvcmR8dGhyb3dzKVxccyspLy5zb3VyY2UgKyBjbGFzc05hbWVQcmVmaXggKyAvW0EtWl1cXHcqXFxiLy5zb3VyY2UpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IGNsYXNzTmFtZS5pbnNpZGVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0J2Z1bmN0aW9uJzogW1xuXHRcdFx0UHJpc20ubGFuZ3VhZ2VzLmNsaWtlLmZ1bmN0aW9uLFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKDo6XFxzKilbYS16X11cXHcqLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J251bWJlcic6IC9cXGIwYlswMV1bMDFfXSpMP1xcYnxcXGIweCg/OlxcLltcXGRhLWZfcCstXSt8W1xcZGEtZl9dKyg/OlxcLltcXGRhLWZfcCstXSspPylcXGJ8KD86XFxiXFxkW1xcZF9dKig/OlxcLltcXGRfXSopP3xcXEJcXC5cXGRbXFxkX10qKSg/OmVbKy1dP1xcZFtcXGRfXSopP1tkZmxdPy9pLFxuXHRcdCdvcGVyYXRvcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXi5dKSg/Ojw8PT98Pj4+Pz0/fC0+fC0tfFxcK1xcK3wmJnxcXHxcXHx8Ojp8Wz86fl18Wy0rKi8lJnxeIT08Pl09PykvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmEnLCAnc3RyaW5nJywge1xuXHRcdCd0cmlwbGUtcXVvdGVkLXN0cmluZyc6IHtcblx0XHRcdC8vIGh0dHA6Ly9vcGVuamRrLmphdmEubmV0L2plcHMvMzU1I0Rlc2NyaXB0aW9uXG5cdFx0XHRwYXR0ZXJuOiAvXCJcIlwiWyBcXHRdKltcXHJcXG5dKD86KD86XCJ8XCJcIik/KD86XFxcXC58W15cIlxcXFxdKSkqXCJcIlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdH0sXG5cdFx0J2NoYXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJyg/OlxcXFwufFteJ1xcXFxcXHJcXG5dKXsxLDZ9Jy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmEnLCAnY2xhc3MtbmFtZScsIHtcblx0XHQnYW5ub3RhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXi5dKUBcXHcrKD86XFxzKlxcLlxccypcXHcrKSovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQnZ2VuZXJpY3MnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvPCg/OltcXHdcXHMsLj9dfCYoPyEmKXw8KD86W1xcd1xccywuP118Jig/ISYpfDwoPzpbXFx3XFxzLC4/XXwmKD8hJil8PCg/OltcXHdcXHMsLj9dfCYoPyEmKSkqPikqPikqPikqPi8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NsYXNzLW5hbWUnOiBjbGFzc05hbWUsXG5cdFx0XHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bPD4oKSwuOl0vLFxuXHRcdFx0XHQnb3BlcmF0b3InOiAvWz8mfF0vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnaW1wb3J0JzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhcXGJpbXBvcnRcXHMrKS8uc291cmNlICsgY2xhc3NOYW1lUHJlZml4ICsgLyg/OltBLVpdXFx3KnxcXCopKD89XFxzKjspLy5zb3VyY2UpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnbmFtZXNwYWNlJzogY2xhc3NOYW1lLmluc2lkZS5uYW1lc3BhY2UsXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi8sXG5cdFx0XHRcdFx0J29wZXJhdG9yJzogL1xcKi8sXG5cdFx0XHRcdFx0J2NsYXNzLW5hbWUnOiAvXFx3Ky9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXFxiaW1wb3J0XFxzK3N0YXRpY1xccyspLy5zb3VyY2UgKyBjbGFzc05hbWVQcmVmaXggKyAvKD86XFx3K3xcXCopKD89XFxzKjspLy5zb3VyY2UpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3N0YXRpYycsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCduYW1lc3BhY2UnOiBjbGFzc05hbWUuaW5zaWRlLm5hbWVzcGFjZSxcblx0XHRcdFx0XHQnc3RhdGljJzogL1xcYlxcdyskLyxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuLyxcblx0XHRcdFx0XHQnb3BlcmF0b3InOiAvXFwqLyxcblx0XHRcdFx0XHQnY2xhc3MtbmFtZSc6IC9cXHcrL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnbmFtZXNwYWNlJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHQvKFxcYig/OmV4cG9ydHN8aW1wb3J0KD86XFxzK3N0YXRpYyk/fG1vZHVsZXxvcGVufG9wZW5zfHBhY2thZ2V8cHJvdmlkZXN8cmVxdWlyZXN8dG98dHJhbnNpdGl2ZXx1c2VzfHdpdGgpXFxzKykoPyE8a2V5d29yZD4pW2Etel1cXHcqKD86XFwuW2Etel1cXHcqKSpcXC4/L1xuXHRcdFx0XHRcdC5zb3VyY2UucmVwbGFjZSgvPGtleXdvcmQ+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGtleXdvcmRzLnNvdXJjZTsgfSkpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuLyxcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufShQcmlzbSkpO1xuXG4vKipcbiAqIE9yaWdpbmFsIGJ5IEFhcm9uIEhhcnVuOiBodHRwOi8vYWFoYWNyZWF0aXZlLmNvbS8yMDEyLzA3LzMxL3BocC1zeW50YXgtaGlnaGxpZ2h0aW5nLXByaXNtL1xuICogTW9kaWZpZWQgYnkgTWlsZXMgSm9obnNvbjogaHR0cDovL21pbGVzai5tZVxuICogUmV3cml0dGVuIGJ5IFRvbSBQYXZlbGVjXG4gKlxuICogU3VwcG9ydHMgUEhQIDUuMyAtIDguMFxuICovXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdHZhciBjb21tZW50ID0gL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98XFwvXFwvLip8Iyg/IVxcWykuKi87XG5cdHZhciBjb25zdGFudCA9IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvaSxcblx0XHRcdGFsaWFzOiAnYm9vbGVhbidcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oOjpcXHMqKVxcYlthLXpfXVxcdypcXGIoPyFcXHMqXFwoKS9pLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86Y2FzZXxjb25zdClcXHMrKVxcYlthLXpfXVxcdyooPz1cXHMqWzs9XSkvaSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0fSxcblx0XHQvXFxiKD86bnVsbClcXGIvaSxcblx0XHQvXFxiW0EtWl9dW0EtWjAtOV9dKlxcYig/IVxccypcXCgpLyxcblx0XTtcblx0dmFyIG51bWJlciA9IC9cXGIwYlswMV0rKD86X1swMV0rKSpcXGJ8XFxiMG9bMC03XSsoPzpfWzAtN10rKSpcXGJ8XFxiMHhbXFxkYS1mXSsoPzpfW1xcZGEtZl0rKSpcXGJ8KD86XFxiXFxkKyg/Ol9cXGQrKSpcXC4/KD86XFxkKyg/Ol9cXGQrKSopP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspPy9pO1xuXHR2YXIgb3BlcmF0b3IgPSAvPD89PnxcXD9cXD89P3xcXC57M318XFw/Py0+fFshPV09Pz0/fDo6fFxcKlxcKj0/fC0tfFxcK1xcK3wmJnxcXHxcXHx8PDx8Pj58Wz9+XXxbL158JSomPD4uKy1dPT8vO1xuXHR2YXIgcHVuY3R1YXRpb24gPSAvW3t9XFxbXFxdKCksOjtdLztcblxuXHRQcmlzbS5sYW5ndWFnZXMucGhwID0ge1xuXHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFw/PiR8XjxcXD8oPzpwaHAoPz1cXHMpfD0pPy9pLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0fSxcblx0XHQnY29tbWVudCc6IGNvbW1lbnQsXG5cdFx0J3ZhcmlhYmxlJzogL1xcJCsoPzpcXHcrXFxifCg/PVxceykpLyxcblx0XHQncGFja2FnZSc6IHtcblx0XHRcdHBhdHRlcm46IC8obmFtZXNwYWNlXFxzK3x1c2VcXHMrKD86ZnVuY3Rpb25cXHMrKT8pKD86XFxcXD9cXGJbYS16X11cXHcqKStcXGIoPyFcXFxcKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxcXC9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjbGFzcy1uYW1lLWRlZmluaXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmNsYXNzfGVudW18aW50ZXJmYWNlfHRyYWl0KVxccyspXFxiW2Etel9dXFx3Kig/IVxcXFwpXFxiL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uLWRlZmluaXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYmZ1bmN0aW9uXFxzKylbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFwoXFxzKilcXGIoPzphcnJheXxib29sfGJvb2xlYW58ZmxvYXR8aW50fGludGVnZXJ8b2JqZWN0fHN0cmluZylcXGIoPz1cXHMqXFwpKS9pLFxuXHRcdFx0XHRhbGlhczogJ3R5cGUtY2FzdGluZycsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhbKCw/XVxccyopXFxiKD86YXJyYXkoPyFcXHMqXFwoKXxib29sfGNhbGxhYmxlfCg/OmZhbHNlfG51bGwpKD89XFxzKlxcfCl8ZmxvYXR8aW50fGl0ZXJhYmxlfG1peGVkfG9iamVjdHxzZWxmfHN0YXRpY3xzdHJpbmcpXFxiKD89XFxzKlxcJCkvaSxcblx0XHRcdFx0YWxpYXM6ICd0eXBlLWhpbnQnLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFwpXFxzKjpcXHMqKD86XFw/XFxzKik/KVxcYig/OmFycmF5KD8hXFxzKlxcKCl8Ym9vbHxjYWxsYWJsZXwoPzpmYWxzZXxudWxsKSg/PVxccypcXHwpfGZsb2F0fGludHxpdGVyYWJsZXxtaXhlZHxuZXZlcnxvYmplY3R8c2VsZnxzdGF0aWN8c3RyaW5nfHZvaWQpXFxiL2ksXG5cdFx0XHRcdGFsaWFzOiAncmV0dXJuLXR5cGUnLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXGIoPzphcnJheSg/IVxccypcXCgpfGJvb2x8ZmxvYXR8aW50fGl0ZXJhYmxlfG1peGVkfG9iamVjdHxzdHJpbmd8dm9pZClcXGIvaSxcblx0XHRcdFx0YWxpYXM6ICd0eXBlLWRlY2xhcmF0aW9uJyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcfFxccyopKD86ZmFsc2V8bnVsbClcXGJ8XFxiKD86ZmFsc2V8bnVsbCkoPz1cXHMqXFx8KS9pLFxuXHRcdFx0XHRhbGlhczogJ3R5cGUtZGVjbGFyYXRpb24nLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXGIoPzpwYXJlbnR8c2VsZnxzdGF0aWMpKD89XFxzKjo6KS9pLFxuXHRcdFx0XHRhbGlhczogJ3N0YXRpYy1jb250ZXh0Jyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyB5aWVsZCBmcm9tXG5cdFx0XHRcdHBhdHRlcm46IC8oXFxieWllbGRcXHMrKWZyb21cXGIvaSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdC8vIGBjbGFzc2AgaXMgYWx3YXlzIGEga2V5d29yZCB1bmxpa2Ugb3RoZXIga2V5d29yZHNcblx0XHRcdC9cXGJjbGFzc1xcYi9pLFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBodHRwczovL3d3dy5waHAubmV0L21hbnVhbC9lbi9yZXNlcnZlZC5rZXl3b3Jkcy5waHBcblx0XHRcdFx0Ly9cblx0XHRcdFx0Ly8ga2V5d29yZHMgY2Fubm90IGJlIHByZWNlZGVkIGJ5IFwiLT5cIlxuXHRcdFx0XHQvLyB0aGUgY29tcGxleCBsb29rYmVoaW5kIG1lYW5zIGAoPzwhKD86LT58OjopXFxzKilgXG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxccz46XXwoPzpefFteLV0pPnwoPzpefFteOl0pOilcXHMqKVxcYig/OmFic3RyYWN0fGFuZHxhcnJheXxhc3xicmVha3xjYWxsYWJsZXxjYXNlfGNhdGNofGNsb25lfGNvbnN0fGNvbnRpbnVlfGRlY2xhcmV8ZGVmYXVsdHxkaWV8ZG98ZWNob3xlbHNlfGVsc2VpZnxlbXB0eXxlbmRkZWNsYXJlfGVuZGZvcnxlbmRmb3JlYWNofGVuZGlmfGVuZHN3aXRjaHxlbmR3aGlsZXxlbnVtfGV2YWx8ZXhpdHxleHRlbmRzfGZpbmFsfGZpbmFsbHl8Zm58Zm9yfGZvcmVhY2h8ZnVuY3Rpb258Z2xvYmFsfGdvdG98aWZ8aW1wbGVtZW50c3xpbmNsdWRlfGluY2x1ZGVfb25jZXxpbnN0YW5jZW9mfGluc3RlYWRvZnxpbnRlcmZhY2V8aXNzZXR8bGlzdHxtYXRjaHxuYW1lc3BhY2V8bmV2ZXJ8bmV3fG9yfHBhcmVudHxwcmludHxwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmVhZG9ubHl8cmVxdWlyZXxyZXF1aXJlX29uY2V8cmV0dXJufHNlbGZ8c3RhdGljfHN3aXRjaHx0aHJvd3x0cmFpdHx0cnl8dW5zZXR8dXNlfHZhcnx3aGlsZXx4b3J8eWllbGR8X19oYWx0X2NvbXBpbGVyKVxcYi9pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnYXJndW1lbnQtbmFtZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oWygsXVxccyopXFxiW2Etel9dXFx3Kig/PVxccyo6KD8hOikpL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXGIoPzpleHRlbmRzfGltcGxlbWVudHN8aW5zdGFuY2VvZnxuZXcoPyFcXHMrc2VsZnxcXHMrc3RhdGljKSlcXHMrfFxcYmNhdGNoXFxzKlxcKClcXGJbYS16X11cXHcqKD8hXFxcXClcXGIvaSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcfFxccyopXFxiW2Etel9dXFx3Kig/IVxcXFwpXFxiL2ksXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdyooPyFcXFxcKVxcYig/PVxccypcXHwpL2ksXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXHxcXHMqKSg/OlxcXFw/XFxiW2Etel9dXFx3KikrXFxiL2ksXG5cdFx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZS1mdWxseS1xdWFsaWZpZWQnLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFxcL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKD86XFxcXD9cXGJbYS16X11cXHcqKStcXGIoPz1cXHMqXFx8KS9pLFxuXHRcdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUtZnVsbHktcXVhbGlmaWVkJyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxcXC9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXGIoPzpleHRlbmRzfGltcGxlbWVudHN8aW5zdGFuY2VvZnxuZXcoPyFcXHMrc2VsZlxcYnxcXHMrc3RhdGljXFxiKSlcXHMrfFxcYmNhdGNoXFxzKlxcKCkoPzpcXFxcP1xcYlthLXpfXVxcdyopK1xcYig/IVxcXFwpL2ksXG5cdFx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZS1mdWxseS1xdWFsaWZpZWQnLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFxcL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCQpL2ksXG5cdFx0XHRcdGFsaWFzOiAndHlwZS1kZWNsYXJhdGlvbicsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyg/OlxcXFw/XFxiW2Etel9dXFx3KikrKD89XFxzKlxcJCkvaSxcblx0XHRcdFx0YWxpYXM6IFsnY2xhc3MtbmFtZS1mdWxseS1xdWFsaWZpZWQnLCAndHlwZS1kZWNsYXJhdGlvbiddLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFxcL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3Kig/PVxccyo6OikvaSxcblx0XHRcdFx0YWxpYXM6ICdzdGF0aWMtY29udGV4dCcsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyg/OlxcXFw/XFxiW2Etel9dXFx3KikrKD89XFxzKjo6KS9pLFxuXHRcdFx0XHRhbGlhczogWydjbGFzcy1uYW1lLWZ1bGx5LXF1YWxpZmllZCcsICdzdGF0aWMtY29udGV4dCddLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFxcL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFsoLD9dXFxzKilbYS16X11cXHcqKD89XFxzKlxcJCkvaSxcblx0XHRcdFx0YWxpYXM6ICd0eXBlLWhpbnQnLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oWygsP11cXHMqKSg/OlxcXFw/XFxiW2Etel9dXFx3KikrKD89XFxzKlxcJCkvaSxcblx0XHRcdFx0YWxpYXM6IFsnY2xhc3MtbmFtZS1mdWxseS1xdWFsaWZpZWQnLCAndHlwZS1oaW50J10sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcXFwvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFwpXFxzKjpcXHMqKD86XFw/XFxzKik/KVxcYlthLXpfXVxcdyooPyFcXFxcKVxcYi9pLFxuXHRcdFx0XHRhbGlhczogJ3JldHVybi10eXBlJyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcKVxccyo6XFxzKig/OlxcP1xccyopPykoPzpcXFxcP1xcYlthLXpfXVxcdyopK1xcYig/IVxcXFwpL2ksXG5cdFx0XHRcdGFsaWFzOiBbJ2NsYXNzLW5hbWUtZnVsbHktcXVhbGlmaWVkJywgJ3JldHVybi10eXBlJ10sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcXFwvXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdjb25zdGFudCc6IGNvbnN0YW50LFxuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxcXHddKVxcXFw/W2Etel9dKD86W1xcd1xcXFxdKlxcdyk/KD89XFxzKlxcKCkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcXFwvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQncHJvcGVydHknOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKC0+XFxzKilcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0J29wZXJhdG9yJzogb3BlcmF0b3IsXG5cdFx0J3B1bmN0dWF0aW9uJzogcHVuY3R1YXRpb25cblx0fTtcblxuXHR2YXIgc3RyaW5nX2ludGVycG9sYXRpb24gPSB7XG5cdFx0cGF0dGVybjogL1xce1xcJCg/Olxceyg/Olxce1tee31dK1xcfXxbXnt9XSspXFx9fFtee31dKStcXH18KF58W15cXFxce10pXFwkKyg/OlxcdysoPzpcXFtbXlxcclxcblxcW1xcXV0rXFxdfC0+XFx3Kyk/KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5waHBcblx0fTtcblxuXHR2YXIgc3RyaW5nID0gW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC88PDwnKFteJ10rKSdbXFxyXFxuXSg/Oi4qW1xcclxcbl0pKj9cXDE7Lyxcblx0XHRcdGFsaWFzOiAnbm93ZG9jLXN0cmluZycsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXjw8PCdbXiddKyd8W2Etel9dXFx3KjskL2ksXG5cdFx0XHRcdFx0YWxpYXM6ICdzeW1ib2wnLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL148PDwnP3xbJztdJC9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC88PDwoPzpcIihbXlwiXSspXCJbXFxyXFxuXSg/Oi4qW1xcclxcbl0pKj9cXDE7fChbYS16X11cXHcqKVtcXHJcXG5dKD86LipbXFxyXFxuXSkqP1xcMjspL2ksXG5cdFx0XHRhbGlhczogJ2hlcmVkb2Mtc3RyaW5nJyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9ePDw8KD86XCJbXlwiXStcInxbYS16X11cXHcqKXxbYS16X11cXHcqOyQvaSxcblx0XHRcdFx0XHRhbGlhczogJ3N5bWJvbCcsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXjw8PFwiP3xbXCI7XSQvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IHN0cmluZ19pbnRlcnBvbGF0aW9uXG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvYCg/OlxcXFxbXFxzXFxTXXxbXlxcXFxgXSkqYC8sXG5cdFx0XHRhbGlhczogJ2JhY2t0aWNrLXF1b3RlZC1zdHJpbmcnLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvJyg/OlxcXFxbXFxzXFxTXXxbXlxcXFwnXSkqJy8sXG5cdFx0XHRhbGlhczogJ3NpbmdsZS1xdW90ZWQtc3RyaW5nJyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1wiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCIvLFxuXHRcdFx0YWxpYXM6ICdkb3VibGUtcXVvdGVkLXN0cmluZycsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBzdHJpbmdfaW50ZXJwb2xhdGlvblxuXHRcdFx0fVxuXHRcdH1cblx0XTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdwaHAnLCAndmFyaWFibGUnLCB7XG5cdFx0J3N0cmluZyc6IHN0cmluZyxcblx0XHQnYXR0cmlidXRlJzoge1xuXHRcdFx0cGF0dGVybjogLyNcXFsoPzpbXlwiJ1xcLyNdfFxcLyg/IVsqL10pfFxcL1xcLy4qJHwjKD8hXFxbKS4qJHxcXC9cXCooPzpbXipdfFxcKig/IVxcLykpKlxcKlxcL3xcIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwifCcoPzpcXFxcW1xcc1xcU118W15cXFxcJ10pKicpK1xcXSg/PVxccypbYS16JCNdKS9pbSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnYXR0cmlidXRlLWNvbnRlbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oI1xcWylbXFxzXFxTXSsoPz1cXF0kKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHQvLyBpbnNpZGUgY2FuIGFwcGVhciBzdWJzZXQgb2YgcGhwXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnY29tbWVudCc6IGNvbW1lbnQsXG5cdFx0XHRcdFx0XHQnc3RyaW5nJzogc3RyaW5nLFxuXHRcdFx0XHRcdFx0J2F0dHJpYnV0ZS1jbGFzcy1uYW1lJzogW1xuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyhbXjpdfF4pXFxiW2Etel9dXFx3Kig/IVxcXFwpXFxiL2ksXG5cdFx0XHRcdFx0XHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJyxcblx0XHRcdFx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyhbXjpdfF4pKD86XFxcXD9cXGJbYS16X11cXHcqKSsvaSxcblx0XHRcdFx0XHRcdFx0XHRhbGlhczogW1xuXHRcdFx0XHRcdFx0XHRcdFx0J2NsYXNzLW5hbWUnLFxuXHRcdFx0XHRcdFx0XHRcdFx0J2NsYXNzLW5hbWUtZnVsbHktcXVhbGlmaWVkJ1xuXHRcdFx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxcXC9cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0XHQnY29uc3RhbnQnOiBjb25zdGFudCxcblx0XHRcdFx0XHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0XHRcdFx0XHQnb3BlcmF0b3InOiBvcGVyYXRvcixcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IHB1bmN0dWF0aW9uXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eI1xcW3xcXF0kLyxcblx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0aWYgKCEvPFxcPy8udGVzdChlbnYuY29kZSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgcGhwUGF0dGVybiA9IC88XFw/KD86W15cIicvI118XFwvKD8hWyovXSl8KFwifCcpKD86XFxcXFtcXHNcXFNdfCg/IVxcMSlbXlxcXFxdKSpcXDF8KD86XFwvXFwvfCMoPyFcXFspKSg/OlteP1xcblxccl18XFw/KD8hPikpKig/PSR8XFw/PnxbXFxyXFxuXSl8I1xcW3xcXC9cXCooPzpbXipdfFxcKig/IVxcLykpKig/OlxcKlxcL3wkKSkqPyg/OlxcPz58JCkvZztcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10uYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAncGhwJywgcGhwUGF0dGVybik7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ3BocCcpO1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGphdmFEb2NMaWtlID0gUHJpc20ubGFuZ3VhZ2VzLmphdmFkb2NsaWtlID0ge1xuXHRcdCdwYXJhbWV0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKD86XFwvezN9fFxcKnxcXC9cXCpcXCopXFxzKkAoPzphcmd8YXJndW1lbnRzfHBhcmFtKVxccyspXFx3Ky9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHQvLyBrZXl3b3JkcyBhcmUgdGhlIGZpcnN0IHdvcmQgaW4gYSBsaW5lIHByZWNlZGVkIGJlIGFuIGBAYCBvciBzdXJyb3VuZGVkIGJ5IGN1cmx5IGJyYWNlcy5cblx0XHRcdC8vIEB3b3JkLCB7QHdvcmR9XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKD86XFwvezN9fFxcKnxcXC9cXCpcXCopXFxzKnxcXHspQFthLXpdW2EtekEtWi1dK1xcYi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t7fV0vXG5cdH07XG5cblxuXHQvKipcblx0ICogQWRkcyBkb2MgY29tbWVudCBzdXBwb3J0IHRvIHRoZSBnaXZlbiBsYW5ndWFnZSBhbmQgY2FsbHMgYSBnaXZlbiBjYWxsYmFjayBvbiBlYWNoIGRvYyBjb21tZW50IHBhdHRlcm4uXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5nIHRoZSBsYW5ndWFnZSBhZGQgZG9jIGNvbW1lbnQgc3VwcG9ydCB0by5cblx0ICogQHBhcmFtIHsocGF0dGVybjoge2luc2lkZToge3Jlc3Q6IHVuZGVmaW5lZH19KSA9PiB2b2lkfSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gY2FsbGVkIHdpdGggZWFjaCBkb2MgY29tbWVudCBwYXR0ZXJuIGFzIGFyZ3VtZW50LlxuXHQgKi9cblx0ZnVuY3Rpb24gZG9jQ29tbWVudFN1cHBvcnQobGFuZywgY2FsbGJhY2spIHtcblx0XHR2YXIgdG9rZW5OYW1lID0gJ2RvYy1jb21tZW50JztcblxuXHRcdHZhciBncmFtbWFyID0gUHJpc20ubGFuZ3VhZ2VzW2xhbmddO1xuXHRcdGlmICghZ3JhbW1hcikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR2YXIgdG9rZW4gPSBncmFtbWFyW3Rva2VuTmFtZV07XG5cblx0XHRpZiAoIXRva2VuKSB7XG5cdFx0XHQvLyBhZGQgZG9jIGNvbW1lbnQ6IC8qKiAqL1xuXHRcdFx0dmFyIGRlZmluaXRpb24gPSB7fTtcblx0XHRcdGRlZmluaXRpb25bdG9rZW5OYW1lXSA9IHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwvXFwqXFwqW14vXVtcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdFx0XHR9O1xuXG5cdFx0XHRncmFtbWFyID0gUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZShsYW5nLCAnY29tbWVudCcsIGRlZmluaXRpb24pO1xuXHRcdFx0dG9rZW4gPSBncmFtbWFyW3Rva2VuTmFtZV07XG5cdFx0fVxuXG5cdFx0aWYgKHRva2VuIGluc3RhbmNlb2YgUmVnRXhwKSB7IC8vIGNvbnZlcnQgcmVnZXggdG8gb2JqZWN0XG5cdFx0XHR0b2tlbiA9IGdyYW1tYXJbdG9rZW5OYW1lXSA9IHsgcGF0dGVybjogdG9rZW4gfTtcblx0XHR9XG5cblx0XHRpZiAoQXJyYXkuaXNBcnJheSh0b2tlbikpIHtcblx0XHRcdGZvciAodmFyIGkgPSAwLCBsID0gdG9rZW4ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdGlmICh0b2tlbltpXSBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuXHRcdFx0XHRcdHRva2VuW2ldID0geyBwYXR0ZXJuOiB0b2tlbltpXSB9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNhbGxiYWNrKHRva2VuW2ldKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y2FsbGJhY2sodG9rZW4pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGRvYy1jb21tZW50IHN1cHBvcnQgdG8gdGhlIGdpdmVuIGxhbmd1YWdlcyBmb3IgdGhlIGdpdmVuIGRvY3VtZW50YXRpb24gbGFuZ3VhZ2UuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nW118c3RyaW5nfSBsYW5ndWFnZXNcblx0ICogQHBhcmFtIHtPYmplY3R9IGRvY0xhbmd1YWdlXG5cdCAqL1xuXHRmdW5jdGlvbiBhZGRTdXBwb3J0KGxhbmd1YWdlcywgZG9jTGFuZ3VhZ2UpIHtcblx0XHRpZiAodHlwZW9mIGxhbmd1YWdlcyA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGxhbmd1YWdlcyA9IFtsYW5ndWFnZXNdO1xuXHRcdH1cblxuXHRcdGxhbmd1YWdlcy5mb3JFYWNoKGZ1bmN0aW9uIChsYW5nKSB7XG5cdFx0XHRkb2NDb21tZW50U3VwcG9ydChsYW5nLCBmdW5jdGlvbiAocGF0dGVybikge1xuXHRcdFx0XHRpZiAoIXBhdHRlcm4uaW5zaWRlKSB7XG5cdFx0XHRcdFx0cGF0dGVybi5pbnNpZGUgPSB7fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwYXR0ZXJuLmluc2lkZS5yZXN0ID0gZG9jTGFuZ3VhZ2U7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShqYXZhRG9jTGlrZSwgJ2FkZFN1cHBvcnQnLCB7IHZhbHVlOiBhZGRTdXBwb3J0IH0pO1xuXG5cdGphdmFEb2NMaWtlLmFkZFN1cHBvcnQoWydqYXZhJywgJ2phdmFzY3JpcHQnLCAncGhwJ10sIGphdmFEb2NMaWtlKTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGNvZGVMaW5lUGF0dGVybiA9IC8oXig/OltcXHQgXSooPzpcXCpcXHMqKSopKVteKlxcc10uKiQvbTtcblxuXHR2YXIgbWVtYmVyUmVmZXJlbmNlID0gLyNcXHMqXFx3Kyg/OlxccypcXChbXigpXSpcXCkpPy8uc291cmNlO1xuXHR2YXIgcmVmZXJlbmNlID0gLyg/OlxcYlthLXpBLVpdXFx3K1xccypcXC5cXHMqKSpcXGJbQS1aXVxcdyooPzpcXHMqPG1lbT4pP3w8bWVtPi8uc291cmNlLnJlcGxhY2UoLzxtZW0+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lbWJlclJlZmVyZW5jZTsgfSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmphdmFkb2MgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdqYXZhZG9jbGlrZScsIHt9KTtcblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnamF2YWRvYycsICdrZXl3b3JkJywge1xuXHRcdCdyZWZlcmVuY2UnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhAKD86ZXhjZXB0aW9ufGxpbmt8bGlua3BsYWlufHNlZXx0aHJvd3N8dmFsdWUpXFxzKyg/OlxcKlxccyopPykvLnNvdXJjZSArICcoPzonICsgcmVmZXJlbmNlICsgJyknKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oI1xccyopXFx3Kyg/PVxccypcXCgpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdmaWVsZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKCNcXHMqKVxcdysvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J25hbWVzcGFjZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86W2Etel1cXHcqXFxzKlxcLlxccyopKy8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2NsYXNzLW5hbWUnOiAvXFxiW0EtWl1cXHcqLyxcblx0XHRcdFx0J2tleXdvcmQnOiBQcmlzbS5sYW5ndWFnZXMuamF2YS5rZXl3b3JkLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWyMoKVtcXF0sLl0vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY2xhc3MtbmFtZSc6IHtcblx0XHRcdC8vIEBwYXJhbSA8VD4gdGhlIGZpcnN0IGdlbmVyaWMgdHlwZSBwYXJhbWV0ZXJcblx0XHRcdHBhdHRlcm46IC8oQHBhcmFtXFxzKyk8W0EtWl1cXHcqPi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bLjw+XS9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjb2RlLXNlY3Rpb24nOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFx7QGNvZGVcXHMrKD8hXFxzKSkoPzpbXlxcc3t9XXxcXHMrKD8hW1xcc31dKXxcXHsoPzpbXnt9XXxcXHsoPzpbXnt9XXxcXHsoPzpbXnt9XXxcXHtbXnt9XSpcXH0pKlxcfSkqXFx9KSpcXH0pKyg/PVxccypcXH0pLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2NvZGUnOiB7XG5cdFx0XHRcdFx0XHQvLyB0aGVyZSBjYW4ndCBiZSBhbnkgSFRNTCBpbnNpZGUgb2Yge0Bjb2RlfSB0YWdzXG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiBjb2RlTGluZVBhdHRlcm4sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YSxcblx0XHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtamF2YSdcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oPChjb2RlfHByZXx0dCk+KD8hPGNvZGU+KVxccyopXFxTKD86XFxTfFxccytcXFMpKj8oPz1cXHMqPFxcL1xcMj4pLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2xpbmUnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiBjb2RlTGluZVBhdHRlcm4sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGhpZ2hsaWdodCBIVE1MIHRhZ3MgYW5kIGVudGl0aWVzXG5cdFx0XHRcdFx0XHRcdCd0YWcnOiBQcmlzbS5sYW5ndWFnZXMubWFya3VwLnRhZyxcblx0XHRcdFx0XHRcdFx0J2VudGl0eSc6IFByaXNtLmxhbmd1YWdlcy5tYXJrdXAuZW50aXR5LFxuXHRcdFx0XHRcdFx0XHQnY29kZSc6IHtcblx0XHRcdFx0XHRcdFx0XHQvLyBldmVyeXRoaW5nIGVsc2UgaXMgSmF2YSBjb2RlXG5cdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogLy4rLyxcblx0XHRcdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhLFxuXHRcdFx0XHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtamF2YSdcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3RhZyc6IFByaXNtLmxhbmd1YWdlcy5tYXJrdXAudGFnLFxuXHRcdCdlbnRpdHknOiBQcmlzbS5sYW5ndWFnZXMubWFya3VwLmVudGl0eSxcblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmphdmFkb2NsaWtlLmFkZFN1cHBvcnQoJ2phdmEnLCBQcmlzbS5sYW5ndWFnZXMuamF2YWRvYyk7XG59KFByaXNtKSk7XG5cbi8vIFNwZWNpZmljYXRpb246XG4vLyBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9qYXZhL2phdmFzZS8xMy9kb2NzL2FwaS9qYXZhLmJhc2UvamF2YS9sYW5nL1Rocm93YWJsZS5odG1sI3ByaW50U3RhY2tUcmFjZSgpXG5cblByaXNtLmxhbmd1YWdlcy5qYXZhc3RhY2t0cmFjZSA9IHtcblxuXHQvLyBqYXZhLnNxbC5TUUxFeGNlcHRpb246IFZpb2xhdGlvbiBvZiB1bmlxdWUgY29uc3RyYWludCBNWV9FTlRJVFlfVUtfMTogZHVwbGljYXRlIHZhbHVlKHMpIGZvciBjb2x1bW4ocykgTVlfQ09MVU1OIGluIHN0YXRlbWVudCBbLi4uXVxuXHQvLyBDYXVzZWQgYnk6IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjogVmlvbGF0aW9uIG9mIHVuaXF1ZSBjb25zdHJhaW50IE1ZX0VOVElUWV9VS18xOiBkdXBsaWNhdGUgdmFsdWUocykgZm9yIGNvbHVtbihzKSBNWV9DT0xVTU4gaW4gc3RhdGVtZW50IFsuLi5dXG5cdC8vIENhdXNlZCBieTogY29tLmV4YW1wbGUubXlwcm9qZWN0Lk15UHJvamVjdFNlcnZsZXRFeGNlcHRpb25cblx0Ly8gQ2F1c2VkIGJ5OiBNaWRMZXZlbEV4Y2VwdGlvbjogTG93TGV2ZWxFeGNlcHRpb25cblx0Ly8gU3VwcHJlc3NlZDogUmVzb3VyY2UkQ2xvc2VGYWlsRXhjZXB0aW9uOiBSZXNvdXJjZSBJRCA9IDBcblx0J3N1bW1hcnknOiB7XG5cdFx0cGF0dGVybjogL14oW1xcdCBdKikoPzooPzpDYXVzZWQgYnk6fFN1cHByZXNzZWQ6fEV4Y2VwdGlvbiBpbiB0aHJlYWQgXCJbXlwiXSpcIilbXFx0IF0rKT9bXFx3JC5dKyg/OjouKik/JC9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oW1xcdCBdKikoPzooPzpDYXVzZWQgYnl8U3VwcHJlc3NlZCkoPz06KXxFeGNlcHRpb24gaW4gdGhyZWFkKS9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXG5cdFx0XHQvLyB0aGUgY3VycmVudCB0aHJlYWQgaWYgdGhlIHN1bW1hcnkgc3RhcnRzIHdpdGggJ0V4Y2VwdGlvbiBpbiB0aHJlYWQnXG5cdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqKVwiW15cIl0qXCIvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J2V4Y2VwdGlvbnMnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKDo/XFxzKilbXFx3JC5dKyg/PTp8JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnY2xhc3MtbmFtZSc6IC9bXFx3JF0rJC8sXG5cdFx0XHRcdFx0J25hbWVzcGFjZSc6IC9cXGJbYS16XVxcdypcXGIvLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnbWVzc2FnZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyg6XFxzKilcXFMuKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC86L1xuXHRcdH1cblx0fSxcblxuXHQvLyBhdCBvcmcubW9ydGJheS5qZXR0eS5zZXJ2bGV0LlNlcnZsZXRIYW5kbGVyJENhY2hlZENoYWluLmRvRmlsdGVyKFNlcnZsZXRIYW5kbGVyLmphdmE6MTE2Nilcblx0Ly8gYXQgb3JnLmhzcWxkYi5qZGJjLlV0aWwudGhyb3dFcnJvcihVbmtub3duIFNvdXJjZSkgaGVyZSBjb3VsZCBiZSBzb21lIG5vdGVzXG5cdC8vIGF0IGphdmEuYmFzZS9qYXZhLmxhbmcuQ2xhc3MuZm9yTmFtZTAoTmF0aXZlIE1ldGhvZClcblx0Ly8gYXQgVXRpbC48aW5pdD4oVW5rbm93biBTb3VyY2UpXG5cdC8vIGF0IGNvbS5mb28ubG9hZGVyL2Zvb0A5LjAvY29tLmZvby5NYWluLnJ1bihNYWluLmphdmE6MTAxKVxuXHQvLyBhdCBjb20uZm9vLmxvYWRlci8vY29tLmZvby5iYXIuQXBwLnJ1bihBcHAuamF2YToxMilcblx0Ly8gYXQgYWNtZUAyLjEvb3JnLmFjbWUuTGliLnRlc3QoTGliLmphdmE6ODApXG5cdC8vIGF0IE15Q2xhc3MubWFzaChNeUNsYXNzLmphdmE6OSlcblx0Ly9cblx0Ly8gTW9yZSBpbmZvcm1hdGlvbjpcblx0Ly8gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vZW4vamF2YS9qYXZhc2UvMTMvZG9jcy9hcGkvamF2YS5iYXNlL2phdmEvbGFuZy9TdGFja1RyYWNlRWxlbWVudC5odG1sI3RvU3RyaW5nKClcblx0Ly9cblx0Ly8gQSB2YWxpZCBKYXZhIG1vZHVsZSBuYW1lIGlzIGRlZmluZWQgYXM6XG5cdC8vICAgXCJBIG1vZHVsZSBuYW1lIGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIEphdmEgaWRlbnRpZmllcnMgKFx1MDBBNzMuOCkgc2VwYXJhdGVkIGJ5IFwiLlwiIHRva2Vucy5cIlxuXHQvLyBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2Uvc3BlY3MvamxzL3NlOS9odG1sL2pscy02Lmh0bWwjamxzLU1vZHVsZU5hbWVcblx0Ly9cblx0Ly8gQSBKYXZhIG1vZHVsZSB2ZXJzaW9uIGlzIGRlZmluZWQgYnkgdGhpcyBjbGFzczpcblx0Ly8gaHR0cHM6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzkvZG9jcy9hcGkvamF2YS9sYW5nL21vZHVsZS9Nb2R1bGVEZXNjcmlwdG9yLlZlcnNpb24uaHRtbFxuXHQvLyBUaGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYHBhcnNlYCBtZXRob2QgaW4gSkRLMTM6XG5cdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRjZGFjL2pkay9ibG9iLzIzMDVkZjcxZDFiNzcxMDI2NmFlMDk1NmQ3MzkyN2EyMjUxMzJjMGYvc3JjL2phdmEuYmFzZS9zaGFyZS9jbGFzc2VzL2phdmEvbGFuZy9tb2R1bGUvTW9kdWxlRGVzY3JpcHRvci5qYXZhI0wxMTA4XG5cdC8vIEhvd2V2ZXIsIHRvIGtlZXAgdGhpcyBzaW1wbGUsIGEgdmVyc2lvbiB3aWxsIGJlIG1hdGNoZWQgYnkgdGhlIHBhdHRlcm4gL0BbXFx3JC4rLV0qLy5cblx0J3N0YWNrLWZyYW1lJzoge1xuXHRcdHBhdHRlcm46IC9eKFtcXHQgXSopYXQgKD86W1xcdyQuL118QFtcXHckListXSpcXC8pKyg/Ojxpbml0Pik/XFwoW14oKV0qXFwpL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqKWF0KD89ICkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J3NvdXJjZSc6IFtcblx0XHRcdFx0Ly8gKE1haW4uamF2YToxNSlcblx0XHRcdFx0Ly8gKE1haW4uc2NhbGE6MTUpXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxcKClcXHcrXFwuXFx3KzpcXGQrKD89XFwpKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdmaWxlJzogL15cXHcrXFwuXFx3Ky8sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOi8sXG5cdFx0XHRcdFx0XHQnbGluZS1udW1iZXInOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXGJcXGQrXFxiLyxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQvLyAoVW5rbm93biBTb3VyY2UpXG5cdFx0XHRcdC8vIChOYXRpdmUgTWV0aG9kKVxuXHRcdFx0XHQvLyAoLi4uc29tZXRoaW5nLi4uKVxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhcXCgpW14oKV0qKD89XFwpKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdrZXl3b3JkJzogL14oPzpOYXRpdmUgTWV0aG9kfFVua25vd24gU291cmNlKSQvXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRdLFxuXHRcdFx0J2NsYXNzLW5hbWUnOiAvW1xcdyRdKyg/PVxcLig/Ojxpbml0PnxbXFx3JF0rKVxcKCkvLFxuXHRcdFx0J2Z1bmN0aW9uJzogLyg/Ojxpbml0PnxbXFx3JF0rKSg/PVxcKCkvLFxuXHRcdFx0J2NsYXNzLWxvYWRlcic6IHtcblx0XHRcdFx0cGF0dGVybjogLyhcXHMpW2Etel1cXHcqKD86XFwuW2Etel1cXHcqKSooPz1cXC9bXFx3QCQuXSpcXC8pLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICduYW1lc3BhY2UnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J21vZHVsZSc6IHtcblx0XHRcdFx0cGF0dGVybjogLyhbXFxzL10pW2Etel1cXHcqKD86XFwuW2Etel1cXHcqKSooPzpAW1xcdyQuKy1dKik/KD89XFwvKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCd2ZXJzaW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyhAKVtcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvW0AuXS9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCduYW1lc3BhY2UnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oPzpcXGJbYS16XVxcdypcXC4pKy8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWygpLy5dL1xuXHRcdH1cblx0fSxcblxuXHQvLyAuLi4gMzIgbW9yZVxuXHQvLyAuLi4gMzIgY29tbW9uIGZyYW1lcyBvbWl0dGVkXG5cdCdtb3JlJzoge1xuXHRcdHBhdHRlcm46IC9eKFtcXHQgXSopXFwuezN9IFxcZCsgW2Etel0rKD86IFthLXpdKykqL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC57M30vLFxuXHRcdFx0J251bWJlcic6IC9cXGQrLyxcblx0XHRcdCdrZXl3b3JkJzogL1xcYlthLXpdKyg/OiBbYS16XSspKlxcYi9cblx0XHR9XG5cdH1cblxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLmpleGwgPSB7XG5cdCdzdHJpbmcnOiAvKFtcIiddKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkqXFwxLyxcblx0J3RyYW5zZm9ybSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcfFxccyopW2EtekEtWlx1MDQzMC1cdTA0NEZcdTA0MTAtXHUwNDJGX1xcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDBGRiRdW1xcd1x1MDQzMC1cdTA0NEZcdTA0MTAtXHUwNDJGXFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMEZGJF0qLyxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdmdW5jdGlvbic6IC9bYS16QS1aXHUwNDMwLVx1MDQ0Rlx1MDQxMC1cdTA0MkZfXFx1MDBDMC1cXHUwMEQ2XFx1MDBEOC1cXHUwMEY2XFx1MDBGOC1cXHUwMEZGJF1bXFx3XHUwNDMwLVx1MDQ0Rlx1MDQxMC1cdTA0MkZcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAwRkYkXSpcXHMqKD89XFwoKS8sXG5cdCdudW1iZXInOiAvXFxiXFxkKyg/OlxcLlxcZCspP1xcYnxcXEJcXC5cXGQrXFxiLyxcblx0J29wZXJhdG9yJzogL1s8PiFdPT98LXxcXCt8JiZ8PT18XFx8XFx8P3xcXC9cXC8/fFs/OipeJV0vLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdrZXl3b3JkJzogL1xcYmluXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF0oKSwuXS8sXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuam9saWUgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcIig/OlxcXFxbXFxzXFxTXXxbXlwiXFxcXF0pKlwiLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKCg/OlxcYig/OmFzfGNvdXJpZXJ8ZW1iZWR8aW58aW5wdXRQb3J0fG91dHB1dFBvcnR8c2VydmljZSlcXGJ8QClbIFxcdF0qKVxcdysvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YXN8Y0h8Y29tcHxjb25jdXJyZW50fGNvbnN0YW50c3xjb3VyaWVyfGNzZXR8Y3NldHN8ZGVmYXVsdHxkZWZpbmV8ZWxzZXxlbWJlZHxlbWJlZGRlZHxleGVjdXRpb258ZXhpdHxleHRlbmRlcnxmb3J8Zm9yZWFjaHxmb3J3YXJkfGZyb218Z2xvYmFsfGlmfGltcG9ydHxpbnxpbmNsdWRlfGluaXR8aW5wdXRQb3J0fGluc3RhbGx8aW5zdGFuY2VvZnxpbnRlcmZhY2V8aXNfZGVmaW5lZHxsaW5rSW58bGlua091dHxtYWlufG5ld3xudWxsUHJvY2Vzc3xvdXRwdXRQb3J0fG92ZXJ8cHJpdmF0ZXxwcm92aWRlfHB1YmxpY3xzY29wZXxzZXF1ZW50aWFsfHNlcnZpY2V8c2luZ2xlfHNwYXdufHN5bmNocm9uaXplZHx0aGlzfHRocm93fHRocm93c3x0eXBlfHVuZGVmfHVudGlsfHdoaWxlfHdpdGgpXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1bIFxcdF0qW0AoXSkvaSxcblx0J251bWJlcic6IC8oPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/bD8vaSxcblx0J29wZXJhdG9yJzogLy1bLT0+XT98XFwrWys9XT98PFs8PV0/fFs+PSohXT0/fCYmfFxcfFxcfHxbP1xcLyVeQHxdLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKVtcXF17fSw7LjpdLyxcblx0J2J1aWx0aW4nOiAvXFxiKD86Qnl0ZXxhbnl8Ym9vbHxjaGFyfGRvdWJsZXxlbnVtfGZsb2F0fGludHxsZW5ndGh8bG9uZ3xyYW5nZXN8cmVnZXh8c3RyaW5nfHVuZGVmaW5lZHx2b2lkKVxcYi9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqb2xpZScsICdrZXl3b3JkJywge1xuXHQnYWdncmVnYXRlcyc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYkFnZ3JlZ2F0ZXNcXHMqOlxccyopKD86XFx3Kyg/Olxccyt3aXRoXFxzK1xcdyspP1xccyosXFxzKikqXFx3Kyg/Olxccyt3aXRoXFxzK1xcdyspPy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzogL1xcYndpdGhcXGIvLFxuXHRcdFx0J2NsYXNzLW5hbWUnOiAvXFx3Ky8sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvLC9cblx0XHR9XG5cdH0sXG5cdCdyZWRpcmVjdHMnOiB7XG5cdFx0cGF0dGVybjogLyhcXGJSZWRpcmVjdHNcXHMqOlxccyopKD86XFx3K1xccyo9PlxccypcXHcrXFxzKixcXHMqKSooPzpcXHcrXFxzKj0+XFxzKlxcdyspLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogLywvLFxuXHRcdFx0J2NsYXNzLW5hbWUnOiAvXFx3Ky8sXG5cdFx0XHQnb3BlcmF0b3InOiAvPT4vXG5cdFx0fVxuXHR9LFxuXHQncHJvcGVydHknOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OkFnZ3JlZ2F0ZXN8W0lpXW50ZXJmYWNlc3xKYXZhfEphdmFzY3JpcHR8Sm9saWV8W0xsXW9jYXRpb258T25lV2F5fFtQcF1yb3RvY29sfFJlZGlyZWN0c3xSZXF1ZXN0UmVzcG9uc2UpXFxiKD89WyBcXHRdKjopL1xuXHR9XG59KTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBpbnRlcnBvbGF0aW9uID0gL1xcXFxcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKS8uc291cmNlO1xuXHR2YXIgc3RyaW5nID0gUmVnRXhwKC8oXnxbXlxcXFxdKVwiKD86W15cIlxcclxcblxcXFxdfFxcXFxbXlxcclxcbihdfF9fKSpcIi8uc291cmNlLnJlcGxhY2UoL19fL2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGludGVycG9sYXRpb247IH0pKTtcblx0dmFyIHN0cmluZ0ludGVycG9sYXRpb24gPSB7XG5cdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKS8uc291cmNlICsgaW50ZXJwb2xhdGlvbiksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb250ZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKFxcXFxcXCgpW1xcc1xcU10rKD89XFwpJCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcXFxcXCh8XFwpJC9cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0dmFyIGpxID0gUHJpc20ubGFuZ3VhZ2VzLmpxID0ge1xuXHRcdCdjb21tZW50JzogLyMuKi8sXG5cdFx0J3Byb3BlcnR5Jzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKHN0cmluZy5zb3VyY2UgKyAvKD89XFxzKjooPyE6KSkvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBzdHJpbmdJbnRlcnBvbGF0aW9uXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogc3RyaW5nLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZTogc3RyaW5nSW50ZXJwb2xhdGlvblxuXHRcdH0sXG5cblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYmRlZlxccyspW2Etel9dXFx3Ky9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQndmFyaWFibGUnOiAvXFxCXFwkXFx3Ky8sXG5cdFx0J3Byb3BlcnR5LWxpdGVyYWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3Kig/PVxccyo6KD8hOikpL2ksXG5cdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86YXN8YnJlYWt8Y2F0Y2h8ZGVmfGVsaWZ8ZWxzZXxlbmR8Zm9yZWFjaHxpZnxpbXBvcnR8aW5jbHVkZXxsYWJlbHxtb2R1bGV8bW9kdWxlbWV0YXxudWxsfHJlZHVjZXx0aGVufHRyeXx3aGlsZSlcXGIvLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHQnbnVtYmVyJzogLyg/OlxcYlxcZCtcXC58XFxCXFwuKT9cXGJcXGQrKD86W2VFXVsrLV0/XFxkKyk/XFxiLyxcblxuXHRcdCdvcGVyYXRvcic6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcfD0/Lyxcblx0XHRcdFx0YWxpYXM6ICdwaXBlJ1xuXHRcdFx0fSxcblx0XHRcdC9cXC5cXC58WyE9PD5dPz18XFw/XFwvXFwvfFxcL1xcLz0/fFstKyovJV09P3xbPD4/XXxcXGIoPzphbmR8bm90fG9yKVxcYi9cblx0XHRdLFxuXHRcdCdjLXN0eWxlLWZ1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC86OnxbKClcXFtcXF17fSw6O118XFwuKD89XFxzKltcXFtcXHckXSkvLFxuXHRcdCdkb3QnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwuLyxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdH1cblx0fTtcblxuXHRzdHJpbmdJbnRlcnBvbGF0aW9uLmludGVycG9sYXRpb24uaW5zaWRlLmNvbnRlbnQuaW5zaWRlID0ganE7XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdFByaXNtLmxhbmd1YWdlcy50eXBlc2NyaXB0ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnamF2YXNjcmlwdCcsIHtcblx0XHQnY2xhc3MtbmFtZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86Y2xhc3N8ZXh0ZW5kc3xpbXBsZW1lbnRzfGluc3RhbmNlb2Z8aW50ZXJmYWNlfG5ld3x0eXBlKVxccyspKD8ha2V5b2ZcXGIpKD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKig/Olxccyo8KD86W148Pl18PCg/OltePD5dfDxbXjw+XSo+KSo+KSo+KT8vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHR9LFxuXHRcdCdidWlsdGluJzogL1xcYig/OkFycmF5fEZ1bmN0aW9ufFByb21pc2V8YW55fGJvb2xlYW58Y29uc29sZXxuZXZlcnxudW1iZXJ8c3RyaW5nfHN5bWJvbHx1bmtub3duKVxcYi8sXG5cdH0pO1xuXG5cdC8vIFRoZSBrZXl3b3JkcyBUeXBlU2NyaXB0IGFkZHMgdG8gSmF2YVNjcmlwdFxuXHRQcmlzbS5sYW5ndWFnZXMudHlwZXNjcmlwdC5rZXl3b3JkLnB1c2goXG5cdFx0L1xcYig/OmFic3RyYWN0fGRlY2xhcmV8aXN8a2V5b2Z8cmVhZG9ubHl8cmVxdWlyZSlcXGIvLFxuXHRcdC8vIGtleXdvcmRzIHRoYXQgaGF2ZSB0byBiZSBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyXG5cdFx0L1xcYig/OmFzc2VydHN8aW5mZXJ8aW50ZXJmYWNlfG1vZHVsZXxuYW1lc3BhY2V8dHlwZSlcXGIoPz1cXHMqKD86W3tfJGEtekEtWlxceEEwLVxcdUZGRkZdfCQpKS8sXG5cdFx0Ly8gVGhpcyBpcyBmb3IgYGltcG9ydCB0eXBlICosIHt9YFxuXHRcdC9cXGJ0eXBlXFxiKD89XFxzKig/OltcXHsqXXwkKSkvXG5cdCk7XG5cblx0Ly8gZG9lc24ndCB3b3JrIHdpdGggVFMgYmVjYXVzZSBUUyBpcyB0b28gY29tcGxleFxuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnR5cGVzY3JpcHRbJ3BhcmFtZXRlciddO1xuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnR5cGVzY3JpcHRbJ2xpdGVyYWwtcHJvcGVydHknXTtcblxuXHQvLyBhIHZlcnNpb24gb2YgdHlwZXNjcmlwdCBzcGVjaWZpY2FsbHkgZm9yIGhpZ2hsaWdodGluZyB0eXBlc1xuXHR2YXIgdHlwZUluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ3R5cGVzY3JpcHQnLCB7fSk7XG5cdGRlbGV0ZSB0eXBlSW5zaWRlWydjbGFzcy1uYW1lJ107XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnR5cGVzY3JpcHRbJ2NsYXNzLW5hbWUnXS5pbnNpZGUgPSB0eXBlSW5zaWRlO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3R5cGVzY3JpcHQnLCAnZnVuY3Rpb24nLCB7XG5cdFx0J2RlY29yYXRvcic6IHtcblx0XHRcdHBhdHRlcm46IC9AWyRcXHdcXHhBMC1cXHVGRkZGXSsvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdhdCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXkAvLFxuXHRcdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdmdW5jdGlvbic6IC9eW1xcc1xcU10rL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2dlbmVyaWMtZnVuY3Rpb24nOiB7XG5cdFx0XHQvLyBlLmcuIGZvbzxUIGV4dGVuZHMgXCJiYXJcIiB8IFwiYmF6XCI+KCAuLi5cblx0XHRcdHBhdHRlcm46IC8jPyg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGXSg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkZdKSpcXHMqPCg/OltePD5dfDwoPzpbXjw+XXw8W148Pl0qPikqPikqPig/PVxccypcXCgpLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZnVuY3Rpb24nOiAvXiM/KD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKi8sXG5cdFx0XHRcdCdnZW5lcmljJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC88W1xcc1xcU10rLywgLy8gZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgPFxuXHRcdFx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZScsXG5cdFx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy50cyA9IFByaXNtLmxhbmd1YWdlcy50eXBlc2NyaXB0O1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgamF2YXNjcmlwdCA9IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0O1xuXG5cdHZhciB0eXBlID0gL1xceyg/Oltee31dfFxceyg/Oltee31dfFxce1tee31dKlxcfSkqXFx9KStcXH0vLnNvdXJjZTtcblx0dmFyIHBhcmFtZXRlclByZWZpeCA9ICcoQCg/OmFyZ3xhcmd1bWVudHxwYXJhbXxwcm9wZXJ0eSlcXFxccysoPzonICsgdHlwZSArICdcXFxccyspPyknO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5qc2RvYyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2phdmFkb2NsaWtlJywge1xuXHRcdCdwYXJhbWV0ZXInOiB7XG5cdFx0XHQvLyBAcGFyYW0ge3N0cmluZ30gZm9vIC0gZm9vIGJhclxuXHRcdFx0cGF0dGVybjogUmVnRXhwKHBhcmFtZXRlclByZWZpeCArIC8oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGLl0pKyg/PVxcc3wkKS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2pzZG9jJywgJ2tleXdvcmQnLCB7XG5cdFx0J29wdGlvbmFsLXBhcmFtZXRlcic6IHtcblx0XHRcdC8vIEBwYXJhbSB7c3RyaW5nfSBbYmF6LmZvbz1cImJhclwiXSBmb28gYmFyXG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAocGFyYW1ldGVyUHJlZml4ICsgL1xcWyg/Oig/IVxccylbJFxcd1xceEEwLVxcdUZGRkYuXSkrKD86PVteW1xcXV0rKT9cXF0oPz1cXHN8JCkvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwYXJhbWV0ZXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheXFxbKVskXFx3XFx4QTAtXFx1RkZGRlxcLl0rLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjb2RlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oPSlbXFxzXFxTXSooPz1cXF0kKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IGphdmFzY3JpcHQsXG5cdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1qYXZhc2NyaXB0J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWz1bXFxdXS9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhAKD86YXVnbWVudHN8Y2xhc3N8ZXh0ZW5kc3xpbnRlcmZhY2V8bWVtYmVyb2YhP3x0ZW1wbGF0ZXx0aGlzfHR5cGVkZWYpXFxzKyg/OjxUWVBFPlxccyspPylbQS1aXVxcdyooPzpcXC5bQS1aXVxcdyopKi8uc291cmNlLnJlcGxhY2UoLzxUWVBFPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0eXBlOyB9KSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnKEBbYS16XStcXFxccyspJyArIHR5cGUpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnc3RyaW5nJzogamF2YXNjcmlwdC5zdHJpbmcsXG5cdFx0XHRcdFx0J251bWJlcic6IGphdmFzY3JpcHQubnVtYmVyLFxuXHRcdFx0XHRcdCdib29sZWFuJzogamF2YXNjcmlwdC5ib29sZWFuLFxuXHRcdFx0XHRcdCdrZXl3b3JkJzogUHJpc20ubGFuZ3VhZ2VzLnR5cGVzY3JpcHQua2V5d29yZCxcblx0XHRcdFx0XHQnb3BlcmF0b3InOiAvPT58XFwuXFwuXFwufFsmfD86Kl0vLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bLiw7PTw+e30oKVtcXF1dL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnZXhhbXBsZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oQGV4YW1wbGVcXHMrKD8hXFxzKSkoPzpbXkBcXHNdfFxccysoPyFcXHMpKSs/KD89XFxzKig/OlxcKlxccyopPyg/OkBcXHd8XFwqXFwvKSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29kZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXihbXFx0IF0qKD86XFwqXFxzKik/KVxcUy4qJC9tLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiBqYXZhc2NyaXB0LFxuXHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtamF2YXNjcmlwdCdcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmphdmFkb2NsaWtlLmFkZFN1cHBvcnQoJ2phdmFzY3JpcHQnLCBQcmlzbS5sYW5ndWFnZXMuanNkb2MpO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqYXZhc2NyaXB0JywgJ2Z1bmN0aW9uLXZhcmlhYmxlJywge1xuXHRcdCdtZXRob2QtdmFyaWFibGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyhcXFxcLlxcXFxzKiknICsgUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRbJ2Z1bmN0aW9uLXZhcmlhYmxlJ10ucGF0dGVybi5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiBbJ2Z1bmN0aW9uLXZhcmlhYmxlJywgJ21ldGhvZCcsICdmdW5jdGlvbicsICdwcm9wZXJ0eS1hY2Nlc3MnXVxuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnamF2YXNjcmlwdCcsICdmdW5jdGlvbicsIHtcblx0XHQnbWV0aG9kJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCcoXFxcXC5cXFxccyopJyArIFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0WydmdW5jdGlvbiddLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6IFsnZnVuY3Rpb24nLCAncHJvcGVydHktYWNjZXNzJ11cblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmFzY3JpcHQnLCAnY29uc3RhbnQnLCB7XG5cdFx0J2tub3duLWNsYXNzLW5hbWUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIHN0YW5kYXJkIGJ1aWx0LWluc1xuXHRcdFx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0c1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86KD86RmxvYXQoPzozMnw2NCl8KD86SW50fFVpbnQpKD86OHwxNnwzMil8VWludDhDbGFtcGVkKT9BcnJheXxBcnJheUJ1ZmZlcnxCaWdJbnR8Qm9vbGVhbnxEYXRhVmlld3xEYXRlfEVycm9yfEZ1bmN0aW9ufEludGx8SlNPTnwoPzpXZWFrKT8oPzpNYXB8U2V0KXxNYXRofE51bWJlcnxPYmplY3R8UHJvbWlzZXxQcm94eXxSZWZsZWN0fFJlZ0V4cHxTdHJpbmd8U3ltYm9sfFdlYkFzc2VtYmx5KVxcYi8sXG5cdFx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGVycm9yc1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFxiKD86W0EtWl1cXHcqKUVycm9yXFxiLyxcblx0XHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdFx0fVxuXHRcdF1cblx0fSk7XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIHRoZSBgPElEPmAgcGxhY2Vob2xkZXIgaW4gdGhlIGdpdmVuIHBhdHRlcm4gd2l0aCBhIHBhdHRlcm4gZm9yIGdlbmVyYWwgSlMgaWRlbnRpZmllcnMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2Vcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtmbGFnc11cblx0ICogQHJldHVybnMge1JlZ0V4cH1cblx0ICovXG5cdGZ1bmN0aW9uIHdpdGhJZChzb3VyY2UsIGZsYWdzKSB7XG5cdFx0cmV0dXJuIFJlZ0V4cChcblx0XHRcdHNvdXJjZS5yZXBsYWNlKC88SUQ+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIC8oPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqLy5zb3VyY2U7IH0pLFxuXHRcdFx0ZmxhZ3MpO1xuXHR9XG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2phdmFzY3JpcHQnLCAna2V5d29yZCcsIHtcblx0XHQnaW1wb3J0cyc6IHtcblx0XHRcdC8vIGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtaW1wb3J0c1xuXHRcdFx0cGF0dGVybjogd2l0aElkKC8oXFxiaW1wb3J0XFxiXFxzKikoPzo8SUQ+KD86XFxzKixcXHMqKD86XFwqXFxzKmFzXFxzKzxJRD58XFx7W157fV0qXFx9KSk/fFxcKlxccyphc1xccys8SUQ+fFxce1tee31dKlxcfSkoPz1cXHMqXFxiZnJvbVxcYikvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdH0sXG5cdFx0J2V4cG9ydHMnOiB7XG5cdFx0XHQvLyBodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLWV4cG9ydHNcblx0XHRcdHBhdHRlcm46IHdpdGhJZCgvKFxcYmV4cG9ydFxcYlxccyopKD86XFwqKD86XFxzKmFzXFxzKzxJRD4pPyg/PVxccypcXGJmcm9tXFxiKXxcXHtbXnt9XSpcXH0pLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0WydrZXl3b3JkJ10udW5zaGlmdChcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86YXN8ZGVmYXVsdHxleHBvcnR8ZnJvbXxpbXBvcnQpXFxiLyxcblx0XHRcdGFsaWFzOiAnbW9kdWxlJ1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmF3YWl0fGJyZWFrfGNhdGNofGNvbnRpbnVlfGRvfGVsc2V8ZmluYWxseXxmb3J8aWZ8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8d2hpbGV8eWllbGQpXFxiLyxcblx0XHRcdGFsaWFzOiAnY29udHJvbC1mbG93J1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYm51bGxcXGIvLFxuXHRcdFx0YWxpYXM6IFsnbnVsbCcsICduaWwnXVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYnVuZGVmaW5lZFxcYi8sXG5cdFx0XHRhbGlhczogJ25pbCdcblx0XHR9XG5cdCk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnamF2YXNjcmlwdCcsICdvcGVyYXRvcicsIHtcblx0XHQnc3ByZWFkJzoge1xuXHRcdFx0cGF0dGVybjogL1xcLnszfS8sXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH0sXG5cdFx0J2Fycm93Jzoge1xuXHRcdFx0cGF0dGVybjogLz0+Lyxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdqYXZhc2NyaXB0JywgJ3B1bmN0dWF0aW9uJywge1xuXHRcdCdwcm9wZXJ0eS1hY2Nlc3MnOiB7XG5cdFx0XHRwYXR0ZXJuOiB3aXRoSWQoLyhcXC5cXHMqKSM/PElEPi8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdtYXliZS1jbGFzcy1uYW1lJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteJFxcd1xceEEwLVxcdUZGRkZdKVtBLVpdWyRcXHdcXHhBMC1cXHVGRkZGXSsvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2RvbSc6IHtcblx0XHRcdC8vIHRoaXMgY29udGFpbnMgb25seSBhIGZldyBjb21tb25seSB1c2VkIERPTSB2YXJpYWJsZXNcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpkb2N1bWVudHwoPzpsb2NhbHxzZXNzaW9uKVN0b3JhZ2V8bG9jYXRpb258bmF2aWdhdG9yfHBlcmZvcm1hbmNlfHdpbmRvdylcXGIvLFxuXHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHR9LFxuXHRcdCdjb25zb2xlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYmNvbnNvbGUoPz1cXHMqXFwuKS8sXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0fVxuXHR9KTtcblxuXG5cdC8vIGFkZCAnbWF5YmUtY2xhc3MtbmFtZScgdG8gdG9rZW5zIHdoaWNoIG1pZ2h0IGJlIGEgY2xhc3MgbmFtZVxuXHR2YXIgbWF5YmVDbGFzc05hbWVUb2tlbnMgPSBbJ2Z1bmN0aW9uJywgJ2Z1bmN0aW9uLXZhcmlhYmxlJywgJ21ldGhvZCcsICdtZXRob2QtdmFyaWFibGUnLCAncHJvcGVydHktYWNjZXNzJ107XG5cblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBtYXliZUNsYXNzTmFtZVRva2Vucy5sZW5ndGg7IGkrKykge1xuXHRcdHZhciB0b2tlbiA9IG1heWJlQ2xhc3NOYW1lVG9rZW5zW2ldO1xuXHRcdHZhciB2YWx1ZSA9IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0W3Rva2VuXTtcblxuXHRcdC8vIGNvbnZlcnQgcmVnZXggdG8gb2JqZWN0XG5cdFx0aWYgKFByaXNtLnV0aWwudHlwZSh2YWx1ZSkgPT09ICdSZWdFeHAnKSB7XG5cdFx0XHR2YWx1ZSA9IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0W3Rva2VuXSA9IHtcblx0XHRcdFx0cGF0dGVybjogdmFsdWVcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Ly8ga2VlcCBpbiBtaW5kIHRoYXQgd2UgZG9uJ3Qgc3VwcG9ydCBhcnJheXNcblxuXHRcdHZhciBpbnNpZGUgPSB2YWx1ZS5pbnNpZGUgfHwge307XG5cdFx0dmFsdWUuaW5zaWRlID0gaW5zaWRlO1xuXG5cdFx0aW5zaWRlWydtYXliZS1jbGFzcy1uYW1lJ10gPSAvXltBLVpdW1xcc1xcU10qLztcblx0fVxuXG59KFByaXNtKSk7XG5cbi8vIGh0dHBzOi8vd3d3Lmpzb24ub3JnL2pzb24tZW4uaHRtbFxuUHJpc20ubGFuZ3VhZ2VzLmpzb24gPSB7XG5cdCdwcm9wZXJ0eSc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCIoPz1cXHMqOikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pXCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiKD8hXFxzKjopLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdudW1iZXInOiAvLT9cXGJcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/XFxiL2ksXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdLF0vLFxuXHQnb3BlcmF0b3InOiAvOi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J251bGwnOiB7XG5cdFx0cGF0dGVybjogL1xcYm51bGxcXGIvLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLndlYm1hbmlmZXN0ID0gUHJpc20ubGFuZ3VhZ2VzLmpzb247XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgc3RyaW5nID0gLyhcInwnKSg/OlxcXFwoPzpcXHJcXG4/fFxcbnwuKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLztcblxuXHRQcmlzbS5sYW5ndWFnZXMuanNvbjUgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdqc29uJywge1xuXHRcdCdwcm9wZXJ0eSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKHN0cmluZy5zb3VyY2UgKyAnKD89XFxcXHMqOiknKSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKig/PVxccyo6KS8sXG5cdFx0XHRcdGFsaWFzOiAndW5xdW90ZWQnXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogc3RyaW5nLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnbnVtYmVyJzogL1srLV0/XFxiKD86TmFOfEluZmluaXR5fDB4W2EtZkEtRlxcZF0rKVxcYnxbKy1dPyg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzpbZUVdWystXT9cXGQrXFxiKT8vXG5cdH0pO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5qc29ucCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2pzb24nLCB7XG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdKCk7LC5dL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2pzb25wJywgJ3B1bmN0dWF0aW9uJywge1xuXHQnZnVuY3Rpb24nOiAvKD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKig/PVxccypcXCgpL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5qc3N0YWNrdHJhY2UgPSB7XG5cdCdlcnJvci1tZXNzYWdlJzoge1xuXHRcdHBhdHRlcm46IC9eXFxTLiovbSxcblx0XHRhbGlhczogJ3N0cmluZydcblx0fSxcblxuXHQnc3RhY2stZnJhbWUnOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKylhdFsgXFx0XS4qL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdub3QtbXktY29kZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL15hdFsgXFx0XSsoPyFcXHMpKD86bm9kZVxcLmpzfDx1bmtub3duPnwuKig/Om5vZGVfbW9kdWxlc3xcXCg8YW5vbnltb3VzPlxcKXxcXCg8dW5rbm93bj58PGFub255bW91cz4kfFxcKGludGVybmFsXFwvfFxcKG5vZGVcXC5qcykpLiovbSxcblx0XHRcdFx0YWxpYXM6ICdjb21tZW50J1xuXHRcdFx0fSxcblxuXHRcdFx0J2ZpbGVuYW1lJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcYmF0XFxzKyg/IVxccyl8XFwoKSg/OlthLXpBLVpdOik/W14oKTpdKyg/PTopLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICd1cmwnXG5cdFx0XHR9LFxuXG5cdFx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxiYXRcXHMrKD86bmV3XFxzKyk/KSg/IVxccylbXyRhLXpBLVpcXHhBMC1cXHVGRkZGPF1bLiRcXHdcXHhBMC1cXHVGRkZGPD5dKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCldLyxcblxuXHRcdFx0J2tleXdvcmQnOiAvXFxiKD86YXR8bmV3KVxcYi8sXG5cblx0XHRcdCdhbGlhcyc6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcWyg/OmFzXFxzKyk/KD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdWyRcXHdcXHhBMC1cXHVGRkZGXSpcXF0vLFxuXHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0fSxcblxuXHRcdFx0J2xpbmUtbnVtYmVyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvOlxcZCsoPzo6XFxkKyk/XFxiLyxcblx0XHRcdFx0YWxpYXM6ICdudW1iZXInLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOi9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdH1cblx0fVxufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciB0ZW1wbGF0ZVN0cmluZyA9IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0Wyd0ZW1wbGF0ZS1zdHJpbmcnXTtcblxuXHQvLyBzZWUgdGhlIHBhdHRlcm4gaW4gcHJpc20tamF2YXNjcmlwdC5qc1xuXHR2YXIgdGVtcGxhdGVMaXRlcmFsUGF0dGVybiA9IHRlbXBsYXRlU3RyaW5nLnBhdHRlcm4uc291cmNlO1xuXHR2YXIgaW50ZXJwb2xhdGlvbk9iamVjdCA9IHRlbXBsYXRlU3RyaW5nLmluc2lkZVsnaW50ZXJwb2xhdGlvbiddO1xuXHR2YXIgaW50ZXJwb2xhdGlvblB1bmN0dWF0aW9uT2JqZWN0ID0gaW50ZXJwb2xhdGlvbk9iamVjdC5pbnNpZGVbJ2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nXTtcblx0dmFyIGludGVycG9sYXRpb25QYXR0ZXJuID0gaW50ZXJwb2xhdGlvbk9iamVjdC5wYXR0ZXJuLnNvdXJjZTtcblxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHBhdHRlcm4gdG8gbWF0Y2ggYSB0ZW1wbGF0ZSBzdHJpbmcgd2l0aCBhIHNwZWNpYWwgdGFnLlxuXHQgKlxuXHQgKiBUaGlzIHdpbGwgcmV0dXJuIGB1bmRlZmluZWRgIGlmIHRoZXJlIGlzIG5vIGdyYW1tYXIgd2l0aCB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgaWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSBUaGUgbGFuZ3VhZ2UgaWQgb2YgdGhlIGVtYmVkZGVkIGxhbmd1YWdlLiBFLmcuIGBtYXJrZG93bmAuXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIHJlZ2V4IHBhdHRlcm4gdG8gbWF0Y2ggdGhlIHRhZy5cblx0ICogQHJldHVybnMge29iamVjdCB8IHVuZGVmaW5lZH1cblx0ICogQGV4YW1wbGVcblx0ICogY3JlYXRlVGVtcGxhdGUoJ2NzcycsIC9cXGJjc3MvLnNvdXJjZSk7XG5cdCAqL1xuXHRmdW5jdGlvbiBjcmVhdGVUZW1wbGF0ZShsYW5ndWFnZSwgdGFnKSB7XG5cdFx0aWYgKCFQcmlzbS5sYW5ndWFnZXNbbGFuZ3VhZ2VdKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJygoPzonICsgdGFnICsgJylcXFxccyopJyArIHRlbXBsYXRlTGl0ZXJhbFBhdHRlcm4pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndGVtcGxhdGUtcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15gfGAkLyxcblx0XHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdFx0fSxcblx0XHRcdFx0J2VtYmVkZGVkLWNvZGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0YWxpYXM6IGxhbmd1YWdlXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblxuXHRQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFsndGVtcGxhdGUtc3RyaW5nJ10gPSBbXG5cdFx0Ly8gc3R5bGVkLWpzeDpcblx0XHQvLyAgIGNzc2BhIHsgY29sb3I6ICMyNUY7IH1gXG5cdFx0Ly8gc3R5bGVkLWNvbXBvbmVudHM6XG5cdFx0Ly8gICBzdHlsZWQuaDFgY29sb3I6IHJlZDtgXG5cdFx0Y3JlYXRlVGVtcGxhdGUoJ2NzcycsIC9cXGIoPzpzdHlsZWQoPzpcXChbXildKlxcKSk/KD86XFxzKlxcLlxccypcXHcrKD86XFwoW14pXSpcXCkpKikqfGNzcyg/OlxccypcXC5cXHMqKD86Z2xvYmFsfHJlc29sdmUpKT98Y3JlYXRlR2xvYmFsU3R5bGV8a2V5ZnJhbWVzKS8uc291cmNlKSxcblxuXHRcdC8vIGh0bWxgPHA+PC9wPmBcblx0XHQvLyBkaXYuaW5uZXJIVE1MID0gYDxwPjwvcD5gXG5cdFx0Y3JlYXRlVGVtcGxhdGUoJ2h0bWwnLCAvXFxiaHRtbHxcXC5cXHMqKD86aW5uZXJ8b3V0ZXIpSFRNTFxccypcXCs/PS8uc291cmNlKSxcblxuXHRcdC8vIHN2Z2A8cGF0aCBmaWxsPVwiI2ZmZlwiIGQ9XCJNNTUuMzcgLi4uXCIvPmBcblx0XHRjcmVhdGVUZW1wbGF0ZSgnc3ZnJywgL1xcYnN2Zy8uc291cmNlKSxcblxuXHRcdC8vIG1kYCMgaDFgLCBtYXJrZG93bmAjIyBoMmBcblx0XHRjcmVhdGVUZW1wbGF0ZSgnbWFya2Rvd24nLCAvXFxiKD86bWFya2Rvd258bWQpLy5zb3VyY2UpLFxuXG5cdFx0Ly8gZ3FsYC4uLmAsIGdyYXBocWxgLi4uYCwgZ3JhcGhxbC5leHBlcmltZW50YWxgLi4uYFxuXHRcdGNyZWF0ZVRlbXBsYXRlKCdncmFwaHFsJywgL1xcYig/OmdxbHxncmFwaHFsKD86XFxzKlxcLlxccypleHBlcmltZW50YWwpPykvLnNvdXJjZSksXG5cblx0XHQvLyBzcWxgLi4uYFxuXHRcdGNyZWF0ZVRlbXBsYXRlKCdzcWwnLCAvXFxic3FsLy5zb3VyY2UpLFxuXG5cdFx0Ly8gdmFuaWxsYSB0ZW1wbGF0ZSBzdHJpbmdcblx0XHR0ZW1wbGF0ZVN0cmluZ1xuXHRdLmZpbHRlcihCb29sZWFuKTtcblxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgc3BlY2lmaWMgcGxhY2Vob2xkZXIgbGl0ZXJhbCBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlLlxuXHQgKlxuXHQgKiBAcGFyYW0ge251bWJlcn0gY291bnRlclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2Vcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGZ1bmN0aW9uIGdldFBsYWNlaG9sZGVyKGNvdW50ZXIsIGxhbmd1YWdlKSB7XG5cdFx0cmV0dXJuICdfX18nICsgbGFuZ3VhZ2UudG9VcHBlckNhc2UoKSArICdfJyArIGNvdW50ZXIgKyAnX19fJztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB0b2tlbnMgb2YgYFByaXNtLnRva2VuaXplYCBidXQgYWxzbyBydW5zIHRoZSBgYmVmb3JlLXRva2VuaXplYCBhbmQgYGFmdGVyLXRva2VuaXplYCBob29rcy5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNvZGVcblx0ICogQHBhcmFtIHthbnl9IGdyYW1tYXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlXG5cdCAqIEByZXR1cm5zIHsoc3RyaW5nfFRva2VuKVtdfVxuXHQgKi9cblx0ZnVuY3Rpb24gdG9rZW5pemVXaXRoSG9va3MoY29kZSwgZ3JhbW1hciwgbGFuZ3VhZ2UpIHtcblx0XHR2YXIgZW52ID0ge1xuXHRcdFx0Y29kZTogY29kZSxcblx0XHRcdGdyYW1tYXI6IGdyYW1tYXIsXG5cdFx0XHRsYW5ndWFnZTogbGFuZ3VhZ2Vcblx0XHR9O1xuXHRcdFByaXNtLmhvb2tzLnJ1bignYmVmb3JlLXRva2VuaXplJywgZW52KTtcblx0XHRlbnYudG9rZW5zID0gUHJpc20udG9rZW5pemUoZW52LmNvZGUsIGVudi5ncmFtbWFyKTtcblx0XHRQcmlzbS5ob29rcy5ydW4oJ2FmdGVyLXRva2VuaXplJywgZW52KTtcblx0XHRyZXR1cm4gZW52LnRva2Vucztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB0b2tlbiBvZiB0aGUgZ2l2ZW4gSmF2YVNjcmlwdCBpbnRlcnBvbGF0aW9uIGV4cHJlc3Npb24uXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIFRoZSBjb2RlIG9mIHRoZSBleHByZXNzaW9uLiBFLmcuIGBcIiR7NDJ9XCJgXG5cdCAqIEByZXR1cm5zIHtUb2tlbn1cblx0ICovXG5cdGZ1bmN0aW9uIHRva2VuaXplSW50ZXJwb2xhdGlvbkV4cHJlc3Npb24oZXhwcmVzc2lvbikge1xuXHRcdHZhciB0ZW1wR3JhbW1hciA9IHt9O1xuXHRcdHRlbXBHcmFtbWFyWydpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJ10gPSBpbnRlcnBvbGF0aW9uUHVuY3R1YXRpb25PYmplY3Q7XG5cblx0XHQvKiogQHR5cGUge0FycmF5fSAqL1xuXHRcdHZhciB0b2tlbnMgPSBQcmlzbS50b2tlbml6ZShleHByZXNzaW9uLCB0ZW1wR3JhbW1hcik7XG5cdFx0aWYgKHRva2Vucy5sZW5ndGggPT09IDMpIHtcblx0XHRcdC8qKlxuXHRcdFx0ICogVGhlIHRva2VuIGFycmF5IHdpbGwgbG9vayBsaWtlIHRoaXNcblx0XHRcdCAqIFtcblx0XHRcdCAqICAgICBbXCJpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uXCIsIFwiJHtcIl1cblx0XHRcdCAqICAgICBcIi4uLlwiIC8vIEphdmFTY3JpcHQgZXhwcmVzc2lvbiBvZiB0aGUgaW50ZXJwb2xhdGlvblxuXHRcdFx0ICogICAgIFtcImludGVycG9sYXRpb24tcHVuY3R1YXRpb25cIiwgXCJ9XCJdXG5cdFx0XHQgKiBdXG5cdFx0XHQgKi9cblxuXHRcdFx0dmFyIGFyZ3MgPSBbMSwgMV07XG5cdFx0XHRhcmdzLnB1c2guYXBwbHkoYXJncywgdG9rZW5pemVXaXRoSG9va3ModG9rZW5zWzFdLCBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdCwgJ2phdmFzY3JpcHQnKSk7XG5cblx0XHRcdHRva2Vucy5zcGxpY2UuYXBwbHkodG9rZW5zLCBhcmdzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IFByaXNtLlRva2VuKCdpbnRlcnBvbGF0aW9uJywgdG9rZW5zLCBpbnRlcnBvbGF0aW9uT2JqZWN0LmFsaWFzLCBleHByZXNzaW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUb2tlbml6ZXMgdGhlIGdpdmVuIGNvZGUgd2l0aCBzdXBwb3J0IGZvciBKYXZhU2NyaXB0IGludGVycG9sYXRpb24gZXhwcmVzc2lvbnMgbWl4ZWQgaW4uXG5cdCAqXG5cdCAqIFRoaXMgZnVuY3Rpb24gaGFzIDMgcGhhc2VzOlxuXHQgKlxuXHQgKiAxLiBSZXBsYWNlIGFsbCBKYXZhU2NyaXB0IGludGVycG9sYXRpb24gZXhwcmVzc2lvbiB3aXRoIGEgcGxhY2Vob2xkZXIuXG5cdCAqICAgIFRoZSBwbGFjZWhvbGRlciB3aWxsIGhhdmUgdGhlIHN5bnRheCBvZiBhIGlkZW50aWZ5IG9mIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuXG5cdCAqIDIuIFRva2VuaXplIHRoZSBjb2RlIHdpdGggcGxhY2Vob2xkZXJzLlxuXHQgKiAzLiBUb2tlbml6ZSB0aGUgaW50ZXJwb2xhdGlvbiBleHByZXNzaW9ucyBhbmQgcmUtaW5zZXJ0IHRoZW0gaW50byB0aGUgdG9rZW5pemUgY29kZS5cblx0ICogICAgVGhlIGluc2VydGlvbiBvbmx5IHdvcmtzIGlmIGEgcGxhY2Vob2xkZXIgaGFzbid0IGJlZW4gXCJyaXBwZWQgYXBhcnRcIiBtZWFuaW5nIHRoYXQgdGhlIHBsYWNlaG9sZGVyIGhhcyBiZWVuXG5cdCAqICAgIHRva2VuaXplZCBhcyB0d28gdG9rZW5zIGJ5IHRoZSBncmFtbWFyIG9mIHRoZSBlbWJlZGRlZCBsYW5ndWFnZS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IGNvZGVcblx0ICogQHBhcmFtIHtvYmplY3R9IGdyYW1tYXJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGxhbmd1YWdlXG5cdCAqIEByZXR1cm5zIHtUb2tlbn1cblx0ICovXG5cdGZ1bmN0aW9uIHRva2VuaXplRW1iZWRkZWQoY29kZSwgZ3JhbW1hciwgbGFuZ3VhZ2UpIHtcblx0XHQvLyAxLiBGaXJzdCBmaWx0ZXIgb3V0IGFsbCBpbnRlcnBvbGF0aW9uc1xuXG5cdFx0Ly8gYmVjYXVzZSB0aGV5IG1pZ2h0IGJlIGVzY2FwZWQsIHdlIG5lZWQgYSBsb29rYmVoaW5kLCBzbyB3ZSB1c2UgUHJpc21cblx0XHQvKiogQHR5cGUgeyhUb2tlbnxzdHJpbmcpW119ICovXG5cdFx0dmFyIF90b2tlbnMgPSBQcmlzbS50b2tlbml6ZShjb2RlLCB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKGludGVycG9sYXRpb25QYXR0ZXJuKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0Ly8gcmVwbGFjZSBhbGwgaW50ZXJwb2xhdGlvbnMgd2l0aCBhIHBsYWNlaG9sZGVyIHdoaWNoIGlzIG5vdCBpbiB0aGUgY29kZSBhbHJlYWR5XG5cdFx0dmFyIHBsYWNlaG9sZGVyQ291bnRlciA9IDA7XG5cdFx0LyoqIEB0eXBlIHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSAqL1xuXHRcdHZhciBwbGFjZWhvbGRlck1hcCA9IHt9O1xuXHRcdHZhciBlbWJlZGRlZENvZGUgPSBfdG9rZW5zLm1hcChmdW5jdGlvbiAodG9rZW4pIHtcblx0XHRcdGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdHJldHVybiB0b2tlbjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBpbnRlcnBvbGF0aW9uRXhwcmVzc2lvbiA9IHRva2VuLmNvbnRlbnQ7XG5cblx0XHRcdFx0dmFyIHBsYWNlaG9sZGVyO1xuXHRcdFx0XHR3aGlsZSAoY29kZS5pbmRleE9mKHBsYWNlaG9sZGVyID0gZ2V0UGxhY2Vob2xkZXIocGxhY2Vob2xkZXJDb3VudGVyKyssIGxhbmd1YWdlKSkgIT09IC0xKSB7IC8qIG5vb3AgKi8gfVxuXHRcdFx0XHRwbGFjZWhvbGRlck1hcFtwbGFjZWhvbGRlcl0gPSBpbnRlcnBvbGF0aW9uRXhwcmVzc2lvbjtcblx0XHRcdFx0cmV0dXJuIHBsYWNlaG9sZGVyO1xuXHRcdFx0fVxuXHRcdH0pLmpvaW4oJycpO1xuXG5cblx0XHQvLyAyLiBUb2tlbml6ZSB0aGUgZW1iZWRkZWQgY29kZVxuXG5cdFx0dmFyIGVtYmVkZGVkVG9rZW5zID0gdG9rZW5pemVXaXRoSG9va3MoZW1iZWRkZWRDb2RlLCBncmFtbWFyLCBsYW5ndWFnZSk7XG5cblxuXHRcdC8vIDMuIFJlLWluc2VydCB0aGUgaW50ZXJwb2xhdGlvblxuXG5cdFx0dmFyIHBsYWNlaG9sZGVycyA9IE9iamVjdC5rZXlzKHBsYWNlaG9sZGVyTWFwKTtcblx0XHRwbGFjZWhvbGRlckNvdW50ZXIgPSAwO1xuXG5cdFx0LyoqXG5cdFx0ICpcblx0XHQgKiBAcGFyYW0geyhUb2tlbnxzdHJpbmcpW119IHRva2Vuc1xuXHRcdCAqIEByZXR1cm5zIHt2b2lkfVxuXHRcdCAqL1xuXHRcdGZ1bmN0aW9uIHdhbGtUb2tlbnModG9rZW5zKSB7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHRpZiAocGxhY2Vob2xkZXJDb3VudGVyID49IHBsYWNlaG9sZGVycy5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YXIgdG9rZW4gPSB0b2tlbnNbaV07XG5cblx0XHRcdFx0aWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHRva2VuLmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0dmFyIHBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXJzW3BsYWNlaG9sZGVyQ291bnRlcl07XG5cdFx0XHRcdFx0dmFyIHMgPSB0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnID8gdG9rZW4gOiAvKiogQHR5cGUge3N0cmluZ30gKi8gKHRva2VuLmNvbnRlbnQpO1xuXG5cdFx0XHRcdFx0dmFyIGluZGV4ID0gcy5pbmRleE9mKHBsYWNlaG9sZGVyKTtcblx0XHRcdFx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHRcdFx0XHQrK3BsYWNlaG9sZGVyQ291bnRlcjtcblxuXHRcdFx0XHRcdFx0dmFyIGJlZm9yZSA9IHMuc3Vic3RyaW5nKDAsIGluZGV4KTtcblx0XHRcdFx0XHRcdHZhciBtaWRkbGUgPSB0b2tlbml6ZUludGVycG9sYXRpb25FeHByZXNzaW9uKHBsYWNlaG9sZGVyTWFwW3BsYWNlaG9sZGVyXSk7XG5cdFx0XHRcdFx0XHR2YXIgYWZ0ZXIgPSBzLnN1YnN0cmluZyhpbmRleCArIHBsYWNlaG9sZGVyLmxlbmd0aCk7XG5cblx0XHRcdFx0XHRcdHZhciByZXBsYWNlbWVudCA9IFtdO1xuXHRcdFx0XHRcdFx0aWYgKGJlZm9yZSkge1xuXHRcdFx0XHRcdFx0XHRyZXBsYWNlbWVudC5wdXNoKGJlZm9yZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXBsYWNlbWVudC5wdXNoKG1pZGRsZSk7XG5cdFx0XHRcdFx0XHRpZiAoYWZ0ZXIpIHtcblx0XHRcdFx0XHRcdFx0dmFyIGFmdGVyVG9rZW5zID0gW2FmdGVyXTtcblx0XHRcdFx0XHRcdFx0d2Fsa1Rva2VucyhhZnRlclRva2Vucyk7XG5cdFx0XHRcdFx0XHRcdHJlcGxhY2VtZW50LnB1c2guYXBwbHkocmVwbGFjZW1lbnQsIGFmdGVyVG9rZW5zKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0XHRcdFx0dG9rZW5zLnNwbGljZS5hcHBseSh0b2tlbnMsIFtpLCAxXS5jb25jYXQocmVwbGFjZW1lbnQpKTtcblx0XHRcdFx0XHRcdFx0aSArPSByZXBsYWNlbWVudC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dG9rZW4uY29udGVudCA9IHJlcGxhY2VtZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YXIgY29udGVudCA9IHRva2VuLmNvbnRlbnQ7XG5cdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoY29udGVudCkpIHtcblx0XHRcdFx0XHRcdHdhbGtUb2tlbnMoY29udGVudCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHdhbGtUb2tlbnMoW2NvbnRlbnRdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0d2Fsa1Rva2VucyhlbWJlZGRlZFRva2Vucyk7XG5cblx0XHRyZXR1cm4gbmV3IFByaXNtLlRva2VuKGxhbmd1YWdlLCBlbWJlZGRlZFRva2VucywgJ2xhbmd1YWdlLScgKyBsYW5ndWFnZSwgY29kZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGxhbmd1YWdlcyBmb3Igd2hpY2ggSlMgdGVtcGxhdGluZyB3aWxsIGhhbmRsZSB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbHMuXG5cdCAqXG5cdCAqIEpTIHRlbXBsYXRpbmcgaXNuJ3QgYWN0aXZlIGZvciBvbmx5IEphdmFTY3JpcHQgYnV0IGFsc28gcmVsYXRlZCBsYW5ndWFnZXMgbGlrZSBUeXBlU2NyaXB0LCBKU1gsIGFuZCBUU1guXG5cdCAqL1xuXHR2YXIgc3VwcG9ydGVkTGFuZ3VhZ2VzID0ge1xuXHRcdCdqYXZhc2NyaXB0JzogdHJ1ZSxcblx0XHQnanMnOiB0cnVlLFxuXHRcdCd0eXBlc2NyaXB0JzogdHJ1ZSxcblx0XHQndHMnOiB0cnVlLFxuXHRcdCdqc3gnOiB0cnVlLFxuXHRcdCd0c3gnOiB0cnVlLFxuXHR9O1xuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdGlmICghKGVudi5sYW5ndWFnZSBpbiBzdXBwb3J0ZWRMYW5ndWFnZXMpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0LyoqXG5cdFx0ICogRmluZHMgYW5kIHRva2VuaXplcyBhbGwgdGVtcGxhdGUgc3RyaW5ncyB3aXRoIGFuIGVtYmVkZGVkIGxhbmd1YWdlcy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7KFRva2VuIHwgc3RyaW5nKVtdfSB0b2tlbnNcblx0XHQgKiBAcmV0dXJucyB7dm9pZH1cblx0XHQgKi9cblx0XHRmdW5jdGlvbiBmaW5kVGVtcGxhdGVTdHJpbmdzKHRva2Vucykge1xuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSB0b2tlbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdHZhciB0b2tlbiA9IHRva2Vuc1tpXTtcblxuXHRcdFx0XHRpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIGNvbnRlbnQgPSB0b2tlbi5jb250ZW50O1xuXHRcdFx0XHRpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIHtcblx0XHRcdFx0XHRpZiAodHlwZW9mIGNvbnRlbnQgIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0XHRmaW5kVGVtcGxhdGVTdHJpbmdzKFtjb250ZW50XSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHRva2VuLnR5cGUgPT09ICd0ZW1wbGF0ZS1zdHJpbmcnKSB7XG5cdFx0XHRcdFx0LyoqXG5cdFx0XHRcdFx0ICogQSBKYXZhU2NyaXB0IHRlbXBsYXRlLXN0cmluZyB0b2tlbiB3aWxsIGxvb2sgbGlrZSB0aGlzOlxuXHRcdFx0XHRcdCAqXG5cdFx0XHRcdFx0ICogW1widGVtcGxhdGUtc3RyaW5nXCIsIFtcblx0XHRcdFx0XHQgKiAgICAgW1widGVtcGxhdGUtcHVuY3R1YXRpb25cIiwgXCJgXCJdLFxuXHRcdFx0XHRcdCAqICAgICAoXG5cdFx0XHRcdFx0ICogICAgICAgICBBbiBhcnJheSBvZiBcInN0cmluZ1wiIGFuZCBcImludGVycG9sYXRpb25cIiB0b2tlbnMuIFRoaXMgaXMgdGhlIHNpbXBsZSBzdHJpbmcgY2FzZS5cblx0XHRcdFx0XHQgKiAgICAgICAgIG9yXG5cdFx0XHRcdFx0ICogICAgICAgICBbXCJlbWJlZGRlZC1jb2RlXCIsIFwiLi4uXCJdIFRoaXMgaXMgdGhlIHRva2VuIGNvbnRhaW5pbmcgdGhlIGVtYmVkZGVkIGNvZGUuXG5cdFx0XHRcdFx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgYWxzbyBoYXMgYW4gYWxpYXMgd2hpY2ggaXMgdGhlIGxhbmd1YWdlIG9mIHRoZSBlbWJlZGRlZCBjb2RlLlxuXHRcdFx0XHRcdCAqICAgICApLFxuXHRcdFx0XHRcdCAqICAgICBbXCJ0ZW1wbGF0ZS1wdW5jdHVhdGlvblwiLCBcImBcIl1cblx0XHRcdFx0XHQgKiBdXVxuXHRcdFx0XHRcdCAqL1xuXG5cdFx0XHRcdFx0dmFyIGVtYmVkZGVkID0gY29udGVudFsxXTtcblx0XHRcdFx0XHRpZiAoY29udGVudC5sZW5ndGggPT09IDMgJiYgdHlwZW9mIGVtYmVkZGVkICE9PSAnc3RyaW5nJyAmJiBlbWJlZGRlZC50eXBlID09PSAnZW1iZWRkZWQtY29kZScpIHtcblx0XHRcdFx0XHRcdC8vIGdldCBzdHJpbmcgY29udGVudFxuXHRcdFx0XHRcdFx0dmFyIGNvZGUgPSBzdHJpbmdDb250ZW50KGVtYmVkZGVkKTtcblxuXHRcdFx0XHRcdFx0dmFyIGFsaWFzID0gZW1iZWRkZWQuYWxpYXM7XG5cdFx0XHRcdFx0XHR2YXIgbGFuZ3VhZ2UgPSBBcnJheS5pc0FycmF5KGFsaWFzKSA/IGFsaWFzWzBdIDogYWxpYXM7XG5cblx0XHRcdFx0XHRcdHZhciBncmFtbWFyID0gUHJpc20ubGFuZ3VhZ2VzW2xhbmd1YWdlXTtcblx0XHRcdFx0XHRcdGlmICghZ3JhbW1hcikge1xuXHRcdFx0XHRcdFx0XHQvLyB0aGUgZW1iZWRkZWQgbGFuZ3VhZ2UgaXNuJ3QgcmVnaXN0ZXJlZC5cblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnRlbnRbMV0gPSB0b2tlbml6ZUVtYmVkZGVkKGNvZGUsIGdyYW1tYXIsIGxhbmd1YWdlKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZmluZFRlbXBsYXRlU3RyaW5ncyhjb250ZW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZpbmRUZW1wbGF0ZVN0cmluZ3MoZW52LnRva2Vucyk7XG5cdH0pO1xuXG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHN0cmluZyBjb250ZW50IG9mIGEgdG9rZW4gb3IgdG9rZW4gc3RyZWFtLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZyB8IFRva2VuIHwgKHN0cmluZyB8IFRva2VuKVtdfSB2YWx1ZVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0ZnVuY3Rpb24gc3RyaW5nQ29udGVudCh2YWx1ZSkge1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHZhbHVlLm1hcChzdHJpbmdDb250ZW50KS5qb2luKCcnKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIHN0cmluZ0NvbnRlbnQodmFsdWUuY29udGVudCk7XG5cdFx0fVxuXHR9XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmp1bGlhID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHQvLyBzdXBwb3J0IG9uZSBsZXZlbCBvZiBuZXN0ZWQgY29tbWVudHNcblx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vSnVsaWFMYW5nL2p1bGlhL3B1bGwvNjEyOFxuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OiM9KD86W14jPV18PSg/ISMpfCMoPyE9KXwjPSg/OlteIz1dfD0oPyEjKXwjKD8hPSkpKj0jKSo9I3wjLiopLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdyZWdleCc6IHtcblx0XHQvLyBodHRwczovL2RvY3MuanVsaWFsYW5nLm9yZy9lbi92MS9tYW51YWwvc3RyaW5ncy8jUmVndWxhci1FeHByZXNzaW9ucy0xXG5cdFx0cGF0dGVybjogL3JcIig/OlxcXFwufFteXCJcXFxcXFxyXFxuXSkqXCJbaW1zeF17MCw0fS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0Ly8gaHR0cHM6Ly9kb2NzLmp1bGlhbGFuZy5vcmcvZW4vdjEvbWFudWFsL3N0cmluZ3MvI1N0cmluZy1CYXNpY3MtMVxuXHRcdC8vIGh0dHBzOi8vZG9jcy5qdWxpYWxhbmcub3JnL2VuL3YxL21hbnVhbC9zdHJpbmdzLyNub24tc3RhbmRhcmQtc3RyaW5nLWxpdGVyYWxzLTFcblx0XHQvLyBodHRwczovL2RvY3MuanVsaWFsYW5nLm9yZy9lbi92MS9tYW51YWwvcnVubmluZy1leHRlcm5hbC1wcm9ncmFtcy8jUnVubmluZy1FeHRlcm5hbC1Qcm9ncmFtcy0xXG5cdFx0cGF0dGVybjogL1wiXCJcIltcXHNcXFNdKz9cIlwiXCJ8KD86XFxiXFx3Kyk/XCIoPzpcXFxcLnxbXlwiXFxcXFxcclxcbl0pKlwifGAoPzpbXlxcXFxgXFxyXFxuXXxcXFxcLikqYC8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjaGFyJzoge1xuXHRcdC8vIGh0dHBzOi8vZG9jcy5qdWxpYWxhbmcub3JnL2VuL3YxL21hbnVhbC9zdHJpbmdzLyNtYW4tY2hhcmFjdGVycy0xXG5cdFx0cGF0dGVybjogLyhefFteXFx3J10pJyg/OlxcXFxbXlxcclxcbl1bXidcXHJcXG5dKnxbXlxcXFxcXHJcXG5dKScvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFic3RyYWN0fGJhcmVtb2R1bGV8YmVnaW58Yml0c3R5cGV8YnJlYWt8Y2F0Y2h8Y2NhbGx8Y29uc3R8Y29udGludWV8ZG98ZWxzZXxlbHNlaWZ8ZW5kfGV4cG9ydHxmaW5hbGx5fGZvcnxmdW5jdGlvbnxnbG9iYWx8aWZ8aW1tdXRhYmxlfGltcG9ydHxpbXBvcnRhbGx8aW58bGV0fGxvY2FsfG1hY3JvfG1vZHVsZXxwcmludHxwcmludGxufHF1b3RlfHJldHVybnxzdHJ1Y3R8dHJ5fHR5cGV8dHlwZWFsaWFzfHVzaW5nfHdoaWxlKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J251bWJlcic6IC8oPzpcXGIoPz1cXGQpfFxcQig/PVxcLikpKD86MFtib3hdKT8oPzpbXFxkYS1mXSsoPzpfW1xcZGEtZl0rKSooPzpcXC4oPzpcXGQrKD86X1xcZCspKik/KT98XFwuXFxkKyg/Ol9cXGQrKSopKD86W2VmcF1bKy1dP1xcZCsoPzpfXFxkKykqKT9qPy9pLFxuXHQvLyBodHRwczovL2RvY3MuanVsaWFsYW5nLm9yZy9lbi92MS9tYW51YWwvbWF0aGVtYXRpY2FsLW9wZXJhdGlvbnMvXG5cdC8vIGh0dHBzOi8vZG9jcy5qdWxpYWxhbmcub3JnL2VuL3YxL21hbnVhbC9tYXRoZW1hdGljYWwtb3BlcmF0aW9ucy8jT3BlcmF0b3ItUHJlY2VkZW5jZS1hbmQtQXNzb2NpYXRpdml0eS0xXG5cdCdvcGVyYXRvcic6IC8mJnxcXHxcXHx8Wy0rKl4lXHUwMEY3XHUyMkJCJiRcXFxcXT0/fFxcL1tcXC89XT98IT0/PT98XFx8Wz0+XT98PCg/Ojw9P3xbPTp8XSk/fD4oPzo9fD4+Pz0/KT98PT0/PT98W35cdTIyNjBcdTIyNjRcdTIyNjUnXHUyMjFBXHUyMjFCXS8sXG5cdCdwdW5jdHVhdGlvbic6IC86Oj98W3t9W1xcXSgpOywuP10vLFxuXHQvLyBodHRwczovL2RvY3MuanVsaWFsYW5nLm9yZy9lbi92MS9iYXNlL251bWJlcnMvI0Jhc2UuaW1cblx0J2NvbnN0YW50JzogL1xcYig/Oig/OkluZnxOYU4pKD86MTZ8MzJ8NjQpP3xpbXxwaSlcXGJ8W1x1MDNDMFx1MjEyRl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMua2VlcGFsaXZlZCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1sjIV0uKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86XCIoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlwiXFxcXFxcclxcbl0pKlwifCcoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXidcXFxcXFxyXFxuXSkqJykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0Ly8gc3VwcG9ydCBJUHY0LCBJUHY2LCBzdWJuZXQgbWFza1xuXHQnaXAnOiB7XG5cdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0L1xcYig/Oig/Oig/OltcXGRhLWZdezEsNH06KXs3fVtcXGRhLWZdezEsNH18KD86W1xcZGEtZl17MSw0fTopezZ9OltcXGRhLWZdezEsNH18KD86W1xcZGEtZl17MSw0fTopezV9Oig/OltcXGRhLWZdezEsNH06KT9bXFxkYS1mXXsxLDR9fCg/OltcXGRhLWZdezEsNH06KXs0fTooPzpbXFxkYS1mXXsxLDR9Oil7MCwyfVtcXGRhLWZdezEsNH18KD86W1xcZGEtZl17MSw0fTopezN9Oig/OltcXGRhLWZdezEsNH06KXswLDN9W1xcZGEtZl17MSw0fXwoPzpbXFxkYS1mXXsxLDR9Oil7Mn06KD86W1xcZGEtZl17MSw0fTopezAsNH1bXFxkYS1mXXsxLDR9fCg/OltcXGRhLWZdezEsNH06KXs2fTxpcHY0PnwoPzpbXFxkYS1mXXsxLDR9Oil7MCw1fTo8aXB2ND58OjooPzpbXFxkYS1mXXsxLDR9Oil7MCw1fTxpcHY0PnxbXFxkYS1mXXsxLDR9OjooPzpbXFxkYS1mXXsxLDR9Oil7MCw1fVtcXGRhLWZdezEsNH18OjooPzpbXFxkYS1mXXsxLDR9Oil7MCw2fVtcXGRhLWZdezEsNH18KD86W1xcZGEtZl17MSw0fTopezEsN306KSg/OlxcL1xcZHsxLDN9KT98PGlwdjQ+KD86XFwvXFxkezEsMn0pPylcXGIvLnNvdXJjZVxuXHRcdFx0XHQucmVwbGFjZSgvPGlwdjQ+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIC8oPzooPzooPzoyNVswLTVdfDJbMC00XVxcZHwxXFxkXFxkfFsxLTldXFxkfFxcZClcXC4pezN9KD86MjVbMC01XXwyWzAtNF1cXGR8MVxcZFxcZHxbMS05XVxcZHxcXGQpKS8uc291cmNlOyB9KSxcblx0XHRcdCdpJ1xuXHRcdCksXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cblx0Ly8gc3VwcG9ydCAqbml4IC8gV2luZG93cywgZGlyZWN0b3J5IC8gZmlsZVxuXHQncGF0aCc6IHtcblx0XHRwYXR0ZXJuOiAvKFxccylcXC8oPzpbXlxcL1xcc10rXFwvKSpbXlxcL1xcc10qfFxcYlthLXpBLVpdOlxcXFwoPzpbXlxcXFxcXHNdK1xcXFwpKlteXFxcXFxcc10qLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0fSxcblx0J3ZhcmlhYmxlJzogL1xcJFxcez9cXHcrXFx9Py8sXG5cdCdlbWFpbCc6IHtcblx0XHRwYXR0ZXJuOiAvW1xcdy1dK0BbXFx3LV0rKD86XFwuW1xcdy1dezIsM30pezEsMn0vLFxuXHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0fSxcblx0J2NvbmRpdGlvbmFsLWNvbmZpZ3VyYXRpb24nOiB7XG5cdFx0cGF0dGVybjogL0BcXF4/W1xcdy1dKy8sXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J29wZXJhdG9yJzogLz0vLFxuXG5cdCdwcm9wZXJ0eSc6IC9cXGIoPzpCRkRfQ0hFQ0t8RE5TX0NIRUNLfEZJTEVfQ0hFQ0t8SFRUUF9HRVR8TUlTQ19DSEVDS3xOQU1FfFBJTkdfQ0hFQ0t8U0NSSVBUU3xTTVRQX0NIRUNLfFNTTHxTU0xfR0VUfFRDUF9DSEVDS3xVRFBfQ0hFQ0t8YWNjZXB0fGFkdmVydF9pbnR8YWxwaGF8YXV0aF9wYXNzfGF1dGhfdHlwZXxhdXRoZW50aWNhdGlvbnxiZmRfY3B1X2FmZmluaXR5fGJmZF9pbnN0YW5jZXxiZmRfbm9fc3dhcHxiZmRfcHJpb3JpdHl8YmZkX3Byb2Nlc3NfbmFtZXxiZmRfcmxpbWl0X3J0dGltZXxiZmRfcnRfcHJpb3JpdHl8YmluZF9pZnxiaW5kX3BvcnR8YmluZHRvfGNhfGNlcnRpZmljYXRlfGNoZWNrX3VuaWNhc3Rfc3JjfGNoZWNrZXJ8Y2hlY2tlcl9jcHVfYWZmaW5pdHl8Y2hlY2tlcl9sb2dfYWxsX2ZhaWx1cmVzfGNoZWNrZXJfbm9fc3dhcHxjaGVja2VyX3ByaW9yaXR5fGNoZWNrZXJfcmxpbWl0X3J0dGltZXxjaGVja2VyX3J0X3ByaW9yaXR5fGNoaWxkX3dhaXRfdGltZXxjb25uZWN0X2lwfGNvbm5lY3RfcG9ydHxjb25uZWN0X3RpbWVvdXR8ZGJ1c19zZXJ2aWNlX25hbWV8ZGVidWd8ZGVmYXVsdF9pbnRlcmZhY2V8ZGVsYXl8ZGVsYXlfYmVmb3JlX3JldHJ5fGRlbGF5X2xvb3B8ZGlnZXN0fGRvbnRfdHJhY2tfcHJpbWFyeXxkeW5hbWljfGR5bmFtaWNfaW50ZXJmYWNlc3xlbmFibGVfKD86ZGJ1c3xzY3JpcHRfc2VjdXJpdHl8c25pfHNubXBfY2hlY2tlcnxzbm1wX3JmY3xzbm1wX3JmY3YyfHNubXBfcmZjdjN8c25tcF92cnJwfHRyYXBzKXxlbmR8ZmFsbHxmYXN0X3JlY292ZXJ5fGZpbGV8ZmxhZy1bMTIzXXxmb3JrX2RlbGF5fGZ1bGxfY29tbWFuZHxmd21hcmt8Z2FycF9ncm91cHxnYXJwX2ludGVydmFsfGdhcnBfbG93ZXJfcHJpb19kZWxheXxnYXJwX2xvd2VyX3ByaW9fcmVwZWF0fGdhcnBfbWFzdGVyX2RlbGF5fGdhcnBfbWFzdGVyX3JlZnJlc2h8Z2FycF9tYXN0ZXJfcmVmcmVzaF9yZXBlYXR8Z2FycF9tYXN0ZXJfcmVwZWF0fGdsb2JhbF9kZWZzfGdsb2JhbF90cmFja2luZ3xnbmFfaW50ZXJ2YWx8Z3JvdXB8aGFfc3VzcGVuZHxoYXNoZWR8aGVsb19uYW1lfGhpZ2hlcl9wcmlvX3NlbmRfYWR2ZXJ0fGhvcGxpbWl0fGh0dHBfcHJvdG9jb2x8aHlzdGVyZXNpc3xpZGxlX3R4fGluY2x1ZGV8aW5oaWJpdF9vbl9mYWlsdXJlfGluaXRfZmFpbHxpbml0X2ZpbGV8aW5zdGFuY2V8aW50ZXJmYWNlfGludGVyZmFjZXN8aW50ZXJ2YWx8aXBfZmFtaWx5fGlwdnNfcHJvY2Vzc19uYW1lfGtlZXBhbGl2ZWQuY29uZnxrZXJuZWxfcnhfYnVmX3NpemV8a2V5fGxpbmtiZWF0X2ludGVyZmFjZXN8bGlua2JlYXRfdXNlX3BvbGxpbmd8bG9nX2FsbF9mYWlsdXJlc3xsb2dfdW5rbm93bl92cmlkc3xsb3dlcl9wcmlvX25vX2FkdmVydHxsdGhyZXNob2xkfGx2c19mbHVzaHxsdnNfZmx1c2hfb25zdG9wfGx2c19tZXRob2R8bHZzX25ldGxpbmtfY21kX3Jjdl9idWZzfGx2c19uZXRsaW5rX2NtZF9yY3ZfYnVmc19mb3JjZXxsdnNfbmV0bGlua19tb25pdG9yX3Jjdl9idWZzfGx2c19uZXRsaW5rX21vbml0b3JfcmN2X2J1ZnNfZm9yY2V8bHZzX25vdGlmeV9maWZvfGx2c19ub3RpZnlfZmlmb19zY3JpcHR8bHZzX3NjaGVkfGx2c19zeW5jX2RhZW1vbnxtYXhfYXV0b19wcmlvcml0eXxtYXhfaG9wc3xtY2FzdF9zcmNfaXB8bWgtZmFsbGJhY2t8bWgtcG9ydHxtaW5fYXV0b19wcmlvcml0eV9kZWxheXxtaW5fcnh8bWluX3R4fG1pc2NfZHluYW1pY3xtaXNjX3BhdGh8bWlzY190aW1lb3V0fG11bHRpcGxpZXJ8bmFtZXxuYW1lc3BhY2Vfd2l0aF9pcHNldHN8bmF0aXZlX2lwdjZ8bmVpZ2hib3JfaXB8bmV0X25hbWVzcGFjZXxuZXRfbmFtZXNwYWNlX2lwdnN8bmZ0YWJsZXN8bmZ0YWJsZXNfY291bnRlcnN8bmZ0YWJsZXNfaWZpbmRleHxuZnRhYmxlc19wcmlvcml0eXxub19hY2NlcHR8bm9fY2hlY2tlcl9lbWFpbHN8bm9fZW1haWxfZmF1bHRzfG5vcHJlZW1wdHxub3RpZmljYXRpb25fZW1haWx8bm90aWZpY2F0aW9uX2VtYWlsX2Zyb218bm90aWZ5fG5vdGlmeV9iYWNrdXB8bm90aWZ5X2RlbGV0ZWR8bm90aWZ5X2Rvd258bm90aWZ5X2ZhdWx0fG5vdGlmeV9maWZvfG5vdGlmeV9maWZvX3NjcmlwdHxub3RpZnlfbWFzdGVyfG5vdGlmeV9tYXN0ZXJfcnhfbG93ZXJfcHJpfG5vdGlmeV9wcmlvcml0eV9jaGFuZ2VzfG5vdGlmeV9zdG9wfG5vdGlmeV91cHxvbGRfdW5pY2FzdF9jaGVja3N1bXxvbWVnYXxvcHN8cGFyYW1fbWF0Y2h8cGFzc2l2ZXxwYXNzd29yZHxwYXRofHBlcnNpc3RlbmNlX2VuZ2luZXxwZXJzaXN0ZW5jZV9ncmFudWxhcml0eXxwZXJzaXN0ZW5jZV90aW1lb3V0fHByZWVtcHR8cHJlZW1wdF9kZWxheXxwcmlvcml0eXxwcm9jZXNzfHByb2Nlc3NfbW9uaXRvcl9yY3ZfYnVmc3xwcm9jZXNzX21vbml0b3JfcmN2X2J1ZnNfZm9yY2V8cHJvY2Vzc19uYW1lfHByb2Nlc3NfbmFtZXN8cHJvbW90ZV9zZWNvbmRhcmllc3xwcm90b2NvbHxwcm94eV9hcnB8cHJveHlfYXJwX3B2bGFufHF1b3J1bXxxdW9ydW1fZG93bnxxdW9ydW1fbWF4fHF1b3J1bV91cHxyYW5kb21fc2VlZHxyZWFsX3NlcnZlcnxyZWdleHxyZWdleF9tYXhfb2Zmc2V0fHJlZ2V4X21pbl9vZmZzZXR8cmVnZXhfbm9fbWF0Y2h8cmVnZXhfb3B0aW9uc3xyZWdleF9zdGFja3xyZWxvYWRfcmVwZWF0fHJlbG9hZF90aW1lX2ZpbGV8cmVxdWlyZV9yZXBseXxyZXRyeXxyaXNlfHJvdXRlcl9pZHxyc19pbml0X25vdGlmaWVzfHNjcmlwdHxzY3JpcHRfdXNlcnxzaC1mYWxsYmFja3xzaC1wb3J0fHNodXRkb3duX3NjcmlwdHxzaHV0ZG93bl9zY3JpcHRfdGltZW91dHxza2lwX2NoZWNrX2Fkdl9hZGRyfHNtdHBfYWxlcnR8c210cF9hbGVydF9jaGVja2VyfHNtdHBfYWxlcnRfdnJycHxzbXRwX2Nvbm5lY3RfdGltZW91dHxzbXRwX2hlbG9fbmFtZXxzbXRwX3NlcnZlcnxzbm1wX3NvY2tldHxzb3JyeV9zZXJ2ZXJ8c29ycnlfc2VydmVyX2luaGliaXR8c29ycnlfc2VydmVyX2x2c19tZXRob2R8c291cmNlX2lwfHN0YXJ0fHN0YXJ0dXBfc2NyaXB0fHN0YXJ0dXBfc2NyaXB0X3RpbWVvdXR8c3RhdGV8c3RhdGljX2lwYWRkcmVzc3xzdGF0aWNfcm91dGVzfHN0YXRpY19ydWxlc3xzdGF0dXNfY29kZXxzdGVwfHN0cmljdF9tb2RlfHN5bmNfZ3JvdXBfdHJhY2tpbmdfd2VpZ2h0fHRlcm1pbmF0ZV9kZWxheXx0aW1lb3V0fHRyYWNrX2JmZHx0cmFja19maWxlfHRyYWNrX2dyb3VwfHRyYWNrX2ludGVyZmFjZXx0cmFja19wcm9jZXNzfHRyYWNrX3NjcmlwdHx0cmFja19zcmNfaXB8dHRsfHR5cGV8dW1hc2t8dW5pY2FzdF9wZWVyfHVuaWNhc3Rfc3JjX2lwfHVuaWNhc3RfdHRsfHVybHx1c2VfaXB2bGFufHVzZV9waWRfZGlyfHVzZV92bWFjfHVzZXJ8dXRocmVzaG9sZHx2YWxbMTIzXXx2ZXJzaW9ufHZpcnR1YWxfaXBhZGRyZXNzfHZpcnR1YWxfaXBhZGRyZXNzX2V4Y2x1ZGVkfHZpcnR1YWxfcm91dGVyX2lkfHZpcnR1YWxfcm91dGVzfHZpcnR1YWxfcnVsZXN8dmlydHVhbF9zZXJ2ZXJ8dmlydHVhbF9zZXJ2ZXJfZ3JvdXB8dmlydHVhbGhvc3R8dm1hY194bWl0X2Jhc2V8dnJycHx2cnJwXyg/OmNoZWNrX3VuaWNhc3Rfc3JjfGNwdV9hZmZpbml0eXxnYXJwX2ludGVydmFsfGdhcnBfbG93ZXJfcHJpb19kZWxheXxnYXJwX2xvd2VyX3ByaW9fcmVwZWF0fGdhcnBfbWFzdGVyX2RlbGF5fGdhcnBfbWFzdGVyX3JlZnJlc2h8Z2FycF9tYXN0ZXJfcmVmcmVzaF9yZXBlYXR8Z2FycF9tYXN0ZXJfcmVwZWF0fGduYV9pbnRlcnZhbHxoaWdoZXJfcHJpb19zZW5kX2FkdmVydHxpbnN0YW5jZXxpcHNldHN8aXB0YWJsZXN8bG93ZXJfcHJpb19ub19hZHZlcnR8bWNhc3RfZ3JvdXA0fG1jYXN0X2dyb3VwNnxtaW5fZ2FycHxuZXRsaW5rX2NtZF9yY3ZfYnVmc3xuZXRsaW5rX2NtZF9yY3ZfYnVmc19mb3JjZXxuZXRsaW5rX21vbml0b3JfcmN2X2J1ZnN8bmV0bGlua19tb25pdG9yX3Jjdl9idWZzX2ZvcmNlfG5vX3N3YXB8bm90aWZ5X2ZpZm98bm90aWZ5X2ZpZm9fc2NyaXB0fG5vdGlmeV9wcmlvcml0eV9jaGFuZ2VzfHByaW9yaXR5fHByb2Nlc3NfbmFtZXxybGltaXRfcnR0aW1lfHJ0X3ByaW9yaXR5fHJ4X2J1ZnNfbXVsdGlwbGllcnxyeF9idWZzX3BvbGljeXxzY3JpcHR8c2tpcF9jaGVja19hZHZfYWRkcnxzdGFydHVwX2RlbGF5fHN0cmljdHxzeW5jX2dyb3VwfHRyYWNrX3Byb2Nlc3N8dmVyc2lvbil8d2FybXVwfHdlaWdodClcXGIvLFxuXG5cdCdjb25zdGFudCc6IC9cXGIoPzpBfEFBQUF8QUh8QkFDS1VQfENOQU1FfERSfE1BU1RFUnxNWHxOQVR8TlN8UEFTU3xTQ1RQfFNPQXxUQ1B8VFVOfFRYVHxVRFB8ZGh8Zm98bGJsY3xsYmxjcnxsY3xtaHxucXxvdmZ8cnJ8c2VkfHNofHdsY3x3cnIpXFxiLyxcblxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdy4tXSktP1xcZCsoPzpcXC5cXGQrKT8vLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxub3xvZmZ8b258dHJ1ZXx5ZXMpXFxiLyxcblxuXHQncHVuY3R1YXRpb24nOiAvW1xce1xcfV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMua2V5bWFuID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiYyAuKi9pLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlteXCJcXHJcXG5dKlwifCdbXidcXHJcXG5dKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndmlydHVhbC1rZXknOiB7XG5cdFx0cGF0dGVybjogL1xcW1xccyooPzooPzpBTFR8Q0FQU3xDVFJMfExBTFR8TENUUkx8TkNBUFN8UkFMVHxSQ1RSTHxTSElGVClcXHMrKSooPzpbVEtVXV9bXFx3P10rfFtBLUVdXFxkXFxkP3xcIlteXCJcXHJcXG5dKlwifCdbXidcXHJcXG5dKicpXFxzKlxcXS9pLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJyAvLyBhbGlhcyBmb3Igc3R5bGVzXG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9oZWxwLmtleW1hbi5jb20vZGV2ZWxvcGVyL2xhbmd1YWdlL2d1aWRlL2hlYWRlcnNcblx0J2hlYWRlci1rZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC8mXFx3Ky8sXG5cdFx0YWxpYXM6ICdib2xkJyAvLyBhbGlhcyBmb3Igc3R5bGVzXG5cdH0sXG5cdCdoZWFkZXItc3RhdGVtZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpiaXRtYXB8Yml0bWFwc3xjYXBzIGFsd2F5cyBvZmZ8Y2FwcyBvbiBvbmx5fGNvcHlyaWdodHxob3RrZXl8bGFuZ3VhZ2V8bGF5b3V0fG1lc3NhZ2V8bmFtZXxzaGlmdCBmcmVlcyBjYXBzfHZlcnNpb24pXFxiL2ksXG5cdFx0YWxpYXM6ICdib2xkJyAvLyBhbGlhcyBmb3Igc3R5bGVzXG5cdH0sXG5cblx0J3J1bGUta2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86YW55fGJhc2VsYXlvdXR8YmVlcHxjYWxsfGNvbnRleHR8ZGVhZGtleXxka3xpZnxpbmRleHxsYXllcnxub3Rhbnl8bnVsfG91dHN8cGxhdGZvcm18cmVzZXR8cmV0dXJufHNhdmV8c2V0fHN0b3JlfHVzZSlcXGIvaSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdzdHJ1Y3R1cmFsLWtleXdvcmQnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmFuc2l8YmVnaW58Z3JvdXB8bWF0Y2h8bmV3Y29udGV4dHxub21hdGNofHBvc3RrZXlzdHJva2V8cmVhZG9ubHl8dW5pY29kZXx1c2luZyBrZXlzKVxcYi9pLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblxuXHQnY29tcGlsZS10YXJnZXQnOiB7XG5cdFx0cGF0dGVybjogL1xcJCg/OmtleW1hbnxrZXltYW5vbmx5fGtleW1hbndlYnxrbWZsfHdlYXZlcik6L2ksXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblxuXHQvLyBVKyMjIyMsIHgjIyMsIGQjIyMgY2hhcmFjdGVycyBhbmQgbnVtYmVyc1xuXHQnbnVtYmVyJzogL1xcYig/OlVcXCtbXFxkQS1GXSt8ZFxcZCt8eFtcXGRhLWZdK3xcXGQrKVxcYi9pLFxuXHQnb3BlcmF0b3InOiAvWys+XFxcXCRdfFxcLlxcLi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCk9LF0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5rb3RsaW4gPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0XHQna2V5d29yZCc6IHtcblx0XHRcdC8vIFRoZSBsb29rYmVoaW5kIHByZXZlbnRzIHdyb25nIGhpZ2hsaWdodGluZyBvZiBlLmcuIGtvdGxpbi5wcm9wZXJ0aWVzLmdldFxuXHRcdFx0cGF0dGVybjogLyhefFteLl0pXFxiKD86YWJzdHJhY3R8YWN0dWFsfGFubm90YXRpb258YXN8YnJlYWt8Ynl8Y2F0Y2h8Y2xhc3N8Y29tcGFuaW9ufGNvbnN0fGNvbnN0cnVjdG9yfGNvbnRpbnVlfGNyb3NzaW5saW5lfGRhdGF8ZG98ZHluYW1pY3xlbHNlfGVudW18ZXhwZWN0fGV4dGVybmFsfGZpbmFsfGZpbmFsbHl8Zm9yfGZ1bnxnZXR8aWZ8aW1wb3J0fGlufGluZml4fGluaXR8aW5saW5lfGlubmVyfGludGVyZmFjZXxpbnRlcm5hbHxpc3xsYXRlaW5pdHxub2lubGluZXxudWxsfG9iamVjdHxvcGVufG9wZXJhdG9yfG91dHxvdmVycmlkZXxwYWNrYWdlfHByaXZhdGV8cHJvdGVjdGVkfHB1YmxpY3xyZWlmaWVkfHJldHVybnxzZWFsZWR8c2V0fHN1cGVyfHN1c3BlbmR8dGFpbHJlY3x0aGlzfHRocm93fHRvfHRyeXx0eXBlYWxpYXN8dmFsfHZhcnx2YXJhcmd8d2hlbnx3aGVyZXx3aGlsZSlcXGIvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKD86YFteXFxyXFxuYF0rYHxcXGJcXHcrKSg/PVxccypcXCgpLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcLikoPzpgW15cXHJcXG5gXStgfFxcdyspKD89XFxzKlxceykvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdudW1iZXInOiAvXFxiKD86MFt4WF1bXFxkYS1mQS1GXSsoPzpfW1xcZGEtZkEtRl0rKSp8MFtiQl1bMDFdKyg/Ol9bMDFdKykqfFxcZCsoPzpfXFxkKykqKD86XFwuXFxkKyg/Ol9cXGQrKSopPyg/OltlRV1bKy1dP1xcZCsoPzpfXFxkKykqKT9bZkZMXT8pXFxiLyxcblx0XHQnb3BlcmF0b3InOiAvXFwrWys9XT98LVstPT5dP3w9PT89P3whKD86IXw9PT8pP3xbXFwvKiU8Pl09P3xbPzpdOj98XFwuXFwufCYmfFxcfFxcfHxcXGIoPzphbmR8aW52fG9yfHNobHxzaHJ8dXNocnx4b3IpXFxiL1xuXHR9KTtcblxuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLmtvdGxpblsnY2xhc3MtbmFtZSddO1xuXG5cdHZhciBpbnRlcnBvbGF0aW9uSW5zaWRlID0ge1xuXHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL15cXCRcXHs/fFxcfSQvLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5rb3RsaW5cblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgna290bGluJywgJ3N0cmluZycsIHtcblx0XHQvLyBodHRwczovL2tvdGxpbmxhbmcub3JnL3NwZWMvZXhwcmVzc2lvbnMuaHRtbCNzdHJpbmctaW50ZXJwb2xhdGlvbi1leHByZXNzaW9uc1xuXHRcdCdzdHJpbmctbGl0ZXJhbCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1wiXCJcIig/OlteJF18XFwkKD86KD8hXFx7KXxcXHtbXnt9XSpcXH0pKSo/XCJcIlwiLyxcblx0XHRcdFx0YWxpYXM6ICdtdWx0aWxpbmUnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXCQoPzpbYS16X11cXHcqfFxce1tee31dKlxcfSkvaSxcblx0XHRcdFx0XHRcdGluc2lkZTogaW50ZXJwb2xhdGlvbkluc2lkZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXFxyXFxuJF18XFxcXC58XFwkKD86KD8hXFx7KXxcXHtbXnt9XSpcXH0pKSpcIi8sXG5cdFx0XHRcdGFsaWFzOiAnc2luZ2xlbGluZScsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKVxcJCg/OlthLXpfXVxcdyp8XFx7W157fV0qXFx9KS9pLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdGluc2lkZTogaW50ZXJwb2xhdGlvbkluc2lkZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdjaGFyJzoge1xuXHRcdFx0Ly8gaHR0cHM6Ly9rb3RsaW5sYW5nLm9yZy9zcGVjL2V4cHJlc3Npb25zLmh0bWwjY2hhcmFjdGVyLWxpdGVyYWxzXG5cdFx0XHRwYXR0ZXJuOiAvJyg/OlteJ1xcXFxcXHJcXG5dfFxcXFwoPzoufHVbYS1mQS1GMC05XXswLDR9KSknLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0fSk7XG5cblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5rb3RsaW5bJ3N0cmluZyddO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2tvdGxpbicsICdrZXl3b3JkJywge1xuXHRcdCdhbm5vdGF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL1xcQkAoPzpcXHcrOik/KD86W0EtWl1cXHcqfFxcW1teXFxdXStcXF0pLyxcblx0XHRcdGFsaWFzOiAnYnVpbHRpbidcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2tvdGxpbicsICdmdW5jdGlvbicsIHtcblx0XHQnbGFiZWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiXFx3K0B8QFxcdytcXGIvLFxuXHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMua3QgPSBQcmlzbS5sYW5ndWFnZXMua290bGluO1xuXHRQcmlzbS5sYW5ndWFnZXMua3RzID0gUHJpc20ubGFuZ3VhZ2VzLmtvdGxpbjtcbn0oUHJpc20pKTtcblxuLyogZXNsaW50LWRpc2FibGUgcmVnZXhwL25vLWR1cGUtY2hhcmFjdGVycy1jaGFyYWN0ZXItY2xhc3MgKi9cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvKipcblx0ICogUmVndWxhciBleHByZXNzaW9uIGZvciBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBhbGxvd2VkIGluIGlkZW50aWZpZXJzLlxuXHQgKlxuXHQgKiBAdHlwZSB7c3RyaW5nfVxuXHQgKi9cblx0dmFyIG5vbklkID0gL1xcc1xceDAwLVxceDFmXFx4MjItXFx4MmZcXHgzYS1cXHgzZlxceDViLVxceDVlXFx4NjBcXHg3Yi1cXHg3ZS8uc291cmNlO1xuXG5cdC8qKlxuXHQgKiBTdXJyb3VuZCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgSURzIHdpdGggcGF0dGVybnMgZm9yIG5vbi1JRCBzZXF1ZW5jZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuIEEgcmVndWxhciBleHByZXNzaW9uIGZvciBpZGVudGlmaWVycy5cblx0ICogQHBhcmFtIHtzdHJpbmd9IFtmbGFnc10gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmbGFncy5cblx0ICogQHJldHVybnMge1JlZ0V4cH0gQSB3cmFwcGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgaWRlbnRpZmllcnMuXG5cdCAqL1xuXHRmdW5jdGlvbiB3cmFwSWQocGF0dGVybiwgZmxhZ3MpIHtcblx0XHRyZXR1cm4gUmVnRXhwKHBhdHRlcm4ucmVwbGFjZSgvPG5vbklkPi9nLCBub25JZCksIGZsYWdzKTtcblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlcy5rdW1pciA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXHwuKi9cblx0XHR9LFxuXG5cdFx0J3Byb2xvZyc6IHtcblx0XHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCJbXlxcblxcclwiXSpcInwnW15cXG5cXHInXSonLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnYm9vbGVhbic6IHtcblx0XHRcdHBhdHRlcm46IHdyYXBJZCgvKF58Wzxub25JZD5dKSg/Olx1MDQzNFx1MDQzMHxcdTA0M0RcdTA0MzVcdTA0NDIpKD89Wzxub25JZD5dfCQpLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnb3BlcmF0b3Itd29yZCc6IHtcblx0XHRcdHBhdHRlcm46IHdyYXBJZCgvKF58Wzxub25JZD5dKSg/Olx1MDQzOHxcdTA0MzhcdTA0M0JcdTA0Mzh8XHUwNDNEXHUwNDM1KSg/PVs8bm9uSWQ+XXwkKS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblxuXHRcdCdzeXN0ZW0tdmFyaWFibGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiB3cmFwSWQoLyhefFs8bm9uSWQ+XSlcdTA0MzdcdTA0M0RcdTA0MzBcdTA0NDcoPz1bPG5vbklkPl18JCkvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cblx0XHQndHlwZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogd3JhcElkKC8oXnxbPG5vbklkPl0pKD86XHUwNDMyXHUwNDM1XHUwNDQ5fFx1MDQzQlx1MDQzOFx1MDQ0MnxcdTA0M0JcdTA0M0VcdTA0MzN8XHUwNDQxXHUwNDM4XHUwNDNDfFx1MDQ0Nlx1MDQzNVx1MDQzQikoPzpcXHgyMCpcdTA0NDJcdTA0MzBcdTA0MzEpPyg/PVs8bm9uSWQ+XXwkKS8uc291cmNlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdidWlsdGluJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogd3JhcElkKC8oXnxbPG5vbklkPl0pKD86XHUwNDNBXHUwNDNFXHUwNDNDXHUwNDNGXHUwNDNCfFx1MDQ0MVx1MDQzQVx1MDQzMFx1MDQzRFx1MDQzQVx1MDQzRVx1MDQzNHxcdTA0NDRcdTA0MzBcdTA0MzlcdTA0M0J8XHUwNDQ2XHUwNDMyXHUwNDM1XHUwNDQyKSg/PVs8bm9uSWQ+XXwkKS8uc291cmNlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0XHR9XG5cdFx0XSxcblxuXHRcdC8qKlxuXHRcdCAqIFNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgc2VhcmNoaW5nIGZvciB0eXBlIG5hbWVzIGJlY2F1c2Ugb2YgXCJcdTA0NDJcdTA0MzBcdTA0MzFcIi5cblx0XHQgKiBcIlx1MDQ0Mlx1MDQzMFx1MDQzMVwiIGlzIGEgcmVzZXJ2ZWQgd29yZCwgYnV0IG5ldmVyIHVzZWQgd2l0aG91dCBhIHByZWNlZGluZyB0eXBlIG5hbWUuXG5cdFx0ICogXCJcdTA0MURcdTA0MTBcdTA0MTdcdTA0MURcdTA0MTBcdTA0MjdcdTA0MThcdTA0MjJcdTA0MkNcIiwgXCJcdTA0MjRcdTA0MzJcdTA0MzJcdTA0M0VcdTA0MzRcIiwgYW5kIFwiXHUwNDI0XHUwNDMyXHUwNDRCXHUwNDMyXHUwNDNFXHUwNDM0XCIgYXJlIG5vdCByZXNlcnZlZCB3b3Jkcy5cblx0XHQgKi9cblx0XHQna2V5d29yZCc6IHtcblx0XHRcdHBhdHRlcm46IHdyYXBJZCgvKF58Wzxub25JZD5dKSg/Olx1MDQzMFx1MDQzQlx1MDQzM3xcdTA0MzBcdTA0NDBcdTA0MzMoPzpcXHgyMCpcdTA0NDBcdTA0MzVcdTA0MzcpP3xcdTA0MzJcdTA0MzJcdTA0M0VcdTA0MzR8XHUwNDEyXHUwNDFBXHUwNDFCXHUwNDJFXHUwNDI3XHUwNDE4XHUwNDIyXHUwNDJDfFx1MDQzMlx1MDQ0MVtcdTA0MzVcdTA0NTFdfFx1MDQzMlx1MDQ0Qlx1MDQzMVx1MDQzRVx1MDQ0MHxcdTA0MzJcdTA0NEJcdTA0MzJcdTA0M0VcdTA0MzR8XHUwNDMyXHUwNDRCXHUwNDQ1XHUwNDNFXHUwNDM0fFx1MDQzNFx1MDQzMFx1MDQzRFx1MDQzRXxcdTA0MzRcdTA0M0JcdTA0NEZ8XHUwNDM0XHUwNDNFfFx1MDQzNFx1MDQ0MXxcdTA0MzVcdTA0NDFcdTA0M0JcdTA0Mzh8XHUwNDM4XHUwNDNEXHUwNDMwXHUwNDQ3XHUwNDM1fFx1MDQzOFx1MDQ0MVx1MDQzRnxcdTA0MzhcdTA0NDFcdTA0M0ZcdTA0M0VcdTA0M0JcdTA0NENcdTA0MzdcdTA0M0VcdTA0MzJcdTA0MzBcdTA0NDJcdTA0NEN8XHUwNDNBXHUwNDNFXHUwNDNEKD86KD86XFx4MjArfF8pXHUwNDM4XHUwNDQxXHUwNDNGKT98XHUwNDNBXHUwNDQ2KD86KD86XFx4MjArfF8pXHUwNDNGXHUwNDQwXHUwNDM4KT98XHUwNDNEXHUwNDMwXHUwNDM0XHUwNDNFfFx1MDQzRFx1MDQzMFx1MDQ0N3xcdTA0M0RcdTA0NDF8XHUwNDNEXHUwNDQ2fFx1MDQzRVx1MDQ0MnxcdTA0M0ZcdTA0MzBcdTA0NDNcdTA0MzdcdTA0MzB8XHUwNDNGXHUwNDNFXHUwNDNBXHUwNDMwfFx1MDQzRlx1MDQ0MFx1MDQzOHxcdTA0NDBcdTA0MzBcdTA0MzdcdTA0MzA/fFx1MDQ0MFx1MDQzNVx1MDQzN3xcdTA0NDFcdTA0NDJcdTA0M0VcdTA0M0Z8XHUwNDQyXHUwNDMwXHUwNDMxfFx1MDQ0Mlx1MDQzRXxcdTA0NDNcdTA0NDJcdTA0MzJ8XHUwNDQ4XHUwNDMwXHUwNDMzKSg/PVs8bm9uSWQ+XXwkKS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0LyoqIFNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgc2VhcmNoaW5nIGZvciByZXNlcnZlZCB3b3Jkcy4gKi9cblx0XHQnbmFtZSc6IHtcblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tc3VwZXItbGluZWFyLWJhY2t0cmFja2luZ1xuXHRcdFx0cGF0dGVybjogd3JhcElkKC8oXnxbPG5vbklkPl0pW15cXGQ8bm9uSWQ+XVtePG5vbklkPl0qKD86XFx4MjArW148bm9uSWQ+XSspKig/PVs8bm9uSWQ+XXwkKS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0LyoqIFNob3VsZCBiZSBwZXJmb3JtZWQgYWZ0ZXIgc2VhcmNoaW5nIGZvciBuYW1lcy4gKi9cblx0XHQnbnVtYmVyJzoge1xuXHRcdFx0cGF0dGVybjogd3JhcElkKC8oXnxbPG5vbklkPl0pKD86XFxCXFwkW1xcZGEtZl0rXFxifCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT8pKD89Wzxub25JZD5dfCQpLy5zb3VyY2UsICdpJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdC8qKiBTaG91bGQgYmUgcGVyZm9ybWVkIGFmdGVyIHNlYXJjaGluZyBmb3Igd29yZHMuICovXG5cdFx0J3B1bmN0dWF0aW9uJzogLzo9fFsoKSw6O1xcW1xcXV0vLFxuXG5cdFx0LyoqXG5cdFx0ICogU2hvdWxkIGJlIHBlcmZvcm1lZCBhZnRlciBzZWFyY2hpbmcgZm9yXG5cdFx0ICogLSBudW1lcmljIGNvbnN0YW50cyAoYmVjYXVzZSBvZiBcIitcIiBhbmQgXCItXCIpO1xuXHRcdCAqIC0gcHVuY3R1YXRpb24gbWFya3MgKGJlY2F1c2Ugb2YgXCI6PVwiIGFuZCBcIj1cIikuXG5cdFx0ICovXG5cdFx0J29wZXJhdG9yLWNoYXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwqXFwqP3w8Wz0+XT98Pj0/fFstKy89XS8sXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMua3VtID0gUHJpc20ubGFuZ3VhZ2VzLmt1bWlyO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5rdXN0byA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcLy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvYGBgW1xcc1xcU10qP2BgYHxbaEhdPyg/OlwiKD86W15cXHJcXG5cXFxcXCJdfFxcXFwuKSpcInwnKD86W15cXHJcXG5cXFxcJ118XFxcXC4pKid8QCg/OlwiW15cXHJcXG5cIl0qXCJ8J1teXFxyXFxuJ10qJykpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQndmVyYic6IHtcblx0XHRwYXR0ZXJuOiAvKFxcfFxccyopW2Etel1bXFx3LV0qL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cblx0J2NvbW1hbmQnOiB7XG5cdFx0cGF0dGVybjogL1xcLlthLXpdW2EtelxcZC1dKlxcYi8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXG5cdCdjbGFzcy1uYW1lJzogL1xcYig/OmJvb2x8ZGF0ZXRpbWV8ZGVjaW1hbHxkeW5hbWljfGd1aWR8aW50fGxvbmd8cmVhbHxzdHJpbmd8dGltZXNwYW4pXFxiLyxcblx0J2tleXdvcmQnOiAvXFxiKD86YWNjZXNzfGFsaWFzfGFuZHxhbnRpfGFzfGFzY3xhdXRvfGJldHdlZW58Ynl8KD86Y29udGFpbnN8KD86ZW5kc3xzdGFydHMpd2l0aHxoYXMoPzpwZXJmaXh8c3VmZml4KT8pKD86X2NzKT98ZGF0YWJhc2V8ZGVjbGFyZXxkZXNjfGV4dGVybmFsfGZyb218ZnVsbG91dGVyfGhhc19hbGx8aW58aW5nZXN0aW9ufGlubGluZXxpbm5lcnxpbm5lcnVuaXF1ZXxpbnRvfCg/OmxlZnR8cmlnaHQpKD86YW50aSg/OnNlbWkpP3xpbm5lcnxvdXRlcnxzZW1pKT98bGV0fGxpa2V8bG9jYWx8bm90fG9mfG9ufG9yfHBhdHRlcm58cHJpbnR8cXVlcnlfcGFyYW1ldGVyc3xyYW5nZXxyZXN0cmljdHxzY2hlbWF8c2V0fHN0ZXB8dGFibGV8dGFibGVzfHRvfHZpZXd8d2hlcmV8d2l0aHxtYXRjaGVzXFxzK3JlZ2V4fG51bGxzXFxzKyg/OmZpcnN0fGxhc3QpKSg/IVtcXHctXSkvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxudWxsfHRydWUpXFxiLyxcblxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpLyxcblxuXHQnZGF0ZXRpbWUnOiBbXG5cdFx0e1xuXHRcdFx0Ly8gUkZDIDgyMiArIFJGQyA4NTBcblx0XHRcdHBhdHRlcm46IC9cXGIoPzooPzpGcml8RnJpZGF5fE1vbnxNb25kYXl8U2F0fFNhdHVyZGF5fFN1bnxTdW5kYXl8VGh1fFRodXJzZGF5fFR1ZXxUdWVzZGF5fFdlZHxXZWRuZXNkYXkpXFxzKixcXHMqKT9cXGR7MSwyfSg/Olxccyt8LSkoPzpBcHJ8QXVnfERlY3xGZWJ8SmFufEp1bHxKdW58TWFyfE1heXxOb3Z8T2N0fFNlcCkoPzpcXHMrfC0pXFxkezJ9XFxzK1xcZHsyfTpcXGR7Mn0oPzo6XFxkezJ9KT8oPzpcXHMqKD86XFxiKD86W0EtWl18KD86W0VDTVRdW0RTXXxHTXxVKVQpfFsrLV1cXGR7NH0pKT9cXGIvLFxuXHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBJU08gODYwMVxuXHRcdFx0cGF0dGVybjogL1srLV0/XFxiKD86XFxkezR9LVxcZHsyfS1cXGR7Mn0oPzpbIFRdXFxkezJ9OlxcZHsyfSg/OjpcXGR7Mn0oPzpcXC5cXGQrKT8pPyk/fFxcZHsyfTpcXGR7Mn0oPzo6XFxkezJ9KD86XFwuXFxkKyk/KT8pWj8vLFxuXHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0fVxuXHRdLFxuXHQnbnVtYmVyJzogL1xcYig/OjB4WzAtOUEtRmEtZl0rfFxcZCsoPzpcXC5cXGQrKT8oPzpbRWVdWystXT9cXGQrKT8pKD86KD86bWlufHNlY3xbbW5cdTAwQjVdc3xbZGhtc118bWljcm9zZWNvbmR8dGljaylcXGIpP3xbKy1dP1xcYmluZlxcYi8sXG5cblx0J29wZXJhdG9yJzogLz0+fFshPV1+fFshPTw+XT0/fFstKyovJXxdfFxcLlxcLi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClcXFtcXF17fSw7LjpdL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHR2YXIgZnVuY1BhdHRlcm4gPSAvXFxcXCg/OlteYS16KClbXFxdXXxbYS16Kl0rKS9pO1xuXHR2YXIgaW5zaWRlRXF1ID0ge1xuXHRcdCdlcXVhdGlvbi1jb21tYW5kJzoge1xuXHRcdFx0cGF0dGVybjogZnVuY1BhdHRlcm4sXG5cdFx0XHRhbGlhczogJ3JlZ2V4J1xuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMubGF0ZXggPSB7XG5cdFx0J2NvbW1lbnQnOiAvJS4qLyxcblx0XHQvLyB0aGUgdmVyYmF0aW0gZW52aXJvbm1lbnQgcHJpbnRzIHdoaXRlc3BhY2UgdG8gdGhlIGRvY3VtZW50XG5cdFx0J2NkYXRhJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXFxcYmVnaW5cXHsoKD86bHN0bGlzdGluZ3x2ZXJiYXRpbSlcXCo/KVxcfSlbXFxzXFxTXSo/KD89XFxcXGVuZFxce1xcMlxcfSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0Lypcblx0XHQgKiBlcXVhdGlvbnMgY2FuIGJlIGJldHdlZW4gJCQgJCQgb3IgJCAkIG9yIFxcKCBcXCkgb3IgXFxbIFxcXVxuXHRcdCAqIChhbGwgYXJlIG11bHRpbGluZSlcblx0XHQgKi9cblx0XHQnZXF1YXRpb24nOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCRcXCQoPzpcXFxcW1xcc1xcU118W15cXFxcJF0pK1xcJFxcJHxcXCQoPzpcXFxcW1xcc1xcU118W15cXFxcJF0pK1xcJHxcXFxcXFwoW1xcc1xcU10qP1xcXFxcXCl8XFxcXFxcW1tcXHNcXFNdKj9cXFxcXFxdLyxcblx0XHRcdFx0aW5zaWRlOiBpbnNpZGVFcXUsXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXFxcYmVnaW5cXHsoKD86YWxpZ258ZXFuYXJyYXl8ZXF1YXRpb258Z2F0aGVyfG1hdGh8bXVsdGxpbmUpXFwqPylcXH0pW1xcc1xcU10qPyg/PVxcXFxlbmRcXHtcXDJcXH0pLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBpbnNpZGVFcXUsXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdFx0fVxuXHRcdF0sXG5cdFx0Lypcblx0XHQgKiBhcmd1bWVudHMgd2hpY2ggYXJlIGtleXdvcmRzIG9yIHJlZmVyZW5jZXMgYXJlIGhpZ2hsaWdodGVkXG5cdFx0ICogYXMga2V5d29yZHNcblx0XHQgKi9cblx0XHQna2V5d29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxcXCg/OmJlZ2lufGNpdGV8ZG9jdW1lbnRjbGFzc3xlbmR8bGFiZWx8cmVmfHVzZXBhY2thZ2UpKD86XFxbW15cXF1dK1xcXSk/XFx7KVtefV0rKD89XFx9KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQndXJsJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXFxcdXJsXFx7KVtefV0rKD89XFx9KS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvKlxuXHRcdCAqIHNlY3Rpb24gb3IgY2hhcHRlciBoZWFkbGluZXMgYXJlIGhpZ2hsaWdodGVkIGFzIGJvbGQgc28gdGhhdFxuXHRcdCAqIHRoZXkgc3RhbmQgb3V0IG1vcmVcblx0XHQgKi9cblx0XHQnaGVhZGxpbmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcXFwoPzpjaGFwdGVyfGZyYW1ldGl0bGV8cGFyYWdyYXBofHBhcnR8c2VjdGlvbnxzdWJwYXJhZ3JhcGh8c3Vic2VjdGlvbnxzdWJzdWJwYXJhZ3JhcGh8c3Vic3Vic2VjdGlvbnxzdWJzdWJzdWJwYXJhZ3JhcGgpXFwqPyg/OlxcW1teXFxdXStcXF0pP1xceylbXn1dKyg/PVxcfSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZSdcblx0XHR9LFxuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IGZ1bmNQYXR0ZXJuLFxuXHRcdFx0YWxpYXM6ICdzZWxlY3Rvcidcblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bW1xcXXt9Jl0vXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnRleCA9IFByaXNtLmxhbmd1YWdlcy5sYXRleDtcblx0UHJpc20ubGFuZ3VhZ2VzLmNvbnRleHQgPSBQcmlzbS5sYW5ndWFnZXMubGF0ZXg7XG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0UHJpc20ubGFuZ3VhZ2VzLmxhdHRlID0ge1xuXHRcdCdjb21tZW50JzogL15cXHtcXCpbXFxzXFxTXSovLFxuXHRcdCdsYXR0ZS10YWcnOiB7XG5cdFx0XHQvLyBodHRwczovL2xhdHRlLm5ldHRlLm9yZy9lbi90YWdzXG5cdFx0XHRwYXR0ZXJuOiAvKF5cXHsoPzpcXC8oPz1bYS16XSkpPykoPzpbPV9dfFthLXpdXFx3KlxcYig/IVxcKCkpL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0fSxcblx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0cGF0dGVybjogL15cXHtcXC8/fFxcfSQvLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdwaHAnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxTKD86W1xcc1xcU10qXFxTKT8vLFxuXHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1waHAnLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucGhwXG5cdFx0fVxuXHR9O1xuXG5cdHZhciBtYXJrdXBMYXR0ZSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ21hcmt1cCcsIHt9KTtcblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaW5zaWRlJywgJ2F0dHItdmFsdWUnLCB7XG5cdFx0J24tYXR0cic6IHtcblx0XHRcdHBhdHRlcm46IC9uOltcXHctXSsoPzpcXHMqPVxccyooPzpcIlteXCJdKlwifCdbXiddKid8W15cXHMnXCI+PV0rKSk/Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnYXR0ci1uYW1lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eW15cXHM9XSsvLFxuXHRcdFx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnYXR0ci12YWx1ZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvPVtcXHNcXFNdKy8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiBbXG5cdFx0XHRcdFx0XHRcdC9ePS8sXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqKVtcIiddfFtcIiddJC8sXG5cdFx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdFx0J3BocCc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL1xcUyg/OltcXHNcXFNdKlxcUyk/Lyxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMucGhwXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0fVxuXHRcdH0sXG5cdH0sIG1hcmt1cExhdHRlLnRhZyk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0aWYgKGVudi5sYW5ndWFnZSAhPT0gJ2xhdHRlJykge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR2YXIgbGF0dGVQYXR0ZXJuID0gL1xce1xcKltcXHNcXFNdKj9cXCpcXH18XFx7W14nXCJcXHN7fSpdKD86W15cIicve31dfFxcLyg/IVsqL10pfChcInwnKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkqXFwxfFxcL1xcKig/OlteKl18XFwqKD8hXFwvKSkqXFwqXFwvKSpcXH0vZztcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10uYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAnbGF0dGUnLCBsYXR0ZVBhdHRlcm4pO1xuXHRcdGVudi5ncmFtbWFyID0gbWFya3VwTGF0dGU7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ2xhdHRlJyk7XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cbi8qIEZJWE1FIDpcbiA6ZXh0ZW5kKCkgaXMgbm90IGhhbmRsZWQgc3BlY2lmaWNhbGx5IDogaXRzIGhpZ2hsaWdodGluZyBpcyBidWdneS5cbiBNaXhpbiB1c2FnZSBtdXN0IGJlIGluc2lkZSBhIHJ1bGVzZXQgdG8gYmUgaGlnaGxpZ2h0ZWQuXG4gQXQtcnVsZXMgKGUuZy4gaW1wb3J0KSBjb250YWluaW5nIGludGVycG9sYXRpb25zIGFyZSBidWdneS5cbiBEZXRhY2hlZCBydWxlc2V0cyBhcmUgaGlnaGxpZ2h0ZWQgYXMgYXQtcnVsZXMuXG4gQSBjb21tZW50IGJlZm9yZSBhIG1peGluIHVzYWdlIHByZXZlbnRzIHRoZSBsYXR0ZXIgdG8gYmUgcHJvcGVybHkgaGlnaGxpZ2h0ZWQuXG4gKi9cblxuUHJpc20ubGFuZ3VhZ2VzLmxlc3MgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjc3MnLCB7XG5cdCdjb21tZW50JzogW1xuXHRcdC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXC9cXC8uKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnYXRydWxlJzoge1xuXHRcdHBhdHRlcm46IC9AW1xcdy1dKD86XFwoKD86W14oKXt9XXxcXChbXigpe31dKlxcKSkqXFwpfFteKCl7fTtcXHNdfFxccysoPyFcXHMpKSo/KD89XFxzKlxceykvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1s6KCldL1xuXHRcdH1cblx0fSxcblx0Ly8gc2VsZWN0b3JzIGFuZCBtaXhpbnMgYXJlIGNvbnNpZGVyZWQgdGhlIHNhbWVcblx0J3NlbGVjdG9yJzoge1xuXHRcdHBhdHRlcm46IC8oPzpAXFx7W1xcdy1dK1xcfXxbXnt9O1xcc0BdKSg/OkBcXHtbXFx3LV0rXFx9fFxcKCg/OlteKCl7fV18XFwoW14oKXt9XSpcXCkpKlxcKXxbXigpe307QFxcc118XFxzKyg/IVxccykpKj8oPz1cXHMqXFx7KS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQvLyBtaXhpbiBwYXJhbWV0ZXJzXG5cdFx0XHQndmFyaWFibGUnOiAvQCtbXFx3LV0rL1xuXHRcdH1cblx0fSxcblxuXHQncHJvcGVydHknOiAvKD86QFxce1tcXHctXStcXH18W1xcdy1dKSsoPzpcXCtfPyk/KD89XFxzKjopLyxcblx0J29wZXJhdG9yJzogL1srXFwtKlxcL10vXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnbGVzcycsICdwcm9wZXJ0eScsIHtcblx0J3ZhcmlhYmxlJzogW1xuXHRcdC8vIFZhcmlhYmxlIGRlY2xhcmF0aW9uICh0aGUgY29sb24gbXVzdCBiZSBjb25zdW1lZCEpXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL0BbXFx3LV0rXFxzKjovLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86L1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBWYXJpYWJsZSB1c2FnZVxuXHRcdC9AQD9bXFx3LV0rL1xuXHRdLFxuXHQnbWl4aW4tdXNhZ2UnOiB7XG5cdFx0cGF0dGVybjogLyhbeztdXFxzKilbLiNdKD8hXFxkKVtcXHctXS4qPyg/PVsoO10pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH1cbn0pO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5zY2hlbWUgPSB7XG5cdFx0Ly8gdGhpcyBzdXBwb3J0cyBcIm5vcm1hbFwiIHNpbmdsZS1saW5lIGNvbW1lbnRzOlxuXHRcdC8vICAgOyBjb21tZW50XG5cdFx0Ly8gYW5kIChwb3RlbnRpYWxseSBuZXN0ZWQpIG11bHRpbGluZSBjb21tZW50czpcblx0XHQvLyAgICN8IGNvbW1lbnQgI3wgbmVzdGVkIHwjIHN0aWxsIGNvbW1lbnQgfCNcblx0XHQvLyAob25seSAxIGxldmVsIG9mIG5lc3RpbmcgaXMgc3VwcG9ydGVkKVxuXHRcdCdjb21tZW50JzogLzsuKnwjO1xccyooPzpcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKXxcXFsoPzpbXlxcW1xcXV18XFxbW15cXFtcXF1dKlxcXSkqXFxdKXwjXFx8KD86W14jfF18Iyg/IVxcfCl8XFx8KD8hIyl8I1xcfCg/OlteI3xdfCMoPyFcXHwpfFxcfCg/ISMpKSpcXHwjKSpcXHwjLyxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxdfFxcXFwuKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdzeW1ib2wnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJ1teKClcXFtcXF0jJ1xcc10rLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2NoYXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvI1xcXFwoPzpbdXhdW2EtZkEtRlxcZF0rXFxifFstYS16QS1aXStcXGJ8W1xcdUQ4MDAtXFx1REJGRl1bXFx1REMwMC1cXHVERkZGXXxcXFMpLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2xhbWJkYS1wYXJhbWV0ZXInOiBbXG5cdFx0XHQvLyBodHRwczovL3d3dy5jcy5jbXUuZWR1L0dyb3Vwcy9BSS9odG1sL3I0cnMvcjRyc182Lmh0bWwjU0VDMzBcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFteJ2AjXSlbKFxcW11sYW1iZGFcXHMrKSg/OltefCgpXFxbXFxdJ1xcc10rfFxcfCg/OlteXFxcXHxdfFxcXFwuKSpcXHwpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFteJ2AjXSlbKFxcW11sYW1iZGFcXHMrWyhcXFtdKVteKClcXFtcXF0nXSsvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQna2V5d29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oKD86XnxbXidgI10pWyhcXFtdKSg/OmJlZ2lufGNhc2UoPzotbGFtYmRhKT98Y29uZCg/Oi1leHBhbmQpP3xkZWZpbmUoPzotbGlicmFyeXwtbWFjcm98LXJlY29yZC10eXBlfC1zeW50YXh8LXZhbHVlcyk/fGRlZm1hY3JvfGRlbGF5KD86LWZvcmNlKT98ZG98ZWxzZXxleGNlcHR8ZXhwb3J0fGd1YXJkfGlmfGltcG9ydHxpbmNsdWRlKD86LWNpfC1saWJyYXJ5LWRlY2xhcmF0aW9ucyk/fGxhbWJkYXxsZXQoPzpyZWMpPyg/Oi1zeW50YXh8LXZhbHVlc3xcXCopP3xsZXRcXCotdmFsdWVzfG9ubHl8cGFyYW1ldGVyaXplfHByZWZpeHwoPzpxdWFzaS0/KT9xdW90ZXxyZW5hbWV8c2V0IXxzeW50YXgtKD86Y2FzZXxydWxlcyl8dW5sZXNzfHVucXVvdGUoPzotc3BsaWNpbmcpP3x3aGVuKSg/PVsoKVxcW1xcXVxcc118JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2J1aWx0aW4nOiB7XG5cdFx0XHQvLyBhbGwgZnVuY3Rpb25zIG9mIHRoZSBiYXNlIGxpYnJhcnkgb2YgUjdSUyBwbHVzIHNvbWUgb2YgYnVpbHQtaW5zIG9mIFI1UnNcblx0XHRcdHBhdHRlcm46IC8oKD86XnxbXidgI10pWyhcXFtdKSg/OmFic3xhbmR8YXBwZW5kfGFwcGx5fGFzc29jfGFzc1txdl18YmluYXJ5LXBvcnRcXD98Ym9vbGVhbj0/XFw/fGJ5dGV2ZWN0b3IoPzotYXBwZW5kfC1jb3B5fC1jb3B5IXwtbGVuZ3RofC11OC1yZWZ8LXU4LXNldCF8XFw/KT98Y2FhcnxjYWRyfGNhbGwtd2l0aC0oPzpjdXJyZW50LWNvbnRpbnVhdGlvbnxwb3J0fHZhbHVlcyl8Y2FsbFxcL2NjfGNhcnxjZGFyfGNkZHJ8Y2RyfGNlaWxpbmd8Y2hhcig/Oi0+aW50ZWdlcnwtcmVhZHlcXD98XFw/fDxcXD98PD1cXD98PVxcP3w+XFw/fD49XFw/KXxjbG9zZS0oPzppbnB1dC1wb3J0fG91dHB1dC1wb3J0fHBvcnQpfGNvbXBsZXhcXD98Y29uc3xjdXJyZW50LSg/OmVycm9yfGlucHV0fG91dHB1dCktcG9ydHxkZW5vbWluYXRvcnxkeW5hbWljLXdpbmR8ZW9mLW9iamVjdFxcPz98ZXFcXD98ZXF1YWxcXD98ZXF2XFw/fGVycm9yfGVycm9yLW9iamVjdCg/Oi1pcnJpdGFudHN8LW1lc3NhZ2V8XFw/KXxldmFsfGV2ZW5cXD98ZXhhY3QoPzotaW50ZWdlci1zcXJ0fC1pbnRlZ2VyXFw/fFxcPyk/fGV4cHR8ZmVhdHVyZXN8ZmlsZS1lcnJvclxcP3xmbG9vcig/Oi1xdW90aWVudHwtcmVtYWluZGVyfFxcLyk/fGZsdXNoLW91dHB1dC1wb3J0fGZvci1lYWNofGdjZHxnZXQtb3V0cHV0LSg/OmJ5dGV2ZWN0b3J8c3RyaW5nKXxpbmV4YWN0XFw/P3xpbnB1dC1wb3J0KD86LW9wZW5cXD98XFw/KXxpbnRlZ2VyKD86LT5jaGFyfFxcPyl8bGNtfGxlbmd0aHxsaXN0KD86LT5zdHJpbmd8LT52ZWN0b3J8LWNvcHl8LXJlZnwtc2V0IXwtdGFpbHxcXD8pP3xtYWtlLSg/OmJ5dGV2ZWN0b3J8bGlzdHxwYXJhbWV0ZXJ8c3RyaW5nfHZlY3Rvcil8bWFwfG1heHxtZW1iZXJ8bWVtcXxtZW12fG1pbnxtb2R1bG98bmVnYXRpdmVcXD98bmV3bGluZXxub3R8bnVsbFxcP3xudW1iZXIoPzotPnN0cmluZ3xcXD8pfG51bWVyYXRvcnxvZGRcXD98b3Blbi0oPzppbnB1dHxvdXRwdXQpLSg/OmJ5dGV2ZWN0b3J8c3RyaW5nKXxvcnxvdXRwdXQtcG9ydCg/Oi1vcGVuXFw/fFxcPyl8cGFpclxcP3xwZWVrLWNoYXJ8cGVlay11OHxwb3J0XFw/fHBvc2l0aXZlXFw/fHByb2NlZHVyZVxcP3xxdW90aWVudHxyYWlzZXxyYWlzZS1jb250aW51YWJsZXxyYXRpb25hbFxcP3xyYXRpb25hbGl6ZXxyZWFkLSg/OmJ5dGV2ZWN0b3J8Ynl0ZXZlY3RvciF8Y2hhcnxlcnJvclxcP3xsaW5lfHN0cmluZ3x1OCl8cmVhbFxcP3xyZW1haW5kZXJ8cmV2ZXJzZXxyb3VuZHxzZXQtY1thZF1yIXxzcXVhcmV8c3RyaW5nKD86LT5saXN0fC0+bnVtYmVyfC0+c3ltYm9sfC0+dXRmOHwtPnZlY3RvcnwtYXBwZW5kfC1jb3B5fC1jb3B5IXwtZmlsbCF8LWZvci1lYWNofC1sZW5ndGh8LW1hcHwtcmVmfC1zZXQhfFxcP3w8XFw/fDw9XFw/fD1cXD98PlxcP3w+PVxcPyk/fHN1YnN0cmluZ3xzeW1ib2woPzotPnN0cmluZ3xcXD98PVxcPyl8c3ludGF4LWVycm9yfHRleHR1YWwtcG9ydFxcP3x0cnVuY2F0ZSg/Oi1xdW90aWVudHwtcmVtYWluZGVyfFxcLyk/fHU4LXJlYWR5XFw/fHV0ZjgtPnN0cmluZ3x2YWx1ZXN8dmVjdG9yKD86LT5saXN0fC0+c3RyaW5nfC1hcHBlbmR8LWNvcHl8LWNvcHkhfC1maWxsIXwtZm9yLWVhY2h8LWxlbmd0aHwtbWFwfC1yZWZ8LXNldCF8XFw/KT98d2l0aC1leGNlcHRpb24taGFuZGxlcnx3cml0ZS0oPzpieXRldmVjdG9yfGNoYXJ8c3RyaW5nfHU4KXx6ZXJvXFw/KSg/PVsoKVxcW1xcXVxcc118JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J29wZXJhdG9yJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFteJ2AjXSlbKFxcW10pKD86Wy0rKiUvXXxbPD5dPT98PT4/KSg/PVsoKVxcW1xcXVxcc118JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J251bWJlcic6IHtcblx0XHRcdC8vIFRoZSBudW1iZXIgcGF0dGVybiBmcm9tIFt0aGUgUjdSUyBzcGVjXShodHRwczovL3NtYWxsLnI3cnMub3JnL2F0dGFjaG1lbnQvcjdycy5wZGYpLlxuXHRcdFx0Ly9cblx0XHRcdC8vIDxudW1iZXI+ICAgICAgOj0gPG51bSAyPnw8bnVtIDg+fDxudW0gMTA+fDxudW0gMTY+XG5cdFx0XHQvLyA8bnVtIFI+ICAgICAgIDo9IDxwcmVmaXggUj48Y29tcGxleCBSPlxuXHRcdFx0Ly8gPGNvbXBsZXggUj4gICA6PSA8cmVhbCBSPig/OkA8cmVhbCBSPnw8aW1hZ2luYXJ5IFI+KT98PGltYWdpbmFyeSBSPlxuXHRcdFx0Ly8gPGltYWdpbmFyeSBSPiA6PSBbKy1dKD86PHVyZWFsIFI+fCg/OmluZnxuYW4pXFwuMCk/aVxuXHRcdFx0Ly8gPHJlYWwgUj4gICAgICA6PSBbKy1dPzx1cmVhbCBSPnxbKy1dKD86aW5mfG5hbilcXC4wXG5cdFx0XHQvLyA8dXJlYWwgUj4gICAgIDo9IDx1aW50IFI+KD86XFwvPHVpbnQgUj4pP1xuXHRcdFx0Ly8gICAgICAgICAgICAgICAgfCA8ZGVjaW1hbCBSPlxuXHRcdFx0Ly9cblx0XHRcdC8vIDxkZWNpbWFsIDEwPiAgOj0gKD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OmVbKy1dP1xcZCspP1xuXHRcdFx0Ly8gPHVpbnQgUj4gICAgICA6PSA8ZGlnaXQgUj4rXG5cdFx0XHQvLyA8cHJlZml4IFI+ICAgIDo9IDxyYWRpeCBSPig/OiNbZWldKT98KD86I1tlaV0pPzxyYWRpeCBSPlxuXHRcdFx0Ly8gPHJhZGl4IDI+ICAgICA6PSAjYlxuXHRcdFx0Ly8gPHJhZGl4IDg+ICAgICA6PSAjb1xuXHRcdFx0Ly8gPHJhZGl4IDEwPiAgICA6PSAoPzojZCk/XG5cdFx0XHQvLyA8cmFkaXggMTY+ICAgIDo9ICN4XG5cdFx0XHQvLyA8ZGlnaXQgMj4gICAgIDo9IFswMV1cblx0XHRcdC8vIDxkaWdpdCA4PiAgICAgOj0gWzAtN11cblx0XHRcdC8vIDxkaWdpdCAxMD4gICAgOj0gXFxkXG5cdFx0XHQvLyA8ZGlnaXQgMTY+ICAgIDo9IFswLTlhLWZdXG5cdFx0XHQvL1xuXHRcdFx0Ly8gVGhlIHByb2JsZW0gd2l0aCB0aGlzIGdyYW1tYXIgaXMgdGhhdCB0aGUgcmVzdWx0aW5nIHJlZ2V4IGlzIHdheSB0byBjb21wbGV4LCBzbyB3ZSBzaW1wbGlmeSBieSBncm91cGluZyBhbGxcblx0XHRcdC8vIG5vbi1kZWNpbWFsIGJhc2VzIHRvZ2V0aGVyLiBUaGlzIHJlc3VsdHMgaW4gYSBkZWNpbWFsIChkZWMpIGFuZCBjb21iaW5lZCBiaW5hcnksIG9jdGFsLCBhbmQgaGV4YWRlY2ltYWwgKGJveClcblx0XHRcdC8vIHBhdHRlcm46XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoU29ydGVkQk5GKHtcblx0XHRcdFx0Jzx1cmVhbCBkZWM+JzogL1xcZCsoPzpcXC9cXGQrKXwoPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86W2VzZmRsXVsrLV0/XFxkKyk/Ly5zb3VyY2UsXG5cdFx0XHRcdCc8cmVhbCBkZWM+JzogL1srLV0/PHVyZWFsIGRlYz58WystXSg/OmluZnxuYW4pXFwuMC8uc291cmNlLFxuXHRcdFx0XHQnPGltYWdpbmFyeSBkZWM+JzogL1srLV0oPzo8dXJlYWwgZGVjPnwoPzppbmZ8bmFuKVxcLjApP2kvLnNvdXJjZSxcblx0XHRcdFx0Jzxjb21wbGV4IGRlYz4nOiAvPHJlYWwgZGVjPig/OkA8cmVhbCBkZWM+fDxpbWFnaW5hcnkgZGVjPik/fDxpbWFnaW5hcnkgZGVjPi8uc291cmNlLFxuXHRcdFx0XHQnPG51bSBkZWM+JzogLyg/OiNkKD86I1tlaV0pP3wjW2VpXSg/OiNkKT8pPzxjb21wbGV4IGRlYz4vLnNvdXJjZSxcblxuXHRcdFx0XHQnPHVyZWFsIGJveD4nOiAvWzAtOWEtZl0rKD86XFwvWzAtOWEtZl0rKT8vLnNvdXJjZSxcblx0XHRcdFx0JzxyZWFsIGJveD4nOiAvWystXT88dXJlYWwgYm94PnxbKy1dKD86aW5mfG5hbilcXC4wLy5zb3VyY2UsXG5cdFx0XHRcdCc8aW1hZ2luYXJ5IGJveD4nOiAvWystXSg/Ojx1cmVhbCBib3g+fCg/OmluZnxuYW4pXFwuMCk/aS8uc291cmNlLFxuXHRcdFx0XHQnPGNvbXBsZXggYm94Pic6IC88cmVhbCBib3g+KD86QDxyZWFsIGJveD58PGltYWdpbmFyeSBib3g+KT98PGltYWdpbmFyeSBib3g+Ly5zb3VyY2UsXG5cdFx0XHRcdCc8bnVtIGJveD4nOiAvI1tib3hdKD86I1tlaV0pP3woPzojW2VpXSk/I1tib3hdPGNvbXBsZXggYm94Pi8uc291cmNlLFxuXG5cdFx0XHRcdCc8bnVtYmVyPic6IC8oXnxbKClcXFtcXF1cXHNdKSg/OjxudW0gZGVjPnw8bnVtIGJveD4pKD89WygpXFxbXFxdXFxzXXwkKS8uc291cmNlLFxuXHRcdFx0fSksICdpJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnYm9vbGVhbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbKClcXFtcXF1cXHNdKSMoPzpbZnRdfGZhbHNlfHRydWUpKD89WygpXFxbXFxdXFxzXXwkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W14nYCNdKVsoXFxbXSkoPzpbXnwoKVxcW1xcXSdcXHNdK3xcXHwoPzpbXlxcXFx8XXxcXFxcLikqXFx8KSg/PVsoKVxcW1xcXVxcc118JCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2lkZW50aWZpZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58WygpXFxbXFxdXFxzXSlcXHwoPzpbXlxcXFx8XXxcXFxcLikqXFx8KD89WygpXFxbXFxdXFxzXXwkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpXFxbXFxdJ10vXG5cdH07XG5cblx0LyoqXG5cdCAqIEdpdmVuIGEgdG9wb2xvZ2ljYWxseSBzb3J0ZWQgQk5GIGdyYW1tYXIsIHRoaXMgd2lsbCByZXR1cm4gdGhlIFJlZ0V4cCBzb3VyY2Ugb2YgbGFzdCBydWxlIG9mIHRoZSBncmFtbWFyLlxuXHQgKlxuXHQgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGdyYW1tYXJcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGZ1bmN0aW9uIFNvcnRlZEJORihncmFtbWFyKSB7XG5cdFx0Zm9yICh2YXIga2V5IGluIGdyYW1tYXIpIHtcblx0XHRcdGdyYW1tYXJba2V5XSA9IGdyYW1tYXJba2V5XS5yZXBsYWNlKC88W1xcd1xcc10rPi9nLCBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRcdHJldHVybiAnKD86JyArIGdyYW1tYXJba2V5XS50cmltKCkgKyAnKSc7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0Ly8gcmV0dXJuIHRoZSBsYXN0IGl0ZW1cblx0XHRyZXR1cm4gZ3JhbW1hcltrZXldO1xuXHR9XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBzY2hlbWVFeHByZXNzaW9uID0gL1xcKCg/OlteKCk7XCIjXFxcXF18XFxcXFtcXHNcXFNdfDsuKig/IS4pfFwiKD86W15cIlxcXFxdfFxcXFwuKSpcInwjKD86XFx7KD86KD8hI1xcfSlbXFxzXFxTXSkqI1xcfXxbXntdKXw8ZXhwcj4pKlxcKS8uc291cmNlO1xuXHQvLyBhbGxvdyBmb3IgdXAgdG8gcG93KDIsIHJlY3Vyc2l2ZW5lc3NMb2cyKSBtYW55IGxldmVscyBvZiByZWN1cnNpdmUgYnJhY2UgZXhwcmVzc2lvbnNcblx0Ly8gRm9yIHNvbWUgcmVhc29uLCB0aGlzIGNhbid0IGJlIDRcblx0dmFyIHJlY3Vyc2l2ZW5lc3NMb2cyID0gNTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCByZWN1cnNpdmVuZXNzTG9nMjsgaSsrKSB7XG5cdFx0c2NoZW1lRXhwcmVzc2lvbiA9IHNjaGVtZUV4cHJlc3Npb24ucmVwbGFjZSgvPGV4cHI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNjaGVtZUV4cHJlc3Npb247IH0pO1xuXHR9XG5cdHNjaGVtZUV4cHJlc3Npb24gPSBzY2hlbWVFeHByZXNzaW9uLnJlcGxhY2UoLzxleHByPi9nLCAvW15cXHNcXFNdLy5zb3VyY2UpO1xuXG5cblx0dmFyIGxpbHlwb25kID0gUHJpc20ubGFuZ3VhZ2VzLmxpbHlwb25kID0ge1xuXHRcdCdjb21tZW50JzogLyUoPzooPyFcXHspLip8XFx7W1xcc1xcU10qPyVcXH0pLyxcblx0XHQnZW1iZWRkZWQtc2NoZW1lJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXnxbPVxcc10pIyg/OlwiKD86W15cIlxcXFxdfFxcXFwuKSpcInxbXlxccygpXCJdKig/OlteXFxzKCldfDxleHByPikpLy5zb3VyY2UucmVwbGFjZSgvPGV4cHI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNjaGVtZUV4cHJlc3Npb247IH0pLCAnbScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnc2NoZW1lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eKCMpW1xcc1xcU10rJC8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLXNjaGVtZScsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnZW1iZWRkZWQtbGlseXBvbmQnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8jXFx7W1xcc1xcU10qPyNcXH0vLFxuXHRcdFx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eI1xce3wjXFx9JC8sXG5cdFx0XHRcdFx0XHRcdFx0J2xpbHlwb25kJzoge1xuXHRcdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLWxpbHlwb25kJyxcblx0XHRcdFx0XHRcdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMuc2NoZW1lXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvIy9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXF18XFxcXC4pKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcXFxuZXdcXHMrKVtcXHctXSsvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxcXFthLXpdWy1cXHddKi9pLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFxcXC9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdvcGVyYXRvcic6IC9bPXxdfDw8fD4+Lyxcblx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W2EtelxcZF0pKD86Jyt8LCt8W19eXT8tW19eXT8oPzpbLSteIT4uX118KD89XFxkKSl8W19eXVxcLj98Wy4hXSl8W3t9KClbXFxdPD5efl18XFxcXFsoKVtcXF08PlxcXFwhXXwtLXxfXy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC9cXGQrKT9cXGIvXG5cdH07XG5cblx0bGlseXBvbmRbJ2VtYmVkZGVkLXNjaGVtZSddLmluc2lkZVsnc2NoZW1lJ10uaW5zaWRlWydlbWJlZGRlZC1saWx5cG9uZCddLmluc2lkZVsnbGlseXBvbmQnXS5pbnNpZGUgPSBsaWx5cG9uZDtcblxuXHRQcmlzbS5sYW5ndWFnZXMubHkgPSBsaWx5cG9uZDtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMubGlxdWlkID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5cXHslXFxzKmNvbW1lbnRcXHMqJVxcfSlbXFxzXFxTXSsoPz1cXHslXFxzKmVuZGNvbW1lbnRcXHMqJVxcfSQpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdkZWxpbWl0ZXInOiB7XG5cdFx0cGF0dGVybjogL15cXHsoPzpcXHtcXHt8WyVcXHtdKS0/fC0/KD86XFx9XFx9fFslXFx9XSlcXH0kLyxcblx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlteXCJdKlwifCdbXiddKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphc3xhc3NpZ258YnJlYWt8KD86ZW5kKT8oPzpjYXB0dXJlfGNhc2V8Y29tbWVudHxmb3J8Zm9ybXxpZnxwYWdpbmF0ZXxyYXd8c3R5bGV8dGFibGVyb3d8dW5sZXNzKXxjb250aW51ZXxjeWNsZXxkZWNyZW1lbnR8ZWNob3xlbHNlfGVsc2lmfGlufGluY2x1ZGV8aW5jcmVtZW50fGxpbWl0fGxpcXVpZHxvZmZzZXR8cmFuZ2V8cmVuZGVyfHJldmVyc2VkfHNlY3Rpb258d2hlbnx3aXRoKVxcYi8sXG5cdCdvYmplY3QnOiAvXFxiKD86YWRkcmVzc3xhbGxfY291bnRyeV9vcHRpb25fdGFnc3xhcnRpY2xlfGJsb2NrfGJsb2d8Y2FydHxjaGVja291dHxjb2xsZWN0aW9ufGNvbG9yfGNvdW50cnl8Y291bnRyeV9vcHRpb25fdGFnc3xjdXJyZW5jeXxjdXJyZW50X3BhZ2V8Y3VycmVudF90YWdzfGN1c3RvbWVyfGN1c3RvbWVyX2FkZHJlc3N8ZGF0ZXxkaXNjb3VudF9hbGxvY2F0aW9ufGRpc2NvdW50X2FwcGxpY2F0aW9ufGV4dGVybmFsX3ZpZGVvfGZpbHRlcnxmaWx0ZXJfdmFsdWV8Zm9udHxmb3Jsb29wfGZ1bGZpbGxtZW50fGdlbmVyaWNfZmlsZXxnaWZ0X2NhcmR8Z3JvdXB8aGFuZGxlfGltYWdlfGxpbmVfaXRlbXxsaW5rfGxpbmtsaXN0fGxvY2FsaXphdGlvbnxsb2NhdGlvbnxtZWFzdXJlbWVudHxtZWRpYXxtZXRhZmllbGR8bW9kZWx8bW9kZWxfc291cmNlfG9yZGVyfHBhZ2V8cGFnZV9kZXNjcmlwdGlvbnxwYWdlX2ltYWdlfHBhZ2VfdGl0bGV8cGFydHxwb2xpY3l8cHJvZHVjdHxwcm9kdWN0X29wdGlvbnxyZWNvbW1lbmRhdGlvbnN8cmVxdWVzdHxyb2JvdHN8cm91dGVzfHJ1bGV8c2NyaXB0fHNlYXJjaHxzZWxsaW5nX3BsYW58c2VsbGluZ19wbGFuX2FsbG9jYXRpb258c2VsbGluZ19wbGFuX2dyb3VwfHNoaXBwaW5nX21ldGhvZHxzaG9wfHNob3BfbG9jYWxlfHNpdGVtYXB8c3RvcmVfYXZhaWxhYmlsaXR5fHRheF9saW5lfHRlbXBsYXRlfHRoZW1lfHRyYW5zYWN0aW9ufHVuaXRfcHJpY2VfbWVhc3VyZW1lbnR8dXNlcl9hZ2VudHx2YXJpYW50fHZpZGVvfHZpZGVvX3NvdXJjZSlcXGIvLFxuXHQnZnVuY3Rpb24nOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcXHxcXHMqKVxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZmlsdGVyJ1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gYXJyYXkgZnVuY3Rpb25zXG5cdFx0XHRwYXR0ZXJuOiAvKFxcLlxccyopKD86Zmlyc3R8bGFzdHxzaXplKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxuaWx8dHJ1ZSlcXGIvLFxuXHQncmFuZ2UnOiB7XG5cdFx0cGF0dGVybjogL1xcLlxcLi8sXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fSxcblx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL1Nob3BpZnkvbGlxdWlkL2Jsb2IvNjk4ZjVlMGQ5Njc0MjNlMDEzZjYxNjlkOTExMWJkOTY5YmQ3ODMzNy9saWIvbGlxdWlkL2xleGVyLnJiI0wyMVxuXHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQrKT9cXGIvLFxuXHQnb3BlcmF0b3InOiAvWyE9XT18PD58Wzw+XT0/fFt8Pzo9LV18XFxiKD86YW5kfGNvbnRhaW5zKD89XFxzKXxvcilcXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvWy4sXFxbXFxdKCldLyxcblx0J2VtcHR5Jzoge1xuXHRcdHBhdHRlcm46IC9cXGJlbXB0eVxcYi8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxufTtcblxuUHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdHZhciBsaXF1aWRQYXR0ZXJuID0gL1xceyVcXHMqY29tbWVudFxccyolXFx9W1xcc1xcU10qP1xceyVcXHMqZW5kY29tbWVudFxccyolXFx9fFxceyg/OiVbXFxzXFxTXSo/JXxcXHtcXHtbXFxzXFxTXSo/XFx9XFx9fFxce1tcXHNcXFNdKj9cXH0pXFx9L2c7XG5cdHZhciBpbnNpZGVSYXcgPSBmYWxzZTtcblxuXHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10uYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAnbGlxdWlkJywgbGlxdWlkUGF0dGVybiwgZnVuY3Rpb24gKG1hdGNoKSB7XG5cdFx0dmFyIHRhZ01hdGNoID0gL15cXHslLT9cXHMqKFxcdyspLy5leGVjKG1hdGNoKTtcblx0XHRpZiAodGFnTWF0Y2gpIHtcblx0XHRcdHZhciB0YWcgPSB0YWdNYXRjaFsxXTtcblx0XHRcdGlmICh0YWcgPT09ICdyYXcnICYmICFpbnNpZGVSYXcpIHtcblx0XHRcdFx0aW5zaWRlUmF3ID0gdHJ1ZTtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9IGVsc2UgaWYgKHRhZyA9PT0gJ2VuZHJhdycpIHtcblx0XHRcdFx0aW5zaWRlUmF3ID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiAhaW5zaWRlUmF3O1xuXHR9KTtcbn0pO1xuXG5QcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10udG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAnbGlxdWlkJyk7XG59KTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHQvKipcblx0ICogRnVuY3Rpb25zIHRvIGNvbnN0cnVjdCByZWd1bGFyIGV4cHJlc3Npb25zXG5cdCAqIGUuZy4gKGludGVyYWN0aXZlIC4uLiBvciAoaW50ZXJhY3RpdmUpXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG5cdCAqIEByZXR1cm5zIHtSZWdFeHB9XG5cdCAqL1xuXHRmdW5jdGlvbiBzaW1wbGVfZm9ybShuYW1lKSB7XG5cdFx0cmV0dXJuIFJlZ0V4cCgvKFxcKCkvLnNvdXJjZSArICcoPzonICsgbmFtZSArICcpJyArIC8oPz1bXFxzXFwpXSkvLnNvdXJjZSk7XG5cdH1cblx0LyoqXG5cdCAqIGJvb2xlYW5zIGFuZCBudW1iZXJzXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG5cdCAqIEByZXR1cm5zIHtSZWdFeHB9XG5cdCAqL1xuXHRmdW5jdGlvbiBwcmltaXRpdmUocGF0dGVybikge1xuXHRcdHJldHVybiBSZWdFeHAoLyhbXFxzKFtdKS8uc291cmNlICsgJyg/OicgKyBwYXR0ZXJuICsgJyknICsgLyg/PVtcXHMpXSkvLnNvdXJjZSk7XG5cdH1cblxuXHQvLyBQYXR0ZXJucyBpbiByZWd1bGFyIGV4cHJlc3Npb25zXG5cblx0Ly8gU3ltYm9sIG5hbWUuIFNlZSBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2VtYWNzL21hbnVhbC9odG1sX25vZGUvZWxpc3AvU3ltYm9sLVR5cGUuaHRtbFxuXHQvLyAmIGFuZCA6IGFyZSBleGNsdWRlZCBhcyB0aGV5IGFyZSB1c3VhbGx5IHVzZWQgZm9yIHNwZWNpYWwgcHVycG9zZXNcblx0dmFyIHN5bWJvbCA9IC8oPyFcXGQpWy0rKi9+IUAkJV49PD57fVxcd10rLy5zb3VyY2U7XG5cdC8vIHN5bWJvbCBzdGFydGluZyB3aXRoICYgdXNlZCBpbiBmdW5jdGlvbiBhcmd1bWVudHNcblx0dmFyIG1hcmtlciA9ICcmJyArIHN5bWJvbDtcblx0Ly8gT3BlbiBwYXJlbnRoZXNpcyBmb3IgbG9vay1iZWhpbmRcblx0dmFyIHBhciA9ICcoXFxcXCgpJztcblx0dmFyIGVuZHBhciA9ICcoPz1cXFxcKSknO1xuXHQvLyBFbmQgdGhlIHBhdHRlcm4gd2l0aCBsb29rLWFoZWFkIHNwYWNlXG5cdHZhciBzcGFjZSA9ICcoPz1cXFxccyknO1xuXHR2YXIgbmVzdGVkUGFyID0gLyg/OlteKCldfFxcKCg/OlteKCldfFxcKCg/OlteKCldfFxcKCg/OlteKCldfFxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpKSpcXCkpKlxcKSkqXFwpKSovLnNvdXJjZTtcblxuXHR2YXIgbGFuZ3VhZ2UgPSB7XG5cdFx0Ly8gVGhyZWUgb3IgZm91ciBzZW1pY29sb25zIGFyZSBjb25zaWRlcmVkIGEgaGVhZGluZy5cblx0XHQvLyBTZWUgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9lbWFjcy9tYW51YWwvaHRtbF9ub2RlL2VsaXNwL0NvbW1lbnQtVGlwcy5odG1sXG5cdFx0aGVhZGluZzoge1xuXHRcdFx0cGF0dGVybjogLzs7Oy4qLyxcblx0XHRcdGFsaWFzOiBbJ2NvbW1lbnQnLCAndGl0bGUnXVxuXHRcdH0sXG5cdFx0Y29tbWVudDogLzsuKi8sXG5cdFx0c3RyaW5nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXF18XFxcXC4pKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRhcmd1bWVudDogL1stQS1aXSsoPz1bLixcXHNdKS8sXG5cdFx0XHRcdHN5bWJvbDogUmVnRXhwKCdgJyArIHN5bWJvbCArIFwiJ1wiKVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3F1b3RlZC1zeW1ib2wnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXCIjPydcIiArIHN5bWJvbCksXG5cdFx0XHRhbGlhczogWyd2YXJpYWJsZScsICdzeW1ib2wnXVxuXHRcdH0sXG5cdFx0J2xpc3AtcHJvcGVydHknOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJzonICsgc3ltYm9sKSxcblx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0fSxcblx0XHRzcGxpY2U6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnLEA/JyArIHN5bWJvbCksXG5cdFx0XHRhbGlhczogWydzeW1ib2wnLCAndmFyaWFibGUnXVxuXHRcdH0sXG5cdFx0a2V5d29yZDogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdFx0cGFyICtcblx0XHRcdFx0XHRcdCcoPzphbmR8KD86Y2wtKT9sZXRmfGNsLWxvb3B8Y29uZHxjb25zfGVycm9yfGlmfCg/OmxleGljYWwtKT9sZXRcXFxcKj98bWVzc2FnZXxub3R8bnVsbHxvcnxwcm92aWRlfHJlcXVpcmV8c2V0cXx1bmxlc3N8dXNlLXBhY2thZ2V8d2hlbnx3aGlsZSknICtcblx0XHRcdFx0XHRcdHNwYWNlXG5cdFx0XHRcdCksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0XHRwYXIgKyAnKD86YXBwZW5kfGJ5fGNvbGxlY3R8Y29uY2F0fGRvfGZpbmFsbHl8Zm9yfGlufHJldHVybiknICsgc3BhY2Vcblx0XHRcdFx0KSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRdLFxuXHRcdGRlY2xhcmU6IHtcblx0XHRcdHBhdHRlcm46IHNpbXBsZV9mb3JtKC9kZWNsYXJlLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXHRcdGludGVyYWN0aXZlOiB7XG5cdFx0XHRwYXR0ZXJuOiBzaW1wbGVfZm9ybSgvaW50ZXJhY3RpdmUvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cdFx0Ym9vbGVhbjoge1xuXHRcdFx0cGF0dGVybjogcHJpbWl0aXZlKC9uaWx8dC8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdG51bWJlcjoge1xuXHRcdFx0cGF0dGVybjogcHJpbWl0aXZlKC9bLStdP1xcZCsoPzpcXC5cXGQqKT8vLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHRkZWZ2YXI6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChwYXIgKyAnZGVmKD86Y29uc3R8Y3VzdG9tfGdyb3VwfHZhcilcXFxccysnICsgc3ltYm9sKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0a2V5d29yZDogL15kZWZbYS16XSsvLFxuXHRcdFx0XHR2YXJpYWJsZTogUmVnRXhwKHN5bWJvbClcblx0XHRcdH1cblx0XHR9LFxuXHRcdGRlZnVuOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAocGFyICsgLyg/OmNsLSk/KD86ZGVmbWFjcm98ZGVmdW5cXCo/KVxccysvLnNvdXJjZSArIHN5bWJvbCArIC9cXHMrXFwoLy5zb3VyY2UgKyBuZXN0ZWRQYXIgKyAvXFwpLy5zb3VyY2UpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRrZXl3b3JkOiAvXig/OmNsLSk/ZGVmXFxTKy8sXG5cdFx0XHRcdC8vIFNlZSBiZWxvdywgdGhpcyBwcm9wZXJ0eSBuZWVkcyB0byBiZSBkZWZpbmVkIGxhdGVyIHNvIHRoYXQgaXQgY2FuXG5cdFx0XHRcdC8vIHJlZmVyZW5jZSB0aGUgbGFuZ3VhZ2Ugb2JqZWN0LlxuXHRcdFx0XHRhcmd1bWVudHM6IG51bGwsXG5cdFx0XHRcdGZ1bmN0aW9uOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCcoXlxcXFxzKScgKyBzeW1ib2wpLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0cHVuY3R1YXRpb246IC9bKCldL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0bGFtYmRhOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAocGFyICsgJ2xhbWJkYVxcXFxzK1xcXFwoXFxcXHMqKD86Jj8nICsgc3ltYm9sICsgJyg/OlxcXFxzKyY/JyArIHN5bWJvbCArICcpKlxcXFxzKik/XFxcXCknKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0a2V5d29yZDogL15sYW1iZGEvLFxuXHRcdFx0XHQvLyBTZWUgYmVsb3csIHRoaXMgcHJvcGVydHkgbmVlZHMgdG8gYmUgZGVmaW5lZCBsYXRlciBzbyB0aGF0IGl0IGNhblxuXHRcdFx0XHQvLyByZWZlcmVuY2UgdGhlIGxhbmd1YWdlIG9iamVjdC5cblx0XHRcdFx0YXJndW1lbnRzOiBudWxsLFxuXHRcdFx0XHRwdW5jdHVhdGlvbjogL1soKV0vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHRjYXI6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChwYXIgKyBzeW1ib2wpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0cHVuY3R1YXRpb246IFtcblx0XHRcdC8vIG9wZW4gcGFyZW4sIGJyYWNrZXRzLCBhbmQgY2xvc2UgcGFyZW5cblx0XHRcdC8oPzpbJ2AsXT9cXCh8WylcXFtcXF1dKS8sXG5cdFx0XHQvLyBjb25zXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxzKVxcLig/PVxccykvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdF1cblx0fTtcblxuXHR2YXIgYXJnID0ge1xuXHRcdCdsaXNwLW1hcmtlcic6IFJlZ0V4cChtYXJrZXIpLFxuXHRcdCd2YXJmb3JtJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC9cXCgvLnNvdXJjZSArIHN5bWJvbCArIC9cXHMrKD89XFxTKS8uc291cmNlICsgbmVzdGVkUGFyICsgL1xcKS8uc291cmNlKSxcblx0XHRcdGluc2lkZTogbGFuZ3VhZ2Vcblx0XHR9LFxuXHRcdCdhcmd1bWVudCc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKF58W1xccyhdKS8uc291cmNlICsgc3ltYm9sKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdH0sXG5cdFx0cmVzdDogbGFuZ3VhZ2Vcblx0fTtcblxuXHR2YXIgZm9ybXMgPSAnXFxcXFMrKD86XFxcXHMrXFxcXFMrKSonO1xuXG5cdHZhciBhcmdsaXN0ID0ge1xuXHRcdHBhdHRlcm46IFJlZ0V4cChwYXIgKyBuZXN0ZWRQYXIgKyBlbmRwYXIpLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncmVzdC12YXJzJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJyYoPzpib2R5fHJlc3QpXFxcXHMrJyArIGZvcm1zKSxcblx0XHRcdFx0aW5zaWRlOiBhcmdcblx0XHRcdH0sXG5cdFx0XHQnb3RoZXItbWFya2VyLXZhcnMnOiB7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnJig/OmF1eHxvcHRpb25hbClcXFxccysnICsgZm9ybXMpLFxuXHRcdFx0XHRpbnNpZGU6IGFyZ1xuXHRcdFx0fSxcblx0XHRcdGtleXM6IHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCcma2V5XFxcXHMrJyArIGZvcm1zICsgJyg/OlxcXFxzKyZhbGxvdy1vdGhlci1rZXlzKT8nKSxcblx0XHRcdFx0aW5zaWRlOiBhcmdcblx0XHRcdH0sXG5cdFx0XHRhcmd1bWVudDoge1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoc3ltYm9sKSxcblx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdH0sXG5cdFx0XHRwdW5jdHVhdGlvbjogL1soKV0vXG5cdFx0fVxuXHR9O1xuXG5cdGxhbmd1YWdlWydsYW1iZGEnXS5pbnNpZGUuYXJndW1lbnRzID0gYXJnbGlzdDtcblx0bGFuZ3VhZ2VbJ2RlZnVuJ10uaW5zaWRlLmFyZ3VtZW50cyA9IFByaXNtLnV0aWwuY2xvbmUoYXJnbGlzdCk7XG5cdGxhbmd1YWdlWydkZWZ1biddLmluc2lkZS5hcmd1bWVudHMuaW5zaWRlLnN1Ymxpc3QgPSBhcmdsaXN0O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5saXNwID0gbGFuZ3VhZ2U7XG5cdFByaXNtLmxhbmd1YWdlcy5lbGlzcCA9IGxhbmd1YWdlO1xuXHRQcmlzbS5sYW5ndWFnZXMuZW1hY3MgPSBsYW5ndWFnZTtcblx0UHJpc20ubGFuZ3VhZ2VzWydlbWFjcy1saXNwJ10gPSBsYW5ndWFnZTtcbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmxpdmVzY3JpcHQgPSB7XG5cdCdjb21tZW50JzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pIy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdpbnRlcnBvbGF0ZWQtc3RyaW5nJzoge1xuXHRcdC8qIExvb2stYmVoaW5kIGFuZCBsb29rLWFoZWFkIHByZXZlbnRzIHdyb25nIGJlaGF2aW9yIG9mIHRoZSBncmVlZHkgcGF0dGVyblxuXHRcdCogZm9yY2luZyBpdCB0byBtYXRjaCBcIlwiXCItcXVvdGVkIHN0cmluZyB3aGVuIGl0IHdvdWxkIG90aGVyd2lzZSBtYXRjaCBcIi1xdW90ZWQgZmlyc3QuICovXG5cdFx0cGF0dGVybjogLyhefFteXCJdKShcIlwiXCJ8XCIpKD86XFxcXFtcXHNcXFNdfCg/IVxcMilbXlxcXFxdKSpcXDIoPyFcIikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkjW2Etel9dKD86LT9bYS16XXxbXFxkX10pKi9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSNcXHtbXn1dK1xcfS9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eI1xce3xcXH0kLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIFNlZSByZXN0IGJlbG93XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH0sXG5cdCdzdHJpbmcnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLygnJyd8JykoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pKlxcMS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC88XFxbW1xcc1xcU10qP1xcXT4vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQvXFxcXFteXFxzLDtcXF0pfV0rL1xuXHRdLFxuXHQncmVnZXgnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcL1xcLyg/OlxcW1teXFxyXFxuXFxdXSpcXF18XFxcXC58KD8hXFwvXFwvKVteXFxcXFxcW10pK1xcL1xcL1tnaW15dV17MCw1fS8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pIy4qLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXC8oPzpcXFtbXlxcclxcblxcXV0qXFxdfFxcXFwufFteL1xcXFxcXHJcXG5cXFtdKStcXC9bZ2lteXVdezAsNX0vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQna2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58KD8hLSkuKVxcYig/OmJyZWFrfGNhc2V8Y2F0Y2h8Y2xhc3N8Y29uc3R8Y29udGludWV8ZGVmYXVsdHxkb3xlbHNlfGV4dGVuZHN8ZmFsbHRocm91Z2h8ZmluYWxseXxmb3IoPzogZXZlcik/fGZ1bmN0aW9ufGlmfGltcGxlbWVudHN8aXR8bGV0fGxvb3B8bmV3fG51bGx8b3RoZXJ3aXNlfG93bnxyZXR1cm58c3VwZXJ8c3dpdGNofHRoYXR8dGhlbnx0aGlzfHRocm93fHRyeXx1bmxlc3N8dW50aWx8dmFyfHZvaWR8d2hlbnx3aGlsZXx5aWVsZCkoPyEtKVxcYi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2tleXdvcmQtb3BlcmF0b3InOiB7XG5cdFx0cGF0dGVybjogLyhefFteLV0pXFxiKD86KD86ZGVsZXRlfHJlcXVpcmV8dHlwZW9mKSF8KD86YW5kfGJ5fGRlbGV0ZXxleHBvcnR8ZnJvbXxpbXBvcnQoPzogYWxsKT98aW58aW5zdGFuY2VvZnxpcyg/OiBub3R8bnQpP3xub3R8b2Z8b3J8dGlsfHRvfHR5cGVvZnx3aXRofHhvcikoPyEtKVxcYikvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH0sXG5cdCdib29sZWFuJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi1dKVxcYig/OmZhbHNlfG5vfG9mZnxvbnx0cnVlfHllcykoPyEtKVxcYi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2FyZ3VtZW50Jzoge1xuXHRcdC8vIERvbid0IG1hdGNoIC4mLiBub3IgJiZcblx0XHRwYXR0ZXJuOiAvKF58KD8hXFwuJlxcLilbXiZdKSYoPyEmKVxcZCovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdudW1iZXInOiAvXFxiKD86XFxkK35bXFxkYS16XSt8XFxkW1xcZF9dKig/OlxcLlxcZFtcXGRfXSopPyg/OlthLXpdXFx3Kik/KS9pLFxuXHQnaWRlbnRpZmllcic6IC9bYS16X10oPzotP1thLXpdfFtcXGRfXSkqL2ksXG5cdCdvcGVyYXRvcic6IFtcblx0XHQvLyBTcGFjZWQgLlxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oIClcXC4oPz0gKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvLyBGdWxsIGxpc3QsIGluIG9yZGVyOlxuXHRcdC8vIC49IC5+IC4uIC4uLlxuXHRcdC8vIC4mLiAuXi4gLjw8LiAuPj4uIC4+Pj4uXG5cdFx0Ly8gOj0gOjogOjo9XG5cdFx0Ly8gJiZcblx0XHQvLyB8fCB8PlxuXHRcdC8vIDwgPDwgPDw8IDw8PDxcblx0XHQvLyA8LSA8LS0gPC0hIDwtLSFcblx0XHQvLyA8fiA8fn4gPH4hIDx+fiFcblx0XHQvLyA8fCA8PSA8P1xuXHRcdC8vID4gPj4gPj0gPj9cblx0XHQvLyAtIC0tIC0+IC0tPlxuXHRcdC8vICsgKytcblx0XHQvLyBAIEBAXG5cdFx0Ly8gJSAlJVxuXHRcdC8vICogKipcblx0XHQvLyAhICE9ICF+PVxuXHRcdC8vICF+PiAhfn4+XG5cdFx0Ly8gIS0+ICEtLT5cblx0XHQvLyB+IH4+IH5+PiB+PVxuXHRcdC8vID0gPT1cblx0XHQvLyBeIF5eXG5cdFx0Ly8gLyA/XG5cdFx0L1xcLig/Ols9fl18XFwuXFwuPyl8XFwuKD86WyZ8Xl18PDx8Pj4+PylcXC58Oig/Oj18Oj0/KXwmJnxcXHxbfD5dfDwoPzo8PD88P3wtLT8hP3x+fj8hP3xbfD0/XSk/fD5bPj0/XT98LSg/Oi0+P3w+KT98XFwrXFwrP3xAQD98JSU/fFxcKlxcKj98ISg/On4/PXwtLT8+fH4/fj4pP3x+KD86fj8+fD0pP3w9PT98XFxeXFxeP3xbXFwvP10vXG5cdF0sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCl7fVxcW1xcXXwuLDo7YF0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubGl2ZXNjcmlwdFsnaW50ZXJwb2xhdGVkLXN0cmluZyddLmluc2lkZVsnaW50ZXJwb2xhdGlvbiddLmluc2lkZS5yZXN0ID0gUHJpc20ubGFuZ3VhZ2VzLmxpdmVzY3JpcHQ7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0UHJpc20ubGFuZ3VhZ2VzLmxsdm0gPSB7XG5cdFx0J2NvbW1lbnQnOiAvOy4qLyxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiW15cIl0qXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdH0sXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdCd2YXJpYWJsZSc6IC9bJUAhI10oPzooPyFcXGQpKD86Wy0kLlxcd118XFxcXFthLWZcXGRdezJ9KSt8XFxkKykvaSxcblx0XHQnbGFiZWwnOiAvKD8hXFxkKSg/OlstJC5cXHddfFxcXFxbYS1mXFxkXXsyfSkrOi9pLFxuXHRcdCd0eXBlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmRvdWJsZXxmbG9hdHxmcDEyOHxoYWxmfGlbMS05XVxcZCp8bGFiZWx8bWV0YWRhdGF8cHBjX2ZwMTI4fHRva2VufHZvaWR8eDg2X2ZwODB8eDg2X21teClcXGIvLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJyxcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogL1xcYlthLXpfXVthLXpfMC05XSpcXGIvLFxuXHRcdCdudW1iZXInOiAvWystXT9cXGJcXGQrKD86XFwuXFxkKyk/KD86W2VFXVsrLV0/XFxkKyk/XFxifFxcYjB4W1xcZEEtRmEtZl0rXFxifFxcYjB4S1tcXGRBLUZhLWZdezIwfVxcYnxcXGIweFtNTF1bXFxkQS1GYS1mXXszMn1cXGJ8XFxiMHhIW1xcZEEtRmEtZl17NH1cXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC4hKj08Pl0vLFxuXHR9O1xufShQcmlzbSkpO1xuXG4vLyBUaGlzIGlzIGEgbGFuZ3VhZ2UgZGVmaW5pdGlvbiBmb3IgZ2VuZXJpYyBsb2cgZmlsZXMuXG4vLyBTaW5jZSB0aGVyZSBpcyBubyBvbmUgbG9nIGZvcm1hdCwgdGhpcyBsYW5ndWFnZSBkZWZpbml0aW9uIGhhcyB0byBzdXBwb3J0IGFsbCBmb3JtYXRzIHRvIHNvbWUgZGVncmVlLlxuLy9cbi8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9NVERMOS92aW0tbG9nLWhpZ2hsaWdodGluZ1xuXG5QcmlzbS5sYW5ndWFnZXMubG9nID0ge1xuXHQnc3RyaW5nJzoge1xuXHRcdC8vIFNpbmdsZS1xdW90ZWQgc3RyaW5ncyBtdXN0IG5vdCBiZSBjb25mdXNlZCB3aXRoIHBsYWluIHRleHQuIEUuZy4gQ2FuJ3QgaXNuJ3QgU3VzYW4ncyBDaHJpcycgdG95XG5cdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxcXHJcXG5dfFxcXFwuKSpcInwnKD8hW3N0XSB8IFxcdykoPzpbXidcXFxcXFxyXFxuXXxcXFxcLikqJy8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHR9LFxuXG5cdCdleGNlcHRpb24nOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFx3Ll0pW2Etel1bXFx3Ll0qKD86RXJyb3J8RXhjZXB0aW9uKTouKig/Oig/Olxcclxcbj98XFxuKVsgXFx0XSooPzphdFsgXFx0XS4rfFxcLnszfS4qfENhdXNlZCBieTouKikpKyg/Oig/Olxcclxcbj98XFxuKVsgXFx0XSpcXC5cXC5cXC4gLiopPy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6IFsnamF2YXN0YWNrdHJhY2UnLCAnbGFuZ3VhZ2UtamF2YXN0YWNrdHJhY2UnXSxcblx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlc1snamF2YXN0YWNrdHJhY2UnXSB8fCB7XG5cdFx0XHQna2V5d29yZCc6IC9cXGJhdFxcYi8sXG5cdFx0XHQnZnVuY3Rpb24nOiAvW2Etel9dW1xcdyRdKig/PVxcKCkvLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1suOigpXS9cblx0XHR9XG5cdH0sXG5cblx0J2xldmVsJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpBTEVSVHxDUklUfENSSVRJQ0FMfEVNRVJHfEVNRVJHRU5DWXxFUlJ8RVJST1J8RkFJTFVSRXxGQVRBTHxTRVZFUkUpXFxiLyxcblx0XHRcdGFsaWFzOiBbJ2Vycm9yJywgJ2ltcG9ydGFudCddXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86V0FSTnxXQVJOSU5HfFdSTilcXGIvLFxuXHRcdFx0YWxpYXM6IFsnd2FybmluZycsICdpbXBvcnRhbnQnXVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYig/OkRJU1BMQVl8SU5GfElORk98Tk9USUNFfFNUQVRVUylcXGIvLFxuXHRcdFx0YWxpYXM6IFsnaW5mbycsICdrZXl3b3JkJ11cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzpEQkd8REVCVUd8RklORSlcXGIvLFxuXHRcdFx0YWxpYXM6IFsnZGVidWcnLCAna2V5d29yZCddXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86RklORVJ8RklORVNUfFRSQUNFfFRSQ3xWRVJCT1NFfFZSQilcXGIvLFxuXHRcdFx0YWxpYXM6IFsndHJhY2UnLCAnY29tbWVudCddXG5cdFx0fVxuXHRdLFxuXG5cdCdwcm9wZXJ0eSc6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58W1xcXXxdKVsgXFx0XSopW2Etel9dKD86W1xcdy1dfFxcYlxcL1xcYikqKD86Wy4gXVxcKD9cXHcoPzpbXFx3LV18XFxiXFwvXFxiKSpcXCk/KSo6KD89XFxzKS9pbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cblx0J3NlcGFyYXRvcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14tK10pLXszLH18PXszLH18XFwqezMsfXwtIC0gL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdH0sXG5cblx0J3VybCc6IC9cXGIoPzpmaWxlfGZ0cHxodHRwcz8pOlxcL1xcL1teXFxzfCw7J1wiXSpbXlxcc3wsOydcIj4uXS8sXG5cdCdlbWFpbCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58XFxzKVstXFx3Ky5dK0BbYS16XVthLXowLTktXSooPzpcXC5bYS16XVthLXowLTktXSopKyg/PVxccykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICd1cmwnXG5cdH0sXG5cblx0J2lwLWFkZHJlc3MnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OlxcZHsxLDN9KD86XFwuXFxkezEsM30pezN9KVxcYi8sXG5cdFx0YWxpYXM6ICdjb25zdGFudCdcblx0fSxcblx0J21hYy1hZGRyZXNzJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbYS1mMC05XXsyfSg/OjpbYS1mMC05XXsyfSl7NX1cXGIvaSxcblx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHR9LFxuXHQnZG9tYWluJzoge1xuXHRcdHBhdHRlcm46IC8oXnxcXHMpW2Etel1bYS16MC05LV0qKD86XFwuW2Etel1bYS16MC05LV0qKSpcXC5bYS16XVthLXowLTktXSsoPz1cXHMpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdH0sXG5cblx0J3V1aWQnOiB7XG5cdFx0cGF0dGVybjogL1xcYlswLTlhLWZdezh9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezR9LVswLTlhLWZdezEyfVxcYi9pLFxuXHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdH0sXG5cdCdoYXNoJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpbYS1mMC05XXszMn0pezEsMn1cXGIvaSxcblx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHR9LFxuXG5cdCdmaWxlLXBhdGgnOiB7XG5cdFx0cGF0dGVybjogL1xcYlthLXpdOltcXFxcL11bXlxcc3wsOzooKXt9XFxbXFxdXCInXSt8KF58W1xcczpcXFtcXF0oPnxdKVxcLnswLDJ9XFwvXFx3W15cXHN8LDs6KCl7fVxcW1xcXVwiJ10qL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnXG5cdH0sXG5cblx0J2RhdGUnOiB7XG5cdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0L1xcYlxcZHs0fVstL11cXGR7Mn1bLS9dXFxkezJ9KD86VCg/PVxcZHsxLDJ9Oil8KD89XFxzXFxkezEsMn06KSkvLnNvdXJjZSArXG5cdFx0XHQnfCcgK1xuXHRcdFx0L1xcYlxcZHsxLDR9Wy0vIF0oPzpcXGR7MSwyfXxBcHJ8QXVnfERlY3xGZWJ8SmFufEp1bHxKdW58TWFyfE1heXxOb3Z8T2N0fFNlcClbLS8gXVxcZHsyLDR9VD9cXGIvLnNvdXJjZSArXG5cdFx0XHQnfCcgK1xuXHRcdFx0L1xcYig/Oig/OkZyaXxNb258U2F0fFN1bnxUaHV8VHVlfFdlZCkoPzpcXHN7MSwyfSg/OkFwcnxBdWd8RGVjfEZlYnxKYW58SnVsfEp1bnxNYXJ8TWF5fE5vdnxPY3R8U2VwKSk/fEFwcnxBdWd8RGVjfEZlYnxKYW58SnVsfEp1bnxNYXJ8TWF5fE5vdnxPY3R8U2VwKVxcc3sxLDJ9XFxkezEsMn1cXGIvLnNvdXJjZSxcblx0XHRcdCdpJ1xuXHRcdCksXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCd0aW1lJzoge1xuXHRcdHBhdHRlcm46IC9cXGJcXGR7MSwyfTpcXGR7MSwyfTpcXGR7MSwyfSg/OlsuLDpdXFxkKyk/KD86XFxzP1srLV1cXGR7Mn06P1xcZHsyfXxaKT9cXGIvLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG51bGx8dHJ1ZSlcXGIvaSxcblx0J251bWJlcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14uXFx3XSkoPzoweFthLWYwLTldK3wwb1swLTddK3wwYlswMV0rfHY/XFxkW1xcZGEtZl0qKD86XFwuXFxkKykqKD86ZVsrLV0/XFxkKyk/W2Etel17MCwzfVxcYilcXGIoPyFcXC5cXHcpL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXG5cdCdvcGVyYXRvcic6IC9bOzo/PD0+fi9AISQlJitcXC18Xigpe30qI10vLFxuXHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXS4sXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5sb2xjb2RlID0ge1xuXHQnY29tbWVudCc6IFtcblx0XHQvXFxiT0JUV1xcc1tcXHNcXFNdKj9cXHNUTERSXFxiLyxcblx0XHQvXFxiQlRXLisvXG5cdF0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86Oi58W15cIjpdKSpcIi8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndmFyaWFibGUnOiAvOlxce1tefV0rXFx9Lyxcblx0XHRcdCdzeW1ib2wnOiBbXG5cdFx0XHRcdC86XFwoW2EtZlxcZF0rXFwpL2ksXG5cdFx0XHRcdC86XFxbW15cXF1dK1xcXS8sXG5cdFx0XHRcdC86Wyk+b1wiOl0vXG5cdFx0XHRdXG5cdFx0fSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J251bWJlcic6IC8oPzpcXEItKT8oPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspLyxcblx0J3N5bWJvbCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/OkEgKT8oPzpCVUtLSVR8Tk9PQnxOVU1CQVJ8TlVNQlJ8VFJPT0Z8WUFSTikoPz1cXHN8LHwkKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdrZXl3b3JkJzogL0EoPz1cXHMpL1xuXHRcdH1cblx0fSxcblx0J2xhYmVsJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxcXHMpKD86SU0gSU4gWVJ8SU0gT1VUVEEgWVIpIClbYS16QS1aXVxcdyovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnXG5cdH0sXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxzKSg/OkhPVyBJWiBJfEkgSVp8SVopIClbYS16QS1aXVxcdyovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFxccykoPzpBTnxGT1VORCBZUnxHSU1NRUh8R1RGT3xIQUl8SEFTIEF8SE9XIElaIEl8SSBIQVMgQXxJIElafElGIFUgU0FZIFNPfElNIElOIFlSfElNIE9VVFRBIFlSfElTIE5PVyg/OiBBKT98SVRaKD86IEEpP3xJWnxLVEhYfEtUSFhCWUV8TElFSyg/OiBBKT98TUFFS3xNRUJCRXxNS0FZfE5FUkZJTnxOTyBXQUl8TyBIQUkgSU18TyBSTFlcXD98T0lDfE9NR3xPTUdXVEZ8UnxTTU9PU0h8U1JTfFRJTHxVUFBJTnxWSVNJQkxFfFdJTEV8V1RGXFw/fFlBIFJMWXxZUikoPz1cXHN8LHwkKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvJ1ooPz1cXHN8LHwkKS9cblx0XSxcblx0J2Jvb2xlYW4nOiB7XG5cdFx0cGF0dGVybjogLyhefFxccykoPzpGQUlMfFdJTikoPz1cXHN8LHwkKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQndmFyaWFibGUnOiB7XG5cdFx0cGF0dGVybjogLyhefFxccylJVCg/PVxcc3wsfCQpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdvcGVyYXRvcic6IHtcblx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/Ok5PVHxCT1RIIFNBRU18RElGRlJJTlR8KD86QUxMfEFOWXxCSUdHUnxCT1RIfERJRkZ8RUlUSEVSfE1PRHxQUk9EVUtUfFFVT1NIVU5UfFNNQUxMUnxTVU18V09OKSBPRikoPz1cXHN8LHwkKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvXFwuezN9fFx1MjAyNnwsfCEvXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubWFnbWEgPSB7XG5cdCdvdXRwdXQnOiB7XG5cdFx0cGF0dGVybjogL14oPi4qKD86XFxyKD86XFxufCg/IVxcbikpfFxcbikpKD8hPikoPzouK3woPzpcXHIoPzpcXG58KD8hXFxuKSl8XFxuKSg/IT4pLiopKD86KD86XFxyKD86XFxufCg/IVxcbikpfFxcbikoPyE+KS4qKSovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXCJdKVwiKD86W15cXHJcXG5cXFxcXCJdfFxcXFwuKSpcIi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQvLyBodHRwOi8vbWFnbWEubWF0aHMudXN5ZC5lZHUuYXUvbWFnbWEvaGFuZGJvb2svdGV4dC84MlxuXHQna2V5d29yZCc6IC9cXGIoPzpffGFkanxhbmR8YXNzZXJ0fGFzc2VydDJ8YXNzZXJ0M3xhc3NpZ25lZHxicmVha3xieXxjYXNlfGNhdHxjYXRjaHxjbGVhcnxjbXBlcXxjbXBuZXxjb250aW51ZXxkZWNsYXJlfGRlZmF1bHR8ZGVsZXRlfGRpZmZ8ZGl2fGRvfGVsaWZ8ZWxzZXxlbmR8ZXF8ZXJyb3J8ZXZhbHxleGlzdHN8ZXhpdHxmb3J8Zm9yYWxsfGZvcndhcmR8ZnByaW50ZnxmcmVlemV8ZnVuY3Rpb258Z2V8Z3R8aWZ8aWxvYWR8aW1wb3J0fGlufGludHJpbnNpY3xpc3xqb2lufGxlfGxvYWR8bG9jYWx8bHR8bWVldHxtb2R8bmV8bm90fG5vdGFkanxub3Rpbnxub3RzdWJzZXR8b3J8cHJpbnR8cHJpbnRmfHByb2NlZHVyZXxxdWl0fHJhbmRvbXxyZWFkfHJlYWRpfHJlcGVhdHxyZXF1aXJlfHJlcXVpcmVnZXxyZXF1aXJlcmFuZ2V8cmVzdG9yZXxyZXR1cm58c2F2ZXxzZGlmZnxzZWxlY3R8c3Vic2V0fHRoZW58dGltZXx0b3x0cnl8dW50aWx8dnByaW50fHZwcmludGZ8dnRpbWV8d2hlbnx3aGVyZXx3aGlsZXx4b3IpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXG5cdCdnZW5lcmF0b3InOiB7XG5cdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdyooPz1cXHMqPCkvaSxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH0sXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdy5dfFxcLlxcLikoPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86W2VFXVsrLV0/XFxkKyk/KD86X1thLXpdPyk/KD89JHxbXlxcdy5dfFxcLlxcLikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblxuXHQnb3BlcmF0b3InOiAvLT58Wy0rKi9efiF8Iz1dfDo9fFxcLlxcLi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKClbXFxde308Piw7LjpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm1ha2VmaWxlID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkjKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cXFxcXFxyXFxuXSkqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInXSkoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnYnVpbHRpbi10YXJnZXQnOiB7XG5cdFx0cGF0dGVybjogL1xcLltBLVpdW146Iz1cXHNdKyg/PVxccyo6KD8hPSkpLyxcblx0XHRhbGlhczogJ2J1aWx0aW4nXG5cdH0sXG5cblx0J3RhcmdldCc6IHtcblx0XHRwYXR0ZXJuOiAvXig/OlteOj1cXHNdfFsgXFx0XSsoPyFbXFxzOl0pKSsoPz1cXHMqOig/IT0pKS9tLFxuXHRcdGFsaWFzOiAnc3ltYm9sJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd2YXJpYWJsZSc6IC9cXCQrKD86KD8hXFwkKVteKCl7fTojPVxcc10rfCg/PVsoe10pKS9cblx0XHR9XG5cdH0sXG5cdCd2YXJpYWJsZSc6IC9cXCQrKD86KD8hXFwkKVteKCl7fTojPVxcc10rfFxcKFtAKiU8Xis/XVtERl1cXCl8KD89Wyh7XSkpLyxcblxuXHQvLyBEaXJlY3RpdmVzXG5cdCdrZXl3b3JkJzogLy1pbmNsdWRlXFxifFxcYig/OmRlZmluZXxlbHNlfGVuZGVmfGVuZGlmfGV4cG9ydHxpZm4/ZGVmfGlmbj9lcXxpbmNsdWRlfG92ZXJyaWRlfHByaXZhdGV8c2luY2x1ZGV8dW5kZWZpbmV8dW5leHBvcnR8dnBhdGgpXFxiLyxcblxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLyhcXCgpKD86YWJzcGF0aHxhZGRzdWZmaXh8YW5kfGJhc2VuYW1lfGNhbGx8ZGlyfGVycm9yfGV2YWx8ZmlsZXxmaWx0ZXIoPzotb3V0KT98ZmluZHN0cmluZ3xmaXJzdHdvcmR8Zmxhdm9yfGZvcmVhY2h8Z3VpbGV8aWZ8aW5mb3xqb2lufGxhc3R3b3JkfGxvYWR8bm90ZGlyfG9yfG9yaWdpbnxwYXRzdWJzdHxyZWFscGF0aHxzaGVsbHxzb3J0fHN0cmlwfHN1YnN0fHN1ZmZpeHx2YWx1ZXx3YXJuaW5nfHdpbGRjYXJkfHdvcmQoPzpsaXN0fHMpPykoPz1bIFxcdF0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdvcGVyYXRvcic6IC8oPzo6OnxbPzorIV0pPz18W3xAXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bOjsoKXt9XS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHQvLyBBbGxvdyBvbmx5IG9uZSBsaW5lIGJyZWFrXG5cdHZhciBpbm5lciA9IC8oPzpcXFxcLnxbXlxcXFxcXG5cXHJdfCg/OlxcbnxcXHJcXG4/KSg/IVtcXHJcXG5dKSkvLnNvdXJjZTtcblxuXHQvKipcblx0ICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBib2xkIG9yIGl0YWxpYyBwYXR0ZXJuLlxuXHQgKlxuXHQgKiBUaGlzIGFsc28gYWRkcyBhIGxvb2tiZWhpbmQgZ3JvdXAgdG8gdGhlIGdpdmVuIHBhdHRlcm4gdG8gZW5zdXJlIHRoYXQgdGhlIHBhdHRlcm4gaXMgbm90IGJhY2tzbGFzaC1lc2NhcGVkLlxuXHQgKlxuXHQgKiBfTm90ZTpfIEtlZXAgaW4gbWluZCB0aGF0IHRoaXMgYWRkcyBhIGNhcHR1cmluZyBncm91cC5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cblx0ICogQHJldHVybnMge1JlZ0V4cH1cblx0ICovXG5cdGZ1bmN0aW9uIGNyZWF0ZUlubGluZShwYXR0ZXJuKSB7XG5cdFx0cGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSgvPGlubmVyPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBpbm5lcjsgfSk7XG5cdFx0cmV0dXJuIFJlZ0V4cCgvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopLy5zb3VyY2UgKyAnKD86JyArIHBhdHRlcm4gKyAnKScpO1xuXHR9XG5cblxuXHR2YXIgdGFibGVDZWxsID0gLyg/OlxcXFwufGBgKD86W15gXFxyXFxuXXxgKD8hYCkpK2BgfGBbXmBcXHJcXG5dK2B8W15cXFxcfFxcclxcbmBdKSsvLnNvdXJjZTtcblx0dmFyIHRhYmxlUm93ID0gL1xcfD9fXyg/OlxcfF9fKStcXHw/KD86KD86XFxufFxcclxcbj8pfCg/IVtcXHNcXFNdKSkvLnNvdXJjZS5yZXBsYWNlKC9fXy9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0YWJsZUNlbGw7IH0pO1xuXHR2YXIgdGFibGVMaW5lID0gL1xcfD9bIFxcdF0qOj8tezMsfTo/WyBcXHRdKig/OlxcfFsgXFx0XSo6Py17Myx9Oj9bIFxcdF0qKStcXHw/KD86XFxufFxcclxcbj8pLy5zb3VyY2U7XG5cblxuXHRQcmlzbS5sYW5ndWFnZXMubWFya2Rvd24gPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdtYXJrdXAnLCB7fSk7XG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ21hcmtkb3duJywgJ3Byb2xvZycsIHtcblx0XHQnZnJvbnQtbWF0dGVyLWJsb2NrJzoge1xuXHRcdFx0cGF0dGVybjogLyheKD86XFxzKltcXHJcXG5dKT8pLS0tKD8hLilbXFxzXFxTXSo/W1xcclxcbl0tLS0oPyEuKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eLS0tfC0tLSQvLFxuXHRcdFx0XHQnZnJvbnQtbWF0dGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXFMrKD86XFxzK1xcUyspKi8sXG5cdFx0XHRcdFx0YWxpYXM6IFsneWFtbCcsICdsYW5ndWFnZS15YW1sJ10sXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMueWFtbFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnYmxvY2txdW90ZSc6IHtcblx0XHRcdC8vID4gLi4uXG5cdFx0XHRwYXR0ZXJuOiAvXj4oPzpbXFx0IF0qPikqL20sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J3RhYmxlJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCdeJyArIHRhYmxlUm93ICsgdGFibGVMaW5lICsgJyg/OicgKyB0YWJsZVJvdyArICcpKicsICdtJyksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3RhYmxlLWRhdGEtcm93cyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJ14oJyArIHRhYmxlUm93ICsgdGFibGVMaW5lICsgJykoPzonICsgdGFibGVSb3cgKyAnKSokJyksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCd0YWJsZS1kYXRhJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAodGFibGVDZWxsKSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMubWFya2Rvd25cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFx8L1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J3RhYmxlLWxpbmUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCdeKCcgKyB0YWJsZVJvdyArICcpJyArIHRhYmxlTGluZSArICckJyksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXHx8Oj8tezMsfTo/L1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J3RhYmxlLWhlYWRlci1yb3cnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCdeJyArIHRhYmxlUm93ICsgJyQnKSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCd0YWJsZS1oZWFkZXInOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCh0YWJsZUNlbGwpLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ2ltcG9ydGFudCcsXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLm1hcmtkb3duXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcfC9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjb2RlJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBQcmVmaXhlZCBieSA0IHNwYWNlcyBvciAxIHRhYiBhbmQgcHJlY2VkZWQgYnkgYW4gZW1wdHkgbGluZVxuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxuKVsgXFx0XSpcXG58KD86XnxcXHJcXG4/KVsgXFx0XSpcXHJcXG4/KSg/OiB7NH18XFx0KS4rKD86KD86XFxufFxcclxcbj8pKD86IHs0fXxcXHQpLispKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGBgYG9wdGlvbmFsIGxhbmd1YWdlXG5cdFx0XHRcdC8vIGNvZGUgYmxvY2tcblx0XHRcdFx0Ly8gYGBgXG5cdFx0XHRcdHBhdHRlcm46IC9eYGBgW1xcc1xcU10qP15gYGAkL20sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2NvZGUtYmxvY2snOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXihgYGAuKig/OlxcbnxcXHJcXG4/KSlbXFxzXFxTXSs/KD89KD86XFxufFxcclxcbj8pXmBgYCQpL20sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnY29kZS1sYW5ndWFnZSc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eKGBgYCkuKy8sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvYGBgL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQndGl0bGUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIHRpdGxlIDFcblx0XHRcdFx0Ly8gPT09PT09PVxuXG5cdFx0XHRcdC8vIHRpdGxlIDJcblx0XHRcdFx0Ly8gLS0tLS0tLVxuXHRcdFx0XHRwYXR0ZXJuOiAvXFxTLiooPzpcXG58XFxyXFxuPykoPzo9PSt8LS0rKSg/PVsgXFx0XSokKS9tLFxuXHRcdFx0XHRhbGlhczogJ2ltcG9ydGFudCcsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdHB1bmN0dWF0aW9uOiAvPT0rJHwtLSskL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyAjIHRpdGxlIDFcblx0XHRcdFx0Ly8gIyMjIyMjIHRpdGxlIDZcblx0XHRcdFx0cGF0dGVybjogLyheXFxzKikjLisvbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRwdW5jdHVhdGlvbjogL14jK3wjKyQvXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdocic6IHtcblx0XHRcdC8vICoqKlxuXHRcdFx0Ly8gLS0tXG5cdFx0XHQvLyAqICogKlxuXHRcdFx0Ly8gLS0tLS0tLS0tLS1cblx0XHRcdHBhdHRlcm46IC8oXlxccyopKFsqLV0pKD86W1xcdCBdKlxcMil7Mix9KD89XFxzKiQpL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdsaXN0Jzoge1xuXHRcdFx0Ly8gKiBpdGVtXG5cdFx0XHQvLyArIGl0ZW1cblx0XHRcdC8vIC0gaXRlbVxuXHRcdFx0Ly8gMS4gaXRlbVxuXHRcdFx0cGF0dGVybjogLyheXFxzKikoPzpbKistXXxcXGQrXFwuKSg/PVtcXHQgXS4pL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCd1cmwtcmVmZXJlbmNlJzoge1xuXHRcdFx0Ly8gW2lkXTogaHR0cDovL2V4YW1wbGUuY29tIFwiT3B0aW9uYWwgdGl0bGVcIlxuXHRcdFx0Ly8gW2lkXTogaHR0cDovL2V4YW1wbGUuY29tICdPcHRpb25hbCB0aXRsZSdcblx0XHRcdC8vIFtpZF06IGh0dHA6Ly9leGFtcGxlLmNvbSAoT3B0aW9uYWwgdGl0bGUpXG5cdFx0XHQvLyBbaWRdOiA8aHR0cDovL2V4YW1wbGUuY29tPiBcIk9wdGlvbmFsIHRpdGxlXCJcblx0XHRcdHBhdHRlcm46IC8hP1xcW1teXFxdXStcXF06W1xcdCBdKyg/OlxcUyt8PCg/OlxcXFwufFtePlxcXFxdKSs+KSg/OltcXHQgXSsoPzpcIig/OlxcXFwufFteXCJcXFxcXSkqXCJ8Jyg/OlxcXFwufFteJ1xcXFxdKSonfFxcKCg/OlxcXFwufFteKVxcXFxdKSpcXCkpKT8vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXighP1xcWylbXlxcXV0rLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzdHJpbmcnOiAvKD86XCIoPzpcXFxcLnxbXlwiXFxcXF0pKlwifCcoPzpcXFxcLnxbXidcXFxcXSkqJ3xcXCgoPzpcXFxcLnxbXilcXFxcXSkqXFwpKSQvLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXltcXFtcXF0hOl18Wzw+XS9cblx0XHRcdH0sXG5cdFx0XHRhbGlhczogJ3VybCdcblx0XHR9LFxuXHRcdCdib2xkJzoge1xuXHRcdFx0Ly8gKipzdHJvbmcqKlxuXHRcdFx0Ly8gX19zdHJvbmdfX1xuXG5cdFx0XHQvLyBhbGxvdyBvbmUgbmVzdGVkIGluc3RhbmNlIG9mIGl0YWxpYyB0ZXh0IHVzaW5nIHRoZSBzYW1lIGRlbGltaXRlclxuXHRcdFx0cGF0dGVybjogY3JlYXRlSW5saW5lKC9cXGJfXyg/Oig/IV8pPGlubmVyPnxfKD86KD8hXyk8aW5uZXI+KStfKStfX1xcYnxcXCpcXCooPzooPyFcXCopPGlubmVyPnxcXCooPzooPyFcXCopPGlubmVyPikrXFwqKStcXCpcXCovLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb250ZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXi4uKVtcXHNcXFNdKyg/PS4uJCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7fSAvLyBzZWUgYmVsb3dcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcKlxcKnxfXy9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdpdGFsaWMnOiB7XG5cdFx0XHQvLyAqZW0qXG5cdFx0XHQvLyBfZW1fXG5cblx0XHRcdC8vIGFsbG93IG9uZSBuZXN0ZWQgaW5zdGFuY2Ugb2YgYm9sZCB0ZXh0IHVzaW5nIHRoZSBzYW1lIGRlbGltaXRlclxuXHRcdFx0cGF0dGVybjogY3JlYXRlSW5saW5lKC9cXGJfKD86KD8hXyk8aW5uZXI+fF9fKD86KD8hXyk8aW5uZXI+KStfXykrX1xcYnxcXCooPzooPyFcXCopPGlubmVyPnxcXCpcXCooPzooPyFcXCopPGlubmVyPikrXFwqXFwqKStcXCovLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb250ZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXi4pW1xcc1xcU10rKD89LiQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge30gLy8gc2VlIGJlbG93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKl9dL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3N0cmlrZSc6IHtcblx0XHRcdC8vIH5+c3RyaWtlIHRocm91Z2h+flxuXHRcdFx0Ly8gfnN0cmlrZX5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0XHRwYXR0ZXJuOiBjcmVhdGVJbmxpbmUoLyh+fj8pKD86KD8hfik8aW5uZXI+KStcXDIvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb250ZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXn5+PylbXFxzXFxTXSsoPz1cXDEkKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHt9IC8vIHNlZSBiZWxvd1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvfn4/L1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NvZGUtc25pcHBldCc6IHtcblx0XHRcdC8vIGBjb2RlYFxuXHRcdFx0Ly8gYGBjb2RlYGBcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxgXSkoPzpgYFteYFxcclxcbl0rKD86YFteYFxcclxcbl0rKSpgYCg/IWApfGBbXmBcXHJcXG5dK2AoPyFgKSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiBbJ2NvZGUnLCAna2V5d29yZCddXG5cdFx0fSxcblx0XHQndXJsJzoge1xuXHRcdFx0Ly8gW2V4YW1wbGVdKGh0dHA6Ly9leGFtcGxlLmNvbSBcIk9wdGlvbmFsIHRpdGxlXCIpXG5cdFx0XHQvLyBbZXhhbXBsZV1baWRdXG5cdFx0XHQvLyBbZXhhbXBsZV0gW2lkXVxuXHRcdFx0cGF0dGVybjogY3JlYXRlSW5saW5lKC8hP1xcWyg/Oig/IVxcXSk8aW5uZXI+KStcXF0oPzpcXChbXlxccyldKyg/OltcXHQgXStcIig/OlxcXFwufFteXCJcXFxcXSkqXCIpP1xcKXxbIFxcdF0/XFxbKD86KD8hXFxdKTxpbm5lcj4pK1xcXSkvLnNvdXJjZSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdvcGVyYXRvcic6IC9eIS8sXG5cdFx0XHRcdCdjb250ZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcWylbXlxcXV0rKD89XFxdKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHt9IC8vIHNlZSBiZWxvd1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheXFxdWyBcXHRdP1xcWylbXlxcXV0rKD89XFxdJCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J3VybCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXF1cXCgpW15cXHMpXSsvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0rKVwiKD86XFxcXC58W15cIlxcXFxdKSpcIig/PVxcKSQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdFsndXJsJywgJ2JvbGQnLCAnaXRhbGljJywgJ3N0cmlrZSddLmZvckVhY2goZnVuY3Rpb24gKHRva2VuKSB7XG5cdFx0Wyd1cmwnLCAnYm9sZCcsICdpdGFsaWMnLCAnc3RyaWtlJywgJ2NvZGUtc25pcHBldCddLmZvckVhY2goZnVuY3Rpb24gKGluc2lkZSkge1xuXHRcdFx0aWYgKHRva2VuICE9PSBpbnNpZGUpIHtcblx0XHRcdFx0UHJpc20ubGFuZ3VhZ2VzLm1hcmtkb3duW3Rva2VuXS5pbnNpZGUuY29udGVudC5pbnNpZGVbaW5zaWRlXSA9IFByaXNtLmxhbmd1YWdlcy5tYXJrZG93bltpbnNpZGVdO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdGlmIChlbnYubGFuZ3VhZ2UgIT09ICdtYXJrZG93bicgJiYgZW52Lmxhbmd1YWdlICE9PSAnbWQnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gd2Fsa1Rva2Vucyh0b2tlbnMpIHtcblx0XHRcdGlmICghdG9rZW5zIHx8IHR5cGVvZiB0b2tlbnMgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Zm9yICh2YXIgaSA9IDAsIGwgPSB0b2tlbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG5cdFx0XHRcdHZhciB0b2tlbiA9IHRva2Vuc1tpXTtcblxuXHRcdFx0XHRpZiAodG9rZW4udHlwZSAhPT0gJ2NvZGUnKSB7XG5cdFx0XHRcdFx0d2Fsa1Rva2Vucyh0b2tlbi5jb250ZW50KTtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8qXG5cdFx0XHRcdCAqIEFkZCB0aGUgY29ycmVjdCBgbGFuZ3VhZ2UteHh4eGAgY2xhc3MgdG8gdGhpcyBjb2RlIGJsb2NrLiBLZWVwIGluIG1pbmQgdGhhdCB0aGUgYGNvZGUtbGFuZ3VhZ2VgIHRva2VuXG5cdFx0XHRcdCAqIGlzIG9wdGlvbmFsLiBCdXQgdGhlIGdyYW1tYXIgaXMgZGVmaW5lZCBzbyB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGNhc2Ugd2UgaGF2ZSB0byBoYW5kbGU6XG5cdFx0XHRcdCAqXG5cdFx0XHRcdCAqIHRva2VuLmNvbnRlbnQgPSBbXG5cdFx0XHRcdCAqICAgICA8c3BhbiBjbGFzcz1cInB1bmN0dWF0aW9uXCI+YGBgPC9zcGFuPixcblx0XHRcdFx0ICogICAgIDxzcGFuIGNsYXNzPVwiY29kZS1sYW5ndWFnZVwiPnh4eHg8L3NwYW4+LFxuXHRcdFx0XHQgKiAgICAgJ1xcbicsIC8vIGV4YWN0bHkgb25lIG5ldyBsaW5lcyAoXFxyIG9yIFxcbiBvciBcXHJcXG4pXG5cdFx0XHRcdCAqICAgICA8c3BhbiBjbGFzcz1cImNvZGUtYmxvY2tcIj4uLi48L3NwYW4+LFxuXHRcdFx0XHQgKiAgICAgJ1xcbicsIC8vIGV4YWN0bHkgb25lIG5ldyBsaW5lcyBhZ2FpblxuXHRcdFx0XHQgKiAgICAgPHNwYW4gY2xhc3M9XCJwdW5jdHVhdGlvblwiPmBgYDwvc3Bhbj5cblx0XHRcdFx0ICogXTtcblx0XHRcdFx0ICovXG5cblx0XHRcdFx0dmFyIGNvZGVMYW5nID0gdG9rZW4uY29udGVudFsxXTtcblx0XHRcdFx0dmFyIGNvZGVCbG9jayA9IHRva2VuLmNvbnRlbnRbM107XG5cblx0XHRcdFx0aWYgKGNvZGVMYW5nICYmIGNvZGVCbG9jayAmJlxuXHRcdFx0XHRcdGNvZGVMYW5nLnR5cGUgPT09ICdjb2RlLWxhbmd1YWdlJyAmJiBjb2RlQmxvY2sudHlwZSA9PT0gJ2NvZGUtYmxvY2snICYmXG5cdFx0XHRcdFx0dHlwZW9mIGNvZGVMYW5nLmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG5cblx0XHRcdFx0XHQvLyB0aGlzIG1pZ2h0IGJlIGEgbGFuZ3VhZ2UgdGhhdCBQcmlzbSBkb2VzIG5vdCBzdXBwb3J0XG5cblx0XHRcdFx0XHQvLyBkbyBzb21lIHJlcGxhY2VtZW50cyB0byBzdXBwb3J0IEMrKywgQyMsIGFuZCBGI1xuXHRcdFx0XHRcdHZhciBsYW5nID0gY29kZUxhbmcuY29udGVudC5yZXBsYWNlKC9cXGIjL2csICdzaGFycCcpLnJlcGxhY2UoL1xcYlxcK1xcKy9nLCAncHAnKTtcblx0XHRcdFx0XHQvLyBvbmx5IHVzZSB0aGUgZmlyc3Qgd29yZFxuXHRcdFx0XHRcdGxhbmcgPSAoL1thLXpdW1xcdy1dKi9pLmV4ZWMobGFuZykgfHwgWycnXSlbMF0udG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHR2YXIgYWxpYXMgPSAnbGFuZ3VhZ2UtJyArIGxhbmc7XG5cblx0XHRcdFx0XHQvLyBhZGQgYWxpYXNcblx0XHRcdFx0XHRpZiAoIWNvZGVCbG9jay5hbGlhcykge1xuXHRcdFx0XHRcdFx0Y29kZUJsb2NrLmFsaWFzID0gW2FsaWFzXTtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBjb2RlQmxvY2suYWxpYXMgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0XHRjb2RlQmxvY2suYWxpYXMgPSBbY29kZUJsb2NrLmFsaWFzLCBhbGlhc107XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvZGVCbG9jay5hbGlhcy5wdXNoKGFsaWFzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHR3YWxrVG9rZW5zKGVudi50b2tlbnMpO1xuXHR9KTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ3dyYXAnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0aWYgKGVudi50eXBlICE9PSAnY29kZS1ibG9jaycpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgY29kZUxhbmcgPSAnJztcblx0XHRmb3IgKHZhciBpID0gMCwgbCA9IGVudi5jbGFzc2VzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdFx0dmFyIGNscyA9IGVudi5jbGFzc2VzW2ldO1xuXHRcdFx0dmFyIG1hdGNoID0gL2xhbmd1YWdlLSguKykvLmV4ZWMoY2xzKTtcblx0XHRcdGlmIChtYXRjaCkge1xuXHRcdFx0XHRjb2RlTGFuZyA9IG1hdGNoWzFdO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHR2YXIgZ3JhbW1hciA9IFByaXNtLmxhbmd1YWdlc1tjb2RlTGFuZ107XG5cblx0XHRpZiAoIWdyYW1tYXIpIHtcblx0XHRcdGlmIChjb2RlTGFuZyAmJiBjb2RlTGFuZyAhPT0gJ25vbmUnICYmIFByaXNtLnBsdWdpbnMuYXV0b2xvYWRlcikge1xuXHRcdFx0XHR2YXIgaWQgPSAnbWQtJyArIG5ldyBEYXRlKCkudmFsdWVPZigpICsgJy0nICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMWUxNik7XG5cdFx0XHRcdGVudi5hdHRyaWJ1dGVzWydpZCddID0gaWQ7XG5cblx0XHRcdFx0UHJpc20ucGx1Z2lucy5hdXRvbG9hZGVyLmxvYWRMYW5ndWFnZXMoY29kZUxhbmcsIGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHR2YXIgZWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuXHRcdFx0XHRcdGlmIChlbGUpIHtcblx0XHRcdFx0XHRcdGVsZS5pbm5lckhUTUwgPSBQcmlzbS5oaWdobGlnaHQoZWxlLnRleHRDb250ZW50LCBQcmlzbS5sYW5ndWFnZXNbY29kZUxhbmddLCBjb2RlTGFuZyk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZW52LmNvbnRlbnQgPSBQcmlzbS5oaWdobGlnaHQodGV4dENvbnRlbnQoZW52LmNvbnRlbnQpLCBncmFtbWFyLCBjb2RlTGFuZyk7XG5cdFx0fVxuXHR9KTtcblxuXHR2YXIgdGFnUGF0dGVybiA9IFJlZ0V4cChQcmlzbS5sYW5ndWFnZXMubWFya3VwLnRhZy5wYXR0ZXJuLnNvdXJjZSwgJ2dpJyk7XG5cblx0LyoqXG5cdCAqIEEgbGlzdCBvZiBrbm93biBlbnRpdHkgbmFtZXMuXG5cdCAqXG5cdCAqIFRoaXMgd2lsbCBhbHdheXMgYmUgaW5jb21wbGV0ZSB0byBzYXZlIHNwYWNlLiBUaGUgY3VycmVudCBsaXN0IGlzIHRoZSBvbmUgdXNlZCBieSBsb3dkYXNoJ3MgdW5lc2NhcGUgZnVuY3Rpb24uXG5cdCAqXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvMmRhMDI0YzNiNGY5OTQ3YTQ4NTE3NjM5ZGU3NTYwNDU3Y2Q0ZWM2Yy91bmVzY2FwZS5qcyNMMn1cblx0ICovXG5cdHZhciBLTk9XTl9FTlRJVFlfTkFNRVMgPSB7XG5cdFx0J2FtcCc6ICcmJyxcblx0XHQnbHQnOiAnPCcsXG5cdFx0J2d0JzogJz4nLFxuXHRcdCdxdW90JzogJ1wiJyxcblx0fTtcblxuXHQvLyBJRSAxMSBkb2Vzbid0IHN1cHBvcnQgYFN0cmluZy5mcm9tQ29kZVBvaW50YFxuXHR2YXIgZnJvbUNvZGVQb2ludCA9IFN0cmluZy5mcm9tQ29kZVBvaW50IHx8IFN0cmluZy5mcm9tQ2hhckNvZGU7XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHRleHQgY29udGVudCBvZiBhIGdpdmVuIEhUTUwgc291cmNlIGNvZGUgc3RyaW5nLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaHRtbFxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0ZnVuY3Rpb24gdGV4dENvbnRlbnQoaHRtbCkge1xuXHRcdC8vIHJlbW92ZSBhbGwgdGFnc1xuXHRcdHZhciB0ZXh0ID0gaHRtbC5yZXBsYWNlKHRhZ1BhdHRlcm4sICcnKTtcblxuXHRcdC8vIGRlY29kZSBrbm93biBlbnRpdGllc1xuXHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoLyYoXFx3ezEsOH18I3g/W1xcZGEtZl17MSw4fSk7L2dpLCBmdW5jdGlvbiAobSwgY29kZSkge1xuXHRcdFx0Y29kZSA9IGNvZGUudG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0aWYgKGNvZGVbMF0gPT09ICcjJykge1xuXHRcdFx0XHR2YXIgdmFsdWU7XG5cdFx0XHRcdGlmIChjb2RlWzFdID09PSAneCcpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IHBhcnNlSW50KGNvZGUuc2xpY2UoMiksIDE2KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR2YWx1ZSA9IE51bWJlcihjb2RlLnNsaWNlKDEpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBmcm9tQ29kZVBvaW50KHZhbHVlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhciBrbm93biA9IEtOT1dOX0VOVElUWV9OQU1FU1tjb2RlXTtcblx0XHRcdFx0aWYgKGtub3duKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGtub3duO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gdW5hYmxlIHRvIGRlY29kZVxuXHRcdFx0XHRyZXR1cm4gbTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiB0ZXh0O1xuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzLm1kID0gUHJpc20ubGFuZ3VhZ2VzLm1hcmtkb3duO1xuXG59KFByaXNtKSk7XG5cbi8vIGh0dHBzOi8vd3d3LnN0YXRhLmNvbS9tYW51YWxzL20ucGRmXG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgb3JnVHlwZSA9IC9cXGIoPzooPzpjb2x8cm93KT92ZWN0b3J8bWF0cml4fHNjYWxhcilcXGIvLnNvdXJjZTtcblx0dmFyIHR5cGUgPSAvXFxidm9pZFxcYnw8b3JnPnxcXGIoPzpjb21wbGV4fG51bWVyaWN8cG9pbnRlcig/OlxccypcXChbXigpXSpcXCkpP3xyZWFsfHN0cmluZ3woPzpjbGFzc3xzdHJ1Y3QpXFxzK1xcdyt8dHJhbnNtb3JwaGljKSg/Olxccyo8b3JnPik/Ly5zb3VyY2Vcblx0XHQucmVwbGFjZSgvPG9yZz4vZywgb3JnVHlwZSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLm1hdGEgPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwvXFwvLip8XFwvXFwqKD86W14qL118XFwqKD8hXFwvKXxcXC8oPyFcXCopfFxcL1xcKig/OlteKl18XFwqKD8hXFwvKSkqXFwqXFwvKSpcXCpcXC8vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiW15cIlxcclxcbl0qXCJ8W1x1MjAxOGAnXVwiLio/XCJbXHUyMDE5YCddLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnY2xhc3MtbmFtZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86Y2xhc3N8ZXh0ZW5kc3xzdHJ1Y3QpXFxzKylcXHcrKD89XFxzKig/Olxce3xcXGJleHRlbmRzXFxiKSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3R5cGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAodHlwZSksXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCldLyxcblx0XHRcdFx0J2tleXdvcmQnOiAvXFxiKD86Y2xhc3N8ZnVuY3Rpb258c3RydWN0fHZvaWQpXFxiL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiAvXFxiKD86YnJlYWt8Y2xhc3N8Y29udGludWV8ZG98ZWxzZXxlbmR8ZXh0ZW5kc3xleHRlcm5hbHxmaW5hbHxmb3J8ZnVuY3Rpb258Z290b3xpZnxwcmFnbWF8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJldHVybnxzdGF0aWN8c3RydWN0fHVuc2V0fHVudXNlZHx2ZXJzaW9ufHZpcnR1YWx8d2hpbGUpXFxiLyxcblx0XHQnY29uc3RhbnQnOiAvXFxiTlVMTFxcYi8sXG5cblx0XHQnbnVtYmVyJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3Ll0pKD86XFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspP3xcXGRbYS1mMC05XSooPzpcXC5bYS1mMC05XSspP3hbKy1dP1xcZCspaT8oPyFbXFx3Ll0pL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnbWlzc2luZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy5dKSg/OlxcLlthLXpdPykoPyFbXFx3Ll0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHR9LFxuXG5cdFx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXG5cdFx0J29wZXJhdG9yJzogL1xcLlxcLnxcXCtcXCt8LS18JiZ8XFx8XFx8fDo/KD86WyE9PD5dPXxbK1xcLSovXjw+Jnw6XSl8WyE/PVxcXFwjXHUyMDE5YCddLyxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpW1xcXXt9LDsuXS9cblx0fTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMubWF0bGFiID0ge1xuXHQnY29tbWVudCc6IFtcblx0XHQvJVxce1tcXHNcXFNdKj9cXH0lLyxcblx0XHQvJS4rL1xuXHRdLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cXEInKD86Jyd8W14nXFxyXFxuXSkqJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdC8vIEZJWE1FIFdlIGNvdWxkIGhhbmRsZSBpbWFnaW5hcnkgbnVtYmVycyBhcyBhIHdob2xlXG5cdCdudW1iZXInOiAvKD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OltlRV1bKy1dP1xcZCspPyg/Oltpal0pP3xcXGJbaWpdXFxiLyxcblx0J2tleXdvcmQnOiAvXFxiKD86TmFOfGJyZWFrfGNhc2V8Y2F0Y2h8Y29udGludWV8ZWxzZXxlbHNlaWZ8ZW5kfGZvcnxmdW5jdGlvbnxpZnxpbmZ8b3RoZXJ3aXNlfHBhcmZvcnxwYXVzZXxwaXxyZXR1cm58c3dpdGNofHRyeXx3aGlsZSlcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiKD8hXFxkKVxcdysoPz1cXHMqXFwoKS8sXG5cdCdvcGVyYXRvcic6IC9cXC4/WypeXFwvXFxcXCddfFsrXFwtOkBdfFs8Pj1+XT0/fCYmP3xcXHxcXHw/Lyxcblx0J3B1bmN0dWF0aW9uJzogL1xcLnszfXxbLiw7XFxbXFxdKCl7fSFdL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBrZXl3b3JkcyA9IC9cXGIoPzphYm91dHxhbmR8YW5pbWF0ZXxhc3xhdHxhdHRyaWJ1dGVzfGJ5fGNhc2V8Y2F0Y2h8Y29sbGVjdHxjb250aW51ZXxjb29yZHN5c3xkb3xlbHNlfGV4aXR8Zm58Zm9yfGZyb218ZnVuY3Rpb258Z2xvYmFsfGlmfGlufGxvY2FsfG1hY3Jvc2NyaXB0fG1hcHBlZHxtYXh8bm90fG9mfG9mZnxvbnxvcnxwYXJhbWV0ZXJzfHBlcnNpc3RlbnR8cGx1Z2lufHJjbWVudXxyZXR1cm58cm9sbG91dHxzZXR8c3RydWN0fHRoZW58dGhyb3d8dG98dG9vbHx0cnl8dW5kb3x1dGlsaXR5fHdoZW58d2hlcmV8d2hpbGV8d2l0aClcXGIvaTtcblxuXG5cdFByaXNtLmxhbmd1YWdlcy5tYXhzY3JpcHQgPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwvXFwqW1xcc1xcU10qPyg/OlxcKlxcL3wkKXwtLS4qLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlwiXFxcXEBdKSg/OlwiKD86W15cIlxcXFxdfFxcXFxbXFxzXFxTXSkqXCJ8QFwiW15cIl0qXCIpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdwYXRoJzoge1xuXHRcdFx0cGF0dGVybjogL1xcJCg/OltcXHcvXFxcXC4qP118J1teJ10qJykqLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHRcdH0sXG5cblx0XHQnZnVuY3Rpb24tY2FsbCc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0JygoPzonICsgKFxuXHRcdFx0XHRcdC8vIHN0YXJ0IG9mIGxpbmVcblx0XHRcdFx0XHQvXi8uc291cmNlICtcblx0XHRcdFx0XHQnfCcgK1xuXHRcdFx0XHRcdC8vIG9wZXJhdG9ycyBhbmQgb3RoZXIgbGFuZ3VhZ2UgY29uc3RydWN0c1xuXHRcdFx0XHRcdC9bOz08PitcXC0qL14oe1xcW10vLnNvdXJjZSArXG5cdFx0XHRcdFx0J3wnICtcblx0XHRcdFx0XHQvLyBrZXl3b3JkcyBhcyBwYXJ0IG9mIHN0YXRlbWVudHNcblx0XHRcdFx0XHQvXFxiKD86YW5kfGJ5fGNhc2V8Y2F0Y2h8Y29sbGVjdHxkb3xlbHNlfGlmfGlufG5vdHxvcnxyZXR1cm58dGhlbnx0b3x0cnl8d2hlcmV8d2hpbGV8d2l0aClcXGIvLnNvdXJjZVxuXHRcdFx0XHQpICsgJylbIFxcdF0qKScgK1xuXG5cdFx0XHRcdCcoPyEnICsga2V5d29yZHMuc291cmNlICsgJyknICsgL1thLXpfXVxcdypcXGIvLnNvdXJjZSArXG5cblx0XHRcdFx0Jyg/PVsgXFx0XSooPzonICsgKFxuXHRcdFx0XHRcdC8vIHZhcmlhYmxlXG5cdFx0XHRcdFx0Jyg/IScgKyBrZXl3b3Jkcy5zb3VyY2UgKyAnKScgKyAvW2Etel9dLy5zb3VyY2UgK1xuXHRcdFx0XHRcdCd8JyArXG5cdFx0XHRcdFx0Ly8gbnVtYmVyXG5cdFx0XHRcdFx0L1xcZHwtXFwuP1xcZC8uc291cmNlICtcblx0XHRcdFx0XHQnfCcgK1xuXHRcdFx0XHRcdC8vIG90aGVyIGV4cHJlc3Npb25zIG9yIGxpdGVyYWxzXG5cdFx0XHRcdFx0L1soeydcIiRAIz9dLy5zb3VyY2Vcblx0XHRcdFx0KSArICcpKScsXG5cdFx0XHRcdCdpbSdcblx0XHRcdCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXG5cdFx0J2Z1bmN0aW9uLWRlZmluaXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmZufGZ1bmN0aW9uKVxccyspXFx3K1xcYi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblxuXHRcdCdhcmd1bWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJbYS16X11cXHcqKD89OikvaSxcblx0XHRcdGFsaWFzOiAnYXR0ci1uYW1lJ1xuXHRcdH0sXG5cblx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblxuXHRcdCd0aW1lJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3Ll0pKD86KD86KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OltlRWREXVsrLV1cXGQrfFtMUF0pP1ttc2Z0XSkrfFxcZCs6XFxkKyg/OlxcLlxcZCopPykoPyFbXFx3LjpdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0fSxcblx0XHQnbnVtYmVyJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXHcuXSkoPzooPzpcXGQrKD86XFwuXFxkKik/fFxcLlxcZCspKD86W2VFZERdWystXVxcZCt8W0xQXSk/fDB4W2EtZkEtRjAtOV0rKSg/IVtcXHcuOl0pLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdC9cXGIoPzplfHBpKVxcYi9cblx0XHRdLFxuXG5cdFx0J2NvbnN0YW50JzogL1xcYig/OmRvbnRjb2xsZWN0fG9rfHNpbGVudFZhbHVlfHVuZGVmaW5lZHx1bnN1cHBsaWVkKVxcYi8sXG5cdFx0J2NvbG9yJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmJsYWNrfGJsdWV8YnJvd258Z3JheXxncmVlbnxvcmFuZ2V8cmVkfHdoaXRlfHllbGxvdylcXGIvaSxcblx0XHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdFx0fSxcblxuXHRcdCdvcGVyYXRvcic6IC9bLSsqLzw+PSFdPT98WyZeP118Iyg/IVxcKCkvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKClcXFtcXF17fS46LDtdfCMoPz1cXCgpfFxcXFwkL21cblx0fTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMubWVsID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjb2RlJzoge1xuXHRcdHBhdHRlcm46IC9gKD86XFxcXC58W15cXFxcYF0pKmAvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2l0YWxpYycsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXmB8YCQvLFxuXHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0fSxcblx0XHRcdCdzdGF0ZW1lbnQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndmFyaWFibGUnOiAvXFwkXFx3Ky8sXG5cdCdudW1iZXInOiAvXFxiMHhbXFxkYS1mQS1GXStcXGJ8XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrLyxcblx0J2ZsYWcnOiB7XG5cdFx0cGF0dGVybjogLy1bXlxcZFxcV11cXHcqLyxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpicmVha3xjYXNlfGNvbnRpbnVlfGRlZmF1bHR8ZG98ZWxzZXxmbG9hdHxmb3J8Z2xvYmFsfGlmfGlufGludHxtYXRyaXh8cHJvY3xyZXR1cm58c3RyaW5nfHN3aXRjaHx2ZWN0b3J8d2hpbGUpXFxiLyxcblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxbeztdKVsgXFx0XSopW2Etel9dXFx3KlxcYig/IVxccyooPzpcXC4oPyFcXC4pfFtbez1dKSl8XFxiW2Etel9dXFx3Kig/PVsgXFx0XSpcXCgpL2ltLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J3RlbnNvci1wdW5jdHVhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvPDx8Pj4vLFxuXHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdH0sXG5cdCdvcGVyYXRvcic6IC9cXCtbKz1dP3wtWy09XT98JiZ8XFx8XFx8fFs8Pl09P3xbKlxcLyE9XT0/fFslXl0vLFxuXHQncHVuY3R1YXRpb24nOiAvWy4sOjs/XFxbXFxdKCl7fV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubWVsWydjb2RlJ10uaW5zaWRlWydzdGF0ZW1lbnQnXS5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMubWVsO1xuXG5QcmlzbS5sYW5ndWFnZXMubWVybWFpZCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyUlLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdzdHlsZSc6IHtcblx0XHRwYXR0ZXJuOiAvXihbIFxcdF0qKD86Y2xhc3NEZWZ8bGlua1N0eWxlfHN0eWxlKVsgXFx0XStbXFx3JC1dK1sgXFx0XSspXFx3LipbXlxccztdL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwcm9wZXJ0eSc6IC9cXGJcXHdbXFx3LV0qKD89WyBcXHRdKjopLyxcblx0XHRcdCdvcGVyYXRvcic6IC86Lyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC8sL1xuXHRcdH1cblx0fSxcblxuXHQnaW50ZXItYXJyb3ctbGFiZWwnOiB7XG5cdFx0cGF0dGVybjogLyhbXjw+b3guPS1dKSg/Oi1bLS5dfD09KSg/IVs8Pm94Lj0tXSlbIFxcdF0qKD86XCJbXlwiXFxyXFxuXSpcInxbXlxcc1wiLj0tXSg/OlteXFxyXFxuLj0tXSpbXlxccy49LV0pPylbIFxcdF0qKD86XFwuKy0+P3wtLStbLT5dfD09K1s9Pl0pKD8hWzw+b3guPS1dKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnYXJyb3cnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oPzpcXC4rLT4/fC0tK1stPl18PT0rWz0+XSkkLyxcblx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdH0sXG5cdFx0XHQnbGFiZWwnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFtcXHNcXFNdezJ9WyBcXHRdKilcXFMoPzpbXFxzXFxTXSpcXFMpPy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0XHR9LFxuXHRcdFx0J2Fycm93LWhlYWQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eXFxTKy8sXG5cdFx0XHRcdGFsaWFzOiBbJ2Fycm93JywgJ29wZXJhdG9yJ11cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0J2Fycm93JzogW1xuXHRcdC8vIFRoaXMgbWlnaHQgbG9vayBjb21wbGV4IGJ1dCBpdCByZWFsbHkgaXNuJ3QuXG5cdFx0Ly8gVGhlcmUgYXJlIG1hbnkgcG9zc2libGUgYXJyb3dzIChzZWUgdGVzdHMpIGFuZCBpdCdzIGltcG9zc2libGUgdG8gZml0IGFsbCBvZiB0aGVtIGludG8gb25lIHBhdHRlcm4uIFRoZVxuXHRcdC8vIHByb2JsZW0gaXMgdGhhdCB3ZSBvbmx5IGhhdmUgb25lIGxvb2tiZWhpbmQgcGVyIHBhdHRlcm4uIEhvd2V2ZXIsIHdlIGNhbm5vdCBkaXNhbGxvdyB0b28gbWFueSBhcnJvd1xuXHRcdC8vIGNoYXJhY3RlcnMgaW4gdGhlIG9uZSBsb29rYmVoaW5kIGJlY2F1c2UgdGhhdCB3b3VsZCBjcmVhdGUgdG9vIG1hbnkgZmFsc2UgbmVnYXRpdmVzLiBTbyB3ZSBoYXZlIHRvIHNwbGl0IHRoZVxuXHRcdC8vIGFycm93cyBpbnRvIGRpZmZlcmVudCBwYXR0ZXJucy5cblx0XHR7XG5cdFx0XHQvLyBFUiBkaWFncmFtXG5cdFx0XHRwYXR0ZXJuOiAvKF58W157fXxvLi1dKVt8fV1bfG9dKD86LS18XFwuXFwuKVt8b11bfHtdKD8hW3t9fG8uLV0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gZmxvdyBjaGFydFxuXHRcdFx0Ly8gKD86PT0rfC0tK3wtXFwuKi0pXG5cdFx0XHRwYXR0ZXJuOiAvKF58W148Pm94Lj0tXSkoPzpbPG94XSg/Oj09K3wtLSt8LVxcLiotKVs+b3hdP3woPzo9PSt8LS0rfC1cXC4qLSlbPm94XXw9PT0rfC0tLSt8LVxcListKSg/IVs8Pm94Lj0tXSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBzZXF1ZW5jZSBkaWFncmFtXG5cdFx0XHRwYXR0ZXJuOiAvKF58W148PigpeC1dKSg/Oi0tPyg/Oj4+fFt4PildKSg/IVs8PigpeF0pfCg/Ojw8fFt4PChdKS0tPyg/IS0pKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIGNsYXNzIGRpYWdyYW1cblx0XHRcdHBhdHRlcm46IC8oXnxbXjw+fCpvLi1dKSg/Olsqb10tLXwtLVsqb118PFxcfD8oPzotLXxcXC5cXC4pfCg/Oi0tfFxcLlxcLilcXHw/PnwtLXxcXC5cXC4pKD8hWzw+fCpvLi1dKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9LFxuXHRdLFxuXG5cdCdsYWJlbCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W158PF0pXFx8KD86W15cXHJcXG5cInxdfFwiW15cIlxcclxcbl0qXCIpK1xcfC8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblxuXHQndGV4dCc6IHtcblx0XHRwYXR0ZXJuOiAvKD86WyhcXFt7XSt8XFxiPikoPzpbXlxcclxcblwiKClcXFtcXF17fV18XCJbXlwiXFxyXFxuXSpcIikrKD86WylcXF19XSt8PikvLFxuXHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlteXCJcXHJcXG5dKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnYW5ub3RhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvPDwoPzphYnN0cmFjdHxjaG9pY2V8ZW51bWVyYXRpb258Zm9ya3xpbnRlcmZhY2V8am9pbnxzZXJ2aWNlKT4+fFxcW1xcWyg/OmNob2ljZXxmb3JrfGpvaW4pXFxdXFxdL2ksXG5cdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdH0sXG5cblx0J2tleXdvcmQnOiBbXG5cdFx0Ly8gVGhpcyBsYW5ndWFnZSBoYXMgYm90aCBjYXNlLXNlbnNpdGl2ZSBhbmQgY2FzZS1pbnNlbnNpdGl2ZSBrZXl3b3Jkc1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopKD86YWN0aW9ufGNhbGxiYWNrfGNsYXNzfGNsYXNzRGVmfGNsYXNzRGlhZ3JhbXxjbGlja3xkaXJlY3Rpb258ZXJEaWFncmFtfGZsb3djaGFydHxnYW50dHxnaXRHcmFwaHxncmFwaHxqb3VybmV5fGxpbmt8bGlua1N0eWxlfHBpZXxyZXF1aXJlbWVudERpYWdyYW18c2VxdWVuY2VEaWFncmFtfHN0YXRlRGlhZ3JhbXxzdGF0ZURpYWdyYW0tdjJ8c3R5bGV8c3ViZ3JhcGgpKD8hW1xcdyQtXSkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopKD86YWN0aXZhdGV8YWx0fGFuZHxhc3xhdXRvbnVtYmVyfGRlYWN0aXZhdGV8ZWxzZXxlbmQoPzpbIFxcdF0rbm90ZSk/fGxvb3B8b3B0fHBhcnxwYXJ0aWNpcGFudHxyZWN0fHN0YXRlfG5vdGVbIFxcdF0rKD86b3ZlcnwoPzpsZWZ0fHJpZ2h0KVsgXFx0XStvZikpKD8hW1xcdyQtXSkvaW0sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXG5cdCdlbnRpdHknOiAvI1thLXowLTldKzsvLFxuXG5cdCdvcGVyYXRvcic6IHtcblx0XHRwYXR0ZXJuOiAvKFxcd1sgXFx0XSopJig/PVsgXFx0XSpcXHcpfDo6Onw6Lyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCl7fTtdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm1pemFyID0ge1xuXHQnY29tbWVudCc6IC86Oi4rLyxcblx0J2tleXdvcmQnOiAvQHByb29mXFxifFxcYig/OmFjY29yZGluZ3xhZ2dyZWdhdGV8YWxsfGFuZHxhbnRvbnltfGFyZXxhc3xhc3NvY2lhdGl2aXR5fGFzc3VtZXxhc3ltbWV0cnl8YXR0cnxiZXxiZWdpbnxiZWluZ3xieXxjYW5jZWxlZHxjYXNlfGNhc2VzfGNsdXN0ZXJzP3xjb2hlcmVuY2V8Y29tbXV0YXRpdml0eXxjb21wYXRpYmlsaXR5fGNvbm5lY3RlZG5lc3N8Y29uc2lkZXJ8Y29uc2lzdGVuY3l8Y29uc3RydWN0b3JzfGNvbnRyYWRpY3Rpb258Y29ycmVjdG5lc3N8ZGVmfGRlZmZ1bmN8ZGVmaW5lfGRlZmluaXRpb25zP3xkZWZwcmVkfGRvfGRvZXN8ZW5kfGVudmlyb258ZXF1YWxzfGV4fGV4YWN0bHl8ZXhpc3RlbmNlfGZvcnxmcm9tfGZ1bmN8Z2l2ZW58aGVuY2V8aGVyZWJ5fGhvbGRzfGlkZW1wb3RlbmNlfGlkZW50aXR5fGlmZj98aW1wbGllc3xpbnZvbHV0aXZlbmVzc3xpcnJlZmxleGl2aXR5fGlzfGl0fGxldHxtZWFuc3xtb2RlfG5vbnxub3R8bm90YXRpb25zP3xub3d8b2Z8b3J8b3RoZXJ3aXNlfG92ZXJ8cGVyfHByZWR8cHJlZml4fHByb2plY3Rpdml0eXxwcm9vZnxwcm92aWRlZHxxdWF8cmVjb25zaWRlcnxyZWRlZmluZXxyZWR1Y2V8cmVkdWNpYmlsaXR5fHJlZmxleGl2aXR5fHJlZ2lzdHJhdGlvbnM/fHJlcXVpcmVtZW50c3xyZXNlcnZlfHNjaHxzY2hlbWVzP3xzZWN0aW9ufHNlbGVjdG9yfHNldHxzZXRob29kfHN0fHN0cnVjdHxzdWNofHN1cHBvc2V8c3ltbWV0cnl8c3lub255bXx0YWtlfHRoYXR8dGhlfHRoZW58dGhlb3JlbXM/fHRoZXNpc3x0aHVzfHRvfHRyYW5zaXRpdml0eXx1bmlxdWVuZXNzfHZvY2FidWxhcig/Omllc3x5KXx3aGVufHdoZXJlfHdpdGh8d3J0KVxcYi8sXG5cdCdwYXJhbWV0ZXInOiB7XG5cdFx0cGF0dGVybjogL1xcJCg/OjEwfFxcZCkvLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCd2YXJpYWJsZSc6IC9cXGJcXHcrKD89OikvLFxuXHQnbnVtYmVyJzogLyg/OlxcYnwtKVxcZCtcXGIvLFxuXHQnb3BlcmF0b3InOiAvXFwuXFwuXFwufC0+fCZ8XFwuPz0vLFxuXHQncHVuY3R1YXRpb24nOiAvXFwoI3wjXFwpfFssOjtcXFtcXF0oKXt9XS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgb3BlcmF0b3JzID0gW1xuXHRcdC8vIHF1ZXJ5IGFuZCBwcm9qZWN0aW9uXG5cdFx0JyRlcScsICckZ3QnLCAnJGd0ZScsICckaW4nLCAnJGx0JywgJyRsdGUnLCAnJG5lJywgJyRuaW4nLCAnJGFuZCcsICckbm90JywgJyRub3InLCAnJG9yJyxcblx0XHQnJGV4aXN0cycsICckdHlwZScsICckZXhwcicsICckanNvblNjaGVtYScsICckbW9kJywgJyRyZWdleCcsICckdGV4dCcsICckd2hlcmUnLCAnJGdlb0ludGVyc2VjdHMnLFxuXHRcdCckZ2VvV2l0aGluJywgJyRuZWFyJywgJyRuZWFyU3BoZXJlJywgJyRhbGwnLCAnJGVsZW1NYXRjaCcsICckc2l6ZScsICckYml0c0FsbENsZWFyJywgJyRiaXRzQWxsU2V0Jyxcblx0XHQnJGJpdHNBbnlDbGVhcicsICckYml0c0FueVNldCcsICckY29tbWVudCcsICckZWxlbU1hdGNoJywgJyRtZXRhJywgJyRzbGljZScsXG5cblx0XHQvLyB1cGRhdGVcblx0XHQnJGN1cnJlbnREYXRlJywgJyRpbmMnLCAnJG1pbicsICckbWF4JywgJyRtdWwnLCAnJHJlbmFtZScsICckc2V0JywgJyRzZXRPbkluc2VydCcsICckdW5zZXQnLFxuXHRcdCckYWRkVG9TZXQnLCAnJHBvcCcsICckcHVsbCcsICckcHVzaCcsICckcHVsbEFsbCcsICckZWFjaCcsICckcG9zaXRpb24nLCAnJHNsaWNlJywgJyRzb3J0JywgJyRiaXQnLFxuXG5cdFx0Ly8gYWdncmVnYXRpb24gcGlwZWxpbmUgc3RhZ2VzXG5cdFx0JyRhZGRGaWVsZHMnLCAnJGJ1Y2tldCcsICckYnVja2V0QXV0bycsICckY29sbFN0YXRzJywgJyRjb3VudCcsICckY3VycmVudE9wJywgJyRmYWNldCcsICckZ2VvTmVhcicsXG5cdFx0JyRncmFwaExvb2t1cCcsICckZ3JvdXAnLCAnJGluZGV4U3RhdHMnLCAnJGxpbWl0JywgJyRsaXN0TG9jYWxTZXNzaW9ucycsICckbGlzdFNlc3Npb25zJywgJyRsb29rdXAnLFxuXHRcdCckbWF0Y2gnLCAnJG1lcmdlJywgJyRvdXQnLCAnJHBsYW5DYWNoZVN0YXRzJywgJyRwcm9qZWN0JywgJyRyZWRhY3QnLCAnJHJlcGxhY2VSb290JywgJyRyZXBsYWNlV2l0aCcsXG5cdFx0JyRzYW1wbGUnLCAnJHNldCcsICckc2tpcCcsICckc29ydCcsICckc29ydEJ5Q291bnQnLCAnJHVuaW9uV2l0aCcsICckdW5zZXQnLCAnJHVud2luZCcsICckc2V0V2luZG93RmllbGRzJyxcblxuXHRcdC8vIGFnZ3JlZ2F0aW9uIHBpcGVsaW5lIG9wZXJhdG9yc1xuXHRcdCckYWJzJywgJyRhY2N1bXVsYXRvcicsICckYWNvcycsICckYWNvc2gnLCAnJGFkZCcsICckYWRkVG9TZXQnLCAnJGFsbEVsZW1lbnRzVHJ1ZScsICckYW5kJyxcblx0XHQnJGFueUVsZW1lbnRUcnVlJywgJyRhcnJheUVsZW1BdCcsICckYXJyYXlUb09iamVjdCcsICckYXNpbicsICckYXNpbmgnLCAnJGF0YW4nLCAnJGF0YW4yJyxcblx0XHQnJGF0YW5oJywgJyRhdmcnLCAnJGJpbmFyeVNpemUnLCAnJGJzb25TaXplJywgJyRjZWlsJywgJyRjbXAnLCAnJGNvbmNhdCcsICckY29uY2F0QXJyYXlzJywgJyRjb25kJyxcblx0XHQnJGNvbnZlcnQnLCAnJGNvcycsICckZGF0ZUZyb21QYXJ0cycsICckZGF0ZVRvUGFydHMnLCAnJGRhdGVGcm9tU3RyaW5nJywgJyRkYXRlVG9TdHJpbmcnLCAnJGRheU9mTW9udGgnLFxuXHRcdCckZGF5T2ZXZWVrJywgJyRkYXlPZlllYXInLCAnJGRlZ3JlZXNUb1JhZGlhbnMnLCAnJGRpdmlkZScsICckZXEnLCAnJGV4cCcsICckZmlsdGVyJywgJyRmaXJzdCcsXG5cdFx0JyRmbG9vcicsICckZnVuY3Rpb24nLCAnJGd0JywgJyRndGUnLCAnJGhvdXInLCAnJGlmTnVsbCcsICckaW4nLCAnJGluZGV4T2ZBcnJheScsICckaW5kZXhPZkJ5dGVzJyxcblx0XHQnJGluZGV4T2ZDUCcsICckaXNBcnJheScsICckaXNOdW1iZXInLCAnJGlzb0RheU9mV2VlaycsICckaXNvV2VlaycsICckaXNvV2Vla1llYXInLCAnJGxhc3QnLFxuXHRcdCckbGFzdCcsICckbGV0JywgJyRsaXRlcmFsJywgJyRsbicsICckbG9nJywgJyRsb2cxMCcsICckbHQnLCAnJGx0ZScsICckbHRyaW0nLCAnJG1hcCcsICckbWF4Jyxcblx0XHQnJG1lcmdlT2JqZWN0cycsICckbWV0YScsICckbWluJywgJyRtaWxsaXNlY29uZCcsICckbWludXRlJywgJyRtb2QnLCAnJG1vbnRoJywgJyRtdWx0aXBseScsICckbmUnLFxuXHRcdCckbm90JywgJyRvYmplY3RUb0FycmF5JywgJyRvcicsICckcG93JywgJyRwdXNoJywgJyRyYWRpYW5zVG9EZWdyZWVzJywgJyRyYW5nZScsICckcmVkdWNlJyxcblx0XHQnJHJlZ2V4RmluZCcsICckcmVnZXhGaW5kQWxsJywgJyRyZWdleE1hdGNoJywgJyRyZXBsYWNlT25lJywgJyRyZXBsYWNlQWxsJywgJyRyZXZlcnNlQXJyYXknLCAnJHJvdW5kJyxcblx0XHQnJHJ0cmltJywgJyRzZWNvbmQnLCAnJHNldERpZmZlcmVuY2UnLCAnJHNldEVxdWFscycsICckc2V0SW50ZXJzZWN0aW9uJywgJyRzZXRJc1N1YnNldCcsICckc2V0VW5pb24nLFxuXHRcdCckc2l6ZScsICckc2luJywgJyRzbGljZScsICckc3BsaXQnLCAnJHNxcnQnLCAnJHN0ZERldlBvcCcsICckc3RkRGV2U2FtcCcsICckc3RyY2FzZWNtcCcsICckc3RyTGVuQnl0ZXMnLFxuXHRcdCckc3RyTGVuQ1AnLCAnJHN1YnN0cicsICckc3Vic3RyQnl0ZXMnLCAnJHN1YnN0ckNQJywgJyRzdWJ0cmFjdCcsICckc3VtJywgJyRzd2l0Y2gnLCAnJHRhbicsXG5cdFx0JyR0b0Jvb2wnLCAnJHRvRGF0ZScsICckdG9EZWNpbWFsJywgJyR0b0RvdWJsZScsICckdG9JbnQnLCAnJHRvTG9uZycsICckdG9PYmplY3RJZCcsICckdG9TdHJpbmcnLFxuXHRcdCckdG9Mb3dlcicsICckdG9VcHBlcicsICckdHJpbScsICckdHJ1bmMnLCAnJHR5cGUnLCAnJHdlZWsnLCAnJHllYXInLCAnJHppcCcsICckY291bnQnLCAnJGRhdGVBZGQnLFxuXHRcdCckZGF0ZURpZmYnLCAnJGRhdGVTdWJ0cmFjdCcsICckZGF0ZVRydW5jJywgJyRnZXRGaWVsZCcsICckcmFuZCcsICckc2FtcGxlUmF0ZScsICckc2V0RmllbGQnLCAnJHVuc2V0RmllbGQnLFxuXG5cdFx0Ly8gYWdncmVnYXRpb24gcGlwZWxpbmUgcXVlcnkgbW9kaWZpZXJzXG5cdFx0JyRjb21tZW50JywgJyRleHBsYWluJywgJyRoaW50JywgJyRtYXgnLCAnJG1heFRpbWVNUycsICckbWluJywgJyRvcmRlcmJ5JywgJyRxdWVyeScsXG5cdFx0JyRyZXR1cm5LZXknLCAnJHNob3dEaXNrTG9jJywgJyRuYXR1cmFsJyxcblx0XTtcblxuXHR2YXIgYnVpbHRpbkZ1bmN0aW9ucyA9IFtcblx0XHQnT2JqZWN0SWQnLFxuXHRcdCdDb2RlJyxcblx0XHQnQmluRGF0YScsXG5cdFx0J0RCUmVmJyxcblx0XHQnVGltZXN0YW1wJyxcblx0XHQnTnVtYmVyTG9uZycsXG5cdFx0J051bWJlckRlY2ltYWwnLFxuXHRcdCdNYXhLZXknLFxuXHRcdCdNaW5LZXknLFxuXHRcdCdSZWdFeHAnLFxuXHRcdCdJU09EYXRlJyxcblx0XHQnVVVJRCcsXG5cdF07XG5cblx0b3BlcmF0b3JzID0gb3BlcmF0b3JzLm1hcChmdW5jdGlvbiAob3BlcmF0b3IpIHtcblx0XHRyZXR1cm4gb3BlcmF0b3IucmVwbGFjZSgnJCcsICdcXFxcJCcpO1xuXHR9KTtcblxuXHR2YXIgb3BlcmF0b3JzU291cmNlID0gJyg/OicgKyBvcGVyYXRvcnMuam9pbignfCcpICsgJylcXFxcYic7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLm1vbmdvZGIgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdqYXZhc2NyaXB0Jywge30pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ21vbmdvZGInLCAnc3RyaW5nJywge1xuXHRcdCdwcm9wZXJ0eSc6IHtcblx0XHRcdHBhdHRlcm46IC8oPzooW1wiJ10pKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMXwoPyFcXHMpW18kYS16QS1aXFx4QTAtXFx1RkZGRl0oPzooPyFcXHMpWyRcXHdcXHhBMC1cXHVGRkZGXSkqKSg/PVxccyo6KS8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2tleXdvcmQnOiBSZWdFeHAoJ14oW1xcJ1wiXSk/JyArIG9wZXJhdG9yc1NvdXJjZSArICcoPzpcXFxcMSk/JCcpXG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMubW9uZ29kYi5zdHJpbmcuaW5zaWRlID0ge1xuXHRcdHVybDoge1xuXHRcdFx0Ly8gdXJsIHBhdHRlcm5cblx0XHRcdHBhdHRlcm46IC9odHRwcz86XFwvXFwvWy1cXHdAOiUuK34jPV17MSwyNTZ9XFwuW2EtejAtOSgpXXsxLDZ9XFxiWy1cXHcoKUA6JSsufiM/Ji89XSovaSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0ZW50aXR5OiB7XG5cdFx0XHQvLyBpcHY0XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86KD86WzAxXT9cXGRcXGQ/fDJbMC00XVxcZHwyNVswLTVdKVxcLil7M30oPzpbMDFdP1xcZFxcZD98MlswLTRdXFxkfDI1WzAtNV0pXFxiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdtb25nb2RiJywgJ2NvbnN0YW50Jywge1xuXHRcdCdidWlsdGluJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCdcXFxcYig/OicgKyBidWlsdGluRnVuY3Rpb25zLmpvaW4oJ3wnKSArICcpXFxcXGInKSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5tb25rZXkgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9eI1JlbVxcc1tcXHNcXFNdKj9eI0VuZHwnLisvaW0sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiW15cIlxcclxcbl0qXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0fSxcblx0J3ByZXByb2Nlc3Nvcic6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSMuKy9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cblx0J2Z1bmN0aW9uJzogL1xcYlxcdysoPz1cXCgpLyxcblx0J3R5cGUtY2hhcic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiWz8lIyRdLyxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH0sXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogLygoPzpcXC5cXC4pPykoPzooPzpcXGJ8XFxCLVxcLj98XFxCXFwuKVxcZCsoPzooPyFcXC5cXC4pXFwuXFxkKik/fFxcJFtcXGRhLWZdKykvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OkFic3RyYWN0fEFycmF5fEJvb2x8Q2FzZXxDYXRjaHxDbGFzc3xDb25zdHxDb250aW51ZXxEZWZhdWx0fEVhY2hpbnxFbHNlfEVsc2VJZnxFbmR8RW5kSWZ8RXhpdHxFeHRlbmRzfEV4dGVybnxGYWxzZXxGaWVsZHxGaW5hbHxGbG9hdHxGb3J8Rm9yZXZlcnxGdW5jdGlvbnxHbG9iYWx8SWZ8SW1wbGVtZW50c3xJbXBvcnR8SW5saW5lfEludHxJbnRlcmZhY2V8TG9jYWx8TWV0aG9kfE1vZHVsZXxOZXd8TmV4dHxOdWxsfE9iamVjdHxQcml2YXRlfFByb3BlcnR5fFB1YmxpY3xSZXBlYXR8UmV0dXJufFNlbGVjdHxTZWxmfFN0ZXB8U3RyaWN0fFN0cmluZ3xTdXBlcnxUaGVufFRocm93fFRvfFRydWV8VHJ5fFVudGlsfFZvaWR8V2VuZHxXaGlsZSlcXGIvaSxcblx0J29wZXJhdG9yJzogL1xcLlxcLnw8Wz0+XT98Pj0/fDo/PXwoPzpbK1xcLSpcXC8mfnxdfFxcYig/Ok1vZHxTaGx8U2hyKVxcYik9P3xcXGIoPzpBbmR8Tm90fE9yKVxcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvWy4sOjsoKVxcW1xcXV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubW9vbnNjcmlwdCA9IHtcblx0J2NvbW1lbnQnOiAvLS0uKi8sXG5cdCdzdHJpbmcnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLydbXiddKid8XFxbKD0qKVxcW1tcXHNcXFNdKj9cXF1cXDFcXF0vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXCJbXlwiXSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyNcXHtbXnt9XSpcXH0vLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J21vb25zY3JpcHQnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXiNcXHspW1xcc1xcU10rKD89XFx9KS8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVvd1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvI1xce3xcXH0vLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XSxcblx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzpjbGFzc3xleHRlbmRzKVsgXFx0XSspXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvLyBjbGFzcy1saWtlIG5hbWVzIHN0YXJ0IHdpdGggYSBjYXBpdGFsIGxldHRlclxuXHRcdC9cXGJbQS1aXVxcdyovXG5cdF0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmNsYXNzfGNvbnRpbnVlfGRvfGVsc2V8ZWxzZWlmfGV4cG9ydHxleHRlbmRzfGZvcnxmcm9tfGlmfGltcG9ydHxpbnxsb2NhbHxuaWx8cmV0dXJufHNlbGZ8c3VwZXJ8c3dpdGNofHRoZW58dW5sZXNzfHVzaW5nfHdoZW58d2hpbGV8d2l0aClcXGIvLFxuXHQndmFyaWFibGUnOiAvQEA/XFx3Ki8sXG5cdCdwcm9wZXJ0eSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD8hXFxkKVxcdysoPz06KXwoOikoPyFcXGQpXFx3Ky8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogL1xcYig/Ol9HfF9WRVJTSU9OfGFzc2VydHxjb2xsZWN0Z2FyYmFnZXxjb3JvdXRpbmVcXC4oPzpjcmVhdGV8cmVzdW1lfHJ1bm5pbmd8c3RhdHVzfHdyYXB8eWllbGQpfGRlYnVnXFwuKD86ZGVidWd8Z2V0ZmVudnxnZXRob29rfGdldGluZm98Z2V0bG9jYWx8Z2V0bWV0YXRhYmxlfGdldHJlZ2lzdHJ5fGdldHVwdmFsdWV8c2V0ZmVudnxzZXRob29rfHNldGxvY2FsfHNldG1ldGF0YWJsZXxzZXR1cHZhbHVlfHRyYWNlYmFjayl8ZG9maWxlfGVycm9yfGdldGZlbnZ8Z2V0bWV0YXRhYmxlfGlvXFwuKD86Y2xvc2V8Zmx1c2h8aW5wdXR8bGluZXN8b3BlbnxvdXRwdXR8cG9wZW58cmVhZHxzdGRlcnJ8c3RkaW58c3Rkb3V0fHRtcGZpbGV8dHlwZXx3cml0ZSl8aXBhaXJzfGxvYWR8bG9hZGZpbGV8bG9hZHN0cmluZ3xtYXRoXFwuKD86YWJzfGFjb3N8YXNpbnxhdGFufGF0YW4yfGNlaWx8Y29zfGNvc2h8ZGVnfGV4cHxmbG9vcnxmbW9kfGZyZXhwfGxkZXhwfGxvZ3xsb2cxMHxtYXh8bWlufG1vZGZ8cGl8cG93fHJhZHxyYW5kb218cmFuZG9tc2VlZHxzaW58c2luaHxzcXJ0fHRhbnx0YW5oKXxtb2R1bGV8bmV4dHxvc1xcLig/OmNsb2NrfGRhdGV8ZGlmZnRpbWV8ZXhlY3V0ZXxleGl0fGdldGVudnxyZW1vdmV8cmVuYW1lfHNldGxvY2FsZXx0aW1lfHRtcG5hbWUpfHBhY2thZ2VcXC4oPzpjcGF0aHxsb2FkZWR8bG9hZGxpYnxwYXRofHByZWxvYWR8c2VlYWxsKXxwYWlyc3xwY2FsbHxwcmludHxyYXdlcXVhbHxyYXdnZXR8cmF3c2V0fHJlcXVpcmV8c2VsZWN0fHNldGZlbnZ8c2V0bWV0YXRhYmxlfHN0cmluZ1xcLig/OmJ5dGV8Y2hhcnxkdW1wfGZpbmR8Zm9ybWF0fGdtYXRjaHxnc3VifGxlbnxsb3dlcnxtYXRjaHxyZXB8cmV2ZXJzZXxzdWJ8dXBwZXIpfHRhYmxlXFwuKD86Y29uY2F0fGluc2VydHxtYXhufHJlbW92ZXxzb3J0KXx0b251bWJlcnx0b3N0cmluZ3x0eXBlfHVucGFja3x4cGNhbGwpXFxiLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0fVxuXHR9LFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdudW1iZXInOiAvKD86XFxCXFwuXFxkK3xcXGJcXGQrXFwuXFxkK3xcXGJcXGQrKD89W2VFXSkpKD86W2VFXVstK10/XFxkKyk/XFxifFxcYig/OjB4W2EtZkEtRlxcZF0rfFxcZCspKD86VT9MTCk/XFxiLyxcblx0J29wZXJhdG9yJzogL1xcLnszfXxbLT1dPnx+PXwoPzpbLSsqLyU8PiE9XXxcXC5cXC4pPT98WzojXl18XFxiKD86YW5kfG9yKVxcYj0/fFxcYig/Om5vdClcXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvWy4sKClbXFxde31cXFxcXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5tb29uc2NyaXB0LnN0cmluZ1sxXS5pbnNpZGUuaW50ZXJwb2xhdGlvbi5pbnNpZGUubW9vbnNjcmlwdC5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMubW9vbnNjcmlwdDtcblxuUHJpc20ubGFuZ3VhZ2VzLm1vb24gPSBQcmlzbS5sYW5ndWFnZXMubW9vbnNjcmlwdDtcblxuLy8gaHR0cHM6Ly9kb2NzLmNvdWNoYmFzZS5jb20vc2VydmVyL2N1cnJlbnQvbjFxbC9uMXFsLWxhbmd1YWdlLXJlZmVyZW5jZS9pbmRleC5odG1sXG5cblByaXNtLmxhbmd1YWdlcy5uMXFsID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvXFwvXFwqW1xcc1xcU10qPyg/OiR8XFwqXFwvKXwtLS4qLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInXSkoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF18XFwxXFwxKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0fSxcblx0J2lkZW50aWZpZXInOiB7XG5cdFx0cGF0dGVybjogL2AoPzpcXFxcW1xcc1xcU118W15cXFxcYF18YGApKmAvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0fSxcblx0J3BhcmFtZXRlcic6IC9cXCRbXFx3Ll0rLyxcblx0Ly8gaHR0cHM6Ly9kb2NzLmNvdWNoYmFzZS5jb20vc2VydmVyL2N1cnJlbnQvbjFxbC9uMXFsLWxhbmd1YWdlLXJlZmVyZW5jZS9yZXNlcnZlZHdvcmRzLmh0bWwjbjFxbC1yZXNlcnZlZC13b3Jkc1xuXHQna2V5d29yZCc6IC9cXGIoPzpBRFZJU0V8QUxMfEFMVEVSfEFOQUxZWkV8QVN8QVNDfEFUfEJFR0lOfEJJTkFSWXxCT09MRUFOfEJSRUFLfEJVQ0tFVHxCVUlMRHxCWXxDQUxMfENBU1R8Q0xVU1RFUnxDT0xMQVRFfENPTExFQ1RJT058Q09NTUlUfENPTU1JVFRFRHxDT05ORUNUfENPTlRJTlVFfENPUlJFTEFURXxDT1JSRUxBVEVEfENPVkVSfENSRUFURXxDVVJSRU5UfERBVEFCQVNFfERBVEFTRVR8REFUQVNUT1JFfERFQ0xBUkV8REVDUkVNRU5UfERFTEVURXxERVJJVkVEfERFU0N8REVTQ1JJQkV8RElTVElOQ1R8RE98RFJPUHxFQUNIfEVMRU1FTlR8RVhDRVBUfEVYQ0xVREV8RVhFQ1VURXxFWFBMQUlOfEZFVENIfEZJTFRFUnxGTEFUVEVOfEZMVVNIfEZPTExPV0lOR3xGT1J8Rk9SQ0V8RlJPTXxGVFN8RlVOQ1RJT058R09MQU5HfEdSQU5UfEdST1VQfEdST1VQU3xHU0l8SEFTSHxIQVZJTkd8SUZ8SUdOT1JFfElMSUtFfElOQ0xVREV8SU5DUkVNRU5UfElOREVYfElORkVSfElOTElORXxJTk5FUnxJTlNFUlR8SU5URVJTRUNUfElOVE98SVN8SVNPTEFUSU9OfEpBVkFTQ1JJUFR8Sk9JTnxLRVl8S0VZU3xLRVlTUEFDRXxLTk9XTnxMQU5HVUFHRXxMQVNUfExFRlR8TEVUfExFVFRJTkd8TEVWRUx8TElNSVR8TFNNfE1BUHxNQVBQSU5HfE1BVENIRUR8TUFURVJJQUxJWkVEfE1FUkdFfE1JTlVTfE1JU1NJTkd8TkFNRVNQQUNFfE5FU1R8Tkx8Tk98TlRIX1ZBTFVFfE5VTEx8TlVMTFN8TlVNQkVSfE9CSkVDVHxPRkZTRVR8T058T1BUSU9OfE9QVElPTlN8T1JERVJ8T1RIRVJTfE9VVEVSfE9WRVJ8UEFSU0V8UEFSVElUSU9OfFBBU1NXT1JEfFBBVEh8UE9PTHxQUkVDRURJTkd8UFJFUEFSRXxQUklNQVJZfFBSSVZBVEV8UFJJVklMRUdFfFBST0JFfFBST0NFRFVSRXxQVUJMSUN8UkFOR0V8UkFXfFJFQUxNfFJFRFVDRXxSRU5BTUV8UkVTUEVDVHxSRVRVUk58UkVUVVJOSU5HfFJFVk9LRXxSSUdIVHxST0xFfFJPTExCQUNLfFJPV3xST1dTfFNBVElTRklFU3xTQVZFUE9JTlR8U0NIRU1BfFNDT1BFfFNFTEVDVHxTRUxGfFNFTUl8U0VUfFNIT1d8U09NRXxTVEFSVHxTVEFUSVNUSUNTfFNUUklOR3xTWVNURU18VElFU3xUT3xUUkFOfFRSQU5TQUNUSU9OfFRSSUdHRVJ8VFJVTkNBVEV8VU5CT1VOREVEfFVOREVSfFVOSU9OfFVOSVFVRXxVTktOT1dOfFVOTkVTVHxVTlNFVHxVUERBVEV8VVBTRVJUfFVTRXxVU0VSfFVTSU5HfFZBTElEQVRFfFZBTFVFfFZBTFVFU3xWSUF8VklFV3xXSEVSRXxXSElMRXxXSU5ET1d8V0lUSHxXT1JLfFhPUilcXGIvaSxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpGQUxTRXxUUlVFKVxcYi9pLFxuXHQnbnVtYmVyJzogLyg/OlxcYlxcZCtcXC58XFxCXFwuKVxcZCtlWytcXC1dP1xcZCtcXGJ8XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrXFxiL2ksXG5cdCdvcGVyYXRvcic6IC9bLSsqXFwvJV18IT18PT0/fFxcfFxcfHw8Wz49XT98Pj0/fFxcYig/OkFORHxBTll8QVJSQVl8QkVUV0VFTnxDQVNFfEVMU0V8RU5EfEVWRVJZfEVYSVNUU3xGSVJTVHxJTnxMSUtFfE5PVHxPUnxUSEVOfFZBTFVFRHxXSEVOfFdJVEhJTilcXGIvaSxcblx0J3B1bmN0dWF0aW9uJzogL1s7W1xcXSgpLC57fTpdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm40anMgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdqYXZhc2NyaXB0Jywge1xuXHQvLyBLZXl3b3JkcyBmcm9tIE40SlMgbGFuZ3VhZ2Ugc3BlYzogaHR0cHM6Ly9udW1iZXJmb3VyLmdpdGh1Yi5pby9uNGpzL3NwZWMvTjRKU1NwZWMuaHRtbFxuXHQna2V5d29yZCc6IC9cXGIoPzpBcnJheXxhbnl8Ym9vbGVhbnxicmVha3xjYXNlfGNhdGNofGNsYXNzfGNvbnN0fGNvbnN0cnVjdG9yfGNvbnRpbnVlfGRlYnVnZ2VyfGRlY2xhcmV8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxlbnVtfGV4cG9ydHxleHRlbmRzfGZhbHNlfGZpbmFsbHl8Zm9yfGZyb218ZnVuY3Rpb258Z2V0fGlmfGltcGxlbWVudHN8aW1wb3J0fGlufGluc3RhbmNlb2Z8aW50ZXJmYWNlfGxldHxtb2R1bGV8bmV3fG51bGx8bnVtYmVyfHBhY2thZ2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJldHVybnxzZXR8c3RhdGljfHN0cmluZ3xzdXBlcnxzd2l0Y2h8dGhpc3x0aHJvd3x0cnVlfHRyeXx0eXBlb2Z8dmFyfHZvaWR8d2hpbGV8d2l0aHx5aWVsZClcXGIvXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnbjRqcycsICdjb25zdGFudCcsIHtcblx0Ly8gQW5ub3RhdGlvbnMgaW4gTjRKUyBzcGVjOiBodHRwczovL251bWJlcmZvdXIuZ2l0aHViLmlvL240anMvc3BlYy9ONEpTU3BlYy5odG1sI19hbm5vdGF0aW9uc1xuXHQnYW5ub3RhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvQCtcXHcrLyxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLm40anNkID0gUHJpc20ubGFuZ3VhZ2VzLm40anM7XG5cblByaXNtLmxhbmd1YWdlc1snbmFuZDJ0ZXRyaXMtaGRsJ10gPSB7XG5cdCdjb21tZW50JzogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHQna2V5d29yZCc6IC9cXGIoPzpCVUlMVElOfENISVB8Q0xPQ0tFRHxJTnxPVVR8UEFSVFMpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiW0EtWmEtel1bQS1aYS16MC05XSooPz1cXCgpLyxcblx0J251bWJlcic6IC9cXGJcXGQrXFxiLyxcblx0J29wZXJhdG9yJzogLz18XFwuXFwuLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksOl0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGV4cHJlc3Npb25EZWYgPSAvXFx7W15cXHJcXG5cXFtcXF17fV0qXFx9LztcblxuXHR2YXIgcGFyYW1zID0ge1xuXHRcdCdxdW90ZWQtc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxdfFxcXFwuKSpcIi8sXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH0sXG5cdFx0J2NvbW1hbmQtcGFyYW0taWQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxccylcXHcrOi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHR9LFxuXHRcdCdjb21tYW5kLXBhcmFtLXZhbHVlJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBleHByZXNzaW9uRGVmLFxuXHRcdFx0XHRhbGlhczogJ3NlbGVjdG9yJyxcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oW1xcdCBdKVxcUysvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcUyg/Oi4qXFxTKT8vLFxuXHRcdFx0XHRhbGlhczogJ29wZXJhdG9yJyxcblx0XHRcdH1cblx0XHRdXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLm5hbmlzY3JpcHQgPSB7XG5cdFx0Ly8gOyAuLi5cblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9eKFtcXHQgXSopOy4qL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdH0sXG5cdFx0Ly8gPiAuLi5cblx0XHQvLyBEZWZpbmUgaXMgYSBjb250cm9sIGxpbmUgc3RhcnRpbmcgd2l0aCAnPicgZm9sbG93ZWQgYnkgYSB3b3JkLCBhIHNwYWNlIGFuZCBhIHRleHQuXG5cdFx0J2RlZmluZSc6IHtcblx0XHRcdHBhdHRlcm46IC9ePi4rL20sXG5cdFx0XHRhbGlhczogJ3RhZycsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3ZhbHVlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXj5cXHcrW1xcdCBdKykoPyFcXHMpW157fVxcclxcbl0rLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdrZXknOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhePilcXHcrLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvLyAjIC4uLlxuXHRcdCdsYWJlbCc6IHtcblx0XHRcdHBhdHRlcm46IC9eKFtcXHQgXSopI1tcXHQgXSpcXHcrW1xcdCBdKiQvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3JlZ2V4J1xuXHRcdH0sXG5cdFx0J2NvbW1hbmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihbXFx0IF0qKUBcXHcrKD89W1xcdCBdfCQpLiovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY29tbWFuZC1uYW1lJzogL15AXFx3Ky8sXG5cdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IGV4cHJlc3Npb25EZWYsXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnc2VsZWN0b3InXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjb21tYW5kLXBhcmFtcyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxzKlxcU1tcXHNcXFNdKi8sXG5cdFx0XHRcdFx0aW5zaWRlOiBwYXJhbXNcblx0XHRcdFx0fSxcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8vIEdlbmVyaWMgaXMgYW55IGxpbmUgdGhhdCBkb2Vzbid0IHN0YXJ0IHdpdGggb3BlcmF0b3JzOiA7PiNAXG5cdFx0J2dlbmVyaWMtdGV4dCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopW14jQD47XFxzXS4qL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbicsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0Ly8gXFx7IC4uLiBcXH0gLi4uIFxcWyAuLi4gXFxdIC4uLiBcXFwiXG5cdFx0XHRcdCdlc2NhcGVkLWNoYXInOiAvXFxcXFt7fVxcW1xcXVwiXS8sXG5cdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IGV4cHJlc3Npb25EZWYsXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnc2VsZWN0b3InXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdpbmxpbmUtY29tbWFuZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxbW1xcdCBdKlxcd1teXFxyXFxuXFxbXFxdXSpcXF0vLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2Z1bmN0aW9uJyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdjb21tYW5kLXBhcmFtcyc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyheXFxbW1xcdCBdKlxcdytcXGIpW1xcc1xcU10rKD89XFxdJCkvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IHBhcmFtc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdjb21tYW5kLXBhcmFtLW5hbWUnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9eKFxcW1tcXHQgXSopXFx3Ky8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAnbmFtZScsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3N0YXJ0LXN0b3AtY2hhcic6IC9bXFxbXFxdXS8sXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0UHJpc20ubGFuZ3VhZ2VzLm5hbmkgPSBQcmlzbS5sYW5ndWFnZXNbJ25hbmlzY3JpcHQnXTtcblxuXHQvKiogQHR5cGVkZWYge0luc3RhbmNlVHlwZTxpbXBvcnQoXCIuL3ByaXNtLWNvcmVcIilbXCJUb2tlblwiXT59IFRva2VuICovXG5cblx0LyoqXG5cdCAqIFRoaXMgaG9vayBpcyB1c2VkIHRvIHZhbGlkYXRlIGdlbmVyaWMtdGV4dCB0b2tlbnMgZm9yIGJhbGFuY2VkIGJyYWNrZXRzLlxuXHQgKiBNYXJrIHRva2VuIGFzIGJhZC1saW5lIHdoZW4gY29udGFpbnMgbm90IGJhbGFuY2VkIGJyYWNrZXRzOiB7fSxbXVxuXHQgKi9cblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHQvKiogQHR5cGUgeyhUb2tlbiB8IHN0cmluZylbXX0gKi9cblx0XHR2YXIgdG9rZW5zID0gZW52LnRva2Vucztcblx0XHR0b2tlbnMuZm9yRWFjaChmdW5jdGlvbiAodG9rZW4pIHtcblx0XHRcdGlmICh0eXBlb2YgdG9rZW4gIT09ICdzdHJpbmcnICYmIHRva2VuLnR5cGUgPT09ICdnZW5lcmljLXRleHQnKSB7XG5cdFx0XHRcdHZhciBjb250ZW50ID0gZ2V0VGV4dENvbnRlbnQodG9rZW4pO1xuXHRcdFx0XHRpZiAoIWlzQnJhY2tldHNCYWxhbmNlZChjb250ZW50KSkge1xuXHRcdFx0XHRcdHRva2VuLnR5cGUgPSAnYmFkLWxpbmUnO1xuXHRcdFx0XHRcdHRva2VuLmNvbnRlbnQgPSBjb250ZW50O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaW5wdXRcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRmdW5jdGlvbiBpc0JyYWNrZXRzQmFsYW5jZWQoaW5wdXQpIHtcblx0XHR2YXIgYnJhY2tldHMgPSAnW117fSc7XG5cdFx0dmFyIHN0YWNrID0gW107XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIGJyYWNrZXQgPSBpbnB1dFtpXTtcblx0XHRcdHZhciBicmFja2V0c0luZGV4ID0gYnJhY2tldHMuaW5kZXhPZihicmFja2V0KTtcblx0XHRcdGlmIChicmFja2V0c0luZGV4ICE9PSAtMSkge1xuXHRcdFx0XHRpZiAoYnJhY2tldHNJbmRleCAlIDIgPT09IDApIHtcblx0XHRcdFx0XHRzdGFjay5wdXNoKGJyYWNrZXRzSW5kZXggKyAxKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzdGFjay5wb3AoKSAhPT0gYnJhY2tldHNJbmRleCkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gc3RhY2subGVuZ3RoID09PSAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nIHwgVG9rZW4gfCAoc3RyaW5nIHwgVG9rZW4pW119IHRva2VuXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRUZXh0Q29udGVudCh0b2tlbikge1xuXHRcdGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gdG9rZW47XG5cdFx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRva2VuKSkge1xuXHRcdFx0cmV0dXJuIHRva2VuLm1hcChnZXRUZXh0Q29udGVudCkuam9pbignJyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBnZXRUZXh0Q29udGVudCh0b2tlbi5jb250ZW50KTtcblx0XHR9XG5cdH1cblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMubmFzbSA9IHtcblx0J2NvbW1lbnQnOiAvOy4qJC9tLFxuXHQnc3RyaW5nJzogLyhbXCInYF0pKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdCdsYWJlbCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5cXHMqKVtBLVphLXouXz8kXVtcXHcuPyRAfiNdKjovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdrZXl3b3JkJzogW1xuXHRcdC9cXFs/QklUUyAoPzoxNnwzMnw2NClcXF0/Lyxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF5cXHMqKXNlY3Rpb25cXHMqW2Etei5dKzo/L2ltLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0Lyg/OmV4dGVybnxnbG9iYWwpW147XFxyXFxuXSovaSxcblx0XHQvKD86Q1BVfERFRkFVTFR8RkxPQVQpLiokL21cblx0XSxcblx0J3JlZ2lzdGVyJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpzdFxcZHxbeHl6XW1tXFxkXFxkP3xbY2R0XXJcXGR8clxcZFxcZD9bYndkXT98W2VyXT9bYWJjZF14fFthYmNkXVtobF18W2VyXT8oPzpicHxkaXxzaXxzcCl8W2NkZWZnc11zKVxcYi9pLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdudW1iZXInOiAvKD86XFxifCg/PVxcJCkpKD86MFtoeF0oPzpcXC5bXFxkYS1mXSt8W1xcZGEtZl0rKD86XFwuW1xcZGEtZl0rKT8pKD86cFsrLV0/XFxkKyk/fFxcZFtcXGRhLWZdK1toeF18XFwkXFxkW1xcZGEtZl0qfDBbb3FdWzAtN10rfFswLTddK1tvcV18MFtieV1bMDFdK3xbMDFdK1tieV18MFtkdF1cXGQrfCg/OlxcZCsoPzpcXC5cXGQrKT98XFwuXFxkKykoPzpcXC4/ZVsrLV0/XFxkKyk/W2R0XT8pXFxiL2ksXG5cdCdvcGVyYXRvcic6IC9bXFxbXFxdKitcXC1cXC8lPD49JnwkIV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubmVvbiA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdkYXRldGltZSc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W1t7KD06LFxcc10pXFxkXFxkXFxkXFxkLVxcZFxcZD8tXFxkXFxkPyg/Oig/OltUdF18ICspXFxkXFxkPzpcXGRcXGQ6XFxkXFxkKD86XFwuXFxkKik/ICooPzpafFstK11cXGRcXGQ/KD86Oj9cXGRcXGQpPyk/KT8oPz0kfFtcXF19KSxcXHNdKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ251bWJlcidcblx0fSxcblx0J2tleSc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W1t7KCxcXHNdKVteLDo9W1xcXXt9KCknXCJcXHNdKyg/PVxccyo6KD86JHxbXFxdfSksXFxzXSl8XFxzKj0pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyhefFtbeyg9OixcXHNdKVsrLV0/KD86MHhbXFxkYS1mQS1GXSt8MG9bMC03XSt8MGJbMDFdK3woPzpcXGQrKD86XFwuXFxkKik/fFxcLj9cXGQrKSg/OltlRV1bKy1dP1xcZCspPykoPz0kfFtcXF19KSw6PVxcc10pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdib29sZWFuJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbW3soPTosXFxzXSkoPzpmYWxzZXxub3x0cnVlfHllcykoPz0kfFtcXF19KSw6PVxcc10pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnbnVsbCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W1t7KD06LFxcc10pKD86bnVsbCkoPz0kfFtcXF19KSw6PVxcc10pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFtbeyg9OixcXHNdKSg/OignJyd8XCJcIlwiKVxccj9cXG4oPzooPzpbXlxcclxcbl18XFxyP1xcbig/IVtcXHQgXSpcXDIpKSpcXHI/XFxuKT9bXFx0IF0qXFwyfCdbXidcXHJcXG5dKid8XCIoPzpcXFxcLnxbXlxcXFxcIlxcclxcbl0pKlwiKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2xpdGVyYWwnOiB7XG5cdFx0cGF0dGVybjogLyhefFtbeyg9OixcXHNdKSg/OlteI1wiJyw6PVtcXF17fSgpXFxzYC1dfFs6LV1bXlwiJyw9W1xcXXt9KClcXHNdKSg/OlteLDo9XFxdfSkoXFxzXXw6KD8hW1xccyxcXF19KV18JCl8WyBcXHRdK1teIyw6PVxcXX0pKFxcc10pKi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3N0cmluZycsXG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9bLDo9W1xcXXt9KCktXS8sXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubmV2b2QgPSB7XG5cdCdjb21tZW50JzogL1xcL1xcLy4qfCg/OlxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkpLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKD86XCIoPzpcIlwifFteXCJdKSpcIig/IVwiKXwnKD86Jyd8W14nXSkqJyg/IScpKSE/XFwqPy8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3N0cmluZy1hdHRycyc6IC8hJHwhXFwqJHxcXCokLyxcblx0XHR9LFxuXHR9LFxuXHQnbmFtZXNwYWNlJzoge1xuXHRcdHBhdHRlcm46IC8oQG5hbWVzcGFjZVxccyspW2EtekEtWjAtOVxcLS5dKyg/PVxccypcXHspLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHR9LFxuXHQncGF0dGVybic6IHtcblx0XHRwYXR0ZXJuOiAvKEBwYXR0ZXJuXFxzKyk/Iz9bYS16QS1aMC05XFwtLl0rKD86XFxzKlxcKFxccyooPzp+XFxzKik/W2EtekEtWjAtOVxcLS5dK1xccyooPzosXFxzKig/On5cXHMqKT9bYS16QS1aMC05XFwtLl0qKSpcXCkpPyg/PVxccyo9KS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwYXR0ZXJuLW5hbWUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eIz9bYS16QS1aMC05XFwtLl0rLyxcblx0XHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJyxcblx0XHRcdH0sXG5cdFx0XHQnZmllbGRzJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwoLipcXCkvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZmllbGQtbmFtZSc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9bYS16QS1aMC05XFwtLl0rLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1ssKCldLyxcblx0XHRcdFx0XHQnb3BlcmF0b3InOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvfi8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ2ZpZWxkLWhpZGRlbi1tYXJrJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXHQnc2VhcmNoJzoge1xuXHRcdHBhdHRlcm46IC8oQHNlYXJjaFxccyt8IylbYS16QS1aMC05XFwtLl0rKD86XFwuXFwqKT8oPz1cXHMqOykvLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdH0sXG5cdCdrZXl3b3JkJzogL0AoPzpoYXZpbmd8aW5zaWRlfG5hbWVzcGFjZXxvdXRzaWRlfHBhdHRlcm58cmVxdWlyZXxzZWFyY2h8d2hlcmUpXFxiLyxcblx0J3N0YW5kYXJkLXBhdHRlcm4nOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OkFscGhhfEFscGhhTnVtfEFueXxCbGFua3xFbmR8TGluZUJyZWFrfE51bXxOdW1BbHBoYXxQdW5jdHxTcGFjZXxTdGFydHxTeW1ib2x8V29yZHxXb3JkQnJlYWspXFxiKD86XFwoW2EtekEtWjAtOVxcLS4sXFxzK10qXFwpKT8vLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3N0YW5kYXJkLXBhdHRlcm4tbmFtZSc6IHtcblx0XHRcdFx0cGF0dGVybjogL15bYS16QS1aMC05XFwtLl0rLyxcblx0XHRcdFx0YWxpYXM6ICdidWlsdGluJyxcblx0XHRcdH0sXG5cdFx0XHQncXVhbnRpZmllcic6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcYlxcZCsoPzpcXHMqXFwrfFxccyotXFxzKlxcZCspPyg/IVxcdykvLFxuXHRcdFx0XHRhbGlhczogJ251bWJlcicsXG5cdFx0XHR9LFxuXHRcdFx0J3N0YW5kYXJkLXBhdHRlcm4tYXR0cic6IHtcblx0XHRcdFx0cGF0dGVybjogL1thLXpBLVowLTlcXC0uXSsvLFxuXHRcdFx0XHRhbGlhczogJ2J1aWx0aW4nLFxuXHRcdFx0fSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bLCgpXS8sXG5cdFx0fSxcblx0fSxcblx0J3F1YW50aWZpZXInOiB7XG5cdFx0cGF0dGVybjogL1xcYlxcZCsoPzpcXHMqXFwrfFxccyotXFxzKlxcZCspPyg/IVxcdykvLFxuXHRcdGFsaWFzOiAnbnVtYmVyJyxcblx0fSxcblx0J29wZXJhdG9yJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC89Lyxcblx0XHRcdGFsaWFzOiAncGF0dGVybi1kZWYnLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyYvLFxuXHRcdFx0YWxpYXM6ICdjb25qdW5jdGlvbicsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvfi8sXG5cdFx0XHRhbGlhczogJ2V4Y2VwdGlvbicsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFw/Lyxcblx0XHRcdGFsaWFzOiAnb3B0aW9uYWxpdHknLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1tbXFxdXS8sXG5cdFx0XHRhbGlhczogJ3JlcGV0aXRpb24nLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1t7fV0vLFxuXHRcdFx0YWxpYXM6ICd2YXJpYXRpb24nLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1srX10vLFxuXHRcdFx0YWxpYXM6ICdzZXF1ZW5jZScsXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFwuezIsM30vLFxuXHRcdFx0YWxpYXM6ICdzcGFuJyxcblx0XHR9LFxuXHRdLFxuXHQnZmllbGQtY2FwdHVyZSc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFthLXpBLVowLTlcXC0uXStcXHMqXFwoKVxccypbYS16QS1aMC05XFwtLl0rXFxzKjpcXHMqW2EtekEtWjAtOVxcLS5dKyg/OlxccyosXFxzKlthLXpBLVowLTlcXC0uXStcXHMqOlxccypbYS16QS1aMC05XFwtLl0rKSooPz1cXHMqXFwpKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmaWVsZC1uYW1lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9bYS16QS1aMC05XFwtLl0rLyxcblx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0J2NvbG9uJzogLzovLFxuXHRcdFx0fSxcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9bYS16QS1aMC05XFwtLl0rXFxzKjovLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmaWVsZC1uYW1lJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9bYS16QS1aMC05XFwtLl0rLyxcblx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0J2NvbG9uJzogLzovLFxuXHRcdFx0fSxcblx0XHR9LFxuXHRdLFxuXHQncHVuY3R1YXRpb24nOiAvWzo7LCgpXS8sXG5cdCduYW1lJzogL1thLXpBLVowLTlcXC0uXSsvXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIHZhcmlhYmxlID0gL1xcJCg/Olxcd1thLXpcXGRdKig/Ol9bXlxceDAwLVxceDFGXFxzXCInXFxcXCgpJF0qKT98XFx7W159XFxzXCInXFxcXF0rXFx9KS9pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5uZ2lueCA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXFxze307XSkjLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpXFx3KD86W147e31cIidcXFxcXFxzXXxcXFxcLnxcIig/OlteXCJcXFxcXXxcXFxcLikqXCJ8Jyg/OlteJ1xcXFxdfFxcXFwuKSonfFxccysoPzojLiooPyEuKXwoPyFbI1xcc10pKSkqPyg/PVxccypbO3tdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXFxcXFwpKikoPzpcIig/OlteXCJcXFxcXXxcXFxcLikqXCJ8Jyg/OlteJ1xcXFxdfFxcXFwuKSonKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnZXNjYXBlJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxcXFtcIidcXFxcbnJ0XS8sXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAnZW50aXR5J1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCd2YXJpYWJsZSc6IHZhcmlhYmxlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnY29tbWVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxccykjLiovLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFxTKy8sXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gb3RoZXIgcGF0dGVybnNcblxuXHRcdFx0XHQnYm9vbGVhbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxccykoPzpvZmZ8b24pKD8hXFxTKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnbnVtYmVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXFxzKVxcZCtbYS16XSooPyFcXFMpL2ksXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQndmFyaWFibGUnOiB2YXJpYWJsZVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t7fTtdL1xuXHR9O1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5uaW0gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdC8vIERvdWJsZS1xdW90ZWQgc3RyaW5ncyBjYW4gYmUgcHJlZml4ZWQgYnkgYW4gaWRlbnRpZmllciAoR2VuZXJhbGl6ZWQgcmF3IHN0cmluZyBsaXRlcmFscylcblx0XHRwYXR0ZXJuOiAvKD86XFxiKD8hXFxkKSg/Olxcd3xcXFxceFs4OWEtZkEtRl1bMC05YS1mQS1GXSkrKT8oPzpcIlwiXCJbXFxzXFxTXSo/XCJcIlwiKD8hXCIpfFwiKD86XFxcXFtcXHNcXFNdfFwiXCJ8W15cIlxcXFxdKSpcIikvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnY2hhcic6IHtcblx0XHQvLyBDaGFyYWN0ZXIgbGl0ZXJhbHMgYXJlIGhhbmRsZWQgc3BlY2lmaWNhbGx5IHRvIHByZXZlbnQgaXNzdWVzIHdpdGggbnVtZXJpYyB0eXBlIHN1ZmZpeGVzXG5cdFx0cGF0dGVybjogLycoPzpcXFxcKD86XFxkK3x4W1xcZGEtZkEtRl17MCwyfXwuKXxbXiddKScvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKD86KD8hXFxkKSg/Olxcd3xcXFxceFs4OWEtZkEtRl1bMC05YS1mQS1GXSkrfGBbXmBcXHJcXG5dK2ApXFwqPyg/OlxcW1teXFxdXStcXF0pPyg/PVxccypcXCgpLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnb3BlcmF0b3InOiAvXFwqJC9cblx0XHR9XG5cdH0sXG5cdC8vIFdlIGRvbid0IHdhbnQgdG8gaGlnaGxpZ2h0IG9wZXJhdG9ycyAoYW5kIGFueXRoaW5nIHJlYWxseSkgaW5zaWRlIGJhY2t0aWNrc1xuXHQnaWRlbnRpZmllcic6IHtcblx0XHRwYXR0ZXJuOiAvYFteYFxcclxcbl0rYC8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL2AvXG5cdFx0fVxuXHR9LFxuXG5cdC8vIFRoZSBuZWdhdGl2ZSBsb29rIGFoZWFkIHByZXZlbnRzIHdyb25nIGhpZ2hsaWdodGluZyBvZiB0aGUgLi4gb3BlcmF0b3Jcblx0J251bWJlcic6IC9cXGIoPzowW3hYb09iQl1bXFxkYS1mQS1GX10rfFxcZFtcXGRfXSooPzooPyFcXC5cXC4pXFwuW1xcZF9dKik/KD86W2VFXVsrLV0/XFxkW1xcZF9dKik/KSg/Oic/W2l1Zl1cXGQqKT8vLFxuXHQna2V5d29yZCc6IC9cXGIoPzphZGRyfGFzfGFzbXxhdG9taWN8YmluZHxibG9ja3xicmVha3xjYXNlfGNhc3R8Y29uY2VwdHxjb25zdHxjb250aW51ZXxjb252ZXJ0ZXJ8ZGVmZXJ8ZGlzY2FyZHxkaXN0aW5jdHxkb3xlbGlmfGVsc2V8ZW5kfGVudW18ZXhjZXB0fGV4cG9ydHxmaW5hbGx5fGZvcnxmcm9tfGZ1bmN8Z2VuZXJpY3xpZnxpbXBvcnR8aW5jbHVkZXxpbnRlcmZhY2V8aXRlcmF0b3J8bGV0fG1hY3JvfG1ldGhvZHxtaXhpbnxuaWx8b2JqZWN0fG91dHxwcm9jfHB0cnxyYWlzZXxyZWZ8cmV0dXJufHN0YXRpY3x0ZW1wbGF0ZXx0cnl8dHVwbGV8dHlwZXx1c2luZ3x2YXJ8d2hlbnx3aGlsZXx3aXRofHdpdGhvdXR8eWllbGQpXFxiLyxcblx0J29wZXJhdG9yJzoge1xuXHRcdC8vIExvb2sgYmVoaW5kIGFuZCBsb29rIGFoZWFkIHByZXZlbnQgd3JvbmcgaGlnaGxpZ2h0aW5nIG9mIHB1bmN0dWF0aW9ucyBbLiAuXSB7LiAufSAoLiAuKVxuXHRcdC8vIGJ1dCBhbGxvdyB0aGUgc2xpY2Ugb3BlcmF0b3IgLi4gdG8gdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlbVxuXHRcdC8vIE9uZSBjYW4gZGVmaW5lIGhpcyBvd24gb3BlcmF0b3JzIGluIE5pbSBzbyBhbGwgY29tYmluYXRpb24gb2Ygb3BlcmF0b3JzIG1pZ2h0IGJlIGFuIG9wZXJhdG9yLlxuXHRcdHBhdHRlcm46IC8oXnxbKHtcXFtdKD89XFwuXFwuKXwoPyFbKHtcXFtdXFwuKS4pKD86KD86Wz0rXFwtKlxcLzw+QCR+JiV8IT9eOlxcXFxdfFxcLlxcLnxcXC4oPyFbKX1cXF1dKSkrfFxcYig/OmFuZHxkaXZ8aW58aXN8aXNub3R8bW9kfG5vdHxub3RpbnxvZnxvcnxzaGx8c2hyfHhvcilcXGIpL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvWyh7XFxbXVxcLnxcXC5bKX1cXF1dfFtgKCl7fVxcW1xcXSw6XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5uaXggPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfCMuKi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxdfFxcXFxbXFxzXFxTXSkqXCJ8JycoPzooPyEnJylbXFxzXFxTXXwnJyg/Oid8XFxcXHxcXCRcXHspKSonJy8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdC8vIFRoZSBsb29rYmVoaW5kIGVuc3VyZXMgdGhlICR7fSBpcyBub3QgcHJlY2VkZWQgYnkgXFwgb3IgJydcblx0XHRcdFx0cGF0dGVybjogLyhefCg/Ol58KD8hJycpLilbXlxcXFxdKVxcJFxceyg/Oltee31dfFxce1tefV0qXFx9KSpcXH0vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQndXJsJzogW1xuXHRcdC9cXGIoPzpbYS16XXszLDd9OlxcL1xcLylbXFx3XFwtKyV+XFwvLjojPT8mXSsvLFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oW15cXC9dKSg/OltcXHdcXC0rJX4uOiM9PyZdKig/IVxcL1xcLylbXFx3XFwtKyV+XFwvLjojPT8mXSk/KD8hXFwvXFwvKVxcL1tcXHdcXC0rJX5cXC8uOiM9PyZdKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnYW50aXF1b3RhdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvXFwkKD89XFx7KS8sXG5cdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdH0sXG5cdCdudW1iZXInOiAvXFxiXFxkK1xcYi8sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFzc2VydHxidWlsdGluc3xlbHNlfGlmfGlufGluaGVyaXR8bGV0fG51bGx8b3J8dGhlbnx3aXRoKVxcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGIoPzphYm9ydHxhZGR8YWxsfGFueXxhdHRyTmFtZXN8YXR0clZhbHVlc3xiYXNlTmFtZU9mfGNvbXBhcmVWZXJzaW9uc3xjb25jYXRMaXN0c3xjdXJyZW50U3lzdGVtfGRlZXBTZXF8ZGVyaXZhdGlvbnxkaXJPZnxkaXZ8ZWxlbSg/OkF0KT98ZmV0Y2goPzpUYXJiYWxsfHVybCl8ZmlsdGVyKD86U291cmNlKT98ZnJvbUpTT058Z2VuTGlzdHxnZXRBdHRyfGdldEVudnxoYXNBdHRyfGhhc2hTdHJpbmd8aGVhZHxpbXBvcnR8aW50ZXJzZWN0QXR0cnN8aXMoPzpBdHRyc3xCb29sfEZ1bmN0aW9ufEludHxMaXN0fE51bGx8U3RyaW5nKXxsZW5ndGh8bGVzc1RoYW58bGlzdFRvQXR0cnN8bWFwfG11bHxwYXJzZURydk5hbWV8cGF0aEV4aXN0c3xyZWFkKD86RGlyfEZpbGUpfHJlbW92ZUF0dHJzfHJlcGxhY2VTdHJpbmdzfHNlcXxzb3J0fHN0cmluZ0xlbmd0aHxzdWIoPzpzdHJpbmcpP3x0YWlsfHRocm93fHRvKD86RmlsZXxKU09OfFBhdGh8U3RyaW5nfFhNTCl8dHJhY2V8dHlwZU9mKVxcYnxcXGJmb2xkbCdcXEIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdvcGVyYXRvcic6IC9bPSE8Pl09P3xcXCtcXCs/fFxcfFxcfHwmJnxcXC9cXC98LT4/fFs/QF0vLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9KClbXFxdLiw6O10vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMubml4LnN0cmluZy5pbnNpZGUuaW50ZXJwb2xhdGlvbi5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMubml4O1xuXG4vKipcbiAqIE9yaWdpbmFsIGJ5IEphbiBULiBTb3R0IChodHRwOi8vZ2l0aHViLmNvbS9pZGxlYmVyZylcbiAqXG4gKiBJbmNsdWRlcyBhbGwgY29tbWFuZHMgYW5kIHBsdWctaW5zIHNoaXBwZWQgd2l0aCBOU0lTIDMuMDhcbiAqL1xuUHJpc20ubGFuZ3VhZ2VzLm5zaXMgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OlxcL1xcKltcXHNcXFNdKj9cXCpcXC98WyM7XS4qKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFwifCcpKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopKD86QWJvcnR8QWRkKD86QnJhbmRpbmdJbWFnZXxTaXplKXxBZHZTcGxhc2h8QWxsb3coPzpSb290RGlySW5zdGFsbHxTa2lwRmlsZXMpfEF1dG9DbG9zZVdpbmRvd3xCRyg/OkZvbnR8R3JhZGllbnR8SW1hZ2UpfEJhbm5lcnxCcmFuZGluZ1RleHR8QnJpbmdUb0Zyb250fENSQ0NoZWNrfENhbGwoPzpJbnN0RExMKT98Q2FwdGlvbnxDaGFuZ2VVSXxDaGVja0JpdG1hcHxDbGVhckVycm9yc3xDb21wbGV0ZWRUZXh0fENvbXBvbmVudFRleHR8Q29weUZpbGVzfENyZWF0ZSg/OkRpcmVjdG9yeXxGb250fFNob3J0Q3V0KXxEZWxldGUoPzpJTklTZWN8SU5JU3RyfFJlZ0tleXxSZWdWYWx1ZSk/fERldGFpbCg/OlByaW50fHNCdXR0b25UZXh0KXxEaWFsZXJ8RGlyKD86VGV4dHxWYXJ8VmVyaWZ5KXxFbmFibGVXaW5kb3d8RW51bSg/OlJlZ0tleXxSZWdWYWx1ZSl8RXhjaHxFeGVjKD86U2hlbGwoPzpXYWl0KT98V2FpdCk/fEV4cGFuZEVudlN0cmluZ3N8RmlsZSg/OkJ1ZlNpemV8Q2xvc2V8RXJyb3JUZXh0fE9wZW58UmVhZHxSZWFkQnl0ZXxSZWFkVVRGMTZMRXxSZWFkV29yZHxTZWVrfFdyaXRlfFdyaXRlQnl0ZXxXcml0ZVVURjE2TEV8V3JpdGVXb3JkKT98RmluZCg/OkNsb3NlfEZpcnN0fE5leHR8V2luZG93KXxGbHVzaElOSXxHZXQoPzpDdXJJbnN0VHlwZXxDdXJyZW50QWRkcmVzc3xETExWZXJzaW9uKD86TG9jYWwpP3xEbGdJdGVtfEVycm9yTGV2ZWx8RmlsZVRpbWUoPzpMb2NhbCk/fEZ1bGxQYXRoTmFtZXxGdW5jdGlvbig/OkFkZHJlc3N8RW5kKT98SW5zdERpckVycm9yfExhYmVsQWRkcmVzc3xUZW1wRmlsZU5hbWUpfEdvdG98SGlkZVdpbmRvd3xJY29ufElmKD86QWJvcnR8RXJyb3JzfEZpbGVFeGlzdHN8UmVib290RmxhZ3xTaWxlbnQpfEluaXRQbHVnaW5zRGlyfEluc3RQcm9ncmVzc0ZsYWdzfEluc3QoPzpUeXBlKD86R2V0VGV4dHxTZXRUZXh0KT8pfEluc3RhbGwoPzpCdXR0b25UZXh0fENvbG9yc3xEaXIoPzpSZWdLZXkpPyl8SW50KD86NjR8UHRyKT9DbXBVP3xJbnQoPzo2NCk/Rm10fEludCg/OlB0cik/T3B8SXNXaW5kb3d8TGFuZyg/OkRMTHxTdHJpbmcpfExpY2Vuc2UoPzpCa0NvbG9yfERhdGF8Rm9yY2VTZWxlY3Rpb258TGFuZ1N0cmluZ3xUZXh0KXxMb2FkTGFuZ3VhZ2VGaWxlfExvY2tXaW5kb3d8TG9nKD86U2V0fFRleHQpfE1hbmlmZXN0KD86RFBJQXdhcmV8U3VwcG9ydGVkT1MpfE1hdGh8TWVzc2FnZUJveHxNaXNjQnV0dG9uVGV4dHxOU0lTZGx8TmFtZXxOb3B8T3V0RmlsZXxQRSg/OkRsbENoYXJhY3RlcmlzdGljc3xTdWJzeXNWZXIpfFBhZ2UoPzpDYWxsYmFja3MpP3xQb3B8UHVzaHxRdWl0fFJNRGlyfFJlYWQoPzpFbnZTdHJ8SU5JU3RyfFJlZ0RXT1JEfFJlZ1N0cil8UmVib290fFJlZ0RMTHxSZW5hbWV8UmVxdWVzdEV4ZWN1dGlvbkxldmVsfFJlc2VydmVGaWxlfFJldHVybnxTZWFyY2hQYXRofFNlY3Rpb24oPzpFbmR8R2V0RmxhZ3N8R2V0SW5zdFR5cGVzfEdldFNpemV8R2V0VGV4dHxHcm91cHxJbnxTZXRGbGFnc3xTZXRJbnN0VHlwZXN8U2V0U2l6ZXxTZXRUZXh0KT98U2VuZE1lc3NhZ2V8U2V0KD86QXV0b0Nsb3NlfEJyYW5kaW5nSW1hZ2V8Q29tcHJlc3N8Q29tcHJlc3Nvcig/OkRpY3RTaXplKT98Q3RsQ29sb3JzfEN1ckluc3RUeXBlfERhdGFibG9ja09wdGltaXplfERhdGVTYXZlfERldGFpbHMoPzpQcmludHxWaWV3KXxFcnJvckxldmVsfEVycm9yc3xGaWxlQXR0cmlidXRlc3xGb250fE91dFBhdGh8T3ZlcndyaXRlfFBsdWdpblVubG9hZHxSZWJvb3RGbGFnfFJlZ1ZpZXd8U2hlbGxWYXJDb250ZXh0fFNpbGVudCl8U2hvdyg/Okluc3REZXRhaWxzfFVuaW5zdERldGFpbHN8V2luZG93KXxTaWxlbnQoPzpJbnN0YWxsfFVuSW5zdGFsbCl8U2xlZXB8U3BhY2VUZXh0c3xTcGxhc2h8U3RhcnRNZW51fFN0cig/OkNtcFM/fENweXxMZW4pfFN1YkNhcHRpb258U3lzdGVtfFVuUmVnRExMfFVuaWNvZGV8VW5pbnN0UGFnZXxVbmluc3RhbGwoPzpCdXR0b25UZXh0fENhcHRpb258SWNvbnxTdWJDYXB0aW9ufFRleHQpfFVzZXJJbmZvfFZJKD86QWRkVmVyc2lvbktleXxGaWxlVmVyc2lvbnxQcm9kdWN0VmVyc2lvbil8VlBhdGNofFZhcnxXaW5kb3dJY29ufFdyaXRlKD86SU5JU3RyfFJlZyg/OkJpbnxEV09SRHxFeHBhbmRTdHJ8TXVsdGlTdHJ8Tm9uZXxTdHIpfFVuaW5zdGFsbGVyKXxYUFN0eWxlfG5zKD86RGlhbG9nc3xFeGVjKSlcXGIvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdwcm9wZXJ0eSc6IC9cXGIoPzpBUkNISVZFfEZJTEVfKD86QVRUUklCVVRFX0FSQ0hJVkV8QVRUUklCVVRFX05PUk1BTHxBVFRSSUJVVEVfT0ZGTElORXxBVFRSSUJVVEVfUkVBRE9OTFl8QVRUUklCVVRFX1NZU1RFTXxBVFRSSUJVVEVfVEVNUE9SQVJZKXxISyg/Oig/OkNSfENVfExNKSg/OjMyfDY0KT98RER8UER8VSl8SEtFWV8oPzpDTEFTU0VTX1JPT1R8Q1VSUkVOVF9DT05GSUd8Q1VSUkVOVF9VU0VSfERZTl9EQVRBfExPQ0FMX01BQ0hJTkV8UEVSRk9STUFOQ0VfREFUQXxVU0VSUyl8SUQoPzpBQk9SVHxDQU5DRUx8SUdOT1JFfE5PfE9LfFJFVFJZfFlFUyl8TUJfKD86QUJPUlRSRVRSWUlHTk9SRXxERUZCVVRUT04xfERFRkJVVFRPTjJ8REVGQlVUVE9OM3xERUZCVVRUT040fElDT05FWENMQU1BVElPTnxJQ09OSU5GT1JNQVRJT058SUNPTlFVRVNUSU9OfElDT05TVE9QfE9LfE9LQ0FOQ0VMfFJFVFJZQ0FOQ0VMfFJJR0hUfFJUTFJFQURJTkd8U0VURk9SRUdST1VORHxUT1BNT1NUfFVTRVJJQ09OfFlFU05PKXxOT1JNQUx8T0ZGTElORXxSRUFET05MWXxTSENUWHxTSEVMTF9DT05URVhUfFNZU1RFTXxURU1QT1JBUll8YWRtaW58YWxsfGF1dG98Ym90aHxjb2xvcmVkfGZhbHNlfGZvcmNlfGhpZGV8aGlnaGVzdHxsYXN0dXNlZHxsZWF2ZXxsaXN0b25seXxub25lfG5vcm1hbHxub3RzZXR8b2ZmfG9ufG9wZW58cHJpbnR8c2hvd3xzaWxlbnR8c2lsZW50bG9nfHNtb290aHx0ZXh0b25seXx0cnVlfHVzZXIpXFxiLyxcblx0J2NvbnN0YW50JzogL1xcJFxce1shXFx3XFwuOlxcXi1dK1xcfXxcXCRcXChbIVxcd1xcLjpcXF4tXStcXCkvLFxuXHQndmFyaWFibGUnOiAvXFwkXFx3W1xcd1xcLl0qLyxcblx0J251bWJlcic6IC9cXGIweFtcXGRBLUZhLWZdK1xcYnwoPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86W0VlXS0/XFxkKyk/Lyxcblx0J29wZXJhdG9yJzogLy0tP3xcXCtcXCs/fDw9P3w+PT98PT0/PT98JiY/fFxcfFxcfD98Wz8qXFwvfl4lXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46XS8sXG5cdCdpbXBvcnRhbnQnOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKikhKD86YWRkaW5jbHVkZWRpcnxhZGRwbHVnaW5kaXJ8YXBwZW5kZmlsZXxjZHxkZWZpbmV8ZGVsZmlsZXxlY2hvfGVsc2V8ZW5kaWZ8ZXJyb3J8ZXhlY3V0ZXxmaW5hbGl6ZXxnZXRkbGx2ZXJzaW9ufGdldHRsYnZlcnNpb258aWZ8aWZkZWZ8aWZtYWNyb2RlZnxpZm1hY3JvbmRlZnxpZm5kZWZ8aW5jbHVkZXxpbnNlcnRtYWNyb3xtYWNyb3xtYWNyb2VuZHxtYWtlbnNpc3xwYWNraGRyfHByYWdtYXxzZWFyY2hwYXJzZXxzZWFyY2hyZXBsYWNlfHN5c3RlbXx0ZW1wZmlsZXx1bmRlZnx2ZXJib3NlfHdhcm5pbmcpXFxiL2ltLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fVxufTtcblxuUHJpc20ubGFuZ3VhZ2VzLm9iamVjdGl2ZWMgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjJywge1xuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9AP1wiKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cIlxcXFxcXHJcXG5dKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFzbXxhdXRvfGJyZWFrfGNhc2V8Y2hhcnxjb25zdHxjb250aW51ZXxkZWZhdWx0fGRvfGRvdWJsZXxlbHNlfGVudW18ZXh0ZXJufGZsb2F0fGZvcnxnb3RvfGlmfGlufGlubGluZXxpbnR8bG9uZ3xyZWdpc3RlcnxyZXR1cm58c2VsZnxzaG9ydHxzaWduZWR8c2l6ZW9mfHN0YXRpY3xzdHJ1Y3R8c3VwZXJ8c3dpdGNofHR5cGVkZWZ8dHlwZW9mfHVuaW9ufHVuc2lnbmVkfHZvaWR8dm9sYXRpbGV8d2hpbGUpXFxifCg/OkBpbnRlcmZhY2V8QGVuZHxAaW1wbGVtZW50YXRpb258QHByb3RvY29sfEBjbGFzc3xAcHVibGljfEBwcm90ZWN0ZWR8QHByaXZhdGV8QHByb3BlcnR5fEB0cnl8QGNhdGNofEBmaW5hbGx5fEB0aHJvd3xAc3ludGhlc2l6ZXxAZHluYW1pY3xAc2VsZWN0b3IpXFxiLyxcblx0J29wZXJhdG9yJzogLy1bLT5dP3xcXCtcXCs/fCE9P3w8PD89P3w+Pj89P3w9PT98JiY/fFxcfFxcfD98W35eJT8qXFwvQF0vXG59KTtcblxuZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5vYmplY3RpdmVjWydjbGFzcy1uYW1lJ107XG5cblByaXNtLmxhbmd1YWdlcy5vYmpjID0gUHJpc20ubGFuZ3VhZ2VzLm9iamVjdGl2ZWM7XG5cbi8vIGh0dHBzOi8vb2NhbWwub3JnL21hbnVhbC9sZXguaHRtbFxuXG5QcmlzbS5sYW5ndWFnZXMub2NhbWwgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXChcXCpbXFxzXFxTXSo/XFwqXFwpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NoYXInOiB7XG5cdFx0cGF0dGVybjogLycoPzpbXlxcXFxcXHJcXG4nXXxcXFxcKD86Lnxbb3hdP1swLTlhLWZdezEsM30pKScvaSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcKD86W1xcc1xcU118XFxyXFxuKXxbXlxcXFxcXHJcXG5cIl0pKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xceyhbYS16X10qKVxcfFtcXHNcXFNdKj9cXHxcXDFcXH0vLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnbnVtYmVyJzogW1xuXHRcdC8vIGJpbmFyeSBhbmQgb2N0YWxcblx0XHQvXFxiKD86MGJbMDFdWzAxX10qfDBvWzAtN11bMC03X10qKVxcYi9pLFxuXHRcdC8vIGhleGFkZWNpbWFsXG5cdFx0L1xcYjB4W2EtZjAtOV1bYS1mMC05X10qKD86XFwuW2EtZjAtOV9dKik/KD86cFsrLV0/XFxkW1xcZF9dKik/KD8hXFx3KS9pLFxuXHRcdC8vIGRlY2ltYWxcblx0XHQvXFxiXFxkW1xcZF9dKig/OlxcLltcXGRfXSopPyg/OmVbKy1dP1xcZFtcXGRfXSopPyg/IVxcdykvaSxcblx0XSxcblx0J2RpcmVjdGl2ZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxCI1xcdysvLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCdsYWJlbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxCflxcdysvLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCd0eXBlLXZhcmlhYmxlJzoge1xuXHRcdHBhdHRlcm46IC9cXEInXFx3Ky8sXG5cdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0fSxcblx0J3ZhcmlhbnQnOiB7XG5cdFx0cGF0dGVybjogL2BcXHcrLyxcblx0XHRhbGlhczogJ3N5bWJvbCdcblx0fSxcblx0Ly8gRm9yIHRoZSBsaXN0IG9mIGtleXdvcmRzIGFuZCBvcGVyYXRvcnMsXG5cdC8vIHNlZTogaHR0cDovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xleC5odG1sI3NlYzg0XG5cdCdrZXl3b3JkJzogL1xcYig/OmFzfGFzc2VydHxiZWdpbnxjbGFzc3xjb25zdHJhaW50fGRvfGRvbmV8ZG93bnRvfGVsc2V8ZW5kfGV4Y2VwdGlvbnxleHRlcm5hbHxmb3J8ZnVufGZ1bmN0aW9ufGZ1bmN0b3J8aWZ8aW58aW5jbHVkZXxpbmhlcml0fGluaXRpYWxpemVyfGxhenl8bGV0fG1hdGNofG1ldGhvZHxtb2R1bGV8bXV0YWJsZXxuZXd8bm9ucmVjfG9iamVjdHxvZnxvcGVufHByaXZhdGV8cmVjfHNpZ3xzdHJ1Y3R8dGhlbnx0b3x0cnl8dHlwZXx2YWx8dmFsdWV8dmlydHVhbHx3aGVufHdoZXJlfHdoaWxlfHdpdGgpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXG5cdCdvcGVyYXRvci1saWtlLXB1bmN0dWF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9cXFtbPD58XXxbPnxdXFxdfFxcezx8PlxcfS8sXG5cdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0fSxcblx0Ly8gQ3VzdG9tIG9wZXJhdG9ycyBhcmUgYWxsb3dlZFxuXHQnb3BlcmF0b3InOiAvXFwuWy5+XXw6Wz0+XXxbPTw+QF58JitcXC0qXFwvJCUhP35dWyEkJSYqK1xcLS5cXC86PD0+P0BefH5dKnxcXGIoPzphbmR8YXNyfGxhbmR8bG9yfGxzbHxsc3J8bHhvcnxtb2R8b3IpXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogLzs7fDo6fFsoKXt9XFxbXFxdLiw6OyNdfFxcYl9cXGIvXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdHZhciBlc2NhcGVzID0gL1xcXFwoPzpbXCInXFxcXGFiZWZucnR2XXwwWzAtN117Mn18VVtcXGRBLUZhLWZdezZ9fHVbXFxkQS1GYS1mXXs0fXx4W1xcZEEtRmEtZl17Mn0pLztcblxuXHRQcmlzbS5sYW5ndWFnZXMub2RpbiA9IHtcblx0XHQvKipcblx0XHQgKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBvbmx5IDEgbGV2ZWwgb2YgbmVzdGluZy5cblx0XHQgKlxuXHRcdCAqIEBhdXRob3IgTWljaGFlbCBTY2htaWR0XG5cdFx0ICogQGF1dGhvciBlZHVraXN0b1xuXHRcdCAqL1xuXHRcdCdjb21tZW50JzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwvXFwqKD86W14vKl18XFwvKD8hXFwqKXxcXCooPyFcXC8pfFxcL1xcKig/OlxcKig/IVxcLyl8W14qXSkqKD86XFwqXFwvfCQpKSooPzpcXCpcXC98JCkvLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8jIVteXFxuXFxyXSovLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXC9cXC9bXlxcblxccl0qLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblxuXHRcdC8qKlxuXHRcdCAqIFNob3VsZCBiZSBmb3VuZCBiZWZvcmUgc3RyaW5ncyBiZWNhdXNlIG9mICdcIidcIi0gYW5kICdgJ2AtbGlrZSBzZXF1ZW5jZXMuXG5cdFx0ICovXG5cdFx0J2NoYXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJyg/OlxcXFwoPzoufFswVXV4XVswLTlBLUZhLWZdezEsNn0pfFteXFxuXFxyJ1xcXFxdKScvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdzeW1ib2wnOiBlc2NhcGVzXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdzdHJpbmcnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9gW15gXSpgLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcLnxbXlxcblxcclwiXFxcXF0pKlwiLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnc3ltYm9sJzogZXNjYXBlc1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblxuXHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvI1xcdysvLFxuXHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHR9LFxuXG5cdFx0J251bWJlcic6IC9cXGIwKD86YlswMV9dK3xkW1xcZF9dK3xoXyooPzooPzooPzpbXFxkQS1GYS1mXV8qKXs4fSl7MSwyfXwoPzpbXFxkQS1GYS1mXV8qKXs0fSl8b1swLTdfXSt8eFtcXGRBLUZfYS1mXSt8eltcXGRBQl9hYl0rKVxcYnwoPzpcXGJcXGQrKD86XFwuKD8hXFwuKVxcZCopP3xcXEJcXC5cXGQrKSg/OltFZV1bKy1dP1xcZCopP1tpamtdPyg/IVxcdykvLFxuXG5cdFx0J2Rpc2NhcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiX1xcYi8sXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblxuXHRcdCdwcm9jZWR1cmUtZGVmaW5pdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJcXHcrKD89WyBcXHRdKig/OjpcXHMqKXsyfXByb2NcXGIpLyxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmFzbXxhdXRvX2Nhc3R8Yml0X3NldHxicmVha3xjYXNlfGNhc3R8Y29udGV4dHxjb250aW51ZXxkZWZlcnxkaXN0aW5jdHxkb3xkeW5hbWljfGVsc2V8ZW51bXxmYWxsdGhyb3VnaHxmb3J8Zm9yZWlnbnxpZnxpbXBvcnR8aW58bWFwfG1hdHJpeHxub3RfaW58b3JfZWxzZXxvcl9yZXR1cm58cGFja2FnZXxwcm9jfHJldHVybnxzdHJ1Y3R8c3dpdGNofHRyYW5zbXV0ZXx0eXBlaWR8dW5pb258dXNpbmd8d2hlbnx3aGVyZSlcXGIvLFxuXG5cdFx0LyoqXG5cdFx0ICogZmFsc2UsIG5pbCwgdHJ1ZSBjYW4gYmUgdXNlZCBhcyBwcm9jZWR1cmUgbmFtZXMuIFwiX1wiIGFuZCBrZXl3b3JkcyBjYW4ndC5cblx0XHQgKi9cblx0XHQncHJvY2VkdXJlLW5hbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiXFx3Kyg/PVsgXFx0XSpcXCgpLyxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfG5pbHx0cnVlKVxcYi8sXG5cblx0XHQnY29uc3RhbnQtcGFyYW1ldGVyLXNpZ24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwkLyxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdH0sXG5cblx0XHQndW5kZWZpbmVkJzoge1xuXHRcdFx0cGF0dGVybjogLy0tLS8sXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH0sXG5cblx0XHQnYXJyb3cnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvLT4vLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXG5cdFx0J29wZXJhdG9yJzogL1xcK1xcK3wtLXxcXC5cXC5bPD1dP3woPzomfnxbLSEqKy89fl18WyUmPD58XXsxLDJ9KT0/fFs/Xl0vLFxuXG5cdFx0J3B1bmN0dWF0aW9uJzogL1soKSwuOjtAXFxbXFxde31dL1xuXHR9O1xufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdC8qIE9wZW5DTCBrZXJuZWwgbGFuZ3VhZ2UgKi9cblx0UHJpc20ubGFuZ3VhZ2VzLm9wZW5jbCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2MnLCB7XG5cdFx0Ly8gRXh0cmFjdGVkIGZyb20gdGhlIG9mZmljaWFsIHNwZWNzICgyLjApIGFuZCBodHRwOi8vc3RyZWFtY29tcHV0aW5nLmV1L2Rvd25sb2Fkcy8/b3BlbmNsLmxhbmcgKG9wZW5jbC1rZXl3b3Jkcywgb3BlbmNsLXR5cGVzKSBhbmQgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyLz9mdW5jPWRldGFpbCZhaWQ9Mjk1Nzc5NCZncm91cF9pZD05NTcxNyZhdGlkPTYxMjM4NCAoV29yZHMyLCBwYXJ0bHkgV29yZHMzKVxuXHRcdCdrZXl3b3JkJzogL1xcYig/Oig/Ol9fKT8oPzpjb25zdGFudHxnbG9iYWx8a2VybmVsfGxvY2FsfHByaXZhdGV8cmVhZF9vbmx5fHJlYWRfd3JpdGV8d3JpdGVfb25seSl8X19hdHRyaWJ1dGVfX3xhdXRvfCg/OmJvb2x8dT8oPzpjaGFyfGludHxsb25nfHNob3J0KXxoYWxmfHF1YWQpKD86MnwzfDR8OHwxNik/fGJyZWFrfGNhc2V8Y29tcGxleHxjb25zdHxjb250aW51ZXwoPzpkb3VibGV8ZmxvYXQpKD86MTYoPzp4KD86MXwyfDR8OHwxNikpP3wxeCg/OjF8Mnw0fDh8MTYpfDIoPzp4KD86MXwyfDR8OHwxNikpP3wzfDQoPzp4KD86MXwyfDR8OHwxNikpP3w4KD86eCg/OjF8Mnw0fDh8MTYpKT8pP3xkZWZhdWx0fGRvfGVsc2V8ZW51bXxleHRlcm58Zm9yfGdvdG98aWZ8aW1hZ2luYXJ5fGlubGluZXxwYWNrZWR8cGlwZXxyZWdpc3RlcnxyZXN0cmljdHxyZXR1cm58c2lnbmVkfHNpemVvZnxzdGF0aWN8c3RydWN0fHN3aXRjaHx0eXBlZGVmfHVuaWZvcm18dW5pb258dW5zaWduZWR8dm9pZHx2b2xhdGlsZXx3aGlsZSlcXGIvLFxuXHRcdC8vIEV4dHJhY3RlZCBmcm9tIGh0dHA6Ly9zdHJlYW1jb21wdXRpbmcuZXUvZG93bmxvYWRzLz9vcGVuY2wubGFuZyAob3BlbmNsLWNvbnN0KVxuXHRcdC8vIE1hdGggQ29uc3RhbnRzOiBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9PcGVuQ0wvc2RrLzIuMS9kb2NzL21hbi94aHRtbC9tYXRoQ29uc3RhbnRzLmh0bWxcblx0XHQvLyBNYWNyb3MgYW5kIExpbWl0czogaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvT3BlbkNML3Nkay8yLjEvZG9jcy9tYW4veGh0bWwvbWFjcm9MaW1pdHMuaHRtbFxuXHRcdCdudW1iZXInOiAvKD86XFxiMHgoPzpbXFxkYS1mXSsoPzpcXC5bXFxkYS1mXSopP3xcXC5bXFxkYS1mXSspKD86cFsrLV0/XFxkKyk/fCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT8pW2Z1aGxdezAsNH0vaSxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0J2NvbnN0YW50LW9wZW5jbC1rZXJuZWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86Q0hBUl8oPzpCSVR8TUFYfE1JTil8Q0xLXyg/OkFERFJFU1NfKD86Q0xBTVAoPzpfVE9fRURHRSk/fE5PTkV8UkVQRUFUKXxGSUxURVJfKD86TElORUFSfE5FQVJFU1QpfCg/OkdMT0JBTHxMT0NBTClfTUVNX0ZFTkNFfE5PUk1BTElaRURfQ09PUkRTXyg/OkZBTFNFfFRSVUUpKXxDTF8oPzpCR1JBfCg/OkhBTEZfKT9GTE9BVHxJTlRFTlNJVFl8TFVNSU5BTkNFfEE/Uj9HP0I/W0F4XT98KD86KD86VU4pP1NJR05FRHxbVVNdTk9STSlfKD86SU5UKD86OHwxNnwzMikpfFVOT1JNXyg/OklOVF8xMDEwMTB8U0hPUlRfKD86NTU1fDU2NSkpKXwoPzpEQkx8RkxUfEhBTEYpXyg/OkRJR3xFUFNJTE9OfCg/Ok1BWHxNSU4pKD86KD86XzEwKT9fRVhQKT98TUFOVF9ESUcpfEZMVF9SQURJWHxIVUdFX1ZBTEY/fCg/OklOVHxMT05HfFNDSEFSfFNIUlQpXyg/Ok1BWHxNSU4pfElORklOSVRZfE1BWEZMT0FUfE1fKD86WzEyXV9QSXwyX1NRUlRQSXxFfExOKD86MnwxMCl8TE9HKD86MnwxMClFP3xQSSg/Ol9bMjRdKT98U1FSVCg/OjFfMnwyKSkoPzpfRnxfSCk/fE5BTnwoPzpVQ0hBUnxVSU5UfFVMT05HfFVTSFJUKV9NQVgpXFxiLyxcblx0XHRcdGFsaWFzOiAnY29uc3RhbnQnXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdvcGVuY2wnLCAnY2xhc3MtbmFtZScsIHtcblx0XHQvLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS9PcGVuQ0wvc2RrLzIuMS9kb2NzL21hbi94aHRtbC9zY2FsYXJEYXRhVHlwZXMuaHRtbFxuXHRcdC8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L09wZW5DTC9zZGsvMi4xL2RvY3MvbWFuL3hodG1sL290aGVyRGF0YVR5cGVzLmh0bWxcblx0XHQnYnVpbHRpbi10eXBlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYig/Ol9jbF8oPzpjb21tYW5kX3F1ZXVlfGNvbnRleHR8ZGV2aWNlX2lkfGV2ZW50fGtlcm5lbHxtZW18cGxhdGZvcm1faWR8cHJvZ3JhbXxzYW1wbGVyKXxjbF8oPzppbWFnZV9mb3JtYXR8bWVtX2ZlbmNlX2ZsYWdzKXxjbGtfZXZlbnRfdHxldmVudF90fGltYWdlKD86MWRfKD86YXJyYXlffGJ1ZmZlcl8pP3R8MmRfKD86YXJyYXlfKD86ZGVwdGhffG1zYWFfZGVwdGhffG1zYWFfKT98ZGVwdGhffG1zYWFfZGVwdGhffG1zYWFfKT90fDNkX3QpfGludHB0cl90fG5kcmFuZ2VfdHxwdHJkaWZmX3R8cXVldWVfdHxyZXNlcnZlX2lkX3R8c2FtcGxlcl90fHNpemVfdHx1aW50cHRyX3QpXFxiLyxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9XG5cdH0pO1xuXG5cdHZhciBhdHRyaWJ1dGVzID0ge1xuXHRcdC8vIEV4dHJhY3RlZCBmcm9tIGh0dHA6Ly9zdHJlYW1jb21wdXRpbmcuZXUvZG93bmxvYWRzLz9vcGVuY2xfaG9zdC5sYW5nIChvcGVuY2wtdHlwZXMgYW5kIG9wZW5jbC1ob3N0KVxuXHRcdCd0eXBlLW9wZW5jbC1ob3N0Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmNsXyg/OkdMZW51bXxHTGludHxHTHVpbnxhZGRyZXNzaW5nX21vZGV8Yml0ZmllbGR8Ym9vbHxidWZmZXJfY3JlYXRlX3R5cGV8YnVpbGRfc3RhdHVzfGNoYW5uZWxfKD86b3JkZXJ8dHlwZSl8KD86dT8oPzpjaGFyfGludHxsb25nfHNob3J0KXxkb3VibGV8ZmxvYXQpKD86MnwzfDR8OHwxNik/fGNvbW1hbmRfKD86cXVldWUoPzpfaW5mb3xfcHJvcGVydGllcyk/fHR5cGUpfGNvbnRleHQoPzpfaW5mb3xfcHJvcGVydGllcyk/fGRldmljZV8oPzpleGVjX2NhcGFiaWxpdGllc3xmcF9jb25maWd8aWR8aW5mb3xsb2NhbF9tZW1fdHlwZXxtZW1fY2FjaGVfdHlwZXx0eXBlKXwoPzpldmVudHxzYW1wbGVyKSg/Ol9pbmZvKT98ZmlsdGVyX21vZGV8aGFsZnxpbWFnZV9pbmZvfGtlcm5lbCg/Ol9pbmZvfF93b3JrX2dyb3VwX2luZm8pP3xtYXBfZmxhZ3N8bWVtKD86X2ZsYWdzfF9pbmZvfF9vYmplY3RfdHlwZSk/fHBsYXRmb3JtXyg/OmlkfGluZm8pfHByb2ZpbGluZ19pbmZvfHByb2dyYW0oPzpfYnVpbGRfaW5mb3xfaW5mbyk/KSlcXGIvLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH0sXG5cdFx0J2Jvb2xlYW4tb3BlbmNsLWhvc3QnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiQ0xfKD86RkFMU0V8VFJVRSlcXGIvLFxuXHRcdFx0YWxpYXM6ICdib29sZWFuJ1xuXHRcdH0sXG5cdFx0Ly8gRXh0cmFjdGVkIGZyb20gY2wuaCAoMi4wKSBhbmQgaHR0cDovL3N0cmVhbWNvbXB1dGluZy5ldS9kb3dubG9hZHMvP29wZW5jbF9ob3N0LmxhbmcgKG9wZW5jbC1jb25zdClcblx0XHQnY29uc3RhbnQtb3BlbmNsLWhvc3QnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiQ0xfKD86QXxBQkdSfEFERFJFU1NfKD86Q0xBTVAoPzpfVE9fRURHRSk/fE1JUlJPUkVEX1JFUEVBVHxOT05FfFJFUEVBVCl8QVJHQnxCR1JBfEJMT0NLSU5HfEJVRkZFUl9DUkVBVEVfVFlQRV9SRUdJT058QlVJTERfKD86RVJST1J8SU5fUFJPR1JFU1N8Tk9ORXxQUk9HUkFNX0ZBSUxVUkV8U1VDQ0VTUyl8Q09NTUFORF8oPzpBQ1FVSVJFX0dMX09CSkVDVFN8QkFSUklFUnxDT1BZXyg/OkJVRkZFUig/Ol9SRUNUfF9UT19JTUFHRSk/fElNQUdFKD86X1RPX0JVRkZFUik/KXxGSUxMXyg/OkJVRkZFUnxJTUFHRSl8TUFQKD86X0JVRkZFUnxfSU1BR0UpfE1BUktFUnxNSUdSQVRFKD86X1NWTSk/X01FTV9PQkpFQ1RTfE5BVElWRV9LRVJORUx8TkRSQU5HRV9LRVJORUx8UkVBRF8oPzpCVUZGRVIoPzpfUkVDVCk/fElNQUdFKXxSRUxFQVNFX0dMX09CSkVDVFN8U1ZNXyg/OkZSRUV8TUFQfE1FTUNQWXxNRU1GSUxMfFVOTUFQKXxUQVNLfFVOTUFQX01FTV9PQkpFQ1R8VVNFUnxXUklURV8oPzpCVUZGRVIoPzpfUkVDVCk/fElNQUdFKSl8Q09NUElMRVJfTk9UX0FWQUlMQUJMRXxDT01QSUxFX1BST0dSQU1fRkFJTFVSRXxDT01QTEVURXxDT05URVhUXyg/OkRFVklDRVN8SU5URVJPUF9VU0VSX1NZTkN8TlVNX0RFVklDRVN8UExBVEZPUk18UFJPUEVSVElFU3xSRUZFUkVOQ0VfQ09VTlQpfERFUFRIKD86X1NURU5DSUwpP3xERVZJQ0VfKD86QUREUkVTU19CSVRTfEFGRklOSVRZX0RPTUFJTl8oPzpMWzEtNF1fQ0FDSEV8TkVYVF9QQVJUSVRJT05BQkxFfE5VTUEpfEFWQUlMQUJMRXxCVUlMVF9JTl9LRVJORUxTfENPTVBJTEVSX0FWQUlMQUJMRXxET1VCTEVfRlBfQ09ORklHfEVORElBTl9MSVRUTEV8RVJST1JfQ09SUkVDVElPTl9TVVBQT1JUfEVYRUNVVElPTl9DQVBBQklMSVRJRVN8RVhURU5TSU9OU3xHTE9CQUxfKD86TUVNXyg/OkNBQ0hFTElORV9TSVpFfENBQ0hFX1NJWkV8Q0FDSEVfVFlQRXxTSVpFKXxWQVJJQUJMRV9QUkVGRVJSRURfVE9UQUxfU0laRSl8SE9TVF9VTklGSUVEX01FTU9SWXxJTF9WRVJTSU9OfElNQUdFKD86MkRfTUFYXyg/OkhFSUdIVHxXSURUSCl8M0RfTUFYXyg/OkRFUFRIfEhFSUdIVHxXSURUSCl8X0JBU0VfQUREUkVTU19BTElHTk1FTlR8X01BWF9BUlJBWV9TSVpFfF9NQVhfQlVGRkVSX1NJWkV8X1BJVENIX0FMSUdOTUVOVHxfU1VQUE9SVCl8TElOS0VSX0FWQUlMQUJMRXxMT0NBTF9NRU1fU0laRXxMT0NBTF9NRU1fVFlQRXxNQVhfKD86Q0xPQ0tfRlJFUVVFTkNZfENPTVBVVEVfVU5JVFN8Q09OU1RBTlRfQVJHU3xDT05TVEFOVF9CVUZGRVJfU0laRXxHTE9CQUxfVkFSSUFCTEVfU0laRXxNRU1fQUxMT0NfU0laRXxOVU1fU1VCX0dST1VQU3xPTl9ERVZJQ0VfKD86RVZFTlRTfFFVRVVFUyl8UEFSQU1FVEVSX1NJWkV8UElQRV9BUkdTfFJFQURfSU1BR0VfQVJHU3xSRUFEX1dSSVRFX0lNQUdFX0FSR1N8U0FNUExFUlN8V09SS19HUk9VUF9TSVpFfFdPUktfSVRFTV9ESU1FTlNJT05TfFdPUktfSVRFTV9TSVpFU3xXUklURV9JTUFHRV9BUkdTKXxNRU1fQkFTRV9BRERSX0FMSUdOfE1JTl9EQVRBX1RZUEVfQUxJR05fU0laRXxOQU1FfE5BVElWRV9WRUNUT1JfV0lEVEhfKD86Q0hBUnxET1VCTEV8RkxPQVR8SEFMRnxJTlR8TE9OR3xTSE9SVCl8Tk9UXyg/OkFWQUlMQUJMRXxGT1VORCl8T1BFTkNMX0NfVkVSU0lPTnxQQVJFTlRfREVWSUNFfFBBUlRJVElPTl8oPzpBRkZJTklUWV9ET01BSU58QllfQUZGSU5JVFlfRE9NQUlOfEJZX0NPVU5UU3xCWV9DT1VOVFNfTElTVF9FTkR8RVFVQUxMWXxGQUlMRUR8TUFYX1NVQl9ERVZJQ0VTfFBST1BFUlRJRVN8VFlQRSl8UElQRV9NQVhfKD86QUNUSVZFX1JFU0VSVkFUSU9OU3xQQUNLRVRfU0laRSl8UExBVEZPUk18UFJFRkVSUkVEXyg/OkdMT0JBTF9BVE9NSUNfQUxJR05NRU5UfElOVEVST1BfVVNFUl9TWU5DfExPQ0FMX0FUT01JQ19BTElHTk1FTlR8UExBVEZPUk1fQVRPTUlDX0FMSUdOTUVOVHxWRUNUT1JfV0lEVEhfKD86Q0hBUnxET1VCTEV8RkxPQVR8SEFMRnxJTlR8TE9OR3xTSE9SVCkpfFBSSU5URl9CVUZGRVJfU0laRXxQUk9GSUxFfFBST0ZJTElOR19USU1FUl9SRVNPTFVUSU9OfFFVRVVFXyg/Ok9OXyg/OkRFVklDRV8oPzpNQVhfU0laRXxQUkVGRVJSRURfU0laRXxQUk9QRVJUSUVTKXxIT1NUX1BST1BFUlRJRVMpfFBST1BFUlRJRVMpfFJFRkVSRU5DRV9DT1VOVHxTSU5HTEVfRlBfQ09ORklHfFNVQl9HUk9VUF9JTkRFUEVOREVOVF9GT1JXQVJEX1BST0dSRVNTfFNWTV8oPzpBVE9NSUNTfENBUEFCSUxJVElFU3xDT0FSU0VfR1JBSU5fQlVGRkVSfEZJTkVfR1JBSU5fQlVGRkVSfEZJTkVfR1JBSU5fU1lTVEVNKXxUWVBFKD86X0FDQ0VMRVJBVE9SfF9BTEx8X0NQVXxfQ1VTVE9NfF9ERUZBVUxUfF9HUFUpP3xWRU5ET1IoPzpfSUQpP3xWRVJTSU9OKXxEUklWRVJfVkVSU0lPTnxFVkVOVF8oPzpDT01NQU5EXyg/OkVYRUNVVElPTl9TVEFUVVN8UVVFVUV8VFlQRSl8Q09OVEVYVHxSRUZFUkVOQ0VfQ09VTlQpfEVYRUNfKD86S0VSTkVMfE5BVElWRV9LRVJORUx8U1RBVFVTX0VSUk9SX0ZPUl9FVkVOVFNfSU5fV0FJVF9MSVNUKXxGSUxURVJfKD86TElORUFSfE5FQVJFU1QpfEZMT0FUfEZQXyg/OkNPUlJFQ1RMWV9ST1VOREVEX0RJVklERV9TUVJUfERFTk9STXxGTUF8SU5GX05BTnxST1VORF9UT19JTkZ8Uk9VTkRfVE9fTkVBUkVTVHxST1VORF9UT19aRVJPfFNPRlRfRkxPQVQpfEdMT0JBTHxIQUxGX0ZMT0FUfElNQUdFXyg/OkFSUkFZX1NJWkV8QlVGRkVSfERFUFRIfEVMRU1FTlRfU0laRXxGT1JNQVR8Rk9STUFUX01JU01BVENIfEZPUk1BVF9OT1RfU1VQUE9SVEVEfEhFSUdIVHxOVU1fTUlQX0xFVkVMU3xOVU1fU0FNUExFU3xST1dfUElUQ0h8U0xJQ0VfUElUQ0h8V0lEVEgpfElOVEVOU0lUWXxJTlZBTElEXyg/OkFSR19JTkRFWHxBUkdfU0laRXxBUkdfVkFMVUV8QklOQVJZfEJVRkZFUl9TSVpFfEJVSUxEX09QVElPTlN8Q09NTUFORF9RVUVVRXxDT01QSUxFUl9PUFRJT05TfENPTlRFWFR8REVWSUNFfERFVklDRV9QQVJUSVRJT05fQ09VTlR8REVWSUNFX1FVRVVFfERFVklDRV9UWVBFfEVWRU5UfEVWRU5UX1dBSVRfTElTVHxHTE9CQUxfT0ZGU0VUfEdMT0JBTF9XT1JLX1NJWkV8R0xfT0JKRUNUfEhPU1RfUFRSfElNQUdFX0RFU0NSSVBUT1J8SU1BR0VfRk9STUFUX0RFU0NSSVBUT1J8SU1BR0VfU0laRXxLRVJORUx8S0VSTkVMX0FSR1N8S0VSTkVMX0RFRklOSVRJT058S0VSTkVMX05BTUV8TElOS0VSX09QVElPTlN8TUVNX09CSkVDVHxNSVBfTEVWRUx8T1BFUkFUSU9OfFBJUEVfU0laRXxQTEFURk9STXxQUk9HUkFNfFBST0dSQU1fRVhFQ1VUQUJMRXxQUk9QRVJUWXxRVUVVRV9QUk9QRVJUSUVTfFNBTVBMRVJ8VkFMVUV8V09SS19ESU1FTlNJT058V09SS19HUk9VUF9TSVpFfFdPUktfSVRFTV9TSVpFKXxLRVJORUxfKD86QVJHXyg/OkFDQ0VTU18oPzpOT05FfFFVQUxJRklFUnxSRUFEX09OTFl8UkVBRF9XUklURXxXUklURV9PTkxZKXxBRERSRVNTXyg/OkNPTlNUQU5UfEdMT0JBTHxMT0NBTHxQUklWQVRFfFFVQUxJRklFUil8SU5GT19OT1RfQVZBSUxBQkxFfE5BTUV8VFlQRV8oPzpDT05TVHxOQU1FfE5PTkV8UElQRXxRVUFMSUZJRVJ8UkVTVFJJQ1R8Vk9MQVRJTEUpKXxBVFRSSUJVVEVTfENPTVBJTEVfTlVNX1NVQl9HUk9VUFN8Q09NUElMRV9XT1JLX0dST1VQX1NJWkV8Q09OVEVYVHxFWEVDX0lORk9fU1ZNX0ZJTkVfR1JBSU5fU1lTVEVNfEVYRUNfSU5GT19TVk1fUFRSU3xGVU5DVElPTl9OQU1FfEdMT0JBTF9XT1JLX1NJWkV8TE9DQUxfTUVNX1NJWkV8TE9DQUxfU0laRV9GT1JfU1VCX0dST1VQX0NPVU5UfE1BWF9OVU1fU1VCX0dST1VQU3xNQVhfU1VCX0dST1VQX1NJWkVfRk9SX05EUkFOR0V8TlVNX0FSR1N8UFJFRkVSUkVEX1dPUktfR1JPVVBfU0laRV9NVUxUSVBMRXxQUklWQVRFX01FTV9TSVpFfFBST0dSQU18UkVGRVJFTkNFX0NPVU5UfFNVQl9HUk9VUF9DT1VOVF9GT1JfTkRSQU5HRXxXT1JLX0dST1VQX1NJWkUpfExJTktFUl9OT1RfQVZBSUxBQkxFfExJTktfUFJPR1JBTV9GQUlMVVJFfExPQ0FMfExVTUlOQU5DRXxNQVBfKD86RkFJTFVSRXxSRUFEfFdSSVRFfFdSSVRFX0lOVkFMSURBVEVfUkVHSU9OKXxNRU1fKD86QUxMT0NfSE9TVF9QVFJ8QVNTT0NJQVRFRF9NRU1PQkpFQ1R8Q09OVEVYVHxDT1BZX0hPU1RfUFRSfENPUFlfT1ZFUkxBUHxGTEFHU3xIT1NUX05PX0FDQ0VTU3xIT1NUX1BUUnxIT1NUX1JFQURfT05MWXxIT1NUX1dSSVRFX09OTFl8S0VSTkVMX1JFQURfQU5EX1dSSVRFfE1BUF9DT1VOVHxPQkpFQ1RfKD86QUxMT0NBVElPTl9GQUlMVVJFfEJVRkZFUnxJTUFHRTFEfElNQUdFMURfQVJSQVl8SU1BR0UxRF9CVUZGRVJ8SU1BR0UyRHxJTUFHRTJEX0FSUkFZfElNQUdFM0R8UElQRSl8T0ZGU0VUfFJFQURfT05MWXxSRUFEX1dSSVRFfFJFRkVSRU5DRV9DT1VOVHxTSVpFfFNWTV9BVE9NSUNTfFNWTV9GSU5FX0dSQUlOX0JVRkZFUnxUWVBFfFVTRVNfU1ZNX1BPSU5URVJ8VVNFX0hPU1RfUFRSfFdSSVRFX09OTFkpfE1JR1JBVEVfTUVNX09CSkVDVF8oPzpDT05URU5UX1VOREVGSU5FRHxIT1NUKXxNSVNBTElHTkVEX1NVQl9CVUZGRVJfT0ZGU0VUfE5PTkV8Tk9OX0JMT0NLSU5HfE9VVF9PRl8oPzpIT1NUX01FTU9SWXxSRVNPVVJDRVMpfFBJUEVfKD86TUFYX1BBQ0tFVFN8UEFDS0VUX1NJWkUpfFBMQVRGT1JNXyg/OkVYVEVOU0lPTlN8SE9TVF9USU1FUl9SRVNPTFVUSU9OfE5BTUV8UFJPRklMRXxWRU5ET1J8VkVSU0lPTil8UFJPRklMSU5HXyg/OkNPTU1BTkRfKD86Q09NUExFVEV8RU5EfFFVRVVFRHxTVEFSVHxTVUJNSVQpfElORk9fTk9UX0FWQUlMQUJMRSl8UFJPR1JBTV8oPzpCSU5BUklFU3xCSU5BUllfU0laRVN8QklOQVJZX1RZUEUoPzpfQ09NUElMRURfT0JKRUNUfF9FWEVDVVRBQkxFfF9MSUJSQVJZfF9OT05FKT98QlVJTERfKD86R0xPQkFMX1ZBUklBQkxFX1RPVEFMX1NJWkV8TE9HfE9QVElPTlN8U1RBVFVTKXxDT05URVhUfERFVklDRVN8SUx8S0VSTkVMX05BTUVTfE5VTV9ERVZJQ0VTfE5VTV9LRVJORUxTfFJFRkVSRU5DRV9DT1VOVHxTT1VSQ0UpfFFVRVVFRHxRVUVVRV8oPzpDT05URVhUfERFVklDRXxERVZJQ0VfREVGQVVMVHxPTl9ERVZJQ0V8T05fREVWSUNFX0RFRkFVTFR8T1VUX09GX09SREVSX0VYRUNfTU9ERV9FTkFCTEV8UFJPRklMSU5HX0VOQUJMRXxQUk9QRVJUSUVTfFJFRkVSRU5DRV9DT1VOVHxTSVpFKXxSfFJBfFJFQURfKD86T05MWXxXUklURSlfQ0FDSEV8Ukd8UkdCfFJHQkF8UkdCeHxSR3h8UlVOTklOR3xSeHxTQU1QTEVSXyg/OkFERFJFU1NJTkdfTU9ERXxDT05URVhUfEZJTFRFUl9NT0RFfExPRF9NQVh8TE9EX01JTnxNSVBfRklMVEVSX01PREV8Tk9STUFMSVpFRF9DT09SRFN8UkVGRVJFTkNFX0NPVU5UKXwoPzpVTik/U0lHTkVEX0lOVCg/Ojh8MTZ8MzIpfFNOT1JNX0lOVCg/Ojh8MTYpfFNVQk1JVFRFRHxTVUNDRVNTfFVOT1JNX0lOVCg/Ojh8MTZ8MjR8XzEwMTAxMHxfMTAxMDEwXzIpfFVOT1JNX1NIT1JUXyg/OjU1NXw1NjUpfFZFUlNJT05fKD86MV8wfDFfMXwxXzJ8Ml8wfDJfMSl8c0JHUkF8c1JHQnxzUkdCQXxzUkdCeClcXGIvLFxuXHRcdFx0YWxpYXM6ICdjb25zdGFudCdcblx0XHR9LFxuXHRcdC8vIEV4dHJhY3RlZCBmcm9tIGNsLmggKDIuMCkgYW5kIGh0dHA6Ly9zdHJlYW1jb21wdXRpbmcuZXUvZG93bmxvYWRzLz9vcGVuY2xfaG9zdC5sYW5nIChvcGVuY2wtaG9zdClcblx0XHQnZnVuY3Rpb24tb3BlbmNsLWhvc3QnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiY2woPzpCdWlsZFByb2dyYW18Q2xvbmVLZXJuZWx8Q29tcGlsZVByb2dyYW18Q3JlYXRlKD86QnVmZmVyfENvbW1hbmRRdWV1ZSg/OldpdGhQcm9wZXJ0aWVzKT98Q29udGV4dHxDb250ZXh0RnJvbVR5cGV8SW1hZ2V8SW1hZ2UyRHxJbWFnZTNEfEtlcm5lbHxLZXJuZWxzSW5Qcm9ncmFtfFBpcGV8UHJvZ3JhbVdpdGgoPzpCaW5hcnl8QnVpbHRJbktlcm5lbHN8SUx8U291cmNlKXxTYW1wbGVyfFNhbXBsZXJXaXRoUHJvcGVydGllc3xTdWJCdWZmZXJ8U3ViRGV2aWNlc3xVc2VyRXZlbnQpfEVucXVldWUoPzooPzpCYXJyaWVyfE1hcmtlcikoPzpXaXRoV2FpdExpc3QpP3xDb3B5KD86QnVmZmVyKD86UmVjdHxUb0ltYWdlKT98SW1hZ2UoPzpUb0J1ZmZlcik/KXwoPzpGaWxsfE1hcCkoPzpCdWZmZXJ8SW1hZ2UpfE1pZ3JhdGVNZW1PYmplY3RzfE5EUmFuZ2VLZXJuZWx8TmF0aXZlS2VybmVsfCg/OlJlYWR8V3JpdGUpKD86QnVmZmVyKD86UmVjdCk/fEltYWdlKXxTVk0oPzpGcmVlfE1hcHxNZW1GaWxsfE1lbWNweXxNaWdyYXRlTWVtfFVubWFwKXxUYXNrfFVubWFwTWVtT2JqZWN0fFdhaXRGb3JFdmVudHMpfEZpbmlzaHxGbHVzaHxHZXQoPzpDb21tYW5kUXVldWVJbmZvfENvbnRleHRJbmZvfERldmljZSg/OkFuZEhvc3RUaW1lcnxJRHN8SW5mbyl8RXZlbnQoPzpQcm9maWxpbmcpP0luZm98RXh0ZW5zaW9uRnVuY3Rpb25BZGRyZXNzKD86Rm9yUGxhdGZvcm0pP3xIb3N0VGltZXJ8SW1hZ2VJbmZvfEtlcm5lbCg/OkFyZ0luZm98SW5mb3xTdWJHcm91cEluZm98V29ya0dyb3VwSW5mbyl8TWVtT2JqZWN0SW5mb3xQaXBlSW5mb3xQbGF0Zm9ybSg/OklEc3xJbmZvKXxQcm9ncmFtKD86QnVpbGQpP0luZm98U2FtcGxlckluZm98U3VwcG9ydGVkSW1hZ2VGb3JtYXRzKXxMaW5rUHJvZ3JhbXwoPzpSZWxlYXNlfFJldGFpbikoPzpDb21tYW5kUXVldWV8Q29udGV4dHxEZXZpY2V8RXZlbnR8S2VybmVsfE1lbU9iamVjdHxQcm9ncmFtfFNhbXBsZXIpfFNWTSg/OkFsbG9jfEZyZWUpfFNldCg/OkNvbW1hbmRRdWV1ZVByb3BlcnR5fERlZmF1bHREZXZpY2VDb21tYW5kUXVldWV8RXZlbnRDYWxsYmFja3xLZXJuZWx8S2VybmVsKD86QXJnKD86U1ZNUG9pbnRlcik/fEV4ZWNJbmZvKXxNZW1PYmplY3REZXN0cnVjdG9yQ2FsbGJhY2t8VXNlckV2ZW50U3RhdHVzKXxVbmxvYWQoPzpQbGF0Zm9ybSk/Q29tcGlsZXJ8V2FpdEZvckV2ZW50cylcXGIvLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9XG5cdH07XG5cblx0LyogT3BlbkNMIGhvc3QgQVBJICovXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2MnLCAna2V5d29yZCcsIGF0dHJpYnV0ZXMpO1xuXG5cdC8vIEMrKyBpbmNsdWRlcyBldmVyeXRoaW5nIGZyb20gdGhlIE9wZW5DTCBDIGhvc3QgQVBJIHBsdXMgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBjbDIuaFxuXHRpZiAoUHJpc20ubGFuZ3VhZ2VzLmNwcCkge1xuXHRcdC8vIEV4dHJhY3RlZCBmcm9tIGRveHlnZW4gY2xhc3MgbGlzdCBodHRwOi8vZ2l0aHViLmtocm9ub3Mub3JnL09wZW5DTC1DTEhQUC9hbm5vdGF0ZWQuaHRtbFxuXHRcdGF0dHJpYnV0ZXNbJ3R5cGUtb3BlbmNsLWhvc3QtY3BwJ10gPSB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86QnVmZmVyfEJ1ZmZlckdMfEJ1ZmZlclJlbmRlckdMfENvbW1hbmRRdWV1ZXxDb250ZXh0fERldmljZXxEZXZpY2VDb21tYW5kUXVldWV8RW5xdWV1ZUFyZ3N8RXZlbnR8SW1hZ2V8SW1hZ2UxRHxJbWFnZTFEQXJyYXl8SW1hZ2UxREJ1ZmZlcnxJbWFnZTJEfEltYWdlMkRBcnJheXxJbWFnZTJER0x8SW1hZ2UzRHxJbWFnZTNER0x8SW1hZ2VGb3JtYXR8SW1hZ2VHTHxLZXJuZWx8S2VybmVsRnVuY3RvcnxMb2NhbFNwYWNlQXJnfE1lbW9yeXxORFJhbmdlfFBpcGV8UGxhdGZvcm18UHJvZ3JhbXxTVk1BbGxvY2F0b3J8U1ZNVHJhaXRBdG9taWN8U1ZNVHJhaXRDb2Fyc2V8U1ZNVHJhaXRGaW5lfFNWTVRyYWl0UmVhZE9ubHl8U1ZNVHJhaXRSZWFkV3JpdGV8U1ZNVHJhaXRXcml0ZU9ubHl8U2FtcGxlcnxVc2VyRXZlbnQpXFxiLyxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9O1xuXG5cdFx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3BwJywgJ2tleXdvcmQnLCBhdHRyaWJ1dGVzKTtcblx0fVxufShQcmlzbSkpO1xuXG4vLyBodHRwczovL3Fpc2tpdC5naXRodWIuaW8vb3BlbnFhc20vZ3JhbW1hci9pbmRleC5odG1sXG5cblByaXNtLmxhbmd1YWdlcy5vcGVucWFzbSA9IHtcblx0J2NvbW1lbnQnOiAvXFwvXFwqW1xcc1xcU10qP1xcKlxcL3xcXC9cXC8uKi8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiW15cIlxcclxcblxcdF0qXCJ8J1teJ1xcclxcblxcdF0qJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cblx0J2tleXdvcmQnOiAvXFxiKD86Q1h8T1BFTlFBU018VXxiYXJyaWVyfGJveGFzfGJveHRvfGJyZWFrfGNvbnN0fGNvbnRpbnVlfGN0cmx8ZGVmfGRlZmNhbHxkZWZjYWxncmFtbWFyfGRlbGF5fGVsc2V8ZW5kfGZvcnxnYXRlfGdwaGFzZXxpZnxpbnxpbmNsdWRlfGludnxrZXJuZWx8bGVuZ3Rob2Z8bGV0fG1lYXN1cmV8cG93fHJlc2V0fHJldHVybnxyb3Rhcnl8c3RyZXRjaGluZnx3aGlsZSlcXGJ8I3ByYWdtYVxcYi8sXG5cdCdjbGFzcy1uYW1lJzogL1xcYig/OmFuZ2xlfGJpdHxib29sfGNyZWd8Zml4ZWR8ZmxvYXR8aW50fGxlbmd0aHxxcmVnfHF1Yml0fHN0cmV0Y2h8dWludClcXGIvLFxuXHQnZnVuY3Rpb24nOiAvXFxiKD86Y29zfGV4cHxsbnxwb3Bjb3VudHxyb3RsfHJvdHJ8c2lufHNxcnR8dGFuKVxcYig/PVxccypcXCgpLyxcblxuXHQnY29uc3RhbnQnOiAvXFxiKD86ZXVsZXJ8cGl8dGF1KVxcYnxcdTAzQzB8XHVEODM1XHVERjBGfFx1MjEwNy8sXG5cdCdudW1iZXInOiB7XG5cdFx0cGF0dGVybjogLyhefFteLlxcdyRdKSg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzplWystXT9cXGQrKT8oPzpkdHxuc3x1c3xcdTAwQjVzfG1zfHMpPy9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J29wZXJhdG9yJzogLy0+fD4+PT98PDw9P3wmJnxcXHxcXHx8XFwrXFwrfC0tfFshPTw+Jnx+XitcXC0qLyVdPT98QC8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCl7fVxcW1xcXTssOi5dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnFhc20gPSBQcmlzbS5sYW5ndWFnZXMub3BlbnFhc207XG5cblByaXNtLmxhbmd1YWdlcy5veiA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98JS4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXF18XFxcXFtcXHNcXFNdKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdhdG9tJzoge1xuXHRcdHBhdHRlcm46IC8nKD86W14nXFxcXF18XFxcXFtcXHNcXFNdKSonLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdidWlsdGluJ1xuXHR9LFxuXHQna2V5d29yZCc6IC9cXCR8XFxbXFxdfFxcYig/Ol98YXR8YXR0cnxjYXNlfGNhdGNofGNob2ljZXxjbGFzc3xjb25kfGRlY2xhcmV8ZGVmaW5lfGRpc3xlbHNlKD86Y2FzZXxpZik/fGVuZHxleHBvcnR8ZmFpbHxmYWxzZXxmZWF0fGZpbmFsbHl8ZnJvbXxmdW58ZnVuY3RvcnxpZnxpbXBvcnR8aW58bG9jYWx8bG9ja3xtZXRofG5pbHxub3R8b2Z8b3J8cHJlcGFyZXxwcm9jfHByb3B8cmFpc2V8cmVxdWlyZXxzZWxmfHNraXB8dGhlbnx0aHJlYWR8dHJ1ZXx0cnl8dW5pdClcXGIvLFxuXHQnZnVuY3Rpb24nOiBbXG5cdFx0L1xcYlthLXpdW0EtWmEtelxcZF0qKD89XFwoKS8sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcXHspW0EtWl1bQS1aYS16XFxkXSpcXGIvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J251bWJlcic6IC9cXGIoPzowW2J4XVtcXGRhLWZdK3xcXGQrKD86XFwuXFxkKik/KD86ZX4/XFxkKyk/KVxcYnwmKD86W15cXFxcXXxcXFxcKD86XFxkezN9fC4pKS9pLFxuXHQndmFyaWFibGUnOiAvYCg/OlteYFxcXFxdfFxcXFwuKStgLyxcblx0J2F0dHItbmFtZSc6IC9cXGJcXHcrKD89WyBcXHRdKjooPyFbOj1dKSkvLFxuXHQnb3BlcmF0b3InOiAvOig/Oj18Ojo/KXw8Wy06PV0/fD0oPzo9fDw/Oj8pfD49Pzo/fFxcXFw9Oj98ISE/fFt8IytcXC0qXFwvLH5eQF18XFxiKD86YW5kdGhlbnxkaXZ8bW9kfG9yZWxzZSlcXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXSgpe30uOjs/XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5wYXJpZ3AgPSB7XG5cdCdjb21tZW50JzogL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98XFxcXFxcXFwuKi8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cIlxcXFxcXHJcXG5dfFxcXFwuKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdC8vIFBBUkkvR1AgZG9lcyBub3QgY2FyZSBhYm91dCB3aGl0ZSBzcGFjZXMgYXQgYWxsXG5cdC8vIHNvIGxldCdzIHByb2Nlc3MgdGhlIGtleXdvcmRzIHRvIGJ1aWxkIGFuIGFwcHJvcHJpYXRlIHJlZ2V4cFxuXHQvLyAoZS5nLiBcImIgKnIgKmUgKmEgKmtcIiwgZXRjLilcblx0J2tleXdvcmQnOiAoZnVuY3Rpb24gKCkge1xuXHRcdHZhciBrZXl3b3JkcyA9IFtcblx0XHRcdCdicmVha3BvaW50JywgJ2JyZWFrJywgJ2RiZ19kb3duJywgJ2RiZ19lcnInLCAnZGJnX3VwJywgJ2RiZ194Jyxcblx0XHRcdCdmb3Jjb21wb3NpdGUnLCAnZm9yZGl2JywgJ2ZvcmVsbCcsICdmb3JwYXJ0JywgJ2ZvcnByaW1lJyxcblx0XHRcdCdmb3JzdGVwJywgJ2ZvcnN1Ymdyb3VwJywgJ2ZvcnZlYycsICdmb3InLCAnaWZlcnInLCAnaWYnLFxuXHRcdFx0J2xvY2FsJywgJ215JywgJ25leHQnLCAncmV0dXJuJywgJ3VudGlsJywgJ3doaWxlJ1xuXHRcdF07XG5cdFx0a2V5d29yZHMgPSBrZXl3b3Jkcy5tYXAoZnVuY3Rpb24gKGtleXdvcmQpIHtcblx0XHRcdHJldHVybiBrZXl3b3JkLnNwbGl0KCcnKS5qb2luKCcgKicpO1xuXHRcdH0pLmpvaW4oJ3wnKTtcblx0XHRyZXR1cm4gUmVnRXhwKCdcXFxcYig/OicgKyBrZXl3b3JkcyArICcpXFxcXGInKTtcblx0fSgpKSxcblx0J2Z1bmN0aW9uJzogL1xcYlxcdyg/OltcXHcgXSpcXHcpPyg/PSAqXFwoKS8sXG5cdCdudW1iZXInOiB7XG5cdFx0Ly8gVGhlIGxvb2tiZWhpbmQgYW5kIHRoZSBuZWdhdGl2ZSBsb29rYWhlYWQgcHJldmVudCBmcm9tIGJyZWFraW5nIHRoZSAuLiBvcGVyYXRvclxuXHRcdHBhdHRlcm46IC8oKD86XFwuICpcXC4gKik/KSg/OlxcYlxcZCg/OiAqXFxkKSooPzogKig/IVxcLiAqXFwuKVxcLig/OiAqXFxkKSopP3xcXC4gKlxcZCg/OiAqXFxkKSopKD86ICplICooPzpbKy1dICopP1xcZCg/OiAqXFxkKSopPy9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J29wZXJhdG9yJzogL1xcLiAqXFwufFsqXFwvIV0oPzogKj0pP3wlKD86ICo9fCg/OiAqIyk/KD86IConKSopP3xcXCsoPzogKlsrPV0pP3wtKD86ICpbLT0+XSk/fDwoPzogKj58KD86ICo8KT8oPzogKj0pPyk/fD4oPzogKj4pPyg/OiAqPSk/fD0oPzogKj0pezAsMn18XFxcXCg/OiAqXFwvKT8oPzogKj0pP3wmKD86IComKT98XFx8ICpcXHx8Wycjfl5dLyxcblx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF17fSgpLiw6O3xdL1xufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBwYXJzZXIgPSBQcmlzbS5sYW5ndWFnZXMucGFyc2VyID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnbWFya3VwJywge1xuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXl0pKD86XFxeKD86Y2FzZXxldmFsfGZvcnxpZnxzd2l0Y2h8dGhyb3cpXFxifEAoPzpCQVNFfENMQVNTfEdFVCg/Ol9ERUZBVUxUKT98T1BUSU9OU3xTRVRfREVGQVVMVHxVU0UpXFxiKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15eXSlcXEJcXCQoPzpcXHcrfCg/PVsue10pKSg/Oig/OlxcLnw6Oj8pXFx3KykqKD86XFwufDo6Pyk/Lyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLnw6Ky9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXl5dKVxcQltAXl1cXHcrKD86KD86XFwufDo6PylcXHcrKSooPzpcXC58Ojo/KT8vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQna2V5d29yZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5AKSg/OkdFVF98U0VUXykvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLnw6Ky9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdlc2NhcGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxeKD86WyReO0AoKVxcW1xcXXt9XCInOl18I1thLWZcXGRdKikvaSxcblx0XHRcdGFsaWFzOiAnYnVpbHRpbidcblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdKCl7fTtdL1xuXHR9KTtcblxuXHRwYXJzZXIgPSBQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdwYXJzZXInLCAna2V5d29yZCcsIHtcblx0XHQncGFyc2VyLWNvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxccykjLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnY29tbWVudCdcblx0XHR9LFxuXHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0Ly8gQWxsb3cgZm9yIDMgbGV2ZWxzIG9mIGRlcHRoXG5cdFx0XHRwYXR0ZXJuOiAvKF58W15eXSlcXCgoPzpbXigpXXxcXCgoPzpbXigpXXxcXCgoPzpbXigpXSkqXFwpKSpcXCkpKlxcKS8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhefFteXl0pKFtcIiddKSg/Oig/IVxcMilbXl5dfFxcXltcXHNcXFNdKSpcXDIvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J2tleXdvcmQnOiBwYXJzZXIua2V5d29yZCxcblx0XHRcdFx0J3ZhcmlhYmxlJzogcGFyc2VyLnZhcmlhYmxlLFxuXHRcdFx0XHQnZnVuY3Rpb24nOiBwYXJzZXIuZnVuY3Rpb24sXG5cdFx0XHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHRcdFx0J251bWJlcic6IC9cXGIoPzoweFthLWZcXGRdK3xcXGQrKD86XFwuXFxkKik/KD86ZVsrLV0/XFxkKyk/KVxcYi9pLFxuXHRcdFx0XHQnZXNjYXBlJzogcGFyc2VyLmVzY2FwZSxcblx0XHRcdFx0J29wZXJhdG9yJzogL1t+KypcXC9cXFxcJV18ISg/OlxcfFxcfD98PSk/fCYmP3xcXHxcXHw/fD09fDxbPD1dP3w+Wz49XT98LVtmZF0/fFxcYig/OmRlZnxlcXxnZXxndHxpbnxpc3xsZXxsdHxuZSlcXGIvLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiBwYXJzZXIucHVuY3R1YXRpb25cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2luc2lkZScsICdwdW5jdHVhdGlvbicsIHtcblx0XHQnZXhwcmVzc2lvbic6IHBhcnNlci5leHByZXNzaW9uLFxuXHRcdCdrZXl3b3JkJzogcGFyc2VyLmtleXdvcmQsXG5cdFx0J3ZhcmlhYmxlJzogcGFyc2VyLnZhcmlhYmxlLFxuXHRcdCdmdW5jdGlvbic6IHBhcnNlci5mdW5jdGlvbixcblx0XHQnZXNjYXBlJzogcGFyc2VyLmVzY2FwZSxcblx0XHQncGFyc2VyLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogcGFyc2VyLnB1bmN0dWF0aW9uLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9XG5cdH0sIHBhcnNlclsndGFnJ10uaW5zaWRlWydhdHRyLXZhbHVlJ10pO1xuXG59KFByaXNtKSk7XG5cbi8vIEJhc2VkIG9uIEZyZWUgUGFzY2FsXG5cbi8qIFRPRE9cblx0U3VwcG9ydCBpbmxpbmUgYXNtID9cbiovXG5cblByaXNtLmxhbmd1YWdlcy5wYXNjYWwgPSB7XG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogL1xce1xcJFtcXHNcXFNdKj9cXH0vLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogWydtYXJjbycsICdwcm9wZXJ0eSddXG5cdH0sXG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXChcXCpbXFxzXFxTXSo/XFwqXFwpfFxce1tcXHNcXFNdKj9cXH18XFwvXFwvLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oPzonKD86Jyd8W14nXFxyXFxuXSkqJyg/IScpfCNbJiQlXT9bYS1mXFxkXSspK3xcXF5bYS16XS9pLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnYXNtJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiYXNtXFxiKVtcXHNcXFNdKz8oPz1cXGJlbmRcXHMqWztbXSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdH0sXG5cdCdrZXl3b3JkJzogW1xuXHRcdHtcblx0XHRcdC8vIFR1cmJvIFBhc2NhbFxuXHRcdFx0cGF0dGVybjogLyhefFteJl0pXFxiKD86YWJzb2x1dGV8YXJyYXl8YXNtfGJlZ2lufGNhc2V8Y29uc3R8Y29uc3RydWN0b3J8ZGVzdHJ1Y3Rvcnxkb3xkb3dudG98ZWxzZXxlbmR8ZmlsZXxmb3J8ZnVuY3Rpb258Z290b3xpZnxpbXBsZW1lbnRhdGlvbnxpbmhlcml0ZWR8aW5saW5lfGludGVyZmFjZXxsYWJlbHxuaWx8b2JqZWN0fG9mfG9wZXJhdG9yfHBhY2tlZHxwcm9jZWR1cmV8cHJvZ3JhbXxyZWNvcmR8cmVpbnRyb2R1Y2V8cmVwZWF0fHNlbGZ8c2V0fHN0cmluZ3x0aGVufHRvfHR5cGV8dW5pdHx1bnRpbHx1c2VzfHZhcnx3aGlsZXx3aXRoKVxcYi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gRnJlZSBQYXNjYWxcblx0XHRcdHBhdHRlcm46IC8oXnxbXiZdKVxcYig/OmRpc3Bvc2V8ZXhpdHxmYWxzZXxuZXd8dHJ1ZSlcXGIvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdC8vIE9iamVjdCBQYXNjYWxcblx0XHRcdHBhdHRlcm46IC8oXnxbXiZdKVxcYig/OmNsYXNzfGRpc3BpbnRlcmZhY2V8ZXhjZXB0fGV4cG9ydHN8ZmluYWxpemF0aW9ufGZpbmFsbHl8aW5pdGlhbGl6YXRpb258aW5saW5lfGxpYnJhcnl8b258b3V0fHBhY2tlZHxwcm9wZXJ0eXxyYWlzZXxyZXNvdXJjZXN0cmluZ3x0aHJlYWR2YXJ8dHJ5KVxcYi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gTW9kaWZpZXJzXG5cdFx0XHRwYXR0ZXJuOiAvKF58W14mXSlcXGIoPzphYnNvbHV0ZXxhYnN0cmFjdHxhbGlhc3xhc3NlbWJsZXJ8Yml0cGFja2VkfGJyZWFrfGNkZWNsfGNvbnRpbnVlfGNwcGRlY2x8Y3ZhcnxkZWZhdWx0fGRlcHJlY2F0ZWR8ZHluYW1pY3xlbnVtZXJhdG9yfGV4cGVyaW1lbnRhbHxleHBvcnR8ZXh0ZXJuYWx8ZmFyfGZhcjE2fGZvcndhcmR8Z2VuZXJpY3xoZWxwZXJ8aW1wbGVtZW50c3xpbmRleHxpbnRlcnJ1cHR8aW9jaGVja3N8bG9jYWx8bWVzc2FnZXxuYW1lfG5lYXJ8bm9kZWZhdWx0fG5vcmV0dXJufG5vc3RhY2tmcmFtZXxvbGRmcGNjYWxsfG90aGVyd2lzZXxvdmVybG9hZHxvdmVycmlkZXxwYXNjYWx8cGxhdGZvcm18cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHB1Ymxpc2hlZHxyZWFkfHJlZ2lzdGVyfHJlaW50cm9kdWNlfHJlc3VsdHxzYWZlY2FsbHxzYXZlcmVnaXN0ZXJzfHNvZnRmbG9hdHxzcGVjaWFsaXplfHN0YXRpY3xzdGRjYWxsfHN0b3JlZHxzdHJpY3R8dW5hbGlnbmVkfHVuaW1wbGVtZW50ZWR8dmFyYXJnc3x2aXJ0dWFsfHdyaXRlKVxcYi9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J251bWJlcic6IFtcblx0XHQvLyBIZXhhZGVjaW1hbCwgb2N0YWwgYW5kIGJpbmFyeVxuXHRcdC8oPzpbJiVdXFxkK3xcXCRbYS1mXFxkXSspL2ksXG5cdFx0Ly8gRGVjaW1hbFxuXHRcdC9cXGJcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/L2lcblx0XSxcblx0J29wZXJhdG9yJzogW1xuXHRcdC9cXC5cXC58XFwqXFwqfDo9fDxbPD0+XT98Pls+PV0/fFsrXFwtKlxcL109P3xbQF49XS8sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteJl0pXFxiKD86YW5kfGFzfGRpdnxleGNsdWRlfGlufGluY2x1ZGV8aXN8bW9kfG5vdHxvcnxzaGx8c2hyfHhvcilcXGIvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3B1bmN0dWF0aW9uJzogL1xcKFxcLnxcXC5cXCl8WygpXFxbXFxdOjssLl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucGFzY2FsLmFzbS5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdwYXNjYWwnLCB7XG5cdCdhc20nOiB1bmRlZmluZWQsXG5cdCdrZXl3b3JkJzogdW5kZWZpbmVkLFxuXHQnb3BlcmF0b3InOiB1bmRlZmluZWRcbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMub2JqZWN0cGFzY2FsID0gUHJpc20ubGFuZ3VhZ2VzLnBhc2NhbDtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8vIFBhc2NhbGlnbyBpcyBhIGxheWVyIDIgc21hcnQgY29udHJhY3QgbGFuZ3VhZ2UgZm9yIHRoZSB0ZXpvcyBibG9ja2NoYWluXG5cblx0dmFyIGJyYWNlcyA9IC9cXCgoPzpbXigpXXxcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKSkqXFwpLy5zb3VyY2U7XG5cdHZhciB0eXBlID0gLyg/OlxcYlxcdysoPzo8YnJhY2VzPik/fDxicmFjZXM+KS8uc291cmNlLnJlcGxhY2UoLzxicmFjZXM+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJyYWNlczsgfSk7XG5cblx0dmFyIHBhc2NhbGlnbyA9IFByaXNtLmxhbmd1YWdlcy5wYXNjYWxpZ28gPSB7XG5cdFx0J2NvbW1lbnQnOiAvXFwoXFwqW1xcc1xcU10rP1xcKlxcKXxcXC9cXC8uKi8sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC8oW1wiJ2BdKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkqXFwxfFxcXlthLXpdL2ksXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdjbGFzcy1uYW1lJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhcXGJ0eXBlXFxzK1xcdytcXHMraXNcXHMrKTx0eXBlPi8uc291cmNlLnJlcGxhY2UoLzx0eXBlPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0eXBlOyB9KSwgJ2knKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC88dHlwZT4oPz1cXHMraXNcXGIpLy5zb3VyY2UucmVwbGFjZSgvPHR5cGU+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHR5cGU7IH0pLCAnaScpLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyg6XFxzKik8dHlwZT4vLnNvdXJjZS5yZXBsYWNlKC88dHlwZT4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdHlwZTsgfSkpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQna2V5d29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXiZdKVxcYig/OmJlZ2lufGJsb2NrfGNhc2V8Y29uc3R8ZWxzZXxlbmR8ZmFpbHxmb3J8ZnJvbXxmdW5jdGlvbnxpZnxpc3xuaWx8b2Z8cmVtb3ZlfHJldHVybnxza2lwfHRoZW58dHlwZXx2YXJ8d2hpbGV8d2l0aClcXGIvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdib29sZWFuJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteJl0pXFxiKD86RmFsc2V8VHJ1ZSlcXGIvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdidWlsdGluJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteJl0pXFxiKD86Ym9vbHxpbnR8bGlzdHxtYXB8bmF0fHJlY29yZHxzdHJpbmd8dW5pdClcXGIvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdmdW5jdGlvbic6IC9cXGJcXHcrKD89XFxzKlxcKCkvLFxuXHRcdCdudW1iZXInOiBbXG5cdFx0XHQvLyBIZXhhZGVjaW1hbCwgb2N0YWwgYW5kIGJpbmFyeVxuXHRcdFx0LyVbMDFdK3wmWzAtN10rfFxcJFthLWZcXGRdKy9pLFxuXHRcdFx0Ly8gRGVjaW1hbFxuXHRcdFx0L1xcYlxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT8oPzptdHp8bik/L2lcblx0XHRdLFxuXHRcdCdvcGVyYXRvcic6IC8tPnw9XFwvPXxcXC5cXC58XFwqXFwqfDo9fDxbPD0+XT98Pls+PV0/fFsrXFwtKlxcL109P3xbQF49fF18XFxiKD86YW5kfG1vZHxvcilcXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9cXChcXC58XFwuXFwpfFsoKVxcW1xcXTo7LC57fV0vXG5cdH07XG5cblx0dmFyIGNsYXNzTmFtZUluc2lkZSA9IFsnY29tbWVudCcsICdrZXl3b3JkJywgJ2J1aWx0aW4nLCAnb3BlcmF0b3InLCAncHVuY3R1YXRpb24nXS5yZWR1Y2UoZnVuY3Rpb24gKGFjY3VtLCBrZXkpIHtcblx0XHRhY2N1bVtrZXldID0gcGFzY2FsaWdvW2tleV07XG5cdFx0cmV0dXJuIGFjY3VtO1xuXHR9LCB7fSk7XG5cblx0cGFzY2FsaWdvWydjbGFzcy1uYW1lJ10uZm9yRWFjaChmdW5jdGlvbiAocCkge1xuXHRcdHAuaW5zaWRlID0gY2xhc3NOYW1lSW5zaWRlO1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMucHNsID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcLnxbXlxcXFxcIl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnc3ltYm9sJzogL1xcXFxbbnRyYkEtWlwiXFxcXF0vXG5cdFx0fVxuXHR9LFxuXHQnaGVyZWRvYy1zdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLzw8PChbYS16QS1aX11cXHcqKVtcXHJcXG5dKD86LipbXFxyXFxuXSkqP1xcMVxcYi8sXG5cdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpfX211bHRpfF9fc2luZ2xlfGNhc2V8ZGVmYXVsdHxkb3xlbHNlfGVsc2lmfGV4aXR8ZXhwb3J0fGZvcnxmb3JlYWNofGZ1bmN0aW9ufGlmfGxhc3R8bGluZXxsb2NhbHxuZXh0fHJlcXVpcmVzfHJldHVybnxzd2l0Y2h8dW50aWx8d2hpbGV8d29yZClcXGIvLFxuXHQnY29uc3RhbnQnOiAvXFxiKD86QUxBUk18Q0hBUlRfQUREX0dSQVBIfENIQVJUX0RFTEVURV9HUkFQSHxDSEFSVF9ERVNUUk9ZfENIQVJUX0xPQUR8Q0hBUlRfUFJJTlR8RU9GfE9GRkxJTkV8T0t8UFNMX1BST0ZfTE9HfFJfQ0hFQ0tfSE9SSVp8Ul9DSEVDS19WRVJUfFJfQ0xJQ0tFUnxSX0NPTFVNTnxSX0ZSQU1FfFJfSUNPTnxSX0xBQkVMfFJfTEFCRUxfQ0VOVEVSfFJfTElTVF9NVUxUSVBMRXxSX0xJU1RfTVVMVElQTEVfTkR8Ul9MSVNUX1NJTkdMRXxSX0xJU1RfU0lOR0xFX05EfFJfTUVOVXxSX1BPUFVQfFJfUE9QVVBfU0NST0xMRUR8Ul9SQURJT19IT1JJWnxSX1JBRElPX1ZFUlR8Ul9ST1d8Ul9TQ0FMRV9IT1JJWnxSX1NDQUxFX1ZFUlR8Ul9TRVBfSE9SSVp8Ul9TRVBfVkVSVHxSX1NQSU5ORVJ8Ul9URVhUX0ZJRUxEfFJfVEVYVF9GSUVMRF9MQUJFTHxSX1RPR0dMRXxUUklNX0xFQURJTkd8VFJJTV9MRUFESU5HX0FORF9UUkFJTElOR3xUUklNX1JFRFVOREFOVHxUUklNX1RSQUlMSU5HfFZPSUR8V0FSTilcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpGQUxTRXxGYWxzZXxOT3xOb3xUUlVFfFRydWV8WUVTfFllc3xmYWxzZXxub3x0cnVlfHllcylcXGIvLFxuXHQndmFyaWFibGUnOiAvXFxiKD86UHNsRGVidWd8ZXJybm98ZXhpdF9zdGF0dXMpXFxiLyxcblx0J2J1aWx0aW4nOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OlBzbEV4ZWN1dGV8UHNsRnVuY3Rpb25DYWxsfFBzbEZ1bmN0aW9uRXhpc3RzfFBzbFNldE9wdGlvbnN8X3NubXBfZGVidWd8YWNvc3xhZGRfZGlhcnl8YW5ub3RhdGV8YW5ub3RhdGVfZ2V0fGFzY2lpX3RvX2ViY2RpY3xhc2N0aW1lfGFzaW58YXRhbnxhdGV4aXR8YmF0Y2hfc2V0fGJsYWNrb3V0fGNhdHxjZWlsfGNoYW5fZXhpc3RzfGNoYW5nZV9zdGF0ZXxjbG9zZXxjb2RlX2N2dHxjb25kX3NpZ25hbHxjb25kX3dhaXR8Y29uc29sZV90eXBlfGNvbnZlcnRfYmFzZXxjb252ZXJ0X2RhdGV8Y29udmVydF9sb2NhbGVfZGF0ZXxjb3N8Y29zaHxjcmVhdGV8ZGF0ZXxkY2dldF90ZXh0fGRlc3Ryb3l8ZGVzdHJveV9sb2NrfGRnZXRfdGV4dHxkaWZmZXJlbmNlfGR1bXBfaGlzdHxlYmNkaWNfdG9fYXNjaWl8ZW5jcnlwdHxldmVudF9hcmNoaXZlfGV2ZW50X2NhdGFsb2dfZ2V0fGV2ZW50X2NoZWNrfGV2ZW50X3F1ZXJ5fGV2ZW50X3JhbmdlX21hbmFnZXxldmVudF9yYW5nZV9xdWVyeXxldmVudF9yZXBvcnR8ZXZlbnRfc2NoZWR1bGV8ZXZlbnRfdHJpZ2dlcnxldmVudF90cmlnZ2VyMnxleGVjdXRlfGV4aXN0c3xleHB8ZmFic3xmaWxlfGZsb29yfGZtb2R8Zm9wZW58ZnNlZWt8ZnRlbGx8ZnVsbF9kaXNjb3Zlcnl8Z2V0fGdldF9jaGFuX2luZm98Z2V0X3Jhbmdlc3xnZXRfdGV4dHxnZXRfdmFyc3xnZXRlbnZ8Z2V0aG9zdGluZm98Z2V0cGlkfGdldHBuYW1lfGdyZXB8aGlzdG9yeXxoaXN0b3J5X2dldF9yZXRlbnRpb258aW5fdHJhbnNpdGlvbnxpbmRleHxpbnR8aW50ZXJuYWx8aW50ZXJzZWN0aW9ufGlzX3Zhcnxpc251bWJlcnxqb2lufGtpbGx8bGVuZ3RofGxpbmVzfGxvY2t8bG9ja19pbmZvfGxvZ3xsb2cxMHxsb2dlfG1hdGNobGluZXxtc2dfY2hlY2t8bXNnX2dldF9mb3JtYXR8bXNnX2dldF9zZXZlcml0eXxtc2dfcHJpbnRmfG1zZ19zcHJpbnRmfG50aGFyZ3xudGhhcmdmfG50aGxpbmV8bnRobGluZWZ8bnVtX2J5dGVzfG51bV9jb25zb2xlc3xwY29uZmlnfHBvcGVufHBvcGxpbmVzfHBvd3xwcmludHxwcmludGZ8cHJvY19leGlzdHN8cHJvY2Vzc3xyYW5kb218cmVhZHxyZWFkbG58cmVmcmVzaF9wYXJhbWV0ZXJzfHJlbW90ZV9jaGVja3xyZW1vdGVfY2xvc2V8cmVtb3RlX2V2ZW50X3F1ZXJ5fHJlbW90ZV9ldmVudF90cmlnZ2VyfHJlbW90ZV9maWxlX3NlbmR8cmVtb3RlX29wZW58cmVtb3ZlfHJlcGxhY2V8cmluZGV4fHNlY19jaGVja19wcml2fHNlY19zdG9yZV9nZXR8c2VjX3N0b3JlX3NldHxzZXR8c2V0X2FsYXJtX3Jhbmdlc3xzZXRfbG9jYWxlfHNoYXJlfHNpbnxzaW5ofHNsZWVwfHNubXBfYWdlbnRfY29uZmlnfHNubXBfYWdlbnRfc3RhcnR8c25tcF9hZ2VudF9zdG9wfHNubXBfY2xvc2V8c25tcF9jb25maWd8c25tcF9nZXR8c25tcF9nZXRfbmV4dHxzbm1wX2hfZ2V0fHNubXBfaF9nZXRfbmV4dHxzbm1wX2hfc2V0fHNubXBfb3Blbnxzbm1wX3NldHxzbm1wX3RyYXBfaWdub3JlfHNubXBfdHJhcF9saXN0ZW58c25tcF90cmFwX3JhaXNlX3N0ZF90cmFwfHNubXBfdHJhcF9yZWNlaXZlfHNubXBfdHJhcF9yZWdpc3Rlcl9pbXxzbm1wX3RyYXBfc2VuZHxzbm1wX3dhbGt8c29wZW58c29ydHxzcGxpdGxpbmV8c3ByaW50ZnxzcXJ0fHNyYW5kb218c3RyX3JlcGVhdHxzdHJjYXNlY21wfHN1YnNldHxzdWJzdHJ8c3lzdGVtfHRhaWx8dGFufHRhbmh8dGV4dF9kb21haW58dGltZXx0bXBuYW18dG9sb3dlcnx0b3VwcGVyfHRyYWNlX3BzbF9wcm9jZXNzfHRyaW18dW5pb258dW5pcXVlfHVubG9ja3x1bnNldHx2YV9hcmd8dmFfc3RhcnR8d3JpdGUpXFxiLyxcblx0XHRhbGlhczogJ2J1aWx0aW4tZnVuY3Rpb24nXG5cdH0sXG5cdCdmb3JlYWNoLXZhcmlhYmxlJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiZm9yZWFjaFxccysoPzooPzpcXHcrXFxifFwiKD86XFxcXC58W15cXFxcXCJdKSpcIilcXHMrKXswLDJ9KVtfYS16QS1aXVxcdyooPz1cXHMqXFwoKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2Z1bmN0aW9uJzogL1xcYltfYS16XVxcdypcXGIoPz1cXHMqXFwoKS9pLFxuXHQnbnVtYmVyJzogL1xcYig/OjB4WzAtOWEtZl0rfFxcZCsoPzpcXC5cXGQrKT8pXFxiL2ksXG5cdCdvcGVyYXRvcic6IC8tLXxcXCtcXCt8JiY9P3xcXHxcXHw9P3w8PD0/fD4+PT98Wz0hXX58Wy0rKi8lJnxeIT08Pl09P3xcXC58Wzo/XS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCl7fVxcW1xcXTssXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5wY2F4aXMgPSB7XG5cdCdzdHJpbmcnOiAvXCJbXlwiXSpcIi8sXG5cdCdrZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC8oKD86Xnw7KVxccyopWy1BLVpcXGRdKyg/OlxccypcXFtbLVxcd10rXFxdKT8oPzpcXHMqXFwoXCJbXlwiXSpcIig/OixcXHMqXCJbXlwiXSpcIikqXFwpKT8oPz1cXHMqPSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiAvXlstQS1aXFxkXSsvLFxuXHRcdFx0J2xhbmd1YWdlJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqKVxcW1stXFx3XStcXF0vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcW3xcXF0kLyxcblx0XHRcdFx0XHQncHJvcGVydHknOiAvWy1cXHddKy9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdzdWIta2V5Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXihcXHMqKVxcU1tcXHNcXFNdKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwYXJhbWV0ZXInOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXCJbXlwiXSpcIi8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXCh8XFwpJHwsL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQnb3BlcmF0b3InOiAvPS8sXG5cdCd0bGlzdCc6IHtcblx0XHRwYXR0ZXJuOiAvVExJU1RcXHMqXFwoXFxzKlxcdysoPzooPzpcXHMqLFxccypcIlteXCJdKlwiKSt8XFxzKixcXHMqXCJbXlwiXSpcIi1cIlteXCJdKlwiKT9cXHMqXFwpLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnZnVuY3Rpb24nOiAvXlRMSVNULyxcblx0XHRcdCdwcm9wZXJ0eSc6IHtcblx0XHRcdFx0cGF0dGVybjogL14oXFxzKlxcKFxccyopXFx3Ky8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1wiW15cIl0qXCIvLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKSxdLyxcblx0XHRcdCdvcGVyYXRvcic6IC8tL1xuXHRcdH1cblx0fSxcblx0J3B1bmN0dWF0aW9uJzogL1s7LF0vLFxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxcXHMpXFxkKyg/OlxcLlxcZCspPyg/IVxcUykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2Jvb2xlYW4nOiAvTk98WUVTLyxcbn07XG5cblByaXNtLmxhbmd1YWdlcy5weCA9IFByaXNtLmxhbmd1YWdlcy5wY2F4aXM7XG5cblByaXNtLmxhbmd1YWdlcy5wZW9wbGVjb2RlID0ge1xuXHQnY29tbWVudCc6IFJlZ0V4cChbXG5cdFx0Ly8gQy1zdHlsZSBtdWx0aWxpbmUgY29tbWVudHNcblx0XHQvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy8uc291cmNlLFxuXHRcdC8vIFJFTSBjb21tZW50c1xuXHRcdC9cXGJSRU1bXjtdKjsvLnNvdXJjZSxcblx0XHQvLyBOZXN0ZWQgPCogKj4gY29tbWVudHNcblx0XHQvPFxcKig/OltePCpdfFxcKig/IT4pfDwoPyFcXCopfDxcXCooPzooPyFcXCo+KVtcXHNcXFNdKSpcXCo+KSpcXCo+Ly5zb3VyY2UsXG5cdFx0Ly8gLysgKy8gY29tbWVudHNcblx0XHQvXFwvXFwrW1xcc1xcU10qP1xcK1xcLy8uc291cmNlLFxuXHRdLmpvaW4oJ3wnKSksXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLycoPzonJ3xbXidcXHJcXG5dKSonKD8hJyl8XCIoPzpcIlwifFteXCJcXHJcXG5dKSpcIig/IVwiKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCd2YXJpYWJsZSc6IC8lXFx3Ky8sXG5cdCdmdW5jdGlvbi1kZWZpbml0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxbXlxcdy1dKSg/OmZ1bmN0aW9ufG1ldGhvZClcXHMrKVxcdysvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxbXi1cXHddKSg/OmFzfGNhdGNofGNsYXNzfGNvbXBvbmVudHxjcmVhdGV8ZXh0ZW5kc3xnbG9iYWx8aW1wbGVtZW50c3xpbnN0YW5jZXxsb2NhbHxvZnxwcm9wZXJ0eXxyZXR1cm5zKVxccyspXFx3Kyg/OjpcXHcrKSovaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogLzovXG5cdFx0fVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphYnN0cmFjdHxhbGlhc3xhc3xjYXRjaHxjbGFzc3xjb21wb25lbnR8Y29uc3RhbnR8Y3JlYXRlfGRlY2xhcmV8ZWxzZXxlbmQtKD86Y2xhc3N8ZXZhbHVhdGV8Zm9yfGZ1bmN0aW9ufGdldHxpZnxtZXRob2R8c2V0fHRyeXx3aGlsZSl8ZXZhbHVhdGV8ZXh0ZW5kc3xmb3J8ZnVuY3Rpb258Z2V0fGdsb2JhbHxpZnxpbXBsZW1lbnRzfGltcG9ydHxpbnN0YW5jZXxsaWJyYXJ5fGxvY2FsfG1ldGhvZHxudWxsfG9mfG91dHxwZW9wbGVDb2RlfHByaXZhdGV8cHJvZ3JhbXxwcm9wZXJ0eXxwcm90ZWN0ZWR8cmVhZG9ubHl8cmVmfHJlcGVhdHxyZXR1cm5zP3xzZXR8c3RlcHx0aGVufHRocm93fHRvfHRyeXx1bnRpbHx2YWx1ZXx3aGVuKD86LW90aGVyKT98d2hpbGUpXFxiL2ksXG5cdCdvcGVyYXRvci1rZXl3b3JkJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzphbmR8bm90fG9yKVxcYi9pLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH0sXG5cdCdmdW5jdGlvbic6IC9bX2Etel1cXHcqKD89XFxzKlxcKCkvaSxcblxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQrKT9cXGIvLFxuXHQnb3BlcmF0b3InOiAvPD58Wzw+XT0/fCE9fFxcKlxcKnxbLSsqL3w9QF0vLFxuXHQncHVuY3R1YXRpb24nOiAvWzouOywoKVtcXF1dL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnBjb2RlID0gUHJpc20ubGFuZ3VhZ2VzLnBlb3BsZWNvZGU7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgYnJhY2tldHMgPSAvKD86XFwoKD86W14oKVxcXFxdfFxcXFxbXFxzXFxTXSkqXFwpfFxceyg/Oltee31cXFxcXXxcXFxcW1xcc1xcU10pKlxcfXxcXFsoPzpbXltcXF1cXFxcXXxcXFxcW1xcc1xcU10pKlxcXXw8KD86W148PlxcXFxdfFxcXFxbXFxzXFxTXSkqPikvLnNvdXJjZTtcblxuXHRQcmlzbS5sYW5ndWFnZXMucGVybCA9IHtcblx0XHQnY29tbWVudCc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gUE9EXG5cdFx0XHRcdHBhdHRlcm46IC8oXlxccyopPVxcd1tcXHNcXFNdKj89Y3V0LiovbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcJF0pIy4qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQvLyBUT0RPIENvdWxkIGJlIG5pY2UgdG8gaGFuZGxlIEhlcmVkb2MgdG9vLlxuXHRcdCdzdHJpbmcnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0XHQvXFxiKD86cXxxcXxxd3xxeCkoPyFbYS16QS1aMC05XSlcXHMqLy5zb3VyY2UgK1xuXHRcdFx0XHRcdCcoPzonICtcblx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHQvLyBxLy4uLi9cblx0XHRcdFx0XHRcdC8oW15hLXpBLVowLTlcXHN7KFxcWzxdKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFxbXFxzXFxTXSkqXFwxLy5zb3VyY2UsXG5cblx0XHRcdFx0XHRcdC8vIHEgYS4uLmFcblx0XHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0XHRcdFx0XHQvKFthLXpBLVowLTldKSg/Oig/IVxcMilbXlxcXFxdfFxcXFxbXFxzXFxTXSkqXFwyLy5zb3VyY2UsXG5cblx0XHRcdFx0XHRcdC8vIHEoLi4uKVxuXHRcdFx0XHRcdFx0Ly8gcXsuLi59XG5cdFx0XHRcdFx0XHQvLyBxWy4uLl1cblx0XHRcdFx0XHRcdC8vIHE8Li4uPlxuXHRcdFx0XHRcdFx0YnJhY2tldHMsXG5cdFx0XHRcdFx0XS5qb2luKCd8JykgK1xuXHRcdFx0XHRcdCcpJ1xuXHRcdFx0XHQpLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cblx0XHRcdC8vIFwiLi4uXCIsIGAuLi5gXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXCJ8YCkoPzooPyFcXDEpW15cXFxcXXxcXFxcW1xcc1xcU10pKlxcMS8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblxuXHRcdFx0Ly8gJy4uLidcblx0XHRcdC8vIEZJWE1FIE11bHRpLWxpbmUgc2luZ2xlLXF1b3RlZCBzdHJpbmdzIGFyZSBub3Qgc3VwcG9ydGVkIGFzIHRoZXkgd291bGQgYnJlYWsgdmFyaWFibGVzIGNvbnRhaW5pbmcgJ1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvJyg/OlteJ1xcXFxcXHJcXG5dfFxcXFwuKSonLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQncmVnZXgnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0XHQvXFxiKD86bXxxcikoPyFbYS16QS1aMC05XSlcXHMqLy5zb3VyY2UgK1xuXHRcdFx0XHRcdCcoPzonICtcblx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHQvLyBtLy4uLi9cblx0XHRcdFx0XHRcdC8oW15hLXpBLVowLTlcXHN7KFxcWzxdKSg/Oig/IVxcMSlbXlxcXFxdfFxcXFxbXFxzXFxTXSkqXFwxLy5zb3VyY2UsXG5cblx0XHRcdFx0XHRcdC8vIG0gYS4uLmFcblx0XHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvc3RyaWN0XG5cdFx0XHRcdFx0XHQvKFthLXpBLVowLTldKSg/Oig/IVxcMilbXlxcXFxdfFxcXFxbXFxzXFxTXSkqXFwyLy5zb3VyY2UsXG5cblx0XHRcdFx0XHRcdC8vIG0oLi4uKVxuXHRcdFx0XHRcdFx0Ly8gbXsuLi59XG5cdFx0XHRcdFx0XHQvLyBtWy4uLl1cblx0XHRcdFx0XHRcdC8vIG08Li4uPlxuXHRcdFx0XHRcdFx0YnJhY2tldHMsXG5cdFx0XHRcdFx0XS5qb2luKCd8JykgK1xuXHRcdFx0XHRcdCcpJyArXG5cdFx0XHRcdFx0L1ttc2l4cG9kdWFsbmdjXSovLnNvdXJjZVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cblx0XHRcdC8vIFRoZSBsb29rYmVoaW5kcyBwcmV2ZW50IC1zIGZyb20gYnJlYWtpbmdcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHRcdC8oXnxbXi1dKVxcYig/OnN8dHJ8eSkoPyFbYS16QS1aMC05XSlcXHMqLy5zb3VyY2UgK1xuXHRcdFx0XHRcdCcoPzonICtcblx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHQvLyBzLy4uLi8uLi4vXG5cdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL3N0cmljdFxuXHRcdFx0XHRcdFx0LyhbXmEtekEtWjAtOVxcc3soXFxbPF0pKD86KD8hXFwyKVteXFxcXF18XFxcXFtcXHNcXFNdKSpcXDIoPzooPyFcXDIpW15cXFxcXXxcXFxcW1xcc1xcU10pKlxcMi8uc291cmNlLFxuXG5cdFx0XHRcdFx0XHQvLyBzIGEuLi5hLi4uYVxuXHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHRcdFx0XHRcdC8oW2EtekEtWjAtOV0pKD86KD8hXFwzKVteXFxcXF18XFxcXFtcXHNcXFNdKSpcXDMoPzooPyFcXDMpW15cXFxcXXxcXFxcW1xcc1xcU10pKlxcMy8uc291cmNlLFxuXG5cdFx0XHRcdFx0XHQvLyBzKC4uLikoLi4uKVxuXHRcdFx0XHRcdFx0Ly8gc3suLi59ey4uLn1cblx0XHRcdFx0XHRcdC8vIHNbLi4uXVsuLi5dXG5cdFx0XHRcdFx0XHQvLyBzPC4uLj48Li4uPlxuXHRcdFx0XHRcdFx0Ly8gcyguLi4pWy4uLl1cblx0XHRcdFx0XHRcdGJyYWNrZXRzICsgL1xccyovLnNvdXJjZSArIGJyYWNrZXRzLFxuXHRcdFx0XHRcdF0uam9pbignfCcpICtcblx0XHRcdFx0XHQnKScgK1xuXHRcdFx0XHRcdC9bbXNpeHBvZHVhbG5nY2VyXSovLnNvdXJjZVxuXHRcdFx0XHQpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cblx0XHRcdC8vIC8uLi4vXG5cdFx0XHQvLyBUaGUgbG9vay1haGVhZCB0cmllcyB0byBwcmV2ZW50IHR3byBkaXZpc2lvbnMgb25cblx0XHRcdC8vIHRoZSBzYW1lIGxpbmUgZnJvbSBiZWluZyBoaWdobGlnaHRlZCBhcyByZWdleC5cblx0XHRcdC8vIFRoaXMgZG9lcyBub3Qgc3VwcG9ydCBtdWx0aS1saW5lIHJlZ2V4LlxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwvKD86W15cXC9cXFxcXFxyXFxuXXxcXFxcLikqXFwvW21zaXhwb2R1YWxuZ2NdKig/PVxccyooPzokfFtcXHJcXG4sLjt9KSZ8XFwtKyp+PD4hP15dfCg/OmFuZHxjbXB8ZXF8Z2V8Z3R8bGV8bHR8bmV8bm90fG9yfHh8eG9yKVxcYikpLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblxuXHRcdC8vIEZJWE1FIE5vdCBzdXJlIGFib3V0IHRoZSBoYW5kbGluZyBvZiA6OiwgJywgYW5kICNcblx0XHQndmFyaWFibGUnOiBbXG5cdFx0XHQvLyAke15QT1NUTUFUQ0h9XG5cdFx0XHQvWyYqJEAlXVxce1xcXltBLVpdK1xcfS8sXG5cdFx0XHQvLyAkXlZcblx0XHRcdC9bJiokQCVdXFxeW0EtWl9dLyxcblx0XHRcdC8vICR7Li4ufVxuXHRcdFx0L1smKiRAJV0jPyg/PVxceykvLFxuXHRcdFx0Ly8gJGZvb1xuXHRcdFx0L1smKiRAJV0jPyg/Oig/Ojo6KSonPyg/IVxcZClbXFx3JF0rKD8hW1xcdyRdKSkrKD86OjopKi8sXG5cdFx0XHQvLyAkMVxuXHRcdFx0L1smKiRAJV1cXGQrLyxcblx0XHRcdC8vICRfLCBAXywgJSFcblx0XHRcdC8vIFRoZSBuZWdhdGl2ZSBsb29rYWhlYWQgcHJldmVudHMgZnJvbSBicmVha2luZyB0aGUgJT0gb3BlcmF0b3Jcblx0XHRcdC8oPyElPSlbJEAlXVshXCIjJCUmJygpKissXFwtLlxcLzo7PD0+P0BbXFxcXFxcXV5fYHt8fX5dL1xuXHRcdF0sXG5cdFx0J2ZpbGVoYW5kbGUnOiB7XG5cdFx0XHQvLyA8PiwgPEZPTz4sIF9cblx0XHRcdHBhdHRlcm46IC88KD8hWzw9XSlcXFMqPz58XFxiX1xcYi8sXG5cdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHR9LFxuXHRcdCd2LXN0cmluZyc6IHtcblx0XHRcdC8vIHYxLjIsIDEuMi4zXG5cdFx0XHRwYXR0ZXJuOiAvdlxcZCsoPzpcXC5cXGQrKSp8XFxkKyg/OlxcLlxcZCspezIsfS8sXG5cdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHR9LFxuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxic3ViWyBcXHRdKylcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OmFueXxicmVha3xjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkaWV8ZG98ZWxzZXxlbHNpZnxldmFsfGZvcnxmb3JlYWNofGdpdmVufGdvdG98aWZ8bGFzdHxsb2NhbHxteXxuZXh0fG91cnxwYWNrYWdlfHByaW50fHJlZG98cmVxdWlyZXxyZXR1cm58c2F5fHN0YXRlfHN1Ynxzd2l0Y2h8dW5kZWZ8dW5sZXNzfHVudGlsfHVzZXx3aGVufHdoaWxlKVxcYi8sXG5cdFx0J251bWJlcic6IC9cXGIoPzoweFtcXGRBLUZhLWZdKD86Xz9bXFxkQS1GYS1mXSkqfDBiWzAxXSg/Ol8/WzAxXSkqfCg/Oig/OlxcZCg/Ol8/XFxkKSopP1xcLik/XFxkKD86Xz9cXGQpKig/OltFZV1bKy1dP1xcZCspPylcXGIvLFxuXHRcdCdvcGVyYXRvcic6IC8tW3J3eG9SV1hPZXpzZmRscFNiY3R1Z2tUQk1BQ11cXGJ8XFwrWys9XT98LVstPT5dP3xcXCpcXCo/PT98XFwvXFwvPz0/fD1bPX4+XT98flt+PV0/fFxcfFxcfD89P3wmJj89P3w8KD86PT4/fDw9Pyk/fD4+Pz0/fCFbfj1dP3xbJV5dPT98XFwuKD86PXxcXC5cXC4/KT98W1xcXFw/XXxcXGJ4KD86PXxcXGIpfFxcYig/OmFuZHxjbXB8ZXF8Z2V8Z3R8bGV8bHR8bmV8bm90fG9yfHhvcilcXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLDpdL1xuXHR9O1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgdHlwZUV4cHJlc3Npb24gPSAvKD86XFxiW2EtekEtWl1cXHcqfFt8XFxcXFtcXF1dKSsvLnNvdXJjZTtcblxuXHRQcmlzbS5sYW5ndWFnZXMucGhwZG9jID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnamF2YWRvY2xpa2UnLCB7XG5cdFx0J3BhcmFtZXRlcic6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnKEAoPzpnbG9iYWx8cGFyYW18cHJvcGVydHkoPzotcmVhZHwtd3JpdGUpP3x2YXIpXFxcXHMrKD86JyArIHR5cGVFeHByZXNzaW9uICsgJ1xcXFxzKyk/KVxcXFwkXFxcXHcrJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdwaHBkb2MnLCAna2V5d29yZCcsIHtcblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKCcoQCg/Omdsb2JhbHxwYWNrYWdlfHBhcmFtfHByb3BlcnR5KD86LXJlYWR8LXdyaXRlKT98cmV0dXJufHN1YnBhY2thZ2V8dGhyb3dzfHZhcilcXFxccyspJyArIHR5cGVFeHByZXNzaW9uKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2tleXdvcmQnOiAvXFxiKD86YXJyYXl8Ym9vbHxib29sZWFufGNhbGxiYWNrfGRvdWJsZXxmYWxzZXxmbG9hdHxpbnR8aW50ZWdlcnxtaXhlZHxudWxsfG9iamVjdHxyZXNvdXJjZXxzZWxmfHN0cmluZ3x0cnVlfHZvaWQpXFxiLyxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvW3xcXFxcW1xcXSgpXS9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5qYXZhZG9jbGlrZS5hZGRTdXBwb3J0KCdwaHAnLCBQcmlzbS5sYW5ndWFnZXMucGhwZG9jKTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdwaHAnLCAndmFyaWFibGUnLCB7XG5cdCd0aGlzJzoge1xuXHRcdHBhdHRlcm46IC9cXCR0aGlzXFxiLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdnbG9iYWwnOiAvXFwkKD86R0xPQkFMU3xIVFRQX1JBV19QT1NUX0RBVEF8Xyg/OkNPT0tJRXxFTlZ8RklMRVN8R0VUfFBPU1R8UkVRVUVTVHxTRVJWRVJ8U0VTU0lPTil8YXJnY3xhcmd2fGh0dHBfcmVzcG9uc2VfaGVhZGVyfHBocF9lcnJvcm1zZylcXGIvLFxuXHQnc2NvcGUnOiB7XG5cdFx0cGF0dGVybjogL1xcYltcXHdcXFxcXSs6Oi8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IC9cXGIoPzpwYXJlbnR8c2VsZnxzdGF0aWMpXFxiLyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC86OnxcXFxcL1xuXHRcdH1cblx0fVxufSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0dmFyIHZhcmlhYmxlID0gL1xcJFxcdyt8JVthLXpdKyUvO1xuXG5cdHZhciBhcnJvd0F0dHIgPSAvXFxbW15bXFxdXSpcXF0vLnNvdXJjZTtcblx0dmFyIGFycm93RGlyZWN0aW9uID0gLyg/Oltkcmx1XXxkb3xkb3dufGxlfGxlZnR8cml8cmlnaHR8dXApLy5zb3VyY2U7XG5cdHZhciBhcnJvd0JvZHkgPSAnKD86LSsnICsgYXJyb3dEaXJlY3Rpb24gKyAnLSt8XFxcXC4rJyArIGFycm93RGlyZWN0aW9uICsgJ1xcXFwuK3wtKyg/OicgKyBhcnJvd0F0dHIgKyAnLSopP3wnICsgYXJyb3dBdHRyICsgJy0rfFxcXFwuKyg/OicgKyBhcnJvd0F0dHIgKyAnXFxcXC4qKT98JyArIGFycm93QXR0ciArICdcXFxcLispJztcblx0dmFyIGFycm93TGVmdCA9IC8oPzo8ezEsMn18XFwvezEsMn18XFxcXHsxLDJ9fDxcXHx8WyMqXit9eG9dKS8uc291cmNlO1xuXHR2YXIgYXJyb3dSaWdodCA9IC8oPzo+ezEsMn18XFwvezEsMn18XFxcXHsxLDJ9fFxcfD58WyMqXit7eG9dKS8uc291cmNlO1xuXHR2YXIgYXJyb3dQcmVmaXggPSAvW1s/XT9bb3hdPy8uc291cmNlO1xuXHR2YXIgYXJyb3dTdWZmaXggPSAvW294XT9bXFxdP10/Ly5zb3VyY2U7XG5cdHZhciBhcnJvdyA9XG5cdFx0YXJyb3dQcmVmaXggK1xuXHRcdCcoPzonICtcblx0XHRhcnJvd0JvZHkgKyBhcnJvd1JpZ2h0ICtcblx0XHQnfCcgK1xuXHRcdGFycm93TGVmdCArIGFycm93Qm9keSArICcoPzonICsgYXJyb3dSaWdodCArICcpPycgK1xuXHRcdCcpJyArXG5cdFx0YXJyb3dTdWZmaXg7XG5cblx0UHJpc20ubGFuZ3VhZ2VzWydwbGFudC11bWwnXSA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopKD86Jy4qfFxcLydbXFxzXFxTXSo/J1xcLykvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdwcmVwcm9jZXNzb3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSEuKi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHJvcGVydHknLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd2YXJpYWJsZSc6IHZhcmlhYmxlXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKilAKD86ZW5kfHN0YXJ0KXVtbFxcYi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblxuXHRcdCdhcnJvdyc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKF58W14tLjw+P3xcXFxcW1xcXW94XSkvLnNvdXJjZSArIGFycm93ICsgLyg/IVstLjw+P3xcXFxcXFxdb3hdKS8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxcWylbXltcXF1dKyg/PVxcXSkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxbKD89JHxcXF0pfF5cXF0vXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCJbXlwiXSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCd0ZXh0Jzoge1xuXHRcdFx0cGF0dGVybjogLyhcXFtbIFxcdF0qW1xcclxcbl0rKD8hW1xcclxcbl0pKVteXFxdXSooPz1cXF0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHR9LFxuXG5cdFx0J2tleXdvcmQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFsgXFx0XSopKD86YWJzdHJhY3RcXHMrY2xhc3N8ZW5kXFxzKyg/OmJveHxmb3JrfGdyb3VwfG1lcmdlfG5vdGV8cmVmfHNwbGl0fHRpdGxlKXwoPzpmb3JrfHNwbGl0KSg/OlxccythZ2Fpbik/fGFjdGl2YXRlfGFjdG9yfGFnZW50fGFsdHxhbm5vdGF0aW9ufGFydGlmYWN0fGF1dG9hY3RpdmF0ZXxhdXRvbnVtYmVyfGJhY2t3YXJkfGJpbmFyeXxib3VuZGFyeXxib3h8YnJlYWt8Y2FwdGlvbnxjYXJkfGNhc2V8Y2lyY2xlfGNsYXNzfGNsb2NrfGNsb3VkfGNvbGxlY3Rpb25zfGNvbXBvbmVudHxjb25jaXNlfGNvbnRyb2x8Y3JlYXRlfGNyaXRpY2FsfGRhdGFiYXNlfGRlYWN0aXZhdGV8ZGVzdHJveXxkZXRhY2h8ZGlhbW9uZHxlbHNlfGVsc2VpZnxlbmR8ZW5kW2hyXW5vdGV8ZW5kaWZ8ZW5kc3dpdGNofGVuZHdoaWxlfGVudGl0eXxlbnVtfGZpbGV8Zm9sZGVyfGZvb3RlcnxmcmFtZXxncm91cHxbaHJdP25vdGV8aGVhZGVyfGhleGFnb258aGlkZXxpZnxpbnRlcmZhY2V8bGFiZWx8bGVnZW5kfGxvb3B8bWFwfG5hbWVzcGFjZXxuZXR3b3JrfG5ld3BhZ2V8bm9kZXxud2RpYWd8b2JqZWN0fG9wdHxwYWNrYWdlfHBhZ2V8cGFyfHBhcnRpY2lwYW50fHBlcnNvbnxxdWV1ZXxyZWN0YW5nbGV8cmVmfHJlbW92ZXxyZXBlYXR8cmVzdG9yZXxyZXR1cm58cm9idXN0fHNjYWxlfHNldHxzaG93fHNraW5wYXJhbXxzdGFja3xzdGFydHxzdGF0ZXxzdG9wfHN0b3JhZ2V8c3dpdGNofHRpdGxlfHRvZ2V0aGVyfHVzZWNhc2V8dXNlY2FzZVxcL3x3aGlsZSkoPz1cXHN8JCkvbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0L1xcYig/OmVsc2VpZnxlcXVhbHN8bm90fHdoaWxlKSg/PVxccypcXCgpLyxcblx0XHRcdC9cXGIoPzphc3xpc3x0aGVuKVxcYi9cblx0XHRdLFxuXG5cdFx0J2RpdmlkZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXj09Lis9PSQvbSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdH0sXG5cblx0XHQndGltZSc6IHtcblx0XHRcdHBhdHRlcm46IC9AKD86XFxkKyg/Ols6L11cXGQrKXsyfXxbKy1dP1xcZCt8OlthLXpdXFx3Kig/OlsrLV1cXGQrKT8pXFxiL2ksXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ251bWJlcidcblx0XHR9LFxuXG5cdFx0J2NvbG9yJzoge1xuXHRcdFx0cGF0dGVybjogLyMoPzpbYS16X10rfFthLWZBLUYwLTldKylcXGIvLFxuXHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0fSxcblx0XHQndmFyaWFibGUnOiB2YXJpYWJsZSxcblxuXHRcdCdwdW5jdHVhdGlvbic6IC9bOiw7KClbXFxde31dfFxcLnszfS9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXNbJ3BsYW50LXVtbCddLmFycm93Lmluc2lkZS5leHByZXNzaW9uLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlc1sncGxhbnQtdW1sJ107XG5cblx0UHJpc20ubGFuZ3VhZ2VzWydwbGFudHVtbCddID0gUHJpc20ubGFuZ3VhZ2VzWydwbGFudC11bWwnXTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMucGxzcWwgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdzcWwnLCB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfC0tLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQvLyBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9lbi9kYXRhYmFzZS9vcmFjbGUvb3JhY2xlLWRhdGFiYXNlLzIxL2xucGxzL3Bsc3FsLXJlc2VydmVkLXdvcmRzLWtleXdvcmRzLmh0bWxcblx0J2tleXdvcmQnOiAvXFxiKD86QXxBQ0NFU1NJQkxFfEFERHxBR0VOVHxBR0dSRUdBVEV8QUxMfEFMVEVSfEFORHxBTll8QVJSQVl8QVN8QVNDfEFUfEFUVFJJQlVURXxBVVRISUR8QVZHfEJFR0lOfEJFVFdFRU58QkZJTEVfQkFTRXxCSU5BUll8QkxPQl9CQVNFfEJMT0NLfEJPRFl8Qk9USHxCT1VORHxCVUxLfEJZfEJZVEV8Q3xDQUxMfENBTExJTkd8Q0FTQ0FERXxDQVNFfENIQVJ8Q0hBUkFDVEVSfENIQVJTRVR8Q0hBUlNFVEZPUk18Q0hBUlNFVElEfENIQVJfQkFTRXxDSEVDS3xDTE9CX0JBU0V8Q0xPTkV8Q0xPU0V8Q0xVU1RFUnxDTFVTVEVSU3xDT0xBVVRIfENPTExFQ1R8Q09MVU1OU3xDT01NRU5UfENPTU1JVHxDT01NSVRURUR8Q09NUElMRUR8Q09NUFJFU1N8Q09OTkVDVHxDT05TVEFOVHxDT05TVFJVQ1RPUnxDT05URVhUfENPTlRJTlVFfENPTlZFUlR8Q09VTlR8Q1JBU0h8Q1JFQVRFfENSRURFTlRJQUx8Q1VSUkVOVHxDVVJTT1J8Q1VTVE9NREFUVU18REFOR0xJTkd8REFUQXxEQVRFfERBVEVfQkFTRXxEQVl8REVDTEFSRXxERUZBVUxUfERFRklORXxERUxFVEV8REVTQ3xERVRFUk1JTklTVElDfERJUkVDVE9SWXxESVNUSU5DVHxET1VCTEV8RFJPUHxEVVJBVElPTnxFTEVNRU5UfEVMU0V8RUxTSUZ8RU1QVFl8RU5EfEVTQ0FQRXxFWENFUFR8RVhDRVBUSU9OfEVYQ0VQVElPTlN8RVhDTFVTSVZFfEVYRUNVVEV8RVhJU1RTfEVYSVR8RVhURVJOQUx8RkVUQ0h8RklOQUx8RklSU1R8RklYRUR8RkxPQVR8Rk9SfEZPUkFMTHxGT1JDRXxGUk9NfEZVTkNUSU9OfEdFTkVSQUx8R09UT3xHUkFOVHxHUk9VUHxIQVNIfEhBVklOR3xIRUFQfEhJRERFTnxIT1VSfElERU5USUZJRUR8SUZ8SU1NRURJQVRFfElNTVVUQUJMRXxJTnxJTkNMVURJTkd8SU5ERVh8SU5ERVhFU3xJTkRJQ0FUT1J8SU5ESUNFU3xJTkZJTklURXxJTlNFUlR8SU5TVEFOVElBQkxFfElOVHxJTlRFUkZBQ0V8SU5URVJTRUNUfElOVEVSVkFMfElOVE98SU5WQUxJREFURXxJU3xJU09MQVRJT058SkFWQXxMQU5HVUFHRXxMQVJHRXxMRUFESU5HfExFTkdUSHxMRVZFTHxMSUJSQVJZfExJS0V8TElLRTJ8TElLRTR8TElLRUN8TElNSVR8TElNSVRFRHxMT0NBTHxMT0NLfExPTkd8TE9PUHxNQVB8TUFYfE1BWExFTnxNRU1CRVJ8TUVSR0V8TUlOfE1JTlVTfE1JTlVURXxNT0R8TU9ERXxNT0RJRll8TU9OVEh8TVVMVElTRVR8TVVUQUJMRXxOQU1FfE5BTnxOQVRJT05BTHxOQVRJVkV8TkNIQVJ8TkVXfE5PQ09NUFJFU1N8Tk9DT1BZfE5PVHxOT1dBSVR8TlVMTHxOVU1CRVJfQkFTRXxPQkpFQ1R8T0NJQ09MTHxPQ0lEQVRFfE9DSURBVEVUSU1FfE9DSURVUkFUSU9OfE9DSUlOVEVSVkFMfE9DSUxPQkxPQ0FUT1J8T0NJTlVNQkVSfE9DSVJBV3xPQ0lSRUZ8T0NJUkVGQ1VSU09SfE9DSVJPV0lEfE9DSVNUUklOR3xPQ0lUWVBFfE9GfE9MRHxPTnxPTkxZfE9QQVFVRXxPUEVOfE9QRVJBVE9SfE9QVElPTnxPUnxPUkFDTEV8T1JBREFUQXxPUkRFUnxPUkdBTklaQVRJT058T1JMQU5ZfE9STFZBUll8T1RIRVJTfE9VVHxPVkVSTEFQU3xPVkVSUklESU5HfFBBQ0tBR0V8UEFSQUxMRUxfRU5BQkxFfFBBUkFNRVRFUnxQQVJBTUVURVJTfFBBUkVOVHxQQVJUSVRJT058UEFTQ0FMfFBFUlNJU1RBQkxFfFBJUEV8UElQRUxJTkVEfFBMVUdHQUJMRXxQT0xZTU9SUEhJQ3xQUkFHTUF8UFJFQ0lTSU9OfFBSSU9SfFBSSVZBVEV8UFJPQ0VEVVJFfFBVQkxJQ3xSQUlTRXxSQU5HRXxSQVd8UkVBRHxSRUNPUkR8UkVGfFJFRkVSRU5DRXxSRUxJRVNfT058UkVNfFJFTUFJTkRFUnxSRU5BTUV8UkVTT1VSQ0V8UkVTVUxUfFJFU1VMVF9DQUNIRXxSRVRVUk58UkVUVVJOSU5HfFJFVkVSU0V8UkVWT0tFfFJPTExCQUNLfFJPV3xTQU1QTEV8U0FWRXxTQVZFUE9JTlR8U0IxfFNCMnxTQjR8U0VDT05EfFNFR01FTlR8U0VMRUNUfFNFTEZ8U0VQQVJBVEV8U0VRVUVOQ0V8U0VSSUFMSVpBQkxFfFNFVHxTSEFSRXxTSE9SVHxTSVpFfFNJWkVfVHxTT01FfFNQQVJTRXxTUUx8U1FMQ09ERXxTUUxEQVRBfFNRTE5BTUV8U1FMU1RBVEV8U1RBTkRBUkR8U1RBUlR8U1RBVElDfFNURERFVnxTVE9SRUR8U1RSSU5HfFNUUlVDVHxTVFlMRXxTVUJNVUxUSVNFVHxTVUJQQVJUSVRJT058U1VCU1RJVFVUQUJMRXxTVUJUWVBFfFNVTXxTWU5PTllNfFRBQkFVVEh8VEFCTEV8VERPfFRIRXxUSEVOfFRJTUV8VElNRVNUQU1QfFRJTUVaT05FX0FCQlJ8VElNRVpPTkVfSE9VUnxUSU1FWk9ORV9NSU5VVEV8VElNRVpPTkVfUkVHSU9OfFRPfFRSQUlMSU5HfFRSQU5TQUNUSU9OfFRSQU5TQUNUSU9OQUx8VFJVU1RFRHxUWVBFfFVCMXxVQjJ8VUI0fFVOREVSfFVOSU9OfFVOSVFVRXxVTlBMVUd8VU5TSUdORUR8VU5UUlVTVEVEfFVQREFURXxVU0V8VVNJTkd8VkFMSVNUfFZBTFVFfFZBTFVFU3xWQVJJQUJMRXxWQVJJQU5DRXxWQVJSQVl8VkFSWUlOR3xWSUVXfFZJRVdTfFZPSUR8V0hFTnxXSEVSRXxXSElMRXxXSVRIfFdPUkt8V1JBUFBFRHxXUklURXxZRUFSfFpPTkUpXFxiL2ksXG5cdC8vIGh0dHBzOi8vZG9jcy5vcmFjbGUuY29tL2VuL2RhdGFiYXNlL29yYWNsZS9vcmFjbGUtZGF0YWJhc2UvMjEvbG5wbHMvcGxzcWwtbGFuZ3VhZ2UtZnVuZGFtZW50YWxzLmh0bWwjR1VJRC05NkE0MkY3Qy03QTcxLTRCOTAtODI1NS1DQTlDOEJEOTcyMkVcblx0J29wZXJhdG9yJzogLzo9P3w9PnxbPD5efiFdPXxcXC5cXC58XFx8XFx8fFxcKlxcKnxbLSsqLyU8Pj1AXS9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdwbHNxbCcsICdvcGVyYXRvcicsIHtcblx0J2xhYmVsJzoge1xuXHRcdHBhdHRlcm46IC88PFxccypcXHcrXFxzKj4+Lyxcblx0XHRhbGlhczogJ3N5bWJvbCdcblx0fSxcbn0pO1xuXG4vLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9wb3dlcnF1ZXJ5LW0vcG93ZXItcXVlcnktbS1sYW5ndWFnZS1zcGVjaWZpY2F0aW9uXG5cblByaXNtLmxhbmd1YWdlcy5wb3dlcnF1ZXJ5ID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzpcXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3F1b3RlZC1pZGVudGlmaWVyJzoge1xuXHRcdHBhdHRlcm46IC8jXCIoPzpbXlwiXFxyXFxuXXxcIlwiKSpcIig/IVwiKS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyg/OiMhKT9cIig/OlteXCJcXHJcXG5dfFwiXCIpKlwiKD8hXCIpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NvbnN0YW50JzogW1xuXHRcdC9cXGJEYXlcXC4oPzpGcmlkYXl8TW9uZGF5fFNhdHVyZGF5fFN1bmRheXxUaHVyc2RheXxUdWVzZGF5fFdlZG5lc2RheSlcXGIvLFxuXHRcdC9cXGJUcmFjZUxldmVsXFwuKD86Q3JpdGljYWx8RXJyb3J8SW5mb3JtYXRpb258VmVyYm9zZXxXYXJuaW5nKVxcYi8sXG5cdFx0L1xcYk9jY3VycmVuY2VcXC4oPzpBbGx8Rmlyc3R8TGFzdClcXGIvLFxuXHRcdC9cXGJPcmRlclxcLig/OkFzY2VuZGluZ3xEZXNjZW5kaW5nKVxcYi8sXG5cdFx0L1xcYlJvdW5kaW5nTW9kZVxcLig/OkF3YXlGcm9tWmVyb3xEb3dufFRvRXZlbnxUb3dhcmRaZXJvfFVwKVxcYi8sXG5cdFx0L1xcYk1pc3NpbmdGaWVsZFxcLig/OkVycm9yfElnbm9yZXxVc2VOdWxsKVxcYi8sXG5cdFx0L1xcYlF1b3RlU3R5bGVcXC4oPzpDc3Z8Tm9uZSlcXGIvLFxuXHRcdC9cXGJKb2luS2luZFxcLig/OkZ1bGxPdXRlcnxJbm5lcnxMZWZ0QW50aXxMZWZ0T3V0ZXJ8UmlnaHRBbnRpfFJpZ2h0T3V0ZXIpXFxiLyxcblx0XHQvXFxiR3JvdXBLaW5kXFwuKD86R2xvYmFsfExvY2FsKVxcYi8sXG5cdFx0L1xcYkV4dHJhVmFsdWVzXFwuKD86RXJyb3J8SWdub3JlfExpc3QpXFxiLyxcblx0XHQvXFxiSm9pbkFsZ29yaXRobVxcLig/OkR5bmFtaWN8TGVmdEhhc2h8TGVmdEluZGV4fFBhaXJ3aXNlSGFzaHxSaWdodEhhc2h8UmlnaHRJbmRleHxTb3J0TWVyZ2UpXFxiLyxcblx0XHQvXFxiSm9pblNpZGVcXC4oPzpMZWZ0fFJpZ2h0KVxcYi8sXG5cdFx0L1xcYlByZWNpc2lvblxcLig/OkRlY2ltYWx8RG91YmxlKVxcYi8sXG5cdFx0L1xcYlJlbGF0aXZlUG9zaXRpb25cXC5Gcm9tKD86RW5kfFN0YXJ0KVxcYi8sXG5cdFx0L1xcYlRleHRFbmNvZGluZ1xcLig/OkFzY2lpfEJpZ0VuZGlhblVuaWNvZGV8VW5pY29kZXxVdGYxNnxVdGY4fFdpbmRvd3MpXFxiLyxcblx0XHQvXFxiKD86QW55fEJpbmFyeXxEYXRlfERhdGVUaW1lfERhdGVUaW1lWm9uZXxEdXJhdGlvbnxGdW5jdGlvbnxJbnQxNnxJbnQzMnxJbnQ2NHxJbnQ4fExpc3R8TG9naWNhbHxOb25lfE51bWJlcnxSZWNvcmR8VGFibGV8VGV4dHxUaW1lKVxcLlR5cGVcXGIvLFxuXHRcdC9cXGJudWxsXFxiL1xuXHRdLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFuZHxhc3xlYWNofGVsc2V8ZXJyb3J8aWZ8aW58aXN8bGV0fG1ldGF8bm90fG51bGxhYmxlfG9wdGlvbmFsfG9yfG90aGVyd2lzZXxzZWN0aW9ufHNoYXJlZHx0aGVufHRyeXx0eXBlKVxcYnwjKD86YmluYXJ5fGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWV6b25lfGR1cmF0aW9ufGluZmluaXR5fG5hbnxzZWN0aW9uc3xzaGFyZWR8dGFibGV8dGltZSlcXGIvLFxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLyhefFteI1xcdy5dKVthLXpfXVtcXHcuXSooPz1cXHMqXFwoKS9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2RhdGEtdHlwZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86YW55fGFueW5vbm51bGx8YmluYXJ5fGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWV6b25lfGR1cmF0aW9ufGZ1bmN0aW9ufGxpc3R8bG9naWNhbHxub25lfG51bWJlcnxyZWNvcmR8dGFibGV8dGV4dHx0aW1lKVxcYi8sXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9LFxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC9cXGIweFtcXGRhLWZdK1xcYnwoPzpbKy1dPyg/OlxcYlxcZCtcXC4pP1xcYlxcZCt8WystXVxcLlxcZCt8KF58W14uXSlcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspP1xcYi9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J29wZXJhdG9yJzogL1stKypcXC8mP0BeXXw8KD86PT4/fD4pP3w+PT98PT4/fFxcLlxcLlxcLj8vLFxuXHQncHVuY3R1YXRpb24nOiAvWyw7XFxbXFxdKCl7fV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucHEgPSBQcmlzbS5sYW5ndWFnZXNbJ3Bvd2VycXVlcnknXTtcblByaXNtLmxhbmd1YWdlcy5tc2NyaXB0ID0gUHJpc20ubGFuZ3VhZ2VzWydwb3dlcnF1ZXJ5J107XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgcG93ZXJzaGVsbCA9IFByaXNtLmxhbmd1YWdlcy5wb3dlcnNoZWxsID0ge1xuXHRcdCdjb21tZW50JzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15gXSk8I1tcXHNcXFNdKj8jPi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXmBdKSMuKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdzdHJpbmcnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cIig/OmBbXFxzXFxTXXxbXmBcIl0pKlwiLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvJyg/OlteJ118JycpKicvLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdC8vIE1hdGNoZXMgbmFtZSBzcGFjZXMgYXMgd2VsbCBhcyBjYXN0cywgYXR0cmlidXRlIGRlY29yYXRvcnMuIEZvcmNlIHN0YXJ0aW5nIHdpdGggbGV0dGVyIHRvIGF2b2lkIG1hdGNoaW5nIGFycmF5IGluZGljZXNcblx0XHQvLyBTdXBwb3J0cyB0d28gbGV2ZWxzIG9mIG5lc3RlZCBicmFja2V0cyAoZS5nLiBgW091dHB1dFR5cGUoW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RbaW50XV0pXWApXG5cdFx0J25hbWVzcGFjZSc6IC9cXFtbYS16XSg/OlxcWyg/OlxcW1teXFxdXSpcXF18W15cXFtcXF1dKSpcXF18W15cXFtcXF1dKSpcXF0vaSxcblx0XHQnYm9vbGVhbic6IC9cXCQoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXHRcdCd2YXJpYWJsZSc6IC9cXCRcXHcrXFxiLyxcblx0XHQvLyBDbWRsZXRzIGFuZCBhbGlhc2VzLiBBbGlhc2VzIHNob3VsZCBjb21lIGxhc3QsIG90aGVyd2lzZSBcIndyaXRlXCIgZ2V0cyBwcmVmZXJyZWQgb3ZlciBcIndyaXRlLWhvc3RcIiBmb3IgZXhhbXBsZVxuXHRcdC8vIEdldC1Db21tYW5kIHwgP3sgJF8uTW9kdWxlTmFtZSAtbWF0Y2ggXCJNaWNyb3NvZnQuUG93ZXJTaGVsbC4oVXRpbHxDb3JlfE1hbmFnZW1lbnQpXCIgfVxuXHRcdC8vIEdldC1BbGlhcyB8ID97ICRfLlJlZmVyZW5jZWRDb21tYW5kLk1vZHVsZS5OYW1lIC1tYXRjaCBcIk1pY3Jvc29mdC5Qb3dlclNoZWxsLihVdGlsfENvcmV8TWFuYWdlbWVudClcIiB9XG5cdFx0J2Z1bmN0aW9uJzogW1xuXHRcdFx0L1xcYig/OkFkZHxBcHByb3ZlfEFzc2VydHxCYWNrdXB8QmxvY2t8Q2hlY2twb2ludHxDbGVhcnxDbG9zZXxDb21wYXJlfENvbXBsZXRlfENvbXByZXNzfENvbmZpcm18Q29ubmVjdHxDb252ZXJ0fENvbnZlcnRGcm9tfENvbnZlcnRUb3xDb3B5fERlYnVnfERlbnl8RGlzYWJsZXxEaXNjb25uZWN0fERpc21vdW50fEVkaXR8RW5hYmxlfEVudGVyfEV4aXR8RXhwYW5kfEV4cG9ydHxGaW5kfEZvckVhY2h8Rm9ybWF0fEdldHxHcmFudHxHcm91cHxIaWRlfEltcG9ydHxJbml0aWFsaXplfEluc3RhbGx8SW52b2tlfEpvaW58TGltaXR8TG9ja3xNZWFzdXJlfE1lcmdlfE1vdmV8TmV3fE9wZW58T3B0aW1pemV8T3V0fFBpbmd8UG9wfFByb3RlY3R8UHVibGlzaHxQdXNofFJlYWR8UmVjZWl2ZXxSZWRvfFJlZ2lzdGVyfFJlbW92ZXxSZW5hbWV8UmVwYWlyfFJlcXVlc3R8UmVzZXR8UmVzaXplfFJlc29sdmV8UmVzdGFydHxSZXN0b3JlfFJlc3VtZXxSZXZva2V8U2F2ZXxTZWFyY2h8U2VsZWN0fFNlbmR8U2V0fFNob3d8U2tpcHxTb3J0fFNwbGl0fFN0YXJ0fFN0ZXB8U3RvcHxTdWJtaXR8U3VzcGVuZHxTd2l0Y2h8U3luY3xUZWV8VGVzdHxUcmFjZXxVbmJsb2NrfFVuZG98VW5pbnN0YWxsfFVubG9ja3xVbnByb3RlY3R8VW5wdWJsaXNofFVucmVnaXN0ZXJ8VXBkYXRlfFVzZXxXYWl0fFdhdGNofFdoZXJlfFdyaXRlKS1bYS16XStcXGIvaSxcblx0XHRcdC9cXGIoPzphY3xjYXR8Y2hkaXJ8Y2xjfGNsaXxjbHB8Y2x2fGNvbXBhcmV8Y29weXxjcHxjcGl8Y3BwfGN2cGF8ZGJwfGRlbHxkaWZmfGRpcnxlYnB8ZWNob3xlcGFsfGVwY3N2fGVwc258ZXJhc2V8ZmN8Zmx8ZnR8Znd8Z2FsfGdicHxnY3xnY2l8Z2NzfGdkcnxnaXxnbHxnbXxncHxncHN8Z3JvdXB8Z3N2fGd1fGd2fGd3bWl8aWV4fGlpfGlwYWx8aXBjc3Z8aXBzbnxpcm18aXdtaXxpd3J8a2lsbHxscHxsc3xtZWFzdXJlfG1pfG1vdW50fG1vdmV8bXB8bXZ8bmFsfG5kcnxuaXxudnxvZ3Z8cG9wZHxwc3xwdXNoZHxwd2R8cmJwfHJkfHJkcnxyZW58cml8cm18cm1kaXJ8cm5pfHJucHxycHxydnxydnBhfHJ3bWl8c2FsfHNhcHN8c2FzdnxzYnB8c2N8c2VsZWN0fHNldHxzaGNtfHNpfHNsfHNsZWVwfHNsc3xzb3J0fHNwfHNwcHN8c3BzdnxzdGFydHxzdnxzd21pfHRlZXx0cmNtfHR5cGV8d3JpdGUpXFxiL2lcblx0XHRdLFxuXHRcdC8vIHBlciBodHRwOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaGg4NDc3NDQuYXNweFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OkJlZ2lufEJyZWFrfENhdGNofENsYXNzfENvbnRpbnVlfERhdGF8RGVmaW5lfERvfER5bmFtaWNQYXJhbXxFbHNlfEVsc2VJZnxFbmR8RXhpdHxGaWx0ZXJ8RmluYWxseXxGb3J8Rm9yRWFjaHxGcm9tfEZ1bmN0aW9ufElmfElubGluZVNjcmlwdHxQYXJhbGxlbHxQYXJhbXxQcm9jZXNzfFJldHVybnxTZXF1ZW5jZXxTd2l0Y2h8VGhyb3d8VHJhcHxUcnl8VW50aWx8VXNpbmd8VmFyfFdoaWxlfFdvcmtmbG93KVxcYi9pLFxuXHRcdCdvcGVyYXRvcic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXFcpKD86IXwtKD86Yj8oPzphbmR8eD9vcil8YXN8KD86Tm90KT8oPzpDb250YWluc3xJbnxMaWtlfE1hdGNoKXxlcXxnZXxndHxpcyg/Ok5vdCk/fEpvaW58bGV8bHR8bmV8bm90fFJlcGxhY2V8c2hbbHJdKVxcYnwtWy09XT98XFwrWys9XT98WypcXC8lXT0/KS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t8e31bXFxdOygpLC5dL1xuXHR9O1xuXG5cdC8vIFZhcmlhYmxlIGludGVycG9sYXRpb24gaW5zaWRlIHN0cmluZ3MsIGFuZCBuZXN0ZWQgZXhwcmVzc2lvbnNcblx0cG93ZXJzaGVsbC5zdHJpbmdbMF0uaW5zaWRlID0ge1xuXHRcdCdmdW5jdGlvbic6IHtcblx0XHRcdC8vIEFsbG93IGZvciBvbmUgbGV2ZWwgb2YgbmVzdGluZ1xuXHRcdFx0cGF0dGVybjogLyhefFteYF0pXFwkXFwoKD86XFwkXFwoW15cXHJcXG4oKV0qXFwpfCg/IVxcJFxcKClbXlxcclxcbildKSpcXCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogcG93ZXJzaGVsbFxuXHRcdH0sXG5cdFx0J2Jvb2xlYW4nOiBwb3dlcnNoZWxsLmJvb2xlYW4sXG5cdFx0J3ZhcmlhYmxlJzogcG93ZXJzaGVsbC52YXJpYWJsZSxcblx0fTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMucHJvY2Vzc2luZyA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQna2V5d29yZCc6IC9cXGIoPzpicmVha3xjYXNlfGNhdGNofGNsYXNzfGNvbnRpbnVlfGRlZmF1bHR8ZWxzZXxleHRlbmRzfGZpbmFsfGZvcnxpZnxpbXBsZW1lbnRzfGltcG9ydHxuZXd8bnVsbHxwcml2YXRlfHB1YmxpY3xyZXR1cm58c3RhdGljfHN1cGVyfHN3aXRjaHx0aGlzfHRyeXx2b2lkfHdoaWxlKVxcYi8sXG5cdC8vIFNwYWNlcyBhcmUgYWxsb3dlZCBiZXR3ZWVuIGZ1bmN0aW9uIG5hbWUgYW5kIHBhcmVudGhlc2lzXG5cdCdmdW5jdGlvbic6IC9cXGJcXHcrKD89XFxzKlxcKCkvLFxuXHQnb3BlcmF0b3InOiAvPFs8PV0/fD5bPj1dP3wmJj98XFx8XFx8P3xbJT9dfFshPStcXC0qXFwvXT0/L1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3Byb2Nlc3NpbmcnLCAnbnVtYmVyJywge1xuXHQvLyBTcGVjaWFsIGNhc2U6IFhNTCBpcyBhIHR5cGVcblx0J2NvbnN0YW50JzogL1xcYig/IVhNTFxcYilbQS1aXVtBLVpcXGRfXStcXGIvLFxuXHQndHlwZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86Ym9vbGVhbnxieXRlfGNoYXJ8Y29sb3J8ZG91YmxlfGZsb2F0fGludHxbQS1aXVxcdyopXFxiLyxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMucHJvbG9nID0ge1xuXHQvLyBTeW50YXggZGVwZW5kcyBvbiB0aGUgaW1wbGVtZW50YXRpb25cblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98JS4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0Ly8gRGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiwgc3RyaW5ncyBtYXkgYWxsb3cgZXNjYXBlZCBuZXdsaW5lcyBhbmQgcXVvdGUtZXNjYXBlXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhbXCInXSkoPzpcXDFcXDF8XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMSg/IVxcMSkvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnYnVpbHRpbic6IC9cXGIoPzpmeHxmeXx4Zlt4eV0/fHlmeD8pXFxiLyxcblx0Ly8gRklYTUU6IFNob3VsZCB3ZSBsaXN0IGFsbCBudWxsLWFyeSBwcmVkaWNhdGVzIChub3QgZm9sbG93ZWQgYnkgYSBwYXJlbnRoZXNpcykgbGlrZSBoYWx0LCB0cmFjZSwgZXRjLj9cblx0J2Z1bmN0aW9uJzogL1xcYlthLXpdXFx3Kig/Oig/PVxcKCl8XFwvXFxkKykvLFxuXHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQqKT8vLFxuXHQvLyBDdXN0b20gb3BlcmF0b3JzIGFyZSBhbGxvd2VkXG5cdCdvcGVyYXRvcic6IC9bOlxcXFw9PjxcXC0/KkBcXC87K158ISQuXSt8XFxiKD86aXN8bW9kfG5vdHx4b3IpXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKXt9XFxbXFxdLF0vXG59O1xuXG4vLyBUaGFua3MgdG86IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9tZXRoZXVzLWNvbW11bml0eS9tb25hY28tcHJvbXFsL2Jsb2IvbWFzdGVyL3NyYy9wcm9tcWwvcHJvbXFsLnRzXG4vLyBBcyB3ZWxsIGFzOiBodHRwczovL2thdXNhbC5jby9ibG9nL3NsYXRlLXByaXNtLWFkZC1uZXctc3ludGF4LXByb21xbC9cblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHQvLyBQcm9tUUwgQWdncmVnYXRpb24gT3BlcmF0b3JzXG5cdC8vIChodHRwczovL3Byb21ldGhldXMuaW8vZG9jcy9wcm9tZXRoZXVzL2xhdGVzdC9xdWVyeWluZy9vcGVyYXRvcnMvI2FnZ3JlZ2F0aW9uLW9wZXJhdG9ycylcblx0dmFyIGFnZ3JlZ2F0aW9ucyA9IFtcblx0XHQnc3VtJyxcblx0XHQnbWluJyxcblx0XHQnbWF4Jyxcblx0XHQnYXZnJyxcblx0XHQnZ3JvdXAnLFxuXHRcdCdzdGRkZXYnLFxuXHRcdCdzdGR2YXInLFxuXHRcdCdjb3VudCcsXG5cdFx0J2NvdW50X3ZhbHVlcycsXG5cdFx0J2JvdHRvbWsnLFxuXHRcdCd0b3BrJyxcblx0XHQncXVhbnRpbGUnXG5cdF07XG5cblx0Ly8gUHJvbVFMIHZlY3RvciBtYXRjaGluZyArIHRoZSBieSBhbmQgd2l0aG91dCBjbGF1c2VzXG5cdC8vIChodHRwczovL3Byb21ldGhldXMuaW8vZG9jcy9wcm9tZXRoZXVzL2xhdGVzdC9xdWVyeWluZy9vcGVyYXRvcnMvI3ZlY3Rvci1tYXRjaGluZylcblx0dmFyIHZlY3Rvck1hdGNoaW5nID0gW1xuXHRcdCdvbicsXG5cdFx0J2lnbm9yaW5nJyxcblx0XHQnZ3JvdXBfcmlnaHQnLFxuXHRcdCdncm91cF9sZWZ0Jyxcblx0XHQnYnknLFxuXHRcdCd3aXRob3V0Jyxcblx0XTtcblxuXHQvLyBQcm9tUUwgb2Zmc2V0IG1vZGlmaWVyXG5cdC8vIChodHRwczovL3Byb21ldGhldXMuaW8vZG9jcy9wcm9tZXRoZXVzL2xhdGVzdC9xdWVyeWluZy9iYXNpY3MvI29mZnNldC1tb2RpZmllcilcblx0dmFyIG9mZnNldE1vZGlmaWVyID0gWydvZmZzZXQnXTtcblxuXHR2YXIga2V5d29yZHMgPSBhZ2dyZWdhdGlvbnMuY29uY2F0KHZlY3Rvck1hdGNoaW5nLCBvZmZzZXRNb2RpZmllcik7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnByb21xbCA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopIy4qL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQndmVjdG9yLW1hdGNoJzoge1xuXHRcdFx0Ly8gTWF0Y2ggdGhlIGNvbW1hLXNlcGFyYXRlZCBsYWJlbCBsaXN0cyBpbnNpZGUgdmVjdG9yIG1hdGNoaW5nOlxuXHRcdFx0cGF0dGVybjogbmV3IFJlZ0V4cCgnKCg/OicgKyB2ZWN0b3JNYXRjaGluZy5qb2luKCd8JykgKyAnKVxcXFxzKilcXFxcKFteKV0qXFxcXCknKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2xhYmVsLWtleSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxiW14sXStcXGIvLFxuXHRcdFx0XHRcdGFsaWFzOiAnYXR0ci1uYW1lJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKSxdL1xuXHRcdFx0fSxcblx0XHR9LFxuXHRcdCdjb250ZXh0LWxhYmVscyc6IHtcblx0XHRcdHBhdHRlcm46IC9cXHtbXnt9XSpcXH0vLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdsYWJlbC1rZXknOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdyooPz1cXHMqKD86PXwhWz1+XSkpLyxcblx0XHRcdFx0XHRhbGlhczogJ2F0dHItbmFtZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdsYWJlbC12YWx1ZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKFtcIidgXSkoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pKlxcMS8sXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnYXR0ci12YWx1ZScsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXHt8XFx9fD1+P3whWz1+XXwsLyxcblx0XHRcdH0sXG5cdFx0fSxcblx0XHQnY29udGV4dC1yYW5nZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcW1tcXHdcXHM6XStcXF0vLCAvLyBbMW1dXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXFt8XFxdfDovLFxuXHRcdFx0XHRcdCdyYW5nZS1kdXJhdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXGIoPzpcXGQrKD86W3NtaGR3eV18bXMpKStcXGIvaSxcblx0XHRcdFx0XHRcdGFsaWFzOiAnbnVtYmVyJyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXGJvZmZzZXRcXHMrKVxcdysvLCAvLyBvZmZzZXQgMW1cblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3JhbmdlLWR1cmF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1xcYig/OlxcZCsoPzpbc21oZHd5XXxtcykpK1xcYi9pLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICdudW1iZXInLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0sXG5cdFx0XHR9LFxuXHRcdF0sXG5cdFx0J2tleXdvcmQnOiBuZXcgUmVnRXhwKCdcXFxcYig/OicgKyBrZXl3b3Jkcy5qb2luKCd8JykgKyAnKVxcXFxiJywgJ2knKSxcblx0XHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2ksXG5cdFx0J251bWJlcic6IC9bLStdPyg/Oig/OlxcYlxcZCsoPzpcXC5cXGQrKT98XFxCXFwuXFxkKykoPzplWy0rXT9cXGQrKT9cXGJ8XFxiKD86MHhbMC05YS1mXSt8bmFufGluZilcXGIpL2ksXG5cdFx0J29wZXJhdG9yJzogL1tcXF4qLyUrLV18PT18IT18PD18PHw+PXw+fFxcYig/OmFuZHxvcnx1bmxlc3MpXFxiL2ksXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t7fTsoKWAsLltcXF1dLyxcblx0fTtcbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnByb3BlcnRpZXMgPSB7XG5cdCdjb21tZW50JzogL15bIFxcdF0qWyMhXS4qJC9tLFxuXHQndmFsdWUnOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKig/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXFxcXFxcczo9XSkrKD86ICpbPTpdICooPyEgKXwgKSkoPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlxcXFxcXHJcXG5dKSsvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnYXR0ci12YWx1ZSdcblx0fSxcblx0J2tleSc6IHtcblx0XHRwYXR0ZXJuOiAvXlsgXFx0XSooPzpcXFxcKD86XFxyXFxufFtcXHNcXFNdKXxbXlxcXFxcXHM6PV0pKyg/PSAqWz06XXwgKS9tLFxuXHRcdGFsaWFzOiAnYXR0ci1uYW1lJ1xuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvWz06XS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgYnVpbHRpblR5cGVzID0gL1xcYig/OmJvb2x8Ynl0ZXN8ZG91YmxlfHM/Zml4ZWQoPzozMnw2NCl8ZmxvYXR8W3N1XT9pbnQoPzozMnw2NCl8c3RyaW5nKVxcYi87XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnByb3RvYnVmID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxiKD86ZW51bXxleHRlbmR8bWVzc2FnZXxzZXJ2aWNlKVxccyspW0EtWmEtel9dXFx3Kig/PVxccypcXHspLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXGIoPzpycGNcXHMrXFx3K3xyZXR1cm5zKVxccypcXChcXHMqKD86c3RyZWFtXFxzKyk/KVxcLj9bQS1aYS16X11cXHcqKD86XFwuW0EtWmEtel9dXFx3KikqKD89XFxzKlxcKSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzplbnVtfGV4dGVuZHxleHRlbnNpb25zfGltcG9ydHxtZXNzYWdlfG9uZW9mfG9wdGlvbnxvcHRpb25hbHxwYWNrYWdlfHB1YmxpY3xyZXBlYXRlZHxyZXF1aXJlZHxyZXNlcnZlZHxyZXR1cm5zfHJwYyg/PVxccytcXHcpfHNlcnZpY2V8c3RyZWFtfHN5bnRheHx0bylcXGIoPyFcXHMqPVxccypcXGQpLyxcblx0XHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxccypcXCgpL2lcblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncHJvdG9idWYnLCAnb3BlcmF0b3InLCB7XG5cdFx0J21hcCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJtYXA8XFxzKltcXHcuXStcXHMqLFxccypbXFx3Ll0rXFxzKj4oPz1cXHMrW2Etel9dXFx3KlxccypbPTtdKS9pLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWzw+LixdLyxcblx0XHRcdFx0J2J1aWx0aW4nOiBidWlsdGluVHlwZXNcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdidWlsdGluJzogYnVpbHRpblR5cGVzLFxuXHRcdCdwb3NpdGlvbmFsLWNsYXNzLW5hbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKD86XFxifFxcQlxcLilbYS16X11cXHcqKD86XFwuW2Etel9dXFx3KikqKD89XFxzK1thLXpfXVxcdypcXHMqWz07XSkvaSxcblx0XHRcdGFsaWFzOiAnY2xhc3MtbmFtZScsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdhbm5vdGF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXFtcXHMqKVthLXpfXVxcdyooPz1cXHMqPSkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0Ly8gVE9ETzpcblx0Ly8gLSBBZGQgQ1NTIGhpZ2hsaWdodGluZyBpbnNpZGUgPHN0eWxlPiB0YWdzXG5cdC8vIC0gQWRkIHN1cHBvcnQgZm9yIG11bHRpLWxpbmUgY29kZSBibG9ja3Ncblx0Ly8gLSBBZGQgc3VwcG9ydCBmb3IgaW50ZXJwb2xhdGlvbiAje30gYW5kICF7fVxuXHQvLyAtIEFkZCBzdXBwb3J0IGZvciB0YWcgaW50ZXJwb2xhdGlvbiAjW11cblx0Ly8gLSBBZGQgZXhwbGljaXQgc3VwcG9ydCBmb3IgcGxhaW4gdGV4dCB1c2luZyB8XG5cdC8vIC0gQWRkIHN1cHBvcnQgZm9yIG1hcmt1cCBlbWJlZGRlZCBpbiBwbGFpbiB0ZXh0XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnB1ZyA9IHtcblxuXHRcdC8vIE11bHRpbGluZSBzdHVmZiBzaG91bGQgYXBwZWFyIGJlZm9yZSB0aGUgcmVzdFxuXG5cdFx0Ly8gVGhpcyBoYW5kbGVzIGJvdGggc2luZ2xlLWxpbmUgYW5kIG11bHRpLWxpbmUgY29tbWVudHNcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXihbXFx0IF0qKSlcXC9cXC8uKig/Oig/Olxccj9cXG58XFxyKVxcMltcXHQgXS4rKSovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXG5cdFx0Ly8gQWxsIHRoZSB0YWctcmVsYXRlZCBwYXJ0IGlzIGluIGxvb2tiZWhpbmRcblx0XHQvLyBzbyB0aGF0IGl0IGNhbiBiZSBoaWdobGlnaHRlZCBieSB0aGUgXCJ0YWdcIiBwYXR0ZXJuXG5cdFx0J211bHRpbGluZS1zY3JpcHQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF4oW1xcdCBdKilzY3JpcHRcXGIuKlxcLltcXHQgXSopKD86KD86XFxyP1xcbnxcXHIoPyFcXG4pKSg/OlxcMltcXHQgXS4rfFxccyo/KD89XFxyP1xcbnxcXHIpKSkrL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdH0sXG5cblx0XHQvLyBTZWUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBmb3Iga25vd24gZmlsdGVyc1xuXHRcdCdmaWx0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF4oW1xcdCBdKikpOi4rKD86KD86XFxyP1xcbnxcXHIoPyFcXG4pKSg/OlxcMltcXHQgXS4rfFxccyo/KD89XFxyP1xcbnxcXHIpKSkrL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdmaWx0ZXItbmFtZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXjpbXFx3LV0rLyxcblx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQndGV4dCc6IC9cXFNbXFxzXFxTXSovLFxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQnbXVsdGlsaW5lLXBsYWluLXRleHQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF4oW1xcdCBdKilbXFx3XFwtIy5dK1xcLltcXHQgXSopKD86KD86XFxyP1xcbnxcXHIoPyFcXG4pKSg/OlxcMltcXHQgXS4rfFxccyo/KD89XFxyP1xcbnxcXHIpKSkrL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnbWFya3VwJzoge1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKik8LisvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5tYXJrdXBcblx0XHR9LFxuXHRcdCdkb2N0eXBlJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFxcbilbXFx0IF0qKWRvY3R5cGUoPzogLispPy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdC8vIFRoaXMgaGFuZGxlIGFsbCBjb25kaXRpb25hbCBhbmQgbG9vcCBrZXl3b3Jkc1xuXHRcdCdmbG93LWNvbnRyb2wnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSg/OmNhc2V8ZGVmYXVsdHxlYWNofGVsc2V8aWZ8dW5sZXNzfHdoZW58d2hpbGUpXFxiKD86IC4rKT8vbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2VhY2gnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15lYWNoIC4rPyBpblxcYi8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQna2V5d29yZCc6IC9cXGIoPzplYWNofGluKVxcYi8sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvLC9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdicmFuY2gnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oPzpjYXNlfGRlZmF1bHR8ZWxzZXxpZnx1bmxlc3N8d2hlbnx3aGlsZSlcXGIvLFxuXHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdFx0fSxcblx0XHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKikoPzphcHBlbmR8YmxvY2t8ZXh0ZW5kc3xpbmNsdWRlfHByZXBlbmQpXFxiLisvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdtaXhpbic6IFtcblx0XHRcdC8vIERlY2xhcmF0aW9uXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSopbWl4aW4gLisvbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2tleXdvcmQnOiAvXm1peGluLyxcblx0XHRcdFx0XHQnZnVuY3Rpb24nOiAvXFx3Kyg/PVxccypcXCh8XFxzKiQpLyxcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWygpLC5dL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0Ly8gVXNhZ2Vcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyheW1xcdCBdKilcXCsuKy9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnbmFtZSc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eXFwrXFx3Ky8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J3NjcmlwdCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSpzY3JpcHQoPzooPzomW14oXSspP1xcKFteKV0rXFwpKSpbXFx0IF0pLisvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0fSxcblxuXHRcdCdwbGFpbi10ZXh0Jzoge1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKig/IS0pW1xcd1xcLSMuXSpbXFx3XFwtXSg/Oig/OiZbXihdKyk/XFwoW14pXStcXCkpKlxcLz9bXFx0IF0pLisvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCd0YWcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSg/IS0pW1xcd1xcLSMuXSpbXFx3XFwtXSg/Oig/OiZbXihdKyk/XFwoW14pXStcXCkpKlxcLz86Py9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnYXR0cmlidXRlcyc6IFtcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvJlteKF0rXFwoW14pXStcXCkvLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1xcKFteKV0rXFwpLyxcblx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHQnYXR0ci12YWx1ZSc6IHtcblx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKD1cXHMqKD8hXFxzKSkoPzpcXHtbXn1dKlxcfXxbXiwpXFxyXFxuXSspLyxcblx0XHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmphdmFzY3JpcHRcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0J2F0dHItbmFtZSc6IC9bXFx3LV0rKD89XFxzKiE/PXxcXHMqWywpXSkvLFxuXHRcdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWyE9KCksXSsvXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRdLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOi8sXG5cdFx0XHRcdCdhdHRyLWlkJzogLyNbXFx3XFwtXSsvLFxuXHRcdFx0XHQnYXR0ci1jbGFzcyc6IC9cXC5bXFx3XFwtXSsvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnY29kZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyheW1xcdCBdKig/Oi18IT89KSkuKy9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQncHVuY3R1YXRpb24nOiAvWy5cXC0hPXxdKy9cblx0fTtcblxuXHR2YXIgZmlsdGVyX3BhdHRlcm4gPSAvKF4oW1xcdCBdKikpOjxmaWx0ZXJfbmFtZT4oPzooPzpcXHI/XFxufFxccig/IVxcbikpKD86XFwyW1xcdCBdLit8XFxzKj8oPz1cXHI/XFxufFxccikpKSsvLnNvdXJjZTtcblxuXHQvLyBOb24gZXhoYXVzdGl2ZSBsaXN0IG9mIGF2YWlsYWJsZSBmaWx0ZXJzIGFuZCBhc3NvY2lhdGVkIGxhbmd1YWdlc1xuXHR2YXIgZmlsdGVycyA9IFtcblx0XHR7IGZpbHRlcjogJ2F0cGwnLCBsYW5ndWFnZTogJ3R3aWcnIH0sXG5cdFx0eyBmaWx0ZXI6ICdjb2ZmZWUnLCBsYW5ndWFnZTogJ2NvZmZlZXNjcmlwdCcgfSxcblx0XHQnZWpzJyxcblx0XHQnaGFuZGxlYmFycycsXG5cdFx0J2xlc3MnLFxuXHRcdCdsaXZlc2NyaXB0Jyxcblx0XHQnbWFya2Rvd24nLFxuXHRcdHsgZmlsdGVyOiAnc2FzcycsIGxhbmd1YWdlOiAnc2NzcycgfSxcblx0XHQnc3R5bHVzJ1xuXHRdO1xuXHR2YXIgYWxsX2ZpbHRlcnMgPSB7fTtcblx0Zm9yICh2YXIgaSA9IDAsIGwgPSBmaWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuXHRcdHZhciBmaWx0ZXIgPSBmaWx0ZXJzW2ldO1xuXHRcdGZpbHRlciA9IHR5cGVvZiBmaWx0ZXIgPT09ICdzdHJpbmcnID8geyBmaWx0ZXI6IGZpbHRlciwgbGFuZ3VhZ2U6IGZpbHRlciB9IDogZmlsdGVyO1xuXHRcdGlmIChQcmlzbS5sYW5ndWFnZXNbZmlsdGVyLmxhbmd1YWdlXSkge1xuXHRcdFx0YWxsX2ZpbHRlcnNbJ2ZpbHRlci0nICsgZmlsdGVyLmZpbHRlcl0gPSB7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChmaWx0ZXJfcGF0dGVybi5yZXBsYWNlKCc8ZmlsdGVyX25hbWU+JywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZmlsdGVyLmZpbHRlcjsgfSksICdtJyksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdmaWx0ZXItbmFtZSc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eOltcXHctXSsvLFxuXHRcdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd0ZXh0Jzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1xcU1tcXHNcXFNdKi8sXG5cdFx0XHRcdFx0XHRhbGlhczogW2ZpbHRlci5sYW5ndWFnZSwgJ2xhbmd1YWdlLScgKyBmaWx0ZXIubGFuZ3VhZ2VdLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXNbZmlsdGVyLmxhbmd1YWdlXVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdwdWcnLCAnZmlsdGVyJywgYWxsX2ZpbHRlcnMpO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0UHJpc20ubGFuZ3VhZ2VzLnB1cHBldCA9IHtcblx0XHQnaGVyZWRvYyc6IFtcblx0XHRcdC8vIE1hdGNoZXMgdGhlIGNvbnRlbnQgb2YgYSBxdW90ZWQgaGVyZWRvYyBzdHJpbmcgKHN1YmplY3QgdG8gaW50ZXJwb2xhdGlvbilcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhAXFwoXCIoW15cIlxcclxcblxcLyk6XSspXCIoPzpcXC9bbnJ0cyR1TF0qKT9cXCkuKig/Olxccj9cXG58XFxyKSkoPzouKig/Olxccj9cXG58XFxyKD8hXFxuKSkpKj9bIFxcdF0qKD86XFx8WyBcXHRdKik/KD86LVsgXFx0XSopP1xcMi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0Ly8gTWF0Y2hlcyB0aGUgZW5kIHRhZ1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC8oPz1cXFMpLipcXFMoPz0gKiQpL1xuXHRcdFx0XHRcdC8vIFNlZSBpbnRlcnBvbGF0aW9uIGJlbG93XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQvLyBNYXRjaGVzIHRoZSBjb250ZW50IG9mIGFuIHVucXVvdGVkIGhlcmVkb2Mgc3RyaW5nIChubyBpbnRlcnBvbGF0aW9uKVxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKEBcXCgoW15cIlxcclxcblxcLyk6XSspKD86XFwvW25ydHMkdUxdKik/XFwpLiooPzpcXHI/XFxufFxccikpKD86LiooPzpcXHI/XFxufFxccig/IVxcbikpKSo/WyBcXHRdKig/OlxcfFsgXFx0XSopPyg/Oi1bIFxcdF0qKT9cXDIvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0Ly8gTWF0Y2hlcyB0aGUgZW5kIHRhZ1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC8oPz1cXFMpLipcXFMoPz0gKiQpL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0Ly8gTWF0Y2hlcyB0aGUgc3RhcnQgdGFnIG9mIGhlcmVkb2Mgc3RyaW5nc1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvQFxcKFwiPyg/OlteXCJcXHJcXG5cXC8pOl0rKVwiPyg/OlxcL1tucnRzJHVMXSopP1xcKS8sXG5cdFx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyhcXCgpLis/KD89XFwpKS8sXG5cdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnbXVsdGlsaW5lLWNvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2NvbW1lbnQnXG5cdFx0fSxcblx0XHQncmVnZXgnOiB7XG5cdFx0XHQvLyBNdXN0IGJlIHByZWZpeGVkIHdpdGggdGhlIGtleXdvcmQgXCJub2RlXCIgb3IgYSBub24td29yZCBjaGFyXG5cdFx0XHRwYXR0ZXJuOiAvKCg/OlxcYm5vZGVcXHMrfFt+PVxcKFxcW1xceyxdXFxzKnxbPStdPlxccyp8XlxccyopKVxcLyg/OlteXFwvXFxcXF18XFxcXFtcXHNcXFNdKStcXC8oPzpbaW14XStcXGJ8XFxCKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdC8vIEV4dGVuZGVkIHJlZ2V4ZXMgbXVzdCBoYXZlIHRoZSB4IGZsYWcuIFRoZXkgY2FuIGNvbnRhaW4gc2luZ2xlLWxpbmUgY29tbWVudHMuXG5cdFx0XHRcdCdleHRlbmRlZC1yZWdleCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcLyg/OlteXFwvXFxcXF18XFxcXFtcXHNcXFNdKStcXC9baW1dKnhbaW1dKiQvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J2NvbW1lbnQnOiAvIy4qL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkjLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHQvLyBBbGxvdyBmb3Igb25lIG5lc3RlZCBsZXZlbCBvZiBkb3VibGUgcXVvdGVzIGluc2lkZSBpbnRlcnBvbGF0aW9uXG5cdFx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/OlxcJFxceyg/OlteJ1wifV18KFtcIiddKSg/Oig/IVxcMilbXlxcXFxdfFxcXFxbXFxzXFxTXSkqXFwyKStcXH18XFwkKD8hXFx7KXwoPyFcXDEpW15cXFxcJF18XFxcXFtcXHNcXFNdKSpcXDEvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdkb3VibGUtcXVvdGVkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXCJbXFxzXFxTXSpcIiQvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0Ly8gU2VlIGludGVycG9sYXRpb24gYmVsb3dcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXCQoPzo6Oik/XFx3Kyg/Ojo6XFx3KykqLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOjovXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnYXR0ci1uYW1lJzogLyg/OlxcYlxcdyt8XFwqKSg/PVxccyo9PikvLFxuXHRcdCdmdW5jdGlvbic6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXC4pKD8hXFxkKVxcdysvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0L1xcYig/OmNvbnRhaW58ZGVidWd8ZXJyfGZhaWx8aW5jbHVkZXxpbmZvfG5vdGljZXxyZWFsaXplfHJlcXVpcmV8dGFnfHdhcm5pbmcpXFxifFxcYig/IVxcZClcXHcrKD89XFwoKS9cblx0XHRdLFxuXHRcdCdudW1iZXInOiAvXFxiKD86MHhbYS1mXFxkXSt8XFxkKyg/OlxcLlxcZCspPyg/OmUtP1xcZCspPylcXGIvaSxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0Ly8gSW5jbHVkZXMgd29yZHMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2Vcblx0XHQna2V5d29yZCc6IC9cXGIoPzphcHBsaWNhdGlvbnxhdHRyfGNhc2V8Y2xhc3N8Y29uc3VtZXN8ZGVmYXVsdHxkZWZpbmV8ZWxzZXxlbHNpZnxmdW5jdGlvbnxpZnxpbXBvcnR8aW5oZXJpdHN8bm9kZXxwcml2YXRlfHByb2R1Y2VzfHR5cGV8dW5kZWZ8dW5sZXNzKVxcYi8sXG5cdFx0J2RhdGF0eXBlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYig/OkFueXxBcnJheXxCb29sZWFufENhbGxhYmxlfENhdGFsb2dlbnRyeXxDbGFzc3xDb2xsZWN0aW9ufERhdGF8RGVmYXVsdHxFbnVtfEZsb2F0fEhhc2h8SW50ZWdlcnxOb3RVbmRlZnxOdW1lcmljfE9wdGlvbmFsfFBhdHRlcm58UmVnZXhwfFJlc291cmNlfFJ1bnRpbWV8U2NhbGFyfFN0cmluZ3xTdHJ1Y3R8VHVwbGV8VHlwZXxVbmRlZnxWYXJpYW50KVxcYi8sXG5cdFx0XHRhbGlhczogJ3N5bWJvbCdcblx0XHR9LFxuXHRcdCdvcGVyYXRvcic6IC89Wz1+Pl0/fCFbPX5dP3w8KD86PFxcfD98Wz1+fC1dKT98Pls+PV0/fC0+P3x+PnxcXHw+Pz4/fFsqXFwvJSs/XXxcXGIoPzphbmR8aW58b3IpXFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXXt9KCkuLDtdfDorL1xuXHR9O1xuXG5cdHZhciBpbnRlcnBvbGF0aW9uID0gW1xuXHRcdHtcblx0XHRcdC8vIEFsbG93IGZvciBvbmUgbmVzdGVkIGxldmVsIG9mIGJyYWNlcyBpbnNpZGUgaW50ZXJwb2xhdGlvblxuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwkXFx7KD86W14nXCJ7fV18XFx7W159XSpcXH18KFtcIiddKSg/Oig/IVxcMilbXlxcXFxdfFxcXFxbXFxzXFxTXSkqXFwyKStcXH0vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnc2hvcnQtdmFyaWFibGUnOiB7XG5cdFx0XHRcdFx0Ly8gTmVnYXRpdmUgbG9vay1haGVhZCBwcmV2ZW50IHdyb25nIGhpZ2hsaWdodGluZyBvZiBmdW5jdGlvbnNcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXCRcXHspKD8hXFx3K1xcKCkoPzo6Oik/XFx3Kyg/Ojo6XFx3KykqLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAndmFyaWFibGUnLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzo6L1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcJC8sXG5cdFx0XHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHRcdFx0fSxcblx0XHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLnB1cHBldFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pXFwkKD86OjopP1xcdysoPzo6OlxcdyspKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICd2YXJpYWJsZScsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzo6L1xuXHRcdFx0fVxuXHRcdH1cblx0XTtcblx0UHJpc20ubGFuZ3VhZ2VzLnB1cHBldFsnaGVyZWRvYyddWzBdLmluc2lkZS5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcblx0UHJpc20ubGFuZ3VhZ2VzLnB1cHBldFsnc3RyaW5nJ10uaW5zaWRlWydkb3VibGUtcXVvdGVkJ10uaW5zaWRlLmludGVycG9sYXRpb24gPSBpbnRlcnBvbGF0aW9uO1xufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdC8vIGh0dHBzOi8vYWdyYWVmLmdpdGh1Yi5pby9wdXJlLWRvY3MvcHVyZS5odG1sI2xleGljYWwtbWF0dGVyc1xuXG5cdFByaXNtLmxhbmd1YWdlcy5wdXJlID0ge1xuXHRcdCdjb21tZW50JzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXDpdKVxcL1xcLy4qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdC8jIS4rL1xuXHRcdF0sXG5cdFx0J2lubGluZS1sYW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyU8W1xcc1xcU10rPyU+Lyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnbGFuZyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF4lPCAqKS1cXCotLis/LVxcKi0vLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdjb21tZW50J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eJTwuKnwlPiQvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcLnxbXlwiXFxcXFxcclxcbl0pKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J251bWJlcic6IHtcblx0XHRcdC8vIFRoZSBsb29rLWJlaGluZCBwcmV2ZW50cyB3cm9uZyBoaWdobGlnaHRpbmcgb2YgdGhlIC4uIG9wZXJhdG9yXG5cdFx0XHRwYXR0ZXJuOiAvKCg/OlxcLlxcLik/KSg/OlxcYig/OmluZnxuYW4pXFxifFxcYjB4W1xcZGEtZl0rfCg/OlxcYig/OjBiKT9cXGQrKD86XFwuXFxkKyk/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/TD8pL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzpOVUxMfGFuc3xicmVha3xidHxjYXNlfGNhdGNofGNkfGNsZWFyfGNvbnN0fGRlZnxkZWx8ZHVtcHxlbHNlfGVuZHxleGl0fGV4dGVybnxmYWxzZXxmb3JjZXxoZWxwfGlmfGluZml4W2xyXT98aW50ZXJmYWNlfGxldHxsc3xtZW18bmFtZXNwYWNlfG5vbmZpeHxvZnxvdGhlcndpc2V8b3V0Zml4fG92ZXJyaWRlfHBvc3RmaXh8cHJlZml4fHByaXZhdGV8cHVibGljfHB3ZHxxdWl0fHJ1bnxzYXZlfHNob3d8c3RhdHN8dGhlbnx0aHJvd3x0cmFjZXx0cnVlfHR5cGV8dW5kZXJyaWRlfHVzaW5nfHdoZW58d2l0aClcXGIvLFxuXHRcdCdmdW5jdGlvbic6IC9cXGIoPzphYnN8YWRkXyg/OmFkZHJ8Y29uc3RkZWZ8KD86ZnVuZGVmfGludGVyZmFjZXxtYWNkZWZ8dHlwZWRlZikoPzpfYXQpP3x2YXJkZWYpfGFsbHxhbnl8YXBwbHA/fGFyaXR5fGJpZ2ludHA/fGJsb2IoPzpfY3JjfF9zaXplfHApP3xib29scD98Ynl0ZV9jP3N0cmluZyg/Ol9wb2ludGVyKT98Ynl0ZV8oPzptYXRyaXh8cG9pbnRlcil8Y2FsbG9jfGNhdHxjYXRtYXB8Y2VpbHxjaGFyW3BzXT98Y2hlY2tfcHRydGFnfGNocnxjbGVhcl9zZW50cnl8Y2xlYXJzeW18Y2xvc3VyZXA/fGNtYXRyaXhwP3xjb2xzP3xjb2xjYXQoPzptYXApP3xjb2xtYXB8Y29scmV2fGNvbHZlY3Rvcig/OnB8c2VxKT98Y29tcGxleCg/Ol9mbG9hdF8oPzptYXRyaXh8cG9pbnRlcil8X21hdHJpeCg/Ol92aWV3KT98X3BvaW50ZXJ8cCk/fGNvbmp8Y29va2VkcD98Y3N0fGNzdHJpbmcoPzpfKD86ZHVwfGxpc3R8dmVjdG9yKSk/fGN1cnJ5Mz98Y3ljbGVuP3xkZWxfKD86Y29uc3RkZWZ8ZnVuZGVmfGludGVyZmFjZXxtYWNkZWZ8dHlwZWRlZnx2YXJkZWYpfGRlbGV0ZXxkaWFnKD86bWF0KT98ZGltfGRtYXRyaXhwP3xkb3xkb3VibGUoPzpfbWF0cml4KD86X3ZpZXcpP3xfcG9pbnRlcnxwKT98ZG93aXRoMz98ZHJvcHxkcm9wd2hpbGV8ZXZhbCg/OmNtZCk/fGV4YWN0cHxmaWx0ZXJ8Zml4fGZpeGl0eXxmbGlwfGZsb2F0KD86X21hdHJpeHxfcG9pbnRlcil8Zmxvb3J8Zm9sZFtscl0xP3xmcmFjfGZyZWV8ZnVucD98ZnVuY3Rpb25wP3xnY2R8Z2V0KD86Xyg/OmJ5dGV8Y29uc3RkZWZ8ZG91YmxlfGZsb2F0fGZ1bmRlZnxpbnQoPzo2NCk/fGludGVyZmFjZSg/Ol90eXBlZGVmKT98bG9uZ3xtYWNkZWZ8cG9pbnRlcnxwdHJ0YWd8c2VudHJ5fHNob3J0fHN0cmluZ3x0eXBlZGVmfHZhcmRlZikpP3xnbG9ic3ltfGhhc2h8aGVhZHxpZHxpbXxpbWF0cml4cD98aW5kZXh8aW5leGFjdHB8aW5mcHxpbml0fGluc2VydHxpbnQoPzpfbWF0cml4KD86X3ZpZXcpP3xfcG9pbnRlcnxwKT98aW50NjRfKD86bWF0cml4fHBvaW50ZXIpfGludGVnZXJwP3xpdGVyYXRlbj98aXRlcndoaWxlfGpvaW58a2V5cz98bGFtYmRhcD98bGFzdCg/OmVycig/OnBvcyk/KT98bGNkfGxpc3RbMnBdP3xsaXN0bWFwfG1ha2VfcHRydGFnfG1hbGxvY3xtYXB8bWF0Y2F0fG1hdHJpeHA/fG1heHxtZW1iZXJ8bWlufG5hbnB8bmFyZ3N8bm1hdHJpeHA/fG51bGx8bnVtYmVycD98b3JkfHBhY2soPzplZCk/fHBvaW50ZXIoPzpfY2FzdHxfdGFnfF90eXBlfHApP3xwb3d8cHJlZHxwdHJ0YWd8cHV0KD86Xyg/OmJ5dGV8ZG91YmxlfGZsb2F0fGludCg/OjY0KT98bG9uZ3xwb2ludGVyfHNob3J0fHN0cmluZykpP3xyYXRpb25hbHA/fHJlfHJlYWxwP3xyZWFsbG9jfHJlY29yZHA/fHJlZGltfHJlZHVjZSg/Ol93aXRoKT98cmVmcD98cmVwZWF0bj98cmV2ZXJzZXxybGlzdHA/fHJvdW5kfHJvd3M/fHJvd2NhdCg/Om1hcCk/fHJvd21hcHxyb3dyZXZ8cm93dmVjdG9yKD86cHxzZXEpP3xzYW1lfHNjYW5bbHJdMT98c2VudHJ5fHNnbnxzaG9ydF8oPzptYXRyaXh8cG9pbnRlcil8c2xpY2V8c21hdHJpeHA/fHNvcnR8c3BsaXR8c3RyfHN0cmNhdHxzdHJlYW18c3RyaWRlfHN0cmluZyg/Ol8oPzpkdXB8bGlzdHx2ZWN0b3IpfHApP3xzdWJkaWFnKD86bWF0KT98c3VibWF0fHN1YnNlcTI/fHN1YnN0cnxzdWNjfHN1cGRpYWcoPzptYXQpP3xzeW1ib2xwP3x0YWlsfHRha2V8dGFrZXdoaWxlfHRodW5rcD98dHJhbnNwb3NlfHRydW5jfHR1cGxlcD98dHlwZXB8dWJ5dGV8dWludCg/OjY0KT98dWxvbmd8dW5jdXJyeTM/fHVucmVmfHVuemlwMz98dXBkYXRlfHVzaG9ydHx2YWxzP3x2YXJwP3x2ZWN0b3IoPzpwfHNlcSk/fHZvaWR8emlwMz98emlwd2l0aDM/KVxcYi8sXG5cdFx0J3NwZWNpYWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiX19bYS16XStfX1xcYi9pLFxuXHRcdFx0YWxpYXM6ICdidWlsdGluJ1xuXHRcdH0sXG5cdFx0Ly8gQW55IGNvbWJpbmF0aW9uIG9mIG9wZXJhdG9yIGNoYXJzIGNhbiBiZSBhbiBvcGVyYXRvclxuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1taXNsZWFkaW5nLWNoYXJhY3Rlci1jbGFzc1xuXHRcdCdvcGVyYXRvcic6IC8oPzpbIVwiIyQlJicqKyxcXC0uXFwvOjw9Pj9AXFxcXF5gfH5cXHUwMGExLVxcdTAwYmZcXHUwMGQ3LVxcdTAwZjdcXHUyMGQwLVxcdTJiZmZdfFxcYl8rXFxiKSt8XFxiKD86YW5kfGRpdnxtb2R8bm90fG9yKVxcYi8sXG5cdFx0Ly8gRklYTUU6IEhvdyBjYW4gd2UgcHJldmVudCB8IGFuZCAsIHRvIGJlIGhpZ2hsaWdodGVkIGFzIG9wZXJhdG9yIHdoZW4gdGhleSBhcmUgdXNlZCBhbG9uZT9cblx0XHQncHVuY3R1YXRpb24nOiAvWygpe31cXFtcXF07LHxdL1xuXHR9O1xuXG5cdHZhciBpbmxpbmVMYW5ndWFnZXMgPSBbXG5cdFx0J2MnLFxuXHRcdHsgbGFuZzogJ2MrKycsIGFsaWFzOiAnY3BwJyB9LFxuXHRcdCdmb3J0cmFuJ1xuXHRdO1xuXHR2YXIgaW5saW5lTGFuZ3VhZ2VSZSA9IC8lPCAqLVxcKi0gKjxsYW5nPlxcZCogKi1cXCotW1xcc1xcU10rPyU+Ly5zb3VyY2U7XG5cblx0aW5saW5lTGFuZ3VhZ2VzLmZvckVhY2goZnVuY3Rpb24gKGxhbmcpIHtcblx0XHR2YXIgYWxpYXMgPSBsYW5nO1xuXHRcdGlmICh0eXBlb2YgbGFuZyAhPT0gJ3N0cmluZycpIHtcblx0XHRcdGFsaWFzID0gbGFuZy5hbGlhcztcblx0XHRcdGxhbmcgPSBsYW5nLmxhbmc7XG5cdFx0fVxuXHRcdGlmIChQcmlzbS5sYW5ndWFnZXNbYWxpYXNdKSB7XG5cdFx0XHR2YXIgbyA9IHt9O1xuXHRcdFx0b1snaW5saW5lLWxhbmctJyArIGFsaWFzXSA9IHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKGlubGluZUxhbmd1YWdlUmUucmVwbGFjZSgnPGxhbmc+JywgbGFuZy5yZXBsYWNlKC8oWy4rKj9cXC9cXFxcKCl7fVxcW1xcXV0pL2csICdcXFxcJDEnKSksICdpJyksXG5cdFx0XHRcdGluc2lkZTogUHJpc20udXRpbC5jbG9uZShQcmlzbS5sYW5ndWFnZXMucHVyZVsnaW5saW5lLWxhbmcnXS5pbnNpZGUpXG5cdFx0XHR9O1xuXHRcdFx0b1snaW5saW5lLWxhbmctJyArIGFsaWFzXS5pbnNpZGUucmVzdCA9IFByaXNtLnV0aWwuY2xvbmUoUHJpc20ubGFuZ3VhZ2VzW2FsaWFzXSk7XG5cdFx0XHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdwdXJlJywgJ2lubGluZS1sYW5nJywgbyk7XG5cdFx0fVxuXHR9KTtcblxuXHQvLyBDIGlzIHRoZSBkZWZhdWx0IGlubGluZSBsYW5ndWFnZVxuXHRpZiAoUHJpc20ubGFuZ3VhZ2VzLmMpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXMucHVyZVsnaW5saW5lLWxhbmcnXS5pbnNpZGUucmVzdCA9IFByaXNtLnV0aWwuY2xvbmUoUHJpc20ubGFuZ3VhZ2VzLmMpO1xuXHR9XG5cbn0oUHJpc20pKTtcblxuLypcbk9yaWdpbmFsIENvZGUgYnkgQmFzIEdyb290aGVkZGVcbiEhTUFOWSBUSEFOS1MhISBJIG5ldmVyIHdvdWxkIGhhdmUgbWFkZSB0aGlzLCByZWdleCBhbmQgbWUgd2lsbCBuZXZlciBiZSBiZXN0IGZyaWVuZHMgOylcbj09PiBodHRwczovL2NvZGVwZW4uaW8vSW1hZ2luZVByb2dyYW1taW5nL2RldGFpbHMvSll5ZEJ5L1xuc2xpZ2h0bHkgY2hhbmdlZCB0byBwYXNzIGFsbCB0ZXN0c1xuKi9cblxuXG4vLyBQdXJlQmFzaWMgc3VwcG9ydCwgc3RlYWwgc3R1ZmYgZnJvbSBhbnNpLWNcblByaXNtLmxhbmd1YWdlcy5wdXJlYmFzaWMgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J2NvbW1lbnQnOiAvOy4qLyxcblx0J2tleXdvcmQnOiAvXFxiKD86YWxpZ258YW5kfGFzfGJyZWFrfGNhbGxkZWJ1Z2dlcnxjYXNlfGNvbXBpbGVyY2FzZXxjb21waWxlcmRlZmF1bHR8Y29tcGlsZXJlbHNlfGNvbXBpbGVyZWxzZWlmfGNvbXBpbGVyZW5kaWZ8Y29tcGlsZXJlbmRzZWxlY3R8Y29tcGlsZXJlcnJvcnxjb21waWxlcmlmfGNvbXBpbGVyc2VsZWN0fGNvbnRpbnVlfGRhdGF8ZGF0YXNlY3Rpb258ZGVidWd8ZGVidWdsZXZlbHxkZWNsYXJlfGRlY2xhcmVjfGRlY2xhcmVjZGxsfGRlY2xhcmVkbGx8ZGVjbGFyZW1vZHVsZXxkZWZhdWx0fGRlZmluZXxkaW18ZGlzYWJsZWFzbXxkaXNhYmxlZGVidWdnZXJ8ZGlzYWJsZWV4cGxpY2l0fGVsc2V8ZWxzZWlmfGVuYWJsZWFzbXxlbmFibGVkZWJ1Z2dlcnxlbmFibGVleHBsaWNpdHxlbmR8ZW5kZGF0YXNlY3Rpb258ZW5kZGVjbGFyZW1vZHVsZXxlbmRlbnVtZXJhdGlvbnxlbmRpZnxlbmRpbXBvcnR8ZW5kaW50ZXJmYWNlfGVuZG1hY3JvfGVuZG1vZHVsZXxlbmRwcm9jZWR1cmV8ZW5kc2VsZWN0fGVuZHN0cnVjdHVyZXxlbmRzdHJ1Y3R1cmV1bmlvbnxlbmR3aXRofGVudW1lcmF0aW9ufGV4dGVuZHN8ZmFrZXJldHVybnxmb3J8Zm9yZWFjaHxmb3JldmVyfGdsb2JhbHxnb3N1Ynxnb3RvfGlmfGltcG9ydHxpbXBvcnRjfGluY2x1ZGViaW5hcnl8aW5jbHVkZWZpbGV8aW5jbHVkZXBhdGh8aW50ZXJmYWNlfG1hY3JvfG1vZHVsZXxuZXdsaXN0fG5ld21hcHxuZXh0fG5vdHxvcnxwcm9jZWR1cmV8cHJvY2VkdXJlY3xwcm9jZWR1cmVjZGxsfHByb2NlZHVyZWRsbHxwcm9jZWR1cmVyZXR1cm58cHJvdGVjdGVkfHByb3RvdHlwZXxwcm90b3R5cGVjfHJlYWR8cmVkaW18cmVwZWF0fHJlc3RvcmV8cmV0dXJufHJ1bnRpbWV8c2VsZWN0fHNoYXJlZHxzdGF0aWN8c3RlcHxzdHJ1Y3R1cmV8c3RydWN0dXJldW5pb258c3dhcHx0aHJlYWRlZHx0b3x1bnRpbHx3ZW5kfHdoaWxlfHdpdGh8eGluY2x1ZGVmaWxlfHhvcilcXGIvaSxcblx0J2Z1bmN0aW9uJzogL1xcYlxcdysoPzpcXC5cXHcrKT9cXHMqKD89XFwoKS8sXG5cdCdudW1iZXInOiAvKD86XFwkW1xcZGEtZl0rfFxcYi0/KD86XFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKSg/OmVbKy1dP1xcZCspPylcXGIvaSxcblx0J29wZXJhdG9yJzogLyg/OkBcXCo/fFxcP3xcXCopXFx3K1xcJD98LVs+LV0/fFxcK1xcKz98IT0/fDw8Pz0/fD4+Pz0/fD09P3wmJj98XFx8P1xcfHxbfl4lPyovQF0vXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncHVyZWJhc2ljJywgJ2tleXdvcmQnLCB7XG5cdCd0YWcnOiAvI1xcdytcXCQ/Lyxcblx0J2FzbSc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSEuKi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICd0YWcnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2NvbW1lbnQnOiAvOy4qLyxcblx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oW1wiJ2BdKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQvLyBBbm9ueW1vdXMgbGFiZWwgcmVmZXJlbmNlcywgaS5lLjogam1wIEBiXG5cdFx0XHQnbGFiZWwtcmVmZXJlbmNlLWFub255bW91cyc6IHtcblx0XHRcdFx0cGF0dGVybjogLyghXFxzKmpbYS16XStcXHMrKUBbZmJdL2ksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnZmFzbS1sYWJlbCdcblx0XHRcdH0sXG5cdFx0XHQvLyBOYW1lZCBsYWJlbCByZWZlcmVuY2UsIGkuZS46IGpuZSBsYWJlbDFcblx0XHRcdCdsYWJlbC1yZWZlcmVuY2UtYWRkcmVzc2VkJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCFcXHMqalthLXpdK1xccyspW0EtWi5fPyRAXVtcXHcuPyRAfiNdKi9pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2Zhc20tbGFiZWwnXG5cdFx0XHR9LFxuXHRcdFx0J2tleXdvcmQnOiBbXG5cdFx0XHRcdC9cXGIoPzpleHRlcm58Z2xvYmFsKVxcYlteO1xcclxcbl0qL2ksXG5cdFx0XHRcdC9cXGIoPzpDUFV8REVGQVVMVHxGTE9BVClcXGIuKi9cblx0XHRcdF0sXG5cdFx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFtcXHQgXSohXFxzKilbXFxkYS16XSsoPz1cXHN8JCkvaW0sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQnZnVuY3Rpb24taW5saW5lJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKDpcXHMqKVtcXGRhLXpdKyg/PVxccykvaSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHRcdH0sXG5cdFx0XHQnbGFiZWwnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFtcXHQgXSohXFxzKilbQS1aYS16Ll8/JEBdW1xcdy4/JEB+I10qKD89OikvbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdmYXNtLWxhYmVsJ1xuXHRcdFx0fSxcblx0XHRcdCdyZWdpc3Rlcic6IC9cXGIoPzpzdFxcZHxbeHl6XW1tXFxkXFxkP3xbY2R0XXJcXGR8clxcZFxcZD9bYndkXT98W2VyXT9bYWJjZF14fFthYmNkXVtobF18W2VyXT8oPzpicHxkaXxzaXxzcCl8W2NkZWZnc11zfG1tXFxkKylcXGIvaSxcblx0XHRcdCdudW1iZXInOiAvKD86XFxifC18KD89XFwkKSkoPzowW2h4XSg/OltcXGRhLWZdKlxcLik/W1xcZGEtZl0rKD86cFsrLV0/XFxkKyk/fFxcZFtcXGRhLWZdK1toeF18XFwkXFxkW1xcZGEtZl0qfDBbb3FdWzAtN10rfFswLTddK1tvcV18MFtieV1bMDFdK3xbMDFdK1tieV18MFtkdF1cXGQrfCg/OlxcZCsoPzpcXC5cXGQrKT98XFwuXFxkKykoPzpcXC4/ZVsrLV0/XFxkKyk/W2R0XT8pXFxiL2ksXG5cdFx0XHQnb3BlcmF0b3InOiAvW1xcW1xcXSorXFwtLyU8Pj0mfCQhLC46XS9cblx0XHR9XG5cdH1cbn0pO1xuXG5kZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnB1cmViYXNpY1snY2xhc3MtbmFtZSddO1xuZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5wdXJlYmFzaWNbJ2Jvb2xlYW4nXTtcblxuUHJpc20ubGFuZ3VhZ2VzLnBiZmFzbSA9IFByaXNtLmxhbmd1YWdlc1sncHVyZWJhc2ljJ107XG5cblByaXNtLmxhbmd1YWdlcy5wdXJlc2NyaXB0ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnaGFza2VsbCcsIHtcblx0J2tleXdvcmQnOiAvXFxiKD86YWRvfGNhc2V8Y2xhc3N8ZGF0YXxkZXJpdmV8ZG98ZWxzZXxmb3JhbGx8aWZ8aW58aW5maXhsfGluZml4cnxpbnN0YW5jZXxsZXR8bW9kdWxlfG5ld3R5cGV8b2Z8cHJpbWl0aXZlfHRoZW58dHlwZXx3aGVyZSlcXGJ8XHUyMjAwLyxcblxuXHQnaW1wb3J0LXN0YXRlbWVudCc6IHtcblx0XHQvLyBUaGUgaW1wb3J0ZWQgb3IgaGlkZGVuIG5hbWVzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhpcyBpbXBvcnRcblx0XHQvLyBzdGF0ZW1lbnQuIFRoaXMgaXMgYmVjYXVzZSB3ZSB3YW50IHRvIGhpZ2hsaWdodCB0aG9zZSBleGFjdGx5IGxpa2Vcblx0XHQvLyB3ZSBkbyBmb3IgdGhlIG5hbWVzIGluIHRoZSBwcm9ncmFtLlxuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopaW1wb3J0XFxzK1tBLVpdW1xcdyddKig/OlxcLltBLVpdW1xcdyddKikqKD86XFxzK2FzXFxzK1tBLVpdW1xcdyddKig/OlxcLltBLVpdW1xcdyddKikqKT8oPzpcXHMraGlkaW5nXFxiKT8vbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiAvXFxiKD86YXN8aGlkaW5nfGltcG9ydClcXGIvLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHR9XG5cdH0sXG5cblx0Ly8gVGhlc2UgYXJlIGJ1aWx0aW4gZnVuY3Rpb25zIG9ubHkuIENvbnN0cnVjdG9ycyBhcmUgaGlnaGxpZ2h0ZWQgbGF0ZXIgYXMgYSBjb25zdGFudC5cblx0J2J1aWx0aW4nOiAvXFxiKD86YWJzdXJkfGFkZHxhcHxhcHBlbmR8YXBwbHl8YmV0d2VlbnxiaW5kfGJvdHRvbXxjbGFtcHxjb21wYXJlfGNvbXBhcmluZ3xjb21wb3NlfGNvbmp8Y29uc3R8ZGVncmVlfGRpc2NhcmR8ZGlzanxkaXZ8ZXF8ZmxhcHxmbGlwfGdjZHxpZGVudGl0eXxpZk18am9pbnxsY218bGlmdEExfGxpZnRNMXxtYXB8bWF4fG1lbXB0eXxtaW58bW9kfG11bHxuZWdhdGV8bm90fG5vdEVxfG9uZXxvdGhlcndpc2V8cmVjaXB8c2hvd3xzdWJ8dG9wfHVuaXR8dW5sZXNzfHVubGVzc018dm9pZHx3aGVufHdoZW5NfHplcm8pXFxiLyxcblxuXHQnb3BlcmF0b3InOiBbXG5cdFx0Ly8gSW5maXggb3BlcmF0b3JzXG5cdFx0UHJpc20ubGFuZ3VhZ2VzLmhhc2tlbGwub3BlcmF0b3JbMF0sXG5cdFx0Ly8gQVNDSUkgb3BlcmF0b3JzXG5cdFx0UHJpc20ubGFuZ3VhZ2VzLmhhc2tlbGwub3BlcmF0b3JbMl0sXG5cdFx0Ly8gQWxsIFVURjE2IFVuaWNvZGUgb3BlcmF0b3Igc3ltYm9sc1xuXHRcdC8vIFRoaXMgcmVnZXggaXMgZXF1aXZhbGVudCB0byAvKD89W1xceDgwLVxcdUZGRkZdKVtcXHB7Z2M9TWF0aF9TeW1ib2x9XFxwe2djPUN1cnJlbmN5X1N5bWJvbH1cXHB7TW9kaWZpZXJfU3ltYm9sfVxccHtPdGhlcl9TeW1ib2x9XS91XG5cdFx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9QcmlzbUpTL3ByaXNtL2lzc3Vlcy8zMDA2IGZvciBtb3JlIGRldGFpbHMuXG5cdFx0L1tcXHhhMi1cXHhhNlxceGE4XFx4YTlcXHhhY1xceGFlLVxceGIxXFx4YjRcXHhiOFxceGQ3XFx4ZjdcXHUwMmMyLVxcdTAyYzVcXHUwMmQyLVxcdTAyZGZcXHUwMmU1LVxcdTAyZWJcXHUwMmVkXFx1MDJlZi1cXHUwMmZmXFx1MDM3NVxcdTAzODRcXHUwMzg1XFx1MDNmNlxcdTA0ODJcXHUwNThkLVxcdTA1OGZcXHUwNjA2LVxcdTA2MDhcXHUwNjBiXFx1MDYwZVxcdTA2MGZcXHUwNmRlXFx1MDZlOVxcdTA2ZmRcXHUwNmZlXFx1MDdmNlxcdTA3ZmVcXHUwN2ZmXFx1MDlmMlxcdTA5ZjNcXHUwOWZhXFx1MDlmYlxcdTBhZjFcXHUwYjcwXFx1MGJmMy1cXHUwYmZhXFx1MGM3ZlxcdTBkNGZcXHUwZDc5XFx1MGUzZlxcdTBmMDEtXFx1MGYwM1xcdTBmMTNcXHUwZjE1LVxcdTBmMTdcXHUwZjFhLVxcdTBmMWZcXHUwZjM0XFx1MGYzNlxcdTBmMzhcXHUwZmJlLVxcdTBmYzVcXHUwZmM3LVxcdTBmY2NcXHUwZmNlXFx1MGZjZlxcdTBmZDUtXFx1MGZkOFxcdTEwOWVcXHUxMDlmXFx1MTM5MC1cXHUxMzk5XFx1MTY2ZFxcdTE3ZGJcXHUxOTQwXFx1MTlkZS1cXHUxOWZmXFx1MWI2MS1cXHUxYjZhXFx1MWI3NC1cXHUxYjdjXFx1MWZiZFxcdTFmYmYtXFx1MWZjMVxcdTFmY2QtXFx1MWZjZlxcdTFmZGQtXFx1MWZkZlxcdTFmZWQtXFx1MWZlZlxcdTFmZmRcXHUxZmZlXFx1MjA0NFxcdTIwNTJcXHUyMDdhLVxcdTIwN2NcXHUyMDhhLVxcdTIwOGNcXHUyMGEwLVxcdTIwYmZcXHUyMTAwXFx1MjEwMVxcdTIxMDMtXFx1MjEwNlxcdTIxMDhcXHUyMTA5XFx1MjExNFxcdTIxMTYtXFx1MjExOFxcdTIxMWUtXFx1MjEyM1xcdTIxMjVcXHUyMTI3XFx1MjEyOVxcdTIxMmVcXHUyMTNhXFx1MjEzYlxcdTIxNDAtXFx1MjE0NFxcdTIxNGEtXFx1MjE0ZFxcdTIxNGZcXHUyMThhXFx1MjE4YlxcdTIxOTAtXFx1MjMwN1xcdTIzMGMtXFx1MjMyOFxcdTIzMmItXFx1MjQyNlxcdTI0NDAtXFx1MjQ0YVxcdTI0OWMtXFx1MjRlOVxcdTI1MDAtXFx1Mjc2N1xcdTI3OTQtXFx1MjdjNFxcdTI3YzctXFx1MjdlNVxcdTI3ZjAtXFx1Mjk4MlxcdTI5OTktXFx1MjlkN1xcdTI5ZGMtXFx1MjlmYlxcdTI5ZmUtXFx1MmI3M1xcdTJiNzYtXFx1MmI5NVxcdTJiOTctXFx1MmJmZlxcdTJjZTUtXFx1MmNlYVxcdTJlNTBcXHUyZTUxXFx1MmU4MC1cXHUyZTk5XFx1MmU5Yi1cXHUyZWYzXFx1MmYwMC1cXHUyZmQ1XFx1MmZmMC1cXHUyZmZiXFx1MzAwNFxcdTMwMTJcXHUzMDEzXFx1MzAyMFxcdTMwMzZcXHUzMDM3XFx1MzAzZVxcdTMwM2ZcXHUzMDliXFx1MzA5Y1xcdTMxOTBcXHUzMTkxXFx1MzE5Ni1cXHUzMTlmXFx1MzFjMC1cXHUzMWUzXFx1MzIwMC1cXHUzMjFlXFx1MzIyYS1cXHUzMjQ3XFx1MzI1MFxcdTMyNjAtXFx1MzI3ZlxcdTMyOGEtXFx1MzJiMFxcdTMyYzAtXFx1MzNmZlxcdTRkYzAtXFx1NGRmZlxcdWE0OTAtXFx1YTRjNlxcdWE3MDAtXFx1YTcxNlxcdWE3MjBcXHVhNzIxXFx1YTc4OVxcdWE3OGFcXHVhODI4LVxcdWE4MmJcXHVhODM2LVxcdWE4MzlcXHVhYTc3LVxcdWFhNzlcXHVhYjViXFx1YWI2YVxcdWFiNmJcXHVmYjI5XFx1ZmJiMi1cXHVmYmMxXFx1ZmRmY1xcdWZkZmRcXHVmZTYyXFx1ZmU2NC1cXHVmZTY2XFx1ZmU2OVxcdWZmMDRcXHVmZjBiXFx1ZmYxYy1cXHVmZjFlXFx1ZmYzZVxcdWZmNDBcXHVmZjVjXFx1ZmY1ZVxcdWZmZTAtXFx1ZmZlNlxcdWZmZTgtXFx1ZmZlZVxcdWZmZmNcXHVmZmZkXS9cblx0XVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5wdXJzID0gUHJpc20ubGFuZ3VhZ2VzLnB1cmVzY3JpcHQ7XG5cblByaXNtLmxhbmd1YWdlcy5weXRob24gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSMuKi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N0cmluZy1pbnRlcnBvbGF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oPzpmfGZyfHJmKSg/OihcIlwiXCJ8JycnKVtcXHNcXFNdKj9cXDF8KFwifCcpKD86XFxcXC58KD8hXFwyKVteXFxcXFxcclxcbl0pKlxcMikvaSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0Ly8gXCJ7XCIgPGV4cHJlc3Npb24+IDxvcHRpb25hbCBcIiFzXCIsIFwiIXJcIiwgb3IgXCIhYVwiPiA8b3B0aW9uYWwgXCI6XCIgZm9ybWF0IHNwZWNpZmllcj4gXCJ9XCJcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFtee10pKD86XFx7XFx7KSopXFx7KD8hXFx7KSg/Oltee31dfFxceyg/IVxceykoPzpbXnt9XXxcXHsoPyFcXHspKD86W157fV0pK1xcfSkrXFx9KStcXH0vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZm9ybWF0LXNwZWMnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKDopW146KCl7fV0rKD89XFx9JCkvLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J2NvbnZlcnNpb24tb3B0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyFbc3JhXSg/PVs6fV0kKS8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0cmVzdDogbnVsbFxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9LFxuXHQndHJpcGxlLXF1b3RlZC1zdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyg/OltydWJdfGJyfHJiKT8oXCJcIlwifCcnJylbXFxzXFxTXSo/XFwxL2ksXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJ1xuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oPzpbcnViXXxicnxyYik/KFwifCcpKD86XFxcXC58KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS9pLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLygoPzpefFxccylkZWZbIFxcdF0rKVthLXpBLVpfXVxcdyooPz1cXHMqXFwoKS9nLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyhcXGJjbGFzc1xccyspXFx3Ky9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2RlY29yYXRvcic6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKUBcXHcrKD86XFwuXFx3KykqL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogWydhbm5vdGF0aW9uJywgJ3B1bmN0dWF0aW9uJ10sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuL1xuXHRcdH1cblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86Xyg/PVxccyo6KXxhbmR8YXN8YXNzZXJ0fGFzeW5jfGF3YWl0fGJyZWFrfGNhc2V8Y2xhc3N8Y29udGludWV8ZGVmfGRlbHxlbGlmfGVsc2V8ZXhjZXB0fGV4ZWN8ZmluYWxseXxmb3J8ZnJvbXxnbG9iYWx8aWZ8aW1wb3J0fGlufGlzfGxhbWJkYXxtYXRjaHxub25sb2NhbHxub3R8b3J8cGFzc3xwcmludHxyYWlzZXxyZXR1cm58dHJ5fHdoaWxlfHdpdGh8eWllbGQpXFxiLyxcblx0J2J1aWx0aW4nOiAvXFxiKD86X19pbXBvcnRfX3xhYnN8YWxsfGFueXxhcHBseXxhc2NpaXxiYXNlc3RyaW5nfGJpbnxib29sfGJ1ZmZlcnxieXRlYXJyYXl8Ynl0ZXN8Y2FsbGFibGV8Y2hyfGNsYXNzbWV0aG9kfGNtcHxjb2VyY2V8Y29tcGlsZXxjb21wbGV4fGRlbGF0dHJ8ZGljdHxkaXJ8ZGl2bW9kfGVudW1lcmF0ZXxldmFsfGV4ZWNmaWxlfGZpbGV8ZmlsdGVyfGZsb2F0fGZvcm1hdHxmcm96ZW5zZXR8Z2V0YXR0cnxnbG9iYWxzfGhhc2F0dHJ8aGFzaHxoZWxwfGhleHxpZHxpbnB1dHxpbnR8aW50ZXJufGlzaW5zdGFuY2V8aXNzdWJjbGFzc3xpdGVyfGxlbnxsaXN0fGxvY2Fsc3xsb25nfG1hcHxtYXh8bWVtb3J5dmlld3xtaW58bmV4dHxvYmplY3R8b2N0fG9wZW58b3JkfHBvd3xwcm9wZXJ0eXxyYW5nZXxyYXdfaW5wdXR8cmVkdWNlfHJlbG9hZHxyZXByfHJldmVyc2VkfHJvdW5kfHNldHxzZXRhdHRyfHNsaWNlfHNvcnRlZHxzdGF0aWNtZXRob2R8c3RyfHN1bXxzdXBlcnx0dXBsZXx0eXBlfHVuaWNocnx1bmljb2RlfHZhcnN8eHJhbmdlfHppcClcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpGYWxzZXxOb25lfFRydWUpXFxiLyxcblx0J251bWJlcic6IC9cXGIwKD86Yig/Ol8/WzAxXSkrfG8oPzpfP1swLTddKSt8eCg/Ol8/W2EtZjAtOV0pKylcXGJ8KD86XFxiXFxkKyg/Ol9cXGQrKSooPzpcXC4oPzpcXGQrKD86X1xcZCspKik/KT98XFxCXFwuXFxkKyg/Ol9cXGQrKSopKD86ZVsrLV0/XFxkKyg/Ol9cXGQrKSopP2o/KD8hXFx3KS9pLFxuXHQnb3BlcmF0b3InOiAvWy0rJT1dPT98IT18Oj18XFwqXFwqPz0/fFxcL1xcLz89P3w8Wzw9Pl0/fD5bPT5dP3xbJnxefl0vLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucHl0aG9uWydzdHJpbmctaW50ZXJwb2xhdGlvbiddLmluc2lkZVsnaW50ZXJwb2xhdGlvbiddLmluc2lkZS5yZXN0ID0gUHJpc20ubGFuZ3VhZ2VzLnB5dGhvbjtcblxuUHJpc20ubGFuZ3VhZ2VzLnB5ID0gUHJpc20ubGFuZ3VhZ2VzLnB5dGhvbjtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8qKlxuXHQgKiBSZXBsYWNlcyBhbGwgcGxhY2Vob2xkZXJzIFwiPDxuPj5cIiBvZiBnaXZlbiBwYXR0ZXJuIHdpdGggdGhlIG4tdGggcmVwbGFjZW1lbnQgKHplcm8gYmFzZWQpLlxuXHQgKlxuXHQgKiBOb3RlOiBUaGlzIGlzIGEgc2ltcGxlIHRleHQgYmFzZWQgcmVwbGFjZW1lbnQuIEJlIGNhcmVmdWwgd2hlbiB1c2luZyBiYWNrcmVmZXJlbmNlcyFcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm4gdGhlIGdpdmVuIHBhdHRlcm4uXG5cdCAqIEBwYXJhbSB7c3RyaW5nW119IHJlcGxhY2VtZW50cyBhIGxpc3Qgb2YgcmVwbGFjZW1lbnQgd2hpY2ggY2FuIGJlIGluc2VydGVkIGludG8gdGhlIGdpdmVuIHBhdHRlcm4uXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBwYXR0ZXJuIHdpdGggYWxsIHBsYWNlaG9sZGVycyByZXBsYWNlZCB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgcmVwbGFjZW1lbnRzLlxuXHQgKiBAZXhhbXBsZSByZXBsYWNlKC9hPDwwPj5hLy5zb3VyY2UsIFsvYisvLnNvdXJjZV0pID09PSAvYSg/OmIrKWEvLnNvdXJjZVxuXHQgKi9cblx0ZnVuY3Rpb24gcmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudHMpIHtcblx0XHRyZXR1cm4gcGF0dGVybi5yZXBsYWNlKC88PChcXGQrKT4+L2csIGZ1bmN0aW9uIChtLCBpbmRleCkge1xuXHRcdFx0cmV0dXJuICcoPzonICsgcmVwbGFjZW1lbnRzWytpbmRleF0gKyAnKSc7XG5cdFx0fSk7XG5cdH1cblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG5cdCAqIEBwYXJhbSB7c3RyaW5nW119IHJlcGxhY2VtZW50c1xuXHQgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYWdzXVxuXHQgKiBAcmV0dXJucyB7UmVnRXhwfVxuXHQgKi9cblx0ZnVuY3Rpb24gcmUocGF0dGVybiwgcmVwbGFjZW1lbnRzLCBmbGFncykge1xuXHRcdHJldHVybiBSZWdFeHAocmVwbGFjZShwYXR0ZXJuLCByZXBsYWNlbWVudHMpLCBmbGFncyB8fCAnJyk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5lc3RlZCBwYXR0ZXJuIHdoZXJlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgc3RyaW5nIGA8PHNlbGY+PmAgYXJlIHJlcGxhY2VkIHdpdGggdGhlIHBhdHRlcm4gaXRzZWxmLlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gcGF0dGVyblxuXHQgKiBAcGFyYW0ge251bWJlcn0gZGVwdGhMb2cyXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRmdW5jdGlvbiBuZXN0ZWQocGF0dGVybiwgZGVwdGhMb2cyKSB7XG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkZXB0aExvZzI7IGkrKykge1xuXHRcdFx0cGF0dGVybiA9IHBhdHRlcm4ucmVwbGFjZSgvPDxzZWxmPj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gJyg/OicgKyBwYXR0ZXJuICsgJyknOyB9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHBhdHRlcm4ucmVwbGFjZSgvPDxzZWxmPj4vZywgJ1teXFxcXHNcXFxcU10nKTtcblx0fVxuXG5cdC8vIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL2F6dXJlL3F1YW50dW0vdXNlci1ndWlkZS9sYW5ndWFnZS90eXBlc3lzdGVtL1xuXHQvLyBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3FzaGFycC1sYW5ndWFnZS90cmVlL21haW4vU3BlY2lmaWNhdGlvbnMvTGFuZ3VhZ2UvNV9HcmFtbWFyXG5cdHZhciBrZXl3b3JkS2luZHMgPSB7XG5cdFx0Ly8ga2V5d29yZHMgd2hpY2ggcmVwcmVzZW50IGEgcmV0dXJuIG9yIHZhcmlhYmxlIHR5cGVcblx0XHR0eXBlOiAnQWRqIEJpZ0ludCBCb29sIEN0bCBEb3VibGUgZmFsc2UgSW50IE9uZSBQYXVsaSBQYXVsaUkgUGF1bGlYIFBhdWxpWSBQYXVsaVogUXViaXQgUmFuZ2UgUmVzdWx0IFN0cmluZyB0cnVlIFVuaXQgWmVybycsXG5cdFx0Ly8gYWxsIG90aGVyIGtleXdvcmRzXG5cdFx0b3RoZXI6ICdBZGpvaW50IGFkam9pbnQgYXBwbHkgYXMgYXV0byBib2R5IGJvcnJvdyBib3Jyb3dpbmcgQ29udHJvbGxlZCBjb250cm9sbGVkIGRpc3RyaWJ1dGUgZWxpZiBlbHNlIGZhaWwgZml4dXAgZm9yIGZ1bmN0aW9uIGlmIGluIGludGVybmFsIGludHJpbnNpYyBpbnZlcnQgaXMgbGV0IG11dGFibGUgbmFtZXNwYWNlIG5ldyBuZXd0eXBlIG9wZW4gb3BlcmF0aW9uIHJlcGVhdCByZXR1cm4gc2VsZiBzZXQgdW50aWwgdXNlIHVzaW5nIHdoaWxlIHdpdGhpbidcblx0fTtcblx0Ly8ga2V5d29yZHNcblx0ZnVuY3Rpb24ga2V5d29yZHNUb1BhdHRlcm4od29yZHMpIHtcblx0XHRyZXR1cm4gJ1xcXFxiKD86JyArIHdvcmRzLnRyaW0oKS5yZXBsYWNlKC8gL2csICd8JykgKyAnKVxcXFxiJztcblx0fVxuXHR2YXIga2V5d29yZHMgPSBSZWdFeHAoa2V5d29yZHNUb1BhdHRlcm4oa2V5d29yZEtpbmRzLnR5cGUgKyAnICcgKyBrZXl3b3JkS2luZHMub3RoZXIpKTtcblxuXHQvLyB0eXBlc1xuXHR2YXIgaWRlbnRpZmllciA9IC9cXGJbQS1aYS16X11cXHcqXFxiLy5zb3VyY2U7XG5cdHZhciBxdWFsaWZpZWROYW1lID0gcmVwbGFjZSgvPDwwPj4oPzpcXHMqXFwuXFxzKjw8MD4+KSovLnNvdXJjZSwgW2lkZW50aWZpZXJdKTtcblxuXHR2YXIgdHlwZUluc2lkZSA9IHtcblx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bPD4oKT8sLjpbXFxdXS9cblx0fTtcblxuXHQvLyBzdHJpbmdzXG5cdHZhciByZWd1bGFyU3RyaW5nID0gL1wiKD86XFxcXC58W15cXFxcXCJdKSpcIi8uc291cmNlO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5xc2hhcnAgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0XHQnY29tbWVudCc6IC9cXC9cXC8uKi8sXG5cdFx0J3N0cmluZyc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogcmUoLyhefFteJFxcXFxdKTw8MD4+Ly5zb3VyY2UsIFtyZWd1bGFyU3RyaW5nXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIG9wZW4gTWljcm9zb2Z0LlF1YW50dW0uQ2Fub247XG5cdFx0XHRcdC8vIG9wZW4gTWljcm9zb2Z0LlF1YW50dW0uQ2Fub24gYXMgQ047XG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXFxiKD86YXN8b3BlbilcXHMrKTw8MD4+KD89XFxzKig/Ojt8YXNcXGIpKS8uc291cmNlLCBbcXVhbGlmaWVkTmFtZV0pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIG5hbWVzcGFjZSBRdWFudHVtLkFwcDE7XG5cdFx0XHRcdHBhdHRlcm46IHJlKC8oXFxibmFtZXNwYWNlXFxzKyk8PDA+Pig/PVxccypcXHspLy5zb3VyY2UsIFtxdWFsaWZpZWROYW1lXSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0fSxcblx0XHRdLFxuXHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0J251bWJlcic6IC8oPzpcXGIwKD86eFtcXGRhLWZdK3xiWzAxXSt8b1swLTddKyl8KD86XFxCXFwuXFxkK3xcXGJcXGQrKD86XFwuXFxkKik/KSg/OmVbLStdP1xcZCspPylsP1xcYi9pLFxuXHRcdCdvcGVyYXRvcic6IC9cXGJhbmQ9fFxcYm9yPXxcXGJhbmRcXGJ8XFxibm90XFxifFxcYm9yXFxifDxbLT1dfFstPV0+fD4+Pj0/fDw8PD0/fFxcXlxcXlxcXj0/fFxcfFxcfFxcfD0/fCYmJj0/fHdcXC89P3x+fn58WypcXC8rXFwtXj0hJV09Py8sXG5cdFx0J3B1bmN0dWF0aW9uJzogLzo6fFt7fVtcXF07KCksLjpdL1xuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdxc2hhcnAnLCAnbnVtYmVyJywge1xuXHRcdCdyYW5nZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXC5cXC4vLFxuXHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHR9XG5cdH0pO1xuXG5cdC8vIHNpbmdsZSBsaW5lXG5cdHZhciBpbnRlcnBvbGF0aW9uRXhwciA9IG5lc3RlZChyZXBsYWNlKC9cXHsoPzpbXlwie31dfDw8MD4+fDw8c2VsZj4+KSpcXH0vLnNvdXJjZSwgW3JlZ3VsYXJTdHJpbmddKSwgMik7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncXNoYXJwJywgJ3N0cmluZycsIHtcblx0XHQnaW50ZXJwb2xhdGlvbi1zdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiByZSgvXFwkXCIoPzpcXFxcLnw8PDA+PnxbXlxcXFxcIntdKSpcIi8uc291cmNlLCBbaW50ZXJwb2xhdGlvbkV4cHJdKSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiByZSgvKCg/Ol58W15cXFxcXSkoPzpcXFxcXFxcXCkqKTw8MD4+Ly5zb3VyY2UsIFtpbnRlcnBvbGF0aW9uRXhwcl0pLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxce3xcXH0kLyxcblx0XHRcdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1xc2hhcnAnLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5xc2hhcnBcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzdHJpbmcnOiAvW1xcc1xcU10rL1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnFzID0gUHJpc20ubGFuZ3VhZ2VzLnFzaGFycDtcblxuUHJpc20ubGFuZ3VhZ2VzLnEgPSB7XG5cdCdzdHJpbmcnOiAvXCIoPzpcXFxcLnxbXlwiXFxcXFxcclxcbl0pKlwiLyxcblx0J2NvbW1lbnQnOiBbXG5cdFx0Ly8gRnJvbSBodHRwOi8vY29kZS5reC5jb20vd2lraS9SZWZlcmVuY2UvU2xhc2g6XG5cdFx0Ly8gV2hlbiAvIGlzIGZvbGxvd2luZyBhIHNwYWNlIChvciBhIHJpZ2h0IHBhcmVudGhlc2lzLCBicmFja2V0LCBvciBicmFjZSksIGl0IGlzIGlnbm9yZWQgd2l0aCB0aGUgcmVzdCBvZiB0aGUgbGluZS5cblx0XHR7XG5cblx0XHRcdHBhdHRlcm46IC8oW1xcdCApXFxdfV0pXFwvLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly8gRnJvbSBodHRwOi8vY29kZS5reC5jb20vd2lraS9SZWZlcmVuY2UvU2xhc2g6XG5cdFx0Ly8gQSBsaW5lIHdoaWNoIGhhcyAvIGFzIGl0cyBmaXJzdCBjaGFyYWN0ZXIgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBvdGhlciBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgYSB3aG9sZS1saW5lIGNvbW1lbnQgYW5kIGlzIGlnbm9yZWQgZW50aXJlbHkuXG5cdFx0Ly8gQSAvIG9uIGEgbGluZSBieSBpdHNlbGYgYmVnaW5zIGEgbXVsdGlsaW5lIGNvbW1lbnQgd2hpY2ggaXMgdGVybWluYXRlZCBieSB0aGUgbmV4dCBcXCBvbiBhIGxpbmUgYnkgaXRzZWxmLlxuXHRcdC8vIElmIGEgLyBpcyBub3QgbWF0Y2hlZCBieSBhIFxcLCB0aGUgbXVsdGlsaW5lIGNvbW1lbnQgaXMgdW50ZXJtaW5hdGVkIGFuZCBjb250aW51ZXMgdG8gZW5kIG9mIGZpbGUuXG5cdFx0Ly8gVGhlIC8gYW5kIFxcIG11c3QgYmUgdGhlIGZpcnN0IGNoYXIgb24gdGhlIGxpbmUsIGJ1dCBtYXkgYmUgZm9sbG93ZWQgYnkgYW55IGFtb3VudCBvZiB3aGl0ZXNwYWNlLlxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHI/XFxufFxccilcXC9bXFx0IF0qKD86KD86XFxyP1xcbnxcXHIpKD86LiooPzpcXHI/XFxufFxccig/IVxcbikpKSo/KD86XFxcXCg/PVtcXHQgXSooPzpcXHI/XFxufFxccikpfCQpfFxcUy4qKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQvLyBGcm9tIGh0dHA6Ly9jb2RlLmt4LmNvbS93aWtpL1JlZmVyZW5jZS9TbGFzaDpcblx0XHQvLyBBIFxcIG9uIGEgbGluZSBieSBpdHNlbGYgd2l0aCBubyBwcmVjZWRpbmcgbWF0Y2hpbmcgLyB3aWxsIGNvbW1lbnQgdG8gZW5kIG9mIGZpbGUuXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL15cXFxcW1xcdCBdKig/Olxccj9cXG58XFxyKVtcXHNcXFNdKy9tLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXiMhLisvbSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3N5bWJvbCc6IC9gKD86OlxcUyt8W1xcdy5dKikvLFxuXHQnZGF0ZXRpbWUnOiB7XG5cdFx0cGF0dGVybjogLzBOW21kenV2dF18MFdbZHR6XXxcXGR7NH1cXC5cXGRcXGQoPzptfFxcLlxcZFxcZCg/OlQoPzpcXGRcXGQoPzo6XFxkXFxkKD86OlxcZFxcZCg/OlsuOl1cXGRcXGRcXGQpPyk/KT8pPyk/W2R6XT8pfFxcZFxcZDpcXGRcXGQoPzo6XFxkXFxkKD86Wy46XVxcZFxcZFxcZCk/KT9bdXZ0XT8vLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQvLyBUaGUgbmVnYXRpdmUgbG9vay1haGVhZCBwcmV2ZW50cyBiYWQgaGlnaGxpZ2h0aW5nXG5cdC8vIG9mIHZlcmJzIDA6IGFuZCAxOlxuXHQnbnVtYmVyJzogL1xcYig/IVswMV06KSg/OjBOW2hqZV0/fDBXW2hqXT98MFt3bl18MHhbXFxkYS1mQS1GXSt8XFxkKyg/OlxcLlxcZCopPyg/OmVbKy1dP1xcZCspP1toamZlYl0/KS8sXG5cdCdrZXl3b3JkJzogL1xcXFxcXHcrXFxifFxcYig/OmFic3xhY29zfGFqMD98YWxsfGFuZHxhbnl8YXNjfGFzaW58YXNvZnxhdGFufGF0dHJ8YXZncz98Ymlucj98Ynl8Y2VpbGluZ3xjb2xzfGNvcnxjb3N8Y291bnR8Y292fGNyb3NzfGNzdnxjdXR8ZGVsZXRlfGRlbHRhc3xkZXNjfGRldnxkaWZmZXJ8ZGlzdGluY3R8ZGl2fGRvfGRzYXZlfGVqfGVubGlzdHxldmFsfGV4Y2VwdHxleGVjfGV4aXR8ZXhwfGZieXxmaWxsc3xmaXJzdHxma2V5c3xmbGlwfGZsb29yfGZyb218Z2V0fGdldGVudnxncm91cHxndGltZXxoY2xvc2V8aGNvdW50fGhkZWx8aG9wZW58aHN5bXxpYXNjfGlkZW50aXR5fGlkZXNjfGlmfGlqfGlufGluc2VydHxpbnRlcnxpbnZ8a2V5cz98bGFzdHxsaWtlfGxpc3R8bGpmP3xsb2FkfGxvZ3xsb3dlcnxsc3F8bHRpbWV8bHRyaW18bWF2Z3xtYXhzP3xtY291bnR8bWQ1fG1kZXZ8bWVkfG1ldGF8bWlucz98bW1heHxtbWlufG1tdXxtb2R8bXN1bXxuZWd8bmV4dHxub3R8bnVsbHxvcnxvdmVyfHBhcnNlfHBlYWNofHBqfHBsaXN0fHByZHM/fHByZXZ8cHJpb3J8cmFuZHxyYW5rfHJhdGlvc3xyYXplfHJlYWQwfHJlYWQxfHJlY2lwcm9jYWx8cmV2YWx8cmV2ZXJzZXxybG9hZHxyb3RhdGV8cnNhdmV8cnRyaW18c2F2ZXxzY2FufHNjb3Z8c2RldnxzZWxlY3R8c2V0fHNldGVudnxzaG93fHNpZ251bXxzaW58c3FydHxzc3I/fHN0cmluZ3xzdWJsaXN0fHN1bXM/fHN2fHN2YXJ8c3lzdGVtfHRhYmxlc3x0YW58dGlsfHRyaW18dHhmfHR5cGV8dWp8dW5ncm91cHx1bmlvbnx1cGRhdGV8dXBwZXJ8dXBzZXJ0fHZhbHVlfHZhcnx2aWV3cz98dnN8d2F2Z3x3aGVyZXx3aGlsZXx3aXRoaW58d2oxP3x3c3VtfHd3fHhhc2N8eGJhcnx4Y29scz98eGRlc2N8eGV4cHx4Z3JvdXB8eGtleXx4bG9nfHhwcmV2fHhyYW5rKVxcYi8sXG5cdCdhZHZlcmInOiB7XG5cdFx0cGF0dGVybjogL1snXFwvXFxcXF06P3xcXGJlYWNoXFxiLyxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQndmVyYic6IHtcblx0XHRwYXR0ZXJuOiAvKD86XFxCXFwuXFxCfFxcYlswMV06fDxbPT5dP3w+PT98WzorXFwtKiUsIT9+PXwkJiNAXl0pOj98XFxiX1xcYjo/Lyxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvWygpe31cXFtcXF07Ll0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGpzU3RyaW5nID0gL1wiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcInwnKD86XFxcXC58W15cXFxcJ1xcclxcbl0pKicvLnNvdXJjZTtcblx0dmFyIGpzQ29tbWVudCA9IC9cXC9cXC8uKig/IS4pfFxcL1xcKig/OlteKl18XFwqKD8hXFwvKSkqXFwqXFwvLy5zb3VyY2U7XG5cblx0dmFyIGpzRXhwciA9IC8oPzpbXlxcXFwoKVtcXF17fVwiJy9dfDxzdHJpbmc+fFxcLyg/IVsqL10pfDxjb21tZW50PnxcXCg8ZXhwcj4qXFwpfFxcWzxleHByPipcXF18XFx7PGV4cHI+KlxcfXxcXFxcW1xcc1xcU10pL1xuXHRcdC5zb3VyY2UucmVwbGFjZSgvPHN0cmluZz4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4ganNTdHJpbmc7IH0pLnJlcGxhY2UoLzxjb21tZW50Pi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBqc0NvbW1lbnQ7IH0pO1xuXG5cdC8vIHRoZSBwYXR0ZXJuIHdpbGwgYmxvdyB1cCwgc28gb25seSBhIGZldyBpdGVyYXRpb25zXG5cdGZvciAodmFyIGkgPSAwOyBpIDwgMjsgaSsrKSB7XG5cdFx0anNFeHByID0ganNFeHByLnJlcGxhY2UoLzxleHByPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBqc0V4cHI7IH0pO1xuXHR9XG5cdGpzRXhwciA9IGpzRXhwci5yZXBsYWNlKC88ZXhwcj4vZywgJ1teXFxcXHNcXFxcU10nKTtcblxuXG5cdFByaXNtLmxhbmd1YWdlcy5xbWwgPSB7XG5cdFx0J2NvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdqYXZhc2NyaXB0LWZ1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oKD86Xnw7KVsgXFx0XSopZnVuY3Rpb25cXHMrKD8hXFxzKVtfJGEtekEtWlxceEEwLVxcdUZGRkZdKD86KD8hXFxzKVskXFx3XFx4QTAtXFx1RkZGRl0pKlxccypcXCg8anM+KlxcKVxccypcXHs8anM+KlxcfS8uc291cmNlLnJlcGxhY2UoLzxqcz4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4ganNFeHByOyB9KSwgJ20nKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2xhbmd1YWdlLWphdmFzY3JpcHQnLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdH0sXG5cdFx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58Wzo7XSlbIFxcdF0qKSg/IVxcZClcXHcrKD89WyBcXHRdKlxce3xbIFxcdF0rb25cXGIpL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQncHJvcGVydHknOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbO3tdKVsgXFx0XSopKD8hXFxkKVxcdysoPzpcXC5cXHcrKSooPz1bIFxcdF0qOikvbSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFs7e10pWyBcXHRdKilwcm9wZXJ0eVsgXFx0XSsoPyFcXGQpXFx3Kyg/OlxcLlxcdyspKlsgXFx0XSsoPyFcXGQpXFx3Kyg/OlxcLlxcdyspKig/PVsgXFx0XSo6KS9tLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQna2V5d29yZCc6IC9ecHJvcGVydHkvLFxuXHRcdFx0XHRcdCdwcm9wZXJ0eSc6IC9cXHcrKD86XFwuXFx3KykqL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnamF2YXNjcmlwdC1leHByZXNzaW9uJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oOlsgXFx0XSopKD8hW1xcczt9W10pKD86KD8hJHxbO31dKTxqcz4pKy8uc291cmNlLnJlcGxhY2UoLzxqcz4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4ganNFeHByOyB9KSwgJ20nKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2xhbmd1YWdlLWphdmFzY3JpcHQnLFxuXHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuamF2YXNjcmlwdFxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IC9cXGIoPzphc3xpbXBvcnR8b24pXFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTo7LF0vXG5cdH07XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnFvcmUgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86XFwvXFwqW1xcc1xcU10qP1xcKlxcL3woPzpcXC9cXC98IykuKikvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0Ly8gT3ZlcnJpZGRlbiB0byBhbGxvdyB1bmVzY2FwZWQgbXVsdGktbGluZSBzdHJpbmdzXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhcInwnKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkqXFwxLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86YWJzdHJhY3R8YW55fGFzc2VydHxiaW5hcnl8Ym9vbHxib29sZWFufGJyZWFrfGJ5dGV8Y2FzZXxjYXRjaHxjaGFyfGNsYXNzfGNvZGV8Y29uc3R8Y29udGludWV8ZGF0YXxkZWZhdWx0fGRvfGRvdWJsZXxlbHNlfGVudW18ZXh0ZW5kc3xmaW5hbHxmaW5hbGx5fGZsb2F0fGZvcnxnb3RvfGhhc2h8aWZ8aW1wbGVtZW50c3xpbXBvcnR8aW5oZXJpdHN8aW5zdGFuY2VvZnxpbnR8aW50ZXJmYWNlfGxvbmd8bXl8bmF0aXZlfG5ld3xub3RoaW5nfG51bGx8b2JqZWN0fG91cnxvd258cHJpdmF0ZXxyZWZlcmVuY2V8cmV0aHJvd3xyZXR1cm58c2hvcnR8c29mdCg/OmJvb2x8ZGF0ZXxmbG9hdHxpbnR8bGlzdHxudW1iZXJ8c3RyaW5nKXxzdGF0aWN8c3RyaWN0ZnB8c3RyaW5nfHN1YnxzdXBlcnxzd2l0Y2h8c3luY2hyb25pemVkfHRoaXN8dGhyb3d8dGhyb3dzfHRyYW5zaWVudHx0cnl8dm9pZHx2b2xhdGlsZXx3aGlsZSlcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXHQnZnVuY3Rpb24nOiAvXFwkP1xcYig/IVxcZClcXHcrKD89XFwoKS8sXG5cdCdudW1iZXInOiAvXFxiKD86MGJbMDFdK3wweCg/OltcXGRhLWZdKlxcLik/W1xcZGEtZnBcXC1dK3woPzpcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspKD86ZVxcZCspP1tkZl18KD86XFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKSlcXGIvaSxcblx0J29wZXJhdG9yJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi5dKSg/OlxcK1srPV0/fC1bLT1dP3xbIT1dKD86PT0/fH4pP3w+Pj89P3w8KD86PT4/fDw9Pyk/fCZbJj1dP3xcXHxbfD1dP3xbKlxcLyVeXT0/fFt+P10pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCd2YXJpYWJsZSc6IC9cXCQoPyFcXGQpXFx3K1xcYi9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuciA9IHtcblx0J2NvbW1lbnQnOiAvIy4qLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFsnXCJdKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQncGVyY2VudC1vcGVyYXRvcic6IHtcblx0XHQvLyBJbmNsdWRlcyB1c2VyLWRlZmluZWQgb3BlcmF0b3JzXG5cdFx0Ly8gYW5kICUlLCAlKiUsICUvJSwgJWluJSwgJW8lLCAleCVcblx0XHRwYXR0ZXJuOiAvJVteJVxcc10qJS8sXG5cdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0fSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86RkFMU0V8VFJVRSlcXGIvLFxuXHQnZWxsaXBzaXMnOiAvXFwuXFwuKD86XFwufFxcZCspLyxcblx0J251bWJlcic6IFtcblx0XHQvXFxiKD86SW5mfE5hTilcXGIvLFxuXHRcdC8oPzpcXGIweFtcXGRBLUZhLWZdKyg/OlxcLlxcZCopP3xcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86W0VlUHBdWystXT9cXGQrKT9baUxdPy9cblx0XSxcblx0J2tleXdvcmQnOiAvXFxiKD86TkF8TkFfY2hhcmFjdGVyX3xOQV9jb21wbGV4X3xOQV9pbnRlZ2VyX3xOQV9yZWFsX3xOVUxMfGJyZWFrfGVsc2V8Zm9yfGZ1bmN0aW9ufGlmfGlufG5leHR8cmVwZWF0fHdoaWxlKVxcYi8sXG5cdCdvcGVyYXRvcic6IC8tPj8+P3w8KD86PXw8Py0pP3xbPj0hXT0/fDo6P3wmJj98XFx8XFx8P3xbKypcXC9eJEB+XS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCl7fVxcW1xcXSw7XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5yYWNrZXQgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdzY2hlbWUnLCB7XG5cdCdsYW1iZGEtcGFyYW1ldGVyJzoge1xuXHRcdC8vIHRoZSByYWNrZXQgbGFtYmRhIHN5bnRheCBpcyBhIGxvdCBtb3JlIGNvbXBsZXgsIHNvIHdlIHdvbid0IGV2ZW4gYXR0ZW1wdCB0byBjYXB0dXJlIGl0LlxuXHRcdC8vIHRoaXMgd2lsbCBqdXN0IHByZXZlbnQgZmFsc2UgcG9zaXRpdmVzIG9mIHRoZSBgZnVuY3Rpb25gIHBhdHRlcm5cblx0XHRwYXR0ZXJuOiAvKFsoXFxbXWxhbWJkYVxccytbKFxcW10pW14oKVxcW1xcXSdcXHNdKy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncmFja2V0JywgJ3N0cmluZycsIHtcblx0J2xhbmcnOiB7XG5cdFx0cGF0dGVybjogL14jbGFuZy4rL20sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5ya3QgPSBQcmlzbS5sYW5ndWFnZXMucmFja2V0O1xuXG4vLyBEb2NzOlxuLy8gaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvYXNwbmV0L2NvcmUvcmF6b3ItcGFnZXMvP3ZpZXc9YXNwbmV0Y29yZS01LjAmdGFicz12aXN1YWwtc3R1ZGlvXG4vLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9hc3BuZXQvY29yZS9tdmMvdmlld3MvcmF6b3I/dmlldz1hc3BuZXRjb3JlLTUuMFxuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGNvbW1lbnRMaWtlID0gL1xcLyg/IVsvKl0pfFxcL1xcLy4qW1xcclxcbl18XFwvXFwqW14qXSooPzpcXCooPyFcXC8pW14qXSopKlxcKlxcLy8uc291cmNlO1xuXHR2YXIgc3RyaW5nTGlrZSA9XG5cdFx0L0AoPyFcIil8XCIoPzpbXlxcclxcblxcXFxcIl18XFxcXC4pKlwifEBcIig/OlteXFxcXFwiXXxcIlwifFxcXFxbXFxzXFxTXSkqXCIoPyFcIikvLnNvdXJjZSArXG5cdFx0J3wnICtcblx0XHQvJyg/Oig/OlteXFxyXFxuJ1xcXFxdfFxcXFwufFxcXFxbVXV4XVtcXGRhLWZBLUZdezEsOH0pJ3woPz1bXlxcXFxdKD8hJykpKS8uc291cmNlO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmVzdGVkIHBhdHRlcm4gd2hlcmUgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBzdHJpbmcgYDw8c2VsZj4+YCBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgcGF0dGVybiBpdHNlbGYuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBwYXR0ZXJuXG5cdCAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aExvZzJcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdGZ1bmN0aW9uIG5lc3RlZChwYXR0ZXJuLCBkZXB0aExvZzIpIHtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGRlcHRoTG9nMjsgaSsrKSB7XG5cdFx0XHRwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKC88c2VsZj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gJyg/OicgKyBwYXR0ZXJuICsgJyknOyB9KTtcblx0XHR9XG5cdFx0cmV0dXJuIHBhdHRlcm5cblx0XHRcdC5yZXBsYWNlKC88c2VsZj4vZywgJ1teXFxcXHNcXFxcU10nKVxuXHRcdFx0LnJlcGxhY2UoLzxzdHI+L2csICcoPzonICsgc3RyaW5nTGlrZSArICcpJylcblx0XHRcdC5yZXBsYWNlKC88Y29tbWVudD4vZywgJyg/OicgKyBjb21tZW50TGlrZSArICcpJyk7XG5cdH1cblxuXHR2YXIgcm91bmQgPSBuZXN0ZWQoL1xcKCg/OlteKCknXCJAL118PHN0cj58PGNvbW1lbnQ+fDxzZWxmPikqXFwpLy5zb3VyY2UsIDIpO1xuXHR2YXIgc3F1YXJlID0gbmVzdGVkKC9cXFsoPzpbXlxcW1xcXSdcIkAvXXw8c3RyPnw8Y29tbWVudD58PHNlbGY+KSpcXF0vLnNvdXJjZSwgMSk7XG5cdHZhciBjdXJseSA9IG5lc3RlZCgvXFx7KD86W157fSdcIkAvXXw8c3RyPnw8Y29tbWVudD58PHNlbGY+KSpcXH0vLnNvdXJjZSwgMik7XG5cdHZhciBhbmdsZSA9IG5lc3RlZCgvPCg/OltePD4nXCJAL118PGNvbW1lbnQ+fDxzZWxmPikqPi8uc291cmNlLCAxKTtcblxuXHR2YXIgaW5saW5lQ3MgPSAvQC8uc291cmNlICtcblx0XHQvKD86YXdhaXRcXGJcXHMqKT8vLnNvdXJjZSArXG5cdFx0Jyg/OicgKyAvKD8hYXdhaXRcXGIpXFx3K1xcYi8uc291cmNlICsgJ3wnICsgcm91bmQgKyAnKScgK1xuXHRcdCcoPzonICsgL1s/IV0/XFwuXFx3K1xcYi8uc291cmNlICsgJ3wnICsgJyg/OicgKyBhbmdsZSArICcpPycgKyByb3VuZCArICd8JyArIHNxdWFyZSArICcpKicgK1xuXHRcdC8oPyFbPyFcXC4oXFxbXXw8KD8hXFwvKSkvLnNvdXJjZTtcblxuXHQvLyBOb3RlIGFib3V0IHRoZSBhYm92ZSBicmFja2V0IHBhdHRlcm5zOlxuXHQvLyBUaGV5IGFsbCBpZ25vcmUgSFRNTCBleHByZXNzaW9ucyB0aGF0IG1pZ2h0IGJlIGluIHRoZSBDIyBjb2RlLiBUaGlzIGlzIGEgcHJvYmxlbSBiZWNhdXNlIEhUTUwgKGxpa2Ugc3RyaW5ncyBhbmRcblx0Ly8gY29tbWVudHMpIGlzIHBhcnNlZCBkaWZmZXJlbnRseS4gVGhpcyBpcyBhIGh1Z2UgcHJvYmxlbSBiZWNhdXNlIEhUTUwgbWlnaHQgY29udGFpbiBicmFja2V0cyBhbmQgcXVvdGVzIHdoaWNoXG5cdC8vIG1lc3NlcyB1cCB0aGUgYnJhY2tldCBhbmQgc3RyaW5nIGNvdW50aW5nIGltcGxlbWVudGVkIGJ5IHRoZSBhYm92ZSBwYXR0ZXJucy5cblx0Ly9cblx0Ly8gVGhpcyBwcm9ibGVtIGlzIG5vdCBmaXhhYmxlIGJlY2F1c2UgMSkgSFRNTCBleHByZXNzaW9uIGFyZSBoaWdobHkgY29udGV4dCBzZW5zaXRpdmUgYW5kIHZlcnkgZGlmZmljdWx0IHRvIGRldGVjdFxuXHQvLyBhbmQgMikgdGhleSByZXF1aXJlIG9uZSBjYXB0dXJpbmcgZ3JvdXAgYXQgZXZlcnkgbmVzdGVkIGxldmVsLiBTZWUgdGhlIGB0YWdSZWdpb25gIHBhdHRlcm4gdG8gYWRtaXJlIHRoZVxuXHQvLyBjb21wbGV4aXR5IG9mIGFuIEhUTUwgZXhwcmVzc2lvbi5cblx0Ly9cblx0Ly8gVG8gc29tZXdoYXQgYWxsZXZpYXRlIHRoZSBwcm9ibGVtIGEgYml0LCB0aGUgcGF0dGVybnMgZm9yIGNoYXJhY3RlcnMgKGUuZy4gJ2EnKSBpcyB2ZXJ5IHBlcm1pc3NpdmUsIGl0IGFsc29cblx0Ly8gYWxsb3dzIGludmFsaWQgY2hhcmFjdGVycyB0byBzdXBwb3J0IEhUTUwgZXhwcmVzc2lvbnMgbGlrZSB0aGlzOiA8cD5UaGF0J3MgaXQhPC9wPi5cblxuXHR2YXIgdGFnQXR0cklubGluZUNzID0gL0AoPyFbXFx3KCldKS8uc291cmNlICsgJ3wnICsgaW5saW5lQ3M7XG5cdHZhciB0YWdBdHRyVmFsdWUgPSAnKD86JyArXG5cdFx0L1wiW15cIkBdKlwifCdbXidAXSonfFteXFxzJ1wiQD49XSsoPz1bXFxzPl0pLy5zb3VyY2UgK1xuXHRcdCd8JyArXG5cdFx0J1tcIlxcJ11bXlwiXFwnQF0qKD86KD86JyArIHRhZ0F0dHJJbmxpbmVDcyArICcpW15cIlxcJ0BdKikrW1wiXFwnXScgK1xuXHRcdCcpJztcblxuXHR2YXIgdGFnQXR0cnMgPSAvKD86XFxzKD86XFxzKlteXFxzPlxcLz1dKyg/Olxccyo9XFxzKjx0YWdBdHRyVmFsdWU+fCg/PVtcXHMvPl0pKSkrKT8vLnNvdXJjZS5yZXBsYWNlKC88dGFnQXR0clZhbHVlPi8sIHRhZ0F0dHJWYWx1ZSk7XG5cdHZhciB0YWdDb250ZW50ID0gLyg/IVxcZClbXlxccz5cXC89JDwlXSsvLnNvdXJjZSArIHRhZ0F0dHJzICsgL1xccypcXC8/Pi8uc291cmNlO1xuXHR2YXIgdGFnUmVnaW9uID1cblx0XHQvXFxCQD8vLnNvdXJjZSArXG5cdFx0Jyg/OicgK1xuXHRcdC88KFthLXpBLVpdW1xcdzpdKikvLnNvdXJjZSArIHRhZ0F0dHJzICsgL1xccyo+Ly5zb3VyY2UgK1xuXHRcdCcoPzonICtcblx0XHQoXG5cdFx0XHQvW148XS8uc291cmNlICtcblx0XHRcdCd8JyArXG5cdFx0XHQvLyBhbGwgdGFncyB0aGF0IGFyZSBub3QgdGhlIHN0YXJ0IHRhZ1xuXHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHRcdC88XFwvPyg/IVxcMVxcYikvLnNvdXJjZSArIHRhZ0NvbnRlbnQgK1xuXHRcdFx0J3wnICtcblx0XHRcdC8vIG5lc3RlZCBzdGFydCB0YWdcblx0XHRcdG5lc3RlZChcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHRcdFx0LzxcXDEvLnNvdXJjZSArIHRhZ0F0dHJzICsgL1xccyo+Ly5zb3VyY2UgK1xuXHRcdFx0XHQnKD86JyArXG5cdFx0XHRcdChcblx0XHRcdFx0XHQvW148XS8uc291cmNlICtcblx0XHRcdFx0XHQnfCcgK1xuXHRcdFx0XHRcdC8vIGFsbCB0YWdzIHRoYXQgYXJlIG5vdCB0aGUgc3RhcnQgdGFnXG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHRcdFx0XHQvPFxcLz8oPyFcXDFcXGIpLy5zb3VyY2UgKyB0YWdDb250ZW50ICtcblx0XHRcdFx0XHQnfCcgK1xuXHRcdFx0XHRcdCc8c2VsZj4nXG5cdFx0XHRcdCkgK1xuXHRcdFx0XHQnKSonICtcblx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHRcdFx0LzxcXC9cXDFcXHMqPi8uc291cmNlLFxuXHRcdFx0XHQyXG5cdFx0XHQpXG5cdFx0KSArXG5cdFx0JykqJyArXG5cdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9zdHJpY3Rcblx0XHQvPFxcL1xcMVxccyo+Ly5zb3VyY2UgK1xuXHRcdCd8JyArXG5cdFx0LzwvLnNvdXJjZSArIHRhZ0NvbnRlbnQgK1xuXHRcdCcpJztcblxuXHQvLyBOb3cgZm9yIHRoZSBhY3R1YWwgbGFuZ3VhZ2UgZGVmaW5pdGlvbihzKTpcblx0Ly9cblx0Ly8gUmF6b3IgYXMgYSBsYW5ndWFnZSBoYXMgMiBwYXJ0czpcblx0Ly8gIDEpIENTSFRNTDogQSBtYXJrdXAtbGlrZSBsYW5ndWFnZSB0aGF0IGhhcyBiZWVuIGV4dGVuZGVkIHdpdGggaW5saW5lIEMjIGNvZGUgZXhwcmVzc2lvbnMgYW5kIGJsb2Nrcy5cblx0Ly8gIDIpIEMjK0hUTUw6IEEgdmFyaWFudCBvZiBDIyB0aGF0IGNhbiBjb250YWluIENTSFRNTCB0YWdzIGFzIGV4cHJlc3Npb25zLlxuXHQvL1xuXHQvLyBJbiB0aGUgYmVsb3cgY29kZSwgYm90aCBDU0hUTUwgYW5kIEMjK0hUTUwgd2lsbCBiZSBjcmVhdGUgYXMgc2VwYXJhdGUgbGFuZ3VhZ2UgZGVmaW5pdGlvbnMgdGhhdCByZWZlcmVuY2UgZWFjaFxuXHQvLyBvdGhlci4gSG93ZXZlciwgb25seSBDU0hUTUwgd2lsbCBiZSBleHBvcnRlZCB2aWEgYFByaXNtLmxhbmd1YWdlc2AuXG5cblx0UHJpc20ubGFuZ3VhZ2VzLmNzaHRtbCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ21hcmt1cCcsIHt9KTtcblxuXHR2YXIgY3NoYXJwV2l0aEh0bWwgPSBQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdjc2hhcnAnLCAnc3RyaW5nJywge1xuXHRcdCdodG1sJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKHRhZ1JlZ2lvbiksXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5jc2h0bWxcblx0XHR9LFxuXHR9LCB7IGNzaGFycDogUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY3NoYXJwJywge30pIH0pO1xuXG5cdHZhciBjcyA9IHtcblx0XHRwYXR0ZXJuOiAvXFxTW1xcc1xcU10qLyxcblx0XHRhbGlhczogJ2xhbmd1YWdlLWNzaGFycCcsXG5cdFx0aW5zaWRlOiBjc2hhcnBXaXRoSHRtbFxuXHR9O1xuXG5cdHZhciBpbmxpbmVWYWx1ZSA9IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhefFteQF0pLy5zb3VyY2UgKyBpbmxpbmVDcyksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICd2YXJpYWJsZScsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IC9eQC8sXG5cdFx0XHQnY3NoYXJwJzogY3Ncblx0XHR9XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmNzaHRtbC50YWcucGF0dGVybiA9IFJlZ0V4cCgvPFxcLz8vLnNvdXJjZSArIHRhZ0NvbnRlbnQpO1xuXHRQcmlzbS5sYW5ndWFnZXMuY3NodG1sLnRhZy5pbnNpZGVbJ2F0dHItdmFsdWUnXS5wYXR0ZXJuID0gUmVnRXhwKC89XFxzKi8uc291cmNlICsgdGFnQXR0clZhbHVlKTtcblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaW5zaWRlJywgJ3B1bmN0dWF0aW9uJywgeyAndmFsdWUnOiBpbmxpbmVWYWx1ZSB9LCBQcmlzbS5sYW5ndWFnZXMuY3NodG1sLnRhZy5pbnNpZGVbJ2F0dHItdmFsdWUnXSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnY3NodG1sJywgJ3Byb2xvZycsIHtcblx0XHQncmF6b3ItY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9AXFwqW1xcc1xcU10qP1xcKkAvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdjb21tZW50J1xuXHRcdH0sXG5cblx0XHQnYmxvY2snOiB7XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdC8oXnxbXkBdKUAvLnNvdXJjZSArXG5cdFx0XHRcdCcoPzonICtcblx0XHRcdFx0W1xuXHRcdFx0XHRcdC8vIEB7IC4uLiB9XG5cdFx0XHRcdFx0Y3VybHksXG5cdFx0XHRcdFx0Ly8gQGNvZGV7IC4uLiB9XG5cdFx0XHRcdFx0Lyg/OmNvZGV8ZnVuY3Rpb25zKVxccyovLnNvdXJjZSArIGN1cmx5LFxuXHRcdFx0XHRcdC8vIEBmb3IgKC4uLikgeyAuLi4gfVxuXHRcdFx0XHRcdC8oPzpmb3J8Zm9yZWFjaHxsb2NrfHN3aXRjaHx1c2luZ3x3aGlsZSlcXHMqLy5zb3VyY2UgKyByb3VuZCArIC9cXHMqLy5zb3VyY2UgKyBjdXJseSxcblx0XHRcdFx0XHQvLyBAZG8geyAuLi4gfSB3aGlsZSAoLi4uKTtcblx0XHRcdFx0XHQvZG9cXHMqLy5zb3VyY2UgKyBjdXJseSArIC9cXHMqd2hpbGVcXHMqLy5zb3VyY2UgKyByb3VuZCArIC8oPzpcXHMqOyk/Ly5zb3VyY2UsXG5cdFx0XHRcdFx0Ly8gQHRyeSB7IC4uLiB9IGNhdGNoICguLi4pIHsgLi4uIH0gZmluYWxseSB7IC4uLiB9XG5cdFx0XHRcdFx0L3RyeVxccyovLnNvdXJjZSArIGN1cmx5ICsgL1xccypjYXRjaFxccyovLnNvdXJjZSArIHJvdW5kICsgL1xccyovLnNvdXJjZSArIGN1cmx5ICsgL1xccypmaW5hbGx5XFxzKi8uc291cmNlICsgY3VybHksXG5cdFx0XHRcdFx0Ly8gQGlmICguLi4pIHsuLi59IGVsc2UgaWYgKC4uLikgey4uLn0gZWxzZSB7Li4ufVxuXHRcdFx0XHRcdC9pZlxccyovLnNvdXJjZSArIHJvdW5kICsgL1xccyovLnNvdXJjZSArIGN1cmx5ICsgJyg/OicgKyAvXFxzKmVsc2UvLnNvdXJjZSArICcoPzonICsgL1xccytpZlxccyovLnNvdXJjZSArIHJvdW5kICsgJyk/JyArIC9cXHMqLy5zb3VyY2UgKyBjdXJseSArICcpKicsXG5cdFx0XHRcdFx0Ly8gQGhlbHBlciBJZGVudChwYXJhbXMpIHsgLi4uIH1cblx0XHRcdFx0XHQvaGVscGVyXFxzK1xcdytcXHMqLy5zb3VyY2UgKyByb3VuZCArIC9cXHMqLy5zb3VyY2UgKyBjdXJseSxcblx0XHRcdFx0XS5qb2luKCd8JykgK1xuXHRcdFx0XHQnKSdcblx0XHRcdCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdrZXl3b3JkJzogL15AXFx3Ki8sXG5cdFx0XHRcdCdjc2hhcnAnOiBjc1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0cGF0dGVybjogL14oWyBcXHRdKilAKD86YWRkVGFnSGVscGVyfGF0dHJpYnV0ZXxpbXBsZW1lbnRzfGluaGVyaXRzfGluamVjdHxsYXlvdXR8bW9kZWx8bmFtZXNwYWNlfHBhZ2V8cHJlc2VydmV3aGl0ZXNwYWNlfHJlbW92ZVRhZ0hlbHBlcnxzZWN0aW9ufHRhZ0hlbHBlclByZWZpeHx1c2luZykoPz1cXHMpLiovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2tleXdvcmQnOiAvXkBcXHcrLyxcblx0XHRcdFx0J2NzaGFycCc6IGNzXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCd2YWx1ZSc6IGlubGluZVZhbHVlLFxuXG5cdFx0J2RlbGVnYXRlLW9wZXJhdG9yJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteQF0pQCg/PTwpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnJhem9yID0gUHJpc20ubGFuZ3VhZ2VzLmNzaHRtbDtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGphdmFzY3JpcHQgPSBQcmlzbS51dGlsLmNsb25lKFByaXNtLmxhbmd1YWdlcy5qYXZhc2NyaXB0KTtcblxuXHR2YXIgc3BhY2UgPSAvKD86XFxzfFxcL1xcLy4qKD8hLil8XFwvXFwqKD86W14qXXxcXCooPyFcXC8pKVxcKlxcLykvLnNvdXJjZTtcblx0dmFyIGJyYWNlcyA9IC8oPzpcXHsoPzpcXHsoPzpcXHtbXnt9XSpcXH18W157fV0pKlxcfXxbXnt9XSkqXFx9KS8uc291cmNlO1xuXHR2YXIgc3ByZWFkID0gLyg/OlxcezxTPipcXC57M30oPzpbXnt9XXw8QlJBQ0VTPikqXFx9KS8uc291cmNlO1xuXG5cdC8qKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhZ3NdXG5cdCAqL1xuXHRmdW5jdGlvbiByZShzb3VyY2UsIGZsYWdzKSB7XG5cdFx0c291cmNlID0gc291cmNlXG5cdFx0XHQucmVwbGFjZSgvPFM+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNwYWNlOyB9KVxuXHRcdFx0LnJlcGxhY2UoLzxCUkFDRVM+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGJyYWNlczsgfSlcblx0XHRcdC5yZXBsYWNlKC88U1BSRUFEPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzcHJlYWQ7IH0pO1xuXHRcdHJldHVybiBSZWdFeHAoc291cmNlLCBmbGFncyk7XG5cdH1cblxuXHRzcHJlYWQgPSByZShzcHJlYWQpLnNvdXJjZTtcblxuXG5cdFByaXNtLmxhbmd1YWdlcy5qc3ggPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdtYXJrdXAnLCBqYXZhc2NyaXB0KTtcblx0UHJpc20ubGFuZ3VhZ2VzLmpzeC50YWcucGF0dGVybiA9IHJlKFxuXHRcdC88XFwvPyg/OltcXHcuOi1dKyg/OjxTPisoPzpbXFx3LjokLV0rKD86PSg/OlwiKD86XFxcXFtcXHNcXFNdfFteXFxcXFwiXSkqXCJ8Jyg/OlxcXFxbXFxzXFxTXXxbXlxcXFwnXSkqJ3xbXlxcc3snXCIvPj1dK3w8QlJBQ0VTPikpP3w8U1BSRUFEPikpKjxTPipcXC8/KT8+Ly5zb3VyY2Vcblx0KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuanN4LnRhZy5pbnNpZGVbJ3RhZyddLnBhdHRlcm4gPSAvXjxcXC8/W15cXHM+XFwvXSovO1xuXHRQcmlzbS5sYW5ndWFnZXMuanN4LnRhZy5pbnNpZGVbJ2F0dHItdmFsdWUnXS5wYXR0ZXJuID0gLz0oPyFcXHspKD86XCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcInwnKD86XFxcXFtcXHNcXFNdfFteXFxcXCddKSonfFteXFxzJ1wiPl0rKS87XG5cdFByaXNtLmxhbmd1YWdlcy5qc3gudGFnLmluc2lkZVsndGFnJ10uaW5zaWRlWydjbGFzcy1uYW1lJ10gPSAvXltBLVpdXFx3Kig/OlxcLltBLVpdXFx3KikqJC87XG5cdFByaXNtLmxhbmd1YWdlcy5qc3gudGFnLmluc2lkZVsnY29tbWVudCddID0gamF2YXNjcmlwdFsnY29tbWVudCddO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2luc2lkZScsICdhdHRyLW5hbWUnLCB7XG5cdFx0J3NwcmVhZCc6IHtcblx0XHRcdHBhdHRlcm46IHJlKC88U1BSRUFEPi8uc291cmNlKSxcblx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmpzeFxuXHRcdH1cblx0fSwgUHJpc20ubGFuZ3VhZ2VzLmpzeC50YWcpO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ2luc2lkZScsICdzcGVjaWFsLWF0dHInLCB7XG5cdFx0J3NjcmlwdCc6IHtcblx0XHRcdC8vIEFsbG93IGZvciB0d28gbGV2ZWxzIG9mIG5lc3Rpbmdcblx0XHRcdHBhdHRlcm46IHJlKC89PEJSQUNFUz4vLnNvdXJjZSksXG5cdFx0XHRhbGlhczogJ2xhbmd1YWdlLWphdmFzY3JpcHQnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdzY3JpcHQtcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL149KD89XFx7KS8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fSxcblx0XHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLmpzeFxuXHRcdFx0fSxcblx0XHR9XG5cdH0sIFByaXNtLmxhbmd1YWdlcy5qc3gudGFnKTtcblxuXHQvLyBUaGUgZm9sbG93aW5nIHdpbGwgaGFuZGxlIHBsYWluIHRleHQgaW5zaWRlIHRhZ3Ncblx0dmFyIHN0cmluZ2lmeVRva2VuID0gZnVuY3Rpb24gKHRva2VuKSB7XG5cdFx0aWYgKCF0b2tlbikge1xuXHRcdFx0cmV0dXJuICcnO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHRva2VuO1xuXHRcdH1cblx0XHRpZiAodHlwZW9mIHRva2VuLmNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gdG9rZW4uY29udGVudDtcblx0XHR9XG5cdFx0cmV0dXJuIHRva2VuLmNvbnRlbnQubWFwKHN0cmluZ2lmeVRva2VuKS5qb2luKCcnKTtcblx0fTtcblxuXHR2YXIgd2Fsa1Rva2VucyA9IGZ1bmN0aW9uICh0b2tlbnMpIHtcblx0XHR2YXIgb3BlbmVkVGFncyA9IFtdO1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHR2YXIgdG9rZW4gPSB0b2tlbnNbaV07XG5cdFx0XHR2YXIgbm90VGFnTm9yQnJhY2UgPSBmYWxzZTtcblxuXHRcdFx0aWYgKHR5cGVvZiB0b2tlbiAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0aWYgKHRva2VuLnR5cGUgPT09ICd0YWcnICYmIHRva2VuLmNvbnRlbnRbMF0gJiYgdG9rZW4uY29udGVudFswXS50eXBlID09PSAndGFnJykge1xuXHRcdFx0XHRcdC8vIFdlIGZvdW5kIGEgdGFnLCBub3cgZmluZCBpdHMga2luZFxuXG5cdFx0XHRcdFx0aWYgKHRva2VuLmNvbnRlbnRbMF0uY29udGVudFswXS5jb250ZW50ID09PSAnPC8nKSB7XG5cdFx0XHRcdFx0XHQvLyBDbG9zaW5nIHRhZ1xuXHRcdFx0XHRcdFx0aWYgKG9wZW5lZFRhZ3MubGVuZ3RoID4gMCAmJiBvcGVuZWRUYWdzW29wZW5lZFRhZ3MubGVuZ3RoIC0gMV0udGFnTmFtZSA9PT0gc3RyaW5naWZ5VG9rZW4odG9rZW4uY29udGVudFswXS5jb250ZW50WzFdKSkge1xuXHRcdFx0XHRcdFx0XHQvLyBQb3AgbWF0Y2hpbmcgb3BlbmluZyB0YWdcblx0XHRcdFx0XHRcdFx0b3BlbmVkVGFncy5wb3AoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0aWYgKHRva2VuLmNvbnRlbnRbdG9rZW4uY29udGVudC5sZW5ndGggLSAxXS5jb250ZW50ID09PSAnLz4nKSB7XG5cdFx0XHRcdFx0XHRcdC8vIEF1dG9jbG9zZWQgdGFnLCBpZ25vcmVcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIE9wZW5pbmcgdGFnXG5cdFx0XHRcdFx0XHRcdG9wZW5lZFRhZ3MucHVzaCh7XG5cdFx0XHRcdFx0XHRcdFx0dGFnTmFtZTogc3RyaW5naWZ5VG9rZW4odG9rZW4uY29udGVudFswXS5jb250ZW50WzFdKSxcblx0XHRcdFx0XHRcdFx0XHRvcGVuZWRCcmFjZXM6IDBcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKG9wZW5lZFRhZ3MubGVuZ3RoID4gMCAmJiB0b2tlbi50eXBlID09PSAncHVuY3R1YXRpb24nICYmIHRva2VuLmNvbnRlbnQgPT09ICd7Jykge1xuXG5cdFx0XHRcdFx0Ly8gSGVyZSB3ZSBtaWdodCBoYXZlIGVudGVyZWQgYSBKU1ggY29udGV4dCBpbnNpZGUgYSB0YWdcblx0XHRcdFx0XHRvcGVuZWRUYWdzW29wZW5lZFRhZ3MubGVuZ3RoIC0gMV0ub3BlbmVkQnJhY2VzKys7XG5cblx0XHRcdFx0fSBlbHNlIGlmIChvcGVuZWRUYWdzLmxlbmd0aCA+IDAgJiYgb3BlbmVkVGFnc1tvcGVuZWRUYWdzLmxlbmd0aCAtIDFdLm9wZW5lZEJyYWNlcyA+IDAgJiYgdG9rZW4udHlwZSA9PT0gJ3B1bmN0dWF0aW9uJyAmJiB0b2tlbi5jb250ZW50ID09PSAnfScpIHtcblxuXHRcdFx0XHRcdC8vIEhlcmUgd2UgbWlnaHQgaGF2ZSBsZWZ0IGEgSlNYIGNvbnRleHQgaW5zaWRlIGEgdGFnXG5cdFx0XHRcdFx0b3BlbmVkVGFnc1tvcGVuZWRUYWdzLmxlbmd0aCAtIDFdLm9wZW5lZEJyYWNlcy0tO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bm90VGFnTm9yQnJhY2UgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAobm90VGFnTm9yQnJhY2UgfHwgdHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuXHRcdFx0XHRpZiAob3BlbmVkVGFncy5sZW5ndGggPiAwICYmIG9wZW5lZFRhZ3Nbb3BlbmVkVGFncy5sZW5ndGggLSAxXS5vcGVuZWRCcmFjZXMgPT09IDApIHtcblx0XHRcdFx0XHQvLyBIZXJlIHdlIGFyZSBpbnNpZGUgYSB0YWcsIGFuZCBub3QgaW5zaWRlIGEgSlNYIGNvbnRleHQuXG5cdFx0XHRcdFx0Ly8gVGhhdCdzIHBsYWluIHRleHQ6IGRyb3AgYW55IHRva2VucyBtYXRjaGVkLlxuXHRcdFx0XHRcdHZhciBwbGFpblRleHQgPSBzdHJpbmdpZnlUb2tlbih0b2tlbik7XG5cblx0XHRcdFx0XHQvLyBBbmQgbWVyZ2UgdGV4dCB3aXRoIGFkamFjZW50IHRleHRcblx0XHRcdFx0XHRpZiAoaSA8IHRva2Vucy5sZW5ndGggLSAxICYmICh0eXBlb2YgdG9rZW5zW2kgKyAxXSA9PT0gJ3N0cmluZycgfHwgdG9rZW5zW2kgKyAxXS50eXBlID09PSAncGxhaW4tdGV4dCcpKSB7XG5cdFx0XHRcdFx0XHRwbGFpblRleHQgKz0gc3RyaW5naWZ5VG9rZW4odG9rZW5zW2kgKyAxXSk7XG5cdFx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKGkgKyAxLCAxKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKGkgPiAwICYmICh0eXBlb2YgdG9rZW5zW2kgLSAxXSA9PT0gJ3N0cmluZycgfHwgdG9rZW5zW2kgLSAxXS50eXBlID09PSAncGxhaW4tdGV4dCcpKSB7XG5cdFx0XHRcdFx0XHRwbGFpblRleHQgPSBzdHJpbmdpZnlUb2tlbih0b2tlbnNbaSAtIDFdKSArIHBsYWluVGV4dDtcblx0XHRcdFx0XHRcdHRva2Vucy5zcGxpY2UoaSAtIDEsIDEpO1xuXHRcdFx0XHRcdFx0aS0tO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRva2Vuc1tpXSA9IG5ldyBQcmlzbS5Ub2tlbigncGxhaW4tdGV4dCcsIHBsYWluVGV4dCwgbnVsbCwgcGxhaW5UZXh0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAodG9rZW4uY29udGVudCAmJiB0eXBlb2YgdG9rZW4uY29udGVudCAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0d2Fsa1Rva2Vucyh0b2tlbi5jb250ZW50KTtcblx0XHRcdH1cblx0XHR9XG5cdH07XG5cblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRpZiAoZW52Lmxhbmd1YWdlICE9PSAnanN4JyAmJiBlbnYubGFuZ3VhZ2UgIT09ICd0c3gnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHdhbGtUb2tlbnMoZW52LnRva2Vucyk7XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0dmFyIHR5cGVzY3JpcHQgPSBQcmlzbS51dGlsLmNsb25lKFByaXNtLmxhbmd1YWdlcy50eXBlc2NyaXB0KTtcblx0UHJpc20ubGFuZ3VhZ2VzLnRzeCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2pzeCcsIHR5cGVzY3JpcHQpO1xuXG5cdC8vIGRvZXNuJ3Qgd29yayB3aXRoIFRTIGJlY2F1c2UgVFMgaXMgdG9vIGNvbXBsZXhcblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy50c3hbJ3BhcmFtZXRlciddO1xuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnRzeFsnbGl0ZXJhbC1wcm9wZXJ0eSddO1xuXG5cdC8vIFRoaXMgd2lsbCBwcmV2ZW50IGNvbGxpc2lvbnMgYmV0d2VlbiBUU1ggdGFncyBhbmQgVFMgZ2VuZXJpYyB0eXBlcy5cblx0Ly8gSWRlYSBieSBodHRwczovL2dpdGh1Yi5jb20va2FybGhvcmt5XG5cdC8vIERpc2N1c3Npb246IGh0dHBzOi8vZ2l0aHViLmNvbS9QcmlzbUpTL3ByaXNtL2lzc3Vlcy8yNTk0I2lzc3VlY29tbWVudC03MTA2NjY5Mjhcblx0dmFyIHRhZyA9IFByaXNtLmxhbmd1YWdlcy50c3gudGFnO1xuXHR0YWcucGF0dGVybiA9IFJlZ0V4cCgvKF58W15cXHckXXwoPz08XFwvKSkvLnNvdXJjZSArICcoPzonICsgdGFnLnBhdHRlcm4uc291cmNlICsgJyknLCB0YWcucGF0dGVybi5mbGFncyk7XG5cdHRhZy5sb29rYmVoaW5kID0gdHJ1ZTtcbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnJlYXNvbiA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXFxcXFxcclxcblwiXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQvLyAnY2xhc3MtbmFtZScgbXVzdCBiZSBtYXRjaGVkICphZnRlciogJ2NvbnN0cnVjdG9yJyBkZWZpbmVkIGJlbG93XG5cdCdjbGFzcy1uYW1lJzogL1xcYltBLVpdXFx3Ki8sXG5cdCdrZXl3b3JkJzogL1xcYig/OmFuZHxhc3xhc3NlcnR8YmVnaW58Y2xhc3N8Y29uc3RyYWludHxkb3xkb25lfGRvd250b3xlbHNlfGVuZHxleGNlcHRpb258ZXh0ZXJuYWx8Zm9yfGZ1bnxmdW5jdGlvbnxmdW5jdG9yfGlmfGlufGluY2x1ZGV8aW5oZXJpdHxpbml0aWFsaXplcnxsYXp5fGxldHxtZXRob2R8bW9kdWxlfG11dGFibGV8bmV3fG5vbnJlY3xvYmplY3R8b2Z8b3Blbnxvcnxwcml2YXRlfHJlY3xzaWd8c3RydWN0fHN3aXRjaHx0aGVufHRvfHRyeXx0eXBlfHZhbHx2aXJ0dWFsfHdoZW58d2hpbGV8d2l0aClcXGIvLFxuXHQnb3BlcmF0b3InOiAvXFwuezN9fDpbOj1dfFxcfD58LT58PSg/Oj09P3w+KT98PD0/fD49P3xbfF4/JyMhfmBdfFsrXFwtKlxcL11cXC4/fFxcYig/OmFzcnxsYW5kfGxvcnxsc2x8bHNyfGx4b3J8bW9kKVxcYi9cbn0pO1xuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgncmVhc29uJywgJ2NsYXNzLW5hbWUnLCB7XG5cdCdjaGFyJzoge1xuXHRcdHBhdHRlcm46IC8nKD86XFxcXHhbXFxkYS1mXXsyfXxcXFxcb1swLTNdWzAtN11bMC03XXxcXFxcXFxkezN9fFxcXFwufFteJ1xcXFxcXHJcXG5dKScvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQvLyBOZWdhdGl2ZSBsb29rLWFoZWFkIHByZXZlbnRzIGZyb20gbWF0Y2hpbmcgdGhpbmdzIGxpa2UgU3RyaW5nLmNhcGl0YWxpemVcblx0J2NvbnN0cnVjdG9yJzogL1xcYltBLVpdXFx3KlxcYig/IVxccypcXC4pLyxcblx0J2xhYmVsJzoge1xuXHRcdHBhdHRlcm46IC9cXGJbYS16XVxcdyooPz06OikvLFxuXHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHR9XG59KTtcblxuLy8gV2UgY2FuJ3QgbWF0Y2ggZnVuY3Rpb25zIHByb3BlcnR5LCBzbyBsZXQncyBub3QgZXZlbiB0cnkuXG5kZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnJlYXNvbi5mdW5jdGlvbjtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBzcGVjaWFsRXNjYXBlID0ge1xuXHRcdHBhdHRlcm46IC9cXFxcW1xcXFwoKXt9W1xcXV4kKyo/fC5dLyxcblx0XHRhbGlhczogJ2VzY2FwZSdcblx0fTtcblx0dmFyIGVzY2FwZSA9IC9cXFxcKD86eFtcXGRhLWZBLUZdezJ9fHVbXFxkYS1mQS1GXXs0fXx1XFx7W1xcZGEtZkEtRl0rXFx9fDBbMC03XXswLDJ9fFsxMjNdWzAtN117Mn18Y1thLXpBLVpdfC4pLztcblx0dmFyIGNoYXJTZXQgPSB7XG5cdFx0cGF0dGVybjogL1xcLnxcXFxcW3dzZF18XFxcXHBcXHtbXnt9XStcXH0vaSxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH07XG5cdHZhciBjaGFyU2V0V2l0aG91dERvdCA9IHtcblx0XHRwYXR0ZXJuOiAvXFxcXFt3c2RdfFxcXFxwXFx7W157fV0rXFx9L2ksXG5cdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHR9O1xuXG5cdHZhciByYW5nZUNoYXIgPSAnKD86W15cXFxcXFxcXC1dfCcgKyBlc2NhcGUuc291cmNlICsgJyknO1xuXHR2YXIgcmFuZ2UgPSBSZWdFeHAocmFuZ2VDaGFyICsgJy0nICsgcmFuZ2VDaGFyKTtcblxuXHQvLyB0aGUgbmFtZSBvZiBhIGNhcHR1cmluZyBncm91cFxuXHR2YXIgZ3JvdXBOYW1lID0ge1xuXHRcdHBhdHRlcm46IC8oPHwnKVtePD4nXSsoPz1bPiddJCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMucmVnZXggPSB7XG5cdFx0J2NoYXItY2xhc3MnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcXFxcXCkqKVxcWyg/OlteXFxcXFxcXV18XFxcXFtcXHNcXFNdKSpcXF0vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnY2hhci1jbGFzcy1uZWdhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXFspXFxeLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjaGFyLWNsYXNzLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFxbfFxcXSQvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdyYW5nZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiByYW5nZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdlc2NhcGUnOiBlc2NhcGUsXG5cdFx0XHRcdFx0XHQncmFuZ2UtcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8tLyxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdvcGVyYXRvcidcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzcGVjaWFsLWVzY2FwZSc6IHNwZWNpYWxFc2NhcGUsXG5cdFx0XHRcdCdjaGFyLXNldCc6IGNoYXJTZXRXaXRob3V0RG90LFxuXHRcdFx0XHQnZXNjYXBlJzogZXNjYXBlXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnc3BlY2lhbC1lc2NhcGUnOiBzcGVjaWFsRXNjYXBlLFxuXHRcdCdjaGFyLXNldCc6IGNoYXJTZXQsXG5cdFx0J2JhY2tyZWZlcmVuY2UnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGEgYmFja3JlZmVyZW5jZSB3aGljaCBpcyBub3QgYW4gb2N0YWwgZXNjYXBlXG5cdFx0XHRcdHBhdHRlcm46IC9cXFxcKD8hWzEyM11bMC03XXsyfSlbMS05XS8sXG5cdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXFxcazxbXjw+J10rPi8sXG5cdFx0XHRcdGFsaWFzOiAna2V5d29yZCcsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdncm91cC1uYW1lJzogZ3JvdXBOYW1lXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdhbmNob3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvWyReXXxcXFxcW0FCYkdael0vLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCdlc2NhcGUnOiBlc2NhcGUsXG5cdFx0J2dyb3VwJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBodHRwczovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvMTAvZG9jcy9hcGkvamF2YS91dGlsL3JlZ2V4L1BhdHRlcm4uaHRtbFxuXHRcdFx0XHQvLyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9kb3RuZXQvc3RhbmRhcmQvYmFzZS10eXBlcy9yZWd1bGFyLWV4cHJlc3Npb24tbGFuZ3VhZ2UtcXVpY2stcmVmZXJlbmNlP3ZpZXc9bmV0ZnJhbWV3b3JrLTQuNy4yI2dyb3VwaW5nLWNvbnN0cnVjdHNcblxuXHRcdFx0XHQvLyAoKSwgKD88bmFtZT4pLCAoPyduYW1lJyksICg/PiksICg/OiksICg/PSksICg/ISksICg/PD0pLCAoPzwhKSwgKD9pcy1tKSwgKD9pLW06KVxuXHRcdFx0XHRwYXR0ZXJuOiAvXFwoKD86XFw/KD86PFtePD4nXSs+fCdbXjw+J10rJ3xbPjpdfDw/Wz0hXXxbaWRtbnN1eFVdKyg/Oi1baWRtbnN1eFVdKyk/Oj8pKT8vLFxuXHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2dyb3VwLW5hbWUnOiBncm91cE5hbWVcblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcKS8sXG5cdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQncXVhbnRpZmllcic6IHtcblx0XHRcdHBhdHRlcm46IC8oPzpbKyo/XXxcXHtcXGQrKD86LFxcZCopP1xcfSlbPytdPy8sXG5cdFx0XHRhbGlhczogJ251bWJlcidcblx0XHR9LFxuXHRcdCdhbHRlcm5hdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC9cXHwvLFxuXHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdH1cblx0fTtcblxufShQcmlzbSkpO1xuXG4vLyBodHRwczovL3d3dy5vcGVucG9saWN5YWdlbnQub3JnL2RvY3MvbGF0ZXN0L3BvbGljeS1yZWZlcmVuY2UvXG5cblByaXNtLmxhbmd1YWdlcy5yZWdvID0ge1xuXHQnY29tbWVudCc6IC8jLiovLFxuXHQncHJvcGVydHknOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXC5dKSg/OlwiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcInxgW15gXSpgfFxcYlthLXpfXVxcdypcXGIpKD89XFxzKjooPyE9KSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVwiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcInxgW15gXSpgLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdrZXl3b3JkJzogL1xcYig/OmFzfGRlZmF1bHR8ZWxzZXxpbXBvcnR8bm90fG51bGx8cGFja2FnZXxzZXQoPz1cXHMqXFwoKXxzb21lfHdpdGgpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3KlxcYig/OlxccypcXC5cXHMqXFxiW2Etel9dXFx3KlxcYikqKD89XFxzKlxcKCkvaSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCduYW1lc3BhY2UnOiAvXFxiXFx3K1xcYig/PVxccypcXC4pLyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0fVxuXHR9LFxuXG5cdCdudW1iZXInOiAvLT9cXGJcXGQrKD86XFwuXFxkKyk/KD86ZVsrLV0/XFxkKyk/XFxiL2ksXG5cdCdvcGVyYXRvcic6IC9bLSsqLyV8Jl18Wzw+Oj1dPT98IT18XFxiX1xcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC9bLDsuXFxbXFxde30oKV0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucmVucHkgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSMuKy8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhcIlwiXCJ8JycnKVtcXHNcXFNdKz9cXDF8KFwifCcpKD86XFxcXC58KD8hXFwyKVteXFxcXF0pKlxcMnwoPzpeIz8oPzooPzpbMC05YS1mQS1GXSl7M318WzAtOWEtZkEtRl17Nn0pJCkvbSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnZnVuY3Rpb24nOiAvXFxiW2Etel9dXFx3Kig/PVxcKCkvaSxcblxuXHQncHJvcGVydHknOiAvXFxiKD86VXBkYXRlfFVwZGF0ZVZlcnNpb258YWN0aW9ufGFjdGl2YXRlX3NvdW5kfGFkdl9udmxfdHJhbnNpdGlvbnxhZnRlcl9sb2FkX3RyYW5zaXRpb258YWxpZ258YWxwaGF8YWx0fGFuY2hvcnxhbnRpYWxpYXN8YXJlYXxhdXRvfGJhY2tncm91bmR8YmFyX2ludmVydHxiYXJfcmVzaXppbmd8YmFyX3ZlcnRpY2FsfGJsYWNrX2NvbG9yfGJvbGR8Ym90dG9tX2Jhcnxib3R0b21fZ3V0dGVyfGJvdHRvbV9tYXJnaW58Ym90dG9tX3BhZGRpbmd8Ym94X3JldmVyc2V8Ym94X3dyYXB8Y2FuX3VwZGF0ZXxjYXJldHxjaGlsZHxjb2xvcnxjcm9wfGRlZmF1bHRfYWZtX2VuYWJsZXxkZWZhdWx0X2FmbV90aW1lfGRlZmF1bHRfZnVsbHNjcmVlbnxkZWZhdWx0X3RleHRfY3BzfGRldmVsb3BlcnxkaXJlY3RvcnlfbmFtZXxkcmFnX2hhbmRsZXxkcmFnX2pvaW5lZHxkcmFnX25hbWV8ZHJhZ19yYWlzZXxkcmFnZ2FibGV8ZHJhZ2dlZHxkcm9wX3NoYWRvd3xkcm9wX3NoYWRvd19jb2xvcnxkcm9wcGFibGV8ZHJvcHBlZHxlYXNlaW58ZWFzZW91dHxlZGdlc2Nyb2xsfGVuZF9nYW1lX3RyYW5zaXRpb258ZW5kX3NwbGFzaF90cmFuc2l0aW9ufGVudGVyX3JlcGxheV90cmFuc2l0aW9ufGVudGVyX3NvdW5kfGVudGVyX3RyYW5zaXRpb258ZW50ZXJfeWVzbm9fdHJhbnNpdGlvbnxleGVjdXRhYmxlX25hbWV8ZXhpdF9yZXBsYXlfdHJhbnNpdGlvbnxleGl0X3NvdW5kfGV4aXRfdHJhbnNpdGlvbnxleGl0X3llc25vX3RyYW5zaXRpb258ZmFkZWlufGZhZGVvdXR8Zmlyc3RfaW5kZW50fGZpcnN0X3NwYWNpbmd8Zml0X2ZpcnN0fGZvY3VzfGZvY3VzX21hc2t8Zm9udHxmb3JlZ3JvdW5kfGdhbWVfbWFpbl90cmFuc2l0aW9ufGdldF9pbnN0YWxsZWRfcGFja2FnZXN8Z29vZ2xlX3BsYXlfa2V5fGdvb2dsZV9wbGF5X3NhbHR8Z3JvdW5kfGhhc19tdXNpY3xoYXNfc291bmR8aGFzX3ZvaWNlfGhlaWdodHxoZWxwfGhpbnRpbmd8aG92ZXJ8aG92ZXJfYmFja2dyb3VuZHxob3Zlcl9jb2xvcnxob3Zlcl9zb3VuZHxob3ZlcmVkfGh5cGVybGlua19mdW5jdGlvbnN8aWRsZXxpZGxlX2NvbG9yfGltYWdlX3N0eWxlfGluY2x1ZGVfdXBkYXRlfGluc2Vuc2l0aXZlfGluc2Vuc2l0aXZlX2JhY2tncm91bmR8aW5zZW5zaXRpdmVfY29sb3J8aW5zaWRlfGludHJhX3RyYW5zaXRpb258aXRhbGljfGp1c3RpZnl8a2VybmluZ3xrZXlib2FyZF9mb2N1c3xsYW5ndWFnZXxsYXllcl9jbGlwcGluZ3xsYXllcnN8bGF5b3V0fGxlZnRfYmFyfGxlZnRfZ3V0dGVyfGxlZnRfbWFyZ2lufGxlZnRfcGFkZGluZ3xsZW5ndGh8bGluZV9sZWFkaW5nfGxpbmVfb3ZlcmxhcF9zcGxpdHxsaW5lX3NwYWNpbmd8bGluZWFyfG1haW5fZ2FtZV90cmFuc2l0aW9ufG1haW5fbWVudV9tdXNpY3xtYXhpbXVtfG1pbl93aWR0aHxtaW5pbXVtfG1pbndpZHRofG1vZGFsfG1vdXNlfG1vdXNld2hlZWx8bmFtZXxuYXJyYXRvcl9tZW51fG5ld2xpbmVfaW5kZW50fG52bF9hZHZfdHJhbnNpdGlvbnxvZmZzZXR8b3JkZXJfcmV2ZXJzZXxvdXRsaW5lc3xvdmVybGF5X2Z1bmN0aW9uc3xwb3N8cG9zaXRpb258cHJlZml4fHJhZGl1c3xyYW5nZXxyZXN0X2luZGVudHxyaWdodF9iYXJ8cmlnaHRfZ3V0dGVyfHJpZ2h0X21hcmdpbnxyaWdodF9wYWRkaW5nfHJvdGF0ZXxyb3RhdGVfcGFkfHJ1Ynlfc3R5bGV8c2FtcGxlX3NvdW5kfHNhdmVfZGlyZWN0b3J5fHNheV9hdHRyaWJ1dGVfdHJhbnNpdGlvbnxzY3JlZW5faGVpZ2h0fHNjcmVlbl93aWR0aHxzY3JvbGxiYXJzfHNlbGVjdGVkX2hvdmVyfHNlbGVjdGVkX2hvdmVyX2NvbG9yfHNlbGVjdGVkX2lkbGV8c2VsZWN0ZWRfaWRsZV9jb2xvcnxzZWxlY3RlZF9pbnNlbnNpdGl2ZXxzaG93X3NpZGVfaW1hZ2V8c2hvd190d29fd2luZG93fHNpZGVfc3BhY2luZ3xzaWRlX3hwb3N8c2lkZV95cG9zfHNpemV8c2l6ZV9ncm91cHxzbG93X2Nwc3xzbG93X2Nwc19tdWx0aXBsaWVyfHNwYWNpbmd8c3RyaWtldGhyb3VnaHxzdWJwaXhlbHx0ZXh0X2FsaWdufHRleHRfc3R5bGV8dGV4dF94cG9zfHRleHRfeV9mdWRnZXx0ZXh0X3lwb3N8dGh1bWJ8dGh1bWJfb2Zmc2V0fHRodW1iX3NoYWRvd3x0aHVtYm5haWxfaGVpZ2h0fHRodW1ibmFpbF93aWR0aHx0aW1lfHRvcF9iYXJ8dG9wX2d1dHRlcnx0b3BfbWFyZ2lufHRvcF9wYWRkaW5nfHRyYW5zbGF0aW9uc3x1bmRlcmxpbmV8dW5zY3JvbGxhYmxlfHVwZGF0ZXx2YWx1ZXx2ZXJzaW9ufHZlcnNpb25fbmFtZXx2ZXJzaW9uX3R1cGxlfHZlcnRpY2FsfHdpZHRofHdpbmRvd19oaWRlX3RyYW5zaXRpb258d2luZG93X2ljb258d2luZG93X2xlZnRfcGFkZGluZ3x3aW5kb3dfc2hvd190cmFuc2l0aW9ufHdpbmRvd190aXRsZXx3aW5kb3dzX2ljb258eGFkanVzdG1lbnR8eGFsaWdufHhhbmNob3J8eGFuY2hvcmFyb3VuZHx4YXJvdW5kfHhjZW50ZXJ8eGZpbGx8eGluaXRpYWx8eG1hcmdpbnx4bWF4aW11bXx4bWluaW11bXx4b2Zmc2V0fHhvZnNzZXR8eHBhZGRpbmd8eHBvc3x4c2l6ZXx4em9vbXx5YWRqdXN0bWVudHx5YWxpZ258eWFuY2hvcnx5YW5jaG9yYXJvdW5kfHlhcm91bmR8eWNlbnRlcnx5ZmlsbHx5aW5pdGlhbHx5bWFyZ2lufHltYXhpbXVtfHltaW5pbXVtfHlvZmZzZXR8eXBhZGRpbmd8eXBvc3x5c2l6ZXx5c2l6ZXh5c2l6ZXx5em9vbXx6b29tfHpvcmRlcilcXGIvLFxuXG5cdCd0YWcnOiAvXFxiKD86YmFyfGJsb2NrfGJ1dHRvbnxidXR0b3NjcmVlbm58ZHJhZ3xkcmFnZ3JvdXB8Zml4ZWR8ZnJhbWV8Z3JpZHxbaHZdYm94fGhvdGJhcnxob3RzcG90fGltYWdlfGltYWdlYnV0dG9ufGltYWdlbWFwfGlucHV0fGtleXxsYWJlbHxtZW51fG1tX21lbnVfZnJhbWV8bW91c2VhcmVhfG52bHxwYXJhbGxlbHxzY3JlZW58c2VsZnxzaWRlfHRhZ3x0ZXh0fHRleHRidXR0b258dGltZXJ8dmJhcnx2aWV3cG9ydHx3aW5kb3cpXFxifFxcJC8sXG5cblx0J2tleXdvcmQnOiAvXFxiKD86Tm9uZXxhZGR8YWRqdXN0bWVudHxhbGlnbmFyb3VuZHxhbGxvd3xhbmdsZXxhbmltYXRpb258YXJvdW5kfGFzfGFzc2VydHxiZWhpbmR8Ym94X2xheW91dHxicmVha3xidWlsZHxjYWNoZXxjYWxsfGNlbnRlcnxjaGFuZ2VkfGNoaWxkX3NpemV8Y2hvaWNlfGNpcmNsZXN8Y2xhc3N8Y2xlYXJ8Y2xpY2tlZHxjbGlwcGluZ3xjbG9ja3dpc2V8Y29uZmlnfGNvbnRhaW5zfGNvbnRpbnVlfGNvcm5lcjF8Y29ybmVyMnxjb3VudGVyY2xvY2t3aXNlfGRlZnxkZWZhdWx0fGRlZmluZXxkZWx8ZGVsYXl8ZGlzYWJsZWR8ZGlzYWJsZWRfdGV4dHxkaXNzb2x2ZXxlbGlmfGVsc2V8ZXZlbnR8ZXhjZXB0fGV4Y2x1ZGV8ZXhlY3xleHByZXNzaW9ufGZhZGV8ZmluYWxseXxmb3J8ZnJvbXxmdW5jdGlvbnxnbG9iYWx8Z21fcm9vdHxoYXN8aGlkZXxpZHxpZnxpbXBvcnR8aW58aW5pdHxpc3xqdW1wfGtub3R8bGFtYmRhfGxlZnR8bGVzc19yb3VuZGVkfG1tX3Jvb3R8bW92aWV8bXVzaWN8bnVsbHxvbnxvbmxheWVyfHBhc3N8cGF1c2V8cGVyc2lzdGVudHxwbGF5fHByaW50fHB5dGhvbnxxdWV1ZXxyYWlzZXxyYW5kb218cmVucHl8cmVwZWF0fHJldHVybnxyaWdodHxyb3VuZGVkX3dpbmRvd3xzY2VuZXxzY29wZXxzZXR8c2hvd3xzbG93fHNsb3dfYWJvcnRhYmxlfHNsb3dfZG9uZXxzb3VuZHxzdG9wfHN0b3JlfHN0eWxlfHN0eWxlX2dyb3VwfHN1YnN0aXR1dGV8c3VmZml4fHRoZW1lfHRyYW5zZm9ybXx0cmFuc2Zvcm1fYW5jaG9yfHRyYW5zcG9zZXx0cnl8dWl8dW5ob3ZlcmVkfHVwZGF0ZXJ8dXNlfHZvaWNlfHdoaWxlfHdpZGdldHx3aWRnZXRfaG92ZXJ8d2lkZ2V0X3NlbGVjdGVkfHdpZGdldF90ZXh0fHlpZWxkKVxcYi8sXG5cblx0J2Jvb2xlYW4nOiAvXFxiKD86W0ZmXWFsc2V8W1R0XXJ1ZSlcXGIvLFxuXG5cdCdudW1iZXInOiAvKD86XFxiKD86MFtib10pPyg/Oig/OlxcZHwweFtcXGRhLWZdKVtcXGRhLWZdKig/OlxcLlxcZCopPyl8XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT9qPy9pLFxuXG5cdCdvcGVyYXRvcic6IC9bLSslPV09P3whPXxcXCpcXCo/PT98XFwvXFwvPz0/fDxbPD0+XT98Pls9Pl0/fFsmfF5+XXxcXGIoPzphbmR8YXR8bm90fG9yfHdpdGgpXFxiLyxcblxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMucnB5ID0gUHJpc20ubGFuZ3VhZ2VzLnJlbnB5O1xuXG5QcmlzbS5sYW5ndWFnZXMucmVzY3JpcHQgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NoYXInOiB7IHBhdHRlcm46IC8nKD86W15cXHJcXG5cXFxcXXxcXFxcKD86LnxcXHcrKSknLywgZ3JlZWR5OiB0cnVlIH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8W15cXFxcXFxyXFxuXCJdKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzogL1xcYltBLVpdXFx3KnxAW2Etei5dKnwjW0EtWmEtel1cXHcqfCNcXGQvLFxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogL1thLXpBLVpdXFx3Kig/PVxcKCl8KFxcLilbYS16XVxcdyovLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdH0sXG5cdCdudW1iZXInOiAvKD86XFxiMHgoPzpbXFxkYS1mXSsoPzpcXC5bXFxkYS1mXSopP3xcXC5bXFxkYS1mXSspKD86cFsrLV0/XFxkKyk/fCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplWystXT9cXGQrKT8pW2Z1bF17MCw0fS9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdhdHRyLXZhbHVlJzogL1tBLVphLXpdXFx3Kig/PT0pLyxcblx0J2NvbnN0YW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXFxidHlwZVxccyspW2Etel1cXHcqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCd0YWcnOiB7XG5cdFx0cGF0dGVybjogLyg8KVthLXpdXFx3KnwoPzo8XFwvKVthLXpdXFx3Ki8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdvcGVyYXRvcic6IC88fD58XFwvLyxcblx0XHR9LFxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphbmR8YXN8YXNzZXJ0fGJlZ2lufGJvb2x8Y2xhc3N8Y29uc3RyYWludHxkb3xkb25lfGRvd250b3xlbHNlfGVuZHxleGNlcHRpb258ZXh0ZXJuYWx8ZmxvYXR8Zm9yfGZ1bnxmdW5jdGlvbnxpZnxpbnxpbmNsdWRlfGluaGVyaXR8aW5pdGlhbGl6ZXJ8aW50fGxhenl8bGV0fG1ldGhvZHxtb2R1bGV8bXV0YWJsZXxuZXd8bm9ucmVjfG9iamVjdHxvZnxvcGVufG9yfHByaXZhdGV8cmVjfHN0cmluZ3xzd2l0Y2h8dGhlbnx0b3x0cnl8dHlwZXx3aGVufHdoaWxlfHdpdGgpXFxiLyxcblx0J29wZXJhdG9yJzogL1xcLnszfXw6Wzo9XT98XFx8PnwtPnw9KD86PT0/fD4pP3w8PT98Pj0/fFt8Xj8nIyF+YF18WytcXC0qXFwvXVxcLj98XFxiKD86YXNyfGxhbmR8bG9yfGxzbHxsc3J8bHhvcnxtb2QpXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1soKXt9W1xcXSw7Ll0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdyZXNjcmlwdCcsICdzdHJpbmcnLCB7XG5cdCd0ZW1wbGF0ZS1zdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL2AoPzpcXFxcW1xcc1xcU118XFwkXFx7KD86W157fV18XFx7KD86W157fV18XFx7W159XSpcXH0pKlxcfSkrXFx9fCg/IVxcJFxceylbXlxcXFxgXSkqYC8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3RlbXBsYXRlLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXmB8YCQvLFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdH0sXG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKVxcJFxceyg/Oltee31dfFxceyg/Oltee31dfFxce1tefV0qXFx9KSpcXH0pK1xcfS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL15cXCRcXHt8XFx9JC8sXG5cdFx0XHRcdFx0XHRhbGlhczogJ3RhZydcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHJlc3Q6IFByaXNtLmxhbmd1YWdlcy5yZXNjcmlwdFxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9LFxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5yZXMgPSBQcmlzbS5sYW5ndWFnZXMucmVzY3JpcHQ7XG5cblByaXNtLmxhbmd1YWdlcy5yZXN0ID0ge1xuXHQndGFibGUnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyheW1xcdCBdKikoPzpcXCtbPS1dKykrXFwrKD86XFxyP1xcbnxcXHIpKD86XFwxWyt8XS4rWyt8XSg/Olxccj9cXG58XFxyKSkrXFwxKD86XFwrWz0tXSspK1xcKy9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFx8fCg/OlxcK1s9LV0rKStcXCsvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKT0rIFsgPV0qPSg/Oig/Olxccj9cXG58XFxyKVxcMS4rKSsoPzpcXHI/XFxufFxccilcXDE9KyBbID1dKj0oPz0oPzpcXHI/XFxufFxccil7Mn18XFxzKiQpL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bPS1dKy9cblx0XHRcdH1cblx0XHR9XG5cdF0sXG5cblx0Ly8gRGlyZWN0aXZlLWxpa2UgcGF0dGVybnNcblxuXHQnc3Vic3RpdHV0aW9uLWRlZic6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qXFwuXFwuIClcXHwoPzpbXnxcXHNdKD86W158XSpbXnxcXHNdKT8pXFx8IFteOl0rOjovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3N1YnN0aXR1dGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL15cXHwoPzpbXnxcXHNdfFtefFxcc11bXnxdKltefFxcc10pXFx8Lyxcblx0XHRcdFx0YWxpYXM6ICdhdHRyLXZhbHVlJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXHx8XFx8JC9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oICkoPyEgKVteOl0rOjovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2Z1bmN0aW9uJyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzo6JC9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J2xpbmstdGFyZ2V0JzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSpcXC5cXC4gKVxcW1teXFxdXStcXF0vbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXFt8XFxdJC9cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSpcXC5cXC4gKV8oPzpgW15gXStgfCg/OlteOlxcXFxdfFxcXFwuKSspOi9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXl98OiQvXG5cdFx0XHR9XG5cdFx0fVxuXHRdLFxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSpcXC5cXC4gKVteOl0rOjovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogLzo6JC9cblx0XHR9XG5cdH0sXG5cdCdjb21tZW50Jzoge1xuXHRcdC8vIFRoZSB0d28gYWx0ZXJuYXRpdmVzIHRyeSB0byBwcmV2ZW50IGhpZ2hsaWdodGluZyBvZiBibGFuayBjb21tZW50c1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSpcXC5cXC4pKD86KD86IC4rKT8oPzooPzpcXHI/XFxufFxccikuKykrfCAuKykoPz0oPzpcXHI/XFxufFxccil7Mn18JCkvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cblx0J3RpdGxlJzogW1xuXHRcdC8vIE92ZXJsaW5lZCBhbmQgdW5kZXJsaW5lZFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9eKChbIVwiIyQlJicoKSorLFxcLS5cXC86Ozw9Pj9AXFxbXFxcXFxcXV5fYHt8fX5dKVxcMispKD86XFxyP1xcbnxcXHIpLisoPzpcXHI/XFxufFxccilcXDEkL20sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15bIVwiIyQlJicoKSorLFxcLS5cXC86Ozw9Pj9AXFxbXFxcXFxcXV5fYHt8fX5dK3xbIVwiIyQlJicoKSorLFxcLS5cXC86Ozw9Pj9AXFxbXFxcXFxcXV5fYHt8fX5dKyQvLFxuXHRcdFx0XHQnaW1wb3J0YW50JzogLy4rL1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBVbmRlcmxpbmVkIG9ubHlcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58KD86XFxyP1xcbnxcXHIpezJ9KS4rKD86XFxyP1xcbnxcXHIpKFshXCIjJCUmJygpKissXFwtLlxcLzo7PD0+P0BcXFtcXFxcXFxdXl9ge3x9fl0pXFwyKyg/PVxccj9cXG58XFxyfCQpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1shXCIjJCUmJygpKissXFwtLlxcLzo7PD0+P0BcXFtcXFxcXFxdXl9ge3x9fl0rJC8sXG5cdFx0XHRcdCdpbXBvcnRhbnQnOiAvLisvXG5cdFx0XHR9XG5cdFx0fVxuXHRdLFxuXHQnaHInOiB7XG5cdFx0cGF0dGVybjogLygoPzpcXHI/XFxufFxccil7Mn0pKFshXCIjJCUmJygpKissXFwtLlxcLzo7PD0+P0BcXFtcXFxcXFxdXl9ge3x9fl0pXFwyezMsfSg/PSg/Olxccj9cXG58XFxyKXsyfSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0fSxcblx0J2ZpZWxkJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopOlteOlxcclxcbl0rOig/PSApL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2F0dHItbmFtZSdcblx0fSxcblx0J2NvbW1hbmQtbGluZS1vcHRpb24nOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKikoPzpbKy1dW2EtelxcZF18KD86LS18XFwvKVthLXpcXGQtXSspKD86WyA9XSg/OlthLXpdW1xcdy1dKnw8W148Pl0rPikpPyg/OiwgKD86WystXVthLXpcXGRdfCg/Oi0tfFxcLylbYS16XFxkLV0rKSg/OlsgPV0oPzpbYS16XVtcXHctXSp8PFtePD5dKz4pKT8pKig/PSg/Olxccj9cXG58XFxyKT8gezIsfVxcUykvaW0sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3N5bWJvbCdcblx0fSxcblx0J2xpdGVyYWwtYmxvY2snOiB7XG5cdFx0cGF0dGVybjogLzo6KD86XFxyP1xcbnxcXHIpezJ9KFsgXFx0XSspKD8hWyBcXHRdKS4rKD86KD86XFxyP1xcbnxcXHIpXFwxLispKi8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnbGl0ZXJhbC1ibG9jay1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL146Oi8sXG5cdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQncXVvdGVkLWxpdGVyYWwtYmxvY2snOiB7XG5cdFx0cGF0dGVybjogLzo6KD86XFxyP1xcbnxcXHIpezJ9KFshXCIjJCUmJygpKissXFwtLlxcLzo7PD0+P0BcXFtcXFxcXFxdXl9ge3x9fl0pLiooPzooPzpcXHI/XFxufFxccilcXDEuKikqLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdsaXRlcmFsLWJsb2NrLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXig/Ojo6fChbIVwiIyQlJicoKSorLFxcLS5cXC86Ozw9Pj9AXFxbXFxcXFxcXV5fYHt8fX5dKVxcMSopL20sXG5cdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQnbGlzdC1idWxsZXQnOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKikoPzpbKitcXC1cdTIwMjJcdTIwMjNcdTIwNDNdfFxcKD8oPzpcXGQrfFthLXpdfFtpdnhkY2xtXSspXFwpfCg/OlxcZCt8W2Etel18W2l2eGRjbG1dKylcXC4pKD89ICkvaW0sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHR9LFxuXHQnZG9jdGVzdC1ibG9jayc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKT4+PiAuKyg/Oig/Olxccj9cXG58XFxyKS4rKSovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL14+Pj4vXG5cdFx0fVxuXHR9LFxuXG5cdCdpbmxpbmUnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFtcXHNcXC06XFwvJ1wiPChcXFt7XSkoPzo6W146XSs6YC4qP2B8YC4qP2A6W146XSs6fChcXCpcXCo/fGBgP3xcXHwpKD8hXFxzKSg/Oig/IVxcMikuKSpcXFNcXDIoPz1bXFxzXFwtLiw6OyE/XFxcXFxcLydcIilcXF19XXwkKSkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2JvbGQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheXFwqXFwqKS4rKD89XFwqXFwqJCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0J2l0YWxpYyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXCopLisoPz1cXCokKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaW5saW5lLWxpdGVyYWwnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheYGApLisoPz1gYCQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncm9sZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXjpbXjpdKzp8OlteOl0rOiQvLFxuXHRcdFx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL146fDokL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0J2ludGVycHJldGVkLXRleHQnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheYCkuKyg/PWAkKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRhbGlhczogJ2F0dHItdmFsdWUnXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzdWJzdGl0dXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyheXFx8KS4rKD89XFx8JCkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdhdHRyLXZhbHVlJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwqXFwqP3xgYD98XFx8L1xuXHRcdFx0fVxuXHRcdH1cblx0XSxcblxuXHQnbGluayc6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvXFxbW15cXFtcXF1dK1xcXV8oPz1bXFxzXFwtLiw6OyE/XFxcXFxcLydcIilcXF19XXwkKS8sXG5cdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15cXFt8XFxdXyQvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKD86XFxiW2EtelxcZF0rKD86W18uOitdW2EtelxcZF0rKSpfP198YFteYF0rYF8/X3xfYFteYF0rYCkoPz1bXFxzXFwtLiw6OyE/XFxcXFxcLydcIilcXF19XXwkKS9pLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXz9gfGAkfGA/Xz9fJC9cblx0XHRcdH1cblx0XHR9XG5cdF0sXG5cblx0Ly8gTGluZSBibG9jayBzdGFydCxcblx0Ly8gcXVvdGUgYXR0cmlidXRpb24sXG5cdC8vIGV4cGxpY2l0IG1hcmt1cCBzdGFydCxcblx0Ly8gYW5kIGFub255bW91cyBoeXBlcmxpbmsgdGFyZ2V0IHNob3J0Y3V0IChfXylcblx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSopKD86XFx8KD89IHwkKXwoPzotLS0/fFx1MjAxNHxcXC5cXC58X18pKD89ICl8XFwuXFwuJCkvbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH1cbn07XG5cblByaXNtLmxhbmd1YWdlcy5yaXAgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8jLiovLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdjaGFyJzoge1xuXHRcdHBhdHRlcm46IC9cXEJgW15cXHNgJ1wiLC46OyNcXC9cXFxcKCk8PlxcW1xcXXt9XVxcYi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhcInwnKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdyZWdleCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W14vXSlcXC8oPyFcXC8pKD86XFxbW15cXG5cXHJcXF1dKlxcXXxcXFxcLnxbXi9cXFxcXFxyXFxuXFxbXSkrXFwvKD89XFxzKig/OiR8W1xcclxcbiwuO30pXSkpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdrZXl3b3JkJzogLyg/Oj0+fC0+KXxcXGIoPzpjYXNlfGNhdGNofGNsYXNzfGVsc2V8ZXhpdHxmaW5hbGx5fGlmfHJhaXNlfHJldHVybnxzd2l0Y2h8dHJ5KVxcYi8sXG5cblx0J2J1aWx0aW4nOiAvQHxcXGJTeXN0ZW1cXGIvLFxuXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblxuXHQnZGF0ZSc6IC9cXGJcXGR7NH0tXFxkezJ9LVxcZHsyfVxcYi8sXG5cdCd0aW1lJzogL1xcYlxcZHsyfTpcXGR7Mn06XFxkezJ9XFxiLyxcblx0J2RhdGV0aW1lJzogL1xcYlxcZHs0fS1cXGR7Mn0tXFxkezJ9VFxcZHsyfTpcXGR7Mn06XFxkezJ9XFxiLyxcblxuXHQnc3ltYm9sJzogLzpbXlxcZFxcc2AnXCIsLjo7I1xcL1xcXFwoKTw+XFxbXFxde31dW15cXHNgJ1wiLC46OyNcXC9cXFxcKCk8PlxcW1xcXXt9XSovLFxuXHQnbnVtYmVyJzogL1srLV0/XFxiKD86XFxkK1xcLlxcZCt8XFxkKylcXGIvLFxuXG5cdCdwdW5jdHVhdGlvbic6IC8oPzpcXC57MiwzfSl8W2AsLjo7PVxcL1xcXFwoKTw+XFxbXFxde31dLyxcblxuXHQncmVmZXJlbmNlJzogL1teXFxkXFxzYCdcIiwuOjsjXFwvXFxcXCgpPD5cXFtcXF17fV1bXlxcc2AnXCIsLjo7I1xcL1xcXFwoKTw+XFxbXFxde31dKi9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5yb2JvY29uZiA9IHtcblx0J2NvbW1lbnQnOiAvIy4qLyxcblx0J2tleXdvcmQnOiB7XG5cdFx0J3BhdHRlcm4nOiAvKF58XFxzKSg/Oig/OmV4dGVybmFsfGltcG9ydClcXGJ8KD86ZmFjZXR8aW5zdGFuY2Ugb2YpKD89WyBcXHRdK1tcXHctXStbIFxcdF0qXFx7KSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2NvbXBvbmVudCc6IHtcblx0XHRwYXR0ZXJuOiAvW1xcdy1dKyg/PVsgXFx0XSpcXHspLyxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHR9LFxuXHQncHJvcGVydHknOiAvW1xcdy4tXSsoPz1bIFxcdF0qOikvLFxuXHQndmFsdWUnOiB7XG5cdFx0cGF0dGVybjogLyg9WyBcXHRdKig/IVsgXFx0XSkpW14sO10rLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnYXR0ci12YWx1ZSdcblx0fSxcblx0J29wdGlvbmFsJzoge1xuXHRcdHBhdHRlcm46IC9cXChvcHRpb25hbFxcKS8sXG5cdFx0YWxpYXM6ICdidWlsdGluJ1xuXHR9LFxuXHQnd2lsZGNhcmQnOiB7XG5cdFx0cGF0dGVybjogLyhcXC4pXFwqLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9be30sLjs6PV0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGNvbW1lbnQgPSB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKnwgezJ9fFxcdCkjLiovbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9O1xuXG5cdHZhciB2YXJpYWJsZSA9IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXFxcXSkoPzpcXFxcezJ9KSopWyRAJiVdXFx7KD86W157fVxcclxcbl18XFx7W157fVxcclxcbl0qXFx9KSpcXH0vLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXlskQCYlXVxce3xcXH0kL1xuXHRcdH1cblx0fTtcblxuXHRmdW5jdGlvbiBjcmVhdGVTZWN0aW9uKG5hbWUsIGluc2lkZSkge1xuXHRcdHZhciBleHRlbmRlY0luc2lkZSA9IHt9O1xuXG5cdFx0ZXh0ZW5kZWNJbnNpZGVbJ3NlY3Rpb24taGVhZGVyJ10gPSB7XG5cdFx0XHRwYXR0ZXJuOiAvXiA/XFwqezN9Lis/XFwqezN9Lyxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9O1xuXG5cdFx0Ly8gY29weSBpbnNpZGUgdG9rZW5zXG5cdFx0Zm9yICh2YXIgdG9rZW4gaW4gaW5zaWRlKSB7XG5cdFx0XHRleHRlbmRlY0luc2lkZVt0b2tlbl0gPSBpbnNpZGVbdG9rZW5dO1xuXHRcdH1cblxuXHRcdGV4dGVuZGVjSW5zaWRlWyd0YWcnXSA9IHtcblx0XHRcdHBhdHRlcm46IC8oW1xcclxcbl0oPzogezJ9fFxcdClbIFxcdF0qKVxcW1stXFx3XStcXF0vLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxbfFxcXS9cblx0XHRcdH1cblx0XHR9O1xuXHRcdGV4dGVuZGVjSW5zaWRlWyd2YXJpYWJsZSddID0gdmFyaWFibGU7XG5cdFx0ZXh0ZW5kZWNJbnNpZGVbJ2NvbW1lbnQnXSA9IGNvbW1lbnQ7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC9eID9cXCp7M31bIFxcdF0qPG5hbWU+WyBcXHRdKlxcKnszfSg/Oi58W1xcclxcbl0oPyFcXCp7M30pKSovLnNvdXJjZS5yZXBsYWNlKC88bmFtZT4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gbmFtZTsgfSksICdpbScpLFxuXHRcdFx0YWxpYXM6ICdzZWN0aW9uJyxcblx0XHRcdGluc2lkZTogZXh0ZW5kZWNJbnNpZGVcblx0XHR9O1xuXHR9XG5cblxuXHR2YXIgZG9jVGFnID0ge1xuXHRcdHBhdHRlcm46IC8oXFxbRG9jdW1lbnRhdGlvblxcXSg/OiB7Mn18XFx0KVsgXFx0XSopKD8hWyBcXHRdfCMpKD86LnwoPzpcXHJcXG4/fFxcbilbIFxcdF0qXFwuezN9KSsvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnXG5cdH07XG5cblx0dmFyIHRlc3ROYW1lTGlrZSA9IHtcblx0XHRwYXR0ZXJuOiAvKFtcXHJcXG5dID8pKD8hIykoPzpcXFMoPzpbIFxcdF1cXFMpKikrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3ZhcmlhYmxlJzogdmFyaWFibGVcblx0XHR9XG5cdH07XG5cblx0dmFyIHRlc3RQcm9wZXJ0eUxpa2UgPSB7XG5cdFx0cGF0dGVybjogLyhbXFxyXFxuXSg/OiB7Mn18XFx0KVsgXFx0XSopKD8hXFxbfFxcLnszfXwjKSg/OlxcUyg/OlsgXFx0XVxcUykqKSsvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndmFyaWFibGUnOiB2YXJpYWJsZVxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXNbJ3JvYm90ZnJhbWV3b3JrJ10gPSB7XG5cdFx0J3NldHRpbmdzJzogY3JlYXRlU2VjdGlvbignU2V0dGluZ3MnLCB7XG5cdFx0XHQnZG9jdW1lbnRhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogLyhbXFxyXFxuXSA/RG9jdW1lbnRhdGlvbig/OiB7Mn18XFx0KVsgXFx0XSopKD8hWyBcXHRdfCMpKD86LnwoPzpcXHJcXG4/fFxcbilbIFxcdF0qXFwuezN9KSsvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHRcdH0sXG5cdFx0XHQncHJvcGVydHknOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oW1xcclxcbl0gPykoPyFcXC57M318IykoPzpcXFMoPzpbIFxcdF1cXFMpKikrLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdH0pLFxuXHRcdCd2YXJpYWJsZXMnOiBjcmVhdGVTZWN0aW9uKCdWYXJpYWJsZXMnKSxcblx0XHQndGVzdC1jYXNlcyc6IGNyZWF0ZVNlY3Rpb24oJ1Rlc3QgQ2FzZXMnLCB7XG5cdFx0XHQndGVzdC1uYW1lJzogdGVzdE5hbWVMaWtlLFxuXHRcdFx0J2RvY3VtZW50YXRpb24nOiBkb2NUYWcsXG5cdFx0XHQncHJvcGVydHknOiB0ZXN0UHJvcGVydHlMaWtlXG5cdFx0fSksXG5cdFx0J2tleXdvcmRzJzogY3JlYXRlU2VjdGlvbignS2V5d29yZHMnLCB7XG5cdFx0XHQna2V5d29yZC1uYW1lJzogdGVzdE5hbWVMaWtlLFxuXHRcdFx0J2RvY3VtZW50YXRpb24nOiBkb2NUYWcsXG5cdFx0XHQncHJvcGVydHknOiB0ZXN0UHJvcGVydHlMaWtlXG5cdFx0fSksXG5cdFx0J3Rhc2tzJzogY3JlYXRlU2VjdGlvbignVGFza3MnLCB7XG5cdFx0XHQndGFzay1uYW1lJzogdGVzdE5hbWVMaWtlLFxuXHRcdFx0J2RvY3VtZW50YXRpb24nOiBkb2NUYWcsXG5cdFx0XHQncHJvcGVydHknOiB0ZXN0UHJvcGVydHlMaWtlXG5cdFx0fSksXG5cdFx0J2NvbW1lbnQnOiBjb21tZW50XG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnJvYm90ID0gUHJpc20ubGFuZ3VhZ2VzWydyb2JvdGZyYW1ld29yayddO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgbXVsdGlsaW5lQ29tbWVudCA9IC9cXC9cXCooPzpbXiovXXxcXCooPyFcXC8pfFxcLyg/IVxcKil8PHNlbGY+KSpcXCpcXC8vLnNvdXJjZTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCAyOyBpKyspIHtcblx0XHQvLyBzdXBwb3J0IDQgbGV2ZWxzIG9mIG5lc3RlZCBjb21tZW50c1xuXHRcdG11bHRpbGluZUNvbW1lbnQgPSBtdWx0aWxpbmVDb21tZW50LnJlcGxhY2UoLzxzZWxmPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBtdWx0aWxpbmVDb21tZW50OyB9KTtcblx0fVxuXHRtdWx0aWxpbmVDb21tZW50ID0gbXVsdGlsaW5lQ29tbWVudC5yZXBsYWNlKC88c2VsZj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gL1teXFxzXFxTXS8uc291cmNlOyB9KTtcblxuXG5cdFByaXNtLmxhbmd1YWdlcy5ydXN0ID0ge1xuXHRcdCdjb21tZW50JzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhefFteXFxcXF0pLy5zb3VyY2UgKyBtdWx0aWxpbmVDb21tZW50KSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcOl0pXFwvXFwvLiovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvYj9cIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxcIl0pKlwifGI/cigjKilcIig/OlteXCJdfFwiKD8hXFwxKSkqXCJcXDEvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnY2hhcic6IHtcblx0XHRcdHBhdHRlcm46IC9iPycoPzpcXFxcKD86eFswLTddW1xcZGEtZkEtRl18dVxceyg/OltcXGRhLWZBLUZdXyopezEsNn1cXH18Lil8W15cXFxcXFxyXFxuXFx0J10pJy8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdhdHRyaWJ1dGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvIyE/XFxbKD86W15cXFtcXF1cIl18XCIoPzpcXFxcW1xcc1xcU118W15cXFxcXCJdKSpcIikqXFxdLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnYXR0ci1uYW1lJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnc3RyaW5nJzogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQ2xvc3VyZSBwYXJhbXMgc2hvdWxkIG5vdCBiZSBjb25mdXNlZCB3aXRoIGJpdHdpc2UgT1IgfFxuXHRcdCdjbG9zdXJlLXBhcmFtcyc6IHtcblx0XHRcdHBhdHRlcm46IC8oWz0oLDpdXFxzKnxcXGJtb3ZlXFxzKilcXHxbXnxdKlxcfHxcXHxbXnxdKlxcfCg/PVxccyooPzpcXHt8LT4pKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjbG9zdXJlLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eXFx8fFxcfCQvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdHJlc3Q6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdsaWZldGltZS1hbm5vdGF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLydcXHcrLyxcblx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdH0sXG5cblx0XHQnZnJhZ21lbnQtc3BlY2lmaWVyJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXCRcXHcrOilbYS16XSsvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQndmFyaWFibGUnOiAvXFwkXFx3Ky8sXG5cblx0XHQnZnVuY3Rpb24tZGVmaW5pdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXFxiZm5cXHMrKVxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQndHlwZS1kZWZpbml0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzplbnVtfHN0cnVjdHx0cmFpdHx0eXBlfHVuaW9uKVxccyspXFx3Ky8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdjbGFzcy1uYW1lJ1xuXHRcdH0sXG5cdFx0J21vZHVsZS1kZWNsYXJhdGlvbic6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXGIoPzpjcmF0ZXxtb2QpXFxzKylbYS16XVthLXpfXFxkXSovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ25hbWVzcGFjZSdcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxiKD86Y3JhdGV8c2VsZnxzdXBlcilcXHMqKTo6XFxzKlthLXpdW2Etel9cXGRdKlxcYig/Olxccyo6Oig/OlxccypbYS16XVthLXpfXFxkXSpcXHMqOjopKik/Lyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICduYW1lc3BhY2UnLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOjovXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRdLFxuXHRcdCdrZXl3b3JkJzogW1xuXHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL3J1c3QtbGFuZy9yZWZlcmVuY2UvYmxvYi9tYXN0ZXIvc3JjL2tleXdvcmRzLm1kXG5cdFx0XHQvXFxiKD86U2VsZnxhYnN0cmFjdHxhc3xhc3luY3xhd2FpdHxiZWNvbWV8Ym94fGJyZWFrfGNvbnN0fGNvbnRpbnVlfGNyYXRlfGRvfGR5bnxlbHNlfGVudW18ZXh0ZXJufGZpbmFsfGZufGZvcnxpZnxpbXBsfGlufGxldHxsb29wfG1hY3JvfG1hdGNofG1vZHxtb3ZlfG11dHxvdmVycmlkZXxwcml2fHB1YnxyZWZ8cmV0dXJufHNlbGZ8c3RhdGljfHN0cnVjdHxzdXBlcnx0cmFpdHx0cnl8dHlwZXx0eXBlb2Z8dW5pb258dW5zYWZlfHVuc2l6ZWR8dXNlfHZpcnR1YWx8d2hlcmV8d2hpbGV8eWllbGQpXFxiLyxcblx0XHRcdC8vIHByaW1pdGl2ZXMgYW5kIHN0clxuXHRcdFx0Ly8gaHR0cHM6Ly9kb2MucnVzdC1sYW5nLm9yZy9zdGFibGUvcnVzdC1ieS1leGFtcGxlL3ByaW1pdGl2ZXMuaHRtbFxuXHRcdFx0L1xcYig/OmJvb2x8Y2hhcnxmKD86MzJ8NjQpfFt1aV0oPzo4fDE2fDMyfDY0fDEyOHxzaXplKXxzdHIpXFxiL1xuXHRcdF0sXG5cblx0XHQvLyBmdW5jdGlvbnMgY2FuIHRlY2huaWNhbGx5IHN0YXJ0IHdpdGggYW4gdXBwZXItY2FzZSBsZXR0ZXIsIGJ1dCB0aGlzIHdpbGwgaW50cm9kdWNlIGEgbG90IG9mIGZhbHNlIHBvc2l0aXZlc1xuXHRcdC8vIGFuZCBSdXN0J3MgbmFtaW5nIGNvbnZlbnRpb25zIHJlY29tbWVuZCBzbmFrZV9jYXNlIGFueXdheS5cblx0XHQvLyBodHRwczovL2RvYy5ydXN0LWxhbmcub3JnLzEuMC4wL3N0eWxlL3N0eWxlL25hbWluZy9SRUFETUUuaHRtbFxuXHRcdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKig/Ojo6XFxzKjx8XFwoKSkvLFxuXHRcdCdtYWNybyc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJcXHcrIS8sXG5cdFx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHRcdH0sXG5cdFx0J2NvbnN0YW50JzogL1xcYltBLVpfXVtBLVpfXFxkXStcXGIvLFxuXHRcdCdjbGFzcy1uYW1lJzogL1xcYltBLVpdXFx3KlxcYi8sXG5cblx0XHQnbmFtZXNwYWNlJzoge1xuXHRcdFx0cGF0dGVybjogLyg/OlxcYlthLXpdW2Etel9cXGRdKlxccyo6OlxccyopKlxcYlthLXpdW2Etel9cXGRdKlxccyo6Oig/IVxccyo8KS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogLzo6L1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBIZXgsIG9jdCwgYmluLCBkZWMgbnVtYmVycyB3aXRoIHZpc3VhbCBzZXBhcmF0b3JzIGFuZCB0eXBlIHN1ZmZpeFxuXHRcdCdudW1iZXInOiAvXFxiKD86MHhbXFxkQS1GYS1mXSg/Ol8/W1xcZEEtRmEtZl0pKnwwb1swLTddKD86Xz9bMC03XSkqfDBiWzAxXSg/Ol8/WzAxXSkqfCg/Oig/OlxcZCg/Ol8/XFxkKSopP1xcLik/XFxkKD86Xz9cXGQpKig/OltFZV1bKy1dP1xcZCspPykoPzpfPyg/OmYzMnxmNjR8W2l1XSg/Ojh8MTZ8MzJ8NjR8c2l6ZSk/KSk/XFxiLyxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogLy0+fFxcLlxcLj18XFwuezEsM318Ojp8W3t9W1xcXTsoKSw6XS8sXG5cdFx0J29wZXJhdG9yJzogL1stKypcXC8lIV5dPT98PVs9Pl0/fCZbJj1dP3xcXHxbfD1dP3w8PD89P3w+Pj89P3xbQD9dL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5ydXN0WydjbG9zdXJlLXBhcmFtcyddLmluc2lkZS5yZXN0ID0gUHJpc20ubGFuZ3VhZ2VzLnJ1c3Q7XG5cdFByaXNtLmxhbmd1YWdlcy5ydXN0WydhdHRyaWJ1dGUnXS5pbnNpZGVbJ3N0cmluZyddID0gUHJpc20ubGFuZ3VhZ2VzLnJ1c3RbJ3N0cmluZyddO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgc3RyaW5nUGF0dGVybiA9IC8oPzpcIig/OlwiXCJ8W15cIl0pKlwiKD8hXCIpfCcoPzonJ3xbXiddKSonKD8hJykpLy5zb3VyY2U7XG5cblx0dmFyIG51bWJlciA9IC9cXGIoPzpcXGRbXFxkYS1mXSp4fFxcZCsoPzpcXC5cXGQrKT8oPzplWystXT9cXGQrKT8pXFxiL2k7XG5cdHZhciBudW1lcmljQ29uc3RhbnQgPSB7XG5cdFx0cGF0dGVybjogUmVnRXhwKHN0cmluZ1BhdHRlcm4gKyAnW2J4XScpLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9O1xuXG5cdHZhciBtYWNyb1ZhcmlhYmxlID0ge1xuXHRcdHBhdHRlcm46IC8mW2Etel9dXFx3Ki9pXG5cdH07XG5cblx0dmFyIG1hY3JvS2V5d29yZCA9IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxzfD18XFwoKSklKD86QUJPUlR8Qll8Q01TfENPUFl8RElTUExBWXxET3xFTFNFfEVORHxFVkFMfEdMT0JBTHxHT3xHT1RPfElGfElOQ3xJTkNMVURFfElOREVYfElOUFVUfEtUUklNfExFTkdUSHxMRVR8TElTVHxMT0NBTHxQVVR8UUtUUklNfFFTQ0FOfFFTVUJTVFJ8UVNZU0ZVTkN8UVVQQ0FTRXxSRVRVUk58UlVOfFNDQU58U1VCU1RSfFNVUEVSUXxTWU1ERUx8U1lNRVhJU1R8U1lNR0xPQkx8U1lNTE9DQUx8U1lTQ0FMTHxTWVNFVkFMRnxTWVNFWEVDfFNZU0ZVTkN8U1lTR0VUfFNZU1JQVVR8VEhFTnxUT3xUU098VU5RVU9URXxVTlRJTHxVUENBU0V8V0hJTEV8V0lORE9XKVxcYi9pLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9O1xuXG5cdHZhciBzdGVwID0ge1xuXHRcdHBhdHRlcm46IC8oXnxcXHMpKD86cHJvY1xccytcXHcrfGRhdGEoPyE9KXxxdWl0fHJ1bilcXGIvaSxcblx0XHRhbGlhczogJ2tleXdvcmQnLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fTtcblxuXHR2YXIgY29tbWVudCA9IFtcblx0XHQvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKnw7XFxzKilcXCpbXjtdKjsvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF07XG5cblx0dmFyIHN0cmluZyA9IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAoc3RyaW5nUGF0dGVybiksXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH07XG5cblx0dmFyIHB1bmN0dWF0aW9uID0gL1skJUAuKCl7fVxcW1xcXTssXFxcXF0vO1xuXG5cdHZhciBmdW5jID0ge1xuXHRcdHBhdHRlcm46IC8lP1xcYlxcdysoPz1cXCgpLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH07XG5cblx0dmFyIGFyZ3MgPSB7XG5cdFx0J2Z1bmN0aW9uJzogZnVuYyxcblx0XHQnYXJnLXZhbHVlJzoge1xuXHRcdFx0cGF0dGVybjogLyg9XFxzKilbQS1aXFwuXSsvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdvcGVyYXRvcic6IC89Lyxcblx0XHQnbWFjcm8tdmFyaWFibGUnOiBtYWNyb1ZhcmlhYmxlLFxuXHRcdCdhcmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvW0EtWl0rL2ksXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdCdudW1lcmljLWNvbnN0YW50JzogbnVtZXJpY0NvbnN0YW50LFxuXHRcdCdwdW5jdHVhdGlvbic6IHB1bmN0dWF0aW9uLFxuXHRcdCdzdHJpbmcnOiBzdHJpbmdcblx0fTtcblxuXHR2YXIgZm9ybWF0ID0ge1xuXHRcdHBhdHRlcm46IC9cXGIoPzpmb3JtYXR8cHV0KVxcYj0/W1xcdyckLl0rL2ksXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IC9eKD86Zm9ybWF0fHB1dCkoPz09KS9pLFxuXHRcdFx0J2VxdWFscyc6IC89Lyxcblx0XHRcdCdmb3JtYXQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oPzpcXHd8XFwkXFxkKStcXC5cXGQ/Lyxcblx0XHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdHZhciBhbHRmb3JtYXQgPSB7XG5cdFx0cGF0dGVybjogL1xcYig/OmZvcm1hdHxwdXQpXFxzK1tcXHcnXSsoPzpcXHMrWyQuXFx3XSspKyg/PTspL2ksXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IC9eKD86Zm9ybWF0fHB1dCkvaSxcblx0XHRcdCdmb3JtYXQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9bXFx3JF0rXFwuXFxkPy8sXG5cdFx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHR2YXIgZ2xvYmFsU3RhdGVtZW50cyA9IHtcblx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxzKT0/KSg/OmNhdG5hbWV8Y2hlY2twb2ludCBleGVjdXRlX2Fsd2F5c3xkbXxlbmRzYXN8ZmlsZW5hbWV8Zm9vdG5vdGV8JWluY2x1ZGV8bGlibmFtZXwlbGlzdHxsb2NrfG1pc3Npbmd8b3B0aW9uc3xwYWdlfHJlc2V0bGluZXwlcnVufHNhc2ZpbGV8c2tpcHxzeXNlY2hvfHRpdGxlXFxkPylcXGIvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fTtcblxuXHR2YXIgc3VibWl0U3RhdGVtZW50ID0ge1xuXHRcdHBhdHRlcm46IC8oXnxcXHMpKD86c3VibWl0KD86XFxzKyg/OmxvYWR8bm9ydW58cGFyc2Vvbmx5KSk/fGVuZHN1Ym1pdClcXGIvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fTtcblxuXHR2YXIgYWN0aW9uU2V0cyA9IC9hU3RvcmV8YWNjZXNzQ29udHJvbHxhZ2dyZWdhdGlvbnxhdWRpb3xhdXRvdHVuZXxiYXllc2lhbk5ldENsYXNzaWZpZXJ8YmlvTWVkSW1hZ2V8Ym9vbFJ1bGV8YnVpbHRpbnN8Y2FyZGluYWxpdHl8Y2RtfGNsdXN0ZXJpbmd8Y29uZGl0aW9uYWxSYW5kb21GaWVsZHN8Y29uZmlndXJhdGlvbnxjb3B1bGF8Y291bnRyZWd8ZGF0YURpc2NvdmVyeXxkYXRhUHJlcHJvY2Vzc3xkYXRhU2NpZW5jZVBpbG90fGRhdGFTdGVwfGRlY2lzaW9uVHJlZXxkZWR1cGxpY2F0aW9ufGRlZXBMZWFybnxkZWVwTmV1cmFsfGRlZXBSbm58ZHMyfGVjbXxlbnRpdHlSZXN8ZXNwQ2x1c3RlcnxleHBsYWluTW9kZWx8ZmFjdG1hY3xmYXN0S25ufGZjbXBhY3R8ZmVkU3FsfGZyZXFUYWJ8Z1ZhckNsdXN0ZXJ8Z2FtfGdsZWFtfGdyYXBoU2VtaVN1cExlYXJufGhpZGRlbk1hcmtvdk1vZGVsfGh5cGVyR3JvdXB8aWNhfGltYWdlfGltbHxrZXJuYWxQY2F8bGFuZ01vZGVsfGxkYVRvcGljfGxvYWRTdHJlYW1zfG1iY3xtaXhlZHxtbFRvb2xzfG1vZGVsUHVibGlzaGluZ3xuZXR3b3JrfG5ldXJhbE5ldHxubWZ8bm9uUGFyYW1ldHJpY0JheWVzfG5vbmxpbmVhcnxvcHROZXR3b3JrfG9wdGltaXphdGlvbnxwYW5lbHxwY2F8cGVyY2VudGlsZXxwaHJlZ3xwbHN8cWtifHFsaW18cXVhbnRyZWd8cmVjb21tZW5kfHJlZ3Jlc3Npb258cmVpbmZvcmNlbWVudExlYXJufHJvYnVzdFBjYXxydWxlTWluaW5nfHNhbXBsaW5nfHNhbmR3aWNofHNjY2FzbHxzZWFyY2goPzpBbmFseXRpY3MpP3xzZW50aW1lbnRBbmFseXNpc3xzZXF1ZW5jZXxzZXNzaW9uKD86UHJvcCk/fHNldmVyaXR5fHNpbVN5c3RlbXxzaW1wbGV8c21hcnREYXRhfHNwYXJrRW1iZWRkZWRQcm9jZXNzfHNwYXJzZU1MfHNwYXRpYWxyZWd8c3BjfHN0YWJpbGl0eU1vbml0b3Jpbmd8c3ZEYXRhRGVzY3JpcHRpb258c3ZtfHRhYmxlfHRleHQoPzpGaWx0ZXJzfEZyZXF1ZW5jeXxNaW5pbmd8UGFyc2V8UnVsZSg/OkRldmVsb3B8U2NvcmUpfFRvcGljfFV0aWwpfHRpbWVEYXRhfHRyYW5zcG9zZXx0c0luZm98dHNSZWNvbmNpbGV8dW5pVGltZVNlcmllc3x2YXJSZWR1Y2UvLnNvdXJjZTtcblxuXHR2YXIgY2FzQWN0aW9ucyA9IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAoLyhefFxccykoPzphY3Rpb25cXHMrKT8oPzo8YWN0PilcXC5bYS16XStcXGJbXjtdKy8uc291cmNlLnJlcGxhY2UoLzxhY3Q+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFjdGlvblNldHM7IH0pLCAnaScpLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQna2V5d29yZCc6IFJlZ0V4cCgvKD86PGFjdD4pXFwuW2Etel0rXFxiLy5zb3VyY2UucmVwbGFjZSgvPGFjdD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gYWN0aW9uU2V0czsgfSksICdpJyksXG5cdFx0XHQnYWN0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKD86YWN0aW9uKS9pLFxuXHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHR9LFxuXHRcdFx0J2NvbW1lbnQnOiBjb21tZW50LFxuXHRcdFx0J2Z1bmN0aW9uJzogZnVuYyxcblx0XHRcdCdhcmctdmFsdWUnOiBhcmdzWydhcmctdmFsdWUnXSxcblx0XHRcdCdvcGVyYXRvcic6IGFyZ3Mub3BlcmF0b3IsXG5cdFx0XHQnYXJndW1lbnQnOiBhcmdzLmFyZyxcblx0XHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0XHQnbnVtZXJpYy1jb25zdGFudCc6IG51bWVyaWNDb25zdGFudCxcblx0XHRcdCdwdW5jdHVhdGlvbic6IHB1bmN0dWF0aW9uLFxuXHRcdFx0J3N0cmluZyc6IHN0cmluZ1xuXHRcdH1cblx0fTtcblxuXHR2YXIga2V5d29yZHMgPSB7XG5cdFx0cGF0dGVybjogLygoPzpefFxccyk9PykoPzphZnRlcnxhbmFseXNpc3xhbmR8YXJyYXl8YmFyY2hhcnR8YmFyd2lkdGh8YmVnaW5ncmFwaHxieXxjYWxsfGNhc3xjYmFybGluZXxjZmlsbHxjbGFzcyg/Omxldik/fGNsb3NlfGNvbHVtbnxjb21wdXRlZD98Y29udGFpbnN8Y29udGludWV8ZGF0YSg/PT0pfGRlZmluZXxkZWxldGV8ZGVzY3JpYmV8ZG9jdW1lbnR8ZG9cXHMrb3Zlcnxkb3xkb2x8ZHJvcHxkdWx8ZWxzZXxlbmQoPzpjb21wfHNvdXJjZSk/fGVudHJ5VGl0bGV8ZXZhbCg/OnVhdGUpP3xleGVjKD86dXRlKT98ZXhpdHxmaWxlKD86bmFtZSk/fGZpbGwoPzphdHRycyk/fGZsaXN0fGZuY3xmdW5jdGlvbig/Omxpc3QpP3xnbG9iYWx8Z290b3xncm91cCg/OmJ5KT98aGVhZGxpbmV8aGVhZHNraXB8aGlzdG9ncmFtfGlmfGluZmlsZXxrZWVwfGtleWxhYmVsfGtleXdvcmR8bGFiZWx8bGF5b3V0fGxlYXZlfGxlZ2VuZGxhYmVsfGxlbmd0aHxsaWJuYW1lfGxvYWRhY3Rpb25zZXR8bWVyZ2V8bWlkcG9pbnRzfF8/bnVsbF98bmFtZXxub29ic3xub3dkfG9kc3xvcHRpb25zfG9yfG90aGVyd2lzZXxvdXQoPzpwdXQpP3xvdmVyKD86bGF5KT98cGxvdHxwcmludHxwdXR8cmFpc2V8cmFuZXhwfHJhbm5vcnxyYnJlYWt8cmV0YWlufHJldHVybnxzZWxlY3R8c2Vzc2lvbnxzZXNzcmVmfHNldHxzb3VyY2V8c3RhdGdyYXBofHN1bXxzdW1tYXJpemV8dGFibGV8dGVtcHx0ZXJtaW5hdGV8dGhlblxccytkb3x0aGVufHRpdGxlXFxkP3x0b3x2YXJ8d2hlbnx3aGVyZXx4YXhpc29wdHN8eTJheGlzb3B0c3x5YXhpc29wdHMpXFxiL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuc2FzID0ge1xuXHRcdCdkYXRhbGluZXMnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihbIFxcdF0qKSg/OmNhcmRzfCg/OmRhdGEpP2xpbmVzKTtbXFxzXFxTXSs/XlsgXFx0XSo7L2ltLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQna2V5d29yZCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXig/OmNhcmRzfCg/OmRhdGEpP2xpbmVzKS9pXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC87L1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQncHJvYy1zcWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5wcm9jXFxzKyg/OmZlZCk/c3FsKD86XFxzK1tcXHd8PV0rKT87KVtcXHNcXFNdKz8oPz1eKD86cHJvY1xccytcXHcrfGRhdGF8cXVpdHxydW4pO3woPyFbXFxzXFxTXSkpL2ltLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnc3FsJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvXlsgXFx0XSooPzpzZWxlY3R8YWx0ZXJcXHMrdGFibGV8KD86Y3JlYXRlfGRlc2NyaWJlfGRyb3ApXFxzKyg/OmluZGV4fHRhYmxlKD86XFxzK2NvbnN0cmFpbnRzKT98dmlldyl8Y3JlYXRlXFxzK3VuaXF1ZVxccytpbmRleHxpbnNlcnRcXHMraW50b3x1cGRhdGUpKD86PHN0cj58W147XCInXSkrOy8uc291cmNlLnJlcGxhY2UoLzxzdHI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0cmluZ1BhdHRlcm47IH0pLCAnaW0nKSxcblx0XHRcdFx0XHRhbGlhczogJ2xhbmd1YWdlLXNxbCcsXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuc3FsXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdnbG9iYWwtc3RhdGVtZW50cyc6IGdsb2JhbFN0YXRlbWVudHMsXG5cdFx0XHRcdCdzcWwtc3RhdGVtZW50cyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvKF58XFxzKSg/OmRpc2Nvbm5lY3RcXHMrZnJvbXxiZWdpbnxjb21taXR8ZXhlYyg/OnV0ZSk/fHJlc2V0fHJvbGxiYWNrfHZhbGlkYXRlKVxcYi9pLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdFx0XHQnbnVtZXJpYy1jb25zdGFudCc6IG51bWVyaWNDb25zdGFudCxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogcHVuY3R1YXRpb24sXG5cdFx0XHRcdCdzdHJpbmcnOiBzdHJpbmdcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J3Byb2MtZ3Jvb3Z5Jzoge1xuXHRcdFx0cGF0dGVybjogLyhecHJvY1xccytncm9vdnkoPzpcXHMrW1xcd3w9XSspPzspW1xcc1xcU10rPyg/PV4oPzpwcm9jXFxzK1xcdyt8ZGF0YXxxdWl0fHJ1bik7fCg/IVtcXHNcXFNdKSkvaW0sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb21tZW50JzogY29tbWVudCxcblx0XHRcdFx0J2dyb292eSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyheWyBcXHRdKnN1Ym1pdCg/OlxccysoPzpsb2FkfG5vcnVufHBhcnNlb25seSkpPykoPzo8c3RyPnxbXlwiJ10pKz8oPz1lbmRzdWJtaXQ7KS8uc291cmNlLnJlcGxhY2UoLzxzdHI+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN0cmluZ1BhdHRlcm47IH0pLCAnaW0nKSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtZ3Jvb3Z5Jyxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5ncm9vdnlcblx0XHRcdFx0fSxcblx0XHRcdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHRcdFx0J3N1Ym1pdC1zdGF0ZW1lbnQnOiBzdWJtaXRTdGF0ZW1lbnQsXG5cdFx0XHRcdCdnbG9iYWwtc3RhdGVtZW50cyc6IGdsb2JhbFN0YXRlbWVudHMsXG5cdFx0XHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0XHRcdCdudW1lcmljLWNvbnN0YW50JzogbnVtZXJpY0NvbnN0YW50LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiBwdW5jdHVhdGlvbixcblx0XHRcdFx0J3N0cmluZyc6IHN0cmluZ1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQncHJvYy1sdWEnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5wcm9jXFxzK2x1YSg/OlxccytbXFx3fD1dKyk/OylbXFxzXFxTXSs/KD89Xig/OnByb2NcXHMrXFx3K3xkYXRhfHF1aXR8cnVuKTt8KD8hW1xcc1xcU10pKS9pbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvbW1lbnQnOiBjb21tZW50LFxuXHRcdFx0XHQnbHVhJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKF5bIFxcdF0qc3VibWl0KD86XFxzKyg/OmxvYWR8bm9ydW58cGFyc2Vvbmx5KSk/KSg/OjxzdHI+fFteXCInXSkrPyg/PWVuZHN1Ym1pdDspLy5zb3VyY2UucmVwbGFjZSgvPHN0cj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RyaW5nUGF0dGVybjsgfSksICdpbScpLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1sdWEnLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLmx1YVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdFx0XHQnc3VibWl0LXN0YXRlbWVudCc6IHN1Ym1pdFN0YXRlbWVudCxcblx0XHRcdFx0J2dsb2JhbC1zdGF0ZW1lbnRzJzogZ2xvYmFsU3RhdGVtZW50cyxcblx0XHRcdFx0J251bWJlcic6IG51bWJlcixcblx0XHRcdFx0J251bWVyaWMtY29uc3RhbnQnOiBudW1lcmljQ29uc3RhbnQsXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHB1bmN0dWF0aW9uLFxuXHRcdFx0XHQnc3RyaW5nJzogc3RyaW5nXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdwcm9jLWNhcyc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnByb2NcXHMrY2FzKD86XFxzK1tcXHd8PV0rKT87KVtcXHNcXFNdKz8oPz1eKD86cHJvY1xccytcXHcrfHF1aXR8ZGF0YSk7fCg/IVtcXHNcXFNdKSkvaW0sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdjb21tZW50JzogY29tbWVudCxcblx0XHRcdFx0J3N0YXRlbWVudC12YXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLygoPzpefFxccyk9PylzYXZlcmVzdWx0XFxzW147XSsvaW0sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblxuXHRcdFx0XHRcdFx0J3N0YXRlbWVudCc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogL15zYXZlcmVzdWx0XFxzK1xcUysvaSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdFx0a2V5d29yZDogL14oPzpzYXZlcmVzdWx0KS9pXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRyZXN0OiBhcmdzXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnY2FzLWFjdGlvbnMnOiBjYXNBY3Rpb25zLFxuXHRcdFx0XHQnc3RhdGVtZW50Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oKD86XnxcXHMpPT8pKD86ZGVmYXVsdHwoPzp1bik/c2V0fG9ufG91dHB1dHx1cGxvYWQpW147XSsvaW0sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IGFyZ3Ncblx0XHRcdFx0fSxcblx0XHRcdFx0J3N0ZXAnOiBzdGVwLFxuXHRcdFx0XHQna2V5d29yZCc6IGtleXdvcmRzLFxuXHRcdFx0XHQnZnVuY3Rpb24nOiBmdW5jLFxuXHRcdFx0XHQnZm9ybWF0JzogZm9ybWF0LFxuXHRcdFx0XHQnYWx0Zm9ybWF0JzogYWx0Zm9ybWF0LFxuXHRcdFx0XHQnZ2xvYmFsLXN0YXRlbWVudHMnOiBnbG9iYWxTdGF0ZW1lbnRzLFxuXHRcdFx0XHQnbnVtYmVyJzogbnVtYmVyLFxuXHRcdFx0XHQnbnVtZXJpYy1jb25zdGFudCc6IG51bWVyaWNDb25zdGFudCxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogcHVuY3R1YXRpb24sXG5cdFx0XHRcdCdzdHJpbmcnOiBzdHJpbmdcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J3Byb2MtYXJncyc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKF5wcm9jXFxzK1xcdytcXHMrKSg/IVxccykoPzpbXjtcIiddfDxzdHI+KSs7Ly5zb3VyY2UucmVwbGFjZSgvPHN0cj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RyaW5nUGF0dGVybjsgfSksICdpbScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZTogYXJnc1xuXHRcdH0sXG5cdFx0LypTcGVjaWFsIGtleXdvcmRzIHdpdGhpbiBtYWNyb3MqL1xuXHRcdCdtYWNyby1rZXl3b3JkJzogbWFjcm9LZXl3b3JkLFxuXHRcdCdtYWNyby12YXJpYWJsZSc6IG1hY3JvVmFyaWFibGUsXG5cdFx0J21hY3JvLXN0cmluZy1mdW5jdGlvbnMnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58XFxzfD0pKSUoPzpCUVVPVEV8TlJCUVVPVEV8TlJRVU9URXxOUlNUUnxRVU9URXxTVFIpXFwoLio/KD86W14lXVxcKSkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8lKD86QlFVT1RFfE5SQlFVT1RFfE5SUVVPVEV8TlJTVFJ8UVVPVEV8U1RSKS9pLFxuXHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdFx0fSxcblx0XHRcdFx0J21hY3JvLWtleXdvcmQnOiBtYWNyb0tleXdvcmQsXG5cdFx0XHRcdCdtYWNyby12YXJpYWJsZSc6IG1hY3JvVmFyaWFibGUsXG5cdFx0XHRcdCdlc2NhcGVkLWNoYXInOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyVbJ1wiKCk8Pj1cdTAwQUNefjssI10vLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiBwdW5jdHVhdGlvblxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J21hY3JvLWRlY2xhcmF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogL14lbWFjcm9bXjtdKyg/PTspL2ltLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdrZXl3b3JkJzogLyVtYWNyby9pLFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J21hY3JvLWVuZCc6IHtcblx0XHRcdHBhdHRlcm46IC9eJW1lbmRbXjtdKyg/PTspL2ltLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdrZXl3b3JkJzogLyVtZW5kL2ksXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvKiVfenNjb3JlKGhlYWRjaXIsIF9saGMsIF9taGMsIF9zaGMsIGhlYWRjeiwgaGVhZGNwY3QsIF9GaGVhZGN6KTsgKi9cblx0XHQnbWFjcm8nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvJV9cXHcrKD89XFwoKS8sXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblx0XHQnaW5wdXQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiaW5wdXRcXHNbLVxcd1xccy8qLiQmXSs7L2ksXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2lucHV0Jzoge1xuXHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCcsXG5cdFx0XHRcdFx0cGF0dGVybjogL15pbnB1dC9pLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnY29tbWVudCc6IGNvbW1lbnQsXG5cdFx0XHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0XHRcdCdudW1lcmljLWNvbnN0YW50JzogbnVtZXJpY0NvbnN0YW50XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnb3B0aW9ucy1hcmdzJzoge1xuXHRcdFx0cGF0dGVybjogLyheb3B0aW9ucylbLSdcInwvXFxcXDw+Kis9OigpXFx3XFxzXSooPz07KS9pbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IGFyZ3Ncblx0XHR9LFxuXHRcdCdjYXMtYWN0aW9ucyc6IGNhc0FjdGlvbnMsXG5cdFx0J2NvbW1lbnQnOiBjb21tZW50LFxuXHRcdCdmdW5jdGlvbic6IGZ1bmMsXG5cdFx0J2Zvcm1hdCc6IGZvcm1hdCxcblx0XHQnYWx0Zm9ybWF0JzogYWx0Zm9ybWF0LFxuXHRcdCdudW1lcmljLWNvbnN0YW50JzogbnVtZXJpY0NvbnN0YW50LFxuXHRcdCdkYXRldGltZSc6IHtcblx0XHRcdC8vICcxamFuMjAxMydkLCAnOToyNToxOXBtJ3QsICcxOGphbjIwMDM6OToyNzowNWFtJ2R0XG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoc3RyaW5nUGF0dGVybiArICcoPzpkdD98dCknKSxcblx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHN0cmluZyxcblx0XHQnc3RlcCc6IHN0ZXAsXG5cdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHQvLyBJbiBTQVMgU3R1ZGlvIHN5bnRheCBoaWdobGlnaHRpbmcsIHRoZXNlIG9wZXJhdG9ycyBhcmUgc3R5bGVkIGxpa2Uga2V5d29yZHNcblx0XHQnb3BlcmF0b3Ita2V5d29yZCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzplcXxnZXxndHxpbnxsZXxsdHxuZXxub3QpXFxiL2ksXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH0sXG5cdFx0Ly8gRGVjaW1hbCAoMS4yZTIzKSwgaGV4YWRlY2ltYWwgKDBjMXgpXG5cdFx0J251bWJlcic6IG51bWJlcixcblx0XHQnb3BlcmF0b3InOiAvXFwqXFwqP3xcXHxcXHw/fCEhP3xcdTAwQTZcdTAwQTY/fDxbPj1dP3w+Wzw9XT98Wy0rXFwvPSZdfFt+XHUwMEFDXl09Py8sXG5cdFx0J3B1bmN0dWF0aW9uJzogcHVuY3R1YXRpb25cblx0fTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdFByaXNtLmxhbmd1YWdlcy5zYXNzID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY3NzJywge1xuXHRcdC8vIFNhc3MgY29tbWVudHMgZG9uJ3QgbmVlZCB0byBiZSBjbG9zZWQsIG9ubHkgaW5kZW50ZWRcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9eKFsgXFx0XSopXFwvW1xcLypdLiooPzooPzpcXHI/XFxufFxccilcXDFbIFxcdF0uKykqL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdzYXNzJywgJ2F0cnVsZScsIHtcblx0XHQvLyBXZSB3YW50IHRvIGNvbnN1bWUgdGhlIHdob2xlIGxpbmVcblx0XHQnYXRydWxlLWxpbmUnOiB7XG5cdFx0XHQvLyBJbmNsdWRlcyBzdXBwb3J0IGZvciA9IGFuZCArIHNob3J0Y3V0c1xuXHRcdFx0cGF0dGVybjogL14oPzpbIFxcdF0qKVtAKz1dLisvbSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnYXRydWxlJzogLyg/OkBbXFx3LV0rfFsrPV0pL1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cdGRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuc2Fzcy5hdHJ1bGU7XG5cblxuXHR2YXIgdmFyaWFibGUgPSAvXFwkWy1cXHddK3wjXFx7XFwkWy1cXHddK1xcfS87XG5cdHZhciBvcGVyYXRvciA9IFtcblx0XHQvWysqXFwvJV18Wz0hXT18PD0/fD49P3xcXGIoPzphbmR8bm90fG9yKVxcYi8sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcXHMpLSg/PVxccykvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdzYXNzJywgJ3Byb3BlcnR5Jywge1xuXHRcdC8vIFdlIHdhbnQgdG8gY29uc3VtZSB0aGUgd2hvbGUgbGluZVxuXHRcdCd2YXJpYWJsZS1saW5lJzoge1xuXHRcdFx0cGF0dGVybjogL15bIFxcdF0qXFwkLisvbSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvOi8sXG5cdFx0XHRcdCd2YXJpYWJsZSc6IHZhcmlhYmxlLFxuXHRcdFx0XHQnb3BlcmF0b3InOiBvcGVyYXRvclxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Ly8gV2Ugd2FudCB0byBjb25zdW1lIHRoZSB3aG9sZSBsaW5lXG5cdFx0J3Byb3BlcnR5LWxpbmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlsgXFx0XSooPzpbXjpcXHNdKyAqOi4qfDpbXjpcXHNdLiopL20sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3Byb3BlcnR5JzogW1xuXHRcdFx0XHRcdC9bXjpcXHNdKyg/PVxccyo6KS8sXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyg6KVteOlxcc10rLyxcblx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHR9XG5cdFx0XHRcdF0sXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86Lyxcblx0XHRcdFx0J3ZhcmlhYmxlJzogdmFyaWFibGUsXG5cdFx0XHRcdCdvcGVyYXRvcic6IG9wZXJhdG9yLFxuXHRcdFx0XHQnaW1wb3J0YW50JzogUHJpc20ubGFuZ3VhZ2VzLnNhc3MuaW1wb3J0YW50XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy5zYXNzLnByb3BlcnR5O1xuXHRkZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnNhc3MuaW1wb3J0YW50O1xuXG5cdC8vIE5vdyB0aGF0IHdob2xlIGxpbmVzIGZvciBvdGhlciBwYXR0ZXJucyBhcmUgY29uc3VtZWQsXG5cdC8vIHdoYXQncyBsZWZ0IHNob3VsZCBiZSBzZWxlY3RvcnNcblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnc2FzcycsICdwdW5jdHVhdGlvbicsIHtcblx0XHQnc2VsZWN0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihbIFxcdF0qKVxcUyg/OixbXixcXHJcXG5dK3xbXixcXHJcXG5dKikoPzosW14sXFxyXFxuXSspKig/OiwoPzpcXHI/XFxufFxccilcXDFbIFxcdF0rXFxTKD86LFteLFxcclxcbl0rfFteLFxcclxcbl0qKSg/OixbXixcXHJcXG5dKykqKSovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy5zY3NzID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY3NzJywge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSkoPzpcXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnYXRydWxlJzoge1xuXHRcdHBhdHRlcm46IC9AW1xcdy1dKD86XFwoW14oKV0rXFwpfFteKClcXHNdfFxccysoPyFcXHMpKSo/KD89XFxzK1t7O10pLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdydWxlJzogL0BbXFx3LV0rL1xuXHRcdFx0Ly8gU2VlIHJlc3QgYmVsb3dcblx0XHR9XG5cdH0sXG5cdC8vIHVybCwgY29tcGFzc2lmaWVkXG5cdCd1cmwnOiAvKD86Wy1hLXpdKy0pP3VybCg/PVxcKCkvaSxcblx0Ly8gQ1NTIHNlbGVjdG9yIHJlZ2V4IGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgU2Fzc1xuXHQvLyBzaW5jZSB0aGVyZSBjYW4gYmUgbG90IG1vcmUgdGhpbmdzICh2YXIsIEAgZGlyZWN0aXZlLCBuZXN0aW5nLi4pXG5cdC8vIGEgc2VsZWN0b3IgbXVzdCBzdGFydCBhdCB0aGUgZW5kIG9mIGEgcHJvcGVydHkgb3IgYWZ0ZXIgYSBicmFjZSAoZW5kIG9mIG90aGVyIHJ1bGVzIG9yIG5lc3RpbmcpXG5cdC8vIGl0IGNhbiBjb250YWluIHNvbWUgY2hhcmFjdGVycyB0aGF0IGFyZW4ndCB1c2VkIGZvciBkZWZpbmluZyBydWxlcyBvciBlbmQgb2Ygc2VsZWN0b3IsICYgKHBhcmVudCBzZWxlY3RvciksIG9yIGludGVycG9sYXRlZCB2YXJpYWJsZVxuXHQvLyB0aGUgZW5kIG9mIGEgc2VsZWN0b3IgaXMgZm91bmQgd2hlbiB0aGVyZSBpcyBubyBydWxlcyBpbiBpdCAoIHt9IG9yIHtcXHN9KSBvciBpZiB0aGVyZSBpcyBhIHByb3BlcnR5IChiZWNhdXNlIGFuIGludGVycG9sYXRlZCB2YXJcblx0Ly8gY2FuIFwicGFzc1wiIGFzIGEgc2VsZWN0b3ItIGUuZzogcHJvcGVyI3skZXJ0eX0pXG5cdC8vIHRoaXMgb25lIHdhcyBoYXJkIHRvIGRvLCBzbyBwbGVhc2UgYmUgY2FyZWZ1bCBpZiB5b3UgZWRpdCB0aGlzIG9uZSA6KVxuXHQnc2VsZWN0b3InOiB7XG5cdFx0Ly8gSW5pdGlhbCBsb29rLWFoZWFkIGlzIHVzZWQgdG8gcHJldmVudCBtYXRjaGluZyBvZiBibGFuayBzZWxlY3RvcnNcblx0XHRwYXR0ZXJuOiAvKD89XFxTKVteQDt7fSgpXT8oPzpbXkA7e30oKVxcc118XFxzKyg/IVxccyl8I1xce1xcJFstXFx3XStcXH0pKyg/PVxccypcXHsoPzpcXH18XFxzfFtefV1bXjp7fV0qWzp7XVtefV0pKS8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncGFyZW50Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvJi8sXG5cdFx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdFx0fSxcblx0XHRcdCdwbGFjZWhvbGRlcic6IC8lWy1cXHddKy8sXG5cdFx0XHQndmFyaWFibGUnOiAvXFwkWy1cXHddK3wjXFx7XFwkWy1cXHddK1xcfS9cblx0XHR9XG5cdH0sXG5cdCdwcm9wZXJ0eSc6IHtcblx0XHRwYXR0ZXJuOiAvKD86Wy1cXHddfFxcJFstXFx3XXwjXFx7XFwkWy1cXHddK1xcfSkrKD89XFxzKjopLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd2YXJpYWJsZSc6IC9cXCRbLVxcd10rfCNcXHtcXCRbLVxcd10rXFx9L1xuXHRcdH1cblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3Njc3MnLCAnYXRydWxlJywge1xuXHQna2V5d29yZCc6IFtcblx0XHQvQCg/OmNvbnRlbnR8ZGVidWd8ZWFjaHxlbHNlKD86IGlmKT98ZXh0ZW5kfGZvcnxmb3J3YXJkfGZ1bmN0aW9ufGlmfGltcG9ydHxpbmNsdWRlfG1peGlufHJldHVybnx1c2V8d2Fybnx3aGlsZSlcXGIvaSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKCApKD86ZnJvbXx0aHJvdWdoKSg/PSApLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdzY3NzJywgJ2ltcG9ydGFudCcsIHtcblx0Ly8gdmFyIGFuZCBpbnRlcnBvbGF0ZWQgdmFyc1xuXHQndmFyaWFibGUnOiAvXFwkWy1cXHddK3wjXFx7XFwkWy1cXHddK1xcfS9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdzY3NzJywgJ2Z1bmN0aW9uJywge1xuXHQnbW9kdWxlLW1vZGlmaWVyJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzphc3xoaWRlfHNob3d8d2l0aClcXGIvaSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdwbGFjZWhvbGRlcic6IHtcblx0XHRwYXR0ZXJuOiAvJVstXFx3XSsvLFxuXHRcdGFsaWFzOiAnc2VsZWN0b3InXG5cdH0sXG5cdCdzdGF0ZW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcQiEoPzpkZWZhdWx0fG9wdGlvbmFsKVxcYi9pLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnbnVsbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxibnVsbFxcYi8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQnb3BlcmF0b3InOiB7XG5cdFx0cGF0dGVybjogLyhcXHMpKD86Wy0rKlxcLyVdfFs9IV09fDw9P3w+PT98YW5kfG5vdHxvcikoPz1cXHMpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuc2Nzc1snYXRydWxlJ10uaW5zaWRlLnJlc3QgPSBQcmlzbS5sYW5ndWFnZXMuc2NzcztcblxuUHJpc20ubGFuZ3VhZ2VzLnNjYWxhID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnamF2YScsIHtcblx0J3RyaXBsZS1xdW90ZWQtc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlwiXCJbXFxzXFxTXSo/XCJcIlwiLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhcInwnKSg/OlxcXFwufCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC88LXw9PnxcXGIoPzphYnN0cmFjdHxjYXNlfGNhdGNofGNsYXNzfGRlZnxkb3xlbHNlfGV4dGVuZHN8ZmluYWx8ZmluYWxseXxmb3J8Zm9yU29tZXxpZnxpbXBsaWNpdHxpbXBvcnR8bGF6eXxtYXRjaHxuZXd8bnVsbHxvYmplY3R8b3ZlcnJpZGV8cGFja2FnZXxwcml2YXRlfHByb3RlY3RlZHxyZXR1cm58c2VhbGVkfHNlbGZ8c3VwZXJ8dGhpc3x0aHJvd3x0cmFpdHx0cnl8dHlwZXx2YWx8dmFyfHdoaWxlfHdpdGh8eWllbGQpXFxiLyxcblx0J251bWJlcic6IC9cXGIweCg/OltcXGRhLWZdKlxcLik/W1xcZGEtZl0rfCg/OlxcYlxcZCsoPzpcXC5cXGQqKT98XFxCXFwuXFxkKykoPzplXFxkKyk/W2RmbF0/L2ksXG5cdCdidWlsdGluJzogL1xcYig/OkFueXxBbnlSZWZ8QW55VmFsfEJvb2xlYW58Qnl0ZXxDaGFyfERvdWJsZXxGbG9hdHxJbnR8TG9uZ3xOb3RoaW5nfFNob3J0fFN0cmluZ3xVbml0KVxcYi8sXG5cdCdzeW1ib2wnOiAvJ1teXFxkXFxzXFxcXF1cXHcqL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3NjYWxhJywgJ3RyaXBsZS1xdW90ZWQtc3RyaW5nJywge1xuXHQnc3RyaW5nLWludGVycG9sYXRpb24nOiB7XG5cdFx0cGF0dGVybjogL1xcYlthLXpdXFx3Kig/OlwiXCJcIig/OlteJF18XFwkKD86W157XXxcXHsoPzpbXnt9XXxcXHtbXnt9XSpcXH0pKlxcfSkpKj9cIlwiXCJ8XCIoPzpbXiRcIlxcclxcbl18XFwkKD86W157XXxcXHsoPzpbXnt9XXxcXHtbXnt9XSpcXH0pKlxcfSkpKlwiKS9pLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdpZCc6IHtcblx0XHRcdFx0cGF0dGVybjogL15cXHcrLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdFx0fSxcblx0XHRcdCdlc2NhcGUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXFxcXFwkXCJ8XFwkWyRcIl0vLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnc3ltYm9sJ1xuXHRcdFx0fSxcblx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwkKD86XFx3K3xcXHsoPzpbXnt9XXxcXHtbXnt9XSpcXH0pKlxcfSkvLFxuXHRcdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFwkXFx7P3xcXH0kLyxcblx0XHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMuc2NhbGFcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHR9XG5cdH1cbn0pO1xuXG5kZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnNjYWxhWydjbGFzcy1uYW1lJ107XG5kZWxldGUgUHJpc20ubGFuZ3VhZ2VzLnNjYWxhWydmdW5jdGlvbiddO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0Ly8gQ0FSRUZVTCFcblx0Ly8gVGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgY29uY2F0ZW5hdGVkLCBzbyB0aGUgZ3JvdXAgcmVmZXJlbmNlZCBieSBhIGJhY2sgcmVmZXJlbmNlIGlzIG5vbi1vYnZpb3VzIVxuXG5cdHZhciBzdHJpbmdzID0gW1xuXHRcdC8vIG5vcm1hbCBzdHJpbmdcblx0XHQvXCIoPzpcXFxcW1xcc1xcU118XFwkXFwoW14pXStcXCl8XFwkKD8hXFwoKXxgW15gXStgfFteXCJcXFxcYCRdKSpcIi8uc291cmNlLFxuXHRcdC8nW14nXSonLy5zb3VyY2UsXG5cdFx0L1xcJCcoPzpbXidcXFxcXXxcXFxcW1xcc1xcU10pKicvLnNvdXJjZSxcblxuXHRcdC8vIGhlcmUgZG9jXG5cdFx0Ly8gMiBjYXB0dXJpbmcgZ3JvdXBzXG5cdFx0Lzw8LT9cXHMqKFtcIiddPykoXFx3KylcXDFcXHNbXFxzXFxTXSo/W1xcclxcbl1cXDIvLnNvdXJjZVxuXHRdLmpvaW4oJ3wnKTtcblxuXHRQcmlzbS5sYW5ndWFnZXNbJ3NoZWxsLXNlc3Npb24nXSA9IHtcblx0XHQnY29tbWFuZCc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0Ly8gdXNlciBpbmZvXG5cdFx0XHRcdC9eLy5zb3VyY2UgK1xuXHRcdFx0XHQnKD86JyArXG5cdFx0XHRcdChcblx0XHRcdFx0XHQvLyA8dXNlcj4gXCI6XCIgKCA8cGF0aD4gKT9cblx0XHRcdFx0XHQvW15cXHNAOiQjJSohL1xcXFxdK0BbXlxcclxcbkA6JCMlKiEvXFxcXF0rKD86OlteXFwwLVxceDFGJCMlKj9cIjw+Ojt8XSspPy8uc291cmNlICtcblx0XHRcdFx0XHQnfCcgK1xuXHRcdFx0XHRcdC8vIDxwYXRoPlxuXHRcdFx0XHRcdC8vIFNpbmNlIHRoZSBwYXRoIHBhdHRlcm4gaXMgcXVpdGUgZ2VuZXJhbCwgd2Ugd2lsbCByZXF1aXJlIGl0IHRvIHN0YXJ0IHdpdGggYSBzcGVjaWFsIGNoYXJhY3RlciB0b1xuXHRcdFx0XHRcdC8vIHByZXZlbnQgZmFsc2UgcG9zaXRpdmVzLlxuXHRcdFx0XHRcdC9bL34uXVteXFwwLVxceDFGJCMlKj9cIjw+QDo7fF0qLy5zb3VyY2Vcblx0XHRcdFx0KSArXG5cdFx0XHRcdCcpPycgK1xuXHRcdFx0XHQvLyBzaGVsbCBzeW1ib2xcblx0XHRcdFx0L1skIyVdKD89XFxzKS8uc291cmNlICtcblx0XHRcdFx0Ly8gYmFzaCBjb21tYW5kXG5cdFx0XHRcdC8oPzpbXlxcXFxcXHJcXG4gXFx0J1wiPCRdfFsgXFx0XSg/Oig/ISMpfCMuKiQpfFxcXFwoPzpbXlxccl18XFxyXFxuPyl8XFwkKD8hJyl8PCg/ITwpfDw8c3RyPj4pKy8uc291cmNlLnJlcGxhY2UoLzw8c3RyPj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RyaW5nczsgfSksXG5cdFx0XHRcdCdtJ1xuXHRcdFx0KSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnaW5mbyc6IHtcblx0XHRcdFx0XHQvLyBmb29AYmFyOn4vZmlsZXMkIGV4aXRcblx0XHRcdFx0XHQvLyBmb29AYmFyJCBleGl0XG5cdFx0XHRcdFx0Ly8gfi9maWxlcyQgZXhpdFxuXHRcdFx0XHRcdHBhdHRlcm46IC9eW14jJCVdKy8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbicsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQndXNlcic6IC9eW15cXHNAOiQjJSohL1xcXFxdK0BbXlxcclxcbkA6JCMlKiEvXFxcXF0rLyxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86Lyxcblx0XHRcdFx0XHRcdCdwYXRoJzogL1tcXHNcXFNdKy9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdiYXNoJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXlskIyVdXFxzKilcXFNbXFxzXFxTXSovLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1iYXNoJyxcblx0XHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5iYXNoXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzaGVsbC1zeW1ib2wnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15bJCMlXS8sXG5cdFx0XHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdvdXRwdXQnOiAvLig/Oi4qKD86W1xcclxcbl18LiQpKSovXG5cdH07XG5cblx0UHJpc20ubGFuZ3VhZ2VzWydzaC1zZXNzaW9uJ10gPSBQcmlzbS5sYW5ndWFnZXNbJ3NoZWxsc2Vzc2lvbiddID0gUHJpc20ubGFuZ3VhZ2VzWydzaGVsbC1zZXNzaW9uJ107XG5cbn0oUHJpc20pKTtcblxuLy8gVGVzdCBmaWxlcyBmb3IgdGhlIHBhcnNlciBpdHNlbGY6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vSmVzdXNGcmVrZS9zbWFsaS90cmVlL21hc3Rlci9zbWFsaS9zcmMvdGVzdC9yZXNvdXJjZXMvTGV4ZXJUZXN0XG5cblByaXNtLmxhbmd1YWdlcy5zbWFsaSA9IHtcblx0J2NvbW1lbnQnOiAvIy4qLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlxcclxcblxcXFxcIl18XFxcXC4pKlwifCcoPzpbXlxcclxcblxcXFwnXXxcXFxcKD86Lnx1W1xcZGEtZkEtRl17NH0pKScvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXkxdKUwoPzooPzpcXHcrfGBbXmBcXHJcXG5dKmApXFwvKSooPzpbXFx3JF0rfGBbXmBcXHJcXG5dKmApKD89XFxzKjspLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2NsYXNzLW5hbWUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oXkx8XFwvKSg/OltcXHckXSt8YFteYFxcclxcbl0qYCkkLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCduYW1lc3BhY2UnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKEwpKD86KD86XFx3K3xgW15gXFxyXFxuXSpgKVxcLykrLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLy9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdCdidWlsdGluJzogL15ML1xuXHRcdH1cblx0fSxcblx0J2J1aWx0aW4nOiBbXG5cdFx0e1xuXHRcdFx0Ly8gUmVmZXJlbmNlOiBodHRwczovL2dpdGh1Yi5jb20vSmVzdXNGcmVrZS9zbWFsaS93aWtpL1R5cGVzTWV0aG9kc0FuZEZpZWxkcyN0eXBlc1xuXHRcdFx0cGF0dGVybjogLyhbKCk7XFxbXSlbQkNERklKU1ZaXSsvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Ly8gZS5nLiAuZmllbGQgbVdpZmlPblVpZDpJXG5cdFx0XHRwYXR0ZXJuOiAvKFtcXHckPl06KVtCQ0RGSUpTVlpdLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdrZXl3b3JkJzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXFwuZW5kXFxzKylbXFx3LV0rLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcdy4tXSlcXC4oPyFcXGQpW1xcdy1dKy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHcuLV0pKD86YWJzdHJhY3R8YW5ub3RhdGlvbnxicmlkZ2V8Y29uc3RydWN0b3J8ZW51bXxmaW5hbHxpbnRlcmZhY2V8cHJpdmF0ZXxwcm90ZWN0ZWR8cHVibGljfHJ1bnRpbWV8c3RhdGljfHN5bnRoZXRpY3xzeXN0ZW18dHJhbnNpZW50KSg/IVtcXHcuLV0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9XG5cdF0sXG5cdCdmdW5jdGlvbic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHcuLV0pKD86XFx3K3w8W1xcdyQtXSs+KSg/PVxcKCkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblxuXHQnZmllbGQnOiB7XG5cdFx0cGF0dGVybjogL1tcXHckXSsoPz06KS8sXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblx0J3JlZ2lzdGVyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdy4tXSlbdnBdXFxkKD8hW1xcdy4tXSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0fSxcblxuXHQnYm9vbGVhbic6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXHcuLV0pKD86ZmFsc2V8dHJ1ZSkoPyFbXFx3Li1dKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnbnVtYmVyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXi9cXHcuLV0pLT8oPzpOQU58SU5GSU5JVFl8MHgoPzpbXFxkQS1GXSsoPzpcXC5bXFxkQS1GXSopP3xcXC5bXFxkQS1GXSspKD86cFsrLV0/W1xcZEEtRl0rKT98KD86XFxkKyg/OlxcLlxcZCopP3xcXC5cXGQrKSg/OmVbKy1dP1xcZCspPylbZGZsc3RdPyg/IVtcXHcuLV0pL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXG5cdCdsYWJlbCc6IHtcblx0XHRwYXR0ZXJuOiAvKDopXFx3Ky8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXG5cdCdvcGVyYXRvcic6IC8tPnxcXC5cXC58W1xcWz1dLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fSgpLDs6XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5zbWFsbHRhbGsgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlwiXCJ8W15cIl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NoYXInOiB7XG5cdFx0cGF0dGVybjogL1xcJC4vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8nKD86Jyd8W14nXSkqJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzeW1ib2wnOiAvI1tcXGRhLXpdK3wjKD86LXwoWytcXC9cXFxcKn48Pj1AJXwmPyFdKVxcMT8pfCMoPz1cXCgpL2ksXG5cdCdibG9jay1hcmd1bWVudHMnOiB7XG5cdFx0cGF0dGVybjogLyhcXFtcXHMqKTpbXlxcW3xdKlxcfC8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd2YXJpYWJsZSc6IC86W1xcZGEtel0rL2ksXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvXFx8L1xuXHRcdH1cblx0fSxcblx0J3RlbXBvcmFyeS12YXJpYWJsZXMnOiB7XG5cdFx0cGF0dGVybjogL1xcfFtefF0rXFx8Lyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd2YXJpYWJsZSc6IC9bXFxkYS16XSsvaSxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXHwvXG5cdFx0fVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpuZXd8bmlsfHNlbGZ8c3VwZXIpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHQnbnVtYmVyJzogW1xuXHRcdC9cXGQrci0/W1xcZEEtWl0rKD86XFwuW1xcZEEtWl0rKT8oPzplLT9cXGQrKT8vLFxuXHRcdC9cXGJcXGQrKD86XFwuXFxkKyk/KD86ZS0/XFxkKyk/L1xuXHRdLFxuXHQnb3BlcmF0b3InOiAvWzw9XT0/fDo9fH5bfj1dfFxcL1xcLz98XFxcXFxcXFx8Pls+PV0/fFshXitcXC0qJnwsQF0vLFxuXHQncHVuY3R1YXRpb24nOiAvWy47Oj9cXFtcXF0oKXt9XS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMuc21hcnR5ID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogL15cXHtcXCpbXFxzXFxTXSo/XFwqXFx9Lyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J2VtYmVkZGVkLXBocCc6IHtcblx0XHRcdHBhdHRlcm46IC9eXFx7cGhwXFx9W1xcc1xcU10qP1xce1xcL3BocFxcfS8sXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3NtYXJ0eSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxce3BocFxcfXxcXHtcXC9waHBcXH0kLyxcblx0XHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdwaHAnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0YWxpYXM6ICdsYW5ndWFnZS1waHAnLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnBocFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnc3RyaW5nJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXCIoPzpcXFxcLnxbXlwiXFxcXFxcclxcbl0pKlwiLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cXHtbXnt9XSpcXH18YFteYF0qYC8sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRcdFx0cGF0dGVybjogL15be2BdfFtgfV0kLyxcblx0XHRcdFx0XHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdCd2YXJpYWJsZSc6IC9cXCRcXHcrL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvJyg/OlxcXFwufFteJ1xcXFxcXHJcXG5dKSonLyxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdF0sXG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5cXHtcXC8/KVthLXpfXVxcdypcXGIoPyFcXCgpL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0cGF0dGVybjogL15cXHtcXC8/fFxcfSQvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9LFxuXHRcdCdudW1iZXInOiAvXFxiMHhbXFxkQS1GYS1mXSt8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OltFZV1bLStdP1xcZCspPy8sXG5cdFx0J3ZhcmlhYmxlJzogW1xuXHRcdFx0L1xcJCg/IVxcZClcXHcrLyxcblx0XHRcdC8jKD8hXFxkKVxcdysjLyxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXC58LT58XFx3XFxzKj0pKD8hXFxkKVxcdytcXGIoPyFcXCgpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhcXFspKD8hXFxkKVxcdysoPz1cXF0pLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2Z1bmN0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXHxcXHMqKUA/W2Etel9dXFx3KnxcXGJbYS16X11cXHcqKD89XFwoKS9pLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2F0dHItbmFtZSc6IC9cXGJbYS16X11cXHcqKD89XFxzKj0pL2ksXG5cdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bm98b2ZmfG9ufHRydWV8eWVzKVxcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF0oKXt9Liw6YF18LT4vLFxuXHRcdCdvcGVyYXRvcic6IFtcblx0XHRcdC9bK1xcLSpcXC8lXXw9PT89P3xbITw+XT0/fCYmfFxcfFxcfD8vLFxuXHRcdFx0L1xcYmlzXFxzKyg/Om5vdFxccyspPyg/OmRpdnxldmVufG9kZCkoPzpcXHMrYnkpP1xcYi8sXG5cdFx0XHQvXFxiKD86YW5kfGVxfGd0P2V8Z3R8bHQ/ZXxsdHxtb2R8bmVxP3xub3R8b3IpXFxiL1xuXHRcdF1cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuc21hcnR5WydlbWJlZGRlZC1waHAnXS5pbnNpZGUuc21hcnR5Lmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5zbWFydHk7XG5cdFByaXNtLmxhbmd1YWdlcy5zbWFydHkuc3RyaW5nWzBdLmluc2lkZS5pbnRlcnBvbGF0aW9uLmluc2lkZS5leHByZXNzaW9uLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5zbWFydHk7XG5cblx0dmFyIHN0cmluZyA9IC9cIig/OlxcXFwufFteXCJcXFxcXFxyXFxuXSkqXCJ8Jyg/OlxcXFwufFteJ1xcXFxcXHJcXG5dKSonLztcblx0dmFyIHNtYXJ0eVBhdHRlcm4gPSBSZWdFeHAoXG5cdFx0Ly8gY29tbWVudHNcblx0XHQvXFx7XFwqW1xcc1xcU10qP1xcKlxcfS8uc291cmNlICtcblx0XHQnfCcgK1xuXHRcdC8vIHBocCB0YWdzXG5cdFx0L1xce3BocFxcfVtcXHNcXFNdKj9cXHtcXC9waHBcXH0vLnNvdXJjZSArXG5cdFx0J3wnICtcblx0XHQvLyBzbWFydHkgYmxvY2tzXG5cdFx0L1xceyg/Oltee31cIiddfDxzdHI+fFxceyg/Oltee31cIiddfDxzdHI+fFxceyg/Oltee31cIiddfDxzdHI+KSpcXH0pKlxcfSkqXFx9Ly5zb3VyY2Vcblx0XHRcdC5yZXBsYWNlKC88c3RyPi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBzdHJpbmcuc291cmNlOyB9KSxcblx0XHQnZydcblx0KTtcblxuXHQvLyBUb2tlbml6ZSBhbGwgaW5saW5lIFNtYXJ0eSBleHByZXNzaW9uc1xuXHRQcmlzbS5ob29rcy5hZGQoJ2JlZm9yZS10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHR2YXIgc21hcnR5TGl0ZXJhbFN0YXJ0ID0gJ3tsaXRlcmFsfSc7XG5cdFx0dmFyIHNtYXJ0eUxpdGVyYWxFbmQgPSAney9saXRlcmFsfSc7XG5cdFx0dmFyIHNtYXJ0eUxpdGVyYWxNb2RlID0gZmFsc2U7XG5cblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10uYnVpbGRQbGFjZWhvbGRlcnMoZW52LCAnc21hcnR5Jywgc21hcnR5UGF0dGVybiwgZnVuY3Rpb24gKG1hdGNoKSB7XG5cdFx0XHQvLyBTbWFydHkgdGFncyBpbnNpZGUge2xpdGVyYWx9IGJsb2NrIGFyZSBpZ25vcmVkXG5cdFx0XHRpZiAobWF0Y2ggPT09IHNtYXJ0eUxpdGVyYWxFbmQpIHtcblx0XHRcdFx0c21hcnR5TGl0ZXJhbE1vZGUgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFzbWFydHlMaXRlcmFsTW9kZSkge1xuXHRcdFx0XHRpZiAobWF0Y2ggPT09IHNtYXJ0eUxpdGVyYWxTdGFydCkge1xuXHRcdFx0XHRcdHNtYXJ0eUxpdGVyYWxNb2RlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0pO1xuXHR9KTtcblxuXHQvLyBSZS1pbnNlcnQgdGhlIHRva2VucyBhZnRlciB0b2tlbml6aW5nXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ3NtYXJ0eScpO1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG4vLyBodHRwczovL3NtbGZhbWlseS5naXRodWIuaW8vc21sOTctZGVmbi5wZGZcbi8vIGh0dHBzOi8vcGVvcGxlLm1waS1zd3Mub3JnL35yb3NzYmVyZy9zbWwuaHRtbFxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBrZXl3b3JkcyA9IC9cXGIoPzphYnN0eXBlfGFuZHxhbmRhbHNvfGFzfGNhc2V8ZGF0YXR5cGV8ZG98ZWxzZXxlbmR8ZXF0eXBlfGV4Y2VwdGlvbnxmbnxmdW58ZnVuY3RvcnxoYW5kbGV8aWZ8aW58aW5jbHVkZXxpbmZpeHxpbmZpeHJ8bGV0fGxvY2FsfG5vbmZpeHxvZnxvcHxvcGVufG9yZWxzZXxyYWlzZXxyZWN8c2hhcmluZ3xzaWd8c2lnbmF0dXJlfHN0cnVjdHxzdHJ1Y3R1cmV8dGhlbnx0eXBlfHZhbHx3aGVyZXx3aGlsZXx3aXRofHdpdGh0eXBlKVxcYi9pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5zbWwgPSB7XG5cdFx0Ly8gYWxsb3cgb25lIGxldmVsIG9mIG5lc3Rpbmdcblx0XHQnY29tbWVudCc6IC9cXChcXCooPzpbXiooXXxcXCooPyFcXCkpfFxcKCg/IVxcKil8XFwoXFwqKD86W14qKF18XFwqKD8hXFwpKXxcXCgoPyFcXCopKSpcXCpcXCkpKlxcKlxcKS8sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC8jP1wiKD86W15cIlxcXFxdfFxcXFwuKSpcIi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdC8vIFRoaXMgaXMgb25seSBhbiBhcHByb3hpbWF0aW9uIHNpbmNlIHRoZSByZWFsIGdyYW1tYXIgaXMgY29udGV4dC1mcmVlXG5cdFx0XHRcdC8vXG5cdFx0XHRcdC8vIFdoeSB0aGUgbWFpbiBsb29wIHNvIGNvbXBsZXg/XG5cdFx0XHRcdC8vIFRoZSBtYWluIGxvb3AgaXMgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBhcyAvKD86XFxzKig/OlsqLF18LT4pXFxzKjxURVJNSU5BTD4pKi8gd2hpY2ggaXMsIG9idmlvdXNseSwgYSBsb3Rcblx0XHRcdFx0Ly8gc2ltcGxlci4gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBpZiBhIGNvbW1hIGlzIHRoZSBsYXN0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCwgdGhlbiB0aGUgdGVybWluYWwgbXVzdCBiZVxuXHRcdFx0XHQvLyBmb2xsb3dlZCBieSBhIGxvbmcgaWRlbnRpZmllci5cblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0XHRcdC8oKD86XnxbXjpdKTpcXHMqKTxURVJNSU5BTD4oPzpcXHMqKD86KD86XFwqfC0+KVxccyo8VEVSTUlOQUw+fCxcXHMqPFRFUk1JTkFMPig/Oig/PTxOT1QtTEFTVD4pfCg/ITxOT1QtTEFTVD4pXFxzKzxMT05HLUlEPikpKSovLnNvdXJjZVxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoLzxOT1QtTEFTVD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gL1xccyooPzpbKixdfC0+KS8uc291cmNlOyB9KVxuXHRcdFx0XHRcdFx0LnJlcGxhY2UoLzxURVJNSU5BTD4vZywgZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gLyg/OidbXFx3J10qfDxMT05HLUlEPnxcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKXxcXHsoPzpbXnt9XXxcXHtbXnt9XSpcXH0pKlxcfSkoPzpcXHMrPExPTkctSUQ+KSovLnNvdXJjZTtcblx0XHRcdFx0XHRcdH0pXG5cdFx0XHRcdFx0XHQucmVwbGFjZSgvPExPTkctSUQ+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIC8oPyE8S0VZV09SRD4pW2EtelxcZF9dW1xcdycuXSovLnNvdXJjZTsgfSlcblx0XHRcdFx0XHRcdC5yZXBsYWNlKC88S0VZV09SRD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4ga2V5d29yZHMuc291cmNlOyB9KSxcblx0XHRcdFx0XHQnaSdcblx0XHRcdFx0KSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXHcnXSkoPzpkYXRhdHlwZXxleGNlcHRpb258ZnVuY3RvcnxzaWduYXR1cmV8c3RydWN0dXJlfHR5cGUpXFxzKylbYS16X11bXFx3Jy5dKi9pLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKCg/Ol58W15cXHcnXSlmdW5cXHMrKVthLXpfXVtcXHcnLl0qL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblxuXHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFx3J10pJ1tcXHcnXSovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHR9LFxuXG5cdFx0J251bWJlcic6IC9+P1xcYig/OlxcZCsoPzpcXC5cXGQrKT8oPzplfj9cXGQrKT98MHhbXFxkYS1mXSspXFxiL2ksXG5cdFx0J3dvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiMHcoPzpcXGQrfHhbXFxkYS1mXSspXFxiL2ksXG5cdFx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHRcdH0sXG5cblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXHRcdCdvcGVyYXRvcic6IC9cXC5cXC5cXC58Ols+PTpdfD0+P3wtPnxbPD5dPT98WyErXFwtKi9eI3xAfl0vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKCl7fVxcW1xcXS46LDtdL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5zbWxbJ2NsYXNzLW5hbWUnXVswXS5pbnNpZGUgPSBQcmlzbS5sYW5ndWFnZXMuc21sO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5zbWxuaiA9IFByaXNtLmxhbmd1YWdlcy5zbWw7XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnNvbGlkaXR5ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiKD86Y29udHJhY3R8ZW51bXxpbnRlcmZhY2V8bGlicmFyeXxuZXd8c3RydWN0fHVzaW5nKVxccyspKD8hXFxkKVtcXHckXSsvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86X3xhbm9ueW1vdXN8YXN8YXNzZW1ibHl8YXNzZXJ0fGJyZWFrfGNhbGxkYXRhfGNhc2V8Y29uc3RhbnR8Y29uc3RydWN0b3J8Y29udGludWV8Y29udHJhY3R8ZGVmYXVsdHxkZWxldGV8ZG98ZWxzZXxlbWl0fGVudW18ZXZlbnR8ZXh0ZXJuYWx8Zm9yfGZyb218ZnVuY3Rpb258aWZ8aW1wb3J0fGluZGV4ZWR8aW5oZXJpdGVkfGludGVyZmFjZXxpbnRlcm5hbHxpc3xsZXR8bGlicmFyeXxtYXBwaW5nfG1lbW9yeXxtb2RpZmllcnxuZXd8cGF5YWJsZXxwcmFnbWF8cHJpdmF0ZXxwdWJsaWN8cHVyZXxyZXF1aXJlfHJldHVybnM/fHJldmVydHxzZWxmZGVzdHJ1Y3R8c29saWRpdHl8c3RvcmFnZXxzdHJ1Y3R8c3VpY2lkZXxzd2l0Y2h8dGhpc3x0aHJvd3x1c2luZ3x2YXJ8dmlld3x3aGlsZSlcXGIvLFxuXHQnb3BlcmF0b3InOiAvPT58LT58Oj18PTp8XFwqXFwqfFxcK1xcK3wtLXxcXHxcXHx8JiZ8PDw9P3w+Pj0/fFstKyovJV4mfDw+IT1dPT98W34/XS9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdzb2xpZGl0eScsICdrZXl3b3JkJywge1xuXHQnYnVpbHRpbic6IC9cXGIoPzphZGRyZXNzfGJvb2x8Ynl0ZXx1P2ludCg/Ojh8MTZ8MjR8MzJ8NDB8NDh8NTZ8NjR8NzJ8ODB8ODh8OTZ8MTA0fDExMnwxMjB8MTI4fDEzNnwxNDR8MTUyfDE2MHwxNjh8MTc2fDE4NHwxOTJ8MjAwfDIwOHwyMTZ8MjI0fDIzMnwyNDB8MjQ4fDI1Nik/fHN0cmluZ3xieXRlcyg/OlsxLTldfFsxMl1cXGR8M1swLTJdKT8pXFxiL1xufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3NvbGlkaXR5JywgJ251bWJlcicsIHtcblx0J3ZlcnNpb24nOiB7XG5cdFx0cGF0dGVybjogLyhbPD5dPT98XFxeKVxcZCtcXC5cXGQrXFwuXFxkK1xcYi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ251bWJlcicsXG5cdH1cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuc29sID0gUHJpc20ubGFuZ3VhZ2VzLnNvbGlkaXR5O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0dmFyIGd1aWQgPSB7XG5cdFx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pdmVyc2FsbHlfdW5pcXVlX2lkZW50aWZpZXIjRm9ybWF0XG5cdFx0cGF0dGVybjogL1xce1tcXGRhLWZdezh9LVtcXGRhLWZdezR9LVtcXGRhLWZdezR9LVtcXGRhLWZdezR9LVtcXGRhLWZdezEyfVxcfS9pLFxuXHRcdGFsaWFzOiAnY29uc3RhbnQnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1t7fV0vXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlc1snc29sdXRpb24tZmlsZSddID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCJbXlwiXFxyXFxuXSpcInwnW14nXFxyXFxuXSonLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZ3VpZCc6IGd1aWRcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdvYmplY3QnOiB7XG5cdFx0XHQvLyBGb29cblx0XHRcdC8vICAgQmFyKFwiYWJzXCIpID0gOVxuXHRcdFx0Ly8gICBFbmRCYXJcblx0XHRcdC8vICAgUHJvcCA9IFRSVUVcblx0XHRcdC8vIEVuZEZvb1xuXHRcdFx0cGF0dGVybjogL14oWyBcXHRdKikoPzooW0EtWl1cXHcqKVxcYig/PS4qKD86XFxyXFxuP3xcXG4pKD86XFwxWyBcXHRdLiooPzpcXHJcXG4/fFxcbikpKlxcMUVuZFxcMig/PVsgXFx0XSokKSl8RW5kW0EtWl1cXHcqKD89WyBcXHRdKiQpKS9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHR9LFxuXHRcdCdwcm9wZXJ0eSc6IHtcblx0XHRcdHBhdHRlcm46IC9eKFsgXFx0XSopKD8hXFxzKVteXFxyXFxuXCIjPSgpXSpbXlxcc1wiIz0oKV0oPz1cXHMqPSkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2d1aWQnOiBndWlkXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnZ3VpZCc6IGd1aWQsXG5cdFx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKykqXFxiLyxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpGQUxTRXxUUlVFKVxcYi8sXG5cdFx0J29wZXJhdG9yJzogLz0vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKCksXS9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXNbJ3NsbiddID0gUHJpc20ubGFuZ3VhZ2VzWydzb2x1dGlvbi1maWxlJ107XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHR2YXIgc3RyaW5nUGF0dGVybiA9IC8oW1wiJ10pKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS87XG5cdHZhciBudW1iZXJQYXR0ZXJuID0gL1xcYlxcZCsoPzpcXC5cXGQrKT8oPzpbZUVdWystXT9cXGQrKT9cXGJ8XFxiMHhbXFxkQS1GXStcXGIvO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5zb3kgPSB7XG5cdFx0J2NvbW1lbnQnOiBbXG5cdFx0XHQvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXFxzKVxcL1xcLy4qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9XG5cdFx0XSxcblx0XHQnY29tbWFuZC1hcmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxceytcXC8/XFxzKig/OmFsaWFzfGNhbGx8ZGVsY2FsbHxkZWxwYWNrYWdlfGRlbHRlbXBsYXRlfG5hbWVzcGFjZXx0ZW1wbGF0ZSlcXHMrKVxcLj9bXFx3Ll0rLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3N0cmluZycsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcLi9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdwYXJhbWV0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxceytcXC8/XFxzKkA/cGFyYW1cXD8/XFxzKylcXC4/W1xcdy5dKy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICd2YXJpYWJsZSdcblx0XHR9LFxuXHRcdCdrZXl3b3JkJzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxceytcXC8/W15cXFNcXHJcXG5dKikoPzpcXFxcW25ydF18YWxpYXN8Y2FsbHxjYXNlfGNzc3xkZWZhdWx0fGRlbGNhbGx8ZGVscGFja2FnZXxkZWx0ZW1wbGF0ZXxlbHNlKD86aWYpP3xmYWxsYmFja21zZ3xmb3IoPzplYWNoKT98aWYoPzplbXB0eSk/fGxifGxldHxsaXRlcmFsfG1zZ3xuYW1lc3BhY2V8bmlsfEA/cGFyYW1cXD8/fHJifHNwfHN3aXRjaHx0ZW1wbGF0ZXx4aWQpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdC9cXGIoPzphbnl8YXN8YXR0cmlidXRlc3xib29sfGNzc3xmbG9hdHxodG1sfGlufGludHxqc3xsaXN0fG1hcHxudWxsfG51bWJlcnxzdHJpbmd8dXJpKVxcYi9cblx0XHRdLFxuXHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlxceytcXC8/fFxcLz9cXH0rJC8sXG5cdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdH0sXG5cdFx0J3Byb3BlcnR5JzogL1xcdysoPz09KS8sXG5cdFx0J3ZhcmlhYmxlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcJFteXFxXXFxkXVxcdyooPzpcXD8/KD86XFwuXFx3K3xcXFtbXlxcXV0rXFxdKSkqLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnc3RyaW5nJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IHN0cmluZ1BhdHRlcm4sXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdudW1iZXInOiBudW1iZXJQYXR0ZXJuLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvW1xcW1xcXS4/XS9cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiBzdHJpbmdQYXR0ZXJuLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24nOiBbXG5cdFx0XHQvXFx3Kyg/PVxcKCkvLFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxcfFteXFxTXFxyXFxuXSopXFx3Ky8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHQnbnVtYmVyJzogbnVtYmVyUGF0dGVybixcblx0XHQnb3BlcmF0b3InOiAvXFw/Oj98PD0/fD49P3w9PT98IT18WysqLyUtXXxcXGIoPzphbmR8bm90fG9yKVxcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t7fSgpXFxbXFxdfC4sOl0vXG5cdH07XG5cblx0Ly8gVG9rZW5pemUgYWxsIGlubGluZSBTb3kgZXhwcmVzc2lvbnNcblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0dmFyIHNveVBhdHRlcm4gPSAvXFx7XFx7Lis/XFx9XFx9fFxcey4rP1xcfXxcXHNcXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvL2c7XG5cdFx0dmFyIHNveUxpdHRlcmFsU3RhcnQgPSAne2xpdGVyYWx9Jztcblx0XHR2YXIgc295TGl0dGVyYWxFbmQgPSAney9saXRlcmFsfSc7XG5cdFx0dmFyIHNveUxpdHRlcmFsTW9kZSA9IGZhbHNlO1xuXG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ3NveScsIHNveVBhdHRlcm4sIGZ1bmN0aW9uIChtYXRjaCkge1xuXHRcdFx0Ly8gU295IHRhZ3MgaW5zaWRlIHtsaXRlcmFsfSBibG9jayBhcmUgaWdub3JlZFxuXHRcdFx0aWYgKG1hdGNoID09PSBzb3lMaXR0ZXJhbEVuZCkge1xuXHRcdFx0XHRzb3lMaXR0ZXJhbE1vZGUgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFzb3lMaXR0ZXJhbE1vZGUpIHtcblx0XHRcdFx0aWYgKG1hdGNoID09PSBzb3lMaXR0ZXJhbFN0YXJ0KSB7XG5cdFx0XHRcdFx0c295TGl0dGVyYWxNb2RlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0pO1xuXHR9KTtcblxuXHQvLyBSZS1pbnNlcnQgdGhlIHRva2VucyBhZnRlciB0b2tlbml6aW5nXG5cdFByaXNtLmhvb2tzLmFkZCgnYWZ0ZXItdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLnRva2VuaXplUGxhY2Vob2xkZXJzKGVudiwgJ3NveScpO1xuXHR9KTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMudHVydGxlID0ge1xuXHQnY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvIy4qLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J211bHRpbGluZS1zdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiXCJcIig/Oig/OlwiXCI/KT8oPzpbXlwiXFxcXF18XFxcXC4pKSpcIlwiXCJ8JycnKD86KD86Jyc/KT8oPzpbXidcXFxcXXxcXFxcLikpKicnJy8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnc3RyaW5nJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdjb21tZW50JzogLyMuKi9cblx0XHR9XG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86W15cXFxcXCJcXHJcXG5dfFxcXFwuKSpcInwnKD86W15cXFxcJ1xcclxcbl18XFxcXC4pKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndXJsJzoge1xuXHRcdHBhdHRlcm46IC88KD86W15cXHgwMC1cXHgyMDw+XCJ7fXxeYFxcXFxdfFxcXFwoPzp1W1xcZGEtZkEtRl17NH18VVtcXGRhLWZBLUZdezh9KSkqPi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1s8Pl0vXG5cdFx0fVxuXHR9LFxuXHQnZnVuY3Rpb24nOiB7XG5cdFx0cGF0dGVybjogLyg/Oig/IVstLlxcZFxceEI3XSlbLS5cXHdcXHhCN1xceEMwLVxcdUZGRkRdKyk/Oig/Oig/IVstLl0pKD86Wy0uOlxcd1xceEMwLVxcdUZGRkRdfCVbXFxkYS1mXXsyfXxcXFxcLikrKT8vaSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdsb2NhbC1uYW1lJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFteOl0qOilbXFxzXFxTXSsvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J3ByZWZpeCc6IHtcblx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC86L1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHQnbnVtYmVyJzogL1srLV0/XFxiXFxkKyg/OlxcLlxcZCopPyg/OmVbKy1dP1xcZCspPy9pLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9Liw7KClbXFxdXXxcXF5cXF4vLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdrZXl3b3JkJzogW1xuXHRcdC8oPzpcXGJhfEBwcmVmaXh8QGJhc2UpXFxifD0vLFxuXHRcdC9cXGIoPzpiYXNlfGdyYXBofHByZWZpeClcXGIvaVxuXHRdLFxuXHQndGFnJzoge1xuXHRcdHBhdHRlcm46IC9AW2Etel0rKD86LVthLXpcXGRdKykqL2ksXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncHVuY3R1YXRpb24nOiAvQC9cblx0XHR9XG5cdH1cbn07XG5QcmlzbS5sYW5ndWFnZXMudHJpZyA9IFByaXNtLmxhbmd1YWdlc1sndHVydGxlJ107XG5cblByaXNtLmxhbmd1YWdlcy5zcGFycWwgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCd0dXJ0bGUnLCB7XG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL2ksXG5cdCd2YXJpYWJsZSc6IHtcblx0XHRwYXR0ZXJuOiAvWz8kXVxcdysvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxufVxuKTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnc3BhcnFsJywgJ3B1bmN0dWF0aW9uJywge1xuXHQna2V5d29yZCc6IFtcblx0XHQvXFxiKD86QXxBRER8QUxMfEFTfEFTQ3xBU0t8Qk5PREV8Qll8Q0xFQVJ8Q09OU1RSVUNUfENPUFl8Q1JFQVRFfERBVEF8REVGQVVMVHxERUxFVEV8REVTQ3xERVNDUklCRXxESVNUSU5DVHxEUk9QfEVYSVNUU3xGSUxURVJ8RlJPTXxHUk9VUHxIQVZJTkd8SU5TRVJUfElOVE98TElNSVR8TE9BRHxNSU5VU3xNT1ZFfE5BTUVEfE5PVHxOT1d8T0ZGU0VUfE9QVElPTkFMfE9SREVSfFJBTkR8UkVEVUNFRHxTRUxFQ1R8U0VQQVJBVE9SfFNFUlZJQ0V8U0lMRU5UfFNUUlVVSUR8VU5JT058VVNJTkd8VVVJRHxWQUxVRVN8V0hFUkUpXFxiL2ksXG5cdFx0L1xcYig/OkFCU3xBVkd8QklORHxCT1VORHxDRUlMfENPQUxFU0NFfENPTkNBVHxDT05UQUlOU3xDT1VOVHxEQVRBVFlQRXxEQVl8RU5DT0RFX0ZPUl9VUkl8RkxPT1J8R1JPVVBfQ09OQ0FUfEhPVVJTfElGfElSSXxpc0JMQU5LfGlzSVJJfGlzTElURVJBTHxpc05VTUVSSUN8aXNVUkl8TEFOR3xMQU5HTUFUQ0hFU3xMQ0FTRXxNQVh8TUQ1fE1JTnxNSU5VVEVTfE1PTlRIfFJFR0VYfFJFUExBQ0V8Uk9VTkR8c2FtZVRlcm18U0FNUExFfFNFQ09ORFN8U0hBMXxTSEEyNTZ8U0hBMzg0fFNIQTUxMnxTVFJ8U1RSQUZURVJ8U1RSQkVGT1JFfFNUUkRUfFNUUkVORFN8U1RSTEFOR3xTVFJMRU58U1RSU1RBUlRTfFNVQlNUUnxTVU18VElNRVpPTkV8VFp8VUNBU0V8VVJJfFlFQVIpXFxiKD89XFxzKlxcKCkvaSxcblx0XHQvXFxiKD86QkFTRXxHUkFQSHxQUkVGSVgpXFxiL2lcblx0XVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5ycSA9IFByaXNtLmxhbmd1YWdlcy5zcGFycWw7XG5cblByaXNtLmxhbmd1YWdlc1snc3BsdW5rLXNwbCddID0ge1xuXHQnY29tbWVudCc6IC9gY29tbWVudFxcKFwiKD86XFxcXC58W15cXFxcXCJdKSpcIlxcKWAvLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlxcXFwufFteXFxcXFwiXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQvLyBodHRwczovL2RvY3Muc3BsdW5rLmNvbS9Eb2N1bWVudGF0aW9uL1NwbHVuay83LjMuMC9TZWFyY2hSZWZlcmVuY2UvTGlzdE9mU2VhcmNoQ29tbWFuZHNcblx0J2tleXdvcmQnOiAvXFxiKD86YWJzdHJhY3R8YWNjdW18YWRkY29sdG90YWxzfGFkZGluZm98YWRkdG90YWxzfGFuYWx5emVmaWVsZHN8YW5vbWFsaWVzfGFub21hbG91c3ZhbHVlfGFub21hbHlkZXRlY3Rpb258YXBwZW5kfGFwcGVuZGNvbHN8YXBwZW5kY3N2fGFwcGVuZGxvb2t1cHxhcHBlbmRwaXBlfGFydWxlc3xhc3NvY2lhdGV8YXVkaXR8YXV0b3JlZ3Jlc3N8YmlufGJ1Y2tldHxidWNrZXRkaXJ8Y2hhcnR8Y2x1c3Rlcnxjb2ZpbHRlcnxjb2xsZWN0fGNvbmN1cnJlbmN5fGNvbnRpbmdlbmN5fGNvbnZlcnR8Y29ycmVsYXRlfGRhdGFtb2RlbHxkYmluc3BlY3R8ZGVkdXB8ZGVsZXRlfGRlbHRhfGRpZmZ8ZXJleHxldmFsfGV2ZW50Y291bnR8ZXZlbnRzdGF0c3xleHRyYWN0fGZpZWxkZm9ybWF0fGZpZWxkc3xmaWVsZHN1bW1hcnl8ZmlsbGRvd258ZmlsbG51bGx8ZmluZHR5cGVzfGZvbGRlcml6ZXxmb3JlYWNofGZvcm1hdHxmcm9tfGdhdWdlfGdlbnRpbWVzfGdlb218Z2VvbWZpbHRlcnxnZW9zdGF0c3xoZWFkfGhpZ2hsaWdodHxoaXN0b3J5fGljb25pZnl8aW5wdXR8aW5wdXRjc3Z8aW5wdXRsb29rdXB8aXBsb2NhdGlvbnxqb2lufGttZWFuc3xrdnxrdmZvcm18bG9hZGpvYnxsb2NhbGl6ZXxsb2NhbG9wfGxvb2t1cHxtYWtlY29udGludW91c3xtYWtlbXZ8bWFrZXJlc3VsdHN8bWFwfG1jb2xsZWN0fG1ldGFkYXRhfG1ldGFzZWFyY2h8bWV2ZW50Y29sbGVjdHxtc3RhdHN8bXVsdGlrdnxtdWx0aXNlYXJjaHxtdmNvbWJpbmV8bXZleHBhbmR8bm9tdnxvdXRsaWVyfG91dHB1dGNzdnxvdXRwdXRsb29rdXB8b3V0cHV0dGV4dHxvdmVybGFwfHBpdm90fHByZWRpY3R8cmFuZ2VtYXB8cmFyZXxyZWdleHxyZWxldmFuY3l8cmVsdGltZXxyZW5hbWV8cmVwbGFjZXxyZXN0fHJldHVybnxyZXZlcnNlfHJleHxydG9yZGVyfHJ1bnxzYXZlZHNlYXJjaHxzY3JpcHR8c2NydWJ8c2VhcmNofHNlYXJjaHR4bnxzZWxmam9pbnxzZW5kZW1haWx8c2V0fHNldGZpZWxkc3xzaWNoYXJ0fHNpcmFyZXxzaXN0YXRzfHNpdGltZWNoYXJ0fHNpdG9wfHNvcnR8c3BhdGh8c3RhdHN8c3RyY2F0fHN0cmVhbXN0YXRzfHRhYmxlfHRhZ3N8dGFpbHx0aW1lY2hhcnR8dGltZXdyYXB8dG9wfHRyYW5zYWN0aW9ufHRyYW5zcG9zZXx0cmVuZGxpbmV8dHNjb2xsZWN0fHRzdGF0c3x0eXBlYWhlYWR8dHlwZWxlYXJuZXJ8dHlwZXJ8dW5pb258dW5pcXx1bnRhYmxlfHdoZXJlfHgxMXx4bWxrdnx4bWx1bmVzY2FwZXx4cGF0aHx4eXNlcmllcylcXGIvaSxcblx0J29wZXJhdG9yLXdvcmQnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmFuZHxhc3xieXxub3R8b3J8eG9yKVxcYi9pLFxuXHRcdGFsaWFzOiAnb3BlcmF0b3InXG5cdH0sXG5cdCdmdW5jdGlvbic6IC9cXGJcXHcrKD89XFxzKlxcKCkvLFxuXHQncHJvcGVydHknOiAvXFxiXFx3Kyg/PVxccyo9KD8hPSkpLyxcblx0J2RhdGUnOiB7XG5cdFx0Ly8gTU0vREQvWVlZWSg6SEg6TU06U1MpP1xuXHRcdHBhdHRlcm46IC9cXGJcXGR7MSwyfVxcL1xcZHsxLDJ9XFwvXFxkezEsNH0oPzooPzo6XFxkezEsMn0pezN9KT9cXGIvLFxuXHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHR9LFxuXHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQrKT9cXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmfGZhbHNlfHR8dHJ1ZSlcXGIvaSxcblx0J29wZXJhdG9yJzogL1s8Pj1dPT98Wy0rKi8lfF0vLFxuXHQncHVuY3R1YXRpb24nOiAvWygpW1xcXSxdL1xufTtcblxuUHJpc20ubGFuZ3VhZ2VzLnNxZiA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/Oig/OlwiXCIpP1teXCJdKSpcIig/IVwiKXwnKD86W14nXSkqJy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmJyZWFrT3V0fGJyZWFrVG98Y2FsbHxjYXNlfGNhdGNofGRlZmF1bHR8ZG98ZWNob3xlbHNlfGV4ZWNGU018ZXhlY1ZNfGV4aXRXaXRofGZvcnxmb3JFYWNofGZvckVhY2hNZW1iZXJ8Zm9yRWFjaE1lbWJlckFnZW50fGZvckVhY2hNZW1iZXJUZWFtfGZyb218Z290b3xpZnxuaWx8cHJlcHJvY2Vzc0ZpbGV8cHJlcHJvY2Vzc0ZpbGVMaW5lTnVtYmVyc3xwcml2YXRlfHNjb3BlTmFtZXxzcGF3bnxzdGVwfHN3aXRjaHx0aGVufHRocm93fHRvfHRyeXx3aGlsZXx3aXRoKVxcYi9pLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi9pLFxuXHQnZnVuY3Rpb24nOiAvXFxiKD86YWJzfGFjY1RpbWV8YWNvc3xhY3Rpb258YWN0aW9uSURzfGFjdGlvbktleXN8YWN0aW9uS2V5c0ltYWdlc3xhY3Rpb25LZXlzTmFtZXN8YWN0aW9uS2V5c05hbWVzQXJyYXl8YWN0aW9uTmFtZXxhY3Rpb25QYXJhbXN8YWN0aXZhdGVBZGRvbnN8YWN0aXZhdGVkQWRkb25zfGFjdGl2YXRlS2V5fGFkZDNERU5Db25uZWN0aW9ufGFkZDNERU5FdmVudEhhbmRsZXJ8YWRkM0RFTkxheWVyfGFkZEFjdGlvbnxhZGRCYWNrcGFja3xhZGRCYWNrcGFja0NhcmdvfGFkZEJhY2twYWNrQ2FyZ29HbG9iYWx8YWRkQmFja3BhY2tHbG9iYWx8YWRkQ2FtU2hha2V8YWRkQ3VyYXRvckFkZG9uc3xhZGRDdXJhdG9yQ2FtZXJhQXJlYXxhZGRDdXJhdG9yRWRpdGFibGVPYmplY3RzfGFkZEN1cmF0b3JFZGl0aW5nQXJlYXxhZGRDdXJhdG9yUG9pbnRzfGFkZEVkaXRvck9iamVjdHxhZGRFdmVudEhhbmRsZXJ8YWRkRm9yY2V8YWRkRm9yY2VHZW5lcmF0b3JSVER8YWRkR29nZ2xlc3xhZGRHcm91cEljb258YWRkSGFuZGd1bkl0ZW18YWRkSGVhZGdlYXJ8YWRkSXRlbXxhZGRJdGVtQ2FyZ298YWRkSXRlbUNhcmdvR2xvYmFsfGFkZEl0ZW1Qb29sfGFkZEl0ZW1Ub0JhY2twYWNrfGFkZEl0ZW1Ub1VuaWZvcm18YWRkSXRlbVRvVmVzdHxhZGRMaXZlU3RhdHN8YWRkTWFnYXppbmV8YWRkTWFnYXppbmVBbW1vQ2FyZ298YWRkTWFnYXppbmVDYXJnb3xhZGRNYWdhemluZUNhcmdvR2xvYmFsfGFkZE1hZ2F6aW5lR2xvYmFsfGFkZE1hZ2F6aW5lUG9vbHxhZGRNYWdhemluZXN8YWRkTWFnYXppbmVUdXJyZXR8YWRkTWVudXxhZGRNZW51SXRlbXxhZGRNaXNzaW9uRXZlbnRIYW5kbGVyfGFkZE1QRXZlbnRIYW5kbGVyfGFkZE11c2ljRXZlbnRIYW5kbGVyfGFkZE93bmVkTWluZXxhZGRQbGF5ZXJTY29yZXN8YWRkUHJpbWFyeVdlYXBvbkl0ZW18YWRkUHVibGljVmFyaWFibGVFdmVudEhhbmRsZXJ8YWRkUmF0aW5nfGFkZFJlc291cmNlc3xhZGRTY29yZXxhZGRTY29yZVNpZGV8YWRkU2Vjb25kYXJ5V2VhcG9uSXRlbXxhZGRTd2l0Y2hhYmxlVW5pdHxhZGRUZWFtTWVtYmVyfGFkZFRvUmVtYWluc0NvbGxlY3RvcnxhZGRUb3JxdWV8YWRkVW5pZm9ybXxhZGRWZWhpY2xlfGFkZFZlc3R8YWRkV2F5cG9pbnR8YWRkV2VhcG9ufGFkZFdlYXBvbkNhcmdvfGFkZFdlYXBvbkNhcmdvR2xvYmFsfGFkZFdlYXBvbkdsb2JhbHxhZGRXZWFwb25JdGVtfGFkZFdlYXBvblBvb2x8YWRkV2VhcG9uVHVycmV0fGFkbWlufGFnZW50fGFnZW50c3xBR0xUb0FTTHxhaW1lZEF0VGFyZ2V0fGFpbVBvc3xhaXJEZW5zaXR5Q3VydmVSVER8YWlyRGVuc2l0eVJURHxhaXJwbGFuZVRocm90dGxlfGFpcnBvcnRTaWRlfEFJU0ZpbmlzaEhlYWx8YWxpdmV8YWxsM0RFTkVudGl0aWVzfGFsbEFpcnBvcnRzfGFsbENvbnRyb2xzfGFsbEN1cmF0b3JzfGFsbEN1dExheWVyc3xhbGxEZWFkfGFsbERlYWRNZW58YWxsRGlzcGxheXN8YWxsR3JvdXBzfGFsbE1hcE1hcmtlcnN8YWxsTWluZXN8YWxsTWlzc2lvbk9iamVjdHN8YWxsb3czRE1vZGV8YWxsb3dDcmV3SW5JbW1vYmlsZXxhbGxvd0N1cmF0b3JMb2dpY0lnbm9yZUFyZWFzfGFsbG93RGFtYWdlfGFsbG93RGFtbWFnZXxhbGxvd0ZpbGVPcGVyYXRpb25zfGFsbG93RmxlZWluZ3xhbGxvd0dldElufGFsbG93U3ByaW50fGFsbFBsYXllcnN8YWxsU2ltcGxlT2JqZWN0c3xhbGxTaXRlc3xhbGxUdXJyZXRzfGFsbFVuaXRzfGFsbFVuaXRzVUFWfGFsbFZhcmlhYmxlc3xhbW1vfGFtbW9PblB5bG9ufGFuaW1hdGV8YW5pbWF0ZUJheXxhbmltYXRlRG9vcnxhbmltYXRlUHlsb258YW5pbWF0ZVNvdXJjZXxhbmltYXRpb25OYW1lc3xhbmltYXRpb25QaGFzZXxhbmltYXRpb25Tb3VyY2VQaGFzZXxhbmltYXRpb25TdGF0ZXxhcHBlbmR8YXBwbHl8YXJtb3J5UG9pbnRzfGFycmF5SW50ZXJzZWN0fGFzaW58QVNMVG9BR0x8QVNMVG9BVEx8YXNzZXJ0fGFzc2lnbkFzQ2FyZ298YXNzaWduQXNDYXJnb0luZGV4fGFzc2lnbkFzQ29tbWFuZGVyfGFzc2lnbkFzRHJpdmVyfGFzc2lnbkFzR3VubmVyfGFzc2lnbkFzVHVycmV0fGFzc2lnbkN1cmF0b3J8YXNzaWduZWRDYXJnb3xhc3NpZ25lZENvbW1hbmRlcnxhc3NpZ25lZERyaXZlcnxhc3NpZ25lZEd1bm5lcnxhc3NpZ25lZEl0ZW1zfGFzc2lnbmVkVGFyZ2V0fGFzc2lnbmVkVGVhbXxhc3NpZ25lZFZlaGljbGV8YXNzaWduZWRWZWhpY2xlUm9sZXxhc3NpZ25JdGVtfGFzc2lnblRlYW18YXNzaWduVG9BaXJwb3J0fGF0YW58YXRhbjJ8YXRnfEFUTFRvQVNMfGF0dGFjaGVkT2JqZWN0fGF0dGFjaGVkT2JqZWN0c3xhdHRhY2hlZFRvfGF0dGFjaE9iamVjdHxhdHRhY2hUb3xhdHRhY2tFbmFibGVkfGJhY2twYWNrfGJhY2twYWNrQ2FyZ298YmFja3BhY2tDb250YWluZXJ8YmFja3BhY2tJdGVtc3xiYWNrcGFja01hZ2F6aW5lc3xiYWNrcGFja1NwYWNlRm9yfGJlaGF2aW91cnxiZW5jaG1hcmt8Ymlub2N1bGFyfGJsdWZvcnxib3VuZGluZ0JveHxib3VuZGluZ0JveFJlYWx8Ym91bmRpbmdDZW50ZXJ8YnJpZWZpbmdOYW1lfGJ1aWxkaW5nRXhpdHxidWlsZGluZ1Bvc3xidWxkb3plcl9FbmFibGVSb2FkRGlhZ3xidWxkb3plcl9Jc0VuYWJsZWRSb2FkRGlhZ3xidWxkb3plcl9Mb2FkTmV3Um9hZHN8YnVsZG96ZXJfcmVsb2FkT3Blck1hcHxidXR0b25BY3Rpb258YnV0dG9uU2V0QWN0aW9ufGNhZGV0TW9kZXxjYWxsRXh0ZW5zaW9ufGNhbUNvbW1hbmR8Y2FtQ29tbWl0fGNhbUNvbW1pdFByZXBhcmVkfGNhbUNvbW1pdHRlZHxjYW1Db25zdHVjdGlvblNldFBhcmFtc3xjYW1DcmVhdGV8Y2FtRGVzdHJveXxjYW1lcmFFZmZlY3R8Y2FtZXJhRWZmZWN0RW5hYmxlSFVEfGNhbWVyYUludGVyZXN0fGNhbWVyYU9ufGNhbWVyYVZpZXd8Y2FtcGFpZ25Db25maWdGaWxlfGNhbVByZWxvYWR8Y2FtUHJlbG9hZGVkfGNhbVByZXBhcmVCYW5rfGNhbVByZXBhcmVEaXJ8Y2FtUHJlcGFyZURpdmV8Y2FtUHJlcGFyZUZvY3VzfGNhbVByZXBhcmVGb3Z8Y2FtUHJlcGFyZUZvdlJhbmdlfGNhbVByZXBhcmVQb3N8Y2FtUHJlcGFyZVJlbFBvc3xjYW1QcmVwYXJlVGFyZ2V0fGNhbVNldEJhbmt8Y2FtU2V0RGlyfGNhbVNldERpdmV8Y2FtU2V0Rm9jdXN8Y2FtU2V0Rm92fGNhbVNldEZvdlJhbmdlfGNhbVNldFBvc3xjYW1TZXRSZWxQb3N8Y2FtU2V0VGFyZ2V0fGNhbVRhcmdldHxjYW1Vc2VOVkd8Y2FuQWRkfGNhbkFkZEl0ZW1Ub0JhY2twYWNrfGNhbkFkZEl0ZW1Ub1VuaWZvcm18Y2FuQWRkSXRlbVRvVmVzdHxjYW5jZWxTaW1wbGVUYXNrRGVzdGluYXRpb258Y2FuRmlyZXxjYW5Nb3ZlfGNhblNsaW5nTG9hZHxjYW5TdGFuZHxjYW5TdXNwZW5kfGNhblRyaWdnZXJEeW5hbWljU2ltdWxhdGlvbnxjYW5VbmxvYWRJbkNvbWJhdHxjYW5WZWhpY2xlQ2FyZ298Y2FwdGl2ZXxjYXB0aXZlTnVtfGNiQ2hlY2tlZHxjYlNldENoZWNrZWR8Y2VpbHxjaGFubmVsRW5hYmxlZHxjaGVhdHNFbmFibGVkfGNoZWNrQUlGZWF0dXJlfGNoZWNrVmlzaWJpbGl0eXxjaXZpbGlhbnxjbGFzc05hbWV8Y2xlYXIzREVOQXR0cmlidXRlfGNsZWFyM0RFTkludmVudG9yeXxjbGVhckFsbEl0ZW1zRnJvbUJhY2twYWNrfGNsZWFyQmFja3BhY2tDYXJnb3xjbGVhckJhY2twYWNrQ2FyZ29HbG9iYWx8Y2xlYXJGb3JjZXNSVER8Y2xlYXJHcm91cEljb25zfGNsZWFySXRlbUNhcmdvfGNsZWFySXRlbUNhcmdvR2xvYmFsfGNsZWFySXRlbVBvb2x8Y2xlYXJNYWdhemluZUNhcmdvfGNsZWFyTWFnYXppbmVDYXJnb0dsb2JhbHxjbGVhck1hZ2F6aW5lUG9vbHxjbGVhck92ZXJsYXl8Y2xlYXJSYWRpb3xjbGVhclZlaGljbGVJbml0fGNsZWFyV2VhcG9uQ2FyZ298Y2xlYXJXZWFwb25DYXJnb0dsb2JhbHxjbGVhcldlYXBvblBvb2x8Y2xpZW50T3duZXJ8Y2xvc2VEaWFsb2d8Y2xvc2VEaXNwbGF5fGNsb3NlT3ZlcmxheXxjb2xsYXBzZU9iamVjdFRyZWV8Y29sbGVjdDNERU5IaXN0b3J5fGNvbGxlY3RpdmVSVER8Y29tYmF0TW9kZXxjb21tYW5kQXJ0aWxsZXJ5RmlyZXxjb21tYW5kQ2hhdHxjb21tYW5kZXJ8Y29tbWFuZEZpcmV8Y29tbWFuZEZvbGxvd3xjb21tYW5kRlNNfGNvbW1hbmRHZXRPdXR8Y29tbWFuZGluZ01lbnV8Y29tbWFuZE1vdmV8Y29tbWFuZFJhZGlvfGNvbW1hbmRTdG9wfGNvbW1hbmRTdXBwcmVzc2l2ZUZpcmV8Y29tbWFuZFRhcmdldHxjb21tYW5kV2F0Y2h8Y29tbWVudHxjb21taXRPdmVybGF5fGNvbXBpbGV8Y29tcGlsZUZpbmFsfGNvbXBsZXRlZEZTTXxjb21wb3NlVGV4dHxjb25maWdDbGFzc2VzfGNvbmZpZ0ZpbGV8Y29uZmlnSGllcmFyY2h5fGNvbmZpZ05hbWV8Y29uZmlnTnVsbHxjb25maWdQcm9wZXJ0aWVzfGNvbmZpZ1NvdXJjZUFkZG9uTGlzdHxjb25maWdTb3VyY2VNb2R8Y29uZmlnU291cmNlTW9kTGlzdHxjb25maXJtU2Vuc29yVGFyZ2V0fGNvbm5lY3RUZXJtaW5hbFRvVUFWfGNvbnRyb2xOdWxsfGNvbnRyb2xzR3JvdXBDdHJsfGNvcHlGcm9tQ2xpcGJvYXJkfGNvcHlUb0NsaXBib2FyZHxjb3B5V2F5cG9pbnRzfGNvc3xjb3VudHxjb3VudEVuZW15fGNvdW50RnJpZW5kbHl8Y291bnRTaWRlfGNvdW50VHlwZXxjb3VudFVua25vd258Y3JlYXRlM0RFTkNvbXBvc2l0aW9ufGNyZWF0ZTNERU5FbnRpdHl8Y3JlYXRlQWdlbnR8Y3JlYXRlQ2VudGVyfGNyZWF0ZURpYWxvZ3xjcmVhdGVEaWFyeUxpbmt8Y3JlYXRlRGlhcnlSZWNvcmR8Y3JlYXRlRGlhcnlTdWJqZWN0fGNyZWF0ZURpc3BsYXl8Y3JlYXRlR2VhckRpYWxvZ3xjcmVhdGVHcm91cHxjcmVhdGVHdWFyZGVkUG9pbnR8Y3JlYXRlTG9jYXRpb258Y3JlYXRlTWFya2VyfGNyZWF0ZU1hcmtlckxvY2FsfGNyZWF0ZU1lbnV8Y3JlYXRlTWluZXxjcmVhdGVNaXNzaW9uRGlzcGxheXxjcmVhdGVNUENhbXBhaWduRGlzcGxheXxjcmVhdGVTaW1wbGVPYmplY3R8Y3JlYXRlU2ltcGxlVGFza3xjcmVhdGVTaXRlfGNyZWF0ZVNvdW5kU291cmNlfGNyZWF0ZVRhc2t8Y3JlYXRlVGVhbXxjcmVhdGVUcmlnZ2VyfGNyZWF0ZVVuaXR8Y3JlYXRlVmVoaWNsZXxjcmVhdGVWZWhpY2xlQ3Jld3xjcmVhdGVWZWhpY2xlTG9jYWx8Y3Jld3xjdEFkZEhlYWRlcnxjdEFkZFJvd3xjdENsZWFyfGN0Q3VyU2VsfGN0RGF0YXxjdEZpbmRIZWFkZXJSb3dzfGN0RmluZFJvd0hlYWRlcnxjdEhlYWRlckNvbnRyb2xzfGN0SGVhZGVyQ291bnR8Y3RSZW1vdmVIZWFkZXJzfGN0UmVtb3ZlUm93c3xjdHJsQWN0aXZhdGV8Y3RybEFkZEV2ZW50SGFuZGxlcnxjdHJsQW5nbGV8Y3RybEF1dG9TY3JvbGxEZWxheXxjdHJsQXV0b1Njcm9sbFJld2luZHxjdHJsQXV0b1Njcm9sbFNwZWVkfGN0cmxDaGVja2VkfGN0cmxDbGFzc05hbWV8Y3RybENvbW1pdHxjdHJsQ29tbWl0dGVkfGN0cmxDcmVhdGV8Y3RybERlbGV0ZXxjdHJsRW5hYmxlfGN0cmxFbmFibGVkfGN0cmxGYWRlfGN0cmxIVE1MTG9hZGVkfGN0cmxJREN8Y3RybElERHxjdHJsTWFwQW5pbUFkZHxjdHJsTWFwQW5pbUNsZWFyfGN0cmxNYXBBbmltQ29tbWl0fGN0cmxNYXBBbmltRG9uZXxjdHJsTWFwQ3Vyc29yfGN0cmxNYXBNb3VzZU92ZXJ8Y3RybE1hcFNjYWxlfGN0cmxNYXBTY3JlZW5Ub1dvcmxkfGN0cmxNYXBXb3JsZFRvU2NyZWVufGN0cmxNb2RlbHxjdHJsTW9kZWxEaXJBbmRVcHxjdHJsTW9kZWxTY2FsZXxjdHJsUGFyZW50fGN0cmxQYXJlbnRDb250cm9sc0dyb3VwfGN0cmxQb3NpdGlvbnxjdHJsUmVtb3ZlQWxsRXZlbnRIYW5kbGVyc3xjdHJsUmVtb3ZlRXZlbnRIYW5kbGVyfGN0cmxTY2FsZXxjdHJsU2V0QWN0aXZlQ29sb3J8Y3RybFNldEFuZ2xlfGN0cmxTZXRBdXRvU2Nyb2xsRGVsYXl8Y3RybFNldEF1dG9TY3JvbGxSZXdpbmR8Y3RybFNldEF1dG9TY3JvbGxTcGVlZHxjdHJsU2V0QmFja2dyb3VuZENvbG9yfGN0cmxTZXRDaGVja2VkfGN0cmxTZXREaXNhYmxlZENvbG9yfGN0cmxTZXRFdmVudEhhbmRsZXJ8Y3RybFNldEZhZGV8Y3RybFNldEZvY3VzfGN0cmxTZXRGb250fGN0cmxTZXRGb250SDF8Y3RybFNldEZvbnRIMUJ8Y3RybFNldEZvbnRIMnxjdHJsU2V0Rm9udEgyQnxjdHJsU2V0Rm9udEgzfGN0cmxTZXRGb250SDNCfGN0cmxTZXRGb250SDR8Y3RybFNldEZvbnRINEJ8Y3RybFNldEZvbnRINXxjdHJsU2V0Rm9udEg1QnxjdHJsU2V0Rm9udEg2fGN0cmxTZXRGb250SDZCfGN0cmxTZXRGb250SGVpZ2h0fGN0cmxTZXRGb250SGVpZ2h0SDF8Y3RybFNldEZvbnRIZWlnaHRIMnxjdHJsU2V0Rm9udEhlaWdodEgzfGN0cmxTZXRGb250SGVpZ2h0SDR8Y3RybFNldEZvbnRIZWlnaHRINXxjdHJsU2V0Rm9udEhlaWdodEg2fGN0cmxTZXRGb250SGVpZ2h0U2Vjb25kYXJ5fGN0cmxTZXRGb250UHxjdHJsU2V0Rm9udFBCfGN0cmxTZXRGb250U2Vjb25kYXJ5fGN0cmxTZXRGb3JlZ3JvdW5kQ29sb3J8Y3RybFNldE1vZGVsfGN0cmxTZXRNb2RlbERpckFuZFVwfGN0cmxTZXRNb2RlbFNjYWxlfGN0cmxTZXRQaXhlbFByZWNpc2lvbnxjdHJsU2V0UG9zaXRpb258Y3RybFNldFNjYWxlfGN0cmxTZXRTdHJ1Y3R1cmVkVGV4dHxjdHJsU2V0VGV4dHxjdHJsU2V0VGV4dENvbG9yfGN0cmxTZXRUZXh0Q29sb3JTZWNvbmRhcnl8Y3RybFNldFRleHRTZWNvbmRhcnl8Y3RybFNldFRvb2x0aXB8Y3RybFNldFRvb2x0aXBDb2xvckJveHxjdHJsU2V0VG9vbHRpcENvbG9yU2hhZGV8Y3RybFNldFRvb2x0aXBDb2xvclRleHR8Y3RybFNob3d8Y3RybFNob3dufGN0cmxUZXh0fGN0cmxUZXh0SGVpZ2h0fGN0cmxUZXh0U2Vjb25kYXJ5fGN0cmxUZXh0V2lkdGh8Y3RybFR5cGV8Y3RybFZpc2libGV8Y3RSb3dDb250cm9sc3xjdFJvd0NvdW50fGN0U2V0Q3VyU2VsfGN0U2V0RGF0YXxjdFNldEhlYWRlclRlbXBsYXRlfGN0U2V0Um93VGVtcGxhdGV8Y3RTZXRWYWx1ZXxjdFZhbHVlfGN1cmF0b3JBZGRvbnN8Y3VyYXRvckNhbWVyYXxjdXJhdG9yQ2FtZXJhQXJlYXxjdXJhdG9yQ2FtZXJhQXJlYUNlaWxpbmd8Y3VyYXRvckNvZWZ8Y3VyYXRvckVkaXRhYmxlT2JqZWN0c3xjdXJhdG9yRWRpdGluZ0FyZWF8Y3VyYXRvckVkaXRpbmdBcmVhVHlwZXxjdXJhdG9yTW91c2VPdmVyfGN1cmF0b3JQb2ludHN8Y3VyYXRvclJlZ2lzdGVyZWRPYmplY3RzfGN1cmF0b3JTZWxlY3RlZHxjdXJhdG9yV2F5cG9pbnRDb3N0fGN1cnJlbnQzREVOT3BlcmF0aW9ufGN1cnJlbnRDaGFubmVsfGN1cnJlbnRDb21tYW5kfGN1cnJlbnRNYWdhemluZXxjdXJyZW50TWFnYXppbmVEZXRhaWx8Y3VycmVudE1hZ2F6aW5lRGV0YWlsVHVycmV0fGN1cnJlbnRNYWdhemluZVR1cnJldHxjdXJyZW50TXV6emxlfGN1cnJlbnROYW1lc3BhY2V8Y3VycmVudFRhc2t8Y3VycmVudFRhc2tzfGN1cnJlbnRUaHJvd2FibGV8Y3VycmVudFZpc2lvbk1vZGV8Y3VycmVudFdheXBvaW50fGN1cnJlbnRXZWFwb258Y3VycmVudFdlYXBvbk1vZGV8Y3VycmVudFdlYXBvblR1cnJldHxjdXJyZW50WmVyb2luZ3xjdXJzb3JPYmplY3R8Y3Vyc29yVGFyZ2V0fGN1c3RvbUNoYXR8Y3VzdG9tUmFkaW98Y3V0RmFkZU91dHxjdXRPYmp8Y3V0UnNjfGN1dFRleHR8ZGFtYWdlfGRhdGV8ZGF0ZVRvTnVtYmVyfGRheXRpbWV8ZGVBY3RpdmF0ZUtleXxkZWJyaWVmaW5nVGV4dHxkZWJ1Z0ZTTXxkZWJ1Z0xvZ3xkZWd8ZGVsZXRlM0RFTkVudGl0aWVzfGRlbGV0ZUF0fGRlbGV0ZUNlbnRlcnxkZWxldGVDb2xsZWN0aW9ufGRlbGV0ZUVkaXRvck9iamVjdHxkZWxldGVHcm91cHxkZWxldGVHcm91cFdoZW5FbXB0eXxkZWxldGVJZGVudGl0eXxkZWxldGVMb2NhdGlvbnxkZWxldGVNYXJrZXJ8ZGVsZXRlTWFya2VyTG9jYWx8ZGVsZXRlUmFuZ2V8ZGVsZXRlUmVzb3VyY2VzfGRlbGV0ZVNpdGV8ZGVsZXRlU3RhdHVzfGRlbGV0ZVRlYW18ZGVsZXRlVmVoaWNsZXxkZWxldGVWZWhpY2xlQ3Jld3xkZWxldGVXYXlwb2ludHxkZXRhY2h8ZGV0ZWN0ZWRNaW5lc3xkaWFnX2FjdGl2ZU1pc3Npb25GU01zfGRpYWdfYWN0aXZlU2NyaXB0c3xkaWFnX2FjdGl2ZVNRRlNjcmlwdHN8ZGlhZ19hY3RpdmVTUVNTY3JpcHRzfGRpYWdfY2FwdHVyZUZyYW1lfGRpYWdfY2FwdHVyZUZyYW1lVG9GaWxlfGRpYWdfY2FwdHVyZVNsb3dGcmFtZXxkaWFnX2NvZGVQZXJmb3JtYW5jZXxkaWFnX2RyYXdNb2RlfGRpYWdfZHluYW1pY1NpbXVsYXRpb25FbmR8ZGlhZ19lbmFibGV8ZGlhZ19lbmFibGVkfGRpYWdfZnBzfGRpYWdfZnBzTWlufGRpYWdfZnJhbWVOb3xkaWFnX2xpZ2h0TmV3TG9hZHxkaWFnX2xpc3R8ZGlhZ19sb2d8ZGlhZ19sb2dTbG93RnJhbWV8ZGlhZ19tZXJnZUNvbmZpZ0ZpbGV8ZGlhZ19yZWNvcmRUdXJyZXRMaW1pdHN8ZGlhZ19zZXRMaWdodE5ld3xkaWFnX3RpY2tUaW1lfGRpYWdfdG9nZ2xlfGRpYWxvZ3xkaWFyeVN1YmplY3RFeGlzdHN8ZGlkSklQfGRpZEpJUE93bmVyfGRpZmZpY3VsdHl8ZGlmZmljdWx0eUVuYWJsZWR8ZGlmZmljdWx0eUVuYWJsZWRSVER8ZGlmZmljdWx0eU9wdGlvbnxkaXJlY3Rpb258ZGlyZWN0U2F5fGRpc2FibGVBSXxkaXNhYmxlQ29sbGlzaW9uV2l0aHxkaXNhYmxlQ29udmVyc2F0aW9ufGRpc2FibGVEZWJyaWVmaW5nU3RhdHN8ZGlzYWJsZU1hcEluZGljYXRvcnN8ZGlzYWJsZU5WR0VxdWlwbWVudHxkaXNhYmxlUmVtb3RlU2Vuc29yc3xkaXNhYmxlU2VyaWFsaXphdGlvbnxkaXNhYmxlVElFcXVpcG1lbnR8ZGlzYWJsZVVBVkNvbm5lY3RhYmlsaXR5fGRpc2FibGVVc2VySW5wdXR8ZGlzcGxheUFkZEV2ZW50SGFuZGxlcnxkaXNwbGF5Q3RybHxkaXNwbGF5TnVsbHxkaXNwbGF5UGFyZW50fGRpc3BsYXlSZW1vdmVBbGxFdmVudEhhbmRsZXJzfGRpc3BsYXlSZW1vdmVFdmVudEhhbmRsZXJ8ZGlzcGxheVNldEV2ZW50SGFuZGxlcnxkaXNzb2x2ZVRlYW18ZGlzdGFuY2V8ZGlzdGFuY2UyRHxkaXN0YW5jZVNxcnxkaXN0cmlidXRpb25SZWdpb258ZG8zREVOQWN0aW9ufGRvQXJ0aWxsZXJ5RmlyZXxkb0ZpcmV8ZG9Gb2xsb3d8ZG9GU018ZG9HZXRPdXR8ZG9Nb3ZlfGRvb3JQaGFzZXxkb1N0b3B8ZG9TdXBwcmVzc2l2ZUZpcmV8ZG9UYXJnZXR8ZG9XYXRjaHxkcmF3QXJyb3d8ZHJhd0VsbGlwc2V8ZHJhd0ljb258ZHJhd0ljb24zRHxkcmF3TGluZXxkcmF3TGluZTNEfGRyYXdMaW5rfGRyYXdMb2NhdGlvbnxkcmF3UG9seWdvbnxkcmF3UmVjdGFuZ2xlfGRyYXdUcmlhbmdsZXxkcml2ZXJ8ZHJvcHxkeW5hbWljU2ltdWxhdGlvbkRpc3RhbmNlfGR5bmFtaWNTaW11bGF0aW9uRGlzdGFuY2VDb2VmfGR5bmFtaWNTaW11bGF0aW9uRW5hYmxlZHxkeW5hbWljU2ltdWxhdGlvblN5c3RlbUVuYWJsZWR8ZWFzdHxlZGl0M0RFTk1pc3Npb25BdHRyaWJ1dGVzfGVkaXRPYmplY3R8ZWRpdG9yU2V0RXZlbnRIYW5kbGVyfGVmZmVjdGl2ZUNvbW1hbmRlcnxlbXB0eVBvc2l0aW9uc3xlbmFibGVBSXxlbmFibGVBSUZlYXR1cmV8ZW5hYmxlQWltUHJlY2lzaW9ufGVuYWJsZUF0dGFja3xlbmFibGVBdWRpb0ZlYXR1cmV8ZW5hYmxlQXV0b1N0YXJ0VXBSVER8ZW5hYmxlQXV0b1RyaW1SVER8ZW5hYmxlQ2FtU2hha2V8ZW5hYmxlQ2F1c3RpY3N8ZW5hYmxlQ2hhbm5lbHxlbmFibGVDb2xsaXNpb25XaXRofGVuYWJsZUNvcGlsb3R8ZW5hYmxlRGVicmllZmluZ1N0YXRzfGVuYWJsZURpYWdMZWdlbmR8ZW5hYmxlRHluYW1pY1NpbXVsYXRpb258ZW5hYmxlRHluYW1pY1NpbXVsYXRpb25TeXN0ZW18ZW5hYmxlRW5kRGlhbG9nfGVuYWJsZUVuZ2luZUFydGlsbGVyeXxlbmFibGVFbnZpcm9ubWVudHxlbmFibGVGYXRpZ3VlfGVuYWJsZUd1bkxpZ2h0c3xlbmFibGVJbmZvUGFuZWxDb21wb25lbnR8ZW5hYmxlSVJMYXNlcnN8ZW5hYmxlTWltaWNzfGVuYWJsZVBlcnNvblR1cnJldHxlbmFibGVSYWRpb3xlbmFibGVSZWxvYWR8ZW5hYmxlUm9wZUF0dGFjaHxlbmFibGVTYXROb3JtYWxPbkRldGFpbHxlbmFibGVTYXZpbmd8ZW5hYmxlU2VudGVuY2VzfGVuYWJsZVNpbXVsYXRpb258ZW5hYmxlU2ltdWxhdGlvbkdsb2JhbHxlbmFibGVTdGFtaW5hfGVuYWJsZVN0cmVzc0RhbWFnZXxlbmFibGVUZWFtU3dpdGNofGVuYWJsZVRyYWZmaWN8ZW5hYmxlVUFWQ29ubmVjdGFiaWxpdHl8ZW5hYmxlVUFWV2F5cG9pbnRzfGVuYWJsZVZlaGljbGVDYXJnb3xlbmFibGVWZWhpY2xlU2Vuc29yfGVuYWJsZVdlYXBvbkRpc2Fzc2VtYmx5fGVuZGx8ZW5kTG9hZGluZ1NjcmVlbnxlbmRNaXNzaW9ufGVuZ2luZU9ufGVuZ2luZXNJc09uUlREfGVuZ2luZXNQb3dlclJURHxlbmdpbmVzUnBtUlREfGVuZ2luZXNUb3JxdWVSVER8ZW50aXRpZXN8ZW52aXJvbm1lbnRFbmFibGVkfGVzdGltYXRlZEVuZFNlcnZlclRpbWV8ZXN0aW1hdGVkVGltZUxlZnR8ZXZhbE9iamVjdEFyZ3VtZW50fGV2ZXJ5QmFja3BhY2t8ZXZlcnlDb250YWluZXJ8ZXhlY3xleGVjRWRpdG9yU2NyaXB0fGV4cHxleHBlY3RlZERlc3RpbmF0aW9ufGV4cG9ydEpJUE1lc3NhZ2VzfGV5ZURpcmVjdGlvbnxleWVQb3N8ZmFjZXxmYWN0aW9ufGZhZGVNdXNpY3xmYWRlUmFkaW98ZmFkZVNvdW5kfGZhZGVTcGVlY2h8ZmFpbE1pc3Npb258ZmlsbFdlYXBvbnNGcm9tUG9vbHxmaW5kfGZpbmRDb3ZlcnxmaW5kRGlzcGxheXxmaW5kRWRpdG9yT2JqZWN0fGZpbmRFbXB0eVBvc2l0aW9ufGZpbmRFbXB0eVBvc2l0aW9uUmVhZHl8ZmluZElmfGZpbmROZWFyZXN0RW5lbXl8ZmluaXNoTWlzc2lvbkluaXR8ZmluaXRlfGZpcmV8ZmlyZUF0VGFyZ2V0fGZpcnN0QmFja3BhY2t8ZmxhZ3xmbGFnQW5pbWF0aW9uUGhhc2V8ZmxhZ093bmVyfGZsYWdTaWRlfGZsYWdUZXh0dXJlfGZsZWVpbmd8Zmxvb3J8Zmx5SW5IZWlnaHR8Zmx5SW5IZWlnaHRBU0x8Zm9nfGZvZ0ZvcmVjYXN0fGZvZ1BhcmFtc3xmb3JjZUFkZFVuaWZvcm18Zm9yY2VBdFBvc2l0aW9uUlREfGZvcmNlZE1hcHxmb3JjZUVuZHxmb3JjZUZsYWdUZXh0dXJlfGZvcmNlRm9sbG93Um9hZHxmb3JjZUdlbmVyYXRvclJURHxmb3JjZU1hcHxmb3JjZVJlc3Bhd258Zm9yY2VTcGVlZHxmb3JjZVdhbGt8Zm9yY2VXZWFwb25GaXJlfGZvcmNlV2VhdGhlckNoYW5nZXxmb3JnZXRUYXJnZXR8Zm9ybWF0fGZvcm1hdGlvbnxmb3JtYXRpb25EaXJlY3Rpb258Zm9ybWF0aW9uTGVhZGVyfGZvcm1hdGlvbk1lbWJlcnN8Zm9ybWF0aW9uUG9zaXRpb258Zm9ybWF0aW9uVGFza3xmb3JtYXRUZXh0fGZvcm1MZWFkZXJ8ZnJlZUxvb2t8ZnJvbUVkaXRvcnxmdWVsfGZ1bGxDcmV3fGdlYXJJRENBbW1vQ291bnR8Z2VhclNsb3RBbW1vQ291bnR8Z2VhclNsb3REYXRhfGdldDNERU5BY3Rpb25TdGF0ZXxnZXQzREVOQXR0cmlidXRlfGdldDNERU5DYW1lcmF8Z2V0M0RFTkNvbm5lY3Rpb25zfGdldDNERU5FbnRpdHl8Z2V0M0RFTkVudGl0eUlEfGdldDNERU5HcmlkfGdldDNERU5JY29uc1Zpc2libGV8Z2V0M0RFTkxheWVyRW50aXRpZXN8Z2V0M0RFTkxpbmVzVmlzaWJsZXxnZXQzREVOTWlzc2lvbkF0dHJpYnV0ZXxnZXQzREVOTW91c2VPdmVyfGdldDNERU5TZWxlY3RlZHxnZXRBaW1pbmdDb2VmfGdldEFsbEVudlNvdW5kQ29udHJvbGxlcnN8Z2V0QWxsSGl0UG9pbnRzRGFtYWdlfGdldEFsbE93bmVkTWluZXN8Z2V0QWxsU291bmRDb250cm9sbGVyc3xnZXRBbW1vQ2FyZ298Z2V0QW5pbUFpbVByZWNpc2lvbnxnZXRBbmltU3BlZWRDb2VmfGdldEFycmF5fGdldEFydGlsbGVyeUFtbW98Z2V0QXJ0aWxsZXJ5Q29tcHV0ZXJTZXR0aW5nc3xnZXRBcnRpbGxlcnlFVEF8Z2V0QXNzaWduZWRDdXJhdG9yTG9naWN8Z2V0QXNzaWduZWRDdXJhdG9yVW5pdHxnZXRCYWNrcGFja0NhcmdvfGdldEJsZWVkaW5nUmVtYWluaW5nfGdldEJ1cm5pbmdWYWx1ZXxnZXRDYW1lcmFWaWV3RGlyZWN0aW9ufGdldENhcmdvSW5kZXh8Z2V0Q2VudGVyT2ZNYXNzfGdldENsaWVudFN0YXRlfGdldENsaWVudFN0YXRlTnVtYmVyfGdldENvbXBhdGlibGVQeWxvbk1hZ2F6aW5lc3xnZXRDb25uZWN0ZWRVQVZ8Z2V0Q29udGFpbmVyTWF4TG9hZHxnZXRDdXJzb3JPYmplY3RQYXJhbXN8Z2V0Q3VzdG9tQWltQ29lZnxnZXREYW1tYWdlfGdldERlc2NyaXB0aW9ufGdldERpcnxnZXREaXJWaXN1YWx8Z2V0RExDQXNzZXRzVXNhZ2V8Z2V0RExDQXNzZXRzVXNhZ2VCeU5hbWV8Z2V0RExDc3xnZXRETENVc2FnZVRpbWV8Z2V0RWRpdG9yQ2FtZXJhfGdldEVkaXRvck1vZGV8Z2V0RWRpdG9yT2JqZWN0U2NvcGV8Z2V0RWxldmF0aW9uT2Zmc2V0fGdldEVuZ2luZVRhcmdldFJwbVJURHxnZXRFbnZTb3VuZENvbnRyb2xsZXJ8Z2V0RmF0aWd1ZXxnZXRGaWVsZE1hbnVhbFN0YXJ0UGFnZXxnZXRGb3JjZWRGbGFnVGV4dHVyZXxnZXRGcmllbmR8Z2V0RlNNVmFyaWFibGV8Z2V0RnVlbENhcmdvfGdldEdyb3VwSWNvbnxnZXRHcm91cEljb25QYXJhbXN8Z2V0R3JvdXBJY29uc3xnZXRIaWRlRnJvbXxnZXRIaXR8Z2V0SGl0SW5kZXh8Z2V0SGl0UG9pbnREYW1hZ2V8Z2V0SXRlbUNhcmdvfGdldE1hZ2F6aW5lQ2FyZ298Z2V0TWFya2VyQ29sb3J8Z2V0TWFya2VyUG9zfGdldE1hcmtlclNpemV8Z2V0TWFya2VyVHlwZXxnZXRNYXNzfGdldE1pc3Npb25Db25maWd8Z2V0TWlzc2lvbkNvbmZpZ1ZhbHVlfGdldE1pc3Npb25ETENzfGdldE1pc3Npb25MYXllckVudGl0aWVzfGdldE1pc3Npb25MYXllcnN8Z2V0TW9kZWxJbmZvfGdldE1vdXNlUG9zaXRpb258Z2V0TXVzaWNQbGF5ZWRUaW1lfGdldE51bWJlcnxnZXRPYmplY3RBcmd1bWVudHxnZXRPYmplY3RDaGlsZHJlbnxnZXRPYmplY3RETEN8Z2V0T2JqZWN0TWF0ZXJpYWxzfGdldE9iamVjdFByb3h5fGdldE9iamVjdFRleHR1cmVzfGdldE9iamVjdFR5cGV8Z2V0T2JqZWN0Vmlld0Rpc3RhbmNlfGdldE94eWdlblJlbWFpbmluZ3xnZXRQZXJzb25Vc2VkRExDc3xnZXRQaWxvdENhbWVyYURpcmVjdGlvbnxnZXRQaWxvdENhbWVyYVBvc2l0aW9ufGdldFBpbG90Q2FtZXJhUm90YXRpb258Z2V0UGlsb3RDYW1lcmFUYXJnZXR8Z2V0UGxhdGVOdW1iZXJ8Z2V0UGxheWVyQ2hhbm5lbHxnZXRQbGF5ZXJTY29yZXN8Z2V0UGxheWVyVUlEfGdldFBsYXllclVJRE9sZHxnZXRQb3N8Z2V0UG9zQVNMfGdldFBvc0FTTFZpc3VhbHxnZXRQb3NBU0xXfGdldFBvc0FUTHxnZXRQb3NBVExWaXN1YWx8Z2V0UG9zVmlzdWFsfGdldFBvc1dvcmxkfGdldFB5bG9uTWFnYXppbmVzfGdldFJlbERpcnxnZXRSZWxQb3N8Z2V0UmVtb3RlU2Vuc29yc0Rpc2FibGVkfGdldFJlcGFpckNhcmdvfGdldFJlc29sdXRpb258Z2V0Um90b3JCcmFrZVJURHxnZXRTaGFkb3dEaXN0YW5jZXxnZXRTaG90UGFyZW50c3xnZXRTbGluZ0xvYWR8Z2V0U291bmRDb250cm9sbGVyfGdldFNvdW5kQ29udHJvbGxlclJlc3VsdHxnZXRTcGVlZHxnZXRTdGFtaW5hfGdldFN0YXRWYWx1ZXxnZXRTdXBwcmVzc2lvbnxnZXRUZXJyYWluR3JpZHxnZXRUZXJyYWluSGVpZ2h0QVNMfGdldFRleHR8Z2V0VG90YWxETENVc2FnZVRpbWV8Z2V0VHJpbU9mZnNldFJURHxnZXRVbml0TG9hZG91dHxnZXRVbml0VHJhaXR8Z2V0VXNlck1GRFRleHR8Z2V0VXNlck1GRFZhbHVlfGdldFZhcmlhYmxlfGdldFZlaGljbGVDYXJnb3xnZXRXZWFwb25DYXJnb3xnZXRXZWFwb25Td2F5fGdldFdpbmdzT3JpZW50YXRpb25SVER8Z2V0V2luZ3NQb3NpdGlvblJURHxnZXRXUFBvc3xnbGFuY2VBdHxnbG9iYWxDaGF0fGdsb2JhbFJhZGlvfGdvZ2dsZXN8Z3JvdXB8Z3JvdXBDaGF0fGdyb3VwRnJvbU5ldElkfGdyb3VwSWNvblNlbGVjdGFibGV8Z3JvdXBJY29uc1Zpc2libGV8Z3JvdXBJZHxncm91cE93bmVyfGdyb3VwUmFkaW98Z3JvdXBTZWxlY3RlZFVuaXRzfGdyb3VwU2VsZWN0VW5pdHxncnBOdWxsfGd1bm5lcnxndXN0c3xoYWx0fGhhbmRndW5JdGVtc3xoYW5kZ3VuTWFnYXppbmV8aGFuZGd1bldlYXBvbnxoYW5kc0hpdHxoYXNJbnRlcmZhY2V8aGFzUGlsb3RDYW1lcmF8aGFzV2VhcG9ufGhjQWxsR3JvdXBzfGhjR3JvdXBQYXJhbXN8aGNMZWFkZXJ8aGNSZW1vdmVBbGxHcm91cHN8aGNSZW1vdmVHcm91cHxoY1NlbGVjdGVkfGhjU2VsZWN0R3JvdXB8aGNTZXRHcm91cHxoY1Nob3dCYXJ8aGNTaG93bkJhcnxoZWFkZ2VhcnxoaWRlQm9keXxoaWRlT2JqZWN0fGhpZGVPYmplY3RHbG9iYWx8aGlkZVNlbGVjdGlvbnxoaW50fGhpbnRDfGhpbnRDYWRldHxoaW50U2lsZW50fGhtZHxob3N0TWlzc2lvbnxodG1sTG9hZHxIVURNb3ZlbWVudExldmVsc3xodW1pZGl0eXxpbWFnZXxpbXBvcnRBbGxHcm91cHN8aW1wb3J0YW5jZXxpbnxpbkFyZWF8aW5BcmVhQXJyYXl8aW5jYXBhY2l0YXRlZFN0YXRlfGluZGVwZW5kZW50fGluZmxhbWV8aW5mbGFtZWR8aW5mb1BhbmVsfGluZm9QYW5lbENvbXBvbmVudEVuYWJsZWR8aW5mb1BhbmVsQ29tcG9uZW50c3xpbmZvUGFuZWxzfGluR2FtZVVJU2V0RXZlbnRIYW5kbGVyfGluaGVyaXRzRnJvbXxpbml0QW1iaWVudExpZmV8aW5Qb2x5Z29ufGlucHV0QWN0aW9ufGluUmFuZ2VPZkFydGlsbGVyeXxpbnNlcnRFZGl0b3JPYmplY3R8aW50ZXJzZWN0fGlzM0RFTnxpczNERU5NdWx0aXBsYXllcnxpc0FibGVUb0JyZWF0aGV8aXNBZ2VudHxpc0FpbVByZWNpc2lvbkVuYWJsZWR8aXNBcnJheXxpc0F1dG9Ib3Zlck9ufGlzQXV0b25vbW91c3xpc0F1dG9TdGFydFVwRW5hYmxlZFJURHxpc0F1dG90ZXN0fGlzQXV0b1RyaW1PblJURHxpc0JsZWVkaW5nfGlzQnVybmluZ3xpc0NsYXNzfGlzQ29sbGlzaW9uTGlnaHRPbnxpc0NvcGlsb3RFbmFibGVkfGlzRGFtYWdlQWxsb3dlZHxpc0RlZGljYXRlZHxpc0RMQ0F2YWlsYWJsZXxpc0VuZ2luZU9ufGlzRXF1YWxUb3xpc0VxdWFsVHlwZXxpc0VxdWFsVHlwZUFsbHxpc0VxdWFsVHlwZUFueXxpc0VxdWFsVHlwZUFycmF5fGlzRXF1YWxUeXBlUGFyYW1zfGlzRmlsZVBhdGNoaW5nRW5hYmxlZHxpc0ZsYXNobGlnaHRPbnxpc0ZsYXRFbXB0eXxpc0ZvcmNlZFdhbGt8aXNGb3JtYXRpb25MZWFkZXJ8aXNHcm91cERlbGV0ZWRXaGVuRW1wdHl8aXNIaWRkZW58aXNJblJlbWFpbnNDb2xsZWN0b3J8aXNJbnN0cnVjdG9yRmlndXJlRW5hYmxlZHxpc0lSTGFzZXJPbnxpc0tleUFjdGl2ZXxpc0tpbmRPZnxpc0xhc2VyT258aXNMaWdodE9ufGlzTG9jYWxpemVkfGlzTWFudWFsRmlyZXxpc01hcmtlZEZvckNvbGxlY3Rpb258aXNNdWx0aXBsYXllcnxpc011bHRpcGxheWVyU29sb3xpc05pbHxpc051bGx8aXNOdW1iZXJ8aXNPYmplY3RIaWRkZW58aXNPYmplY3RSVER8aXNPblJvYWR8aXNQaXBFbmFibGVkfGlzUGxheWVyfGlzUmVhbFRpbWV8aXNSZW1vdGVFeGVjdXRlZHxpc1JlbW90ZUV4ZWN1dGVkSklQfGlzU2VydmVyfGlzU2hvd2luZzNESWNvbnN8aXNTaW1wbGVPYmplY3R8aXNTcHJpbnRBbGxvd2VkfGlzU3RhbWluYUVuYWJsZWR8aXNTdGVhbU1pc3Npb258aXNTdHJlYW1GcmllbmRseVVJRW5hYmxlZHxpc1N0cmVzc0RhbWFnZUVuYWJsZWR8aXNUZXh0fGlzVG91Y2hpbmdHcm91bmR8aXNUdXJuZWRPdXR8aXNUdXRIaW50c0VuYWJsZWR8aXNVQVZDb25uZWN0YWJsZXxpc1VBVkNvbm5lY3RlZHxpc1VJQ29udGV4dHxpc1VuaWZvcm1BbGxvd2VkfGlzVmVoaWNsZUNhcmdvfGlzVmVoaWNsZVJhZGFyT258aXNWZWhpY2xlU2Vuc29yRW5hYmxlZHxpc1dhbGtpbmd8aXNXZWFwb25EZXBsb3llZHxpc1dlYXBvblJlc3RlZHxpdGVtQ2FyZ298aXRlbXN8aXRlbXNXaXRoTWFnYXppbmVzfGpvaW58am9pbkFzfGpvaW5Bc1NpbGVudHxqb2luU2lsZW50fGpvaW5TdHJpbmd8a2JBZGREYXRhYmFzZXxrYkFkZERhdGFiYXNlVGFyZ2V0c3xrYkFkZFRvcGljfGtiSGFzVG9waWN8a2JSZWFjdHxrYlJlbW92ZVRvcGljfGtiVGVsbHxrYldhc1NhaWR8a2V5SW1hZ2V8a2V5TmFtZXxrbm93c0Fib3V0fGxhbmR8bGFuZEF0fGxhbmRSZXN1bHR8bGFuZ3VhZ2V8bGFzZXJUYXJnZXR8bGJBZGR8bGJDbGVhcnxsYkNvbG9yfGxiQ29sb3JSaWdodHxsYkN1clNlbHxsYkRhdGF8bGJEZWxldGV8bGJJc1NlbGVjdGVkfGxiUGljdHVyZXxsYlBpY3R1cmVSaWdodHxsYlNlbGVjdGlvbnxsYlNldENvbG9yfGxiU2V0Q29sb3JSaWdodHxsYlNldEN1clNlbHxsYlNldERhdGF8bGJTZXRQaWN0dXJlfGxiU2V0UGljdHVyZUNvbG9yfGxiU2V0UGljdHVyZUNvbG9yRGlzYWJsZWR8bGJTZXRQaWN0dXJlQ29sb3JTZWxlY3RlZHxsYlNldFBpY3R1cmVSaWdodHxsYlNldFBpY3R1cmVSaWdodENvbG9yfGxiU2V0UGljdHVyZVJpZ2h0Q29sb3JEaXNhYmxlZHxsYlNldFBpY3R1cmVSaWdodENvbG9yU2VsZWN0ZWR8bGJTZXRTZWxlY3RDb2xvcnxsYlNldFNlbGVjdENvbG9yUmlnaHR8bGJTZXRTZWxlY3RlZHxsYlNldFRleHR8bGJTZXRUZXh0UmlnaHR8bGJTZXRUb29sdGlwfGxiU2V0VmFsdWV8bGJTaXplfGxiU29ydHxsYlNvcnRCeVZhbHVlfGxiVGV4dHxsYlRleHRSaWdodHxsYlZhbHVlfGxlYWRlcnxsZWFkZXJib2FyZERlSW5pdHxsZWFkZXJib2FyZEdldFJvd3N8bGVhZGVyYm9hcmRJbml0fGxlYWRlcmJvYXJkUmVxdWVzdFJvd3NGcmllbmRzfGxlYWRlcmJvYXJkUmVxdWVzdFJvd3NHbG9iYWx8bGVhZGVyYm9hcmRSZXF1ZXN0Um93c0dsb2JhbEFyb3VuZFVzZXJ8bGVhZGVyYm9hcmRzUmVxdWVzdFVwbG9hZFNjb3JlfGxlYWRlcmJvYXJkc1JlcXVlc3RVcGxvYWRTY29yZUtlZXBCZXN0fGxlYWRlcmJvYXJkU3RhdGV8bGVhdmVWZWhpY2xlfGxpYnJhcnlDcmVkaXRzfGxpYnJhcnlEaXNjbGFpbWVyc3xsaWZlU3RhdGV8bGlnaHRBdHRhY2hPYmplY3R8bGlnaHREZXRhY2hPYmplY3R8bGlnaHRJc09ufGxpZ2h0bmluZ3N8bGltaXRTcGVlZHxsaW5lYXJDb252ZXJzaW9ufGxpbmVCcmVha3xsaW5lSW50ZXJzZWN0c3xsaW5lSW50ZXJzZWN0c09ianN8bGluZUludGVyc2VjdHNTdXJmYWNlc3xsaW5lSW50ZXJzZWN0c1dpdGh8bGlua0l0ZW18bGlzdHxsaXN0T2JqZWN0c3xsaXN0UmVtb3RlVGFyZ2V0c3xsaXN0VmVoaWNsZVNlbnNvcnN8bG58bG5iQWRkQXJyYXl8bG5iQWRkQ29sdW1ufGxuYkFkZFJvd3xsbmJDbGVhcnxsbmJDb2xvcnxsbmJDb2xvclJpZ2h0fGxuYkN1clNlbFJvd3xsbmJEYXRhfGxuYkRlbGV0ZUNvbHVtbnxsbmJEZWxldGVSb3d8bG5iR2V0Q29sdW1uc1Bvc2l0aW9ufGxuYlBpY3R1cmV8bG5iUGljdHVyZVJpZ2h0fGxuYlNldENvbG9yfGxuYlNldENvbG9yUmlnaHR8bG5iU2V0Q29sdW1uc1Bvc3xsbmJTZXRDdXJTZWxSb3d8bG5iU2V0RGF0YXxsbmJTZXRQaWN0dXJlfGxuYlNldFBpY3R1cmVDb2xvcnxsbmJTZXRQaWN0dXJlQ29sb3JSaWdodHxsbmJTZXRQaWN0dXJlQ29sb3JTZWxlY3RlZHxsbmJTZXRQaWN0dXJlQ29sb3JTZWxlY3RlZFJpZ2h0fGxuYlNldFBpY3R1cmVSaWdodHxsbmJTZXRUZXh0fGxuYlNldFRleHRSaWdodHxsbmJTZXRWYWx1ZXxsbmJTaXplfGxuYlNvcnR8bG5iU29ydEJ5VmFsdWV8bG5iVGV4dHxsbmJUZXh0UmlnaHR8bG5iVmFsdWV8bG9hZHxsb2FkQWJzfGxvYWRCYWNrcGFja3xsb2FkRmlsZXxsb2FkR2FtZXxsb2FkSWRlbnRpdHl8bG9hZE1hZ2F6aW5lfGxvYWRPdmVybGF5fGxvYWRTdGF0dXN8bG9hZFVuaWZvcm18bG9hZFZlc3R8bG9jYWx8bG9jYWxpemV8bG9jYXRpb25OdWxsfGxvY2F0aW9uUG9zaXRpb258bG9ja3xsb2NrQ2FtZXJhVG98bG9ja0NhcmdvfGxvY2tEcml2ZXJ8bG9ja2VkfGxvY2tlZENhcmdvfGxvY2tlZERyaXZlcnxsb2NrZWRUdXJyZXR8bG9ja0lkZW50aXR5fGxvY2tUdXJyZXR8bG9ja1dQfGxvZ3xsb2dFbnRpdGllc3xsb2dOZXR3b3JrfGxvZ05ldHdvcmtUZXJtaW5hdGV8bG9va0F0fGxvb2tBdFBvc3xtYWdhemluZUNhcmdvfG1hZ2F6aW5lc3xtYWdhemluZXNBbGxUdXJyZXRzfG1hZ2F6aW5lc0FtbW98bWFnYXppbmVzQW1tb0NhcmdvfG1hZ2F6aW5lc0FtbW9GdWxsfG1hZ2F6aW5lc0RldGFpbHxtYWdhemluZXNEZXRhaWxCYWNrcGFja3xtYWdhemluZXNEZXRhaWxVbmlmb3JtfG1hZ2F6aW5lc0RldGFpbFZlc3R8bWFnYXppbmVzVHVycmV0fG1hZ2F6aW5lVHVycmV0QW1tb3xtYXBBbmltQWRkfG1hcEFuaW1DbGVhcnxtYXBBbmltQ29tbWl0fG1hcEFuaW1Eb25lfG1hcENlbnRlck9uQ2FtZXJhfG1hcEdyaWRQb3NpdGlvbnxtYXJrQXNGaW5pc2hlZE9uU3RlYW18bWFya2VyQWxwaGF8bWFya2VyQnJ1c2h8bWFya2VyQ29sb3J8bWFya2VyRGlyfG1hcmtlclBvc3xtYXJrZXJTaGFwZXxtYXJrZXJTaXplfG1hcmtlclRleHR8bWFya2VyVHlwZXxtYXh8bWVtYmVyc3xtZW51QWN0aW9ufG1lbnVBZGR8bWVudUNoZWNrZWR8bWVudUNsZWFyfG1lbnVDb2xsYXBzZXxtZW51RGF0YXxtZW51RGVsZXRlfG1lbnVFbmFibGV8bWVudUVuYWJsZWR8bWVudUV4cGFuZHxtZW51SG92ZXJ8bWVudVBpY3R1cmV8bWVudVNldEFjdGlvbnxtZW51U2V0Q2hlY2t8bWVudVNldERhdGF8bWVudVNldFBpY3R1cmV8bWVudVNldFZhbHVlfG1lbnVTaG9ydGN1dHxtZW51U2hvcnRjdXRUZXh0fG1lbnVTaXplfG1lbnVTb3J0fG1lbnVUZXh0fG1lbnVVUkx8bWVudVZhbHVlfG1pbnxtaW5lQWN0aXZlfG1pbmVEZXRlY3RlZEJ5fG1pc3Npb25Db25maWdGaWxlfG1pc3Npb25EaWZmaWN1bHR5fG1pc3Npb25OYW1lfG1pc3Npb25OYW1lc3BhY2V8bWlzc2lvblN0YXJ0fG1pc3Npb25WZXJzaW9ufG1vZGVsVG9Xb3JsZHxtb2RlbFRvV29ybGRWaXN1YWx8bW9kZWxUb1dvcmxkVmlzdWFsV29ybGR8bW9kZWxUb1dvcmxkV29ybGR8bW9kUGFyYW1zfG1vb25JbnRlbnNpdHl8bW9vblBoYXNlfG1vcmFsZXxtb3ZlfG1vdmUzREVOQ2FtZXJhfG1vdmVJbkFueXxtb3ZlSW5DYXJnb3xtb3ZlSW5Db21tYW5kZXJ8bW92ZUluRHJpdmVyfG1vdmVJbkd1bm5lcnxtb3ZlSW5UdXJyZXR8bW92ZU9iamVjdFRvRW5kfG1vdmVPdXR8bW92ZVRpbWV8bW92ZVRvfG1vdmVUb0NvbXBsZXRlZHxtb3ZlVG9GYWlsZWR8bXVzaWNWb2x1bWV8bmFtZXxuYW1lU291bmR8bmVhckVudGl0aWVzfG5lYXJlc3RCdWlsZGluZ3xuZWFyZXN0TG9jYXRpb258bmVhcmVzdExvY2F0aW9uc3xuZWFyZXN0TG9jYXRpb25XaXRoRHViYmluZ3xuZWFyZXN0T2JqZWN0fG5lYXJlc3RPYmplY3RzfG5lYXJlc3RUZXJyYWluT2JqZWN0c3xuZWFyT2JqZWN0c3xuZWFyT2JqZWN0c1JlYWR5fG5lYXJSb2Fkc3xuZWFyU3VwcGxpZXN8bmVhclRhcmdldHN8bmVlZFJlbG9hZHxuZXRJZHxuZXRPYmpOdWxsfG5ld092ZXJsYXl8bmV4dE1lbnVJdGVtSW5kZXh8bmV4dFdlYXRoZXJDaGFuZ2V8bk1lbnVJdGVtc3xudW1iZXJPZkVuZ2luZXNSVER8bnVtYmVyVG9EYXRlfG9iamVjdEN1cmF0b3JzfG9iamVjdEZyb21OZXRJZHxvYmplY3RQYXJlbnR8b2JqTnVsbHxvYmpTdGF0dXN8b25CcmllZmluZ0dlYXJ8b25CcmllZmluZ0dyb3VwfG9uQnJpZWZpbmdOb3Rlc3xvbkJyaWVmaW5nUGxhbnxvbkJyaWVmaW5nVGVhbVN3aXRjaHxvbkNvbW1hbmRNb2RlQ2hhbmdlZHxvbkRvdWJsZUNsaWNrfG9uRWFjaEZyYW1lfG9uR3JvdXBJY29uQ2xpY2t8b25Hcm91cEljb25PdmVyRW50ZXJ8b25Hcm91cEljb25PdmVyTGVhdmV8b25IQ0dyb3VwU2VsZWN0aW9uQ2hhbmdlZHxvbk1hcFNpbmdsZUNsaWNrfG9uUGxheWVyQ29ubmVjdGVkfG9uUGxheWVyRGlzY29ubmVjdGVkfG9uUHJlbG9hZEZpbmlzaGVkfG9uUHJlbG9hZFN0YXJ0ZWR8b25TaG93TmV3T2JqZWN0fG9uVGVhbVN3aXRjaHxvcGVuQ3VyYXRvckludGVyZmFjZXxvcGVuRExDUGFnZXxvcGVuRFNJbnRlcmZhY2V8b3Blbk1hcHxvcGVuU3RlYW1BcHB8b3BlbllvdXR1YmVWaWRlb3xvcGZvcnxvcmRlckdldElufG92ZXJjYXN0fG92ZXJjYXN0Rm9yZWNhc3R8b3duZXJ8cGFyYW18cGFyYW1zfHBhcnNlTnVtYmVyfHBhcnNlU2ltcGxlQXJyYXl8cGFyc2VUZXh0fHBhcnNpbmdOYW1lc3BhY2V8cGFydGljbGVzUXVhbGl0eXxwaXxwaWNrV2VhcG9uUG9vbHxwaXRjaHxwaXhlbEdyaWR8cGl4ZWxHcmlkQmFzZXxwaXhlbEdyaWROb1VJU2NhbGV8cGl4ZWxIfHBpeGVsV3xwbGF5YWJsZVNsb3RzTnVtYmVyfHBsYXlhYmxlVW5pdHN8cGxheUFjdGlvbnxwbGF5QWN0aW9uTm93fHBsYXllcnxwbGF5ZXJSZXNwYXduVGltZXxwbGF5ZXJTaWRlfHBsYXllcnNOdW1iZXJ8cGxheUdlc3R1cmV8cGxheU1pc3Npb258cGxheU1vdmV8cGxheU1vdmVOb3d8cGxheU11c2ljfHBsYXlTY3JpcHRlZE1pc3Npb258cGxheVNvdW5kfHBsYXlTb3VuZDNEfHBvc2l0aW9ufHBvc2l0aW9uQ2FtZXJhVG9Xb3JsZHxwb3NTY3JlZW5Ub1dvcmxkfHBvc1dvcmxkVG9TY3JlZW58cHBFZmZlY3RBZGp1c3R8cHBFZmZlY3RDb21taXR8cHBFZmZlY3RDb21taXR0ZWR8cHBFZmZlY3RDcmVhdGV8cHBFZmZlY3REZXN0cm95fHBwRWZmZWN0RW5hYmxlfHBwRWZmZWN0RW5hYmxlZHxwcEVmZmVjdEZvcmNlSW5OVkd8cHJlY2lzaW9ufHByZWxvYWRDYW1lcmF8cHJlbG9hZE9iamVjdHxwcmVsb2FkU291bmR8cHJlbG9hZFRpdGxlT2JqfHByZWxvYWRUaXRsZVJzY3xwcmltYXJ5V2VhcG9ufHByaW1hcnlXZWFwb25JdGVtc3xwcmltYXJ5V2VhcG9uTWFnYXppbmV8cHJpb3JpdHl8cHJvY2Vzc0RpYXJ5TGlua3xwcm9jZXNzSW5pdENvbW1hbmRzfHByb2R1Y3RWZXJzaW9ufHByb2ZpbGVOYW1lfHByb2ZpbGVOYW1lc3BhY2V8cHJvZmlsZU5hbWVTdGVhbXxwcm9ncmVzc0xvYWRpbmdTY3JlZW58cHJvZ3Jlc3NQb3NpdGlvbnxwcm9ncmVzc1NldFBvc2l0aW9ufHB1YmxpY1ZhcmlhYmxlfHB1YmxpY1ZhcmlhYmxlQ2xpZW50fHB1YmxpY1ZhcmlhYmxlU2VydmVyfHB1c2hCYWNrfHB1c2hCYWNrVW5pcXVlfHB1dFdlYXBvblBvb2x8cXVlcnlJdGVtc1Bvb2x8cXVlcnlNYWdhemluZVBvb2x8cXVlcnlXZWFwb25Qb29sfHJhZHxyYWRpb0NoYW5uZWxBZGR8cmFkaW9DaGFubmVsQ3JlYXRlfHJhZGlvQ2hhbm5lbFJlbW92ZXxyYWRpb0NoYW5uZWxTZXRDYWxsU2lnbnxyYWRpb0NoYW5uZWxTZXRMYWJlbHxyYWRpb1ZvbHVtZXxyYWlufHJhaW5ib3d8cmFuZG9tfHJhbmt8cmFua0lkfHJhdGluZ3xyZWN0YW5ndWxhcnxyZWdpc3RlcmVkVGFza3N8cmVnaXN0ZXJUYXNrfHJlbG9hZHxyZWxvYWRFbmFibGVkfHJlbW90ZUNvbnRyb2x8cmVtb3RlRXhlY3xyZW1vdGVFeGVjQ2FsbHxyZW1vdGVFeGVjdXRlZE93bmVyfHJlbW92ZTNERU5Db25uZWN0aW9ufHJlbW92ZTNERU5FdmVudEhhbmRsZXJ8cmVtb3ZlM0RFTkxheWVyfHJlbW92ZUFjdGlvbnxyZW1vdmVBbGwzREVORXZlbnRIYW5kbGVyc3xyZW1vdmVBbGxBY3Rpb25zfHJlbW92ZUFsbEFzc2lnbmVkSXRlbXN8cmVtb3ZlQWxsQ29udGFpbmVyc3xyZW1vdmVBbGxDdXJhdG9yQWRkb25zfHJlbW92ZUFsbEN1cmF0b3JDYW1lcmFBcmVhc3xyZW1vdmVBbGxDdXJhdG9yRWRpdGluZ0FyZWFzfHJlbW92ZUFsbEV2ZW50SGFuZGxlcnN8cmVtb3ZlQWxsSGFuZGd1bkl0ZW1zfHJlbW92ZUFsbEl0ZW1zfHJlbW92ZUFsbEl0ZW1zV2l0aE1hZ2F6aW5lc3xyZW1vdmVBbGxNaXNzaW9uRXZlbnRIYW5kbGVyc3xyZW1vdmVBbGxNUEV2ZW50SGFuZGxlcnN8cmVtb3ZlQWxsTXVzaWNFdmVudEhhbmRsZXJzfHJlbW92ZUFsbE93bmVkTWluZXN8cmVtb3ZlQWxsUHJpbWFyeVdlYXBvbkl0ZW1zfHJlbW92ZUFsbFdlYXBvbnN8cmVtb3ZlQmFja3BhY2t8cmVtb3ZlQmFja3BhY2tHbG9iYWx8cmVtb3ZlQ3VyYXRvckFkZG9uc3xyZW1vdmVDdXJhdG9yQ2FtZXJhQXJlYXxyZW1vdmVDdXJhdG9yRWRpdGFibGVPYmplY3RzfHJlbW92ZUN1cmF0b3JFZGl0aW5nQXJlYXxyZW1vdmVEcmF3SWNvbnxyZW1vdmVEcmF3TGlua3N8cmVtb3ZlRXZlbnRIYW5kbGVyfHJlbW92ZUZyb21SZW1haW5zQ29sbGVjdG9yfHJlbW92ZUdvZ2dsZXN8cmVtb3ZlR3JvdXBJY29ufHJlbW92ZUhhbmRndW5JdGVtfHJlbW92ZUhlYWRnZWFyfHJlbW92ZUl0ZW18cmVtb3ZlSXRlbUZyb21CYWNrcGFja3xyZW1vdmVJdGVtRnJvbVVuaWZvcm18cmVtb3ZlSXRlbUZyb21WZXN0fHJlbW92ZUl0ZW1zfHJlbW92ZU1hZ2F6aW5lfHJlbW92ZU1hZ2F6aW5lR2xvYmFsfHJlbW92ZU1hZ2F6aW5lc3xyZW1vdmVNYWdhemluZXNUdXJyZXR8cmVtb3ZlTWFnYXppbmVUdXJyZXR8cmVtb3ZlTWVudUl0ZW18cmVtb3ZlTWlzc2lvbkV2ZW50SGFuZGxlcnxyZW1vdmVNUEV2ZW50SGFuZGxlcnxyZW1vdmVNdXNpY0V2ZW50SGFuZGxlcnxyZW1vdmVPd25lZE1pbmV8cmVtb3ZlUHJpbWFyeVdlYXBvbkl0ZW18cmVtb3ZlU2Vjb25kYXJ5V2VhcG9uSXRlbXxyZW1vdmVTaW1wbGVUYXNrfHJlbW92ZVN3aXRjaGFibGVVbml0fHJlbW92ZVRlYW1NZW1iZXJ8cmVtb3ZlVW5pZm9ybXxyZW1vdmVWZXN0fHJlbW92ZVdlYXBvbnxyZW1vdmVXZWFwb25BdHRhY2htZW50Q2FyZ298cmVtb3ZlV2VhcG9uQ2FyZ298cmVtb3ZlV2VhcG9uR2xvYmFsfHJlbW92ZVdlYXBvblR1cnJldHxyZXBvcnRSZW1vdGVUYXJnZXR8cmVxdWlyZWRWZXJzaW9ufHJlc2V0Q2FtU2hha2V8cmVzZXRTdWJncm91cERpcmVjdGlvbnxyZXNpc3RhbmNlfHJlc2l6ZXxyZXNvdXJjZXN8cmVzcGF3blZlaGljbGV8cmVzdGFydEVkaXRvckNhbWVyYXxyZXZlYWx8cmV2ZWFsTWluZXxyZXZlcnNlfHJldmVyc2VkTW91c2VZfHJvYWRBdHxyb2Fkc0Nvbm5lY3RlZFRvfHJvbGVEZXNjcmlwdGlvbnxyb3BlQXR0YWNoZWRPYmplY3RzfHJvcGVBdHRhY2hlZFRvfHJvcGVBdHRhY2hFbmFibGVkfHJvcGVBdHRhY2hUb3xyb3BlQ3JlYXRlfHJvcGVDdXR8cm9wZURlc3Ryb3l8cm9wZURldGFjaHxyb3BlRW5kUG9zaXRpb258cm9wZUxlbmd0aHxyb3Blc3xyb3BlVW53aW5kfHJvcGVVbndvdW5kfHJvdG9yc0ZvcmNlc1JURHxyb3RvcnNScG1SVER8cm91bmR8cnVuSW5pdFNjcmlwdHxzYWZlWm9uZUh8c2FmZVpvbmVXfHNhZmVab25lV0Fic3xzYWZlWm9uZVh8c2FmZVpvbmVYQWJzfHNhZmVab25lWXxzYXZlM0RFTkludmVudG9yeXxzYXZlR2FtZXxzYXZlSWRlbnRpdHl8c2F2ZUpveXN0aWNrc3xzYXZlT3ZlcmxheXxzYXZlUHJvZmlsZU5hbWVzcGFjZXxzYXZlU3RhdHVzfHNhdmVWYXJ8c2F2aW5nRW5hYmxlZHxzYXl8c2F5MkR8c2F5M0R8c2NvcmV8c2NvcmVTaWRlfHNjcmVlbnNob3R8c2NyZWVuVG9Xb3JsZHxzY3JpcHREb25lfHNjcmlwdE5hbWV8c2NyaXB0TnVsbHxzY3VkU3RhdGV8c2Vjb25kYXJ5V2VhcG9ufHNlY29uZGFyeVdlYXBvbkl0ZW1zfHNlY29uZGFyeVdlYXBvbk1hZ2F6aW5lfHNlbGVjdHxzZWxlY3RCZXN0UGxhY2VzfHNlbGVjdERpYXJ5U3ViamVjdHxzZWxlY3RlZEVkaXRvck9iamVjdHN8c2VsZWN0RWRpdG9yT2JqZWN0fHNlbGVjdGlvbk5hbWVzfHNlbGVjdGlvblBvc2l0aW9ufHNlbGVjdExlYWRlcnxzZWxlY3RNYXh8c2VsZWN0TWlufHNlbGVjdE5vUGxheWVyfHNlbGVjdFBsYXllcnxzZWxlY3RSYW5kb218c2VsZWN0UmFuZG9tV2VpZ2h0ZWR8c2VsZWN0V2VhcG9ufHNlbGVjdFdlYXBvblR1cnJldHxzZW5kQVVNZXNzYWdlfHNlbmRTaW1wbGVDb21tYW5kfHNlbmRUYXNrfHNlbmRUYXNrUmVzdWx0fHNlbmRVRFBNZXNzYWdlfHNlcnZlckNvbW1hbmR8c2VydmVyQ29tbWFuZEF2YWlsYWJsZXxzZXJ2ZXJDb21tYW5kRXhlY3V0YWJsZXxzZXJ2ZXJOYW1lfHNlcnZlclRpbWV8c2V0fHNldDNERU5BdHRyaWJ1dGV8c2V0M0RFTkF0dHJpYnV0ZXN8c2V0M0RFTkdyaWR8c2V0M0RFTkljb25zVmlzaWJsZXxzZXQzREVOTGF5ZXJ8c2V0M0RFTkxpbmVzVmlzaWJsZXxzZXQzREVOTG9naWNUeXBlfHNldDNERU5NaXNzaW9uQXR0cmlidXRlfHNldDNERU5NaXNzaW9uQXR0cmlidXRlc3xzZXQzREVOTW9kZWxzVmlzaWJsZXxzZXQzREVOT2JqZWN0VHlwZXxzZXQzREVOU2VsZWN0ZWR8c2V0QWNjVGltZXxzZXRBY3R1YWxDb2xsZWN0aXZlUlREfHNldEFpcnBsYW5lVGhyb3R0bGV8c2V0QWlycG9ydFNpZGV8c2V0QW1tb3xzZXRBbW1vQ2FyZ298c2V0QW1tb09uUHlsb258c2V0QW5pbVNwZWVkQ29lZnxzZXRBcGVydHVyZXxzZXRBcGVydHVyZU5ld3xzZXRBcm1vcnlQb2ludHN8c2V0QXR0cmlidXRlc3xzZXRBdXRvbm9tb3VzfHNldEJlaGF2aW91cnxzZXRCbGVlZGluZ1JlbWFpbmluZ3xzZXRCcmFrZXNSVER8c2V0Q2FtZXJhSW50ZXJlc3R8c2V0Q2FtU2hha2VEZWZQYXJhbXN8c2V0Q2FtU2hha2VQYXJhbXN8c2V0Q2FtVXNlVEl8c2V0Q2FwdGl2ZXxzZXRDZW50ZXJPZk1hc3N8c2V0Q29sbGlzaW9uTGlnaHR8c2V0Q29tYmF0TW9kZXxzZXRDb21wYXNzT3NjaWxsYXRpb258c2V0Q29udm95U2VwYXJhdGlvbnxzZXRDdXJhdG9yQ2FtZXJhQXJlYUNlaWxpbmd8c2V0Q3VyYXRvckNvZWZ8c2V0Q3VyYXRvckVkaXRpbmdBcmVhVHlwZXxzZXRDdXJhdG9yV2F5cG9pbnRDb3N0fHNldEN1cnJlbnRDaGFubmVsfHNldEN1cnJlbnRUYXNrfHNldEN1cnJlbnRXYXlwb2ludHxzZXRDdXN0b21BaW1Db2VmfHNldEN1c3RvbVdlaWdodFJURHxzZXREYW1hZ2V8c2V0RGFtbWFnZXxzZXREYXRlfHNldERlYnJpZWZpbmdUZXh0fHNldERlZmF1bHRDYW1lcmF8c2V0RGVzdGluYXRpb258c2V0RGV0YWlsTWFwQmxlbmRQYXJzfHNldERpcnxzZXREaXJlY3Rpb258c2V0RHJhd0ljb258c2V0RHJpdmVPblBhdGh8c2V0RHJvcEludGVydmFsfHNldER5bmFtaWNTaW11bGF0aW9uRGlzdGFuY2V8c2V0RHluYW1pY1NpbXVsYXRpb25EaXN0YW5jZUNvZWZ8c2V0RWRpdG9yTW9kZXxzZXRFZGl0b3JPYmplY3RTY29wZXxzZXRFZmZlY3RDb25kaXRpb258c2V0RW5naW5lUnBtUlREfHNldEZhY2V8c2V0RmFjZUFuaW1hdGlvbnxzZXRGYXRpZ3VlfHNldEZlYXR1cmVUeXBlfHNldEZsYWdBbmltYXRpb25QaGFzZXxzZXRGbGFnT3duZXJ8c2V0RmxhZ1NpZGV8c2V0RmxhZ1RleHR1cmV8c2V0Rm9nfHNldEZvcmNlR2VuZXJhdG9yUlREfHNldEZvcm1hdGlvbnxzZXRGb3JtYXRpb25UYXNrfHNldEZvcm1EaXJ8c2V0RnJpZW5kfHNldEZyb21FZGl0b3J8c2V0RlNNVmFyaWFibGV8c2V0RnVlbHxzZXRGdWVsQ2FyZ298c2V0R3JvdXBJY29ufHNldEdyb3VwSWNvblBhcmFtc3xzZXRHcm91cEljb25zU2VsZWN0YWJsZXxzZXRHcm91cEljb25zVmlzaWJsZXxzZXRHcm91cElkfHNldEdyb3VwSWRHbG9iYWx8c2V0R3JvdXBPd25lcnxzZXRHdXN0c3xzZXRIaWRlQmVoaW5kfHNldEhpdHxzZXRIaXRJbmRleHxzZXRIaXRQb2ludERhbWFnZXxzZXRIb3Jpem9uUGFyYWxsYXhDb2VmfHNldEhVRE1vdmVtZW50TGV2ZWxzfHNldElkZW50aXR5fHNldEltcG9ydGFuY2V8c2V0SW5mb1BhbmVsfHNldExlYWRlcnxzZXRMaWdodEFtYmllbnR8c2V0TGlnaHRBdHRlbnVhdGlvbnxzZXRMaWdodEJyaWdodG5lc3N8c2V0TGlnaHRDb2xvcnxzZXRMaWdodERheUxpZ2h0fHNldExpZ2h0RmxhcmVNYXhEaXN0YW5jZXxzZXRMaWdodEZsYXJlU2l6ZXxzZXRMaWdodEludGVuc2l0eXxzZXRMaWdodG5pbmdzfHNldExpZ2h0VXNlRmxhcmV8c2V0TG9jYWxXaW5kUGFyYW1zfHNldE1hZ2F6aW5lVHVycmV0QW1tb3xzZXRNYXJrZXJBbHBoYXxzZXRNYXJrZXJBbHBoYUxvY2FsfHNldE1hcmtlckJydXNofHNldE1hcmtlckJydXNoTG9jYWx8c2V0TWFya2VyQ29sb3J8c2V0TWFya2VyQ29sb3JMb2NhbHxzZXRNYXJrZXJEaXJ8c2V0TWFya2VyRGlyTG9jYWx8c2V0TWFya2VyUG9zfHNldE1hcmtlclBvc0xvY2FsfHNldE1hcmtlclNoYXBlfHNldE1hcmtlclNoYXBlTG9jYWx8c2V0TWFya2VyU2l6ZXxzZXRNYXJrZXJTaXplTG9jYWx8c2V0TWFya2VyVGV4dHxzZXRNYXJrZXJUZXh0TG9jYWx8c2V0TWFya2VyVHlwZXxzZXRNYXJrZXJUeXBlTG9jYWx8c2V0TWFzc3xzZXRNaW1pY3xzZXRNb3VzZVBvc2l0aW9ufHNldE11c2ljRWZmZWN0fHNldE11c2ljRXZlbnRIYW5kbGVyfHNldE5hbWV8c2V0TmFtZVNvdW5kfHNldE9iamVjdEFyZ3VtZW50c3xzZXRPYmplY3RNYXRlcmlhbHxzZXRPYmplY3RNYXRlcmlhbEdsb2JhbHxzZXRPYmplY3RQcm94eXxzZXRPYmplY3RUZXh0dXJlfHNldE9iamVjdFRleHR1cmVHbG9iYWx8c2V0T2JqZWN0Vmlld0Rpc3RhbmNlfHNldE92ZXJjYXN0fHNldE93bmVyfHNldE94eWdlblJlbWFpbmluZ3xzZXRQYXJ0aWNsZUNpcmNsZXxzZXRQYXJ0aWNsZUNsYXNzfHNldFBhcnRpY2xlRmlyZXxzZXRQYXJ0aWNsZVBhcmFtc3xzZXRQYXJ0aWNsZVJhbmRvbXxzZXRQaWxvdENhbWVyYURpcmVjdGlvbnxzZXRQaWxvdENhbWVyYVJvdGF0aW9ufHNldFBpbG90Q2FtZXJhVGFyZ2V0fHNldFBpbG90TGlnaHR8c2V0UGlQRWZmZWN0fHNldFBpdGNofHNldFBsYXRlTnVtYmVyfHNldFBsYXlhYmxlfHNldFBsYXllclJlc3Bhd25UaW1lfHNldFBvc3xzZXRQb3NBU0x8c2V0UG9zQVNMMnxzZXRQb3NBU0xXfHNldFBvc0FUTHxzZXRQb3NpdGlvbnxzZXRQb3NXb3JsZHxzZXRQeWxvbkxvYWRPdXR8c2V0UHlsb25zUHJpb3JpdHl8c2V0UmFkaW9Nc2d8c2V0UmFpbnxzZXRSYWluYm93fHNldFJhbmRvbUxpcHxzZXRSYW5rfHNldFJlY3Rhbmd1bGFyfHNldFJlcGFpckNhcmdvfHNldFJvdG9yQnJha2VSVER8c2V0U2hhZG93RGlzdGFuY2V8c2V0U2hvdFBhcmVudHN8c2V0U2lkZXxzZXRTaW1wbGVUYXNrQWx3YXlzVmlzaWJsZXxzZXRTaW1wbGVUYXNrQ3VzdG9tRGF0YXxzZXRTaW1wbGVUYXNrRGVzY3JpcHRpb258c2V0U2ltcGxlVGFza0Rlc3RpbmF0aW9ufHNldFNpbXBsZVRhc2tUYXJnZXR8c2V0U2ltcGxlVGFza1R5cGV8c2V0U2ltdWxXZWF0aGVyTGF5ZXJzfHNldFNpemV8c2V0U2tpbGx8c2V0U2xpbmdMb2FkfHNldFNvdW5kRWZmZWN0fHNldFNwZWFrZXJ8c2V0U3BlZWNofHNldFNwZWVkTW9kZXxzZXRTdGFtaW5hfHNldFN0YW1pbmFTY2hlbWV8c2V0U3RhdFZhbHVlfHNldFN1cHByZXNzaW9ufHNldFN5c3RlbU9mVW5pdHN8c2V0VGFyZ2V0QWdlfHNldFRhc2tNYXJrZXJPZmZzZXR8c2V0VGFza1Jlc3VsdHxzZXRUYXNrU3RhdGV8c2V0VGVycmFpbkdyaWR8c2V0VGV4dHxzZXRUaW1lTXVsdGlwbGllcnxzZXRUaXRsZUVmZmVjdHxzZXRUb25lTWFwcGluZ3xzZXRUb25lTWFwcGluZ1BhcmFtc3xzZXRUcmFmZmljRGVuc2l0eXxzZXRUcmFmZmljRGlzdGFuY2V8c2V0VHJhZmZpY0dhcHxzZXRUcmFmZmljU3BlZWR8c2V0VHJpZ2dlckFjdGl2YXRpb258c2V0VHJpZ2dlckFyZWF8c2V0VHJpZ2dlclN0YXRlbWVudHN8c2V0VHJpZ2dlclRleHR8c2V0VHJpZ2dlclRpbWVvdXR8c2V0VHJpZ2dlclR5cGV8c2V0VHlwZXxzZXRVbmNvbnNjaW91c3xzZXRVbml0QWJpbGl0eXxzZXRVbml0TG9hZG91dHxzZXRVbml0UG9zfHNldFVuaXRQb3NXZWFrfHNldFVuaXRSYW5rfHNldFVuaXRSZWNvaWxDb2VmZmljaWVudHxzZXRVbml0VHJhaXR8c2V0VW5sb2FkSW5Db21iYXR8c2V0VXNlckFjdGlvblRleHR8c2V0VXNlck1GRFRleHR8c2V0VXNlck1GRFZhbHVlfHNldFZhcmlhYmxlfHNldFZlY3RvckRpcnxzZXRWZWN0b3JEaXJBbmRVcHxzZXRWZWN0b3JVcHxzZXRWZWhpY2xlQW1tb3xzZXRWZWhpY2xlQW1tb0RlZnxzZXRWZWhpY2xlQXJtb3J8c2V0VmVoaWNsZUNhcmdvfHNldFZlaGljbGVJZHxzZXRWZWhpY2xlSW5pdHxzZXRWZWhpY2xlTG9ja3xzZXRWZWhpY2xlUG9zaXRpb258c2V0VmVoaWNsZVJhZGFyfHNldFZlaGljbGVSZWNlaXZlUmVtb3RlVGFyZ2V0c3xzZXRWZWhpY2xlUmVwb3J0T3duUG9zaXRpb258c2V0VmVoaWNsZVJlcG9ydFJlbW90ZVRhcmdldHN8c2V0VmVoaWNsZVRJUGFyc3xzZXRWZWhpY2xlVmFyTmFtZXxzZXRWZWxvY2l0eXxzZXRWZWxvY2l0eU1vZGVsU3BhY2V8c2V0VmVsb2NpdHlUcmFuc2Zvcm1hdGlvbnxzZXRWaWV3RGlzdGFuY2V8c2V0VmlzaWJsZUlmVHJlZUNvbGxhcHNlZHxzZXRXYW50ZWRScG1SVER8c2V0V2F2ZXN8c2V0V2F5cG9pbnRCZWhhdmlvdXJ8c2V0V2F5cG9pbnRDb21iYXRNb2RlfHNldFdheXBvaW50Q29tcGxldGlvblJhZGl1c3xzZXRXYXlwb2ludERlc2NyaXB0aW9ufHNldFdheXBvaW50Rm9yY2VCZWhhdmlvdXJ8c2V0V2F5cG9pbnRGb3JtYXRpb258c2V0V2F5cG9pbnRIb3VzZVBvc2l0aW9ufHNldFdheXBvaW50TG9pdGVyUmFkaXVzfHNldFdheXBvaW50TG9pdGVyVHlwZXxzZXRXYXlwb2ludE5hbWV8c2V0V2F5cG9pbnRQb3NpdGlvbnxzZXRXYXlwb2ludFNjcmlwdHxzZXRXYXlwb2ludFNwZWVkfHNldFdheXBvaW50U3RhdGVtZW50c3xzZXRXYXlwb2ludFRpbWVvdXR8c2V0V2F5cG9pbnRUeXBlfHNldFdheXBvaW50VmlzaWJsZXxzZXRXZWFwb25SZWxvYWRpbmdUaW1lfHNldFdpbmR8c2V0V2luZERpcnxzZXRXaW5kRm9yY2V8c2V0V2luZFN0cnxzZXRXaW5nRm9yY2VTY2FsZVJURHxzZXRXUFBvc3xzaG93M0RJY29uc3xzaG93Q2hhdHxzaG93Q2luZW1hQm9yZGVyfHNob3dDb21tYW5kaW5nTWVudXxzaG93Q29tcGFzc3xzaG93Q3VyYXRvckNvbXBhc3N8c2hvd0dQU3xzaG93SFVEfHNob3dMZWdlbmR8c2hvd01hcHxzaG93bkFydGlsbGVyeUNvbXB1dGVyfHNob3duQ2hhdHxzaG93bkNvbXBhc3N8c2hvd25DdXJhdG9yQ29tcGFzc3xzaG93TmV3RWRpdG9yT2JqZWN0fHNob3duR1BTfHNob3duSFVEfHNob3duTWFwfHNob3duUGFkfHNob3duUmFkaW98c2hvd25TY29yZXRhYmxlfHNob3duVUFWRmVlZHxzaG93bldhcnJhbnR8c2hvd25XYXRjaHxzaG93UGFkfHNob3dSYWRpb3xzaG93U2NvcmV0YWJsZXxzaG93U3VidGl0bGVzfHNob3dVQVZGZWVkfHNob3dXYXJyYW50fHNob3dXYXRjaHxzaG93V2F5cG9pbnR8c2hvd1dheXBvaW50c3xzaWRlfHNpZGVBbWJpZW50TGlmZXxzaWRlQ2hhdHxzaWRlRW1wdHl8c2lkZUVuZW15fHNpZGVGcmllbmRseXxzaWRlTG9naWN8c2lkZVJhZGlvfHNpZGVVbmtub3dufHNpbXBsZVRhc2tzfHNpbXVsYXRpb25FbmFibGVkfHNpbXVsQ2xvdWREZW5zaXR5fHNpbXVsQ2xvdWRPY2NsdXNpb258c2ltdWxJbkNsb3Vkc3xzaW11bFdlYXRoZXJTeW5jfHNpbnxzaXplfHNpemVPZnxza2lsbHxza2lsbEZpbmFsfHNraXBUaW1lfHNsZWVwfHNsaWRlclBvc2l0aW9ufHNsaWRlclJhbmdlfHNsaWRlclNldFBvc2l0aW9ufHNsaWRlclNldFJhbmdlfHNsaWRlclNldFNwZWVkfHNsaWRlclNwZWVkfHNsaW5nTG9hZEFzc2lzdGFudFNob3dufHNvbGRpZXJNYWdhemluZXN8c29tZUFtbW98c29ydHxzb3VuZFZvbHVtZXxzcGVha2VyfHNwZWVkfHNwZWVkTW9kZXxzcGxpdFN0cmluZ3xzcXJ0fHNxdWFkUGFyYW1zfHN0YW5jZXxzdGFydExvYWRpbmdTY3JlZW58c3RvcHxzdG9wRW5naW5lUlREfHN0b3BwZWR8c3RyfHN1bk9yTW9vbnxzdXBwb3J0SW5mb3xzdXBwcmVzc0ZvcnxzdXJmYWNlSXNXYXRlcnxzdXJmYWNlTm9ybWFsfHN1cmZhY2VUeXBlfHN3aW1JbkRlcHRofHN3aXRjaGFibGVVbml0c3xzd2l0Y2hBY3Rpb258c3dpdGNoQ2FtZXJhfHN3aXRjaEdlc3R1cmV8c3dpdGNoTGlnaHR8c3dpdGNoTW92ZXxzeW5jaHJvbml6ZWRPYmplY3RzfHN5bmNocm9uaXplZFRyaWdnZXJzfHN5bmNocm9uaXplZFdheXBvaW50c3xzeW5jaHJvbml6ZU9iamVjdHNBZGR8c3luY2hyb25pemVPYmplY3RzUmVtb3ZlfHN5bmNocm9uaXplVHJpZ2dlcnxzeW5jaHJvbml6ZVdheXBvaW50fHN5c3RlbUNoYXR8c3lzdGVtT2ZVbml0c3x0YW58dGFyZ2V0S25vd2xlZGdlfHRhcmdldHN8dGFyZ2V0c0FnZ3JlZ2F0ZXx0YXJnZXRzUXVlcnl8dGFza0Fsd2F5c1Zpc2libGV8dGFza0NoaWxkcmVufHRhc2tDb21wbGV0ZWR8dGFza0N1c3RvbURhdGF8dGFza0Rlc2NyaXB0aW9ufHRhc2tEZXN0aW5hdGlvbnx0YXNrSGludHx0YXNrTWFya2VyT2Zmc2V0fHRhc2tOdWxsfHRhc2tQYXJlbnR8dGFza1Jlc3VsdHx0YXNrU3RhdGV8dGFza1R5cGV8dGVhbU1lbWJlcnx0ZWFtTWVtYmVyTnVsbHx0ZWFtTmFtZXx0ZWFtc3x0ZWFtU3dpdGNofHRlYW1Td2l0Y2hFbmFibGVkfHRlYW1UeXBlfHRlcm1pbmF0ZXx0ZXJyYWluSW50ZXJzZWN0fHRlcnJhaW5JbnRlcnNlY3RBU0x8dGVycmFpbkludGVyc2VjdEF0QVNMfHRleHR8dGV4dExvZ3x0ZXh0TG9nRm9ybWF0fHRnfHRpbWV8dGltZU11bHRpcGxpZXJ8dGl0bGVDdXR8dGl0bGVGYWRlT3V0fHRpdGxlT2JqfHRpdGxlUnNjfHRpdGxlVGV4dHx0b0FycmF5fHRvRml4ZWR8dG9Mb3dlcnx0b1N0cmluZ3x0b1VwcGVyfHRyaWdnZXJBY3RpdmF0ZWR8dHJpZ2dlckFjdGl2YXRpb258dHJpZ2dlckFyZWF8dHJpZ2dlckF0dGFjaGVkVmVoaWNsZXx0cmlnZ2VyQXR0YWNoT2JqZWN0fHRyaWdnZXJBdHRhY2hWZWhpY2xlfHRyaWdnZXJEeW5hbWljU2ltdWxhdGlvbnx0cmlnZ2VyU3RhdGVtZW50c3x0cmlnZ2VyVGV4dHx0cmlnZ2VyVGltZW91dHx0cmlnZ2VyVGltZW91dEN1cnJlbnR8dHJpZ2dlclR5cGV8dHVycmV0TG9jYWx8dHVycmV0T3duZXJ8dHVycmV0VW5pdHx0dkFkZHx0dkNsZWFyfHR2Q29sbGFwc2V8dHZDb2xsYXBzZUFsbHx0dkNvdW50fHR2Q3VyU2VsfHR2RGF0YXx0dkRlbGV0ZXx0dkV4cGFuZHx0dkV4cGFuZEFsbHx0dlBpY3R1cmV8dHZQaWN0dXJlUmlnaHR8dHZTZXRDb2xvcnx0dlNldEN1clNlbHx0dlNldERhdGF8dHZTZXRQaWN0dXJlfHR2U2V0UGljdHVyZUNvbG9yfHR2U2V0UGljdHVyZUNvbG9yRGlzYWJsZWR8dHZTZXRQaWN0dXJlQ29sb3JTZWxlY3RlZHx0dlNldFBpY3R1cmVSaWdodHx0dlNldFBpY3R1cmVSaWdodENvbG9yfHR2U2V0UGljdHVyZVJpZ2h0Q29sb3JEaXNhYmxlZHx0dlNldFBpY3R1cmVSaWdodENvbG9yU2VsZWN0ZWR8dHZTZXRTZWxlY3RDb2xvcnx0dlNldFRleHR8dHZTZXRUb29sdGlwfHR2U2V0VmFsdWV8dHZTb3J0fHR2U29ydEJ5VmFsdWV8dHZUZXh0fHR2VG9vbHRpcHx0dlZhbHVlfHR5cGV8dHlwZU5hbWV8dHlwZU9mfFVBVkNvbnRyb2x8dWlOYW1lc3BhY2V8dWlTbGVlcHx1bmFzc2lnbkN1cmF0b3J8dW5hc3NpZ25JdGVtfHVuYXNzaWduVGVhbXx1bmFzc2lnblZlaGljbGV8dW5kZXJ3YXRlcnx1bmlmb3JtfHVuaWZvcm1Db250YWluZXJ8dW5pZm9ybUl0ZW1zfHVuaWZvcm1NYWdhemluZXN8dW5pdEFkZG9uc3x1bml0QWltUG9zaXRpb258dW5pdEFpbVBvc2l0aW9uVmlzdWFsfHVuaXRCYWNrcGFja3x1bml0SXNVQVZ8dW5pdFBvc3x1bml0UmVhZHl8dW5pdFJlY29pbENvZWZmaWNpZW50fHVuaXRzfHVuaXRzQmVsb3dIZWlnaHR8dW5saW5rSXRlbXx1bmxvY2tBY2hpZXZlbWVudHx1bnJlZ2lzdGVyVGFza3x1cGRhdGVEcmF3SWNvbnx1cGRhdGVNZW51SXRlbXx1cGRhdGVPYmplY3RUcmVlfHVzZUFJT3Blck1hcE9ic3RydWN0aW9uVGVzdHx1c2VBSVN0ZWVyaW5nQ29tcG9uZW50fHVzZUF1ZGlvVGltZUZvck1vdmVzfHVzZXJJbnB1dERpc2FibGVkfHZlY3RvckFkZHx2ZWN0b3JDb3N8dmVjdG9yQ3Jvc3NQcm9kdWN0fHZlY3RvckRpZmZ8dmVjdG9yRGlyfHZlY3RvckRpclZpc3VhbHx2ZWN0b3JEaXN0YW5jZXx2ZWN0b3JEaXN0YW5jZVNxcnx2ZWN0b3JEb3RQcm9kdWN0fHZlY3RvckZyb21Ub3x2ZWN0b3JNYWduaXR1ZGV8dmVjdG9yTWFnbml0dWRlU3FyfHZlY3Rvck1vZGVsVG9Xb3JsZHx2ZWN0b3JNb2RlbFRvV29ybGRWaXN1YWx8dmVjdG9yTXVsdGlwbHl8dmVjdG9yTm9ybWFsaXplZHx2ZWN0b3JVcHx2ZWN0b3JVcFZpc3VhbHx2ZWN0b3JXb3JsZFRvTW9kZWx8dmVjdG9yV29ybGRUb01vZGVsVmlzdWFsfHZlaGljbGV8dmVoaWNsZUNhcmdvRW5hYmxlZHx2ZWhpY2xlQ2hhdHx2ZWhpY2xlUmFkaW98dmVoaWNsZVJlY2VpdmVSZW1vdGVUYXJnZXRzfHZlaGljbGVSZXBvcnRPd25Qb3NpdGlvbnx2ZWhpY2xlUmVwb3J0UmVtb3RlVGFyZ2V0c3x2ZWhpY2xlc3x2ZWhpY2xlVmFyTmFtZXx2ZWxvY2l0eXx2ZWxvY2l0eU1vZGVsU3BhY2V8dmVyaWZ5U2lnbmF0dXJlfHZlc3R8dmVzdENvbnRhaW5lcnx2ZXN0SXRlbXN8dmVzdE1hZ2F6aW5lc3x2aWV3RGlzdGFuY2V8dmlzaWJsZUNvbXBhc3N8dmlzaWJsZUdQU3x2aXNpYmxlTWFwfHZpc2libGVQb3NpdGlvbnx2aXNpYmxlUG9zaXRpb25BU0x8dmlzaWJsZVNjb3JldGFibGV8dmlzaWJsZVdhdGNofHdhaXRVbnRpbHx3YXZlc3x3YXlwb2ludEF0dGFjaGVkT2JqZWN0fHdheXBvaW50QXR0YWNoZWRWZWhpY2xlfHdheXBvaW50QXR0YWNoT2JqZWN0fHdheXBvaW50QXR0YWNoVmVoaWNsZXx3YXlwb2ludEJlaGF2aW91cnx3YXlwb2ludENvbWJhdE1vZGV8d2F5cG9pbnRDb21wbGV0aW9uUmFkaXVzfHdheXBvaW50RGVzY3JpcHRpb258d2F5cG9pbnRGb3JjZUJlaGF2aW91cnx3YXlwb2ludEZvcm1hdGlvbnx3YXlwb2ludEhvdXNlUG9zaXRpb258d2F5cG9pbnRMb2l0ZXJSYWRpdXN8d2F5cG9pbnRMb2l0ZXJUeXBlfHdheXBvaW50TmFtZXx3YXlwb2ludFBvc2l0aW9ufHdheXBvaW50c3x3YXlwb2ludFNjcmlwdHx3YXlwb2ludHNFbmFibGVkVUFWfHdheXBvaW50U2hvd3x3YXlwb2ludFNwZWVkfHdheXBvaW50U3RhdGVtZW50c3x3YXlwb2ludFRpbWVvdXR8d2F5cG9pbnRUaW1lb3V0Q3VycmVudHx3YXlwb2ludFR5cGV8d2F5cG9pbnRWaXNpYmxlfHdlYXBvbkFjY2Vzc29yaWVzfHdlYXBvbkFjY2Vzc29yaWVzQ2FyZ298d2VhcG9uQ2FyZ298d2VhcG9uRGlyZWN0aW9ufHdlYXBvbkluZXJ0aWF8d2VhcG9uTG93ZXJlZHx3ZWFwb25zfHdlYXBvbnNJdGVtc3x3ZWFwb25zSXRlbXNDYXJnb3x3ZWFwb25TdGF0ZXx3ZWFwb25zVHVycmV0fHdlaWdodFJURHx3ZXN0fFdGU2lkZVRleHR8d2luZHx3aW5kRGlyfHdpbmRSVER8d2luZFN0cnx3aW5nc0ZvcmNlc1JURHx3b3JsZE5hbWV8d29ybGRTaXplfHdvcmxkVG9Nb2RlbHx3b3JsZFRvTW9kZWxWaXN1YWx8d29ybGRUb1NjcmVlbilcXGIvaSxcblx0J251bWJlcic6IC8oPzpcXCR8XFxiMHgpW1xcZGEtZl0rXFxifCg/OlxcQlxcLlxcZCt8XFxiXFxkKyg/OlxcLlxcZCspPykoPzplWystXT9cXGQrKT9cXGIvaSxcblx0J29wZXJhdG9yJzogLyMjfD4+fCYmfFxcfFxcfHxbIT08Pl09P3xbLSsqLyUjXl18XFxiKD86YW5kfG1vZHxub3R8b3IpXFxiL2ksXG5cdCdtYWdpYy12YXJpYWJsZSc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKD86dGhpc3x0aGlzTGlzdHx0aGlzVHJpZ2dlcnxfZXhjZXB0aW9ufF9mbmNfc2NyaXB0TmFtZXxfZm5jX3NjcmlwdE5hbWVQYXJlbnR8X2ZvckVhY2hJbmRleHxfdGhpc3xfdGhpc0V2ZW50SGFuZGxlcnxfdGhpc0ZTTXxfdGhpc1NjcmlwdHxfeClcXGIvaSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdjb25zdGFudCc6IC9cXGJESUsoPzpfW2EtelxcZF0rKStcXGIvaVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3NxZicsICdzdHJpbmcnLCB7XG5cdCdtYWNybyc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSNbYS16XSg/OlteXFxyXFxuXFxcXF18XFxcXCg/OlxcclxcbnxbXFxzXFxTXSkpKi9pbSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ3Byb3BlcnR5Jyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdkaXJlY3RpdmUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8jW2Etel0rXFxiL2ksXG5cdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdH0sXG5cdFx0XHQnY29tbWVudCc6IFByaXNtLmxhbmd1YWdlcy5zcWYuY29tbWVudFxuXHRcdH1cblx0fVxufSk7XG5cbmRlbGV0ZSBQcmlzbS5sYW5ndWFnZXMuc3FmWydjbGFzcy1uYW1lJ107XG5cblByaXNtLmxhbmd1YWdlcy5zcXVpcnJlbCA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHQnY29tbWVudCc6IFtcblx0XHRQcmlzbS5sYW5ndWFnZXMuY2xpa2VbJ2NvbW1lbnQnXVswXSxcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcOl0pKD86XFwvXFwvfCMpLiovLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXCInQF0pKD86QFwiKD86W15cIl18XCJcIikqXCIoPyFcIil8XCIoPzpbXlxcXFxcXHJcXG5cIl18XFxcXC4pKlwiKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblxuXHQnY2xhc3MtbmFtZSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYig/OmNsYXNzfGVudW18ZXh0ZW5kc3xpbnN0YW5jZW9mKVxccyspXFx3Kyg/OlxcLlxcdyspKi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0fVxuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzpfX0ZJTEVfX3xfX0xJTkVfX3xiYXNlfGJyZWFrfGNhc2V8Y2F0Y2h8Y2xhc3N8Y2xvbmV8Y29uc3R8Y29uc3RydWN0b3J8Y29udGludWV8ZGVmYXVsdHxkZWxldGV8ZWxzZXxlbnVtfGV4dGVuZHN8Zm9yfGZvcmVhY2h8ZnVuY3Rpb258aWZ8aW58aW5zdGFuY2VvZnxsb2NhbHxudWxsfHJlc3VtZXxyZXR1cm58c3RhdGljfHN3aXRjaHx0aGlzfHRocm93fHRyeXx0eXBlb2Z8d2hpbGV8eWllbGQpXFxiLyxcblxuXHQnbnVtYmVyJzogL1xcYig/OjB4WzAtOWEtZkEtRl0rfFxcZCsoPzpcXC4oPzpcXGQrfFtlRV1bKy1dP1xcZCspKT8pXFxiLyxcblx0J29wZXJhdG9yJzogL1xcK1xcK3wtLXw8PT58PFstPF18Pj4+P3wmJj98XFx8XFx8P3xbLSsqLyUhPTw+XT0/fFt+Xl18Ojo/Lyxcblx0J3B1bmN0dWF0aW9uJzogL1soKXt9XFxbXFxdLDsuXS9cbn0pO1xuXG5QcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCdzcXVpcnJlbCcsICdzdHJpbmcnLCB7XG5cdCdjaGFyJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxcIiddKScoPzpbXlxcXFwnXXxcXFxcKD86W3h1VV1bMC05YS1mQS1GXXswLDh9fFtcXHNcXFNdKSknLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnc3F1aXJyZWwnLCAnb3BlcmF0b3InLCB7XG5cdCdhdHRyaWJ1dGUtcHVuY3R1YXRpb24nOiB7XG5cdFx0cGF0dGVybjogLzxcXC98XFwvPi8sXG5cdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdH0sXG5cdCdsYW1iZGEnOiB7XG5cdFx0cGF0dGVybjogL0AoPz1cXCgpLyxcblx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHR9XG59KTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdC8vIGh0dHBzOi8vbWMtc3Rhbi5vcmcvZG9jcy8yXzI4L3JlZmVyZW5jZS1tYW51YWwvYm5mLWdyYW1tYXJzLmh0bWxcblxuXHR2YXIgaGlnaGVyT3JkZXJGdW5jdGlvbnMgPSAvXFxiKD86YWxnZWJyYV9zb2x2ZXJ8YWxnZWJyYV9zb2x2ZXJfbmV3dG9ufGludGVncmF0ZV8xZHxpbnRlZ3JhdGVfb2RlfGludGVncmF0ZV9vZGVfYmRmfGludGVncmF0ZV9vZGVfcms0NXxtYXBfcmVjdHxvZGVfKD86YWRhbXN8YmRmfGNrcmt8cms0NSkoPzpfdG9sKT98b2RlX2Fkam9pbnRfdG9sX2N0bHxyZWR1Y2Vfc3VtfHJlZHVjZV9zdW1fc3RhdGljKVxcYi87XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnN0YW4gPSB7XG5cdFx0J2NvbW1lbnQnOiAvXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcL3wjKD8haW5jbHVkZSkuKi8sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdC8vIFN0cmluZyBsaXRlcmFscyBjYW4gY29udGFpbiBzcGFjZXMgYW5kIGFueSBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVycyBleGNlcHQgZm9yIFwiIGFuZCBcXFxuXHRcdFx0Ly8gaHR0cHM6Ly9tYy1zdGFuLm9yZy9kb2NzLzJfMjQvcmVmZXJlbmNlLW1hbnVhbC9wcmludC1zdGF0ZW1lbnRzLXNlY3Rpb24uaHRtbCNzdHJpbmctbGl0ZXJhbHNcblx0XHRcdHBhdHRlcm46IC9cIltcXHgyMFxceDIxXFx4MjMtXFx4NUJcXHg1RC1cXHg3RV0qXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0cGF0dGVybjogL14oWyBcXHRdKikjaW5jbHVkZVxcYi4qL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0XHR9LFxuXG5cdFx0J2Z1bmN0aW9uLWFyZyc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0JygnICtcblx0XHRcdFx0aGlnaGVyT3JkZXJGdW5jdGlvbnMuc291cmNlICtcblx0XHRcdFx0L1xccypcXChcXHMqLy5zb3VyY2UgK1xuXHRcdFx0XHQnKScgK1xuXHRcdFx0XHQvW2EtekEtWl1cXHcqLy5zb3VyY2Vcblx0XHRcdCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdmdW5jdGlvbidcblx0XHR9LFxuXHRcdCdjb25zdHJhaW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzppbnR8bWF0cml4fHJlYWx8cm93X3ZlY3Rvcnx2ZWN0b3IpXFxzKik8W148Pl0qPi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oPVxccyopXFxTKD86XFxTfFxccysoPyFcXHMpKSo/KD89XFxzKig/Oj4kfCxcXHMqXFx3K1xccyo9KSkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHJvcGVydHknOiAvXFxiW2Etel1cXHcqKD89XFxzKj0pL2ksXG5cdFx0XHRcdCdvcGVyYXRvcic6IC89Lyxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL148fD4kfCwvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQna2V5d29yZCc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogL1xcYmRhdGEoPz1cXHMqXFx7KXxcXGIoPzpmdW5jdGlvbnN8Z2VuZXJhdGVkfG1vZGVsfHBhcmFtZXRlcnN8cXVhbnRpdGllc3x0cmFuc2Zvcm1lZClcXGIvLFxuXHRcdFx0XHRhbGlhczogJ3Byb2dyYW0tYmxvY2snXG5cdFx0XHR9LFxuXHRcdFx0L1xcYig/OmFycmF5fGJyZWFrfGNob2xlc2t5X2ZhY3Rvcl9jb3JyfGNob2xlc2t5X2ZhY3Rvcl9jb3Z8Y29tcGxleHxjb250aW51ZXxjb3JyX21hdHJpeHxjb3ZfbWF0cml4fGRhdGF8ZWxzZXxmb3J8aWZ8aW58aW5jcmVtZW50X2xvZ19wcm9ifGludHxtYXRyaXh8b3JkZXJlZHxwb3NpdGl2ZV9vcmRlcmVkfHByaW50fHJlYWx8cmVqZWN0fHJldHVybnxyb3dfdmVjdG9yfHNpbXBsZXh8dGFyZ2V0fHVuaXRfdmVjdG9yfHZlY3Rvcnx2b2lkfHdoaWxlKVxcYi8sXG5cdFx0XHQvLyB0aGVzZSBhcmUgZnVuY3Rpb25zIHRoYXQgYXJlIGtub3duIHRvIHRha2UgYW5vdGhlciBmdW5jdGlvbiBhcyB0aGVpciBmaXJzdCBhcmd1bWVudC5cblx0XHRcdGhpZ2hlck9yZGVyRnVuY3Rpb25zXG5cdFx0XSxcblx0XHQnZnVuY3Rpb24nOiAvXFxiW2Etel1cXHcqKD89XFxzKlxcKCkvaSxcblx0XHQnbnVtYmVyJzogLyg/OlxcYlxcZCsoPzpfXFxkKykqKD86XFwuKD86XFxkKyg/Ol9cXGQrKSopPyk/fFxcQlxcLlxcZCsoPzpfXFxkKykqKSg/OkVbKy1dP1xcZCsoPzpfXFxkKykqKT9pPyg/IVxcdykvaSxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cblx0XHQnb3BlcmF0b3InOiAvPC18XFwuWyovXT0/fFxcfFxcfD98JiZ8WyE9PD4rXFwtKi9dPT98WydeJX4/Ol0vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKClcXFtcXF17fSw7XS9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuc3Rhbi5jb25zdHJhaW50Lmluc2lkZS5leHByZXNzaW9uLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy5zdGFuO1xuXG59KFByaXNtKSk7XG5cbi8vIGh0dHBzOi8vd3d3LnN0YXRhLmNvbS9tYW51YWxzL3UucGRmXG4vLyBodHRwczovL3d3dy5zdGF0YS5jb20vbWFudWFscy9wLnBkZlxuXG5QcmlzbS5sYW5ndWFnZXMuc3RhdGEgPSB7XG5cdCdjb21tZW50JzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopXFwqLiovbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxcXHMpXFwvXFwvLip8XFwvXFwqW1xcc1xcU10qP1xcKlxcLy8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnc3RyaW5nLWxpdGVyYWwnOiB7XG5cdFx0cGF0dGVybjogL1wiW15cIlxcclxcbl0qXCJ8W1x1MjAxOGAnXVwiLio/XCJbXHUyMDE5YCddLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQnaW50ZXJwb2xhdGlvbic6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcJFxce1tee31dKlxcfXxbXHUyMDE4YCddXFx3W15cdTIwMTlgJ1xcclxcbl0qW1x1MjAxOWAnXS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eXFwkXFx7fFxcfSQvLFxuXHRcdFx0XHRcdCdleHByZXNzaW9uJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdFx0XHRpbnNpZGU6IG51bGwgLy8gc2VlIGJlbG93XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9LFxuXG5cdCdtYXRhJzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSptYXRhWyBcXHRdKjopW1xcc1xcU10rPyg/PV5lbmRcXGIpL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdsYW5ndWFnZS1tYXRhJyxcblx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5tYXRhXG5cdH0sXG5cdCdqYXZhJzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSpqYXZhWyBcXHRdKjopW1xcc1xcU10rPyg/PV5lbmRcXGIpL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdsYW5ndWFnZS1qYXZhJyxcblx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5qYXZhXG5cdH0sXG5cdCdweXRob24nOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKnB5dGhvblsgXFx0XSo6KVtcXHNcXFNdKz8oPz1eZW5kXFxiKS9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAnbGFuZ3VhZ2UtcHl0aG9uJyxcblx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5weXRob25cblx0fSxcblxuXG5cdCdjb21tYW5kJzoge1xuXHRcdHBhdHRlcm46IC8oXlsgXFx0XSooPzpcXC5bIFxcdF0rKT8oPzooPzpiYXllc3xib290c3RyYXB8Ynl8Ynlzb3J0fGNhcHR1cmV8Y29sbGVjdHxmbW18ZnB8ZnJhbWV8amFja2tuaWZlfG1mcHxtaXxuZXN0cmVnfG5vaXNpbHl8cGVybXV0ZXxxdWlldGx5fHJvbGxpbmd8c2ltdWxhdGV8c3RhdHNieXxzdGVwd2lzZXxzdnl8dmVyc2lvbnx4aSlcXGJbXjpcXHJcXG5dKjpbIFxcdF0qfCg/OmNhcHR1cmV8bm9pc2lseXxxdWlldGx5fHZlcnNpb24pWyBcXHRdKyk/KVthLXpBLVpdXFx3Ki9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J3ZhcmlhYmxlJzogL1xcJFxcdyt8W1x1MjAxOGAnXVxcd1teXHUyMDE5YCdcXHJcXG5dKltcdTIwMTlgJ10vLFxuXHQna2V5d29yZCc6IC9cXGIoPzpiYXllc3xib290c3RyYXB8Ynl8Ynlzb3J0fGNhcHR1cmV8Y2xlYXJ8Y29sbGVjdHxmbW18ZnB8ZnJhbWV8aWZ8aW58amFja2tuaWZlfG1pWyBcXHRdK2VzdGltYXRlfG1mcHxuZXN0cmVnfG5vaXNpbHl8b2Z8cGVybXV0ZXxxdWlldGx5fHJvbGxpbmd8c2ltdWxhdGV8c29ydHxzdGF0c2J5fHN0ZXB3aXNlfHN2eXx2YXJsaXN0fHZlcnNpb258eGkpXFxiLyxcblxuXG5cdCdib29sZWFuJzogL1xcYig/Om9mZnxvbilcXGIvLFxuXHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQrKT9cXGJ8XFxCXFwuXFxkKy8sXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFwoKS9pLFxuXG5cdCdvcGVyYXRvcic6IC9cXCtcXCt8LS18IyM/fFs8PiE9fl09P3xbK1xcLSpeJnwvXS8sXG5cdCdwdW5jdHVhdGlvbic6IC9bKCl7fVtcXF0sOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuc3RhdGFbJ3N0cmluZy1saXRlcmFsJ10uaW5zaWRlLmludGVycG9sYXRpb24uaW5zaWRlLmV4cHJlc3Npb24uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLnN0YXRhO1xuXG5QcmlzbS5sYW5ndWFnZXMuaWVjc3QgPSB7XG5cdCdjb21tZW50JzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OlxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCl8XFwoXFwqW1xcc1xcU10qPyg/OlxcKlxcKXwkKXxcXHtbXFxzXFxTXSo/KD86XFx9fCQpKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXDpdKVxcL1xcLy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0fSxcblx0XSxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCg/IVxcMSlbXlxcXFxcXHJcXG5dKSpcXDEvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0fSxcblx0J2tleXdvcmQnOiBbXG5cdFx0L1xcYig/OkVORF8pPyg/OlBST0dSQU18Q09ORklHVVJBVElPTnxJTlRFUkZBQ0V8RlVOQ1RJT05fQkxPQ0t8RlVOQ1RJT058QUNUSU9OfFRSQU5TSVRJT058VFlQRXxTVFJVQ1R8KD86SU5JVElBTF8pP1NURVB8TkFNRVNQQUNFfExJQlJBUll8Q0hBTk5FTHxGT0xERVJ8UkVTT1VSQ0V8VkFSXyg/OkFDQ0VTU3xDT05GSUd8RVhURVJOQUx8R0xPQkFMfElOUFVUfElOX09VVHxPVVRQVVR8VEVNUCl8VkFSfE1FVEhPRHxQUk9QRVJUWSlcXGIvaSxcblx0XHQvXFxiKD86QVR8Qll8KD86RU5EXyk/KD86Q0FTRXxGT1J8SUZ8UkVQRUFUfFdISUxFKXxDT05TVEFOVHxDT05USU5VRXxET3xFTFNFfEVMU0lGfEVYSVR8RVhURU5EU3xGUk9NfEdFVHxHT1RPfElNUExFTUVOVFN8Sk1QfE5PTl9SRVRBSU58T0Z8UFJJVkFURXxQUk9URUNURUR8UFVCTElDfFJFVEFJTnxSRVRVUk58U0VUfFRBU0t8VEhFTnxUT3xVTlRJTHxVU0lOR3xXSVRIfF9fQ0FUQ0h8X19FTkRUUll8X19GSU5BTExZfF9fVFJZKVxcYi9cblx0XSxcblx0J2NsYXNzLW5hbWUnOiAvXFxiKD86QU5ZfEFSUkFZfEJPT0x8QllURXxVPyg/OkR8THxTKT9JTlR8KD86RHxMKT9XT1JEfERBVEUoPzpfQU5EX1RJTUUpP3xEVHxMP1JFQUx8UE9JTlRFUnxTVFJJTkd8VElNRSg/Ol9PRl9EQVkpP3xUT0QpXFxiLyxcblx0J2FkZHJlc3MnOiB7XG5cdFx0cGF0dGVybjogLyVbSVFNXVtYQldETF1bXFxkLl0qfCVbSVFdW1xcZC5dKi8sXG5cdFx0YWxpYXM6ICdzeW1ib2wnXG5cdH0sXG5cdCdudW1iZXInOiAvXFxiKD86MTYjW1xcZGEtZl0rfDIjWzAxX10rfDB4W1xcZGEtZl0rKVxcYnxcXGIoPzpEfERUfFR8VE9EKSNbXFxkX3NobWQ6XSp8XFxiW0EtWl0qI1tcXGQuLF9dKnwoPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/L2ksXG5cdCdib29sZWFuJzogL1xcYig/OkZBTFNFfE5VTEx8VFJVRSlcXGIvLFxuXHQnb3BlcmF0b3InOiAvUz9SPzo/PT4/fCYmP3xcXCpcXCo/fDxbPT5dP3w+PT98Wy06Xi8rI118XFxiKD86QU5EfEVRfEVYUFR8R0V8R1R8TEV8TFR8TU9EfE5FfE5PVHxPUnxYT1IpXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXHQncHVuY3R1YXRpb24nOiAvWygpW1xcXS4sO10vLFxufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHR2YXIgdW5pdCA9IHtcblx0XHRwYXR0ZXJuOiAvKFxcYlxcZCspKD86JXxbYS16XSspLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH07XG5cdC8vIDEyMyAtMTIzIC4xMjMgLS4xMjMgMTIuMyAtMTIuM1xuXHR2YXIgbnVtYmVyID0ge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcdy4tXSktPyg/OlxcZCsoPzpcXC5cXGQrKT98XFwuXFxkKykvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fTtcblxuXHR2YXIgaW5zaWRlID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86XFwvXFwqW1xcc1xcU10qP1xcKlxcL3xcXC9cXC8uKikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J3VybCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJ1cmxcXCgoW1wiJ10/KS4qP1xcMVxcKS9pLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLyhcInwnKSg/Oig/IVxcMSlbXlxcXFxcXHJcXG5dfFxcXFwoPzpcXHJcXG58W1xcc1xcU10pKSpcXDEvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnaW50ZXJwb2xhdGlvbic6IG51bGwsIC8vIFNlZSBiZWxvd1xuXHRcdCdmdW5jJzogbnVsbCwgLy8gU2VlIGJlbG93XG5cdFx0J2ltcG9ydGFudCc6IC9cXEIhKD86aW1wb3J0YW50fG9wdGlvbmFsKVxcYi9pLFxuXHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFxccyspKD86KD86ZWxzZXxmb3J8aWZ8cmV0dXJufHVubGVzcykoPz1cXHN8JCl8QFtcXHctXSspLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdoZXhjb2RlJzogLyNbXFxkYS1mXXszLDZ9L2ksXG5cdFx0J2NvbG9yJzogW1xuXHRcdFx0L1xcYig/OkFsaWNlQmx1ZXxBbnRpcXVlV2hpdGV8QXF1YXxBcXVhbWFyaW5lfEF6dXJlfEJlaWdlfEJpc3F1ZXxCbGFja3xCbGFuY2hlZEFsbW9uZHxCbHVlfEJsdWVWaW9sZXR8QnJvd258QnVybHlXb29kfENhZGV0Qmx1ZXxDaGFydHJldXNlfENob2NvbGF0ZXxDb3JhbHxDb3JuZmxvd2VyQmx1ZXxDb3Juc2lsa3xDcmltc29ufEN5YW58RGFya0JsdWV8RGFya0N5YW58RGFya0dvbGRlblJvZHxEYXJrR3JbYWVdeXxEYXJrR3JlZW58RGFya0toYWtpfERhcmtNYWdlbnRhfERhcmtPbGl2ZUdyZWVufERhcmtPcmFuZ2V8RGFya09yY2hpZHxEYXJrUmVkfERhcmtTYWxtb258RGFya1NlYUdyZWVufERhcmtTbGF0ZUJsdWV8RGFya1NsYXRlR3JbYWVdeXxEYXJrVHVycXVvaXNlfERhcmtWaW9sZXR8RGVlcFBpbmt8RGVlcFNreUJsdWV8RGltR3JbYWVdeXxEb2RnZXJCbHVlfEZpcmVCcmlja3xGbG9yYWxXaGl0ZXxGb3Jlc3RHcmVlbnxGdWNoc2lhfEdhaW5zYm9yb3xHaG9zdFdoaXRlfEdvbGR8R29sZGVuUm9kfEdyW2FlXXl8R3JlZW58R3JlZW5ZZWxsb3d8SG9uZXlEZXd8SG90UGlua3xJbmRpYW5SZWR8SW5kaWdvfEl2b3J5fEtoYWtpfExhdmVuZGVyfExhdmVuZGVyQmx1c2h8TGF3bkdyZWVufExlbW9uQ2hpZmZvbnxMaWdodEJsdWV8TGlnaHRDb3JhbHxMaWdodEN5YW58TGlnaHRHb2xkZW5Sb2RZZWxsb3d8TGlnaHRHclthZV15fExpZ2h0R3JlZW58TGlnaHRQaW5rfExpZ2h0U2FsbW9ufExpZ2h0U2VhR3JlZW58TGlnaHRTa3lCbHVlfExpZ2h0U2xhdGVHclthZV15fExpZ2h0U3RlZWxCbHVlfExpZ2h0WWVsbG93fExpbWV8TGltZUdyZWVufExpbmVufE1hZ2VudGF8TWFyb29ufE1lZGl1bUFxdWFNYXJpbmV8TWVkaXVtQmx1ZXxNZWRpdW1PcmNoaWR8TWVkaXVtUHVycGxlfE1lZGl1bVNlYUdyZWVufE1lZGl1bVNsYXRlQmx1ZXxNZWRpdW1TcHJpbmdHcmVlbnxNZWRpdW1UdXJxdW9pc2V8TWVkaXVtVmlvbGV0UmVkfE1pZG5pZ2h0Qmx1ZXxNaW50Q3JlYW18TWlzdHlSb3NlfE1vY2Nhc2lufE5hdmFqb1doaXRlfE5hdnl8T2xkTGFjZXxPbGl2ZXxPbGl2ZURyYWJ8T3JhbmdlfE9yYW5nZVJlZHxPcmNoaWR8UGFsZUdvbGRlblJvZHxQYWxlR3JlZW58UGFsZVR1cnF1b2lzZXxQYWxlVmlvbGV0UmVkfFBhcGF5YVdoaXB8UGVhY2hQdWZmfFBlcnV8UGlua3xQbHVtfFBvd2RlckJsdWV8UHVycGxlfFJlZHxSb3N5QnJvd258Um95YWxCbHVlfFNhZGRsZUJyb3dufFNhbG1vbnxTYW5keUJyb3dufFNlYUdyZWVufFNlYVNoZWxsfFNpZW5uYXxTaWx2ZXJ8U2t5Qmx1ZXxTbGF0ZUJsdWV8U2xhdGVHclthZV15fFNub3d8U3ByaW5nR3JlZW58U3RlZWxCbHVlfFRhbnxUZWFsfFRoaXN0bGV8VG9tYXRvfFRyYW5zcGFyZW50fFR1cnF1b2lzZXxWaW9sZXR8V2hlYXR8V2hpdGV8V2hpdGVTbW9rZXxZZWxsb3d8WWVsbG93R3JlZW4pXFxiL2ksXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC9cXGIoPzpoc2x8cmdiKVxcKFxccypcXGR7MSwzfVxccyosXFxzKlxcZHsxLDN9JT9cXHMqLFxccypcXGR7MSwzfSU/XFxzKlxcKVxcQnxcXGIoPzpoc2x8cmdiKWFcXChcXHMqXFxkezEsM31cXHMqLFxccypcXGR7MSwzfSU/XFxzKixcXHMqXFxkezEsM30lP1xccyosXFxzKig/OjB8MD9cXC5cXGQrfDEpXFxzKlxcKVxcQi9pLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQndW5pdCc6IHVuaXQsXG5cdFx0XHRcdFx0J251bWJlcic6IG51bWJlcixcblx0XHRcdFx0XHQnZnVuY3Rpb24nOiAvW1xcdy1dKyg/PVxcKCkvLFxuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCksXS9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2VudGl0eSc6IC9cXFxcW1xcZGEtZl17MSw4fS9pLFxuXHRcdCd1bml0JzogdW5pdCxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0J29wZXJhdG9yJzogW1xuXHRcdFx0Ly8gV2Ugd2FudCBub24td29yZCBjaGFycyBhcm91bmQgXCItXCIgYmVjYXVzZSBpdCBpc1xuXHRcdFx0Ly8gYWNjZXB0ZWQgaW4gcHJvcGVydHkgbmFtZXMuXG5cdFx0XHQvfnxbKyFcXC8lPD4/PV09P3xbLTpdPXxcXCpbKj1dP3xcXC57MiwzfXwmJnxcXHxcXHx8XFxCLVxcQnxcXGIoPzphbmR8aW58aXMoPzogYXwgZGVmaW5lZHwgbm90fG50KT98bm90fG9yKVxcYi9cblx0XHRdLFxuXHRcdCdudW1iZXInOiBudW1iZXIsXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t7fSgpXFxbXFxdOzosXS9cblx0fTtcblxuXHRpbnNpZGVbJ2ludGVycG9sYXRpb24nXSA9IHtcblx0XHRwYXR0ZXJuOiAvXFx7W15cXHJcXG59Ol0rXFx9Lyxcblx0XHRhbGlhczogJ3ZhcmlhYmxlJyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdkZWxpbWl0ZXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eXFx7fFxcfSQvLFxuXHRcdFx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHRcdFx0fSxcblx0XHRcdHJlc3Q6IGluc2lkZVxuXHRcdH1cblx0fTtcblx0aW5zaWRlWydmdW5jJ10gPSB7XG5cdFx0cGF0dGVybjogL1tcXHctXStcXChbXildKlxcKS4qLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdmdW5jdGlvbic6IC9eW14oXSsvLFxuXHRcdFx0cmVzdDogaW5zaWRlXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5zdHlsdXMgPSB7XG5cdFx0J2F0cnVsZS1kZWNsYXJhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXlsgXFx0XSopQC4rL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdhdHJ1bGUnOiAvXkBbXFx3LV0rLyxcblx0XHRcdFx0cmVzdDogaW5zaWRlXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQndmFyaWFibGUtZGVjbGFyYXRpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKVtcXHckLV0rXFxzKi4/PVsgXFx0XSooPzpcXHtbXnt9XSpcXH18XFxTLip8JCkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3ZhcmlhYmxlJzogL15cXFMrLyxcblx0XHRcdFx0cmVzdDogaW5zaWRlXG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdCdzdGF0ZW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bIFxcdF0qKSg/OmVsc2V8Zm9yfGlmfHJldHVybnx1bmxlc3MpWyBcXHRdLisvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2tleXdvcmQnOiAvXlxcUysvLFxuXHRcdFx0XHRyZXN0OiBpbnNpZGVcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQSBwcm9wZXJ0eS92YWx1ZSBwYWlyIGNhbm5vdCBlbmQgd2l0aCBhIGNvbW1hIG9yIGEgYnJhY2Vcblx0XHQvLyBJdCBjYW5ub3QgaGF2ZSBpbmRlbnRlZCBjb250ZW50IHVubGVzcyBpdCBlbmRlZCB3aXRoIGEgc2VtaWNvbG9uXG5cdFx0J3Byb3BlcnR5LWRlY2xhcmF0aW9uJzoge1xuXHRcdFx0cGF0dGVybjogLygoPzpefFxceykoWyBcXHRdKikpKD86W1xcdy1dfFxce1tefVxcclxcbl0rXFx9KSsoPzpcXHMqOlxccyp8WyBcXHRdKykoPyFcXHMpW157XFxyXFxuXSooPzo7fFtee1xcclxcbixdJCg/ISg/Olxccj9cXG58XFxyKSg/Olxce3xcXDJbIFxcdF0pKSkvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3Byb3BlcnR5Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eW15cXHM6XSsvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J2ludGVycG9sYXRpb24nOiBpbnNpZGUuaW50ZXJwb2xhdGlvblxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblx0XHRcdFx0cmVzdDogaW5zaWRlXG5cdFx0XHR9XG5cdFx0fSxcblxuXG5cdFx0Ly8gQSBzZWxlY3RvciBjYW4gY29udGFpbiBwYXJlbnRoZXNlcyBvbmx5IGFzIHBhcnQgb2YgYSBwc2V1ZG8tZWxlbWVudFxuXHRcdC8vIEl0IGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzLlxuXHRcdC8vIEl0IG11c3QgZW5kIHdpdGggYSBjb21tYSBvciBhbiBhY2NvbGFkZSBvciBoYXZlIGluZGVudGVkIGNvbnRlbnQuXG5cdFx0J3NlbGVjdG9yJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKikoPzooPz1cXFMpKD86W157fVxcclxcbjooKV18Ojo/W1xcdy1dKyg/OlxcKFteKVxcclxcbl0qXFwpfCg/IVtcXHctXSkpfFxce1tefVxcclxcbl0rXFx9KSspKD86KD86XFxyP1xcbnxcXHIpKD86XFwxKD86KD89XFxTKSg/Oltee31cXHJcXG46KCldfDo6P1tcXHctXSsoPzpcXChbXilcXHJcXG5dKlxcKXwoPyFbXFx3LV0pKXxcXHtbXn1cXHJcXG5dK1xcfSkrKSkpKig/OiwkfFxce3woPz0oPzpcXHI/XFxufFxccikoPzpcXHt8XFwxWyBcXHRdKSkpL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzogaW5zaWRlLmludGVycG9sYXRpb24sXG5cdFx0XHRcdCdjb21tZW50JzogaW5zaWRlLmNvbW1lbnQsXG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9be30sXS9cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J2Z1bmMnOiBpbnNpZGUuZnVuYyxcblx0XHQnc3RyaW5nJzogaW5zaWRlLnN0cmluZyxcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSg/OlxcL1xcKltcXHNcXFNdKj9cXCpcXC98XFwvXFwvLiopLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdpbnRlcnBvbGF0aW9uJzogaW5zaWRlLmludGVycG9sYXRpb24sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1t7fSgpXFxbXFxdOzouXS9cblx0fTtcbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnN1cGVyY29sbGlkZXIgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXC8uKnxcXC9cXCooPzpbXiovXXxcXCooPyFcXC8pfFxcLyg/IVxcKil8XFwvXFwqKD86W14qXXxcXCooPyFcXC8pKSpcXCpcXC8pKlxcKlxcLy8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogLyhefFteXFxcXF0pXCIoPzpbXlwiXFxcXF18XFxcXFtcXHNcXFNdKSpcIi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NoYXInOiB7XG5cdFx0cGF0dGVybjogL1xcJCg/OlteXFxcXFxcclxcbl18XFxcXC4pLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J3N5bWJvbCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSknKD86W14nXFxcXF18XFxcXFtcXHNcXFNdKSonfFxcXFxcXHcrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXG5cdCdrZXl3b3JkJzogL1xcYig/Ol98YXJnfGNsYXNzdmFyfGNvbnN0fG5pbHx2YXJ8d2hpbGUpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXG5cdCdsYWJlbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiW2Etel9dXFx3Kig/PVxccyo6KS8sXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblxuXHQnbnVtYmVyJzogL1xcYig/OmluZnxwaXwweFswLTlhLWZBLUZdK3xcXGQrKD86XFwuXFxkKyk/KD86W2VFXVsrLV0/XFxkKyk/KD86cGkpP3xcXGQrclswLTlhLXpBLVpdKyg/OlxcLlswLTlhLXpBLVpdKyk/fFxcZCtbc2JdezEsNH1cXGQqKVxcYi8sXG5cdCdjbGFzcy1uYW1lJzogL1xcYltBLVpdXFx3KlxcYi8sXG5cblx0J29wZXJhdG9yJzogL1xcLnsyLDN9fCMoPyFbW3tdKXwmJnxbIT1dPT0/fFxcKz4+fFxcK3sxLDN9fC1bLT5dfD0+fD4+fFxcP1xcP3xAXFx8P0B8XFx8KD86QHxbIT1dPSk/XFx8fCFcXD98PFshPT5dfFxcKnsxLDJ9fDx7MiwzfVxcKj98Wy0hJSYvPD4/QHw9YF0vLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9KClbXFxdLjosO118I1tbe10vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMuc2NsYW5nID0gUHJpc20ubGFuZ3VhZ2VzLnN1cGVyY29sbGlkZXI7XG5cblByaXNtLmxhbmd1YWdlcy5zd2lmdCA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0Ly8gTmVzdGVkIGNvbW1lbnRzIGFyZSBzdXBwb3J0ZWQgdXAgdG8gMiBsZXZlbHNcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcOl0pKD86XFwvXFwvLip8XFwvXFwqKD86W14vKl18XFwvKD8hXFwqKXxcXCooPyFcXC8pfFxcL1xcKig/OlteKl18XFwqKD8hXFwvKSkqXFwqXFwvKSpcXCpcXC8pLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nLWxpdGVyYWwnOiBbXG5cdFx0Ly8gaHR0cHM6Ly9kb2NzLnN3aWZ0Lm9yZy9zd2lmdC1ib29rL0xhbmd1YWdlR3VpZGUvU3RyaW5nc0FuZENoYXJhY3RlcnMuaHRtbFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0LyhefFteXCIjXSkvLnNvdXJjZVxuXHRcdFx0XHQrICcoPzonXG5cdFx0XHRcdC8vIHNpbmdsZS1saW5lIHN0cmluZ1xuXHRcdFx0XHQrIC9cIig/OlxcXFwoPzpcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKXxcXHJcXG58W14oXSl8W15cXFxcXFxyXFxuXCJdKSpcIi8uc291cmNlXG5cdFx0XHRcdCsgJ3wnXG5cdFx0XHRcdC8vIG11bHRpLWxpbmUgc3RyaW5nXG5cdFx0XHRcdCsgL1wiXCJcIig/OlxcXFwoPzpcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKXxbXihdKXxbXlxcXFxcIl18XCIoPyFcIlwiKSkqXCJcIlwiLy5zb3VyY2Vcblx0XHRcdFx0KyAnKSdcblx0XHRcdFx0KyAvKD8hW1wiI10pLy5zb3VyY2Vcblx0XHRcdCksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXFxcXFxcKCkoPzpbXigpXXxcXChbXigpXSpcXCkpKig/PVxcKSkvLFxuXHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0aW5zaWRlOiBudWxsIC8vIHNlZSBiZWxvd1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcKXxcXFxcXFwoJC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcXFwoPz1bXFxyXFxuXSkvLFxuXHRcdFx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdFx0LyhefFteXCIjXSkoIyspLy5zb3VyY2Vcblx0XHRcdFx0KyAnKD86J1xuXHRcdFx0XHQvLyBzaW5nbGUtbGluZSBzdHJpbmdcblx0XHRcdFx0KyAvXCIoPzpcXFxcKD86IytcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKXxcXHJcXG58W14jXSl8W15cXFxcXFxyXFxuXSkqP1wiLy5zb3VyY2Vcblx0XHRcdFx0KyAnfCdcblx0XHRcdFx0Ly8gbXVsdGktbGluZSBzdHJpbmdcblx0XHRcdFx0KyAvXCJcIlwiKD86XFxcXCg/OiMrXFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCl8W14jXSl8W15cXFxcXSkqP1wiXCJcIi8uc291cmNlXG5cdFx0XHRcdCsgJyknXG5cdFx0XHRcdCsgJ1xcXFwyJ1xuXHRcdFx0KSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyhcXFxcIytcXCgpKD86W14oKV18XFwoW14oKV0qXFwpKSooPz1cXCkpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdFx0fSxcblx0XHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXCl8XFxcXCMrXFwoJC8sXG5cdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0fSxcblx0XHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0XHR9XG5cdFx0fSxcblx0XSxcblxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdC8vIGRpcmVjdGl2ZXMgd2l0aCBjb25kaXRpb25zXG5cdFx0cGF0dGVybjogUmVnRXhwKFxuXHRcdFx0LyMvLnNvdXJjZVxuXHRcdFx0KyAnKD86J1xuXHRcdFx0KyAoXG5cdFx0XHRcdC8oPzplbHNlaWZ8aWYpXFxiLy5zb3VyY2Vcblx0XHRcdFx0KyAnKD86WyBcXHRdKidcblx0XHRcdFx0Ly8gVGhpcyByZWdleCBpcyBhIGxpdHRsZSBjb21wbGV4LiBJdCdzIGVxdWl2YWxlbnQgdG8gdGhpczpcblx0XHRcdFx0Ly8gICAoPzohWyBcXHRdKik/KD86XFxiXFx3K1xcYig/OlsgXFx0XSo8cm91bmQ+KT98PHJvdW5kPikoPzpbIFxcdF0qKD86JiZ8XFx8XFx8KSk/XG5cdFx0XHRcdC8vIHdoZXJlIDxyb3VuZD4gaXMgYSBnZW5lcmFsIHBhcmVudGhlc2VzIGV4cHJlc3Npb24uXG5cdFx0XHRcdCsgLyg/OiFbIFxcdF0qKT8oPzpcXGJcXHcrXFxiKD86WyBcXHRdKlxcKCg/OlteKCldfFxcKFteKCldKlxcKSkqXFwpKT98XFwoKD86W14oKV18XFwoW14oKV0qXFwpKSpcXCkpKD86WyBcXHRdKig/OiYmfFxcfFxcfCkpPy8uc291cmNlXG5cdFx0XHRcdCsgJykrJ1xuXHRcdFx0KVxuXHRcdFx0KyAnfCdcblx0XHRcdCsgLyg/OmVsc2V8ZW5kaWYpXFxiLy5zb3VyY2Vcblx0XHRcdCsgJyknXG5cdFx0KSxcblx0XHRhbGlhczogJ3Byb3BlcnR5Jyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdkaXJlY3RpdmUtbmFtZSc6IC9eI1xcdysvLFxuXHRcdFx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8dHJ1ZSlcXGIvLFxuXHRcdFx0J251bWJlcic6IC9cXGJcXGQrKD86XFwuXFxkKykqXFxiLyxcblx0XHRcdCdvcGVyYXRvcic6IC8hfCYmfFxcfFxcfHxbPD5dPT8vLFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL1soKSxdL1xuXHRcdH1cblx0fSxcblx0J2xpdGVyYWwnOiB7XG5cdFx0cGF0dGVybjogLyMoPzpjb2xvckxpdGVyYWx8Y29sdW1ufGRzb2hhbmRsZXxmaWxlKD86SUR8TGl0ZXJhbHxQYXRoKT98ZnVuY3Rpb258aW1hZ2VMaXRlcmFsfGxpbmUpXFxiLyxcblx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHR9LFxuXHQnb3RoZXItZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC8jXFx3K1xcYi8sXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblxuXHQnYXR0cmlidXRlJzoge1xuXHRcdHBhdHRlcm46IC9AXFx3Ky8sXG5cdFx0YWxpYXM6ICdhdHJ1bGUnXG5cdH0sXG5cblx0J2Z1bmN0aW9uLWRlZmluaXRpb24nOiB7XG5cdFx0cGF0dGVybjogLyhcXGJmdW5jXFxzKylcXHcrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdH0sXG5cdCdsYWJlbCc6IHtcblx0XHQvLyBodHRwczovL2RvY3Muc3dpZnQub3JnL3N3aWZ0LWJvb2svTGFuZ3VhZ2VHdWlkZS9Db250cm9sRmxvdy5odG1sI0lEMTQxXG5cdFx0cGF0dGVybjogL1xcYihicmVha3xjb250aW51ZSlcXHMrXFx3K3xcXGJbYS16QS1aX11cXHcqKD89XFxzKjpcXHMqKD86Zm9yfHJlcGVhdHx3aGlsZSlcXGIpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHR9LFxuXG5cdCdrZXl3b3JkJzogL1xcYig/OkFueXxQcm90b2NvbHxTZWxmfFR5cGV8YWN0b3J8YXN8YXNzaWdubWVudHxhc3NvY2lhdGVkdHlwZXxhc3NvY2lhdGl2aXR5fGFzeW5jfGF3YWl0fGJyZWFrfGNhc2V8Y2F0Y2h8Y2xhc3N8Y29udGludWV8Y29udmVuaWVuY2V8ZGVmYXVsdHxkZWZlcnxkZWluaXR8ZGlkU2V0fGRvfGR5bmFtaWN8ZWxzZXxlbnVtfGV4dGVuc2lvbnxmYWxsdGhyb3VnaHxmaWxlcHJpdmF0ZXxmaW5hbHxmb3J8ZnVuY3xnZXR8Z3VhcmR8aGlnaGVyVGhhbnxpZnxpbXBvcnR8aW58aW5kaXJlY3R8aW5maXh8aW5pdHxpbm91dHxpbnRlcm5hbHxpc3xpc29sYXRlZHxsYXp5fGxlZnR8bGV0fGxvd2VyVGhhbnxtdXRhdGluZ3xub25lfG5vbmlzb2xhdGVkfG5vbm11dGF0aW5nfG9wZW58b3BlcmF0b3J8b3B0aW9uYWx8b3ZlcnJpZGV8cG9zdGZpeHxwcmVjZWRlbmNlZ3JvdXB8cHJlZml4fHByaXZhdGV8cHJvdG9jb2x8cHVibGljfHJlcGVhdHxyZXF1aXJlZHxyZXRocm93c3xyZXR1cm58cmlnaHR8c2FmZXxzZWxmfHNldHxzb21lfHN0YXRpY3xzdHJ1Y3R8c3Vic2NyaXB0fHN1cGVyfHN3aXRjaHx0aHJvd3x0aHJvd3N8dHJ5fHR5cGVhbGlhc3x1bm93bmVkfHVuc2FmZXx2YXJ8d2Vha3x3aGVyZXx3aGlsZXx3aWxsU2V0KVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J25pbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxibmlsXFxiLyxcblx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHR9LFxuXG5cdCdzaG9ydC1hcmd1bWVudCc6IC9cXCRcXGQrXFxiLyxcblx0J29taXQnOiB7XG5cdFx0cGF0dGVybjogL1xcYl9cXGIvLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J251bWJlcic6IC9cXGIoPzpbXFxkX10rKD86XFwuW1xcZGVfXSspP3wweFthLWYwLTlfXSsoPzpcXC5bYS1mMC05cF9dKyk/fDBiWzAxX10rfDBvWzAtN19dKylcXGIvaSxcblxuXHQvLyBBIGNsYXNzIG5hbWUgbXVzdCBzdGFydCB3aXRoIGFuIHVwcGVyLWNhc2UgbGV0dGVyIGFuZCBiZSBlaXRoZXIgMSBsZXR0ZXIgbG9uZyBvciBjb250YWluIGEgbG93ZXItY2FzZSBsZXR0ZXIuXG5cdCdjbGFzcy1uYW1lJzogL1xcYltBLVpdKD86W0EtWl9cXGRdKlthLXpdXFx3Kik/XFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqXFwoKS9pLFxuXHQnY29uc3RhbnQnOiAvXFxiKD86W0EtWl9dezIsfXxrW0EtWl1bQS1aYS16X10rKVxcYi8sXG5cblx0Ly8gT3BlcmF0b3JzIGFyZSBnZW5lcmljIGluIFN3aWZ0LiBEZXZlbG9wZXJzIGNhbiBldmVuIGNyZWF0ZSBuZXcgb3BlcmF0b3JzIChlLmcuICsrKykuXG5cdC8vIGh0dHBzOi8vZG9jcy5zd2lmdC5vcmcvc3dpZnQtYm9vay9SZWZlcmVuY2VNYW51YWwvenpTdW1tYXJ5T2ZUaGVHcmFtbWFyLmh0bWwjSUQ0ODFcblx0Ly8gVGhpcyByZWdleCBvbmx5IHN1cHBvcnRzIEFTQ0lJIG9wZXJhdG9ycy5cblx0J29wZXJhdG9yJzogL1stKyovJT0hPD4mfF5+P10rfFxcLlsuXFwtKyovJT0hPD4mfF5+P10rLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF0oKTssLjpcXFxcXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5zd2lmdFsnc3RyaW5nLWxpdGVyYWwnXS5mb3JFYWNoKGZ1bmN0aW9uIChydWxlKSB7XG5cdHJ1bGUuaW5zaWRlWydpbnRlcnBvbGF0aW9uJ10uaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLnN3aWZ0O1xufSk7XG5cbi8vIGh0dHBzOi8vd3d3LmZyZWVkZXNrdG9wLm9yZy9zb2Z0d2FyZS9zeXN0ZW1kL21hbi9zeXN0ZW1kLnN5bnRheC5odG1sXG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgY29tbWVudCA9IHtcblx0XHRwYXR0ZXJuOiAvXls7I10uKi9tLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9O1xuXG5cdHZhciBxdW90ZXNTb3VyY2UgPSAvXCIoPzpbXlxcclxcblwiXFxcXF18XFxcXCg/OlteXFxyXXxcXHJcXG4/KSkqXCIoPyFcXFMpLy5zb3VyY2U7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnN5c3RlbWQgPSB7XG5cdFx0J2NvbW1lbnQnOiBjb21tZW50LFxuXG5cdFx0J3NlY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXlxcW1teXFxuXFxyXFxbXFxdXSpcXF0oPz1bIFxcdF0qJCkvbSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXlxcW3xcXF0kLyxcblx0XHRcdFx0J3NlY3Rpb24tbmFtZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRhbGlhczogJ3NlbGVjdG9yJ1xuXHRcdFx0XHR9LFxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQna2V5Jzoge1xuXHRcdFx0cGF0dGVybjogL15bXlxccz1dKyg/PVsgXFx0XSo9KS9tLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdhdHRyLW5hbWUnXG5cdFx0fSxcblx0XHQndmFsdWUnOiB7XG5cdFx0XHQvLyBUaGlzIHBhdHRlcm4gaXMgcXVpdGUgY29tcGxleCBiZWNhdXNlIG9mIHR3byBwcm9wZXJ0aWVzOlxuXHRcdFx0Ly8gIDEpIFF1b3RlcyAoc3RyaW5ncykgbXVzdCBiZSBwcmVjZWRlZCBieSBhIHNwYWNlLiBTaW5jZSB3ZSBjYW4ndCB1c2UgbG9va2JlaGluZHMsIHdlIGhhdmUgdG8gXCJyZXNvbHZlXCJcblx0XHRcdC8vICAgICB0aGUgbG9va2JlaGluZC4gWW91IHdpbGwgc2VlIHRoaXMgaW4gdGhlIG1haW4gbG9vcCB3aGVyZSBzcGFjZXMgYXJlIGhhbmRsZWQgc2VwYXJhdGVseS5cblx0XHRcdC8vICAyKSBMaW5lIGNvbnRpbnVhdGlvbnMuXG5cdFx0XHQvLyAgICAgQWZ0ZXIgbGluZSBjb250aW51YXRpb25zLCBlbXB0eSBsaW5lcyBhbmQgY29tbWVudHMgYXJlIGlnbm9yZWQgc28gd2UgaGF2ZSB0byBjb25zdW1lIHRoZW0uXG5cdFx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHRcdC8oPVsgXFx0XSooPyFcXHMpKS8uc291cmNlICtcblx0XHRcdFx0Ly8gdGhlIHZhbHVlIGVpdGhlciBzdGFydHMgd2l0aCBxdW90ZXMgb3Igbm90XG5cdFx0XHRcdCcoPzonICsgcXVvdGVzU291cmNlICsgJ3woPz1bXlwiXFxyXFxuXSkpJyArXG5cdFx0XHRcdC8vIG1haW4gbG9vcFxuXHRcdFx0XHQnKD86JyArIChcblx0XHRcdFx0XHQvW15cXHNcXFxcXS8uc291cmNlICtcblx0XHRcdFx0XHQvLyBoYW5kbGUgc3BhY2VzIHNlcGFyYXRlbHkgYmVjYXVzZSBvZiBxdW90ZXNcblx0XHRcdFx0XHQnfCcgKyAnWyBcXHRdKyg/Oig/IVsgXFx0XCJdKXwnICsgcXVvdGVzU291cmNlICsgJyknICtcblx0XHRcdFx0XHQvLyBsaW5lIGNvbnRpbnVhdGlvblxuXHRcdFx0XHRcdCd8JyArIC9cXFxcW1xcclxcbl0rKD86WyM7XS4qW1xcclxcbl0rKSooPyFbIztdKS8uc291cmNlXG5cdFx0XHRcdCkgK1xuXHRcdFx0XHQnKSonXG5cdFx0XHQpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnYXR0ci12YWx1ZScsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2NvbW1lbnQnOiBjb21tZW50LFxuXHRcdFx0XHQncXVvdGVkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKF58XFxzKS8uc291cmNlICsgcXVvdGVzU291cmNlKSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0fSxcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1xcXFwkL20sXG5cblx0XHRcdFx0J2Jvb2xlYW4nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14oPzpmYWxzZXxub3xvZmZ8b258dHJ1ZXx5ZXMpJC8sXG5cdFx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0J3B1bmN0dWF0aW9uJzogLz0vXG5cdH07XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdGZ1bmN0aW9uIGNyZWF0ZUJsb2NrKHByZWZpeCwgaW5zaWRlLCBjb250ZW50QWxpYXMpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKCc8IycgKyBwcmVmaXggKyAnW1xcXFxzXFxcXFNdKj8jPicpLFxuXHRcdFx0YWxpYXM6ICdibG9jaycsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoJ148IycgKyBwcmVmaXggKyAnfCM+JCcpLFxuXHRcdFx0XHRcdGFsaWFzOiAnaW1wb3J0YW50J1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnY29udGVudCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRcdFx0XHRpbnNpZGU6IGluc2lkZSxcblx0XHRcdFx0XHRhbGlhczogY29udGVudEFsaWFzXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0ZnVuY3Rpb24gY3JlYXRlVDQoaW5zaWRlTGFuZykge1xuXHRcdHZhciBncmFtbWFyID0gUHJpc20ubGFuZ3VhZ2VzW2luc2lkZUxhbmddO1xuXHRcdHZhciBjbGFzc05hbWUgPSAnbGFuZ3VhZ2UtJyArIGluc2lkZUxhbmc7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0J2Jsb2NrJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvPCNbXFxzXFxTXSs/Iz4vLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQnZGlyZWN0aXZlJzogY3JlYXRlQmxvY2soJ0AnLCB7XG5cdFx0XHRcdFx0XHQnYXR0ci12YWx1ZSc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLz0oPzooXCJ8JykoPzpcXFxcW1xcc1xcU118KD8hXFwxKVteXFxcXF0pKlxcMXxbXlxccydcIj49XSspLyxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL149fF5bXCInXXxbXCInXSQvXG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQna2V5d29yZCc6IC9cXGJcXHcrKD89XFxzKS8sXG5cdFx0XHRcdFx0XHQnYXR0ci1uYW1lJzogL1xcYlxcdysvXG5cdFx0XHRcdFx0fSksXG5cdFx0XHRcdFx0J2V4cHJlc3Npb24nOiBjcmVhdGVCbG9jaygnPScsIGdyYW1tYXIsIGNsYXNzTmFtZSksXG5cdFx0XHRcdFx0J2NsYXNzLWZlYXR1cmUnOiBjcmVhdGVCbG9jaygnXFxcXCsnLCBncmFtbWFyLCBjbGFzc05hbWUpLFxuXHRcdFx0XHRcdCdzdGFuZGFyZCc6IGNyZWF0ZUJsb2NrKCcnLCBncmFtbWFyLCBjbGFzc05hbWUpXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzWyd0NC10ZW1wbGF0aW5nJ10gPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdjcmVhdGVUNCcsIHsgdmFsdWU6IGNyZWF0ZVQ0IH0pO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy50NCA9IFByaXNtLmxhbmd1YWdlc1sndDQtY3MnXSA9IFByaXNtLmxhbmd1YWdlc1sndDQtdGVtcGxhdGluZyddLmNyZWF0ZVQ0KCdjc2hhcnAnKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnZibmV0ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnYmFzaWMnLCB7XG5cdCdjb21tZW50JzogW1xuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oPzohfFJFTVxcYikuKy9pLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdrZXl3b3JkJzogL15SRU0vaVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXDpdKScuKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlwiXSlcIig/OlwiXCJ8W15cIl0pKlwiKD8hXCIpLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IC8oPzpcXGIoPzpBRERIQU5ETEVSfEFERFJFU1NPRnxBTElBU3xBTkR8QU5EQUxTT3xBU3xCRUVQfEJMT0FEfEJPT0xFQU58QlNBVkV8QllSRUZ8QllURXxCWVZBTHxDQUxMKD86IEFCU09MVVRFKT98Q0FTRXxDQVRDSHxDQk9PTHxDQllURXxDQ0hBUnxDREFURXxDREJMfENERUN8Q0hBSU58Q0hBUnxDSERJUnxDSU5UfENMQVNTfENMRUFSfENMTkd8Q0xPU0V8Q0xTfENPQkp8Q09NfENPTU1PTnxDT05TVHxDT05USU5VRXxDU0JZVEV8Q1NIT1JUfENTTkd8Q1NUUnxDVFlQRXxDVUlOVHxDVUxOR3xDVVNIT1JUfERBVEF8REFURXxERUNJTUFMfERFQ0xBUkV8REVGKD86IEZOfCBTRUd8REJMfElOVHxMTkd8U05HfFNUUil8REVGQVVMVHxERUxFR0FURXxESU18RElSRUNUQ0FTVHxET3xET1VCTEV8RUxTRXxFTFNFSUZ8RU5EfEVOVU18RU5WSVJPTnxFUkFTRXxFUlJPUnxFVkVOVHxFWElUfEZBTFNFfEZJRUxEfEZJTEVTfEZJTkFMTFl8Rk9SKD86IEVBQ0gpP3xGUklFTkR8RlVOQ1RJT058R0VUfEdFVFRZUEV8R0VUWE1MTkFNRVNQQUNFfEdMT0JBTHxHT1NVQnxHT1RPfEhBTkRMRVN8SUZ8SU1QTEVNRU5UU3xJTVBPUlRTfElOfElOSEVSSVRTfElOUFVUfElOVEVHRVJ8SU5URVJGQUNFfElPQ1RMfElTfElTTk9UfEtFWXxLSUxMfExFVHxMSUJ8TElLRXxMSU5FIElOUFVUfExPQ0FURXxMT0NLfExPTkd8TE9PUHxMU0VUfE1FfE1LRElSfE1PRHxNT0RVTEV8TVVTVElOSEVSSVR8TVVTVE9WRVJSSURFfE1ZQkFTRXxNWUNMQVNTfE5BTUV8TkFNRVNQQUNFfE5BUlJPV0lOR3xORVd8TkVYVHxOT1R8Tk9USElOR3xOT1RJTkhFUklUQUJMRXxOT1RPVkVSUklEQUJMRXxPQkpFQ1R8T0Z8T0ZGfE9OKD86IENPTXwgRVJST1J8IEtFWXwgVElNRVIpP3xPUEVOfE9QRVJBVE9SfE9QVElPTig/OiBCQVNFKT98T1BUSU9OQUx8T1J8T1JFTFNFfE9VVHxPVkVSTE9BRFN8T1ZFUlJJREFCTEV8T1ZFUlJJREVTfFBBUkFNQVJSQVl8UEFSVElBTHxQT0tFfFBSSVZBVEV8UFJPUEVSVFl8UFJPVEVDVEVEfFBVQkxJQ3xQVVR8UkFJU0VFVkVOVHxSRUFEfFJFQURPTkxZfFJFRElNfFJFTXxSRU1PVkVIQU5ETEVSfFJFU1RPUkV8UkVTVU1FfFJFVFVSTnxSTURJUnxSU0VUfFJVTnxTQllURXxTRUxFQ1QoPzogQ0FTRSk/fFNFVHxTSEFET1dTfFNIQVJFRHxTSEVMTHxTSE9SVHxTSU5HTEV8U0xFRVB8U1RBVElDfFNURVB8U1RPUHxTVFJJTkd8U1RSVUNUVVJFfFNVQnxTV0FQfFNZTkNMT0NLfFNZU1RFTXxUSEVOfFRIUk9XfFRJTUVSfFRPfFRST0ZGfFRST058VFJVRXxUUll8VFJZQ0FTVHxUWVBFfFRZUEVPRnxVSU5URUdFUnxVTE9OR3xVTkxPQ0t8VU5USUx8VVNIT1JUfFVTSU5HfFZJRVcgUFJJTlR8V0FJVHxXRU5EfFdIRU58V0hJTEV8V0lERU5JTkd8V0lUSHxXSVRIRVZFTlRTfFdSSVRFfFdSSVRFT05MWXxYT1IpfFxcQig/OiNDT05TVHwjRUxTRXwjRUxTRUlGfCNFTkR8I0lGKSkoPzpcXCR8XFxiKS9pLFxuXHQncHVuY3R1YXRpb24nOiAvWyw7Oigpe31dL1xufSk7XG5cblByaXNtLmxhbmd1YWdlc1sndDQtdmInXSA9IFByaXNtLmxhbmd1YWdlc1sndDQtdGVtcGxhdGluZyddLmNyZWF0ZVQ0KCd2Ym5ldCcpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0Ly8gaHR0cHM6Ly95YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjYy1ucy1hbmNob3ItcHJvcGVydHlcblx0Ly8gaHR0cHM6Ly95YW1sLm9yZy9zcGVjLzEuMi9zcGVjLmh0bWwjYy1ucy1hbGlhcy1ub2RlXG5cdHZhciBhbmNob3JPckFsaWFzID0gL1sqJl1bXlxcc1tcXF17fSxdKy87XG5cdC8vIGh0dHBzOi8veWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2MtbnMtdGFnLXByb3BlcnR5XG5cdHZhciB0YWcgPSAvISg/OjxbXFx3XFwtJSM7Lz86QCY9KyQsLiF+KicoKVtcXF1dKz58KD86W2EtekEtWlxcZC1dKiEpP1tcXHdcXC0lIzsvPzpAJj0rJC5+KicoKV0rKT8vO1xuXHQvLyBodHRwczovL3lhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNjLW5zLXByb3BlcnRpZXMobixjKVxuXHR2YXIgcHJvcGVydGllcyA9ICcoPzonICsgdGFnLnNvdXJjZSArICcoPzpbIFxcdF0rJyArIGFuY2hvck9yQWxpYXMuc291cmNlICsgJyk/fCdcblx0XHQrIGFuY2hvck9yQWxpYXMuc291cmNlICsgJyg/OlsgXFx0XSsnICsgdGFnLnNvdXJjZSArICcpPyknO1xuXHQvLyBodHRwczovL3lhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNucy1wbGFpbihuLGMpXG5cdC8vIFRoaXMgaXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gdGhhdCBkb2Vzbid0IHN1cHBvcnQgXCIjXCIgYW5kIG11bHRpbGluZSBrZXlzXG5cdC8vIEFsbCB0aGVzZSBsb25nIHNjYXJyeSBjaGFyYWN0ZXIgY2xhc3NlcyBhcmUgc2ltcGxpZmllZCB2ZXJzaW9ucyBvZiBZQU1MJ3MgY2hhcmFjdGVyc1xuXHR2YXIgcGxhaW5LZXkgPSAvKD86W15cXHNcXHgwMC1cXHgwOFxceDBlLVxceDFmIVwiIyUmJyosXFwtOj4/QFtcXF1ge3x9XFx4N2YtXFx4ODRcXHg4Ni1cXHg5ZlxcdWQ4MDAtXFx1ZGZmZlxcdWZmZmVcXHVmZmZmXXxbPzotXTxQTEFJTj4pKD86WyBcXHRdKig/Oig/IVsjOl0pPFBMQUlOPnw6PFBMQUlOPikpKi8uc291cmNlXG5cdFx0LnJlcGxhY2UoLzxQTEFJTj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gL1teXFxzXFx4MDAtXFx4MDhcXHgwZS1cXHgxZixbXFxde31cXHg3Zi1cXHg4NFxceDg2LVxceDlmXFx1ZDgwMC1cXHVkZmZmXFx1ZmZmZVxcdWZmZmZdLy5zb3VyY2U7IH0pO1xuXHR2YXIgc3RyaW5nID0gL1wiKD86W15cIlxcXFxcXHJcXG5dfFxcXFwuKSpcInwnKD86W14nXFxcXFxcclxcbl18XFxcXC4pKicvLnNvdXJjZTtcblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhZ3NdXG5cdCAqIEByZXR1cm5zIHtSZWdFeHB9XG5cdCAqL1xuXHRmdW5jdGlvbiBjcmVhdGVWYWx1ZVBhdHRlcm4odmFsdWUsIGZsYWdzKSB7XG5cdFx0ZmxhZ3MgPSAoZmxhZ3MgfHwgJycpLnJlcGxhY2UoL20vZywgJycpICsgJ20nOyAvLyBhZGQgbSBmbGFnXG5cdFx0dmFyIHBhdHRlcm4gPSAvKFs6XFwtLFt7XVxccyooPzpcXHM8PHByb3A+PlsgXFx0XSspPykoPzo8PHZhbHVlPj4pKD89WyBcXHRdKig/OiR8LHxcXF18XFx9fCg/OltcXHJcXG5dXFxzKik/IykpLy5zb3VyY2Vcblx0XHRcdC5yZXBsYWNlKC88PHByb3A+Pi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBwcm9wZXJ0aWVzOyB9KS5yZXBsYWNlKC88PHZhbHVlPj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0pO1xuXHRcdHJldHVybiBSZWdFeHAocGF0dGVybiwgZmxhZ3MpO1xuXHR9XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnlhbWwgPSB7XG5cdFx0J3NjYWxhcic6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFtcXC06XVxccyooPzpcXHM8PHByb3A+PlsgXFx0XSspP1t8Pl0pWyBcXHRdKig/OigoPzpcXHI/XFxufFxccilbIFxcdF0rKVxcU1teXFxyXFxuXSooPzpcXDJbXlxcclxcbl0rKSopLy5zb3VyY2Vcblx0XHRcdFx0LnJlcGxhY2UoLzw8cHJvcD4+L2csIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHByb3BlcnRpZXM7IH0pKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ3N0cmluZydcblx0XHR9LFxuXHRcdCdjb21tZW50JzogLyMuKi8sXG5cdFx0J2tleSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKCg/Ol58WzpcXC0sW3tcXHJcXG4/XSlbIFxcdF0qKD86PDxwcm9wPj5bIFxcdF0rKT8pPDxrZXk+Pig/PVxccyo6XFxzKS8uc291cmNlXG5cdFx0XHRcdC5yZXBsYWNlKC88PHByb3A+Pi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiBwcm9wZXJ0aWVzOyB9KVxuXHRcdFx0XHQucmVwbGFjZSgvPDxrZXk+Pi9nLCBmdW5jdGlvbiAoKSB7IHJldHVybiAnKD86JyArIHBsYWluS2V5ICsgJ3wnICsgc3RyaW5nICsgJyknOyB9KSksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdhdHJ1bGUnXG5cdFx0fSxcblx0XHQnZGlyZWN0aXZlJzoge1xuXHRcdFx0cGF0dGVybjogLyheWyBcXHRdKiklLisvbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2ltcG9ydGFudCdcblx0XHR9LFxuXHRcdCdkYXRldGltZSc6IHtcblx0XHRcdHBhdHRlcm46IGNyZWF0ZVZhbHVlUGF0dGVybigvXFxkezR9LVxcZFxcZD8tXFxkXFxkPyg/Olt0VF18WyBcXHRdKylcXGRcXGQ/OlxcZHsyfTpcXGR7Mn0oPzpcXC5cXGQqKT8oPzpbIFxcdF0qKD86WnxbLStdXFxkXFxkPyg/OjpcXGR7Mn0pPykpP3xcXGR7NH0tXFxkezJ9LVxcZHsyfXxcXGRcXGQ/OlxcZHsyfSg/OjpcXGR7Mn0oPzpcXC5cXGQqKT8pPy8uc291cmNlKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ251bWJlcidcblx0XHR9LFxuXHRcdCdib29sZWFuJzoge1xuXHRcdFx0cGF0dGVybjogY3JlYXRlVmFsdWVQYXR0ZXJuKC9mYWxzZXx0cnVlLy5zb3VyY2UsICdpJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0fSxcblx0XHQnbnVsbCc6IHtcblx0XHRcdHBhdHRlcm46IGNyZWF0ZVZhbHVlUGF0dGVybigvbnVsbHx+Ly5zb3VyY2UsICdpJyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdpbXBvcnRhbnQnXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogY3JlYXRlVmFsdWVQYXR0ZXJuKHN0cmluZyksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnbnVtYmVyJzoge1xuXHRcdFx0cGF0dGVybjogY3JlYXRlVmFsdWVQYXR0ZXJuKC9bKy1dPyg/OjB4W1xcZGEtZl0rfDBvWzAtN10rfCg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzplWystXT9cXGQrKT98XFwuaW5mfFxcLm5hbikvLnNvdXJjZSwgJ2knKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCd0YWcnOiB0YWcsXG5cdFx0J2ltcG9ydGFudCc6IGFuY2hvck9yQWxpYXMsXG5cdFx0J3B1bmN0dWF0aW9uJzogLy0tLXxbOltcXF17fVxcLSx8Pj9dfFxcLlxcLlxcLi9cblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMueW1sID0gUHJpc20ubGFuZ3VhZ2VzLnlhbWw7XG5cbn0oUHJpc20pKTtcblxuLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGVzdF9Bbnl0aGluZ19Qcm90b2NvbFxuXG5QcmlzbS5sYW5ndWFnZXMudGFwID0ge1xuXHQnZmFpbCc6IC9ub3Qgb2tbXiN7XFxuXFxyXSovLFxuXHQncGFzcyc6IC9va1teI3tcXG5cXHJdKi8sXG5cdCdwcmFnbWEnOiAvcHJhZ21hIFsrLV1bYS16XSsvLFxuXHQnYmFpbG91dCc6IC9iYWlsIG91dCEuKi9pLFxuXHQndmVyc2lvbic6IC9UQVAgdmVyc2lvbiBcXGQrL2ksXG5cdCdwbGFuJzogL1xcYlxcZCtcXC5cXC5cXGQrKD86ICsjLiopPy8sXG5cdCdzdWJ0ZXN0Jzoge1xuXHRcdHBhdHRlcm46IC8jIFN1YnRlc3QoPzo6IC4qKT8vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQncHVuY3R1YXRpb24nOiAvW3t9XS8sXG5cdCdkaXJlY3RpdmUnOiAvIy4qLyxcblx0J3lhbWxpc2gnOiB7XG5cdFx0cGF0dGVybjogLyheWyBcXHRdKiktLS1bXFxzXFxTXSo/W1xcclxcbl1bIFxcdF0qXFwuXFwuXFwuJC9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMueWFtbCxcblx0XHRhbGlhczogJ2xhbmd1YWdlLXlhbWwnXG5cdH1cbn07XG5cblByaXNtLmxhbmd1YWdlcy50Y2wgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSMuKi8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlteXCJcXFxcXFxyXFxuXXxcXFxcKD86XFxyXFxufFtcXHNcXFNdKSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndmFyaWFibGUnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhcXCQpKD86OjopPyg/OlthLXpBLVowLTldKzo6KSpcXHcrLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXFwkKVxce1tefV0rXFx9Lyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC8oXltcXHQgXSpzZXRbIFxcdF0rKSg/Ojo6KT8oPzpbYS16QS1aMC05XSs6OikqXFx3Ky9tLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH1cblx0XSxcblx0J2Z1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC8oXltcXHQgXSpwcm9jWyBcXHRdKylcXFMrL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnYnVpbHRpbic6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKSg/OmJyZWFrfGNsYXNzfGNvbnRpbnVlfGVycm9yfGV2YWx8ZXhpdHxmb3J8Zm9yZWFjaHxpZnxwcm9jfHJldHVybnxzd2l0Y2h8d2hpbGUpXFxiL20sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQvXFxiKD86ZWxzZXxlbHNlaWYpXFxiL1xuXHRdLFxuXHQnc2NvcGUnOiB7XG5cdFx0cGF0dGVybjogLyheW1xcdCBdKikoPzpnbG9iYWx8dXB2YXJ8dmFyaWFibGUpXFxiL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2NvbnN0YW50J1xuXHR9LFxuXHQna2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qfFxcWykoPzpTYWZlX0Jhc2V8VGNsfGFmdGVyfGFwcGVuZHxhcHBseXxhcnJheXxhdXRvXyg/OmV4ZWNva3xpbXBvcnR8bG9hZHxta2luZGV4fHF1YWxpZnl8cmVzZXQpfGF1dG9ta2luZGV4X29sZHxiZ2Vycm9yfGJpbmFyeXxjYXRjaHxjZHxjaGFufGNsb2NrfGNsb3NlfGNvbmNhdHxkZGV8ZGljdHxlbmNvZGluZ3xlb2Z8ZXhlY3xleHByfGZibG9ja2VkfGZjb25maWd1cmV8ZmNvcHl8ZmlsZSg/OmV2ZW50fG5hbWUpP3xmbHVzaHxnZXRzfGdsb2J8aGlzdG9yeXxodHRwfGluY3J8aW5mb3xpbnRlcnB8am9pbnxsYXBwZW5kfGxhc3NpZ258bGluZGV4fGxpbnNlcnR8bGlzdHxsbGVuZ3RofGxvYWR8bHJhbmdlfGxyZXBlYXR8bHJlcGxhY2V8bHJldmVyc2V8bHNlYXJjaHxsc2V0fGxzb3J0fG1hdGgoPzpmdW5jfG9wKXxtZW1vcnl8bXNnY2F0fG5hbWVzcGFjZXxvcGVufHBhY2thZ2V8cGFycmF5fHBpZHxwa2dfbWtJbmRleHxwbGF0Zm9ybXxwdXRzfHB3ZHxyZV9zeW50YXh8cmVhZHxyZWZjaGFufHJlZ2V4cHxyZWdpc3RyeXxyZWdzdWJ8cmVuYW1lfHNjYW58c2Vla3xzZXR8c29ja2V0fHNvdXJjZXxzcGxpdHxzdHJpbmd8c3Vic3R8dGNsKD86X2VuZE9mV29yZHxfZmluZExpYnJhcnl8c3RhcnRPZig/Ok5leHR8UHJldmlvdXMpV29yZHx0ZXN0fHZhcnN8d29yZEJyZWFrKD86QWZ0ZXJ8QmVmb3JlKSl8dGVsbHx0aW1lfHRtfHRyYWNlfHVua25vd258dW5sb2FkfHVuc2V0fHVwZGF0ZXx1cGxldmVsfHZ3YWl0KVxcYi9tLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0fSxcblx0J29wZXJhdG9yJzogLyE9P3xcXCpcXCo/fD09fCYmP3xcXHxcXHw/fDxbPTxdP3w+Wz0+XT98Wy0rflxcLyU/Xl18XFxiKD86ZXF8aW58bmV8bmkpXFxiLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fSgpXFxbXFxdXS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMudHQyID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnY2xpa2UnLCB7XG5cdFx0J2NvbW1lbnQnOiAvIy4qfFxcWyUjW1xcc1xcU10qPyVcXF0vLFxuXHRcdCdrZXl3b3JkJzogL1xcYig/OkJMT0NLfENBTEx8Q0FTRXxDQVRDSHxDTEVBUnxERUJVR3xERUZBVUxUfEVMU0V8RUxTSUZ8RU5EfEZJTFRFUnxGSU5BTHxGT1JFQUNIfEdFVHxJRnxJTnxJTkNMVURFfElOU0VSVHxMQVNUfE1BQ1JPfE1FVEF8TkVYVHxQRVJMfFBST0NFU1N8UkFXUEVSTHxSRVRVUk58U0VUfFNUT1B8U1dJVENIfFRBR1N8VEhST1d8VFJZfFVOTEVTU3xVU0V8V0hJTEV8V1JBUFBFUilcXGIvLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bW1xcXXt9LCgpXS9cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgndHQyJywgJ251bWJlcicsIHtcblx0XHQnb3BlcmF0b3InOiAvPVs+PV0/fCE9P3w8PT98Pj0/fCYmfFxcfFxcfD98XFxiKD86YW5kfG5vdHxvcilcXGIvLFxuXHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXGJbYS16XVxcdyooPzpcXHMqXFwuXFxzKig/OlxcZCt8XFwkP1thLXpdXFx3KikpKlxcYi9pXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCd0dDInLCAna2V5d29yZCcsIHtcblx0XHQnZGVsaW1pdGVyJzoge1xuXHRcdFx0cGF0dGVybjogL14oPzpcXFslfCUlKS0/fC0/JVxcXSQvLFxuXHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3R0MicsICdzdHJpbmcnLCB7XG5cdFx0J3NpbmdsZS1xdW90ZWQtc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogLydbXlxcXFwnXSooPzpcXFxcW1xcc1xcU11bXlxcXFwnXSopKicvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0fSxcblx0XHQnZG91YmxlLXF1b3RlZC1zdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCJbXlxcXFxcIl0qKD86XFxcXFtcXHNcXFNdW15cXFxcXCJdKikqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdzdHJpbmcnLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCd2YXJpYWJsZSc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFwkKD86W2Etel1cXHcqKD86XFwuKD86XFxkK3xcXCQ/W2Etel1cXHcqKSkqKS9pXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdC8vIFRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgVFQyIHN0cmluZ3MgXCJyZXBsYWNlXCIgdGhlIEMtbGlrZSBzdGFuZGFyZCBzdHJpbmdcblx0ZGVsZXRlIFByaXNtLmxhbmd1YWdlcy50dDIuc3RyaW5nO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdHZhciB0dDJQYXR0ZXJuID0gL1xcWyVbXFxzXFxTXSs/JVxcXS9nO1xuXHRcdFByaXNtLmxhbmd1YWdlc1snbWFya3VwLXRlbXBsYXRpbmcnXS5idWlsZFBsYWNlaG9sZGVycyhlbnYsICd0dDInLCB0dDJQYXR0ZXJuKTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdhZnRlci10b2tlbml6ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10udG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAndHQyJyk7XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0Ly8gV2UgZG9uJ3QgYWxsb3cgZm9yIHBpcGVzIGluc2lkZSBwYXJlbnRoZXNlc1xuXHQvLyB0byBub3QgYnJlYWsgdGFibGUgcGF0dGVybiB8KC4gZm9vIHwpLiBiYXIgfFxuXHR2YXIgbW9kaWZpZXJSZWdleCA9IC9cXChbXnwoKVxcbl0rXFwpfFxcW1teXFxdXFxuXStcXF18XFx7W159XFxuXStcXH0vLnNvdXJjZTtcblx0Ly8gT3BlbmluZyBhbmQgY2xvc2luZyBwYXJlbnRoZXNlcyB3aGljaCBhcmUgbm90IGEgbW9kaWZpZXJcblx0Ly8gVGhpcyBwYXR0ZXJuIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50IGV4cG9uZW50aWFsIGJhY2t0cmFja2luZ1xuXHR2YXIgcGFyZW50aGVzZXNSZWdleCA9IC9cXCl8XFwoKD8hW158KClcXG5dK1xcKSkvLnNvdXJjZTtcblx0LyoqXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2Vcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtmbGFnc11cblx0ICovXG5cdGZ1bmN0aW9uIHdpdGhNb2RpZmllcihzb3VyY2UsIGZsYWdzKSB7XG5cdFx0cmV0dXJuIFJlZ0V4cChcblx0XHRcdHNvdXJjZVxuXHRcdFx0XHQucmVwbGFjZSgvPE1PRD4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gJyg/OicgKyBtb2RpZmllclJlZ2V4ICsgJyknOyB9KVxuXHRcdFx0XHQucmVwbGFjZSgvPFBBUj4vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4gJyg/OicgKyBwYXJlbnRoZXNlc1JlZ2V4ICsgJyknOyB9KSxcblx0XHRcdGZsYWdzIHx8ICcnKTtcblx0fVxuXG5cdHZhciBtb2RpZmllclRva2VucyA9IHtcblx0XHQnY3NzJzoge1xuXHRcdFx0cGF0dGVybjogL1xce1tee31dK1xcfS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0cmVzdDogUHJpc20ubGFuZ3VhZ2VzLmNzc1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2NsYXNzLWlkJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXCgpW14oKV0rKD89XFwpKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdhdHRyLXZhbHVlJ1xuXHRcdH0sXG5cdFx0J2xhbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcWylbXlxcW1xcXV0rKD89XFxdKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdhdHRyLXZhbHVlJ1xuXHRcdH0sXG5cdFx0Ly8gQW55dGhpbmcgZWxzZSBpcyBwdW5jdHVhdGlvbiAodGhlIGZpcnN0IHBhdHRlcm4gaXMgZm9yIHJvdy9jb2wgc3BhbnMgaW5zaWRlIHRhYmxlcylcblx0XHQncHVuY3R1YXRpb24nOiAvW1xcXFxcXC9dXFxkK3xcXFMvXG5cdH07XG5cblxuXHR2YXIgdGV4dGlsZSA9IFByaXNtLmxhbmd1YWdlcy50ZXh0aWxlID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnbWFya3VwJywge1xuXHRcdCdwaHJhc2UnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58XFxyfFxcbilcXFNbXFxzXFxTXSo/KD89JHxcXHI/XFxuXFxyP1xcbnxcXHJcXHIpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblxuXHRcdFx0XHQvLyBoMS4gSGVhZGVyIDFcblx0XHRcdFx0J2Jsb2NrLXRhZyc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoL15bYS16XVxcdyooPzo8TU9EPnw8UEFSPnxbPD49XSkqXFwuLy5zb3VyY2UpLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J21vZGlmaWVyJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheW2Etel1cXHcqKSg/OjxNT0Q+fDxQQVI+fFs8Pj1dKSsoPz1cXC4pLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IG1vZGlmaWVyVG9rZW5zXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3RhZyc6IC9eW2Etel1cXHcqLyxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4kL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyAjIExpc3QgaXRlbVxuXHRcdFx0XHQvLyAqIExpc3QgaXRlbVxuXHRcdFx0XHQnbGlzdCc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoL15bKiNdKzxNT0Q+KlxccytcXFMuKi8uc291cmNlLCAnbScpLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J21vZGlmaWVyJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheWyojXSspPE1PRD4rLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IG1vZGlmaWVyVG9rZW5zXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL15bKiNdKy9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gfCBjZWxsIHwgY2VsbCB8IGNlbGwgfFxuXHRcdFx0XHQndGFibGUnOiB7XG5cdFx0XHRcdFx0Ly8gTW9kaWZpZXJzIGNhbiBiZSBhcHBsaWVkIHRvIHRoZSByb3c6IHtjb2xvcjpyZWR9LnwxfDJ8M3xcblx0XHRcdFx0XHQvLyBvciB0aGUgY2VsbDogfHtjb2xvcjpyZWR9LjF8MnwzfFxuXHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvXig/Oig/OjxNT0Q+fDxQQVI+fFs8Pj1efl0pK1xcLlxccyopPyg/OlxcfCg/Oig/OjxNT0Q+fDxQQVI+fFs8Pj1efl9dfFtcXFxcL11cXGQrKStcXC58KD8hKD86PE1PRD58PFBBUj58Wzw+PV5+X118W1xcXFwvXVxcZCspK1xcLikpW158XSopK1xcfC8uc291cmNlLCAnbScpLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J21vZGlmaWVyJzoge1xuXHRcdFx0XHRcdFx0XHQvLyBNb2RpZmllcnMgZm9yIHJvd3MgYWZ0ZXIgdGhlIGZpcnN0IG9uZSBhcmVcblx0XHRcdFx0XHRcdFx0Ly8gcHJlY2VkZWQgYnkgYSBwaXBlIGFuZCBhIGxpbmUgZmVlZFxuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyhefFxcfCg/Olxccj9cXG58XFxyKT8pKD86PE1PRD58PFBBUj58Wzw+PV5+X118W1xcXFwvXVxcZCspKyg/PVxcLikvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGluc2lkZTogbW9kaWZpZXJUb2tlbnNcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFx8fF5cXC4vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdCdpbmxpbmUnOiB7XG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1zdXBlci1saW5lYXItYmFja3RyYWNraW5nXG5cdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXnxbXmEtekEtWlxcZF0pKFxcKlxcKnxfX3xcXD9cXD98WypfJUArXFwtXn5dKTxNT0Q+Ki4rP1xcMig/IVthLXpBLVpcXGRdKS8uc291cmNlKSxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0Ly8gTm90ZTogc3VwZXJzY3JpcHRzIGFuZCBzdWJzY3JpcHRzIGFyZSBub3QgaGFuZGxlZCBzcGVjaWZpY2FsbHlcblxuXHRcdFx0XHRcdFx0Ly8gKmJvbGQqLCAqKmJvbGQqKlxuXHRcdFx0XHRcdFx0J2JvbGQnOiB7XG5cdFx0XHRcdFx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWdleHAvbm8tc3VwZXItbGluZWFyLWJhY2t0cmFja2luZ1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheKFxcKlxcKj8pPE1PRD4qKS4rPyg/PVxcMikvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRcdC8vIF9pdGFsaWNfLCBfX2l0YWxpY19fXG5cdFx0XHRcdFx0XHQnaXRhbGljJzoge1xuXHRcdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXN1cGVyLWxpbmVhci1iYWNrdHJhY2tpbmdcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXihfXz8pPE1PRD4qKS4rPyg/PVxcMikvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRcdC8vID8/Y2l0ZT8/XG5cdFx0XHRcdFx0XHQnY2l0ZSc6IHtcblx0XHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1zdXBlci1saW5lYXItYmFja3RyYWNraW5nXG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF5cXD9cXD88TU9EPiopLis/KD89XFw/XFw/KS8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdzdHJpbmcnXG5cdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHQvLyBAY29kZUBcblx0XHRcdFx0XHRcdCdjb2RlJzoge1xuXHRcdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXN1cGVyLWxpbmVhci1iYWNrdHJhY2tpbmdcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXkA8TU9EPiopLis/KD89QCkvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdFx0XHRcdGFsaWFzOiAna2V5d29yZCdcblx0XHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRcdC8vICtpbnNlcnRlZCtcblx0XHRcdFx0XHRcdCdpbnNlcnRlZCc6IHtcblx0XHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1zdXBlci1saW5lYXItYmFja3RyYWNraW5nXG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF5cXCs8TU9EPiopLis/KD89XFwrKS8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0Ly8gLWRlbGV0ZWQtXG5cdFx0XHRcdFx0XHQnZGVsZXRlZCc6IHtcblx0XHRcdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1zdXBlci1saW5lYXItYmFja3RyYWNraW5nXG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvKF4tPE1PRD4qKS4rPyg/PS0pLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHQvLyAlc3BhbiVcblx0XHRcdFx0XHRcdCdzcGFuJzoge1xuXHRcdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXN1cGVyLWxpbmVhci1iYWNrdHJhY2tpbmdcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXiU8TU9EPiopLis/KD89JSkvLnNvdXJjZSksXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cblx0XHRcdFx0XHRcdCdtb2RpZmllcic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXlxcKlxcKnxfX3xcXD9cXD98WypfJUArXFwtXn5dKTxNT0Q+Ky8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBtb2RpZmllclRva2Vuc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKl8lP0ArXFwtXn5dKy9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gW2FsaWFzXWh0dHA6Ly9leGFtcGxlLmNvbVxuXHRcdFx0XHQnbGluay1yZWYnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL15cXFtbXlxcXV0rXFxdXFxTKyQvbSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oXlxcWylbXlxcXV0rKD89XFxdKS8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQndXJsJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKF5cXF0pXFxTKyQvLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF1dL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBcInRleHRcIjpodHRwOi8vZXhhbXBsZS5jb21cblx0XHRcdFx0Ly8gXCJ0ZXh0XCI6bGluay1yZWZcblx0XHRcdFx0J2xpbmsnOiB7XG5cdFx0XHRcdFx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1zdXBlci1saW5lYXItYmFja3RyYWNraW5nXG5cdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC9cIjxNT0Q+KlteXCJdK1wiOi4rPyg/PVteXFx3L10/KD86XFxzfCQpKS8uc291cmNlKSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCd0ZXh0Jzoge1xuXHRcdFx0XHRcdFx0XHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXN1cGVyLWxpbmVhci1iYWNrdHJhY2tpbmdcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXlwiPE1PRD4qKVteXCJdKyg/PVwiKS8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdtb2RpZmllcic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogd2l0aE1vZGlmaWVyKC8oXlwiKTxNT0Q+Ky8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0aW5zaWRlOiBtb2RpZmllclRva2Vuc1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCd1cmwnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8oOikuKy8sXG5cdFx0XHRcdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvW1wiOl0vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vICFpbWFnZS5qcGchXG5cdFx0XHRcdC8vICFpbWFnZS5qcGcoVGl0bGUpITpodHRwOi8vZXhhbXBsZS5jb21cblx0XHRcdFx0J2ltYWdlJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IHdpdGhNb2RpZmllcigvISg/OjxNT0Q+fDxQQVI+fFs8Pj1dKSooPyFbPD49XSlbXiFcXHMoKV0rKD86XFwoW14pXStcXCkpPyEoPzo6Lis/KD89W15cXHcvXT8oPzpcXHN8JCkpKT8vLnNvdXJjZSksXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQnc291cmNlJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheISg/OjxNT0Q+fDxQQVI+fFs8Pj1dKSopKD8hWzw+PV0pW14hXFxzKCldKyg/OlxcKFteKV0rXFwpKT8oPz0hKS8uc291cmNlKSxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICd1cmwnXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J21vZGlmaWVyJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiB3aXRoTW9kaWZpZXIoLyheISkoPzo8TU9EPnw8UEFSPnxbPD49XSkrLy5zb3VyY2UpLFxuXHRcdFx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdFx0XHRpbnNpZGU6IG1vZGlmaWVyVG9rZW5zXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0J3VybCc6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyg6KS4rLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bITpdL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBGb290bm90ZVsxXVxuXHRcdFx0XHQnZm9vdG5vdGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcYlxcW1xcZCtcXF0vLFxuXHRcdFx0XHRcdGFsaWFzOiAnY29tbWVudCcsXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFxbfFxcXS9cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ1NTKENhc2NhZGluZyBTdHlsZSBTaGVldClcblx0XHRcdFx0J2Fjcm9ueW0nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcYltBLVpcXGRdK1xcKFteKV0rXFwpLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdjb21tZW50Jzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvKFxcKClbXigpXSsoPz1cXCkpLyxcblx0XHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCldL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBQcmlzbShDKVxuXHRcdFx0XHQnbWFyayc6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFxiXFwoKD86Q3xSfFRNKVxcKS8sXG5cdFx0XHRcdFx0YWxpYXM6ICdjb21tZW50Jyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bKCldL1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0dmFyIHBocmFzZUluc2lkZSA9IHRleHRpbGVbJ3BocmFzZSddLmluc2lkZTtcblx0dmFyIG5lc3RlZFBhdHRlcm5zID0ge1xuXHRcdCdpbmxpbmUnOiBwaHJhc2VJbnNpZGVbJ2lubGluZSddLFxuXHRcdCdsaW5rJzogcGhyYXNlSW5zaWRlWydsaW5rJ10sXG5cdFx0J2ltYWdlJzogcGhyYXNlSW5zaWRlWydpbWFnZSddLFxuXHRcdCdmb290bm90ZSc6IHBocmFzZUluc2lkZVsnZm9vdG5vdGUnXSxcblx0XHQnYWNyb255bSc6IHBocmFzZUluc2lkZVsnYWNyb255bSddLFxuXHRcdCdtYXJrJzogcGhyYXNlSW5zaWRlWydtYXJrJ11cblx0fTtcblxuXHQvLyBPbmx5IGFsbG93IGFscGhhLW51bWVyaWMgSFRNTCB0YWdzLCBub3QgWE1MIHRhZ3Ncblx0dGV4dGlsZS50YWcucGF0dGVybiA9IC88XFwvPyg/IVxcZClbYS16MC05XSsoPzpcXHMrW15cXHM+XFwvPV0rKD86PSg/OihcInwnKSg/OlxcXFxbXFxzXFxTXXwoPyFcXDEpW15cXFxcXSkqXFwxfFteXFxzJ1wiPj1dKykpPykqXFxzKlxcLz8+L2k7XG5cblx0Ly8gQWxsb3cgc29tZSBuZXN0aW5nXG5cdHZhciBwaHJhc2VJbmxpbmVJbnNpZGUgPSBwaHJhc2VJbnNpZGVbJ2lubGluZSddLmluc2lkZTtcblx0cGhyYXNlSW5saW5lSW5zaWRlWydib2xkJ10uaW5zaWRlID0gbmVzdGVkUGF0dGVybnM7XG5cdHBocmFzZUlubGluZUluc2lkZVsnaXRhbGljJ10uaW5zaWRlID0gbmVzdGVkUGF0dGVybnM7XG5cdHBocmFzZUlubGluZUluc2lkZVsnaW5zZXJ0ZWQnXS5pbnNpZGUgPSBuZXN0ZWRQYXR0ZXJucztcblx0cGhyYXNlSW5saW5lSW5zaWRlWydkZWxldGVkJ10uaW5zaWRlID0gbmVzdGVkUGF0dGVybnM7XG5cdHBocmFzZUlubGluZUluc2lkZVsnc3BhbiddLmluc2lkZSA9IG5lc3RlZFBhdHRlcm5zO1xuXG5cdC8vIEFsbG93IHNvbWUgc3R5bGVzIGluc2lkZSB0YWJsZSBjZWxsc1xuXHR2YXIgcGhyYXNlVGFibGVJbnNpZGUgPSBwaHJhc2VJbnNpZGVbJ3RhYmxlJ10uaW5zaWRlO1xuXHRwaHJhc2VUYWJsZUluc2lkZVsnaW5saW5lJ10gPSBuZXN0ZWRQYXR0ZXJuc1snaW5saW5lJ107XG5cdHBocmFzZVRhYmxlSW5zaWRlWydsaW5rJ10gPSBuZXN0ZWRQYXR0ZXJuc1snbGluayddO1xuXHRwaHJhc2VUYWJsZUluc2lkZVsnaW1hZ2UnXSA9IG5lc3RlZFBhdHRlcm5zWydpbWFnZSddO1xuXHRwaHJhc2VUYWJsZUluc2lkZVsnZm9vdG5vdGUnXSA9IG5lc3RlZFBhdHRlcm5zWydmb290bm90ZSddO1xuXHRwaHJhc2VUYWJsZUluc2lkZVsnYWNyb255bSddID0gbmVzdGVkUGF0dGVybnNbJ2Fjcm9ueW0nXTtcblx0cGhyYXNlVGFibGVJbnNpZGVbJ21hcmsnXSA9IG5lc3RlZFBhdHRlcm5zWydtYXJrJ107XG5cbn0oUHJpc20pKTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXG5cdHZhciBrZXkgPSAvKD86W1xcdy1dK3wnW14nXFxuXFxyXSonfFwiKD86XFxcXC58W15cXFxcXCJcXHJcXG5dKSpcIikvLnNvdXJjZTtcblxuXHQvKipcblx0ICogQHBhcmFtIHtzdHJpbmd9IHBhdHRlcm5cblx0ICovXG5cdGZ1bmN0aW9uIGluc2VydEtleShwYXR0ZXJuKSB7XG5cdFx0cmV0dXJuIHBhdHRlcm4ucmVwbGFjZSgvX18vZywgZnVuY3Rpb24gKCkgeyByZXR1cm4ga2V5OyB9KTtcblx0fVxuXG5cdFByaXNtLmxhbmd1YWdlcy50b21sID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCd0YWJsZSc6IHtcblx0XHRcdHBhdHRlcm46IFJlZ0V4cChpbnNlcnRLZXkoLyheW1xcdCBdKlxcW1xccyooPzpcXFtcXHMqKT8pX18oPzpcXHMqXFwuXFxzKl9fKSooPz1cXHMqXFxdKS8uc291cmNlKSwgJ20nKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdFx0fSxcblx0XHQna2V5Jzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKGluc2VydEtleSgvKF5bXFx0IF0qfFt7LF1cXHMqKV9fKD86XFxzKlxcLlxccypfXykqKD89XFxzKj0pLy5zb3VyY2UpLCAnbScpLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAncHJvcGVydHknXG5cdFx0fSxcblx0XHQnc3RyaW5nJzoge1xuXHRcdFx0cGF0dGVybjogL1wiXCJcIig/OlxcXFxbXFxzXFxTXXxbXlxcXFxdKSo/XCJcIlwifCcnJ1tcXHNcXFNdKj8nJyd8J1teJ1xcblxccl0qJ3xcIig/OlxcXFwufFteXFxcXFwiXFxyXFxuXSkqXCIvLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fSxcblx0XHQnZGF0ZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gT2Zmc2V0IERhdGUtVGltZSwgTG9jYWwgRGF0ZS1UaW1lLCBMb2NhbCBEYXRlXG5cdFx0XHRcdHBhdHRlcm46IC9cXGJcXGR7NH0tXFxkezJ9LVxcZHsyfSg/OltUXFxzXVxcZHsyfTpcXGR7Mn06XFxkezJ9KD86XFwuXFxkKyk/KD86WnxbKy1dXFxkezJ9OlxcZHsyfSk/KT9cXGIvaSxcblx0XHRcdFx0YWxpYXM6ICdudW1iZXInXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBMb2NhbCBUaW1lXG5cdFx0XHRcdHBhdHRlcm46IC9cXGJcXGR7Mn06XFxkezJ9OlxcZHsyfSg/OlxcLlxcZCspP1xcYi8sXG5cdFx0XHRcdGFsaWFzOiAnbnVtYmVyJ1xuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J251bWJlcic6IC8oPzpcXGIwKD86eFtcXGRhLXpBLVpdKyg/Ol9bXFxkYS16QS1aXSspKnxvWzAtN10rKD86X1swLTddKykqfGJbMTBdKyg/Ol9bMTBdKykqKSlcXGJ8Wy0rXT9cXGJcXGQrKD86X1xcZCspKig/OlxcLlxcZCsoPzpfXFxkKykqKT8oPzpbZUVdWystXT9cXGQrKD86X1xcZCspKik/XFxifFstK10/XFxiKD86aW5mfG5hbilcXGIvLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvWy4sPVtcXF17fV0vXG5cdH07XG59KFByaXNtKSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHRQcmlzbS5sYW5ndWFnZXMudHJlbW9yID0ge1xuXHRcdCdjb21tZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pKD86XFwvXFwqW1xcc1xcU10qP1xcKlxcL3woPzotLXxcXC9cXC98IykuKikvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2ludGVycG9sYXRlZC1zdHJpbmcnOiBudWxsLCAvLyBzZWUgYmVsb3dcblx0XHQnZXh0cmFjdG9yJzoge1xuXHRcdFx0cGF0dGVybjogL1xcYlthLXpfXVxcdypcXHwoPzpbXlxcclxcblxcXFx8XXxcXFxcKD86XFxyXFxufFtcXHNcXFNdKSkqXFx8L2ksXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3JlZ2V4Jzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oXnJlKVxcfFtcXHNcXFNdKy8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnZnVuY3Rpb24nOiAvXlxcdysvLFxuXHRcdFx0XHQndmFsdWUnOiAvXFx8W1xcc1xcU10rL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2lkZW50aWZpZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvYFteYF0qYC8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXG5cdFx0J2Z1bmN0aW9uJzogL1xcYlthLXpfXVxcdyooPz1cXHMqKD86OjpcXHMqPHxcXCgpKVxcYi8sXG5cblx0XHQna2V5d29yZCc6IC9cXGIoPzphcmdzfGFzfGJ5fGNhc2V8Y29uZmlnfGNvbm5lY3R8Y29ubmVjdG9yfGNvbnN0fGNvcHl8Y3JlYXRlfGRlZmF1bHR8ZGVmaW5lfGRlcGxveXxkcm9wfGVhY2h8ZW1pdHxlbmR8ZXJhc2V8ZXZlbnR8Zmxvd3xmbnxmb3J8ZnJvbXxncm91cHxoYXZpbmd8aW5zZXJ0fGludG98aW50cmluc2ljfGxldHxsaW5rc3xtYXRjaHxtZXJnZXxtb2R8bW92ZXxvZnxvcGVyYXRvcnxwYXRjaHxwaXBlbGluZXxyZWN1cnxzY3JpcHR8c2VsZWN0fHNldHxzbGlkaW5nfHN0YXRlfHN0cmVhbXx0b3x0dW1ibGluZ3x1cGRhdGV8dXNlfHdoZW58d2hlcmV8d2luZG93fHdpdGgpXFxiLyxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXxudWxsfHRydWUpXFxiL2ksXG5cblx0XHQnbnVtYmVyJzogL1xcYig/OjBiWzAxX10qfDB4WzAtOWEtZkEtRl9dKnxcXGRbXFxkX10qKD86XFwuXFxkW1xcZF9dKik/KD86W0VlXVsrLV0/W1xcZF9dKyk/KVxcYi8sXG5cblx0XHQncGF0dGVybi1wdW5jdHVhdGlvbic6IHtcblx0XHRcdHBhdHRlcm46IC8lKD89Wyh7W10pLyxcblx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0fSxcblx0XHQnb3BlcmF0b3InOiAvWy0rKlxcLyV+IV5dPT98PVs9Pl0/fCZbJj1dP3xcXHxbfD1dP3w8PD89P3w+Pj8+Pz0/fCg/OmFic2VudHxhbmR8bm90fG9yfHByZXNlbnR8eG9yKVxcYi8sXG5cdFx0J3B1bmN0dWF0aW9uJzogLzo6fFs7XFxbXFxdKClcXHtcXH0sLjpdLyxcblx0fTtcblxuXHR2YXIgaW50ZXJwb2xhdGlvblBhdHRlcm4gPSAvI1xceyg/OlteXCJ7fV18XFx7W157fV0qXFx9fFwiKD86W15cIlxcXFxcXHJcXG5dfFxcXFwoPzpcXHJcXG58W1xcc1xcU10pKSpcIikqXFx9Ly5zb3VyY2U7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnRyZW1vclsnaW50ZXJwb2xhdGVkLXN0cmluZyddID0ge1xuXHRcdHBhdHRlcm46IFJlZ0V4cChcblx0XHRcdC8oXnxbXlxcXFxdKS8uc291cmNlICtcblx0XHRcdCcoPzonICtcblx0XHRcdCdcIlwiXCIoPzonICsgL1teXCJcXFxcI118XFxcXFtcXHNcXFNdfFwiKD8hXCJcIil8Iyg/IVxceykvLnNvdXJjZSArICd8JyArIGludGVycG9sYXRpb25QYXR0ZXJuICsgJykqXCJcIlwiJyArXG5cdFx0XHQnfCcgK1xuXHRcdFx0J1wiKD86JyArIC9bXlwiXFxcXFxcclxcbiNdfFxcXFwoPzpcXHJcXG58W1xcc1xcU10pfCMoPyFcXHspLy5zb3VyY2UgKyAnfCcgKyBpbnRlcnBvbGF0aW9uUGF0dGVybiArICcpKlwiJyArXG5cdFx0XHQnKSdcblx0XHQpLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cChpbnRlcnBvbGF0aW9uUGF0dGVybiksXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9eI1xce3xcXH0kLyxcblx0XHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9bXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMudHJlbW9yXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy50cm95ID0gUHJpc20ubGFuZ3VhZ2VzWyd0cmVtb3InXTtcblx0UHJpc20ubGFuZ3VhZ2VzLnRyaWNrbGUgPSBQcmlzbS5sYW5ndWFnZXNbJ3RyZW1vciddO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy50d2lnID0ge1xuXHQnY29tbWVudCc6IC9eXFx7I1tcXHNcXFNdKj8jXFx9JC8sXG5cblx0J3RhZy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXlxceyUtP1xccyopXFx3Ky8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdkZWxpbWl0ZXInOiB7XG5cdFx0cGF0dGVybjogL15cXHtbeyVdLT98LT9bJX1dXFx9JC8sXG5cdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0fSxcblxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXCJ8JykoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9eWydcIl18WydcIl0kL1xuXHRcdH1cblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86ZXZlbnxpZnxvZGQpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bnVsbHx0cnVlKVxcYi8sXG5cdCdudW1iZXInOiAvXFxiMHhbXFxkQS1GYS1mXSt8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OltFZV1bLStdP1xcZCspPy8sXG5cdCdvcGVyYXRvcic6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFxccykoPzphbmR8Yi1hbmR8Yi1vcnxiLXhvcnxlbmRzIHdpdGh8aW58aXN8bWF0Y2hlc3xub3R8b3J8c2FtZSBhc3xzdGFydHMgd2l0aCkoPz1cXHMpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC9bPTw+XT0/fCE9fFxcKlxcKj98XFwvXFwvP3xcXD86P3xbLSt+JXxdL1xuXHRdLFxuXHQncHVuY3R1YXRpb24nOiAvWygpXFxbXFxde306LixdL1xufTtcblxuUHJpc20uaG9va3MuYWRkKCdiZWZvcmUtdG9rZW5pemUnLCBmdW5jdGlvbiAoZW52KSB7XG5cdGlmIChlbnYubGFuZ3VhZ2UgIT09ICd0d2lnJykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdHZhciBwYXR0ZXJuID0gL1xceyg/OiNbXFxzXFxTXSo/I3wlW1xcc1xcU10qPyV8XFx7W1xcc1xcU10qP1xcfSlcXH0vZztcblx0UHJpc20ubGFuZ3VhZ2VzWydtYXJrdXAtdGVtcGxhdGluZyddLmJ1aWxkUGxhY2Vob2xkZXJzKGVudiwgJ3R3aWcnLCBwYXR0ZXJuKTtcbn0pO1xuXG5QcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRQcmlzbS5sYW5ndWFnZXNbJ21hcmt1cC10ZW1wbGF0aW5nJ10udG9rZW5pemVQbGFjZWhvbGRlcnMoZW52LCAndHdpZycpO1xufSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIga2V5d29yZHMgPSAvXFxiKD86QUNUfEFDVElGU1VCfENBUlJBWXxDQVNFfENMRUFSR0lGfENPQXxDT0FfSU5UfENPTlNUQU5UU3xDT05URU5UfENVUnxFRElUUEFORUx8RUZGRUNUfEVYVHxGSUxFfEZMVUlEVEVNUExBVEV8Rk9STXxGUkFNRXxGUkFNRVNFVHxHSUZCVUlMREVSfEdNRU5VfEdNRU5VX0ZPTERPVVR8R01FTlVfTEFZRVJTfEdQfEhNRU5VfEhSVUxFUnxIVE1MfElFTlZ8SUZTVUJ8SU1BR0V8SU1HTUVOVXxJTUdNRU5VSVRFTXxJTUdURVhUfElNR19SRVNPVVJDRXxJTkNMVURFX1RZUE9TQ1JJUFR8SlNNRU5VfEpTTUVOVUlURU18TExMfExPQURfUkVHSVNURVJ8Tk98UEFHRXxSRUNPUkRTfFJFU1RPUkVfUkVHSVNURVJ8VEVNUExBVEV8VEVYVHxUTUVOVXxUTUVOVUlURU18VE1FTlVfTEFZRVJTfFVTRVJ8VVNFUl9JTlR8X0dJRkJVSUxERVJ8Z2xvYmFsfGdsb2JhbFN0cmluZ3xnbG9iYWxWYXIpXFxiLztcblxuXHRQcmlzbS5sYW5ndWFnZXMudHlwb3NjcmlwdCA9IHtcblx0XHQnY29tbWVudCc6IFtcblx0XHRcdHtcblx0XHRcdFx0Ly8gbXVsdGlsaW5lIGNvbW1lbnRzIC8qICovXG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKVxcL1xcKltcXHNcXFNdKj8oPzpcXCpcXC98JCkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBkb3VibGUtc2xhc2ggY29tbWVudHMgLSBpZ25vcmVkIHdoZW4gYmFja3NsYXNoZXMgb3IgY29sb24gaXMgZm91bmQgaW4gZnJvbnRcblx0XHRcdFx0Ly8gYWxzbyBpZ25vcmVkIHdoZW5ldmVyIGRpcmVjdGx5IGFmdGVyIGFuIGVxdWFsLXNpZ24sIGJlY2F1c2UgaXQgd291bGQgcHJvYmFibHkgYmUgYW4gdXJsIHdpdGhvdXQgcHJvdG9jb2xcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXDo9IFxcdF18KD86XnxbXj0gXFx0XSlbIFxcdF0rKVxcL1xcLy4qLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBoYXNoIGNvbW1lbnRzIC0gaWdub3JlZCB3aGVuIGxlYWRpbmcgcXVvdGUgaXMgZm91bmQgZm9yIGhleCBjb2xvcnMgaW4gc3RyaW5nc1xuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cIiddKSMuKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2Z1bmN0aW9uJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBvbGQgaW5jbHVkZSBzdHlsZVxuXHRcdFx0XHRwYXR0ZXJuOiAvPElOQ0xVREVfVFlQT1NDUklQVDpcXHMqc291cmNlXFxzKj1cXHMqKD86XCJbXlwiXFxyXFxuXSpcInwnW14nXFxyXFxuXSonKVxccyo+Lyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J3N0cmluZyc6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9cIlteXCJcXHJcXG5dKlwifCdbXidcXHJcXG5dKicvLFxuXHRcdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHRcdCdrZXl3b3JkJzoga2V5d29yZHMsXG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRcdFx0XHRwYXR0ZXJuOiAvSU5DTFVERV9UWVBPU0NSSVBULyxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0Ly8gbmV3IGluY2x1ZGUgc3R5bGVcblx0XHRcdFx0cGF0dGVybjogL0BpbXBvcnRcXHMqKD86XCJbXlwiXFxyXFxuXSpcInwnW14nXFxyXFxuXSonKS8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdzdHJpbmcnOiAvXCJbXlwiXFxyXFxuXSpcInwnW14nXFxyXFxuXSonLyxcblx0XHRcdFx0fSxcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXihbXj1dKj1bPCBdPykoPzooPyFcXF1cXG4pLikqLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Z1bmN0aW9uJzogL1xce1xcJC4qXFx9LywgLy8gY29uc3RhbnRzIGluY2x1ZGVcblx0XHRcdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHRcdFx0J251bWJlcic6IC9eXFxkKyQvLFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWyx8Ol0vLFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiBrZXl3b3Jkcyxcblx0XHQnbnVtYmVyJzoge1xuXHRcdFx0Ly8gc3BlY2lhbCBoaWdobGlnaHRpbmcgZm9yIGluZGV4ZXMgb2YgYXJyYXlzIGluIHRhZ3Ncblx0XHRcdHBhdHRlcm46IC9cXGJcXGQrXFxzKlsuez1dLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnb3BlcmF0b3InOiAvWy57PV0vLFxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3RhZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cXC4/Wy1cXHdcXFxcXStcXC4/Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvXFwuLyxcblx0XHRcdH1cblx0XHR9LFxuXHRcdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46fF0vLFxuXHRcdCdvcGVyYXRvcic6IC9bPD5dPT98WyE9XT0/PT98LS0/fFxcK1xcKz98JiY/fFxcfFxcfD98Wz8qL35eJV0vLFxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy50c2NvbmZpZyA9IFByaXNtLmxhbmd1YWdlcy50eXBvc2NyaXB0O1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy51bnJlYWxzY3JpcHQgPSB7XG5cdCdjb21tZW50JzogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oW1wiJ10pKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdjYXRlZ29yeSc6IHtcblx0XHRwYXR0ZXJuOiAvKFxcYig/Oig/OmF1dG9leHBhbmR8aGlkZXxzaG93KWNhdGVnb3JpZXN8dmFyKVxccypcXCgpW14oKV0rKD89XFwpKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J21ldGFkYXRhJzoge1xuXHRcdHBhdHRlcm46IC8oXFx3XFxzKik8XFxzKlxcdytcXHMqPVtePD58PVxcclxcbl0rKD86XFx8XFxzKlxcdytcXHMqPVtePD58PVxcclxcbl0rKSo+Lyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwcm9wZXJ0eSc6IC9cXGJcXHcrKD89XFxzKj0pLyxcblx0XHRcdCdvcGVyYXRvcic6IC89Lyxcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9bPD58XS9cblx0XHR9XG5cdH0sXG5cdCdtYWNybyc6IHtcblx0XHRwYXR0ZXJuOiAvYFxcdysvLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzoge1xuXHRcdHBhdHRlcm46IC8oXFxiKD86Y2xhc3N8ZW51bXxleHRlbmRzfGludGVyZmFjZXxzdGF0ZSg/OlxcKFxcKSk/fHN0cnVjdHx3aXRoaW4pXFxzKylcXHcrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cblx0J2tleXdvcmQnOiAvXFxiKD86YWJzdHJhY3R8YWN0b3J8YXJyYXl8YXV0b3xhdXRvZXhwYW5kY2F0ZWdvcmllc3xib29sfGJyZWFrfGJ5dGV8Y2FzZXxjbGFzc3xjbGFzc2dyb3VwfGNsaWVudHxjb2VyY2V8Y29sbGFwc2VjYXRlZ29yaWVzfGNvbmZpZ3xjb25zdHxjb250aW51ZXxkZWZhdWx0fGRlZmF1bHRwcm9wZXJ0aWVzfGRlbGVnYXRlfGRlcGVuZHNvbnxkZXByZWNhdGVkfGRvfGRvbnRjb2xsYXBzZWNhdGVnb3JpZXN8ZWRpdGNvbnN0fGVkaXRpbmxpbmVuZXd8ZWxzZXxlbnVtfGV2ZW50fGV4ZWN8ZXhwb3J0fGV4dGVuZHN8ZmluYWx8ZmxvYXR8Zm9yfGZvcmNlc2NyaXB0b3JkZXJ8Zm9yZWFjaHxmdW5jdGlvbnxnb3RvfGd1aWR8aGlkZWNhdGVnb3JpZXN8aGlkZWRyb3Bkb3dufGlmfGlnbm9yZXN8aW1wbGVtZW50c3xpbmhlcml0c3xpbnB1dHxpbnR8aW50ZXJmYWNlfGl0ZXJhdG9yfGxhdGVudHxsb2NhbHxtYXRlcmlhbHxuYW1lfG5hdGl2ZXxuYXRpdmVyZXBsaWNhdGlvbnxub2V4cG9ydHxub250cmFuc2llbnR8bm90ZWRpdGlubGluZW5ld3xub3RwbGFjZWFibGV8b3BlcmF0b3J8b3B0aW9uYWx8b3V0fHBhd258cGVyb2JqZWN0Y29uZmlnfHBlcm9iamVjdGxvY2FsaXplZHxwbGFjZWFibGV8cG9zdG9wZXJhdG9yfHByZW9wZXJhdG9yfHByaXZhdGV8cHJvdGVjdGVkfHJlbGlhYmxlfHJlcGxpY2F0aW9ufHJldHVybnxzZXJ2ZXJ8c2hvd2NhdGVnb3JpZXN8c2ltdWxhdGVkfHNpbmd1bGFyfHN0YXRlfHN0YXRpY3xzdHJpbmd8c3RydWN0fHN0cnVjdGRlZmF1bHR8c3RydWN0ZGVmYXVsdHByb3BlcnRpZXN8c3dpdGNofHRleHR1cmV8dHJhbnNpZW50fHRyYXZlbHx1bnJlbGlhYmxlfHVudGlsfHZhcnx2ZWN0b3J8d2hpbGV8d2l0aGluKVxcYi8sXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlxcKCkvaSxcblxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdudW1iZXInOiAvXFxiMHhbXFxkYS1mXStcXGJ8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OmVbKy1dP1xcZCspPy9pLFxuXHQvLyBodHRwczovL2RvY3MudW5yZWFsZW5naW5lLmNvbS91ZGsvVGhyZWUvVW5yZWFsU2NyaXB0RXhwcmVzc2lvbnMuaHRtbFxuXHQnb3BlcmF0b3InOiAvPj58PDx8LS18XFwrXFwrfFxcKlxcKnxbLSsqL34hPTw+JEBdPT98JiY/fFxcfFxcfD98XFxeXFxeP3xbPzolXXxcXGIoPzpDbG9ja3dpc2VGcm9tfENyb3NzfERvdClcXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvWygpW1xcXXt9OywuXS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy51YyA9IFByaXNtLmxhbmd1YWdlcy51c2NyaXB0ID0gUHJpc20ubGFuZ3VhZ2VzLnVucmVhbHNjcmlwdDtcblxuUHJpc20ubGFuZ3VhZ2VzLnVvcmF6b3IgPSB7XG5cdCdjb21tZW50LWhhc2gnOiB7XG5cdFx0cGF0dGVybjogLyMuKi8sXG5cdFx0YWxpYXM6ICdjb21tZW50Jyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2NvbW1lbnQtc2xhc2gnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcLy4qLyxcblx0XHRhbGlhczogJ2NvbW1lbnQnLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC8oXCJ8JykoPzpcXFxcLnwoPyFcXDEpW15cXFxcXFxyXFxuXSkqXFwxLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdwdW5jdHVhdGlvbic6IC9eWydcIl18WydcIl0kL1xuXHRcdH0sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdzb3VyY2UtbGF5ZXJzJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzphcm1zfGJhY2twYWNrfGJsdWV8YnJhY2VsZXR8Y2FuY2VsfGNsZWFyfGNsb2FrfGNyaW1pbmFsfGVhcnJpbmdzfGVuZW15fGZhY2lhbGhhaXJ8ZnJpZW5kfGZyaWVuZGx5fGdsb3Zlc3xncmF5fGdyZXl8Z3JvdW5kfGhhaXJ8aGVhZHxpbm5lcmxlZ3N8aW5uZXJ0b3Jzb3xpbm5vY2VudHxsZWZ0aGFuZHxtaWRkbGV0b3Jzb3xtdXJkZXJlcnxuZWNrfG5vbmZyaWVuZGx5fG9uZWhhbmRlZHNlY29uZGFyeXxvdXRlcmxlZ3N8b3V0ZXJ0b3Jzb3xwYW50c3xyZWR8cmlnaHRoYW5kfHJpbmd8c2VsZnxzaGlydHxzaG9lc3x0YWxpc21hbnx3YWlzdClcXGIvaSxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQnc291cmNlLWNvbW1hbmRzJzoge1xuXHRcdHBhdHRlcm46IC9cXGIoPzphbGxpYW5jZXxhdHRhY2t8Y2FzdHxjbGVhcmFsbHxjbGVhcmlnbm9yZXxjbGVhcmpvdXJuYWx8Y2xlYXJsaXN0fGNsZWFyc3lzbXNnfGNyZWF0ZWxpc3R8Y3JlYXRldGltZXJ8ZGNsaWNrfGRjbGlja3R5cGV8ZGNsaWNrdmFyfGRyZXNzfGRyZXNzY29uZmlnfGRyb3B8ZHJvcHJlbGxvY3xlbW90ZXxnZXRsYWJlbHxndWlsZHxndW1wY2xvc2V8Z3VtcHJlc3BvbnNlfGhvdGtleXxpZ25vcmV8bGFzdHRhcmdldHxsaWZ0fGxpZnR0eXBlfG1lbnV8bWVudXJlc3BvbnNlfG1zZ3xvcmd8b3JnYW5pemV8b3JnYW5pemVyfG92ZXJoZWFkfHBhdXNlfHBvcGxpc3R8cG90aW9ufHByb21wdHJlc3BvbnNlfHB1c2hsaXN0fHJlbW92ZWxpc3R8cmVtb3ZldGltZXJ8cmVuYW1lfHJlc3RvY2t8c2F5fHNjYXZ8c2NhdmVuZ2VyfHNjcmlwdHxzZXRhYmlsaXR5fHNldGxhc3R0YXJnZXR8c2V0c2tpbGx8c2V0dGltZXJ8c2V0dmFyfHN5c21zZ3x0YXJnZXR8dGFyZ2V0bG9jfHRhcmdldHJlbGxvY3x0YXJnZXR0eXBlfHVuZHJlc3N8dW5pZ25vcmV8dW5zZXR2YXJ8dXNlb2JqZWN0fHVzZW9uY2V8dXNlc2tpbGx8dXNldHlwZXx2aXJ0dWV8d2FpdHx3YWl0Zm9yZ3VtcHx3YWl0Zm9ybWVudXx3YWl0Zm9ycHJvbXB0fHdhaXRmb3JzdGF0fHdhaXRmb3JzeXNtc2d8d2FpdGZvcnRhcmdldHx3YWxrfHdmc3lzbXNnfHdmdHx3aGlzcGVyfHllbGwpXFxiLyxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQndGFnLW5hbWUnOiB7XG5cdFx0cGF0dGVybjogLyheXFx7JS0/XFxzKilcXHcrLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAna2V5d29yZCdcblx0fSxcblx0J2RlbGltaXRlcic6IHtcblx0XHRwYXR0ZXJuOiAvXlxce1t7JV0tP3wtP1slfV1cXH0kLyxcblx0XHRhbGlhczogJ3B1bmN0dWF0aW9uJ1xuXHR9LFxuXHQnZnVuY3Rpb24nOiAvXFxiKD86YXRsaXN0fGNsb3NlfGNsb3Nlc3R8Y291bnR8Y291bnRlcnxjb3VudHR5cGV8ZGVhZHxkZXh8ZGlmZmhpdHN8ZGlmZm1hbmF8ZGlmZnN0YW18ZGlmZndlaWdodHxmaW5kfGZpbmRidWZmfGZpbmRkZWJ1ZmZ8ZmluZGxheWVyfGZpbmR0eXBlfGZpbmR0eXBlbGlzdHxmb2xsb3dlcnN8Z3VtcGV4aXN0c3xoaWRkZW58aGl0c3xocHxodWV8aHVtYW58aHVtYW5vaWR8aW5ndW1wfGlubGlzdHxpbnN5c21lc3NhZ2V8aW5zeXNtc2d8aW50fGludnVsfGxoYW5kZW1wdHl8bGlzdHxsaXN0ZXhpc3RzfG1hbmF8bWF4aGl0c3xtYXhocHxtYXhtYW5hfG1heHN0YW18bWF4d2VpZ2h0fG1vbnN0ZXJ8bW91bnRlZHxuYW1lfG5leHR8bm90b3xwYXJhbHl6ZWR8cG9pc29uZWR8cG9zaXRpb258cHJldnxwcmV2aW91c3xxdWV1ZWR8cmFuZHxyYW5kb218cmhhbmRlbXB0eXxza2lsbHxzdGFtfHN0cnx0YXJnZXRleGlzdHN8dGltZXJ8dGltZXJleGlzdHN8dmFyZXhpc3R8d2FybW9kZXx3ZWlnaHQpXFxiLyxcblx0J2tleXdvcmQnOiAvXFxiKD86YW5kfGFzfGJyZWFrfGNvbnRpbnVlfGVsc2V8ZWxzZWlmfGVuZGZvcnxlbmRpZnxlbmR3aGlsZXxmb3J8aWZ8bG9vcHxub3R8b3J8cmVwbGF5fHN0b3B8d2hpbGUpXFxiLyxcblx0J2Jvb2xlYW4nOiAvXFxiKD86ZmFsc2V8bnVsbHx0cnVlKVxcYi8sXG5cdCdudW1iZXInOiAvXFxiMHhbXFxkQS1GYS1mXSt8KD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OltFZV1bLStdP1xcZCspPy8sXG5cdCdvcGVyYXRvcic6IFtcblx0XHR7XG5cdFx0XHRwYXR0ZXJuOiAvKFxccykoPzphbmR8Yi1hbmR8Yi1vcnxiLXhvcnxlbmRzIHdpdGh8aW58aXN8bWF0Y2hlc3xub3R8b3J8c2FtZSBhc3xzdGFydHMgd2l0aCkoPz1cXHMpLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdC9bPTw+XT0/fCE9fFxcKlxcKj98XFwvXFwvP3xcXD86P3xbLSt+JXxdL1xuXHRdLFxuXHQncHVuY3R1YXRpb24nOiAvWygpXFxbXFxde306LixdL1xufTtcblxuLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjYXBwZW5kaXgtQVxuXG5QcmlzbS5sYW5ndWFnZXMudXJpID0ge1xuXHQnc2NoZW1lJzoge1xuXHRcdHBhdHRlcm46IC9eW2Etel1bYS16MC05Ky4tXSo6L2ltLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdzY2hlbWUtZGVsaW1pdGVyJzogLzokL1xuXHRcdH1cblx0fSxcblx0J2ZyYWdtZW50Jzoge1xuXHRcdHBhdHRlcm46IC8jW1xcd1xcLS5+ISQmJygpKissOz0lOkAvP10qLyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdmcmFnbWVudC1kZWxpbWl0ZXInOiAvXiMvXG5cdFx0fVxuXHR9LFxuXHQncXVlcnknOiB7XG5cdFx0cGF0dGVybjogL1xcP1tcXHdcXC0ufiEkJicoKSorLDs9JTpALz9dKi8sXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQncXVlcnktZGVsaW1pdGVyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXlxcPy8sXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdwYWlyLWRlbGltaXRlcic6IC9bJjtdLyxcblx0XHRcdCdwYWlyJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXltePV1bXFxzXFxTXSovLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQna2V5JzogL15bXj1dKy8sXG5cdFx0XHRcdFx0J3ZhbHVlJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogLyhePSlbXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J2F1dGhvcml0eSc6IHtcblx0XHRwYXR0ZXJuOiBSZWdFeHAoXG5cdFx0XHQvXlxcL1xcLy8uc291cmNlXG5cdFx0XHQvLyBbIHVzZXJpbmZvIFwiQFwiIF1cblx0XHRcdCsgLyg/OltcXHdcXC0ufiEkJicoKSorLDs9JTpdKkApPy8uc291cmNlXG5cdFx0XHQvLyBob3N0XG5cdFx0XHQrIChcblx0XHRcdFx0Jyg/Oidcblx0XHRcdFx0Ly8gSVAtbGl0ZXJhbFxuXHRcdFx0XHQrIC9cXFsoPzpbMC05YS1mQS1GOi5dezIsNDh9fHZbMC05YS1mQS1GXStcXC5bXFx3XFwtLn4hJCYnKCkqKyw7PV0rKVxcXS8uc291cmNlXG5cdFx0XHRcdCsgJ3wnXG5cdFx0XHRcdC8vIElQdjRhZGRyZXNzIG9yIHJlZ2lzdGVyZWQgbmFtZVxuXHRcdFx0XHQrIC9bXFx3XFwtLn4hJCYnKCkqKyw7PSVdKi8uc291cmNlXG5cdFx0XHRcdCsgJyknXG5cdFx0XHQpXG5cdFx0XHQvLyBbIFwiOlwiIHBvcnQgXVxuXHRcdFx0KyAvKD86OlxcZCopPy8uc291cmNlLFxuXHRcdFx0J20nXG5cdFx0KSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdhdXRob3JpdHktZGVsaW1pdGVyJzogL15cXC9cXC8vLFxuXHRcdFx0J3VzZXItaW5mby1zZWdtZW50Jzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvXltcXHdcXC0ufiEkJicoKSorLDs9JTpdKkAvLFxuXHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHQndXNlci1pbmZvLWRlbGltaXRlcic6IC9AJC8sXG5cdFx0XHRcdFx0J3VzZXItaW5mbyc6IC9eW1xcd1xcLS5+ISQmJygpKissOz0lOl0rL1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3BvcnQtc2VnbWVudCc6IHtcblx0XHRcdFx0cGF0dGVybjogLzpcXGQqJC8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdwb3J0LWRlbGltaXRlcic6IC9eOi8sXG5cdFx0XHRcdFx0J3BvcnQnOiAvXlxcZCsvXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQnaG9zdCc6IHtcblx0XHRcdFx0cGF0dGVybjogL1tcXHNcXFNdKy8sXG5cdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdCdpcC1saXRlcmFsJzoge1xuXHRcdFx0XHRcdFx0cGF0dGVybjogL15cXFtbXFxzXFxTXStcXF0kLyxcblx0XHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0XHQnaXAtbGl0ZXJhbC1kZWxpbWl0ZXInOiAvXlxcW3xcXF0kLyxcblx0XHRcdFx0XHRcdFx0J2lwdi1mdXR1cmUnOiAvXnZbXFxzXFxTXSsvLFxuXHRcdFx0XHRcdFx0XHQnaXB2Ni1hZGRyZXNzJzogL15bXFxzXFxTXSsvXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHQnaXB2NC1hZGRyZXNzJzogL14oPzooPzpbMDMtOV1cXGQ/fFsxMl1cXGR7MCwyfSlcXC4pezN9KD86WzAzLTldXFxkP3xbMTJdXFxkezAsMn0pJC9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0J3BhdGgnOiB7XG5cdFx0cGF0dGVybjogL15bXFx3XFwtLn4hJCYnKCkqKyw7PSU6QC9dKy9tLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3BhdGgtc2VwYXJhdG9yJzogL1xcLy9cblx0XHR9XG5cdH1cbn07XG5cblByaXNtLmxhbmd1YWdlcy51cmwgPSBQcmlzbS5sYW5ndWFnZXMudXJpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cdHZhciBpbnRlcnBvbGF0aW9uRXhwciA9IHtcblx0XHRwYXR0ZXJuOiAvW1xcc1xcU10rLyxcblx0XHRpbnNpZGU6IG51bGxcblx0fTtcblxuXHRQcmlzbS5sYW5ndWFnZXMudiA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ2NsaWtlJywge1xuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvcj8oW1wiJ10pKD86XFxcXCg/OlxcclxcbnxbXFxzXFxTXSl8KD8hXFwxKVteXFxcXFxcclxcbl0pKlxcMS8sXG5cdFx0XHRhbGlhczogJ3F1b3RlZC1zdHJpbmcnLFxuXHRcdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdpbnRlcnBvbGF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC8oKD86XnxbXlxcXFxdKSg/OlxcXFx7Mn0pKilcXCQoPzpcXHtbXnt9XSpcXH18XFx3Kyg/OlxcLlxcdysoPzpcXChbXlxcKFxcKV0qXFwpKT98XFxbW15cXFtcXF1dK1xcXSkqKS8sXG5cdFx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXZhcmlhYmxlJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcJFxcd1tcXHNcXFNdKiQvLFxuXHRcdFx0XHRcdFx0XHRhbGlhczogJ3ZhcmlhYmxlJ1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCdpbnRlcnBvbGF0aW9uLXB1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvXlxcJFxce3xcXH0kLyxcblx0XHRcdFx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnaW50ZXJwb2xhdGlvbi1leHByZXNzaW9uJzogaW50ZXJwb2xhdGlvbkV4cHJcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXHRcdCdjbGFzcy1uYW1lJzoge1xuXHRcdFx0cGF0dGVybjogLyhcXGIoPzplbnVtfGludGVyZmFjZXxzdHJ1Y3R8dHlwZSlcXHMrKSg/OkNcXC4pP1xcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiAvKD86XFxiKD86X19nbG9iYWx8YXN8YXNtfGFzc2VydHxhdG9taWN8YnJlYWt8Y2hhbnxjb25zdHxjb250aW51ZXxkZWZlcnxlbHNlfGVtYmVkfGVudW18Zm58Zm9yfGdvKD86dG8pP3xpZnxpbXBvcnR8aW58aW50ZXJmYWNlfGlzfGxvY2t8bWF0Y2h8bW9kdWxlfG11dHxub25lfG9yfHB1YnxyZXR1cm58cmxvY2t8c2VsZWN0fHNoYXJlZHxzaXplb2Z8c3RhdGljfHN0cnVjdHx0eXBlKD86b2YpP3x1bmlvbnx1bnNhZmUpfFxcJCg/OmVsc2V8Zm9yfGlmKXwjKD86ZmxhZ3xpbmNsdWRlKSlcXGIvLFxuXHRcdCdudW1iZXInOiAvXFxiKD86MHhbYS1mXFxkXSsoPzpfW2EtZlxcZF0rKSp8MGJbMDFdKyg/Ol9bMDFdKykqfDBvWzAtN10rKD86X1swLTddKykqfFxcZCsoPzpfXFxkKykqKD86XFwuXFxkKyg/Ol9cXGQrKSopPylcXGIvaSxcblx0XHQnb3BlcmF0b3InOiAvfnxcXD98WypcXC8lXiE9XT0/fFxcK1s9K10/fC1bPS1dP3xcXHxbPXxdP3wmKD86PXwmfFxcXj0/KT98Pig/Oj49P3w9KT98PCg/Ojw9P3w9fC0pP3w6PXxcXC5cXC5cXC4/Lyxcblx0XHQnYnVpbHRpbic6IC9cXGIoPzphbnkoPzpfZmxvYXR8X2ludCk/fGJvb2x8Ynl0ZSg/OnB0cik/fGNoYXJwdHJ8Zig/OjMyfDY0KXxpKD86OHwxNnw2NHwxMjh8bnQpfHJ1bmV8c2l6ZV90fHN0cmluZ3x1KD86MTZ8MzJ8NjR8MTI4KXx2b2lkcHRyKVxcYi9cblx0fSk7XG5cblx0aW50ZXJwb2xhdGlvbkV4cHIuaW5zaWRlID0gUHJpc20ubGFuZ3VhZ2VzLnY7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgndicsICdzdHJpbmcnLCB7XG5cdFx0J2NoYXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvYCg/OlxcXFxgfFxcXFw/W15gXXsxLDJ9KWAvLCAvLyB1c2luZyB7MSwyfSBpbnN0ZWFkIG9mIGB1YCBmbGFnIGZvciBjb21wYXRpYmlsaXR5XG5cdFx0XHRhbGlhczogJ3J1bmUnXG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCd2JywgJ29wZXJhdG9yJywge1xuXHRcdCdhdHRyaWJ1dGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF5bXFx0IF0qKVxcWyg/OmRlcHJlY2F0ZWR8ZGlyZWN0X2FycmF5X2FjY2Vzc3xmbGFnfGlubGluZXxsaXZlfHJlZl9vbmx5fHR5cGVkZWZ8dW5zYWZlX2ZufHdpbmRvd3Nfc3RkY2FsbClcXF0vbSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ2Fubm90YXRpb24nLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9bXFxbXFxdXS8sXG5cdFx0XHRcdCdrZXl3b3JkJzogL1xcdysvXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnZ2VuZXJpYyc6IHtcblx0XHRcdHBhdHRlcm46IC88XFx3Kz4oPz1cXHMqW1xcKVxce10pLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiAvWzw+XS8sXG5cdFx0XHRcdCdjbGFzcy1uYW1lJzogL1xcdysvXG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcblxuXHRQcmlzbS5sYW5ndWFnZXMuaW5zZXJ0QmVmb3JlKCd2JywgJ2Z1bmN0aW9uJywge1xuXHRcdCdnZW5lcmljLWZ1bmN0aW9uJzoge1xuXHRcdFx0Ly8gZS5nLiBmb288VD4oIC4uLlxuXHRcdFx0cGF0dGVybjogL1xcYlxcdytcXHMqPFxcdys+KD89XFwoKS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J2Z1bmN0aW9uJzogL15cXHcrLyxcblx0XHRcdFx0J2dlbmVyaWMnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLzxcXHcrPi8sXG5cdFx0XHRcdFx0aW5zaWRlOiBQcmlzbS5sYW5ndWFnZXMudi5nZW5lcmljLmluc2lkZVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLnZhbGEgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdjbGlrZScsIHtcblx0Ly8gQ2xhc3NlcyBjb3BpZWQgZnJvbSBwcmlzbS1jc2hhcnBcblx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0e1xuXHRcdFx0Ly8gKEZvbyBiYXIsIEJhciBiYXopXG5cdFx0XHRwYXR0ZXJuOiAvXFxiW0EtWl1cXHcqKD86XFwuXFx3KykqXFxiKD89KD86XFw/XFxzK3xcXCo/XFxzK1xcKj8pXFx3KS8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0cHVuY3R1YXRpb246IC9cXC4vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBbRm9vXVxuXHRcdFx0cGF0dGVybjogLyhcXFspW0EtWl1cXHcqKD86XFwuXFx3KykqXFxiLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0cHVuY3R1YXRpb246IC9cXC4vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBjbGFzcyBGb28gOiBCYXJcblx0XHRcdHBhdHRlcm46IC8oXFxiKD86Y2xhc3N8aW50ZXJmYWNlKVxccytbQS1aXVxcdyooPzpcXC5cXHcrKSpcXHMqOlxccyopW0EtWl1cXHcqKD86XFwuXFx3KykqXFxiLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0cHVuY3R1YXRpb246IC9cXC4vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHR7XG5cdFx0XHQvLyBjbGFzcyBGb29cblx0XHRcdHBhdHRlcm46IC8oKD86XFxiKD86Y2xhc3N8ZW51bXxpbnRlcmZhY2V8bmV3fHN0cnVjdClcXHMrKXwoPzpjYXRjaFxccytcXCgpKVtBLVpdXFx3Kig/OlxcLlxcdyspKlxcYi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdHB1bmN0dWF0aW9uOiAvXFwuL1xuXHRcdFx0fVxuXHRcdH1cblx0XSxcblx0J2tleXdvcmQnOiAvXFxiKD86YWJzdHJhY3R8YXN8YXNzZXJ0fGFzeW5jfGJhc2V8Ym9vbHxicmVha3xjYXNlfGNhdGNofGNoYXJ8Y2xhc3N8Y29uc3R8Y29uc3RydWN0fGNvbnRpbnVlfGRlZmF1bHR8ZGVsZWdhdGV8ZGVsZXRlfGRvfGRvdWJsZXxkeW5hbWljfGVsc2V8ZW5zdXJlc3xlbnVtfGVycm9yZG9tYWlufGV4dGVybnxmaW5hbGx5fGZsb2F0fGZvcnxmb3JlYWNofGdldHxpZnxpbnxpbmxpbmV8aW50fGludDE2fGludDMyfGludDY0fGludDh8aW50ZXJmYWNlfGludGVybmFsfGlzfGxvY2t8bG9uZ3xuYW1lc3BhY2V8bmV3fG51bGx8b3V0fG92ZXJyaWRlfG93bmVkfHBhcmFtc3xwcml2YXRlfHByb3RlY3RlZHxwdWJsaWN8cmVmfHJlcXVpcmVzfHJldHVybnxzZXR8c2hvcnR8c2lnbmFsfHNpemVvZnxzaXplX3R8c3NpemVfdHxzdGF0aWN8c3RyaW5nfHN0cnVjdHxzd2l0Y2h8dGhpc3x0aHJvd3x0aHJvd3N8dHJ5fHR5cGVvZnx1Y2hhcnx1aW50fHVpbnQxNnx1aW50MzJ8dWludDY0fHVpbnQ4fHVsb25nfHVuaWNoYXJ8dW5vd25lZHx1c2hvcnR8dXNpbmd8dmFsdWV8dmFyfHZpcnR1YWx8dm9pZHx2b2xhdGlsZXx3ZWFrfHdoaWxlfHlpZWxkKVxcYi9pLFxuXHQnZnVuY3Rpb24nOiAvXFxiXFx3Kyg/PVxccypcXCgpLyxcblx0J251bWJlcic6IC8oPzpcXGIweFtcXGRhLWZdK1xcYnwoPzpcXGJcXGQrKD86XFwuXFxkKik/fFxcQlxcLlxcZCspKD86ZVsrLV0/XFxkKyk/KSg/OmZ8dT9sPyk/L2ksXG5cdCdvcGVyYXRvcic6IC9cXCtcXCt8LS18JiZ8XFx8XFx8fDw8PT98Pj49P3w9PnwtPnx+fFsrXFwtKlxcLyUmXnw9ITw+XT0/fFxcP1xcPz98XFwuXFwuXFwuLyxcblx0J3B1bmN0dWF0aW9uJzogL1t7fVtcXF07KCksLjpdLyxcblx0J2NvbnN0YW50JzogL1xcYltBLVowLTlfXStcXGIvXG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgndmFsYScsICdzdHJpbmcnLCB7XG5cdCdyYXctc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlwiXCJbXFxzXFxTXSo/XCJcIlwiLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnXG5cdH0sXG5cdCd0ZW1wbGF0ZS1zdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL0BcIltcXHNcXFNdKj9cIi8sXG5cdFx0Z3JlZWR5OiB0cnVlLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXCQoPzpcXChbXildKlxcKXxbYS16QS1aXVxcdyopLyxcblx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0J2RlbGltaXRlcic6IHtcblx0XHRcdFx0XHRcdHBhdHRlcm46IC9eXFwkXFwoP3xcXCkkLyxcblx0XHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMudmFsYVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0J3N0cmluZyc6IC9bXFxzXFxTXSsvXG5cdFx0fVxuXHR9XG59KTtcblxuUHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgndmFsYScsICdrZXl3b3JkJywge1xuXHQncmVnZXgnOiB7XG5cdFx0cGF0dGVybjogL1xcLyg/OlxcWyg/OlteXFxdXFxcXFxcclxcbl18XFxcXC4pKlxcXXxcXFxcLnxbXi9cXFxcXFxbXFxyXFxuXSkrXFwvW2ltc3hdezAsNH0oPz1cXHMqKD86JHxbXFxyXFxuLC47fSlcXF1dKSkvLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdyZWdleC1zb3VyY2UnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eKFxcLylbXFxzXFxTXSsoPz1cXC9bYS16XSokKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGFsaWFzOiAnbGFuZ3VhZ2UtcmVnZXgnLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5yZWdleFxuXHRcdFx0fSxcblx0XHRcdCdyZWdleC1kZWxpbWl0ZXInOiAvXlxcLy8sXG5cdFx0XHQncmVnZXgtZmxhZ3MnOiAvXlthLXpdKyQvLFxuXHRcdH1cblx0fVxufSk7XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblx0UHJpc20ubGFuZ3VhZ2VzLnZlbG9jaXR5ID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnbWFya3VwJywge30pO1xuXG5cdHZhciB2ZWxvY2l0eSA9IHtcblx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSg/OlxcXFxcXFxcKSopXFwkIT8oPzpbYS16XVtcXHctXSooPzpcXChbXildKlxcKSk/KD86XFwuW2Etel1bXFx3LV0qKD86XFwoW14pXSpcXCkpP3xcXFtbXlxcXV0rXFxdKSp8XFx7W159XStcXH0pL2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7fSAvLyBTZWUgYmVsb3dcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXCJbXlwiXSpcInwnW14nXSonLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J251bWJlcic6IC9cXGJcXGQrXFxiLyxcblx0XHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdFx0J29wZXJhdG9yJzogL1s9ITw+XT0/fFsrKi8lLV18JiZ8XFx8XFx8fFxcLlxcLnxcXGIoPzplcXxnW2V0XXxsW2V0XXxuKD86ZXxvdCkpXFxiLyxcblx0XHQncHVuY3R1YXRpb24nOiAvWygpe31bXFxdOiwuXS9cblx0fTtcblxuXHR2ZWxvY2l0eS52YXJpYWJsZS5pbnNpZGUgPSB7XG5cdFx0J3N0cmluZyc6IHZlbG9jaXR5WydzdHJpbmcnXSxcblx0XHQnZnVuY3Rpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFteXFx3LV0pW2Etel1bXFx3LV0qKD89XFwoKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnbnVtYmVyJzogdmVsb2NpdHlbJ251bWJlciddLFxuXHRcdCdib29sZWFuJzogdmVsb2NpdHlbJ2Jvb2xlYW4nXSxcblx0XHQncHVuY3R1YXRpb24nOiB2ZWxvY2l0eVsncHVuY3R1YXRpb24nXVxuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3ZlbG9jaXR5JywgJ2NvbW1lbnQnLCB7XG5cdFx0J3VucGFyc2VkJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pI1xcW1xcW1tcXHNcXFNdKj9cXF1cXF0jLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWUsXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL14jXFxbXFxbfFxcXVxcXSMkL1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3ZlbG9jaXR5LWNvbW1lbnQnOiBbXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKSNcXCpbXFxzXFxTXSo/XFwqIy8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdjb21tZW50J1xuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFxcXF0pIyMuKi8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdFx0YWxpYXM6ICdjb21tZW50J1xuXHRcdFx0fVxuXHRcdF0sXG5cdFx0J2RpcmVjdGl2ZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXlxcXFxdKD86XFxcXFxcXFwpKikjQD8oPzpbYS16XVtcXHctXSp8XFx7W2Etel1bXFx3LV0qXFx9KSg/OlxccypcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKSk/L2ksXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdrZXl3b3JkJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9eI0A/KD86W2Etel1bXFx3LV0qfFxce1thLXpdW1xcdy1dKlxcfSl8XFxiaW5cXGIvLFxuXHRcdFx0XHRcdGluc2lkZToge1xuXHRcdFx0XHRcdFx0J3B1bmN0dWF0aW9uJzogL1t7fV0vXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHRyZXN0OiB2ZWxvY2l0eVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J3ZhcmlhYmxlJzogdmVsb2NpdHlbJ3ZhcmlhYmxlJ11cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnZlbG9jaXR5Wyd0YWcnXS5pbnNpZGVbJ2F0dHItdmFsdWUnXS5pbnNpZGUucmVzdCA9IFByaXNtLmxhbmd1YWdlcy52ZWxvY2l0eTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMudmVyaWxvZyA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogL1xcL1xcLy4qfFxcL1xcKltcXHNcXFNdKj9cXCpcXC8vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlxcXFwoPzpcXHJcXG58W1xcc1xcU10pfFteXCJcXFxcXFxyXFxuXSkqXCIvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2VybmVsLWZ1bmN0aW9uJzoge1xuXHRcdC8vIHN1cHBvcnQgZm9yIGFueSBrZXJuZWwgZnVuY3Rpb24gKGV4OiAkZGlzcGxheSgpKVxuXHRcdHBhdHRlcm46IC9cXEJcXCRcXHcrXFxiLyxcblx0XHRhbGlhczogJ3Byb3BlcnR5J1xuXHR9LFxuXHQvLyBzdXBwb3J0IGZvciB1c2VyIGRlZmluZWQgY29uc3RhbnRzIChleDogYGRlZmluZSlcblx0J2NvbnN0YW50JzogL1xcQmBcXHcrXFxiLyxcblx0J2Z1bmN0aW9uJzogL1xcYlxcdysoPz1cXCgpLyxcblx0Ly8gc3VwcG9ydCBmb3IgdmVyaWxvZyBhbmQgc3lzdGVtIHZlcmlsb2cga2V5d29yZHNcblx0J2tleXdvcmQnOiAvXFxiKD86YWxpYXN8YW5kfGFzc2VydHxhc3NpZ258YXNzdW1lfGF1dG9tYXRpY3xiZWZvcmV8YmVnaW58YmluZHxiaW5zfGJpbnNvZnxiaXR8YnJlYWt8YnVmfGJ1ZmlmMHxidWZpZjF8Ynl0ZXxjYXNlfGNhc2V4fGNhc2V6fGNlbGx8Y2hhbmRsZXxjbGFzc3xjbG9ja2luZ3xjbW9zfGNvbmZpZ3xjb25zdHxjb25zdHJhaW50fGNvbnRleHR8Y29udGludWV8Y292ZXJ8Y292ZXJncm91cHxjb3ZlcnBvaW50fGNyb3NzfGRlYXNzaWdufGRlZmF1bHR8ZGVmcGFyYW18ZGVzaWdufGRpc2FibGV8ZGlzdHxkb3xlZGdlfGVsc2V8ZW5kfGVuZGNhc2V8ZW5kY2xhc3N8ZW5kY2xvY2tpbmd8ZW5kY29uZmlnfGVuZGZ1bmN0aW9ufGVuZGdlbmVyYXRlfGVuZGdyb3VwfGVuZGludGVyZmFjZXxlbmRtb2R1bGV8ZW5kcGFja2FnZXxlbmRwcmltaXRpdmV8ZW5kcHJvZ3JhbXxlbmRwcm9wZXJ0eXxlbmRzZXF1ZW5jZXxlbmRzcGVjaWZ5fGVuZHRhYmxlfGVuZHRhc2t8ZW51bXxldmVudHxleHBlY3R8ZXhwb3J0fGV4dGVuZHN8ZXh0ZXJufGZpbmFsfGZpcnN0X21hdGNofGZvcnxmb3JjZXxmb3JlYWNofGZvcmV2ZXJ8Zm9ya3xmb3Jram9pbnxmdW5jdGlvbnxnZW5lcmF0ZXxnZW52YXJ8aGlnaHowfGhpZ2h6MXxpZnxpZmZ8aWZub25lfGlnbm9yZV9iaW5zfGlsbGVnYWxfYmluc3xpbXBvcnR8aW5jZGlyfGluY2x1ZGV8aW5pdGlhbHxpbm91dHxpbnB1dHxpbnNpZGV8aW5zdGFuY2V8aW50fGludGVnZXJ8aW50ZXJmYWNlfGludGVyc2VjdHxqb2lufGpvaW5fYW55fGpvaW5fbm9uZXxsYXJnZXxsaWJsaXN0fGxpYnJhcnl8bG9jYWx8bG9jYWxwYXJhbXxsb2dpY3xsb25naW50fG1hY3JvbW9kdWxlfG1hdGNoZXN8bWVkaXVtfG1vZHBvcnR8bW9kdWxlfG5hbmR8bmVnZWRnZXxuZXd8bm1vc3xub3J8bm9zaG93Y2FuY2VsbGVkfG5vdHxub3RpZjB8bm90aWYxfG51bGx8b3J8b3V0cHV0fHBhY2thZ2V8cGFja2VkfHBhcmFtZXRlcnxwbW9zfHBvc2VkZ2V8cHJpbWl0aXZlfHByaW9yaXR5fHByb2dyYW18cHJvcGVydHl8cHJvdGVjdGVkfHB1bGwwfHB1bGwxfHB1bGxkb3dufHB1bGx1cHxwdWxzZXN0eWxlX29uZGV0ZWN0fHB1bHNlc3R5bGVfb25ldmVudHxwdXJlfHJhbmR8cmFuZGN8cmFuZGNhc2V8cmFuZHNlcXVlbmNlfHJjbW9zfHJlYWx8cmVhbHRpbWV8cmVmfHJlZ3xyZWxlYXNlfHJlcGVhdHxyZXR1cm58cm5tb3N8cnBtb3N8cnRyYW58cnRyYW5pZjB8cnRyYW5pZjF8c2NhbGFyZWR8c2VxdWVuY2V8c2hvcnRpbnR8c2hvcnRyZWFsfHNob3djYW5jZWxsZWR8c2lnbmVkfHNtYWxsfHNvbHZlfHNwZWNpZnl8c3BlY3BhcmFtfHN0YXRpY3xzdHJpbmd8c3Ryb25nMHxzdHJvbmcxfHN0cnVjdHxzdXBlcnxzdXBwbHkwfHN1cHBseTF8dGFibGV8dGFnZ2VkfHRhc2t8dGhpc3x0aHJvdWdob3V0fHRpbWV8dGltZXByZWNpc2lvbnx0aW1ldW5pdHx0cmFufHRyYW5pZjB8dHJhbmlmMXx0cml8dHJpMHx0cmkxfHRyaWFuZHx0cmlvcnx0cmlyZWd8dHlwZXx0eXBlZGVmfHVuaW9ufHVuaXF1ZXx1bnNpZ25lZHx1c2V8dXdpcmV8dmFyfHZlY3RvcmVkfHZpcnR1YWx8dm9pZHx3YWl0fHdhaXRfb3JkZXJ8d2FuZHx3ZWFrMHx3ZWFrMXx3aGlsZXx3aWxkY2FyZHx3aXJlfHdpdGh8d2l0aGlufHdvcnx4bm9yfHhvcilcXGIvLFxuXHQvLyBib2xkIGhpZ2hsaWdodGluZyBmb3IgYWxsIHZlcmlsb2cgYW5kIHN5c3RlbSB2ZXJpbG9nIGxvZ2ljIGJsb2Nrc1xuXHQnaW1wb3J0YW50JzogL1xcYig/OmFsd2F5c3xhbHdheXNfY29tYnxhbHdheXNfZmZ8YWx3YXlzX2xhdGNoKVxcYig/OiAqQCk/Lyxcblx0Ly8gc3VwcG9ydCBmb3IgdGltZSB0aWNrcywgdmVjdG9ycywgYW5kIHJlYWwgbnVtYmVyc1xuXHQnbnVtYmVyJzogL1xcQiMjP1xcZCt8KD86XFxiXFxkKyk/J1tvZGJoXSA/W1xcZGEtZnp4Xz9dK3xcXGIoPzpcXGQqWy5fXSk/XFxkKyg/OmVbLStdP1xcZCspPy9pLFxuXHQnb3BlcmF0b3InOiAvWy0re31efiUqXFwvPz0hPD4mfF0rLyxcblx0J3B1bmN0dWF0aW9uJzogL1tbXFxdOygpLC46XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy52aGRsID0ge1xuXHQnY29tbWVudCc6IC8tLS4rLyxcblx0Ly8gc3VwcG9ydCBmb3IgYWxsIGxvZ2ljIHZlY3RvcnNcblx0J3ZoZGwtdmVjdG9ycyc6IHtcblx0XHQncGF0dGVybic6IC9cXGJbb3hiXVwiW1xcZGEtZl9dK1wifFwiWzAxdXh6d2xoLV0rXCIvaSxcblx0XHQnYWxpYXMnOiAnbnVtYmVyJ1xuXHR9LFxuXHQvLyBzdXBwb3J0IGZvciBvcGVyYXRvciBvdmVybG9hZGluZyBpbmNsdWRlZFxuXHQncXVvdGVkLWZ1bmN0aW9uJzoge1xuXHRcdHBhdHRlcm46IC9cIlxcUys/XCIoPz1cXCgpLyxcblx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHR9LFxuXHQnc3RyaW5nJzogL1wiKD86W15cXFxcXCJcXHJcXG5dfFxcXFwoPzpcXHJcXG58W1xcc1xcU10pKSpcIi8sXG5cdCdhdHRyaWJ1dGUnOiB7XG5cdFx0cGF0dGVybjogL1xcYidcXHcrLyxcblx0XHRhbGlhczogJ2F0dHItbmFtZSdcblx0fSxcblx0Ly8gc3VwcG9ydCBmb3IgcHJlZGVmaW5lZCBhdHRyaWJ1dGVzIGluY2x1ZGVkXG5cdCdrZXl3b3JkJzogL1xcYig/OmFjY2Vzc3xhZnRlcnxhbGlhc3xhbGx8YXJjaGl0ZWN0dXJlfGFycmF5fGFzc2VydHxhdHRyaWJ1dGV8YmVnaW58YmxvY2t8Ym9keXxidWZmZXJ8YnVzfGNhc2V8Y29tcG9uZW50fGNvbmZpZ3VyYXRpb258Y29uc3RhbnR8ZGlzY29ubmVjdHxkb3dudG98ZWxzZXxlbHNpZnxlbmR8ZW50aXR5fGV4aXR8ZmlsZXxmb3J8ZnVuY3Rpb258Z2VuZXJhdGV8Z2VuZXJpY3xncm91cHxndWFyZGVkfGlmfGltcHVyZXxpbnxpbmVydGlhbHxpbm91dHxpc3xsYWJlbHxsaWJyYXJ5fGxpbmthZ2V8bGl0ZXJhbHxsb29wfG1hcHxuZXd8bmV4dHxudWxsfG9mfG9ufG9wZW58b3RoZXJzfG91dHxwYWNrYWdlfHBvcnR8cG9zdHBvbmVkfHByaXZhdGV8cHJvY2VkdXJlfHByb2Nlc3N8cHVyZXxyYW5nZXxyZWNvcmR8cmVnaXN0ZXJ8cmVqZWN0fHJlcG9ydHxyZXR1cm58c2VsZWN0fHNldmVyaXR5fHNoYXJlZHxzaWduYWx8c3VidHlwZXx0aGVufHRvfHRyYW5zcG9ydHx0eXBlfHVuYWZmZWN0ZWR8dW5pdHN8dW50aWx8dXNlfHZhcmlhYmxlfHZpZXd8d2FpdHx3aGVufHdoaWxlfHdpdGgpXFxiL2ksXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiL2ksXG5cdCdmdW5jdGlvbic6IC9cXHcrKD89XFwoKS8sXG5cdC8vIGRlY2ltYWwsIGJhc2VkLCBwaHlzaWNhbCwgYW5kIGV4cG9uZW50aWFsIG51bWJlcnMgc3VwcG9ydGVkXG5cdCdudW1iZXInOiAvJ1swMXV4endsaC1dJ3xcXGIoPzpcXGQrI1tcXGRhLWZfLl0rI3xcXGRbXFxkXy5dKikoPzplWy0rXT9cXGQrKT8vaSxcblx0J29wZXJhdG9yJzogL1s8Pl09P3w6PXxbLSsqLyY9XXxcXGIoPzphYnN8YW5kfG1vZHxuYW5kfG5vcnxub3R8b3J8cmVtfHJvbHxyb3J8c2xhfHNsbHxzcmF8c3JsfHhub3J8eG9yKVxcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXTsoKSwuOl0vXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMudmltID0ge1xuXHQnc3RyaW5nJzogL1wiKD86W15cIlxcXFxcXHJcXG5dfFxcXFwuKSpcInwnKD86W14nXFxyXFxuXXwnJykqJy8sXG5cdCdjb21tZW50JzogL1wiLiovLFxuXHQnZnVuY3Rpb24nOiAvXFxiXFx3Kyg/PVxcKCkvLFxuXHQna2V5d29yZCc6IC9cXGIoPzpOfE5leHR8UHxQcmludHxYfFhNTGVudHxYTUxuc3xhYnxhYmJyZXZpYXRlfGFiY3xhYmNsZWFyfGFib3xhYm92ZWxlZnR8YWx8YWxsfGFyfGFyZ2F8YXJnYWRkfGFyZ2R8YXJnZGVsZXRlfGFyZ2RvfGFyZ2V8YXJnZWRpdHxhcmdnfGFyZ2dsb2JhbHxhcmdsfGFyZ2xvY2FsfGFyZ3N8YXJndXxhcmd1bWVudHxhc3xhc2NpaXxifGJOfGJOZXh0fGJhfGJhZHxiYWRkfGJhbGx8YmR8YmRlbGV0ZXxiZXxiZWx8YmVsb3dyaWdodHxiZnxiZmlyc3R8Ymx8Ymxhc3R8Ym18Ym1vZGlmaWVkfGJufGJuZXh0fGJvfGJvdHJpZ2h0fGJwfGJwcmV2aW91c3xicnxicmVhfGJyZWFrfGJyZWFrYXxicmVha2FkZHxicmVha2R8YnJlYWtkZWx8YnJlYWtsfGJyZWFrbGlzdHxicmV3aW5kfGJyb3xicm93c2V8YnVmZG98YnVmZmVyfGJ1ZmZlcnN8YnVufGJ1bmxvYWR8Ynd8YndpcGVvdXR8Y3xjTnxjTmV4dHxjTmZjTmZpbGV8Y2F8Y2FiYnJldnxjYWJjfGNhYmNsZWFyfGNhZHxjYWRkYnxjYWRkYnVmZmVyfGNhZGRleHByfGNhZGRmfGNhZGRmaWxlfGNhbHxjYWxsfGNhdHxjYXRjaHxjYnxjYnVmZmVyfGNjfGNjbHxjY2xvc2V8Y2R8Y2V8Y2VudGVyfGNleHxjZXhwcnxjZnxjZmlsZXxjZmlyfGNmaXJzdHxjZ3xjZ2V0YnxjZ2V0YnVmZmVyfGNnZXRlfGNnZXRleHByfGNnZXRmaWxlfGNoYW5nZXxjaGFuZ2VzfGNoZHxjaGRpcnxjaGV8Y2hlY2twYXRofGNoZWNrdHxjaGVja3RpbWV8Y2x8Y2xhfGNsYXN0fGNsaXN0fGNsb3xjbG9zZXxjbWFwY3xjbWFwY2xlYXJ8Y258Y25ld3xjbmV3ZXJ8Y25leHR8Y25mfGNuZmlsZXxjbm9yZWF8Y25vcmVhYmJyZXZ8Y298Y29sfGNvbGRlcnxjb2xvfGNvbG9yc2NoZW1lfGNvbWN8Y29tY2xlYXJ8Y29tcHxjb21waWxlcnxjb258Y29uZnxjb25maXJtfGNvbnRpbnVlfGNvcGV8Y29wZW58Y29weXxjcHxjcGZ8Y3BmaWxlfGNwcmV2aW91c3xjcXxjcXVpdHxjcnxjcmV3aW5kfGN1fGN1bmF8Y3VuYWJicmV2fGN1bm1hcHxjd3xjd2luZG93fGR8ZGVidWdnfGRlYnVnZ3JlZWR5fGRlbGN8ZGVsY29tbWFuZHxkZWxldGV8ZGVsZnxkZWxmdW5jdGlvbnxkZWxtfGRlbG1hcmtzfGRpfGRpZmZnfGRpZmZnZXR8ZGlmZm9mZnxkaWZmcGF0Y2h8ZGlmZnB1fGRpZmZwdXR8ZGlmZnNwbGl0fGRpZmZ0aGlzfGRpZmZ1fGRpZmZ1cGRhdGV8ZGlnfGRpZ3JhcGhzfGRpc3BsYXl8ZGp8ZGp1bXB8ZGx8ZGxpc3R8ZHJ8ZHJvcHxkc3xkc2VhcmNofGRzcHxkc3BsaXR8ZXxlYXJsaWVyfGVjaG9lfGVjaG9lcnJ8ZWNob218ZWNob21zZ3xlY2hvbnxlZGl0fGVsfGVsc2V8ZWxzZWl8ZWxzZWlmfGVtfGVtZW51fGVufGVuZGZ8ZW5kZm98ZW5kZm9yfGVuZGZ1bnxlbmRmdW5jdGlvbnxlbmRpZnxlbmR0fGVuZHRyeXxlbmR3fGVuZHdoaWxlfGVuZXxlbmV3fGV4fGV4aXxleGl0fGV4dXxleHVzYWdlfGZ8ZmlsZXxmaWxlc3xmaWxldHlwZXxmaW58ZmluYXxmaW5hbGx5fGZpbmR8ZmluaXxmaW5pc2h8ZmlyfGZpcnN0fGZpeHxmaXhkZWx8Zm98Zm9sZHxmb2xkY3xmb2xkY2xvc2V8Zm9sZGR8Zm9sZGRvY3xmb2xkZG9jbG9zZWR8Zm9sZGRvb3Blbnxmb2xkb3xmb2xkb3Blbnxmb3J8ZnV8ZnVufGZ1bmN0aW9ufGdvfGdvdG98Z3J8Z3JlcHxncmVwYXxncmVwYWRkfGh8aGF8aGFyZGNvcHl8aGVscHxoZWxwZnxoZWxwZmluZHxoZWxwZ3xoZWxwZ3JlcHxoZWxwdHxoZWxwdGFnc3xoaWR8aGlkZXxoaXN8aGlzdG9yeXxpYXxpYWJicmV2fGlhYmN8aWFiY2xlYXJ8aWZ8aWp8aWp1bXB8aWx8aWxpc3R8aW1hcGN8aW1hcGNsZWFyfGlufGlub3JlYXxpbm9yZWFiYnJldnxpc2VhcmNofGlzcHxpc3BsaXR8aXV8aXVuYXxpdW5hYmJyZXZ8aXVubWFwfGp8am9pbnxqdXxqdW1wc3xrfGtlZXxrZWVwYWx0fGtlZXBqfGtlZXBqdW1wc3xrZWVwbWFya3N8bHxsTnxsTmV4dHxsTmZ8bE5maWxlfGxhfGxhZHxsYWRkYnxsYWRkYnVmZmVyfGxhZGRleHByfGxhZGRmfGxhZGRmaWxlfGxhbnxsYW5ndWFnZXxsYXN0fGxhdGVyfGxifGxidWZmZXJ8bGN8bGNkfGxjaHxsY2hkaXJ8bGNsfGxjbG9zZXxsZWZ0fGxlZnRhfGxlZnRhYm92ZXxsZXR8bGV4fGxleHByfGxmfGxmaWxlfGxmaXJ8bGZpcnN0fGxnfGxnZXRifGxnZXRidWZmZXJ8bGdldGV8bGdldGV4cHJ8bGdldGZpbGV8bGdyfGxncmVwfGxncmVwYXxsZ3JlcGFkZHxsaHxsaGVscGdyZXB8bGlzdHxsbHxsbGF8bGxhc3R8bGxpfGxsaXN0fGxtfGxtYWt8bG1ha2V8bG1hcHxsbWFwY3xsbWFwY2xlYXJ8bG58bG5lfGxuZXd8bG5ld2VyfGxuZXh0fGxuZnxsbmZpbGV8bG5vcmVtYXB8bG98bG9hZHZpZXd8bG9jfGxvY2ttYXJrc3xsb2Nrdnxsb2NrdmFyfGxvbHxsb2xkZXJ8bG9wfGxvcGVufGxwfGxwZnxscGZpbGV8bHByZXZpb3VzfGxyfGxyZXdpbmR8bHN8bHR8bHRhZ3xsdXxsdW5tYXB8bHZ8bHZpbWdyZXB8bHZpbWdyZXBhfGx2aW1ncmVwYWRkfGx3fGx3aW5kb3d8bXxtYXxtYWt8bWFrZXxtYXJrfG1hcmtzfG1hdHxtYXRjaHxtZW51dHxtZW51dHJhbnNsYXRlfG1rfG1rZXhyY3xta3N8bWtzZXNzaW9ufG1rc3B8bWtzcGVsbHxta3Z8bWt2aWV8bWt2aWV3fG1rdmltcmN8bW9kfG1vZGV8bW92ZXxtenxtemZ8bXpmaWxlfG16c2NoZW1lfG58bmJrZXl8bmV3fG5leHR8bm1hcGN8bm1hcGNsZWFyfG5vaHxub2hsc2VhcmNofG5vcmVhfG5vcmVhYmJyZXZ8bnV8bnVtYmVyfG51bnxudW5tYXB8b3xvbWFwY3xvbWFwY2xlYXJ8b258b25seXxvcGVufG9wdHxvcHRpb25zfG91fG91bm1hcHxwfHBjfHBjbG9zZXxwZXxwZWR8cGVkaXR8cGVybHxwZXJsZHxwZXJsZG98cG98cG9wfHBvcHV8cG9wdXB8cHB8cHBvcHxwcmV8cHJlc2VydmV8cHJldnxwcmV2aW91c3xwcmludHxwcm9mfHByb2ZkfHByb2ZkZWx8cHJvZmlsZXxwcm9tcHRmfHByb21wdGZpbmR8cHJvbXB0cnxwcm9tcHRyZXBsfHBzfHBzZWFyY2h8cHROfHB0TmV4dHxwdGF8cHRhZ3xwdGZ8cHRmaXJzdHxwdGp8cHRqdW1wfHB0bHxwdGxhc3R8cHRufHB0bmV4dHxwdHB8cHRwcmV2aW91c3xwdHJ8cHRyZXdpbmR8cHRzfHB0c2VsZWN0fHB1fHB1dHxwd3xwd2R8cHl8cHlmfHB5ZmlsZXxweXRob258cXxxYXxxYWxsfHF1aXR8cXVpdGF8cXVpdGFsbHxyfHJlYWR8cmVjfHJlY292ZXJ8cmVkfHJlZGl8cmVkaXJ8cmVkb3xyZWRyfHJlZHJhd3xyZWRyYXdzfHJlZHJhd3N0YXR1c3xyZWd8cmVnaXN0ZXJzfHJlc3xyZXNpemV8cmV0fHJldGFifHJldHV8cmV0dXJufHJld3xyZXdpbmR8cml8cmlnaHR8cmlnaHRifHJpZ2h0YmVsb3d8cnV8cnVifHJ1Ynl8cnVieWR8cnVieWRvfHJ1YnlmfHJ1YnlmaWxlfHJ1bnRpbWV8cnZ8cnZpbWluZm98c058c05leHR8c2F8c2FsfHNhbGx8c2FufHNhbmRib3h8c2FyZ3VtZW50fHNhdnxzYXZlYXN8c2J8c2JOfHNiTmV4dHxzYmF8c2JhbGx8c2JmfHNiZmlyc3R8c2JsfHNibGFzdHxzYm18c2Jtb2RpZmllZHxzYm58c2JuZXh0fHNicHxzYnByZXZpb3VzfHNicnxzYnJld2luZHxzYnVmZmVyfHNjcmlwfHNjcmlwdGV8c2NyaXB0ZW5jb2Rpbmd8c2NyaXB0bmFtZXN8c2V8c2V0fHNldGZ8c2V0ZmlsZXR5cGV8c2V0Z3xzZXRnbG9iYWx8c2V0bHxzZXRsb2NhbHxzZnxzZmluZHxzZmlyfHNmaXJzdHxzaHxzaGVsbHxzaWdufHNpbHxzaWxlbnR8c2ltfHNpbWFsdHxzbHxzbGF8c2xhc3R8c2xlZXB8c218c21hZ2ljfHNtYXB8c21hcGN8c21hcGNsZWFyfHNtZXxzbWVudXxzbnxzbmV4dHxzbml8c25pZmZ8c25vfHNub21hZ2ljfHNub3J8c25vcmVtYXB8c25vcmVtZXxzbm9yZW1lbnV8c298c29yfHNvcnR8c291cmNlfHNwfHNwZXxzcGVsbGR8c3BlbGxkdW1wfHNwZWxsZ29vZHxzcGVsbGl8c3BlbGxpbmZvfHNwZWxscnxzcGVsbHJlcGFsbHxzcGVsbHV8c3BlbGx1bmRvfHNwZWxsd3xzcGVsbHdyb25nfHNwbGl0fHNwcnxzcHJldmlvdXN8c3JlfHNyZXdpbmR8c3R8c3RhfHN0YWd8c3RhcnxzdGFydGd8c3RhcnRncmVwbGFjZXxzdGFydGluc2VydHxzdGFydHJ8c3RhcnRyZXBsYWNlfHN0anxzdGp1bXB8c3RvcHxzdG9waXxzdG9waW5zZXJ0fHN0c3xzdHNlbGVjdHxzdW58c3VuaGlkZXxzdW5tfHN1bm1hcHxzdXN8c3VzcGVuZHxzdnxzdmlld3xzeW5jYmluZHx0fHROfHROZXh0fHRhfHRhYnx0YWJOfHRhYk5leHR8dGFiY3x0YWJjbG9zZXx0YWJkfHRhYmRvfHRhYmV8dGFiZWRpdHx0YWJmfHRhYmZpbmR8dGFiZmlyfHRhYmZpcnN0fHRhYmx8dGFibGFzdHx0YWJtfHRhYm1vdmV8dGFibnx0YWJuZXd8dGFibmV4dHx0YWJvfHRhYm9ubHl8dGFicHx0YWJwcmV2aW91c3x0YWJyfHRhYnJld2luZHx0YWJzfHRhZ3x0YWdzfHRjfHRjbHx0Y2xkfHRjbGRvfHRjbGZ8dGNsZmlsZXx0ZXx0ZWFyb2ZmfHRmfHRmaXJzdHx0aHx0aHJvd3x0anx0anVtcHx0bHx0bGFzdHx0bXx0bWVudXx0bnx0bmV4dHx0b3x0b3BsZWZ0fHRwfHRwcmV2aW91c3x0cnx0cmV3aW5kfHRyeXx0c3x0c2VsZWN0fHR1fHR1bm1lbnV8dXx1bmF8dW5hYmJyZXZpYXRlfHVuZG98dW5kb2p8dW5kb2pvaW58dW5kb2x8dW5kb2xpc3R8dW5ofHVuaGlkZXx1bmxldHx1bmxvfHVubG9ja3Zhcnx1bm18dW5tYXB8dXB8dXBkYXRlfHZlfHZlcmJ8dmVyYm9zZXx2ZXJzaW9ufHZlcnR8dmVydGljYWx8dml8dmllfHZpZXd8dmltfHZpbWdyZXB8dmltZ3JlcGF8dmltZ3JlcGFkZHx2aXN1YWx8dml1fHZpdXNhZ2V8dm1hcGN8dm1hcGNsZWFyfHZuZXx2bmV3fHZzfHZzcGxpdHx2dXx2dW5tYXB8d3x3Tnx3TmV4dHx3YXx3YWxsfHdofHdoaWxlfHdpbnx3aW5jfHdpbmNtZHx3aW5kb3x3aW5wfHdpbnBvc3x3aW5zaXplfHdufHduZXh0fHdwfHdwcmV2aW91c3x3cXx3cWF8d3FhbGx8d3JpdGV8d3N8d3N2ZXJifHd2fHd2aW1pbmZvfHh8eGF8eGFsbHx4aXR8eG18eG1hcHx4bWFwY3x4bWFwY2xlYXJ8eG1lfHhtZW51fHhufHhub3JlbWFwfHhub3JlbWV8eG5vcmVtZW51fHh1fHh1bm1hcHx5fHlhbmspXFxiLyxcblx0J2J1aWx0aW4nOiAvXFxiKD86YWNkfGFpfGFrbXxhbGVwaHxhbGxvd3Jldmluc3xhbHRrZXltYXB8YW1iaXdpZHRofGFtYnd8YW50aXxhbnRpYWxpYXN8YXJhYnxhcmFiaWN8YXJhYmljc2hhcGV8YXJpfGFyc2hhcGV8YXV0b2NoZGlyfGF1dG9jbWR8YXV0b2luZGVudHxhdXRvcmVhZHxhdXRvd3JpdGV8YXV0b3dyaXRlYWxsfGF3fGF3YXxiYWNrZ3JvdW5kfGJhY2tzcGFjZXxiYWNrdXB8YmFja3VwY29weXxiYWNrdXBkaXJ8YmFja3VwZXh0fGJhY2t1cHNraXB8YmFsbG9vbmRlbGF5fGJhbGxvb25ldmFsfGJhbGxvb25leHByfGJkaXJ8YmRsYXl8YmV2YWx8YmV4fGJleHByfGJnfGJofGJpbnxiaW5hcnl8Ymlvc2t8Ymlvc2tleXxia3xia2N8Ym9tYnxicmVha2F0fGJya3xicm93c2VkaXJ8YnN8YnNkaXJ8YnNrfGJ0fGJ1ZmhpZGRlbnxidWZsaXN0ZWR8YnVmdHlwZXxjYXNlbWFwfGNjdnxjZHBhdGh8Y2VkaXR8Y2Z1fGNofGNoYXJjb252ZXJ0fGNpfGNpbnxjaW5kZW50fGNpbmt8Y2lua2V5c3xjaW5vfGNpbm9wdGlvbnN8Y2lud3xjaW53b3Jkc3xjbGlwYm9hcmR8Y21kaGVpZ2h0fGNtZHdpbmhlaWdodHxjbXB8Y21zfGNvbHVtbnN8Y29tfGNvbW1lbnRzfGNvbW1lbnRzdHJpbmd8Y29tcGF0aWJsZXxjb21wbGV0ZXxjb21wbGV0ZWZ1bmN8Y29tcGxldGVvcHR8Y29uc2t8Y29uc2tleXxjb3B5aW5kZW50fGNvdHxjcG98Y3BvcHRpb25zfGNwdHxjc2NvcGVwYXRoY29tcHxjc2NvcGVwcmd8Y3Njb3BlcXVpY2tmaXh8Y3Njb3BldGFnfGNzY29wZXRhZ29yZGVyfGNzY29wZXZlcmJvc2V8Y3NwY3xjc3ByZ3xjc3FmfGNzdHxjc3RvfGNzdmVyYnxjdWN8Y3VsfGN1cnNvcmNvbHVtbnxjdXJzb3JsaW5lfGN3aHxkZWJ1Z3xkZWNvfGRlZnxkZWZpbmV8ZGVsY29tYmluZXxkZXh8ZGd8ZGljdHxkaWN0aW9uYXJ5fGRpZmZ8ZGlmZmV4cHJ8ZGlmZm9wdHxkaWdyYXBofGRpcHxkaXJ8ZGlyZWN0b3J5fGR5fGVhfGVhZHxlYWRpcmVjdGlvbnxlYnxlZHxlZGNvbXBhdGlibGV8ZWZ8ZWZtfGVpfGVrfGVuY3xlbmNvZGluZ3xlbmRvZmxpbmV8ZW9sfGVwfGVxdWFsYWx3YXlzfGVxdWFscHJnfGVycm9yYmVsbHN8ZXJyb3JmaWxlfGVycm9yZm9ybWF0fGVzY2tleXN8ZXR8ZXZlbnRpZ25vcmV8ZXhwYW5kdGFifGV4cmN8ZmNsfGZjc3xmZGN8ZmRlfGZkaXxmZGx8ZmRsc3xmZG18ZmRufGZkb3xmZHR8ZmVufGZlbmN8ZmVuY3N8ZmV4fGZmfGZmc3xmaWxlZW5jb2Rpbmd8ZmlsZWVuY29kaW5nc3xmaWxlZm9ybWF0fGZpbGVmb3JtYXRzfGZpbGxjaGFyc3xma3xma21hcHxmbHB8Zm1sfGZtcnxmb2xkY29sdW1ufGZvbGRlbmFibGV8Zm9sZGV4cHJ8Zm9sZGlnbm9yZXxmb2xkbGV2ZWx8Zm9sZGxldmVsc3RhcnR8Zm9sZG1hcmtlcnxmb2xkbWV0aG9kfGZvbGRtaW5saW5lc3xmb2xkbmVzdG1heHxmb2xkdGV4dHxmb3JtYXRleHByfGZvcm1hdGxpc3RwYXR8Zm9ybWF0b3B0aW9uc3xmb3JtYXRwcmd8ZnB8ZnN8ZnN5bmN8ZnR8Z2NyfGdkfGdkZWZhdWx0fGdmbXxnZm58Z2ZzfGdmd3xnaHJ8Z3B8Z3JlcGZvcm1hdHxncmVwcHJnfGd0bHxndHR8Z3VpY3Vyc29yfGd1aWZvbnR8Z3VpZm9udHNldHxndWlmb250d2lkZXxndWloZWFkcm9vbXxndWlvcHRpb25zfGd1aXB0eXxndWl0YWJsYWJlbHxndWl0YWJ0b29sdGlwfGhlbHBmaWxlfGhlbHBoZWlnaHR8aGVscGxhbmd8aGZ8aGh8aGl8aGlkZGVufGhpZ2hsaWdodHxoa3xoa21hcHxoa21hcHB8aGtwfGhsfGhsZ3xobHN8aGxzZWFyY2h8aWN8aWNvbnxpY29uc3RyaW5nfGlnbm9yZWNhc2V8aW18aW1hY3RpdmF0ZWtleXxpbWFrfGltY3xpbWNtZGxpbmV8aW1kfGltZGlzYWJsZXxpbWl8aW1pbnNlcnR8aW1zfGltc2VhcmNofGluY3xpbmNsdWRlfGluY2x1ZGVleHByfGluY3NlYXJjaHxpbmRlfGluZGVudGV4cHJ8aW5kZW50a2V5c3xpbmRrfGluZXh8aW5mfGluZmVyY2FzZXxpbnNlcnRtb2RlfGludmFjZHxpbnZhaXxpbnZha218aW52YWxsb3dyZXZpbnN8aW52YWx0a2V5bWFwfGludmFudGl8aW52YW50aWFsaWFzfGludmFyfGludmFyYWJ8aW52YXJhYmljfGludmFyYWJpY3NoYXBlfGludmFyaXxpbnZhcnNoYXBlfGludmF1dG9jaGRpcnxpbnZhdXRvaW5kZW50fGludmF1dG9yZWFkfGludmF1dG93cml0ZXxpbnZhdXRvd3JpdGVhbGx8aW52YXd8aW52YXdhfGludmJhY2t1cHxpbnZiYWxsb29uZXZhbHxpbnZiZXZhbHxpbnZiaW58aW52YmluYXJ5fGludmJpb3NrfGludmJpb3NrZXl8aW52Ymt8aW52Ymx8aW52Ym9tYnxpbnZidWZsaXN0ZWR8aW52Y2Z8aW52Y2l8aW52Y2lufGludmNpbmRlbnR8aW52Y29tcGF0aWJsZXxpbnZjb25maXJtfGludmNvbnNrfGludmNvbnNrZXl8aW52Y29weWluZGVudHxpbnZjcHxpbnZjc2NvcGV0YWd8aW52Y3Njb3BldmVyYm9zZXxpbnZjc3R8aW52Y3N2ZXJifGludmN1Y3xpbnZjdWx8aW52Y3Vyc29yY29sdW1ufGludmN1cnNvcmxpbmV8aW52ZGVjb3xpbnZkZWxjb21iaW5lfGludmRnfGludmRpZmZ8aW52ZGlncmFwaHxpbnZkaXNhYmxlfGludmVhfGludmVifGludmVkfGludmVkY29tcGF0aWJsZXxpbnZla3xpbnZlbmRvZmxpbmV8aW52ZW9sfGludmVxdWFsYWx3YXlzfGludmVycm9yYmVsbHN8aW52ZXNja2V5c3xpbnZldHxpbnZleHxpbnZleHBhbmR0YWJ8aW52ZXhyY3xpbnZmZW58aW52Zmt8aW52ZmttYXB8aW52Zm9sZGVuYWJsZXxpbnZnZHxpbnZnZGVmYXVsdHxpbnZndWlwdHl8aW52aGlkfGludmhpZGRlbnxpbnZoa3xpbnZoa21hcHxpbnZoa21hcHB8aW52aGtwfGludmhsc3xpbnZobHNlYXJjaHxpbnZpY3xpbnZpY29ufGludmlnbm9yZWNhc2V8aW52aW18aW52aW1jfGludmltY21kbGluZXxpbnZpbWR8aW52aW5jc2VhcmNofGludmluZnxpbnZpbmZlcmNhc2V8aW52aW5zZXJ0bW9kZXxpbnZpc3xpbnZqb2luc3BhY2VzfGludmpzfGludmxhenlyZWRyYXd8aW52bGJyfGludmxpbmVicmVha3xpbnZsaXNwfGludmxpc3R8aW52bG9hZHBsdWdpbnN8aW52bHBsfGludmx6fGludm1hfGludm1hY2F0c3VpfGludm1hZ2ljfGludm1ofGludm1sfGludm1vZHxpbnZtb2RlbGluZXxpbnZtb2RpZmlhYmxlfGludm1vZGlmaWVkfGludm1vcmV8aW52bW91c2VmfGludm1vdXNlZm9jdXN8aW52bW91c2VoaWRlfGludm51fGludm51bWJlcnxpbnZvZGV2fGludm9wZW5kZXZpY2V8aW52cGFzdGV8aW52cGl8aW52cHJlc2VydmVpbmRlbnR8aW52cHJldmlld3dpbmRvd3xpbnZwcm9tcHR8aW52cHZ3fGludnJlYWRvbmx5fGludnJlbWFwfGludnJlc3RvcmVzY3JlZW58aW52cmV2aW5zfGludnJpfGludnJpZ2h0bGVmdHxpbnZyaWdodGxlZnRjbWR8aW52cmx8aW52cmxjfGludnJvfGludnJzfGludnJ1fGludnJ1bGVyfGludnNifGludnNjfGludnNjYnxpbnZzY3JvbGxiaW5kfGludnNjc3xpbnZzZWN1cmV8aW52c2Z0fGludnNoZWxsc2xhc2h8aW52c2hlbGx0ZW1wfGludnNoaWZ0cm91bmR8aW52c2hvcnRuYW1lfGludnNob3djbWR8aW52c2hvd2Z1bGx0YWd8aW52c2hvd21hdGNofGludnNob3dtb2RlfGludnNpfGludnNtfGludnNtYXJ0Y2FzZXxpbnZzbWFydGluZGVudHxpbnZzbWFydHRhYnxpbnZzbWR8aW52c258aW52c29sfGludnNwZWxsfGludnNwbGl0YmVsb3d8aW52c3BsaXRyaWdodHxpbnZzcHJ8aW52c3J8aW52c3NsfGludnN0YXxpbnZzdGFydG9mbGluZXxpbnZzdG1wfGludnN3YXBmaWxlfGludnN3ZnxpbnZ0YXxpbnZ0YWdic2VhcmNofGludnRhZ3JlbGF0aXZlfGludnRhZ3N0YWNrfGludnRiaXxpbnZ0YmlkaXxpbnZ0YnN8aW52dGVybWJpZGl8aW52dGVyc2V8aW52dGV4dGF1dG98aW52dGV4dG1vZGV8aW52dGZ8aW52dGdzdHxpbnZ0aWxkZW9wfGludnRpbWVvdXR8aW52dGl0bGV8aW52dG98aW52dG9wfGludnRyfGludnR0aW1lb3V0fGludnR0eWJ1aWx0aW58aW52dHR5ZmFzdHxpbnZ0eHxpbnZ2YnxpbnZ2aXN1YWxiZWxsfGludndhfGludndhcm58aW52d2J8aW52d2VpcmRpbnZlcnR8aW52d2ZofGludndmd3xpbnZ3aWxkbWVudXxpbnZ3aW5maXhoZWlnaHR8aW52d2luZml4d2lkdGh8aW52d2l2fGludndtbnV8aW52d3JhcHxpbnZ3cmFwc2NhbnxpbnZ3cml0ZXxpbnZ3cml0ZWFueXxpbnZ3cml0ZWJhY2t1cHxpbnZ3c3xpc2Z8aXNmbmFtZXxpc2l8aXNpZGVudHxpc2t8aXNrZXl3b3JkfGlzcHJpbnR8am9pbnNwYWNlc3xqc3xrZXl8a2V5bWFwfGtleW1vZGVsfGtleXdvcmRwcmd8a218a21wfGtwfGxhbmdtYXB8bGFuZ21lbnV8bGFzdHN0YXR1c3xsYXp5cmVkcmF3fGxicnxsY3N8bGluZWJyZWFrfGxpbmVzfGxpbmVzcGFjZXxsaXNwfGxpc3B3b3Jkc3xsaXN0Y2hhcnN8bG9hZHBsdWdpbnN8bHBsfGxzcHxsenxtYWNhdHN1aXxtYWdpY3xtYWtlZWZ8bWFrZXByZ3xtYXRjaHBhaXJzfG1hdGNodGltZXxtYXhjb21iaW5lfG1heGZ1bmNkZXB0aHxtYXhtYXBkZXB0aHxtYXhtZW18bWF4bWVtcGF0dGVybnxtYXhtZW10b3R8bWNvfG1lZnxtZW51aXRlbXN8bWZkfG1ofG1pc3xta3NwZWxsbWVtfG1sfG1sc3xtbXxtbWR8bW1wfG1tdHxtb2RlbGluZXxtb2RlbGluZXN8bW9kaWZpYWJsZXxtb2RpZmllZHxtb3JlfG1vdXNlfG1vdXNlZnxtb3VzZWZvY3VzfG1vdXNlaGlkZXxtb3VzZW18bW91c2Vtb2RlbHxtb3VzZXN8bW91c2VzaGFwZXxtb3VzZXR8bW91c2V0aW1lfG1wfG1wc3xtc218bXpxfG16cXVhbnR1bXxuZnxub2FjZHxub2FpfG5vYWttfG5vYWxsb3dyZXZpbnN8bm9hbHRrZXltYXB8bm9hbnRpfG5vYW50aWFsaWFzfG5vYXJ8bm9hcmFifG5vYXJhYmljfG5vYXJhYmljc2hhcGV8bm9hcml8bm9hcnNoYXBlfG5vYXV0b2NoZGlyfG5vYXV0b2luZGVudHxub2F1dG9yZWFkfG5vYXV0b3dyaXRlfG5vYXV0b3dyaXRlYWxsfG5vYXd8bm9hd2F8bm9iYWNrdXB8bm9iYWxsb29uZXZhbHxub2JldmFsfG5vYmlufG5vYmluYXJ5fG5vYmlvc2t8bm9iaW9za2V5fG5vYmt8bm9ibHxub2JvbWJ8bm9idWZsaXN0ZWR8bm9jZnxub2NpfG5vY2lufG5vY2luZGVudHxub2NvbXBhdGlibGV8bm9jb25maXJtfG5vY29uc2t8bm9jb25za2V5fG5vY29weWluZGVudHxub2NwfG5vY3Njb3BldGFnfG5vY3Njb3BldmVyYm9zZXxub2NzdHxub2NzdmVyYnxub2N1Y3xub2N1bHxub2N1cnNvcmNvbHVtbnxub2N1cnNvcmxpbmV8bm9kZWNvfG5vZGVsY29tYmluZXxub2RnfG5vZGlmZnxub2RpZ3JhcGh8bm9kaXNhYmxlfG5vZWF8bm9lYnxub2VkfG5vZWRjb21wYXRpYmxlfG5vZWt8bm9lbmRvZmxpbmV8bm9lb2x8bm9lcXVhbGFsd2F5c3xub2Vycm9yYmVsbHN8bm9lc2NrZXlzfG5vZXR8bm9leHxub2V4cGFuZHRhYnxub2V4cmN8bm9mZW58bm9ma3xub2ZrbWFwfG5vZm9sZGVuYWJsZXxub2dkfG5vZ2RlZmF1bHR8bm9ndWlwdHl8bm9oaWR8bm9oaWRkZW58bm9oa3xub2hrbWFwfG5vaGttYXBwfG5vaGtwfG5vaGxzfG5vaWN8bm9pY29ufG5vaWdub3JlY2FzZXxub2ltfG5vaW1jfG5vaW1jbWRsaW5lfG5vaW1kfG5vaW5jc2VhcmNofG5vaW5mfG5vaW5mZXJjYXNlfG5vaW5zZXJ0bW9kZXxub2lzfG5vam9pbnNwYWNlc3xub2pzfG5vbGF6eXJlZHJhd3xub2xicnxub2xpbmVicmVha3xub2xpc3B8bm9saXN0fG5vbG9hZHBsdWdpbnN8bm9scGx8bm9senxub21hfG5vbWFjYXRzdWl8bm9tYWdpY3xub21ofG5vbWx8bm9tb2R8bm9tb2RlbGluZXxub21vZGlmaWFibGV8bm9tb2RpZmllZHxub21vcmV8bm9tb3VzZWZ8bm9tb3VzZWZvY3VzfG5vbW91c2VoaWRlfG5vbnV8bm9udW1iZXJ8bm9vZGV2fG5vb3BlbmRldmljZXxub3Bhc3RlfG5vcGl8bm9wcmVzZXJ2ZWluZGVudHxub3ByZXZpZXd3aW5kb3d8bm9wcm9tcHR8bm9wdnd8bm9yZWFkb25seXxub3JlbWFwfG5vcmVzdG9yZXNjcmVlbnxub3Jldmluc3xub3JpfG5vcmlnaHRsZWZ0fG5vcmlnaHRsZWZ0Y21kfG5vcmx8bm9ybGN8bm9yb3xub3JzfG5vcnV8bm9ydWxlcnxub3NifG5vc2N8bm9zY2J8bm9zY3JvbGxiaW5kfG5vc2NzfG5vc2VjdXJlfG5vc2Z0fG5vc2hlbGxzbGFzaHxub3NoZWxsdGVtcHxub3NoaWZ0cm91bmR8bm9zaG9ydG5hbWV8bm9zaG93Y21kfG5vc2hvd2Z1bGx0YWd8bm9zaG93bWF0Y2h8bm9zaG93bW9kZXxub3NpfG5vc218bm9zbWFydGNhc2V8bm9zbWFydGluZGVudHxub3NtYXJ0dGFifG5vc21kfG5vc258bm9zb2x8bm9zcGVsbHxub3NwbGl0YmVsb3d8bm9zcGxpdHJpZ2h0fG5vc3ByfG5vc3J8bm9zc2x8bm9zdGF8bm9zdGFydG9mbGluZXxub3N0bXB8bm9zd2FwZmlsZXxub3N3Znxub3RhfG5vdGFnYnNlYXJjaHxub3RhZ3JlbGF0aXZlfG5vdGFnc3RhY2t8bm90Yml8bm90YmlkaXxub3Ric3xub3Rlcm1iaWRpfG5vdGVyc2V8bm90ZXh0YXV0b3xub3RleHRtb2RlfG5vdGZ8bm90Z3N0fG5vdGlsZGVvcHxub3RpbWVvdXR8bm90aXRsZXxub3RvfG5vdG9wfG5vdHJ8bm90dGltZW91dHxub3R0eWJ1aWx0aW58bm90dHlmYXN0fG5vdHh8bm92Ynxub3Zpc3VhbGJlbGx8bm93YXxub3dhcm58bm93Ynxub3dlaXJkaW52ZXJ0fG5vd2ZofG5vd2Z3fG5vd2lsZG1lbnV8bm93aW5maXhoZWlnaHR8bm93aW5maXh3aWR0aHxub3dpdnxub3dtbnV8bm93cmFwfG5vd3JhcHNjYW58bm93cml0ZXxub3dyaXRlYW55fG5vd3JpdGViYWNrdXB8bm93c3xucmZvcm1hdHN8bnVtYmVyd2lkdGh8bnV3fG9kZXZ8b2Z0fG9mdXxvbW5pZnVuY3xvcGVuZGV2aWNlfG9wZXJhdG9yZnVuY3xvcGZ1bmN8b3NmaWxldHlwZXxwYXxwYXJhfHBhcmFncmFwaHN8cGFzdGV8cGFzdGV0b2dnbGV8cGF0Y2hleHByfHBhdGNobW9kZXxwYXRofHBkZXZ8cGVuY3xwZXh8cGV4cHJ8cGZufHBofHBoZWFkZXJ8cGl8cG18cG1iY3N8cG1iZm58cG9wdHxwcmVzZXJ2ZWluZGVudHxwcmV2aWV3aGVpZ2h0fHByZXZpZXd3aW5kb3d8cHJpbnRkZXZpY2V8cHJpbnRlbmNvZGluZ3xwcmludGV4cHJ8cHJpbnRmb250fHByaW50aGVhZGVyfHByaW50bWJjaGFyc2V0fHByaW50bWJmb250fHByaW50b3B0aW9uc3xwcm9tcHR8cHR8cHVtaGVpZ2h0fHB2aHxwdnd8cWV8cXVvdGVlc2NhcGV8cmVhZG9ubHl8cmVtYXB8cmVwb3J0fHJlc3RvcmVzY3JlZW58cmV2aW5zfHJpZ2h0bGVmdHxyaWdodGxlZnRjbWR8cmx8cmxjfHJvfHJzfHJ0cHxydWZ8cnVsZXJ8cnVsZXJmb3JtYXR8cnVudGltZXBhdGh8c2JvfHNjfHNjYnxzY3J8c2Nyb2xsfHNjcm9sbGJpbmR8c2Nyb2xsanVtcHxzY3JvbGxvZmZ8c2Nyb2xsb3B0fHNjc3xzZWN0fHNlY3Rpb25zfHNlY3VyZXxzZWx8c2VsZWN0aW9ufHNlbGVjdG1vZGV8c2Vzc2lvbm9wdGlvbnN8c2Z0fHNoY2Z8c2hlbGxjbWRmbGFnfHNoZWxscGlwZXxzaGVsbHF1b3RlfHNoZWxscmVkaXJ8c2hlbGxzbGFzaHxzaGVsbHRlbXB8c2hlbGx0eXBlfHNoZWxseHF1b3RlfHNoaWZ0cm91bmR8c2hpZnR3aWR0aHxzaG18c2hvcnRtZXNzfHNob3J0bmFtZXxzaG93YnJlYWt8c2hvd2NtZHxzaG93ZnVsbHRhZ3xzaG93bWF0Y2h8c2hvd21vZGV8c2hvd3RhYmxpbmV8c2hxfHNpfHNpZGVzY3JvbGx8c2lkZXNjcm9sbG9mZnxzaXNvfHNqfHNsbXxzbWFydGNhc2V8c21hcnRpbmRlbnR8c21hcnR0YWJ8c21jfHNtZHxzb2Z0dGFic3RvcHxzb2x8c3BjfHNwZWxsfHNwZWxsY2FwY2hlY2t8c3BlbGxmaWxlfHNwZWxsbGFuZ3xzcGVsbHN1Z2dlc3R8c3BmfHNwbHxzcGxpdGJlbG93fHNwbGl0cmlnaHR8c3BzfHNyfHNycnxzc3xzc2x8c3NvcHxzdGFsfHN0YXJ0b2ZsaW5lfHN0YXR1c2xpbmV8c3RsfHN0bXB8c3V8c3VhfHN1ZmZpeGVzfHN1ZmZpeGVzYWRkfHN3fHN3YXBmaWxlfHN3YXBzeW5jfHN3Ynxzd2Z8c3dpdGNoYnVmfHN3c3xzeHF8c3lufHN5bm1heGNvbHxzeW50YXh8dF9BQnx0X0FGfHRfQUx8dF9DU3x0X0NWfHRfQ2V8dF9Db3x0X0NzfHRfREx8dF9FSXx0X0YxfHRfRjJ8dF9GM3x0X0Y0fHRfRjV8dF9GNnx0X0Y3fHRfRjh8dF9GOXx0X0lFfHRfSVN8dF9LMXx0X0szfHRfSzR8dF9LNXx0X0s2fHRfSzd8dF9LOHx0X0s5fHRfS0F8dF9LQnx0X0tDfHRfS0R8dF9LRXx0X0tGfHRfS0d8dF9LSHx0X0tJfHRfS0p8dF9LS3x0X0tMfHRfUkl8dF9SVnx0X1NJfHRfU2J8dF9TZnx0X1dQfHRfV1N8dF9aSHx0X1pSfHRfYWx8dF9iY3x0X2NkfHRfY2V8dF9jbHx0X2NtfHRfY3N8dF9kYXx0X2RifHRfZGx8dF9mc3x0X2sxfHRfazJ8dF9rM3x0X2s0fHRfazV8dF9rNnx0X2s3fHRfazh8dF9rOXx0X2tCfHRfa0R8dF9rSXx0X2tOfHRfa1B8dF9rYnx0X2tkfHRfa2V8dF9raHx0X2tsfHRfa3J8dF9rc3x0X2t1fHRfbGV8dF9tYnx0X21kfHRfbWV8dF9tcnx0X21zfHRfbmR8dF9vcHx0X3NlfHRfc298dF9zcnx0X3RlfHRfdGl8dF90c3x0X3VlfHRfdXN8dF91dHx0X3ZifHRfdmV8dF92aXx0X3ZzfHRfeHN8dGFibGluZXx0YWJwYWdlbWF4fHRhYnN0b3B8dGFnYnNlYXJjaHx0YWdsZW5ndGh8dGFncmVsYXRpdmV8dGFnc3RhY2t8dGFsfHRifHRiaXx0YmlkaXx0YmlzfHRic3x0ZW5jfHRlcm18dGVybWJpZGl8dGVybWVuY29kaW5nfHRlcnNlfHRleHRhdXRvfHRleHRtb2RlfHRleHR3aWR0aHx0Z3N0fHRoZXNhdXJ1c3x0aWxkZW9wfHRpbWVvdXR8dGltZW91dGxlbnx0aXRsZXx0aXRsZWxlbnx0aXRsZW9sZHx0aXRsZXN0cmluZ3x0b29sYmFyfHRvb2xiYXJpY29uc2l6ZXx0b3B8dHBtfHRzbHx0c3J8dHRpbWVvdXR8dHRpbWVvdXRsZW58dHRtfHR0eXx0dHlidWlsdGlufHR0eWZhc3R8dHR5bXx0dHltb3VzZXx0dHlzY3JvbGx8dHR5dHlwZXx0d3x0eHx1Y3x1bHx1bmRvbGV2ZWxzfHVwZGF0ZWNvdW50fHVwZGF0ZXRpbWV8dXR8dmJ8dmJzfHZkaXJ8dmVyYm9zZWZpbGV8dmZpbGV8dmlld2Rpcnx2aWV3b3B0aW9uc3x2aW1pbmZvfHZpcnR1YWxlZGl0fHZpc3VhbGJlbGx8dm9wfHdha3x3YXJufHdifHdjfHdjbXx3ZHx3ZWlyZGludmVydHx3Zmh8d2Z3fHdoaWNod3JhcHx3aXx3aWd8d2lsZGNoYXJ8d2lsZGNoYXJtfHdpbGRpZ25vcmV8d2lsZG1lbnV8d2lsZG1vZGV8d2lsZG9wdGlvbnN8d2ltfHdpbmFsdGtleXN8d2luZG93fHdpbmZpeGhlaWdodHx3aW5maXh3aWR0aHx3aW5oZWlnaHR8d2lubWluaGVpZ2h0fHdpbm1pbndpZHRofHdpbndpZHRofHdpdnx3aXd8d218d21ofHdtbnV8d213fHdvcHx3cmFwfHdyYXBtYXJnaW58d3JhcHNjYW58d3JpdGVhbnl8d3JpdGViYWNrdXB8d3JpdGVkZWxheXx3dylcXGIvLFxuXHQnbnVtYmVyJzogL1xcYig/OjB4W1xcZGEtZl0rfFxcZCsoPzpcXC5cXGQrKT8pXFxiL2ksXG5cdCdvcGVyYXRvcic6IC9cXHxcXHx8JiZ8Wy0rLl09P3xbPSFdKD86Wz1+XVsjP10/KT98Wzw+XT0/WyM/XT98WypcXC8lP118XFxiKD86aXMoPzpub3QpPylcXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9W1xcXSgpLDs6XS9cbn07XG5cblByaXNtLmxhbmd1YWdlc1sndmlzdWFsLWJhc2ljJ10gPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC8oPzpbJ1x1MjAxOFx1MjAxOV18UkVNXFxiKSg/OlteXFxyXFxuX118Xyg/Olxcclxcbj98XFxuKT8pKi9pLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2tleXdvcmQnOiAvXlJFTS9pXG5cdFx0fVxuXHR9LFxuXHQnZGlyZWN0aXZlJzoge1xuXHRcdHBhdHRlcm46IC8jKD86Q29uc3R8RWxzZXxFbHNlSWZ8RW5kfEV4dGVybmFsQ2hlY2tzdW18RXh0ZXJuYWxTb3VyY2V8SWZ8UmVnaW9uKSg/OlxcYl9bIFxcdF0qKD86XFxyXFxuP3xcXG4pfC4pKy9pLFxuXHRcdGFsaWFzOiAncHJvcGVydHknLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cXCQ/W1wiXHUyMDFDXHUyMDFEXSg/OltcIlx1MjAxQ1x1MjAxRF17Mn18W15cIlx1MjAxQ1x1MjAxRF0pKltcIlx1MjAxQ1x1MjAxRF1DPy9pLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnZGF0ZSc6IHtcblx0XHRwYXR0ZXJuOiAvI1sgXFx0XSooPzpcXGQrKFsvLV0pXFxkK1xcMVxcZCsoPzpbIFxcdF0rKD86XFxkK1sgXFx0XSooPzpBTXxQTSl8XFxkKzpcXGQrKD86OlxcZCspPyg/OlsgXFx0XSooPzpBTXxQTSkpPykpP3xcXGQrWyBcXHRdKig/OkFNfFBNKXxcXGQrOlxcZCsoPzo6XFxkKyk/KD86WyBcXHRdKig/OkFNfFBNKSk/KVsgXFx0XSojL2ksXG5cdFx0YWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdudW1iZXInOiAvKD86KD86XFxiXFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKSg/OkVbKy1dP1xcZCspP3wmW0hPXVtcXGRBLUZdKykoPzpbRlJEXXxVP1tJTFNdKT8vaSxcblx0J2Jvb2xlYW4nOiAvXFxiKD86RmFsc2V8Tm90aGluZ3xUcnVlKVxcYi9pLFxuXHQna2V5d29yZCc6IC9cXGIoPzpBZGRIYW5kbGVyfEFkZHJlc3NPZnxBbGlhc3xBbmQoPzpBbHNvKT98QXN8Qm9vbGVhbnxCeVJlZnxCeXRlfEJ5VmFsfENhbGx8Q2FzZXxDYXRjaHxDKD86Qm9vbHxCeXRlfENoYXJ8RGF0ZXxEYmx8RGVjfEludHxMbmd8T2JqfFNCeXRlfFNob3J0fFNuZ3xTdHJ8VHlwZXxVSW50fFVMbmd8VVNob3J0KXxDaGFyfENsYXNzfENvbnN0fENvbnRpbnVlfEN1cnJlbmN5fERhdGV8RGVjaW1hbHxEZWNsYXJlfERlZmF1bHR8RGVsZWdhdGV8RGltfERpcmVjdENhc3R8RG98RG91YmxlfEVhY2h8RWxzZSg/OklmKT98RW5kKD86SWYpP3xFbnVtfEVyYXNlfEVycm9yfEV2ZW50fEV4aXR8RmluYWxseXxGb3J8RnJpZW5kfEZ1bmN0aW9ufEdldCg/OlR5cGV8WE1MTmFtZXNwYWNlKT98R2xvYmFsfEdvU3VifEdvVG98SGFuZGxlc3xJZnxJbXBsZW1lbnRzfEltcG9ydHN8SW58SW5oZXJpdHN8SW50ZWdlcnxJbnRlcmZhY2V8SXN8SXNOb3R8TGV0fExpYnxMaWtlfExvbmd8TG9vcHxNZXxNb2R8TW9kdWxlfE11c3QoPzpJbmhlcml0fE92ZXJyaWRlKXxNeSg/OkJhc2V8Q2xhc3MpfE5hbWVzcGFjZXxOYXJyb3dpbmd8TmV3fE5leHR8Tm90KD86SW5oZXJpdGFibGV8T3ZlcnJpZGFibGUpP3xPYmplY3R8T2Z8T258T3BlcmF0b3J8T3B0aW9uKD86YWwpP3xPcig/OkVsc2UpP3xPdXR8T3ZlcmxvYWRzfE92ZXJyaWRhYmxlfE92ZXJyaWRlc3xQYXJhbUFycmF5fFBhcnRpYWx8UHJpdmF0ZXxQcm9wZXJ0eXxQcm90ZWN0ZWR8UHVibGljfFJhaXNlRXZlbnR8UmVhZE9ubHl8UmVEaW18UmVtb3ZlSGFuZGxlcnxSZXN1bWV8UmV0dXJufFNCeXRlfFNlbGVjdHxTZXR8U2hhZG93c3xTaGFyZWR8c2hvcnR8U2luZ2xlfFN0YXRpY3xTdGVwfFN0b3B8U3RyaW5nfFN0cnVjdHVyZXxTdWJ8U3luY0xvY2t8VGhlbnxUaHJvd3xUb3xUcnl8VHJ5Q2FzdHxUeXBlfFR5cGVPZnxVKD86SW50ZWdlcnxMb25nfFNob3J0KXxVbnRpbHxVc2luZ3xWYXJpYW50fFdlbmR8V2hlbnxXaGlsZXxXaWRlbmluZ3xXaXRoKD86RXZlbnRzKT98V3JpdGVPbmx5fFhvcilcXGIvaSxcblx0J29wZXJhdG9yJzogL1srXFwtKi9cXFxcXjw9PiYjQCQlIV18XFxiXyg/PVsgXFx0XSpbXFxyXFxuXSkvLFxuXHQncHVuY3R1YXRpb24nOiAvW3t9KCkuLDo/XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy52YiA9IFByaXNtLmxhbmd1YWdlc1sndmlzdWFsLWJhc2ljJ107XG5QcmlzbS5sYW5ndWFnZXMudmJhID0gUHJpc20ubGFuZ3VhZ2VzWyd2aXN1YWwtYmFzaWMnXTtcblxuUHJpc20ubGFuZ3VhZ2VzLndhcnBzY3JpcHQgPSB7XG5cdCdjb21tZW50JzogLyMuKnxcXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlwiXFxcXFxcclxcbl18XFxcXC4pKlwifCcoPzpbXidcXFxcXFxyXFxuXXxcXFxcLikqJ3w8Jyg/OlteXFxcXCddfCcoPyE+KXxcXFxcLikqJz4vLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQndmFyaWFibGUnOiAvXFwkXFxTKy8sXG5cdCdtYWNybyc6IHtcblx0XHRwYXR0ZXJuOiAvQFxcUysvLFxuXHRcdGFsaWFzOiAncHJvcGVydHknXG5cdH0sXG5cdC8vIFdhcnBTY3JpcHQgZG9lc24ndCBoYXZlIGFueSBrZXl3b3JkcywgdGhlc2UgYXJlIGFsbCBmdW5jdGlvbnMgdW5kZXIgdGhlIGNvbnRyb2wgY2F0ZWdvcnlcblx0Ly8gaHR0cHM6Ly93d3cud2FycDEwLmlvL3RhZ3MvY29udHJvbFxuXHQna2V5d29yZCc6IC9cXGIoPzpCUkVBS3xDSEVDS01BQ1JPfENPTlRJTlVFfENVREZ8REVGSU5FRHxERUZJTkVETUFDUk98RVZBTHxGQUlMfEZPUnxGT1JFQUNIfEZPUlNURVB8SUZUfElGVEV8TVNHRkFJTHxOUkVUVVJOfFJFVEhST1d8UkVUVVJOfFNXSVRDSHxUUll8VURGfFVOVElMfFdISUxFKVxcYi8sXG5cdCdudW1iZXInOiAvWystXT9cXGIoPzpOYU58SW5maW5pdHl8XFxkKyg/OlxcLlxcZCopPyg/OltFZV1bKy1dP1xcZCspP3wweFtcXGRhLWZBLUZdK3wwYlswMV0rKVxcYi8sXG5cdCdib29sZWFuJzogL1xcYig/OkZ8VHxmYWxzZXx0cnVlKVxcYi8sXG5cdCdwdW5jdHVhdGlvbic6IC88JXwlPnxbe31bXFxdKCldLyxcblx0Ly8gU29tZSBvcGVyYXRvcnMgZnJvbSB0aGUgXCJvcGVyYXRvcnNcIiBjYXRlZ29yeVxuXHQvLyBodHRwczovL3d3dy53YXJwMTAuaW8vdGFncy9vcGVyYXRvcnNcblx0J29wZXJhdG9yJzogLz09fCYmP3xcXHxcXHw/fFxcKlxcKj98Pj4+P3w8PHxbPD4hfl09P3xbLS8lXl18XFwrIT98XFxiKD86QU5EfE5PVHxPUilcXGIvXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMud2FzbSA9IHtcblx0J2NvbW1lbnQnOiBbXG5cdFx0L1xcKDtbXFxzXFxTXSo/O1xcKS8sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLzs7LiovLFxuXHRcdFx0Z3JlZWR5OiB0cnVlXG5cdFx0fVxuXHRdLFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlxcXFxbXFxzXFxTXXxbXlwiXFxcXF0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J2tleXdvcmQnOiBbXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogL1xcYig/OmFsaWdufG9mZnNldCk9Lyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnb3BlcmF0b3InOiAvPS9cblx0XHRcdH1cblx0XHR9LFxuXHRcdHtcblx0XHRcdHBhdHRlcm46IC9cXGIoPzooPzpmMzJ8ZjY0fGkzMnxpNjQpKD86XFwuKD86YWJzfGFkZHxhbmR8Y2VpbHxjbHp8Y29uc3R8Y29udmVydF9bc3VdXFwvaSg/OjMyfDY0KXxjb3B5c2lnbnxjdHp8ZGVtb3RlXFwvZjY0fGRpdig/Ol9bc3VdKT98ZXF6P3xleHRlbmRfW3N1XVxcL2kzMnxmbG9vcnxnZSg/Ol9bc3VdKT98Z3QoPzpfW3N1XSk/fGxlKD86X1tzdV0pP3xsb2FkKD86KD86OHwxNnwzMilfW3N1XSk/fGx0KD86X1tzdV0pP3xtYXh8bWlufG11bHxuZWc/fG5lYXJlc3R8b3J8cG9wY250fHByb21vdGVcXC9mMzJ8cmVpbnRlcnByZXRcXC9bZmldKD86MzJ8NjQpfHJlbV9bc3VdfHJvdFtscl18c2hsfHNocl9bc3VdfHNxcnR8c3RvcmUoPzo4fDE2fDMyKT98c3VifHRydW5jKD86X1tzdV1cXC9mKD86MzJ8NjQpKT98d3JhcFxcL2k2NHx4b3IpKT98bWVtb3J5XFwuKD86Z3Jvd3xzaXplKSlcXGIvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IC9cXC4vXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvXFxiKD86YW55ZnVuY3xibG9ja3xicig/Ol9pZnxfdGFibGUpP3xjYWxsKD86X2luZGlyZWN0KT98ZGF0YXxkcm9wfGVsZW18ZWxzZXxlbmR8ZXhwb3J0fGZ1bmN8Z2V0Xyg/Omdsb2JhbHxsb2NhbCl8Z2xvYmFsfGlmfGltcG9ydHxsb2NhbHxsb29wfG1lbW9yeXxtb2R1bGV8bXV0fG5vcHxvZmZzZXR8cGFyYW18cmVzdWx0fHJldHVybnxzZWxlY3R8c2V0Xyg/Omdsb2JhbHxsb2NhbCl8c3RhcnR8dGFibGV8dGVlX2xvY2FsfHRoZW58dHlwZXx1bnJlYWNoYWJsZSlcXGIvXG5cdF0sXG5cdCd2YXJpYWJsZSc6IC9cXCRbXFx3ISMkJSYnKitcXC0uLzo8PT4/QFxcXFxeYHx+XSsvLFxuXHQnbnVtYmVyJzogL1srLV0/XFxiKD86XFxkKD86Xz9cXGQpKig/OlxcLlxcZCg/Ol8/XFxkKSopPyg/OltlRV1bKy1dP1xcZCg/Ol8/XFxkKSopP3wweFtcXGRhLWZBLUZdKD86Xz9bXFxkYS1mQS1GXSkqKD86XFwuW1xcZGEtZkEtRl0oPzpfP1tcXGRhLWZBLURdKSopPyg/OltwUF1bKy1dP1xcZCg/Ol8/XFxkKSopPylcXGJ8XFxiaW5mXFxifFxcYm5hbig/OjoweFtcXGRhLWZBLUZdKD86Xz9bXFxkYS1mQS1EXSkqKT9cXGIvLFxuXHQncHVuY3R1YXRpb24nOiAvWygpXS9cbn07XG5cbihmdW5jdGlvbiAoUHJpc20pIHtcblxuXHR2YXIgaWQgPSAvKD86XFxCLXxcXGJffFxcYilbQS1aYS16XVtcXHctXSooPyFbXFx3LV0pLy5zb3VyY2U7XG5cdHZhciB0eXBlID1cblx0XHQnKD86JyArXG5cdFx0L1xcYig/OnVuc2lnbmVkXFxzKyk/bG9uZ1xccytsb25nKD8hW1xcdy1dKS8uc291cmNlICtcblx0XHQnfCcgK1xuXHRcdC9cXGIoPzp1bnJlc3RyaWN0ZWR8dW5zaWduZWQpXFxzK1thLXpdKyg/IVtcXHctXSkvLnNvdXJjZSArXG5cdFx0J3wnICtcblx0XHQvKD8hKD86dW5yZXN0cmljdGVkfHVuc2lnbmVkKVxcYikvLnNvdXJjZSArIGlkICsgLyg/Olxccyo8KD86W148Pl18PFtePD5dKj4pKj4pPy8uc291cmNlICtcblx0XHQnKScgKyAvKD86XFxzKlxcPyk/Ly5zb3VyY2U7XG5cblx0dmFyIHR5cGVJbnNpZGUgPSB7fTtcblxuXHRQcmlzbS5sYW5ndWFnZXNbJ3dlYi1pZGwnXSA9IHtcblx0XHQnY29tbWVudCc6IHtcblx0XHRcdHBhdHRlcm46IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0J3N0cmluZyc6IHtcblx0XHRcdHBhdHRlcm46IC9cIlteXCJdKlwiLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cblx0XHQnbmFtZXNwYWNlJzoge1xuXHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXFxibmFtZXNwYWNlXFxzKykvLnNvdXJjZSArIGlkKSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0fSxcblx0XHQnY2xhc3MtbmFtZSc6IFtcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogLyhefFteXFx3LV0pKD86aXRlcmFibGV8bWFwbGlrZXxzZXRsaWtlKVxccyo8KD86W148Pl18PFtePD5dKj4pKj4vLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFxcYig/OmF0dHJpYnV0ZXxjb25zdHxkZWxldGVyfGdldHRlcnxvcHRpb25hbHxzZXR0ZXIpXFxzKykvLnNvdXJjZSArIHR5cGUpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGNhbGxiYWNrIHJldHVybiB0eXBlXG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgnKCcgKyAvXFxiY2FsbGJhY2tcXHMrLy5zb3VyY2UgKyBpZCArIC9cXHMqPVxccyovLnNvdXJjZSArICcpJyArIHR5cGUpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRpbnNpZGU6IHR5cGVJbnNpZGVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIHR5cGVkZWZcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXFxidHlwZWRlZlxcYlxccyopLy5zb3VyY2UgKyB0eXBlKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdFx0aW5zaWRlOiB0eXBlSW5zaWRlXG5cdFx0XHR9LFxuXG5cdFx0XHR7XG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFxcYig/OmNhbGxiYWNrfGRpY3Rpb25hcnl8ZW51bXxpbnRlcmZhY2UoPzpcXHMrbWl4aW4pPylcXHMrKSg/ISg/OmludGVyZmFjZXxtaXhpbilcXGIpLy5zb3VyY2UgKyBpZCksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHQvLyBpbmhlcml0YW5jZVxuXHRcdFx0XHRwYXR0ZXJuOiBSZWdFeHAoLyg6XFxzKikvLnNvdXJjZSArIGlkKSxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdH0sXG5cblx0XHRcdC8vIGluY2x1ZGVzIGFuZCBpbXBsZW1lbnRzXG5cdFx0XHRSZWdFeHAoaWQgKyAvKD89XFxzKyg/OmltcGxlbWVudHN8aW5jbHVkZXMpXFxiKS8uc291cmNlKSxcblx0XHRcdHtcblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oXFxiKD86aW1wbGVtZW50c3xpbmNsdWRlcylcXHMrKS8uc291cmNlICsgaWQpLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0fSxcblxuXHRcdFx0e1xuXHRcdFx0XHQvLyBmdW5jdGlvbiByZXR1cm4gdHlwZSwgcGFyYW1ldGVyIHR5cGVzLCBhbmQgZGljdGlvbmFyeSBtZW1iZXJzXG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCh0eXBlICsgJyg/PScgKyAvXFxzKig/OlxcLnszfVxccyopPy8uc291cmNlICsgaWQgKyAvXFxzKlsoKSw7PV0vLnNvdXJjZSArICcpJyksXG5cdFx0XHRcdGluc2lkZTogdHlwZUluc2lkZVxuXHRcdFx0fSxcblx0XHRdLFxuXG5cdFx0J2J1aWx0aW4nOiAvXFxiKD86QXJyYXlCdWZmZXJ8QmlnSW50NjRBcnJheXxCaWdVaW50NjRBcnJheXxCeXRlU3RyaW5nfERPTVN0cmluZ3xEYXRhVmlld3xGbG9hdDMyQXJyYXl8RmxvYXQ2NEFycmF5fEZyb3plbkFycmF5fEludDE2QXJyYXl8SW50MzJBcnJheXxJbnQ4QXJyYXl8T2JzZXJ2YWJsZUFycmF5fFByb21pc2V8VVNWU3RyaW5nfFVpbnQxNkFycmF5fFVpbnQzMkFycmF5fFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXkpXFxiLyxcblx0XHQna2V5d29yZCc6IFtcblx0XHRcdC9cXGIoPzphc3luY3xhdHRyaWJ1dGV8Y2FsbGJhY2t8Y29uc3R8Y29uc3RydWN0b3J8ZGVsZXRlcnxkaWN0aW9uYXJ5fGVudW18Z2V0dGVyfGltcGxlbWVudHN8aW5jbHVkZXN8aW5oZXJpdHxpbnRlcmZhY2V8bWl4aW58bmFtZXNwYWNlfG51bGx8b3B0aW9uYWx8b3J8cGFydGlhbHxyZWFkb25seXxyZXF1aXJlZHxzZXR0ZXJ8c3RhdGljfHN0cmluZ2lmaWVyfHR5cGVkZWZ8dW5yZXN0cmljdGVkKVxcYi8sXG5cdFx0XHQvLyB0eXBlIGtleXdvcmRzXG5cdFx0XHQvXFxiKD86YW55fGJpZ2ludHxib29sZWFufGJ5dGV8ZG91YmxlfGZsb2F0fGl0ZXJhYmxlfGxvbmd8bWFwbGlrZXxvYmplY3R8b2N0ZXR8cmVjb3JkfHNlcXVlbmNlfHNldGxpa2V8c2hvcnR8c3ltYm9sfHVuZGVmaW5lZHx1bnNpZ25lZHx2b2lkKVxcYi9cblx0XHRdLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblxuXHRcdCdudW1iZXInOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXHctXSktPyg/OjB4WzAtOWEtZl0rfCg/OlxcZCsoPzpcXC5cXGQqKT98XFwuXFxkKykoPzplWystXT9cXGQrKT98TmFOfEluZmluaXR5KSg/IVtcXHctXSkvaSxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHR9LFxuXHRcdCdvcGVyYXRvcic6IC9cXC57M318Wz06Pzw+LV0vLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bKCl7fVtcXF0uLDtdL1xuXHR9O1xuXG5cdGZvciAodmFyIGtleSBpbiBQcmlzbS5sYW5ndWFnZXNbJ3dlYi1pZGwnXSkge1xuXHRcdGlmIChrZXkgIT09ICdjbGFzcy1uYW1lJykge1xuXHRcdFx0dHlwZUluc2lkZVtrZXldID0gUHJpc20ubGFuZ3VhZ2VzWyd3ZWItaWRsJ11ba2V5XTtcblx0XHR9XG5cdH1cblxuXHRQcmlzbS5sYW5ndWFnZXNbJ3dlYmlkbCddID0gUHJpc20ubGFuZ3VhZ2VzWyd3ZWItaWRsJ107XG5cbn0oUHJpc20pKTtcblxuUHJpc20ubGFuZ3VhZ2VzLndnc2wgPSB7XG5cdCdjb21tZW50Jzoge1xuXHRcdHBhdHRlcm46IC9cXC9cXC8uKnxcXC9cXCpbXFxzXFxTXSo/KD86XFwqXFwvfCQpLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdH0sXG5cdCdidWlsdGluLWF0dHJpYnV0ZSc6IHtcblx0XHRwYXR0ZXJuOiAvKEApYnVpbHRpblxcKC4qP1xcKS8sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCdhdHRyaWJ1dGUnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9eYnVpbHRpbi8sXG5cdFx0XHRcdGFsaWFzOiAnYXR0ci1uYW1lJyxcblx0XHRcdH0sXG5cdFx0XHQncHVuY3R1YXRpb24nOiAvWygpLF0vLFxuXHRcdFx0J2J1aWx0LWluLXZhbHVlcyc6IHtcblx0XHRcdFx0cGF0dGVybjogL1xcYig/OmZyYWdfZGVwdGh8ZnJvbnRfZmFjaW5nfGdsb2JhbF9pbnZvY2F0aW9uX2lkfGluc3RhbmNlX2luZGV4fGxvY2FsX2ludm9jYXRpb25faWR8bG9jYWxfaW52b2NhdGlvbl9pbmRleHxudW1fd29ya2dyb3Vwc3xwb3NpdGlvbnxzYW1wbGVfaW5kZXh8c2FtcGxlX21hc2t8dmVydGV4X2luZGV4fHdvcmtncm91cF9pZClcXGIvLFxuXHRcdFx0XHRhbGlhczogJ2F0dHItdmFsdWUnLFxuXHRcdFx0fSxcblx0XHR9LFxuXHR9LFxuXHQnYXR0cmlidXRlcyc6IHtcblx0XHRwYXR0ZXJuOiAvKEApKD86YWxpZ258YmluZGluZ3xjb21wdXRlfGNvbnN0fGZyYWdtZW50fGdyb3VwfGlkfGludGVycG9sYXRlfGludmFyaWFudHxsb2NhdGlvbnxzaXplfHZlcnRleHx3b3JrZ3JvdXBfc2l6ZSkvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnYXR0ci1uYW1lJyxcblx0fSxcblx0J2Z1bmN0aW9ucyc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiKGZuXFxzKylbX2EtekEtWl1cXHcqKD89Wyg8XSkvLFxuXHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0YWxpYXM6ICdmdW5jdGlvbicsXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OmJpdGNhc3R8YnJlYWt8Y2FzZXxjb25zdHxjb250aW51ZXxjb250aW51aW5nfGRlZmF1bHR8ZGlzY2FyZHxlbHNlfGVuYWJsZXxmYWxsdGhyb3VnaHxmbnxmb3J8ZnVuY3Rpb258aWZ8bGV0fGxvb3B8cHJpdmF0ZXxyZXR1cm58c3RvcmFnZXxzdHJ1Y3R8c3dpdGNofHR5cGV8dW5pZm9ybXx2YXJ8d2hpbGV8d29ya2dyb3VwKVxcYi8sXG5cdCdidWlsdGluJzogL1xcYig/OmFic3xhY29zfGFjb3NofGFsbHxhbnl8YXJyYXl8YXNpbnxhc2luaHxhdGFufGF0YW4yfGF0YW5ofGF0b21pY3xhdG9taWNBZGR8YXRvbWljQW5kfGF0b21pY0NvbXBhcmVFeGNoYW5nZVdlYWt8YXRvbWljRXhjaGFuZ2V8YXRvbWljTG9hZHxhdG9taWNNYXh8YXRvbWljTWlufGF0b21pY09yfGF0b21pY1N0b3JlfGF0b21pY1N1YnxhdG9taWNYb3J8Ym9vbHxjZWlsfGNsYW1wfGNvc3xjb3NofGNvdW50TGVhZGluZ1plcm9zfGNvdW50T25lQml0c3xjb3VudFRyYWlsaW5nWmVyb3N8Y3Jvc3N8ZGVncmVlc3xkZXRlcm1pbmFudHxkaXN0YW5jZXxkb3R8ZHBkeHxkcGR4Q29hcnNlfGRwZHhGaW5lfGRwZHl8ZHBkeUNvYXJzZXxkcGR5RmluZXxleHB8ZXhwMnxleHRyYWN0Qml0c3xmMzJ8ZjY0fGZhY2VGb3J3YXJkfGZpcnN0TGVhZGluZ0JpdHxmbG9vcnxmbWF8ZnJhY3R8ZnJleHB8ZndpZHRofGZ3aWR0aENvYXJzZXxmd2lkdGhGaW5lfGkzMnxpNjR8aW5zZXJ0Qml0c3xpbnZlcnNlU3FydHxsZGV4cHxsZW5ndGh8bG9nfGxvZzJ8bWF0WzItNF14WzItNF18bWF4fG1pbnxtaXh8bW9kZnxub3JtYWxpemV8b3ZlcnJpZGV8cGFjazJ4MTZmbG9hdHxwYWNrMngxNnNub3JtfHBhY2syeDE2dW5vcm18cGFjazR4OHNub3JtfHBhY2s0eDh1bm9ybXxwb3d8cHRyfHF1YW50aXplVG9GMTZ8cmFkaWFuc3xyZWZsZWN0fHJlZnJhY3R8cmV2ZXJzZUJpdHN8cm91bmR8c2FtcGxlcnxzYW1wbGVyX2NvbXBhcmlzb258c2VsZWN0fHNoaWZ0TGVmdHxzaGlmdFJpZ2h0fHNpZ258c2lufHNpbmh8c21vb3Roc3RlcHxzcXJ0fHN0YXRpY0Fzc2VydHxzdGVwfHN0b3JhZ2VCYXJyaWVyfHRhbnx0YW5ofHRleHR1cmVEaW1lbnNpb25zfHRleHR1cmVHYXRoZXJ8dGV4dHVyZUdhdGhlckNvbXBhcmV8dGV4dHVyZUxvYWR8dGV4dHVyZU51bUxheWVyc3x0ZXh0dXJlTnVtTGV2ZWxzfHRleHR1cmVOdW1TYW1wbGVzfHRleHR1cmVTYW1wbGV8dGV4dHVyZVNhbXBsZUJpYXN8dGV4dHVyZVNhbXBsZUNvbXBhcmV8dGV4dHVyZVNhbXBsZUNvbXBhcmVMZXZlbHx0ZXh0dXJlU2FtcGxlR3JhZHx0ZXh0dXJlU2FtcGxlTGV2ZWx8dGV4dHVyZVN0b3JlfHRleHR1cmVfMWR8dGV4dHVyZV8yZHx0ZXh0dXJlXzJkX2FycmF5fHRleHR1cmVfM2R8dGV4dHVyZV9jdWJlfHRleHR1cmVfY3ViZV9hcnJheXx0ZXh0dXJlX2RlcHRoXzJkfHRleHR1cmVfZGVwdGhfMmRfYXJyYXl8dGV4dHVyZV9kZXB0aF9jdWJlfHRleHR1cmVfZGVwdGhfY3ViZV9hcnJheXx0ZXh0dXJlX2RlcHRoX211bHRpc2FtcGxlZF8yZHx0ZXh0dXJlX211bHRpc2FtcGxlZF8yZHx0ZXh0dXJlX3N0b3JhZ2VfMWR8dGV4dHVyZV9zdG9yYWdlXzJkfHRleHR1cmVfc3RvcmFnZV8yZF9hcnJheXx0ZXh0dXJlX3N0b3JhZ2VfM2R8dHJhbnNwb3NlfHRydW5jfHUzMnx1NjR8dW5wYWNrMngxNmZsb2F0fHVucGFjazJ4MTZzbm9ybXx1bnBhY2syeDE2dW5vcm18dW5wYWNrNHg4c25vcm18dW5wYWNrNHg4dW5vcm18dmVjWzItNF18d29ya2dyb3VwQmFycmllcilcXGIvLFxuXHQnZnVuY3Rpb24tY2FsbHMnOiB7XG5cdFx0cGF0dGVybjogL1xcYltfYS16XVxcdyooPz1cXCgpL2ksXG5cdFx0YWxpYXM6ICdmdW5jdGlvbicsXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzogL1xcYig/OltBLVpdW0EtWmEtejAtOV0qKVxcYi8sXG5cdCdib29sLWxpdGVyYWwnOiB7XG5cdFx0cGF0dGVybjogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHRhbGlhczogJ2Jvb2xlYW4nLFxuXHR9LFxuXHQnaGV4LWludC1saXRlcmFsJzoge1xuXHRcdHBhdHRlcm46IC9cXGIwW3hYXVswLTlhLWZBLUZdK1tpdV0/XFxiKD8hWy5wUF0pLyxcblx0XHRhbGlhczogJ251bWJlcicsXG5cdH0sXG5cdCdoZXgtZmxvYXQtbGl0ZXJhbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiMFt4WF1bMC05YS1mQS1GXSooPzpcXC5bMC05YS1mQS1GXSopPyg/OltwUF1bKy1dP1xcZCtbZmhdPyk/LywgYWxpYXM6ICdudW1iZXInXG5cdH0sXG5cdCdkZWNpbWFsLWZsb2F0LWxpdGVyYWwnOiBbXG5cdFx0eyBwYXR0ZXJuOiAvXFxkKlxcLlxcZCsoPzpbZUVdKD86XFwrfC0pP1xcZCspP1tmaF0/LywgYWxpYXM6ICdudW1iZXInIH0sXG5cdFx0eyBwYXR0ZXJuOiAvXFxkK1xcLlxcZCooPzpbZUVdKD86XFwrfC0pP1xcZCspP1tmaF0/LywgYWxpYXM6ICdudW1iZXInIH0sXG5cdFx0eyBwYXR0ZXJuOiAvXFxkK1tlRV0oPzpcXCt8LSk/XFxkK1tmaF0/LywgYWxpYXM6ICdudW1iZXInIH0sXG5cdFx0eyBwYXR0ZXJuOiAvXFxiXFxkK1tmaF1cXGIvLCBhbGlhczogJ251bWJlcicgfSxcblx0XSxcblx0J2ludC1saXRlcmFsJzoge1xuXHRcdHBhdHRlcm46IC9cXGJcXGQrW2l1XT9cXGIvLFxuXHRcdGFsaWFzOiAnbnVtYmVyJyxcblx0fSxcblx0J29wZXJhdG9yJzogW1xuXHRcdHsgcGF0dGVybjogLyg/OlxcXnx+fFxcfCg/IVxcfCl8XFx8XFx8fCYmfDw8fD4+fCEpKD8hPSkvIH0sXG5cdFx0eyBwYXR0ZXJuOiAvJig/IVsmPV0pLyB9LFxuXHRcdHsgcGF0dGVybjogLyg/OlxcKz18LT18XFwqPXxcXC89fCU9fFxcXj18Jj18XFx8PXw8PD18Pj49KS8gfSxcblx0XHR7IHBhdHRlcm46IC8oXnxbXjw+PSFdKT0oPyFbPT5dKS8sIGxvb2tiZWhpbmQ6IHRydWUgfSxcblx0XHR7IHBhdHRlcm46IC8oPzo9PXwhPXw8PXxcXCtcXCt8LS18KF58W149XSk+PSkvLCBsb29rYmVoaW5kOiB0cnVlIH0sXG5cdFx0eyBwYXR0ZXJuOiAvKD86KD86WyslXXwoPzpcXCooPyFcXHcpKSkoPyE9KSl8KD86LSg/IT4pKXwoPzpcXC8oPyFcXC8pKS8gfSxcblx0XHR7IHBhdHRlcm46IC8tPi8gfSxcblx0XSxcblx0J3B1bmN0dWF0aW9uJzogL1tAKCl7fVtcXF0sOzw+Oi5dLyxcbn07XG5cblByaXNtLmxhbmd1YWdlcy53aWtpID0gUHJpc20ubGFuZ3VhZ2VzLmV4dGVuZCgnbWFya3VwJywge1xuXHQnYmxvY2stY29tbWVudCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSlcXC9cXCpbXFxzXFxTXSo/XFwqXFwvLyxcblx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdGFsaWFzOiAnY29tbWVudCdcblx0fSxcblx0J2hlYWRpbmcnOiB7XG5cdFx0cGF0dGVybjogL14oPSspW149XFxyXFxuXS4qP1xcMS9tLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3B1bmN0dWF0aW9uJzogL149K3w9KyQvLFxuXHRcdFx0J2ltcG9ydGFudCc6IC8uKy9cblx0XHR9XG5cdH0sXG5cdCdlbXBoYXNpcyc6IHtcblx0XHQvLyBUT0RPIE11bHRpLWxpbmVcblx0XHRwYXR0ZXJuOiAvKCd7Miw1fSkuKz9cXDEvLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J2JvbGQtaXRhbGljJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvKCcnJycnKS4rPyg/PVxcMSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRhbGlhczogWydib2xkJywgJ2l0YWxpYyddXG5cdFx0XHR9LFxuXHRcdFx0J2JvbGQnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oJycnKVteJ10oPzouKj9bXiddKT8oPz1cXDEpLyxcblx0XHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdFx0fSxcblx0XHRcdCdpdGFsaWMnOiB7XG5cdFx0XHRcdHBhdHRlcm46IC8oJycpW14nXSg/Oi4qP1teJ10pPyg/PVxcMSkvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0XHR9LFxuXHRcdFx0J3B1bmN0dWF0aW9uJzogL14nJyt8JycrJC9cblx0XHR9XG5cdH0sXG5cdCdocic6IHtcblx0XHRwYXR0ZXJuOiAvXi17NCx9L20sXG5cdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0fSxcblx0J3VybCc6IFtcblx0XHQvSVNCTiArKD86OTdbODldWyAtXT8pPyg/OlxcZFsgLV0/KXs5fVtcXGR4XVxcYnwoPzpQTUlEfFJGQykgK1xcZCsvaSxcblx0XHQvXFxbXFxbLis/XFxdXFxdfFxcWy4rP1xcXS9cblx0XSxcblx0J3ZhcmlhYmxlJzogW1xuXHRcdC9fX1tBLVpdK19fLyxcblx0XHQvLyBGSVhNRSBOZXN0ZWQgc3RydWN0dXJlcyBzaG91bGQgYmUgaGFuZGxlZFxuXHRcdC8vIHt7Zm9ybWF0bnVtOnt7I2V4cHI6e3t7M319fX19fX1cblx0XHQvXFx7ezN9Lis/XFx9ezN9Lyxcblx0XHQvXFx7XFx7Lis/XFx9XFx9L1xuXHRdLFxuXHQnc3ltYm9sJzogW1xuXHRcdC9eI3JlZGlyZWN0L2ltLFxuXHRcdC9+ezMsNX0vXG5cdF0sXG5cdC8vIEhhbmRsZSB0YWJsZSBhdHRyczpcblx0Ly8ge3xcblx0Ly8gISBzdHlsZT1cInRleHQtYWxpZ246bGVmdDtcInwgSXRlbVxuXHQvLyB8fVxuXHQndGFibGUtdGFnJzoge1xuXHRcdHBhdHRlcm46IC8oKD86XnxbfCFdKVt8IV0pW158XFxyXFxuXStcXHwoPyFcXHwpL20sXG5cdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd0YWJsZS1iYXInOiB7XG5cdFx0XHRcdHBhdHRlcm46IC9cXHwkLyxcblx0XHRcdFx0YWxpYXM6ICdwdW5jdHVhdGlvbidcblx0XHRcdH0sXG5cdFx0XHRyZXN0OiBQcmlzbS5sYW5ndWFnZXMubWFya3VwWyd0YWcnXS5pbnNpZGVcblx0XHR9XG5cdH0sXG5cdCdwdW5jdHVhdGlvbic6IC9eKD86XFx7XFx8fFxcfFxcfXxcXHwtfFsqIzo7IXxdKXxcXHxcXHx8ISEvbVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy5pbnNlcnRCZWZvcmUoJ3dpa2knLCAndGFnJywge1xuXHQvLyBQcmV2ZW50IGhpZ2hsaWdodGluZyBpbnNpZGUgPG5vd2lraT4sIDxzb3VyY2U+IGFuZCA8cHJlPiB0YWdzXG5cdCdub3dpa2knOiB7XG5cdFx0cGF0dGVybjogLzwobm93aWtpfHByZXxzb3VyY2UpXFxiW14+XSo+W1xcc1xcU10qPzxcXC9cXDE+L2ksXG5cdFx0aW5zaWRlOiB7XG5cdFx0XHQndGFnJzoge1xuXHRcdFx0XHRwYXR0ZXJuOiAvPCg/Om5vd2lraXxwcmV8c291cmNlKVxcYltePl0qPnw8XFwvKD86bm93aWtpfHByZXxzb3VyY2UpPi9pLFxuXHRcdFx0XHRpbnNpZGU6IFByaXNtLmxhbmd1YWdlcy5tYXJrdXBbJ3RhZyddLmluc2lkZVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSk7XG5cblByaXNtLmxhbmd1YWdlcy53b2xmcmFtID0ge1xuXHQnY29tbWVudCc6IC8vIEFsbG93IG9uZSBsZXZlbCBvZiBuZXN0aW5nIC0gbm90ZTogcmVnZXggdGFrZW4gZnJvbSBhcHBsZXNjaXB0XG5cdFx0L1xcKFxcKig/OlxcKFxcKig/OlteKl18XFwqKD8hXFwpKSkqXFwqXFwpfCg/IVxcKFxcKilbXFxzXFxTXSkqP1xcKlxcKS8sXG5cdCdzdHJpbmcnOiB7XG5cdFx0cGF0dGVybjogL1wiKD86XFxcXC58W15cIlxcXFxcXHJcXG5dKSpcIi8sXG5cdFx0Z3JlZWR5OiB0cnVlXG5cdH0sXG5cdCdrZXl3b3JkJzogL1xcYig/OkFic3xBYnNBcmd8QWNjdXJhY3l8QmxvY2t8RG98Rm9yfEZ1bmN0aW9ufElmfE1hbmlwdWxhdGV8TW9kdWxlfE5lc3R8TmVzdExpc3R8Tm9uZXxSZXR1cm58U3dpdGNofFRhYmxlfFdoaWNofFdoaWxlKVxcYi8sXG5cdCdjb250ZXh0Jzoge1xuXHRcdHBhdHRlcm46IC9cXGJcXHcrYCtcXHcqLyxcblx0XHRhbGlhczogJ2NsYXNzLW5hbWUnXG5cdH0sXG5cdCdibGFuayc6IHtcblx0XHRwYXR0ZXJuOiAvXFxiXFx3K19cXGIvLFxuXHRcdGFsaWFzOiAncmVnZXgnXG5cdH0sXG5cdCdnbG9iYWwtdmFyaWFibGUnOiB7XG5cdFx0cGF0dGVybjogL1xcJFxcdysvLFxuXHRcdGFsaWFzOiAndmFyaWFibGUnXG5cdH0sXG5cdCdib29sZWFuJzogL1xcYig/OkZhbHNlfFRydWUpXFxiLyxcblx0J251bWJlcic6IC8oPzpcXGIoPz1cXGQpfFxcQig/PVxcLikpKD86MFtib10pPyg/Oig/OlxcZHwweFtcXGRhLWZdKVtcXGRhLWZdKig/OlxcLlxcZCopP3xcXC5cXGQrKSg/OmVbKy1dP1xcZCspP2o/XFxiL2ksXG5cdCdvcGVyYXRvcic6IC9cXC9cXC58O3w9XFwufFxcXj18XFxeOj18Oj18PDx8Pj58PFxcfHxcXHw+fDo+fFxcfC0+fC0+fDwtfEBAQHxAQHxAfFxcL0B8PSE9fD09PXw9PXw9fFxcK3wtfFxcW1xcLy0rJT1cXF09P3whPXxcXCpcXCo/PT98XFwvXFwvPz0/fDxbPD0+XT98Pls9Pl0/fFsmfF5+XS8sXG5cdCdwdW5jdHVhdGlvbic6IC9be31bXFxdOygpLC46XS9cbn07XG5cblByaXNtLmxhbmd1YWdlcy5tYXRoZW1hdGljYSA9IFByaXNtLmxhbmd1YWdlcy53b2xmcmFtO1xuUHJpc20ubGFuZ3VhZ2VzLndsID0gUHJpc20ubGFuZ3VhZ2VzLndvbGZyYW07XG5QcmlzbS5sYW5ndWFnZXMubmIgPSBQcmlzbS5sYW5ndWFnZXMud29sZnJhbTtcblxuLy8gaHR0cHM6Ly93cmVuLmlvL1xuXG5QcmlzbS5sYW5ndWFnZXMud3JlbiA9IHtcblx0Ly8gTXVsdGlsaW5lIGNvbW1lbnRzIGluIFdyZW4gY2FuIGhhdmUgbmVzdGVkIG11bHRpbGluZSBjb21tZW50c1xuXHQvLyBDb21tZW50czogLy8gYW5kIC8qICovXG5cdCdjb21tZW50JzogW1xuXHRcdHtcblx0XHRcdC8vIHN1cHBvcnQgMyBsZXZlbHMgb2YgbmVzdGluZ1xuXHRcdFx0Ly8gcmVnZXg6IFxcL1xcKig/OlteKi9dfFxcKig/IVxcLyl8XFwvKD8hXFwqKXw8c2VsZj4pKlxcKlxcL1xuXHRcdFx0cGF0dGVybjogL1xcL1xcKig/OlteKi9dfFxcKig/IVxcLyl8XFwvKD8hXFwqKXxcXC9cXCooPzpbXiovXXxcXCooPyFcXC8pfFxcLyg/IVxcKil8XFwvXFwqKD86W14qL118XFwqKD8hXFwvKXxcXC8oPyFcXCopKSpcXCpcXC8pKlxcKlxcLykqXFwqXFwvLyxcblx0XHRcdGdyZWVkeTogdHJ1ZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0cGF0dGVybjogLyhefFteXFxcXDpdKVxcL1xcLy4qLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9XG5cdF0sXG5cblx0Ly8gVHJpcGxlIHF1b3RlZCBzdHJpbmdzIGFyZSBtdWx0aWxpbmUgYnV0IGNhbm5vdCBoYXZlIGludGVycG9sYXRpb24gKHJhdyBzdHJpbmdzKVxuXHQvLyBCYXNlZCBvbiBwcmlzbS1weXRob24uanNcblx0J3RyaXBsZS1xdW90ZWQtc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIlwiXCJbXFxzXFxTXSo/XCJcIlwiLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdzdHJpbmcnXG5cdH0sXG5cblx0Ly8gc2VlIGJlbG93XG5cdCdzdHJpbmctbGl0ZXJhbCc6IG51bGwsXG5cblx0Ly8gIyEvdXNyL2Jpbi9lbnYgd3JlbiBvbiB0aGUgZmlyc3QgbGluZVxuXHQnaGFzaGJhbmcnOiB7XG5cdFx0cGF0dGVybjogL14jIVxcLy4rLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdjb21tZW50J1xuXHR9LFxuXG5cdC8vIEF0dHJpYnV0ZXMgYXJlIHNwZWNpYWwga2V5d29yZHMgdG8gYWRkIG1ldGEgZGF0YSB0byBjbGFzc2VzXG5cdCdhdHRyaWJ1dGUnOiB7XG5cdFx0Ly8gIyEgYXR0cmlidXRlcyBhcmUgc3RvcmVkIGluIGNsYXNzIHByb3BlcnRpZXNcblx0XHQvLyAjIW15dmFyID0gdHJ1ZVxuXHRcdC8vICNhdHRyaWJ1dGVzIGFyZSBub3Qgc3RvcmVkIGFuZCBkaXNtaXNzZWQgYXQgY29tcGlsYXRpb25cblx0XHRwYXR0ZXJuOiAvIyE/WyBcXHRcXHUzMDAwXSpcXHcrLyxcblx0XHRhbGlhczogJ2tleXdvcmQnXG5cdH0sXG5cdCdjbGFzcy1uYW1lJzogW1xuXHRcdHtcblx0XHRcdC8vIGNsYXNzIGRlZmluaXRpb25cblx0XHRcdC8vIGNsYXNzIE1ldGEge31cblx0XHRcdHBhdHRlcm46IC8oXFxiY2xhc3NcXHMrKVxcdysvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0Ly8gQSBjbGFzcyBtdXN0IGFsd2F5cyBzdGFydCB3aXRoIGFuIHVwcGVyY2FzZS5cblx0XHQvLyBGaWxlLnJlYWRcblx0XHQvXFxiW0EtWl1bYS16XFxkX10qXFxiLyxcblx0XSxcblxuXHQvLyBBIGNvbnN0YW50IGNhbiBiZSBhIHZhcmlhYmxlLCBjbGFzcywgcHJvcGVydHkgb3IgbWV0aG9kLiBKdXN0IG5hbWVkIGluIGFsbCB1cHBlcmNhc2UgbGV0dGVyc1xuXHQnY29uc3RhbnQnOiAvXFxiW0EtWl1bQS1aXFxkX10qXFxiLyxcblxuXHQnbnVsbCc6IHtcblx0XHRwYXR0ZXJuOiAvXFxibnVsbFxcYi8sXG5cdFx0YWxpYXM6ICdrZXl3b3JkJ1xuXHR9LFxuXHQna2V5d29yZCc6IC9cXGIoPzphc3xicmVha3xjbGFzc3xjb25zdHJ1Y3R8Y29udGludWV8ZWxzZXxmb3J8Zm9yZWlnbnxpZnxpbXBvcnR8aW58aXN8cmV0dXJufHN0YXRpY3xzdXBlcnx0aGlzfHZhcnx3aGlsZSlcXGIvLFxuXHQnYm9vbGVhbic6IC9cXGIoPzpmYWxzZXx0cnVlKVxcYi8sXG5cdCdudW1iZXInOiAvXFxiKD86MHhbXFxkYS1mXSt8XFxkKyg/OlxcLlxcZCspPyg/OmVbKy1dP1xcZCspPylcXGIvaSxcblxuXHQvLyBGdW5jdGlvbnMgY2FuIGJlIENsYXNzLm1ldGhvZCgpXG5cdCdmdW5jdGlvbic6IC9cXGJbYS16X11cXHcqKD89XFxzKlsoe10pL2ksXG5cblx0J29wZXJhdG9yJzogLzw8fD4+fFs9ITw+XT0/fCYmfFxcfFxcfHxbLSsqLyV+XiZ8PzpdfFxcLnsyLDN9Lyxcblx0J3B1bmN0dWF0aW9uJzogL1tcXFtcXF0oKXt9Liw7XS8sXG59O1xuXG5QcmlzbS5sYW5ndWFnZXMud3Jlblsnc3RyaW5nLWxpdGVyYWwnXSA9IHtcblx0Ly8gQSBzaW5nbGUgcXVvdGUgc3RyaW5nIGlzIG11bHRpbGluZSBhbmQgY2FuIGhhdmUgaW50ZXJwb2xhdGlvbiAoc2ltaWxhciB0byBKUyBiYWNrdGlja3MgYGApXG5cdHBhdHRlcm46IC8oXnxbXlxcXFxcIl0pXCIoPzpbXlxcXFxcIiVdfFxcXFxbXFxzXFxTXXwlKD8hXFwoKXwlXFwoKD86W14oKV18XFwoKD86W14oKV18XFwoW14pXSpcXCkpKlxcKSkqXFwpKSpcIi8sXG5cdGxvb2tiZWhpbmQ6IHRydWUsXG5cdGdyZWVkeTogdHJ1ZSxcblx0aW5zaWRlOiB7XG5cdFx0J2ludGVycG9sYXRpb24nOiB7XG5cdFx0XHQvLyBcIiUoaW50ZXJwb2xhdGlvbilcIlxuXHRcdFx0cGF0dGVybjogLygoPzpefFteXFxcXF0pKD86XFxcXHsyfSkqKSVcXCgoPzpbXigpXXxcXCgoPzpbXigpXXxcXChbXildKlxcKSkqXFwpKSpcXCkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZSxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQnZXhwcmVzc2lvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXiglXFwoKVtcXHNcXFNdKyg/PVxcKSQpLyxcblx0XHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLndyZW5cblx0XHRcdFx0fSxcblx0XHRcdFx0J2ludGVycG9sYXRpb24tcHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL14lXFwofFxcKSQvLFxuXHRcdFx0XHRcdGFsaWFzOiAncHVuY3R1YXRpb24nXG5cdFx0XHRcdH0sXG5cdFx0XHR9XG5cdFx0fSxcblx0XHQnc3RyaW5nJzogL1tcXHNcXFNdKy9cblx0fVxufTtcblxuKGZ1bmN0aW9uIChQcmlzbSkge1xuXHRQcmlzbS5sYW5ndWFnZXMueGVvcmEgPSBQcmlzbS5sYW5ndWFnZXMuZXh0ZW5kKCdtYXJrdXAnLCB7XG5cdFx0J2NvbnN0YW50Jzoge1xuXHRcdFx0cGF0dGVybjogL1xcJCg/OkRvbWFpbkNvbnRlbnRzfFBhZ2VSZW5kZXJEdXJhdGlvbilcXCQvLFxuXHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRwYXR0ZXJuOiAvXFwkL1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwkQD8oPzojK3xbLSsqfj1eXSk/W1xcdy5dK1xcJC8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9bJC5dL1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnb3BlcmF0b3InOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyMrfFstKyp+PV5AXS9cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uLWlubGluZSc6IHtcblx0XHRcdHBhdHRlcm46IC9cXCRGOlstXFx3Ll0rXFw/Wy1cXHcuXSsoPzosKD86KD86QFstI10qXFx3K1xcLltcXHcrLl1cXC4qKSpcXHwpKig/Oig/OltcXHcrXXxbLSMqLn5eXStbXFx3K118PVxcUykoPzpbXiQ9XXw9K1tePV0pKj0qfCg/OkBbLSNdKlxcdytcXC5bXFx3Ky5dXFwuKikrKD86KD86W1xcdytdfFstIyp+Xl1bLSMqLn5eXSpbXFx3K118PVxcUykoPzpbXiQ9XXw9K1tePV0pKj0qKT8pPyk/XFwkLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQndmFyaWFibGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyg/OlssfF0pQD8oPzojK3xbLSsqfj1eXSk/W1xcdy5dKy8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC9bLC58XS9cblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQnb3BlcmF0b3InOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8jK3xbLSsqfj1eQF0vXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcJFxcdzp8WyQ6Py4sfF0vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J2Z1bmN0aW9uLWJsb2NrJzoge1xuXHRcdFx0cGF0dGVybjogL1xcJFhGOlxce1stXFx3Ll0rXFw/Wy1cXHcuXSsoPzosKD86KD86QFstI10qXFx3K1xcLltcXHcrLl1cXC4qKSpcXHwpKig/Oig/OltcXHcrXXxbLSMqLn5eXStbXFx3K118PVxcUykoPzpbXiQ9XXw9K1tePV0pKj0qfCg/OkBbLSNdKlxcdytcXC5bXFx3Ky5dXFwuKikrKD86KD86W1xcdytdfFstIyp+Xl1bLSMqLn5eXSpbXFx3K118PVxcUykoPzpbXiQ9XXw9K1tePV0pKj0qKT8pPyk/XFx9OlhGXFwkLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1skOnt9Py4sfF0vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J2RpcmVjdGl2ZS1pbmxpbmUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwkXFx3KD86I1xcZCtcXCs/KT8oPzpcXFtbLVxcdy5dK1xcXSk/OlstXFwvXFx3Ll0rXFwkLyxcblx0XHRcdGluc2lkZToge1xuXHRcdFx0XHQncHVuY3R1YXRpb24nOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogL1xcJCg/Olxcdzp8Qyg/OlxcW3wjXFxkKSk/fFs6e1tcXF1dLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCd0YWcnOiB7XG5cdFx0XHRcdFx0XHRcdHBhdHRlcm46IC8jXFxkL1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQnZGlyZWN0aXZlLWJsb2NrLW9wZW4nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwkXFx3KzpcXHt8XFwkXFx3KD86I1xcZCtcXCs/KT8oPzpcXFtbLVxcdy5dK1xcXSk/OlstXFx3Ll0rOlxceyg/OiFbQS1aXSspPy8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9cXCQoPzpcXHc6fEMoPzpcXFt8I1xcZCkpP3xbOntbXFxdXS8sXG5cdFx0XHRcdFx0aW5zaWRlOiB7XG5cdFx0XHRcdFx0XHQndGFnJzoge1xuXHRcdFx0XHRcdFx0XHRwYXR0ZXJuOiAvI1xcZC9cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdhdHRyaWJ1dGUnOiB7XG5cdFx0XHRcdFx0cGF0dGVybjogLyFbQS1aXSskLyxcblx0XHRcdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0XHRcdCdwdW5jdHVhdGlvbic6IHtcblx0XHRcdFx0XHRcdFx0cGF0dGVybjogLyEvXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH0sXG5cdFx0J2RpcmVjdGl2ZS1ibG9jay1zZXBhcmF0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFx9OlstXFx3Ll0rOlxcey8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9bOnt9XS9cblx0XHRcdFx0fVxuXHRcdFx0fSxcblx0XHRcdGFsaWFzOiAnZnVuY3Rpb24nXG5cdFx0fSxcblx0XHQnZGlyZWN0aXZlLWJsb2NrLWNsb3NlJzoge1xuXHRcdFx0cGF0dGVybjogL1xcfTpbLVxcdy5dK1xcJC8sXG5cdFx0XHRpbnNpZGU6IHtcblx0XHRcdFx0J3B1bmN0dWF0aW9uJzoge1xuXHRcdFx0XHRcdHBhdHRlcm46IC9bOnt9JF0vXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRhbGlhczogJ2Z1bmN0aW9uJ1xuXHRcdH1cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZSgnaW5zaWRlJywgJ3B1bmN0dWF0aW9uJywge1xuXHRcdCd2YXJpYWJsZSc6IFByaXNtLmxhbmd1YWdlcy54ZW9yYVsnZnVuY3Rpb24taW5saW5lJ10uaW5zaWRlWyd2YXJpYWJsZSddXG5cdH0sIFByaXNtLmxhbmd1YWdlcy54ZW9yYVsnZnVuY3Rpb24tYmxvY2snXSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnhlb3JhY3ViZSA9IFByaXNtLmxhbmd1YWdlcy54ZW9yYTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0LyoqXG5cdCAqIElmIHRoZSBnaXZlbiBsYW5ndWFnZSBpcyBwcmVzZW50LCBpdCB3aWxsIGluc2VydCB0aGUgZ2l2ZW4gZG9jIGNvbW1lbnQgZ3JhbW1hciB0b2tlbiBpbnRvIGl0LlxuXHQgKlxuXHQgKiBAcGFyYW0ge3N0cmluZ30gbGFuZ1xuXHQgKiBAcGFyYW0ge2FueX0gZG9jQ29tbWVudFxuXHQgKi9cblx0ZnVuY3Rpb24gaW5zZXJ0RG9jQ29tbWVudChsYW5nLCBkb2NDb21tZW50KSB7XG5cdFx0aWYgKFByaXNtLmxhbmd1YWdlc1tsYW5nXSkge1xuXHRcdFx0UHJpc20ubGFuZ3VhZ2VzLmluc2VydEJlZm9yZShsYW5nLCAnY29tbWVudCcsIHtcblx0XHRcdFx0J2RvYy1jb21tZW50JzogZG9jQ29tbWVudFxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0dmFyIHRhZyA9IFByaXNtLmxhbmd1YWdlcy5tYXJrdXAudGFnO1xuXG5cdHZhciBzbGFzaERvY0NvbW1lbnQgPSB7XG5cdFx0cGF0dGVybjogL1xcL1xcL1xcLy4qLyxcblx0XHRncmVlZHk6IHRydWUsXG5cdFx0YWxpYXM6ICdjb21tZW50Jyxcblx0XHRpbnNpZGU6IHtcblx0XHRcdCd0YWcnOiB0YWdcblx0XHR9XG5cdH07XG5cdHZhciB0aWNrRG9jQ29tbWVudCA9IHtcblx0XHRwYXR0ZXJuOiAvJycnLiovLFxuXHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRhbGlhczogJ2NvbW1lbnQnLFxuXHRcdGluc2lkZToge1xuXHRcdFx0J3RhZyc6IHRhZ1xuXHRcdH1cblx0fTtcblxuXHRpbnNlcnREb2NDb21tZW50KCdjc2hhcnAnLCBzbGFzaERvY0NvbW1lbnQpO1xuXHRpbnNlcnREb2NDb21tZW50KCdmc2hhcnAnLCBzbGFzaERvY0NvbW1lbnQpO1xuXHRpbnNlcnREb2NDb21tZW50KCd2Ym5ldCcsIHRpY2tEb2NDb21tZW50KTtcblxufShQcmlzbSkpO1xuXG5QcmlzbS5sYW5ndWFnZXMueG9qbyA9IHtcblx0J2NvbW1lbnQnOiB7XG5cdFx0cGF0dGVybjogLyg/Oid8XFwvXFwvfFJlbVxcYikuKy9pLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQnc3RyaW5nJzoge1xuXHRcdHBhdHRlcm46IC9cIig/OlwiXCJ8W15cIl0pKlwiLyxcblx0XHRncmVlZHk6IHRydWVcblx0fSxcblx0J251bWJlcic6IFtcblx0XHQvKD86XFxiXFxkKyg/OlxcLlxcZCopP3xcXEJcXC5cXGQrKSg/OkVbKy1dP1xcZCspPy9pLFxuXHRcdC8mW2JjaG91XVthLXpcXGRdKy9pXG5cdF0sXG5cdCdkaXJlY3RpdmUnOiB7XG5cdFx0cGF0dGVybjogLyMoPzpFbHNlfEVsc2VJZnxFbmRpZnxJZnxQcmFnbWEpXFxiL2ksXG5cdFx0YWxpYXM6ICdwcm9wZXJ0eSdcblx0fSxcblx0J2tleXdvcmQnOiAvXFxiKD86QWRkSGFuZGxlcnxBcHB8QXJyYXl8QXMoPzpzaWducyk/fEF1dG98Qm9vbGVhbnxCcmVha3xCeSg/OlJlZnxWYWwpfEJ5dGV8Q2FsbHxDYXNlfENhdGNofENGU3RyaW5nUmVmfENHRmxvYXR8Q2xhc3N8Q29sb3J8Q29uc3R8Q29udGludWV8Q1N0cmluZ3xDdXJyZW5jeXxDdXJyZW50TWV0aG9kTmFtZXxEZWNsYXJlfERlbGVnYXRlfERpbXxEbyg/OnVibGV8d25Ubyk/fEVhY2h8RWxzZSg/OklmKT98RW5kfEVudW1lcmF0aW9ufEV2ZW50fEV4Y2VwdGlvbnxFeGl0fEV4dGVuZHN8RmFsc2V8RmluYWxseXxGb3J8RnVuY3Rpb258R2V0fEdldFR5cGVJbmZvfEdsb2JhbHxHT1RPfElmfEltcGxlbWVudHN8SW58SW5oZXJpdHN8SW50KD86OHwxNnwzMnw2NHxlZ2VyfGVyZmFjZSk/fExpYnxMb29wfE1lfE1vZHVsZXxOZXh0fE5pbHxPYmplY3R8T3B0aW9uYWx8T1NUeXBlfFBhcmFtQXJyYXl8UHJpdmF0ZXxQcm9wZXJ0eXxQcm90ZWN0ZWR8UFN0cmluZ3xQdHJ8UmFpc2UoPzpFdmVudCk/fFJlRGltfFJlbW92ZUhhbmRsZXJ8UmV0dXJufFNlbGVjdCg/Om9yKT98U2VsZnxTZXR8U2hhcmVkfFNob3J0fFNpbmdsZXxTb2Z0fFN0YXRpY3xTdGVwfFN0cmluZ3xTdWJ8U3VwZXJ8VGV4dHxUaGVufFRvfFRydWV8VHJ5fFVib3VuZHxVSW50KD86OHwxNnwzMnw2NHxlZ2VyKT98VW50aWx8VXNpbmd8VmFyKD86aWFudCk/fFdlbmR8V2hpbGV8V2luZG93UHRyfFdTdHJpbmcpXFxiL2ksXG5cdCdvcGVyYXRvcic6IC88Wz0+XT98Pj0/fFsrXFwtKlxcL1xcXFxePV18XFxiKD86QWRkcmVzc09mfEFuZHxDdHlwZXxJc0E/fE1vZHxOZXd8Tm90fE9yfFdlYWtBZGRyZXNzT2Z8WG9yKVxcYi9pLFxuXHQncHVuY3R1YXRpb24nOiAvWy4sOzooKV0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnhxdWVyeSA9IFByaXNtLmxhbmd1YWdlcy5leHRlbmQoJ21hcmt1cCcsIHtcblx0XHQneHF1ZXJ5LWNvbW1lbnQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwoOltcXHNcXFNdKj86XFwpLyxcblx0XHRcdGdyZWVkeTogdHJ1ZSxcblx0XHRcdGFsaWFzOiAnY29tbWVudCdcblx0XHR9LFxuXHRcdCdzdHJpbmcnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFtcIiddKSg/OlxcMVxcMXwoPyFcXDEpW1xcc1xcU10pKlxcMS8sXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdleHRlbnNpb24nOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFwoIy4rPyNcXCkvLFxuXHRcdFx0YWxpYXM6ICdzeW1ib2wnXG5cdFx0fSxcblx0XHQndmFyaWFibGUnOiAvXFwkWy1cXHc6XSsvLFxuXHRcdCdheGlzJzoge1xuXHRcdFx0cGF0dGVybjogLyhefFteLV0pKD86YW5jZXN0b3IoPzotb3Itc2VsZik/fGF0dHJpYnV0ZXxjaGlsZHxkZXNjZW5kYW50KD86LW9yLXNlbGYpP3xmb2xsb3dpbmcoPzotc2libGluZyk/fHBhcmVudHxwcmVjZWRpbmcoPzotc2libGluZyk/fHNlbGYpKD89OjopLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH0sXG5cdFx0J2tleXdvcmQtb3BlcmF0b3InOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W146LV0pXFxiKD86YW5kfGNhc3RhYmxlIGFzfGRpdnxlcXxleGNlcHR8Z2V8Z3R8aWRpdnxpbnN0YW5jZSBvZnxpbnRlcnNlY3R8aXN8bGV8bHR8bW9kfG5lfG9yfHVuaW9uKVxcYig/PSR8W146LV0pLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRhbGlhczogJ29wZXJhdG9yJ1xuXHRcdH0sXG5cdFx0J2tleXdvcmQnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKF58W146LV0pXFxiKD86YXN8YXNjZW5kaW5nfGF0fGJhc2UtdXJpfGJvdW5kYXJ5LXNwYWNlfGNhc2V8Y2FzdCBhc3xjb2xsYXRpb258Y29uc3RydWN0aW9ufGNvcHktbmFtZXNwYWNlc3xkZWNsYXJlfGRlZmF1bHR8ZGVzY2VuZGluZ3xlbHNlfGVtcHR5ICg/OmdyZWF0ZXN0fGxlYXN0KXxlbmNvZGluZ3xldmVyeXxleHRlcm5hbHxmb3J8ZnVuY3Rpb258aWZ8aW1wb3J0fGlufGluaGVyaXR8bGF4fGxldHxtYXB8bW9kdWxlfG5hbWVzcGFjZXxuby1pbmhlcml0fG5vLXByZXNlcnZlfG9wdGlvbnxvcmRlcig/OiBieXxlZHxpbmcpP3xwcmVzZXJ2ZXxyZXR1cm58c2F0aXNmaWVzfHNjaGVtYXxzb21lfHN0YWJsZXxzdHJpY3R8c3RyaXB8dGhlbnx0b3x0cmVhdCBhc3x0eXBlc3dpdGNofHVub3JkZXJlZHx2YWxpZGF0ZXx2YXJpYWJsZXx2ZXJzaW9ufHdoZXJlfHhxdWVyeSlcXGIoPz0kfFteOi1dKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnZnVuY3Rpb24nOiAvW1xcdy1dKyg/OjpbXFx3LV0rKSooPz1cXHMqXFwoKS8sXG5cdFx0J3hxdWVyeS1lbGVtZW50Jzoge1xuXHRcdFx0cGF0dGVybjogLyhlbGVtZW50XFxzKylbXFx3LV0rKD86OltcXHctXSspKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICd0YWcnXG5cdFx0fSxcblx0XHQneHF1ZXJ5LWF0dHJpYnV0ZSc6IHtcblx0XHRcdHBhdHRlcm46IC8oYXR0cmlidXRlXFxzKylbXFx3LV0rKD86OltcXHctXSspKi8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0YWxpYXM6ICdhdHRyLW5hbWUnXG5cdFx0fSxcblx0XHQnYnVpbHRpbic6IHtcblx0XHRcdHBhdHRlcm46IC8oXnxbXjotXSlcXGIoPzphdHRyaWJ1dGV8Y29tbWVudHxkb2N1bWVudHxlbGVtZW50fHByb2Nlc3NpbmctaW5zdHJ1Y3Rpb258dGV4dHx4czooPzpFTlRJVElFU3xFTlRJVFl8SUR8SURSRUZTP3xOQ05hbWV8Tk1UT0tFTlM/fE5PVEFUSU9OfE5hbWV8UU5hbWV8YW55QXRvbWljVHlwZXxhbnlUeXBlfGFueVVSSXxiYXNlNjRCaW5hcnl8Ym9vbGVhbnxieXRlfGRhdGV8ZGF0ZVRpbWV8ZGF5VGltZUR1cmF0aW9ufGRlY2ltYWx8ZG91YmxlfGR1cmF0aW9ufGZsb2F0fGdEYXl8Z01vbnRofGdNb250aERheXxnWWVhcnxnWWVhck1vbnRofGhleEJpbmFyeXxpbnR8aW50ZWdlcnxsYW5ndWFnZXxsb25nfG5lZ2F0aXZlSW50ZWdlcnxub25OZWdhdGl2ZUludGVnZXJ8bm9uUG9zaXRpdmVJbnRlZ2VyfG5vcm1hbGl6ZWRTdHJpbmd8cG9zaXRpdmVJbnRlZ2VyfHNob3J0fHN0cmluZ3x0aW1lfHRva2VufHVuc2lnbmVkKD86Qnl0ZXxJbnR8TG9uZ3xTaG9ydCl8dW50eXBlZCg/OkF0b21pYyk/fHllYXJNb250aER1cmF0aW9uKSlcXGIoPz0kfFteOi1dKS8sXG5cdFx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdFx0fSxcblx0XHQnbnVtYmVyJzogL1xcYlxcZCsoPzpcXC5cXGQrKT8oPzpFWystXT9cXGQrKT8vLFxuXHRcdCdvcGVyYXRvcic6IFtcblx0XHRcdC9bKyo9P3xAXXxcXC5cXC4/fDo9fCE9fDxbPTxdP3w+Wz0+XT8vLFxuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvKFxccyktKD89XFxzKS8sXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdwdW5jdHVhdGlvbic6IC9bW1xcXSgpe30sOzovXS9cblx0fSk7XG5cblx0UHJpc20ubGFuZ3VhZ2VzLnhxdWVyeS50YWcucGF0dGVybiA9IC88XFwvPyg/IVxcZClbXlxccz5cXC89JDwlXSsoPzpcXHMrW15cXHM+XFwvPV0rKD86PSg/OihcInwnKSg/OlxcXFxbXFxzXFxTXXxcXHsoPyFcXHspKD86XFx7KD86XFx7W157fV0qXFx9fFtee31dKSpcXH18W157fV0pK1xcfXwoPyFcXDEpW15cXFxcXSkqXFwxfFteXFxzJ1wiPj1dKykpPykqXFxzKlxcLz8+Lztcblx0UHJpc20ubGFuZ3VhZ2VzLnhxdWVyeVsndGFnJ10uaW5zaWRlWydhdHRyLXZhbHVlJ10ucGF0dGVybiA9IC89KD86KFwifCcpKD86XFxcXFtcXHNcXFNdfFxceyg/IVxceykoPzpcXHsoPzpcXHtbXnt9XSpcXH18W157fV0pKlxcfXxbXnt9XSkrXFx9fCg/IVxcMSlbXlxcXFxdKSpcXDF8W15cXHMnXCI+PV0rKS87XG5cdFByaXNtLmxhbmd1YWdlcy54cXVlcnlbJ3RhZyddLmluc2lkZVsnYXR0ci12YWx1ZSddLmluc2lkZVsncHVuY3R1YXRpb24nXSA9IC9ePVwifFwiJC87XG5cdFByaXNtLmxhbmd1YWdlcy54cXVlcnlbJ3RhZyddLmluc2lkZVsnYXR0ci12YWx1ZSddLmluc2lkZVsnZXhwcmVzc2lvbiddID0ge1xuXHRcdC8vIEFsbG93IGZvciB0d28gbGV2ZWxzIG9mIG5lc3Rpbmdcblx0XHRwYXR0ZXJuOiAvXFx7KD8hXFx7KSg/Olxceyg/Olxce1tee31dKlxcfXxbXnt9XSkqXFx9fFtee31dKStcXH0vLFxuXHRcdGluc2lkZTogUHJpc20ubGFuZ3VhZ2VzLnhxdWVyeSxcblx0XHRhbGlhczogJ2xhbmd1YWdlLXhxdWVyeSdcblx0fTtcblxuXHQvLyBUaGUgZm9sbG93aW5nIHdpbGwgaGFuZGxlIHBsYWluIHRleHQgaW5zaWRlIHRhZ3Ncblx0dmFyIHN0cmluZ2lmeVRva2VuID0gZnVuY3Rpb24gKHRva2VuKSB7XG5cdFx0aWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiB0b2tlbjtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiB0b2tlbi5jb250ZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHRva2VuLmNvbnRlbnQ7XG5cdFx0fVxuXHRcdHJldHVybiB0b2tlbi5jb250ZW50Lm1hcChzdHJpbmdpZnlUb2tlbikuam9pbignJyk7XG5cdH07XG5cblx0dmFyIHdhbGtUb2tlbnMgPSBmdW5jdGlvbiAodG9rZW5zKSB7XG5cdFx0dmFyIG9wZW5lZFRhZ3MgPSBbXTtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIHRva2VuID0gdG9rZW5zW2ldO1xuXHRcdFx0dmFyIG5vdFRhZ05vckJyYWNlID0gZmFsc2U7XG5cblx0XHRcdGlmICh0eXBlb2YgdG9rZW4gIT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdGlmICh0b2tlbi50eXBlID09PSAndGFnJyAmJiB0b2tlbi5jb250ZW50WzBdICYmIHRva2VuLmNvbnRlbnRbMF0udHlwZSA9PT0gJ3RhZycpIHtcblx0XHRcdFx0XHQvLyBXZSBmb3VuZCBhIHRhZywgbm93IGZpbmQgaXRzIGtpbmRcblxuXHRcdFx0XHRcdGlmICh0b2tlbi5jb250ZW50WzBdLmNvbnRlbnRbMF0uY29udGVudCA9PT0gJzwvJykge1xuXHRcdFx0XHRcdFx0Ly8gQ2xvc2luZyB0YWdcblx0XHRcdFx0XHRcdGlmIChvcGVuZWRUYWdzLmxlbmd0aCA+IDAgJiYgb3BlbmVkVGFnc1tvcGVuZWRUYWdzLmxlbmd0aCAtIDFdLnRhZ05hbWUgPT09IHN0cmluZ2lmeVRva2VuKHRva2VuLmNvbnRlbnRbMF0uY29udGVudFsxXSkpIHtcblx0XHRcdFx0XHRcdFx0Ly8gUG9wIG1hdGNoaW5nIG9wZW5pbmcgdGFnXG5cdFx0XHRcdFx0XHRcdG9wZW5lZFRhZ3MucG9wKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGlmICh0b2tlbi5jb250ZW50W3Rva2VuLmNvbnRlbnQubGVuZ3RoIC0gMV0uY29udGVudCA9PT0gJy8+Jykge1xuXHRcdFx0XHRcdFx0XHQvLyBBdXRvY2xvc2VkIHRhZywgaWdub3JlXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBPcGVuaW5nIHRhZ1xuXHRcdFx0XHRcdFx0XHRvcGVuZWRUYWdzLnB1c2goe1xuXHRcdFx0XHRcdFx0XHRcdHRhZ05hbWU6IHN0cmluZ2lmeVRva2VuKHRva2VuLmNvbnRlbnRbMF0uY29udGVudFsxXSksXG5cdFx0XHRcdFx0XHRcdFx0b3BlbmVkQnJhY2VzOiAwXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIGlmIChcblx0XHRcdFx0XHRvcGVuZWRUYWdzLmxlbmd0aCA+IDAgJiYgdG9rZW4udHlwZSA9PT0gJ3B1bmN0dWF0aW9uJyAmJiB0b2tlbi5jb250ZW50ID09PSAneycgJiZcblx0XHRcdFx0XHQvLyBJZ25vcmUgYHt7YFxuXHRcdFx0XHRcdCghdG9rZW5zW2kgKyAxXSB8fCB0b2tlbnNbaSArIDFdLnR5cGUgIT09ICdwdW5jdHVhdGlvbicgfHwgdG9rZW5zW2kgKyAxXS5jb250ZW50ICE9PSAneycpICYmXG5cdFx0XHRcdFx0KCF0b2tlbnNbaSAtIDFdIHx8IHRva2Vuc1tpIC0gMV0udHlwZSAhPT0gJ3BsYWluLXRleHQnIHx8IHRva2Vuc1tpIC0gMV0uY29udGVudCAhPT0gJ3snKVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHQvLyBIZXJlIHdlIG1pZ2h0IGhhdmUgZW50ZXJlZCBhbiBYUXVlcnkgZXhwcmVzc2lvbiBpbnNpZGUgYSB0YWdcblx0XHRcdFx0XHRvcGVuZWRUYWdzW29wZW5lZFRhZ3MubGVuZ3RoIC0gMV0ub3BlbmVkQnJhY2VzKys7XG5cblx0XHRcdFx0fSBlbHNlIGlmIChvcGVuZWRUYWdzLmxlbmd0aCA+IDAgJiYgb3BlbmVkVGFnc1tvcGVuZWRUYWdzLmxlbmd0aCAtIDFdLm9wZW5lZEJyYWNlcyA+IDAgJiYgdG9rZW4udHlwZSA9PT0gJ3B1bmN0dWF0aW9uJyAmJiB0b2tlbi5jb250ZW50ID09PSAnfScpIHtcblxuXHRcdFx0XHRcdC8vIEhlcmUgd2UgbWlnaHQgaGF2ZSBsZWZ0IGFuIFhRdWVyeSBleHByZXNzaW9uIGluc2lkZSBhIHRhZ1xuXHRcdFx0XHRcdG9wZW5lZFRhZ3Nbb3BlbmVkVGFncy5sZW5ndGggLSAxXS5vcGVuZWRCcmFjZXMtLTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKHRva2VuLnR5cGUgIT09ICdjb21tZW50Jykge1xuXHRcdFx0XHRcdG5vdFRhZ05vckJyYWNlID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0aWYgKG5vdFRhZ05vckJyYWNlIHx8IHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcblx0XHRcdFx0aWYgKG9wZW5lZFRhZ3MubGVuZ3RoID4gMCAmJiBvcGVuZWRUYWdzW29wZW5lZFRhZ3MubGVuZ3RoIC0gMV0ub3BlbmVkQnJhY2VzID09PSAwKSB7XG5cdFx0XHRcdFx0Ly8gSGVyZSB3ZSBhcmUgaW5zaWRlIGEgdGFnLCBhbmQgbm90IGluc2lkZSBhbiBYUXVlcnkgZXhwcmVzc2lvbi5cblx0XHRcdFx0XHQvLyBUaGF0J3MgcGxhaW4gdGV4dDogZHJvcCBhbnkgdG9rZW5zIG1hdGNoZWQuXG5cdFx0XHRcdFx0dmFyIHBsYWluVGV4dCA9IHN0cmluZ2lmeVRva2VuKHRva2VuKTtcblxuXHRcdFx0XHRcdC8vIEFuZCBtZXJnZSB0ZXh0IHdpdGggYWRqYWNlbnQgdGV4dFxuXHRcdFx0XHRcdGlmIChpIDwgdG9rZW5zLmxlbmd0aCAtIDEgJiYgKHR5cGVvZiB0b2tlbnNbaSArIDFdID09PSAnc3RyaW5nJyB8fCB0b2tlbnNbaSArIDFdLnR5cGUgPT09ICdwbGFpbi10ZXh0JykpIHtcblx0XHRcdFx0XHRcdHBsYWluVGV4dCArPSBzdHJpbmdpZnlUb2tlbih0b2tlbnNbaSArIDFdKTtcblx0XHRcdFx0XHRcdHRva2Vucy5zcGxpY2UoaSArIDEsIDEpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoaSA+IDAgJiYgKHR5cGVvZiB0b2tlbnNbaSAtIDFdID09PSAnc3RyaW5nJyB8fCB0b2tlbnNbaSAtIDFdLnR5cGUgPT09ICdwbGFpbi10ZXh0JykpIHtcblx0XHRcdFx0XHRcdHBsYWluVGV4dCA9IHN0cmluZ2lmeVRva2VuKHRva2Vuc1tpIC0gMV0pICsgcGxhaW5UZXh0O1xuXHRcdFx0XHRcdFx0dG9rZW5zLnNwbGljZShpIC0gMSwgMSk7XG5cdFx0XHRcdFx0XHRpLS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKC9eXFxzKyQvLnRlc3QocGxhaW5UZXh0KSkge1xuXHRcdFx0XHRcdFx0dG9rZW5zW2ldID0gcGxhaW5UZXh0O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0b2tlbnNbaV0gPSBuZXcgUHJpc20uVG9rZW4oJ3BsYWluLXRleHQnLCBwbGFpblRleHQsIG51bGwsIHBsYWluVGV4dCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0b2tlbi5jb250ZW50ICYmIHR5cGVvZiB0b2tlbi5jb250ZW50ICE9PSAnc3RyaW5nJykge1xuXHRcdFx0XHR3YWxrVG9rZW5zKHRva2VuLmNvbnRlbnQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHRQcmlzbS5ob29rcy5hZGQoJ2FmdGVyLXRva2VuaXplJywgZnVuY3Rpb24gKGVudikge1xuXHRcdGlmIChlbnYubGFuZ3VhZ2UgIT09ICd4cXVlcnknKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHdhbGtUb2tlbnMoZW52LnRva2Vucyk7XG5cdH0pO1xuXG59KFByaXNtKSk7XG5cblByaXNtLmxhbmd1YWdlcy55YW5nID0ge1xuXHQvLyBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjAyMCNwYWdlLTM0XG5cdC8vIGh0dHA6Ly93d3cueWFuZy1jZW50cmFsLm9yZy90d2lraS9iaW4vdmlldy9NYWluL1lhbmdFeGFtcGxlc1xuXHQnY29tbWVudCc6IC9cXC9cXCpbXFxzXFxTXSo/XFwqXFwvfFxcL1xcLy4qLyxcblx0J3N0cmluZyc6IHtcblx0XHRwYXR0ZXJuOiAvXCIoPzpbXlxcXFxcIl18XFxcXC4pKlwifCdbXiddKicvLFxuXHRcdGdyZWVkeTogdHJ1ZVxuXHR9LFxuXHQna2V5d29yZCc6IHtcblx0XHRwYXR0ZXJuOiAvKF58W3t9O1xcclxcbl1bIFxcdF0qKVthLXpfXVtcXHcuLV0qL2ksXG5cdFx0bG9va2JlaGluZDogdHJ1ZVxuXHR9LFxuXHQnbmFtZXNwYWNlJzoge1xuXHRcdHBhdHRlcm46IC8oXFxzKVthLXpfXVtcXHcuLV0qKD89OikvaSxcblx0XHRsb29rYmVoaW5kOiB0cnVlXG5cdH0sXG5cdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0J29wZXJhdG9yJzogL1xcKy8sXG5cdCdwdW5jdHVhdGlvbic6IC9be307Ol0vXG59O1xuXG4oZnVuY3Rpb24gKFByaXNtKSB7XG5cblx0ZnVuY3Rpb24gbGl0ZXJhbChzdHIpIHtcblx0XHRyZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RyOyB9O1xuXHR9XG5cblx0dmFyIGtleXdvcmQgPSAvXFxiKD86YWxpZ258YWxsb3d6ZXJvfGFuZHxhbnlmcmFtZXxhbnl0eXBlfGFzbXxhc3luY3xhd2FpdHxicmVha3xjYW5jZWx8Y2F0Y2h8Y29tcHRpbWV8Y29uc3R8Y29udGludWV8ZGVmZXJ8ZWxzZXxlbnVtfGVycmRlZmVyfGVycm9yfGV4cG9ydHxleHRlcm58Zm58Zm9yfGlmfGlubGluZXxsaW5rc2VjdGlvbnxuYWtlZGNjfG5vYWxpYXN8bm9zdXNwZW5kfG51bGx8b3J8b3JlbHNlfHBhY2tlZHxwcm9taXNlfHB1YnxyZXN1bWV8cmV0dXJufHN0ZGNhbGxjY3xzdHJ1Y3R8c3VzcGVuZHxzd2l0Y2h8dGVzdHx0aHJlYWRsb2NhbHx0cnl8dW5kZWZpbmVkfHVuaW9ufHVucmVhY2hhYmxlfHVzaW5nbmFtZXNwYWNlfHZhcnx2b2xhdGlsZXx3aGlsZSlcXGIvO1xuXG5cdHZhciBJREVOVElGSUVSID0gJ1xcXFxiKD8hJyArIGtleXdvcmQuc291cmNlICsgJykoPyFcXFxcZClcXFxcdytcXFxcYic7XG5cdHZhciBBTElHTiA9IC9hbGlnblxccypcXCgoPzpbXigpXXxcXChbXigpXSpcXCkpKlxcKS8uc291cmNlO1xuXHR2YXIgUFJFRklYX1RZUEVfT1AgPSAvKD86XFw/fFxcYnByb21pc2UtPnwoPzpcXFtbXltcXF1dKlxcXXxcXCooPyFcXCopfFxcKlxcKikoPzpcXHMqPEFMSUdOPnxcXHMqY29uc3RcXGJ8XFxzKnZvbGF0aWxlXFxifFxccyphbGxvd3plcm9cXGIpKikvLnNvdXJjZS5yZXBsYWNlKC88QUxJR04+L2csIGxpdGVyYWwoQUxJR04pKTtcblx0dmFyIFNVRkZJWF9FWFBSID0gLyg/OlxcYnByb21pc2VcXGJ8KD86XFxiZXJyb3JcXC4pPzxJRD4oPzpcXC48SUQ+KSooPyFcXHMrPElEPikpLy5zb3VyY2UucmVwbGFjZSgvPElEPi9nLCBsaXRlcmFsKElERU5USUZJRVIpKTtcblx0dmFyIFRZUEUgPSAnKD8hXFxcXHMpKD86IT9cXFxccyooPzonICsgUFJFRklYX1RZUEVfT1AgKyAnXFxcXHMqKSonICsgU1VGRklYX0VYUFIgKyAnKSsnO1xuXG5cdC8qXG5cdCAqIEEgc2ltcGxpZmllZCBncmFtbWFyIGZvciBaaWcgY29tcGlsZSB0aW1lIHR5cGUgbGl0ZXJhbHM6XG5cdCAqXG5cdCAqIFR5cGVFeHByID0gKCBcIiFcIj8gUFJFRklYX1RZUEVfT1AqIFNVRkZJWF9FWFBSICkrXG5cdCAqXG5cdCAqIFNVRkZJWF9FWFBSID0gKCBcXGIgXCJwcm9taXNlXCIgXFxiIHwgKCBcXGIgXCJlcnJvclwiIFwiLlwiICk/IElERU5USUZJRVIgKCBcIi5cIiBJREVOVElGSUVSICkqICg/ISBcXHMrIElERU5USUZJRVIgKSApXG5cdCAqXG5cdCAqIFBSRUZJWF9UWVBFX09QID0gXCI/XCJcblx0ICogICAgICAgICAgICAgICAgfCBcXGIgXCJwcm9taXNlXCIgXCItPlwiXG5cdCAqICAgICAgICAgICAgICAgIHwgKCBcIltcIiBbXlxcW1xcXV0qIFwiXVwiIHwgXCIqXCIgfCBcIioqXCIgKSAoIEFMSUdOIHwgXCJjb25zdFwiIFxcYiB8IFwidm9sYXRpbGVcIiBcXGIgfCBcImFsbG93emVyb1wiIFxcYiApKlxuXHQgKlxuXHQgKiBBTElHTiA9IFwiYWxpZ25cIiBcIihcIiAoIFteKCldIHwgXCIoXCIgW14oKV0qIFwiKVwiICkqIFwiKVwiXG5cdCAqXG5cdCAqIElERU5USUZJRVIgPSBcXGIgKD8hIEtFWVdPUkQgKSBbYS16QS1aX10gXFx3KiBcXGJcblx0ICpcblx0Ki9cblxuXHRQcmlzbS5sYW5ndWFnZXMuemlnID0ge1xuXHRcdCdjb21tZW50JzogW1xuXHRcdFx0e1xuXHRcdFx0XHRwYXR0ZXJuOiAvXFwvXFwvWy8hXS4qLyxcblx0XHRcdFx0YWxpYXM6ICdkb2MtY29tbWVudCdcblx0XHRcdH0sXG5cdFx0XHQvXFwvezJ9LiovXG5cdFx0XSxcblx0XHQnc3RyaW5nJzogW1xuXHRcdFx0e1xuXHRcdFx0XHQvLyBcInN0cmluZ1wiIGFuZCBjXCJzdHJpbmdcIlxuXHRcdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcQF0pYz9cIig/OlteXCJcXFxcXFxyXFxuXXxcXFxcLikqXCIvLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIG11bHRpbGluZSBzdHJpbmdzIGFuZCBjLXN0cmluZ3Ncblx0XHRcdFx0cGF0dGVybjogLyhbXFxyXFxuXSkoWyBcXHRdK2M/XFxcXHsyfSkuKig/Oig/Olxcclxcbj98XFxuKVxcMi4qKSovLFxuXHRcdFx0XHRsb29rYmVoaW5kOiB0cnVlLFxuXHRcdFx0XHRncmVlZHk6IHRydWVcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdjaGFyJzoge1xuXHRcdFx0Ly8gY2hhcmFjdGVycyAnYScsICdcXG4nLCAnXFx4RkYnLCAnXFx1ezEwRkZGRn0nXG5cdFx0XHRwYXR0ZXJuOiAvKF58W15cXFxcXSknKD86W14nXFxcXFxcclxcbl18W1xcdUQ4MDAtXFx1REZGRl17Mn18XFxcXCg/Oi58eFthLWZBLUZcXGRdezJ9fHVcXHtbYS1mQS1GXFxkXXsxLDZ9XFx9KSknLyxcblx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRncmVlZHk6IHRydWVcblx0XHR9LFxuXHRcdCdidWlsdGluJzogL1xcQkAoPyFcXGQpXFx3Kyg/PVxccypcXCgpLyxcblx0XHQnbGFiZWwnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvKFxcYig/OmJyZWFrfGNvbnRpbnVlKVxccyo6XFxzKilcXHcrXFxifFxcYig/IVxcZClcXHcrXFxiKD89XFxzKjpcXHMqKD86XFx7fHdoaWxlXFxiKSkvLFxuXHRcdFx0bG9va2JlaGluZDogdHJ1ZVxuXHRcdH0sXG5cdFx0J2NsYXNzLW5hbWUnOiBbXG5cdFx0XHQvLyBjb25zdCBGb28gPSBzdHJ1Y3Qge307XG5cdFx0XHQvXFxiKD8hXFxkKVxcdysoPz1cXHMqPVxccyooPzooPzpleHRlcm58cGFja2VkKVxccyspPyg/OmVudW18c3RydWN0fHVuaW9uKVxccypbKHtdKS8sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGNvbnN0IHg6IGkzMiA9IDk7XG5cdFx0XHRcdC8vIHZhciB4OiBCYXI7XG5cdFx0XHRcdC8vIGZuIGZvbyh4OiBib29sLCB5OiBmMzIpIHZvaWQge31cblx0XHRcdFx0cGF0dGVybjogUmVnRXhwKC8oOlxccyopPFRZUEU+KD89XFxzKig/OjxBTElHTj5cXHMqKT9bPTssKV0pfDxUWVBFPig/PVxccyooPzo8QUxJR04+XFxzKik/XFx7KS8uc291cmNlLnJlcGxhY2UoLzxUWVBFPi9nLCBsaXRlcmFsKFRZUEUpKS5yZXBsYWNlKC88QUxJR04+L2csIGxpdGVyYWwoQUxJR04pKSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH0sXG5cdFx0XHR7XG5cdFx0XHRcdC8vIGV4dGVybiBmbiBmb28oeDogZjY0KSBmNjQ7IChvcHRpb25hbCBhbGlnbm1lbnQpXG5cdFx0XHRcdHBhdHRlcm46IFJlZ0V4cCgvKFxcKVxccyopPFRZUEU+KD89XFxzKig/OjxBTElHTj5cXHMqKT87KS8uc291cmNlLnJlcGxhY2UoLzxUWVBFPi9nLCBsaXRlcmFsKFRZUEUpKS5yZXBsYWNlKC88QUxJR04+L2csIGxpdGVyYWwoQUxJR04pKSksXG5cdFx0XHRcdGxvb2tiZWhpbmQ6IHRydWUsXG5cdFx0XHRcdGluc2lkZTogbnVsbCAvLyBzZWUgYmVsb3dcblx0XHRcdH1cblx0XHRdLFxuXHRcdCdidWlsdGluLXR5cGUnOiB7XG5cdFx0XHRwYXR0ZXJuOiAvXFxiKD86YW55ZXJyb3J8Ym9vbHxjX3U/KD86aW50fGxvbmd8bG9uZ2xvbmd8c2hvcnQpfGNfbG9uZ2RvdWJsZXxjX3ZvaWR8Y29tcHRpbWVfKD86ZmxvYXR8aW50KXxmKD86MTZ8MzJ8NjR8MTI4KXxbaXVdKD86OHwxNnwzMnw2NHwxMjh8c2l6ZSl8bm9yZXR1cm58dHlwZXx2b2lkKVxcYi8sXG5cdFx0XHRhbGlhczogJ2tleXdvcmQnXG5cdFx0fSxcblx0XHQna2V5d29yZCc6IGtleXdvcmQsXG5cdFx0J2Z1bmN0aW9uJzogL1xcYig/IVxcZClcXHcrKD89XFxzKlxcKCkvLFxuXHRcdCdudW1iZXInOiAvXFxiKD86MGJbMDFdK3wwb1swLTddK3wweFthLWZBLUZcXGRdKyg/OlxcLlthLWZBLUZcXGRdKik/KD86W3BQXVsrLV0/W2EtZkEtRlxcZF0rKT98XFxkKyg/OlxcLlxcZCopPyg/OltlRV1bKy1dP1xcZCspPylcXGIvLFxuXHRcdCdib29sZWFuJzogL1xcYig/OmZhbHNlfHRydWUpXFxiLyxcblx0XHQnb3BlcmF0b3InOiAvXFwuWyo/XXxcXC57MiwzfXxbLT1dPnxcXCpcXCp8XFwrXFwrfFxcfFxcfHwoPzo8PHw+PnxbLSsqXSV8Wy0rKi8lXiZ8PD4hPV0pPT98Wz9+XS8sXG5cdFx0J3B1bmN0dWF0aW9uJzogL1suOiw7KCl7fVtcXF1dL1xuXHR9O1xuXG5cdFByaXNtLmxhbmd1YWdlcy56aWdbJ2NsYXNzLW5hbWUnXS5mb3JFYWNoKGZ1bmN0aW9uIChvYmopIHtcblx0XHRpZiAob2JqLmluc2lkZSA9PT0gbnVsbCkge1xuXHRcdFx0b2JqLmluc2lkZSA9IFByaXNtLmxhbmd1YWdlcy56aWc7XG5cdFx0fVxuXHR9KTtcblxufShQcmlzbSkpO1xuXG4oZnVuY3Rpb24gKCkge1xuXG5cdGlmICh0eXBlb2YgUHJpc20gPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvKipcblx0ICogUGx1Z2luIG5hbWUgd2hpY2ggaXMgdXNlZCBhcyBhIGNsYXNzIG5hbWUgZm9yIDxwcmU+IHdoaWNoIGlzIGFjdGl2YXRpbmcgdGhlIHBsdWdpblxuXHQgKlxuXHQgKiBAdHlwZSB7c3RyaW5nfVxuXHQgKi9cblx0dmFyIFBMVUdJTl9OQU1FID0gJ2xpbmUtbnVtYmVycyc7XG5cblx0LyoqXG5cdCAqIFJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBkZXRlcm1pbmluZyBsaW5lIGJyZWFrc1xuXHQgKlxuXHQgKiBAdHlwZSB7UmVnRXhwfVxuXHQgKi9cblx0dmFyIE5FV19MSU5FX0VYUCA9IC9cXG4oPyEkKS9nO1xuXG5cblx0LyoqXG5cdCAqIEdsb2JhbCBleHBvcnRzXG5cdCAqL1xuXHR2YXIgY29uZmlnID0gUHJpc20ucGx1Z2lucy5saW5lTnVtYmVycyA9IHtcblx0XHQvKipcblx0XHQgKiBHZXQgbm9kZSBmb3IgcHJvdmlkZWQgbGluZSBudW1iZXJcblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCBwcmUgZWxlbWVudFxuXHRcdCAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgbGluZSBudW1iZXJcblx0XHQgKiBAcmV0dXJucyB7RWxlbWVudHx1bmRlZmluZWR9XG5cdFx0ICovXG5cdFx0Z2V0TGluZTogZnVuY3Rpb24gKGVsZW1lbnQsIG51bWJlcikge1xuXHRcdFx0aWYgKGVsZW1lbnQudGFnTmFtZSAhPT0gJ1BSRScgfHwgIWVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFBMVUdJTl9OQU1FKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHZhciBsaW5lTnVtYmVyUm93cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmxpbmUtbnVtYmVycy1yb3dzJyk7XG5cdFx0XHRpZiAoIWxpbmVOdW1iZXJSb3dzKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHZhciBsaW5lTnVtYmVyU3RhcnQgPSBwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1zdGFydCcpLCAxMCkgfHwgMTtcblx0XHRcdHZhciBsaW5lTnVtYmVyRW5kID0gbGluZU51bWJlclN0YXJ0ICsgKGxpbmVOdW1iZXJSb3dzLmNoaWxkcmVuLmxlbmd0aCAtIDEpO1xuXG5cdFx0XHRpZiAobnVtYmVyIDwgbGluZU51bWJlclN0YXJ0KSB7XG5cdFx0XHRcdG51bWJlciA9IGxpbmVOdW1iZXJTdGFydDtcblx0XHRcdH1cblx0XHRcdGlmIChudW1iZXIgPiBsaW5lTnVtYmVyRW5kKSB7XG5cdFx0XHRcdG51bWJlciA9IGxpbmVOdW1iZXJFbmQ7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBsaW5lSW5kZXggPSBudW1iZXIgLSBsaW5lTnVtYmVyU3RhcnQ7XG5cblx0XHRcdHJldHVybiBsaW5lTnVtYmVyUm93cy5jaGlsZHJlbltsaW5lSW5kZXhdO1xuXHRcdH0sXG5cblx0XHQvKipcblx0XHQgKiBSZXNpemVzIHRoZSBsaW5lIG51bWJlcnMgb2YgdGhlIGdpdmVuIGVsZW1lbnQuXG5cdFx0ICpcblx0XHQgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IGFkZCBsaW5lIG51bWJlcnMuIEl0IHdpbGwgb25seSByZXNpemUgZXhpc3Rpbmcgb25lcy5cblx0XHQgKlxuXHRcdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgQSBgPHByZT5gIGVsZW1lbnQgd2l0aCBsaW5lIG51bWJlcnMuXG5cdFx0ICogQHJldHVybnMge3ZvaWR9XG5cdFx0ICovXG5cdFx0cmVzaXplOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuXHRcdFx0cmVzaXplRWxlbWVudHMoW2VsZW1lbnRdKTtcblx0XHR9LFxuXG5cdFx0LyoqXG5cdFx0ICogV2hldGhlciB0aGUgcGx1Z2luIGNhbiBhc3N1bWUgdGhhdCB0aGUgdW5pdHMgZm9udCBzaXplcyBhbmQgbWFyZ2lucyBhcmUgbm90IGRlcGVuZGVkIG9uIHRoZSBzaXplIG9mXG5cdFx0ICogdGhlIGN1cnJlbnQgdmlld3BvcnQuXG5cdFx0ICpcblx0XHQgKiBTZXR0aW5nIHRoaXMgdG8gYHRydWVgIHdpbGwgYWxsb3cgdGhlIHBsdWdpbiB0byBkbyBjZXJ0YWluIG9wdGltaXphdGlvbnMgZm9yIGJldHRlciBwZXJmb3JtYW5jZS5cblx0XHQgKlxuXHRcdCAqIFNldCB0aGlzIHRvIGBmYWxzZWAgaWYgeW91IHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBDU1MgdW5pdHM6IGB2aGAsIGB2d2AsIGB2bWluYCwgYHZtYXhgLlxuXHRcdCAqXG5cdFx0ICogQHR5cGUge2Jvb2xlYW59XG5cdFx0ICovXG5cdFx0YXNzdW1lVmlld3BvcnRJbmRlcGVuZGVuY2U6IHRydWVcblx0fTtcblxuXHQvKipcblx0ICogUmVzaXplcyB0aGUgZ2l2ZW4gZWxlbWVudHMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnRbXX0gZWxlbWVudHNcblx0ICovXG5cdGZ1bmN0aW9uIHJlc2l6ZUVsZW1lbnRzKGVsZW1lbnRzKSB7XG5cdFx0ZWxlbWVudHMgPSBlbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHtcblx0XHRcdHZhciBjb2RlU3R5bGVzID0gZ2V0U3R5bGVzKGUpO1xuXHRcdFx0dmFyIHdoaXRlU3BhY2UgPSBjb2RlU3R5bGVzWyd3aGl0ZS1zcGFjZSddO1xuXHRcdFx0cmV0dXJuIHdoaXRlU3BhY2UgPT09ICdwcmUtd3JhcCcgfHwgd2hpdGVTcGFjZSA9PT0gJ3ByZS1saW5lJztcblx0XHR9KTtcblxuXHRcdGlmIChlbGVtZW50cy5sZW5ndGggPT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBpbmZvcyA9IGVsZW1lbnRzLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuXHRcdFx0dmFyIGNvZGVFbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdjb2RlJyk7XG5cdFx0XHR2YXIgbGluZU51bWJlcnNXcmFwcGVyID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubGluZS1udW1iZXJzLXJvd3MnKTtcblx0XHRcdGlmICghY29kZUVsZW1lbnQgfHwgIWxpbmVOdW1iZXJzV3JhcHBlcikge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHQvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqL1xuXHRcdFx0dmFyIGxpbmVOdW1iZXJTaXplciA9IGVsZW1lbnQucXVlcnlTZWxlY3RvcignLmxpbmUtbnVtYmVycy1zaXplcicpO1xuXHRcdFx0dmFyIGNvZGVMaW5lcyA9IGNvZGVFbGVtZW50LnRleHRDb250ZW50LnNwbGl0KE5FV19MSU5FX0VYUCk7XG5cblx0XHRcdGlmICghbGluZU51bWJlclNpemVyKSB7XG5cdFx0XHRcdGxpbmVOdW1iZXJTaXplciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblx0XHRcdFx0bGluZU51bWJlclNpemVyLmNsYXNzTmFtZSA9ICdsaW5lLW51bWJlcnMtc2l6ZXInO1xuXG5cdFx0XHRcdGNvZGVFbGVtZW50LmFwcGVuZENoaWxkKGxpbmVOdW1iZXJTaXplcik7XG5cdFx0XHR9XG5cblx0XHRcdGxpbmVOdW1iZXJTaXplci5pbm5lckhUTUwgPSAnMCc7XG5cdFx0XHRsaW5lTnVtYmVyU2l6ZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cblx0XHRcdHZhciBvbmVMaW5lckhlaWdodCA9IGxpbmVOdW1iZXJTaXplci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG5cdFx0XHRsaW5lTnVtYmVyU2l6ZXIuaW5uZXJIVE1MID0gJyc7XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGVsZW1lbnQ6IGVsZW1lbnQsXG5cdFx0XHRcdGxpbmVzOiBjb2RlTGluZXMsXG5cdFx0XHRcdGxpbmVIZWlnaHRzOiBbXSxcblx0XHRcdFx0b25lTGluZXJIZWlnaHQ6IG9uZUxpbmVySGVpZ2h0LFxuXHRcdFx0XHRzaXplcjogbGluZU51bWJlclNpemVyLFxuXHRcdFx0fTtcblx0XHR9KS5maWx0ZXIoQm9vbGVhbik7XG5cblx0XHRpbmZvcy5mb3JFYWNoKGZ1bmN0aW9uIChpbmZvKSB7XG5cdFx0XHR2YXIgbGluZU51bWJlclNpemVyID0gaW5mby5zaXplcjtcblx0XHRcdHZhciBsaW5lcyA9IGluZm8ubGluZXM7XG5cdFx0XHR2YXIgbGluZUhlaWdodHMgPSBpbmZvLmxpbmVIZWlnaHRzO1xuXHRcdFx0dmFyIG9uZUxpbmVySGVpZ2h0ID0gaW5mby5vbmVMaW5lckhlaWdodDtcblxuXHRcdFx0bGluZUhlaWdodHNbbGluZXMubGVuZ3RoIC0gMV0gPSB1bmRlZmluZWQ7XG5cdFx0XHRsaW5lcy5mb3JFYWNoKGZ1bmN0aW9uIChsaW5lLCBpbmRleCkge1xuXHRcdFx0XHRpZiAobGluZSAmJiBsaW5lLmxlbmd0aCA+IDEpIHtcblx0XHRcdFx0XHR2YXIgZSA9IGxpbmVOdW1iZXJTaXplci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJykpO1xuXHRcdFx0XHRcdGUuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cdFx0XHRcdFx0ZS50ZXh0Q29udGVudCA9IGxpbmU7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGluZUhlaWdodHNbaW5kZXhdID0gb25lTGluZXJIZWlnaHQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH0pO1xuXG5cdFx0aW5mb3MuZm9yRWFjaChmdW5jdGlvbiAoaW5mbykge1xuXHRcdFx0dmFyIGxpbmVOdW1iZXJTaXplciA9IGluZm8uc2l6ZXI7XG5cdFx0XHR2YXIgbGluZUhlaWdodHMgPSBpbmZvLmxpbmVIZWlnaHRzO1xuXG5cdFx0XHR2YXIgY2hpbGRJbmRleCA9IDA7XG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVIZWlnaHRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChsaW5lSGVpZ2h0c1tpXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0bGluZUhlaWdodHNbaV0gPSBsaW5lTnVtYmVyU2l6ZXIuY2hpbGRyZW5bY2hpbGRJbmRleCsrXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGluZm9zLmZvckVhY2goZnVuY3Rpb24gKGluZm8pIHtcblx0XHRcdHZhciBsaW5lTnVtYmVyU2l6ZXIgPSBpbmZvLnNpemVyO1xuXHRcdFx0dmFyIHdyYXBwZXIgPSBpbmZvLmVsZW1lbnQucXVlcnlTZWxlY3RvcignLmxpbmUtbnVtYmVycy1yb3dzJyk7XG5cblx0XHRcdGxpbmVOdW1iZXJTaXplci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXHRcdFx0bGluZU51bWJlclNpemVyLmlubmVySFRNTCA9ICcnO1xuXG5cdFx0XHRpbmZvLmxpbmVIZWlnaHRzLmZvckVhY2goZnVuY3Rpb24gKGhlaWdodCwgbGluZU51bWJlcikge1xuXHRcdFx0XHR3cmFwcGVyLmNoaWxkcmVuW2xpbmVOdW1iZXJdLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHN0eWxlIGRlY2xhcmF0aW9ucyBmb3IgdGhlIGVsZW1lbnRcblx0ICpcblx0ICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG5cdCAqL1xuXHRmdW5jdGlvbiBnZXRTdHlsZXMoZWxlbWVudCkge1xuXHRcdGlmICghZWxlbWVudCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlID8gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSA6IChlbGVtZW50LmN1cnJlbnRTdHlsZSB8fCBudWxsKTtcblx0fVxuXG5cdHZhciBsYXN0V2lkdGggPSB1bmRlZmluZWQ7XG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKGNvbmZpZy5hc3N1bWVWaWV3cG9ydEluZGVwZW5kZW5jZSAmJiBsYXN0V2lkdGggPT09IHdpbmRvdy5pbm5lcldpZHRoKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGxhc3RXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuXG5cdFx0cmVzaXplRWxlbWVudHMoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgncHJlLicgKyBQTFVHSU5fTkFNRSkpKTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdjb21wbGV0ZScsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHRpZiAoIWVudi5jb2RlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIGNvZGUgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovIChlbnYuZWxlbWVudCk7XG5cdFx0dmFyIHByZSA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovIChjb2RlLnBhcmVudE5vZGUpO1xuXG5cdFx0Ly8gd29ya3Mgb25seSBmb3IgPGNvZGU+IHdyYXBwZWQgaW5zaWRlIDxwcmU+IChub3QgaW5saW5lKVxuXHRcdGlmICghcHJlIHx8ICEvcHJlL2kudGVzdChwcmUubm9kZU5hbWUpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQWJvcnQgaWYgbGluZSBudW1iZXJzIGFscmVhZHkgZXhpc3RzXG5cdFx0aWYgKGNvZGUucXVlcnlTZWxlY3RvcignLmxpbmUtbnVtYmVycy1yb3dzJykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBvbmx5IGFkZCBsaW5lIG51bWJlcnMgaWYgPGNvZGU+IG9yIG9uZSBvZiBpdHMgYW5jZXN0b3JzIGhhcyB0aGUgYGxpbmUtbnVtYmVyc2AgY2xhc3Ncblx0XHRpZiAoIVByaXNtLnV0aWwuaXNBY3RpdmUoY29kZSwgUExVR0lOX05BTUUpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHRoZSBjbGFzcyAnbGluZS1udW1iZXJzJyBmcm9tIHRoZSA8Y29kZT5cblx0XHRjb2RlLmNsYXNzTGlzdC5yZW1vdmUoUExVR0lOX05BTUUpO1xuXHRcdC8vIEFkZCB0aGUgY2xhc3MgJ2xpbmUtbnVtYmVycycgdG8gdGhlIDxwcmU+XG5cdFx0cHJlLmNsYXNzTGlzdC5hZGQoUExVR0lOX05BTUUpO1xuXG5cdFx0dmFyIG1hdGNoID0gZW52LmNvZGUubWF0Y2goTkVXX0xJTkVfRVhQKTtcblx0XHR2YXIgbGluZXNOdW0gPSBtYXRjaCA/IG1hdGNoLmxlbmd0aCArIDEgOiAxO1xuXHRcdHZhciBsaW5lTnVtYmVyc1dyYXBwZXI7XG5cblx0XHR2YXIgbGluZXMgPSBuZXcgQXJyYXkobGluZXNOdW0gKyAxKS5qb2luKCc8c3Bhbj48L3NwYW4+Jyk7XG5cblx0XHRsaW5lTnVtYmVyc1dyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cdFx0bGluZU51bWJlcnNXcmFwcGVyLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXHRcdGxpbmVOdW1iZXJzV3JhcHBlci5jbGFzc05hbWUgPSAnbGluZS1udW1iZXJzLXJvd3MnO1xuXHRcdGxpbmVOdW1iZXJzV3JhcHBlci5pbm5lckhUTUwgPSBsaW5lcztcblxuXHRcdGlmIChwcmUuaGFzQXR0cmlidXRlKCdkYXRhLXN0YXJ0JykpIHtcblx0XHRcdHByZS5zdHlsZS5jb3VudGVyUmVzZXQgPSAnbGluZW51bWJlciAnICsgKHBhcnNlSW50KHByZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3RhcnQnKSwgMTApIC0gMSk7XG5cdFx0fVxuXG5cdFx0ZW52LmVsZW1lbnQuYXBwZW5kQ2hpbGQobGluZU51bWJlcnNXcmFwcGVyKTtcblxuXHRcdHJlc2l6ZUVsZW1lbnRzKFtwcmVdKTtcblxuXHRcdFByaXNtLmhvb2tzLnJ1bignbGluZS1udW1iZXJzJywgZW52KTtcblx0fSk7XG5cblx0UHJpc20uaG9va3MuYWRkKCdsaW5lLW51bWJlcnMnLCBmdW5jdGlvbiAoZW52KSB7XG5cdFx0ZW52LnBsdWdpbnMgPSBlbnYucGx1Z2lucyB8fCB7fTtcblx0XHRlbnYucGx1Z2lucy5saW5lTnVtYmVycyA9IHRydWU7XG5cdH0pO1xuXG59KCkpO1xuXG4oZnVuY3Rpb24gKCkge1xuXG5cdGlmICh0eXBlb2YgUHJpc20gPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9tYXRjaGVzI1BvbHlmaWxsXG5cdGlmICghRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcykge1xuXHRcdEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMgPSBFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG5cdH1cblxuXHR2YXIgTE9BRElOR19NRVNTQUdFID0gJ0xvYWRpbmdcdTIwMjYnO1xuXHR2YXIgRkFJTFVSRV9NRVNTQUdFID0gZnVuY3Rpb24gKHN0YXR1cywgbWVzc2FnZSkge1xuXHRcdHJldHVybiAnXHUyNzE2IEVycm9yICcgKyBzdGF0dXMgKyAnIHdoaWxlIGZldGNoaW5nIGZpbGU6ICcgKyBtZXNzYWdlO1xuXHR9O1xuXHR2YXIgRkFJTFVSRV9FTVBUWV9NRVNTQUdFID0gJ1x1MjcxNiBFcnJvcjogRmlsZSBkb2VzIG5vdCBleGlzdCBvciBpcyBlbXB0eSc7XG5cblx0dmFyIEVYVEVOU0lPTlMgPSB7XG5cdFx0J2pzJzogJ2phdmFzY3JpcHQnLFxuXHRcdCdweSc6ICdweXRob24nLFxuXHRcdCdyYic6ICdydWJ5Jyxcblx0XHQncHMxJzogJ3Bvd2Vyc2hlbGwnLFxuXHRcdCdwc20xJzogJ3Bvd2Vyc2hlbGwnLFxuXHRcdCdzaCc6ICdiYXNoJyxcblx0XHQnYmF0JzogJ2JhdGNoJyxcblx0XHQnaCc6ICdjJyxcblx0XHQndGV4JzogJ2xhdGV4J1xuXHR9O1xuXG5cdHZhciBTVEFUVVNfQVRUUiA9ICdkYXRhLXNyYy1zdGF0dXMnO1xuXHR2YXIgU1RBVFVTX0xPQURJTkcgPSAnbG9hZGluZyc7XG5cdHZhciBTVEFUVVNfTE9BREVEID0gJ2xvYWRlZCc7XG5cdHZhciBTVEFUVVNfRkFJTEVEID0gJ2ZhaWxlZCc7XG5cblx0dmFyIFNFTEVDVE9SID0gJ3ByZVtkYXRhLXNyY106bm90KFsnICsgU1RBVFVTX0FUVFIgKyAnPVwiJyArIFNUQVRVU19MT0FERUQgKyAnXCJdKSdcblx0XHQrICc6bm90KFsnICsgU1RBVFVTX0FUVFIgKyAnPVwiJyArIFNUQVRVU19MT0FESU5HICsgJ1wiXSknO1xuXG5cdC8qKlxuXHQgKiBMb2FkcyB0aGUgZ2l2ZW4gZmlsZS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IHNyYyBUaGUgVVJMIG9yIHBhdGggb2YgdGhlIHNvdXJjZSBmaWxlIHRvIGxvYWQuXG5cdCAqIEBwYXJhbSB7KHJlc3VsdDogc3RyaW5nKSA9PiB2b2lkfSBzdWNjZXNzXG5cdCAqIEBwYXJhbSB7KHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkfSBlcnJvclxuXHQgKi9cblx0ZnVuY3Rpb24gbG9hZEZpbGUoc3JjLCBzdWNjZXNzLCBlcnJvcikge1xuXHRcdHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblx0XHR4aHIub3BlbignR0VUJywgc3JjLCB0cnVlKTtcblx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0aWYgKHhoci5yZWFkeVN0YXRlID09IDQpIHtcblx0XHRcdFx0aWYgKHhoci5zdGF0dXMgPCA0MDAgJiYgeGhyLnJlc3BvbnNlVGV4dCkge1xuXHRcdFx0XHRcdHN1Y2Nlc3MoeGhyLnJlc3BvbnNlVGV4dCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0aWYgKHhoci5zdGF0dXMgPj0gNDAwKSB7XG5cdFx0XHRcdFx0XHRlcnJvcihGQUlMVVJFX01FU1NBR0UoeGhyLnN0YXR1cywgeGhyLnN0YXR1c1RleHQpKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0ZXJyb3IoRkFJTFVSRV9FTVBUWV9NRVNTQUdFKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHRcdHhoci5zZW5kKG51bGwpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlcyB0aGUgZ2l2ZW4gcmFuZ2UuXG5cdCAqXG5cdCAqIFRoaXMgcmV0dXJucyBhIHJhbmdlIHdpdGggaW5jbHVzaXZlIGVuZHMuXG5cdCAqXG5cdCAqIEBwYXJhbSB7c3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZH0gcmFuZ2Vcblx0ICogQHJldHVybnMge1tudW1iZXIsIG51bWJlciB8IHVuZGVmaW5lZF0gfCB1bmRlZmluZWR9XG5cdCAqL1xuXHRmdW5jdGlvbiBwYXJzZVJhbmdlKHJhbmdlKSB7XG5cdFx0dmFyIG0gPSAvXlxccyooXFxkKylcXHMqKD86KCwpXFxzKig/OihcXGQrKVxccyopPyk/JC8uZXhlYyhyYW5nZSB8fCAnJyk7XG5cdFx0aWYgKG0pIHtcblx0XHRcdHZhciBzdGFydCA9IE51bWJlcihtWzFdKTtcblx0XHRcdHZhciBjb21tYSA9IG1bMl07XG5cdFx0XHR2YXIgZW5kID0gbVszXTtcblxuXHRcdFx0aWYgKCFjb21tYSkge1xuXHRcdFx0XHRyZXR1cm4gW3N0YXJ0LCBzdGFydF07XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWVuZCkge1xuXHRcdFx0XHRyZXR1cm4gW3N0YXJ0LCB1bmRlZmluZWRdO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIFtzdGFydCwgTnVtYmVyKGVuZCldO1xuXHRcdH1cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0UHJpc20uaG9va3MuYWRkKCdiZWZvcmUtaGlnaGxpZ2h0YWxsJywgZnVuY3Rpb24gKGVudikge1xuXHRcdGVudi5zZWxlY3RvciArPSAnLCAnICsgU0VMRUNUT1I7XG5cdH0pO1xuXG5cdFByaXNtLmhvb2tzLmFkZCgnYmVmb3JlLXNhbml0eS1jaGVjaycsIGZ1bmN0aW9uIChlbnYpIHtcblx0XHR2YXIgcHJlID0gLyoqIEB0eXBlIHtIVE1MUHJlRWxlbWVudH0gKi8gKGVudi5lbGVtZW50KTtcblx0XHRpZiAocHJlLm1hdGNoZXMoU0VMRUNUT1IpKSB7XG5cdFx0XHRlbnYuY29kZSA9ICcnOyAvLyBmYXN0LXBhdGggdGhlIHdob2xlIHRoaW5nIGFuZCBnbyB0byBjb21wbGV0ZVxuXG5cdFx0XHRwcmUuc2V0QXR0cmlidXRlKFNUQVRVU19BVFRSLCBTVEFUVVNfTE9BRElORyk7IC8vIG1hcmsgYXMgbG9hZGluZ1xuXG5cdFx0XHQvLyBhZGQgY29kZSBlbGVtZW50IHdpdGggbG9hZGluZyBtZXNzYWdlXG5cdFx0XHR2YXIgY29kZSA9IHByZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdDT0RFJykpO1xuXHRcdFx0Y29kZS50ZXh0Q29udGVudCA9IExPQURJTkdfTUVTU0FHRTtcblxuXHRcdFx0dmFyIHNyYyA9IHByZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3JjJyk7XG5cblx0XHRcdHZhciBsYW5ndWFnZSA9IGVudi5sYW5ndWFnZTtcblx0XHRcdGlmIChsYW5ndWFnZSA9PT0gJ25vbmUnKSB7XG5cdFx0XHRcdC8vIHRoZSBsYW5ndWFnZSBtaWdodCBiZSAnbm9uZScgYmVjYXVzZSB0aGVyZSBpcyBubyBsYW5ndWFnZSBzZXQ7XG5cdFx0XHRcdC8vIGluIHRoaXMgY2FzZSwgd2Ugd2FudCB0byB1c2UgdGhlIGV4dGVuc2lvbiBhcyB0aGUgbGFuZ3VhZ2Vcblx0XHRcdFx0dmFyIGV4dGVuc2lvbiA9ICgvXFwuKFxcdyspJC8uZXhlYyhzcmMpIHx8IFssICdub25lJ10pWzFdO1xuXHRcdFx0XHRsYW5ndWFnZSA9IEVYVEVOU0lPTlNbZXh0ZW5zaW9uXSB8fCBleHRlbnNpb247XG5cdFx0XHR9XG5cblx0XHRcdC8vIHNldCBsYW5ndWFnZSBjbGFzc2VzXG5cdFx0XHRQcmlzbS51dGlsLnNldExhbmd1YWdlKGNvZGUsIGxhbmd1YWdlKTtcblx0XHRcdFByaXNtLnV0aWwuc2V0TGFuZ3VhZ2UocHJlLCBsYW5ndWFnZSk7XG5cblx0XHRcdC8vIHByZWxvYWQgdGhlIGxhbmd1YWdlXG5cdFx0XHR2YXIgYXV0b2xvYWRlciA9IFByaXNtLnBsdWdpbnMuYXV0b2xvYWRlcjtcblx0XHRcdGlmIChhdXRvbG9hZGVyKSB7XG5cdFx0XHRcdGF1dG9sb2FkZXIubG9hZExhbmd1YWdlcyhsYW5ndWFnZSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGxvYWQgZmlsZVxuXHRcdFx0bG9hZEZpbGUoXG5cdFx0XHRcdHNyYyxcblx0XHRcdFx0ZnVuY3Rpb24gKHRleHQpIHtcblx0XHRcdFx0XHQvLyBtYXJrIGFzIGxvYWRlZFxuXHRcdFx0XHRcdHByZS5zZXRBdHRyaWJ1dGUoU1RBVFVTX0FUVFIsIFNUQVRVU19MT0FERUQpO1xuXG5cdFx0XHRcdFx0Ly8gaGFuZGxlIGRhdGEtcmFuZ2Vcblx0XHRcdFx0XHR2YXIgcmFuZ2UgPSBwYXJzZVJhbmdlKHByZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmFuZ2UnKSk7XG5cdFx0XHRcdFx0aWYgKHJhbmdlKSB7XG5cdFx0XHRcdFx0XHR2YXIgbGluZXMgPSB0ZXh0LnNwbGl0KC9cXHJcXG4/fFxcbi9nKTtcblxuXHRcdFx0XHRcdFx0Ly8gdGhlIHJhbmdlIGlzIG9uZS1iYXNlZCBhbmQgaW5jbHVzaXZlIG9uIGJvdGggZW5kc1xuXHRcdFx0XHRcdFx0dmFyIHN0YXJ0ID0gcmFuZ2VbMF07XG5cdFx0XHRcdFx0XHR2YXIgZW5kID0gcmFuZ2VbMV0gPT0gbnVsbCA/IGxpbmVzLmxlbmd0aCA6IHJhbmdlWzFdO1xuXG5cdFx0XHRcdFx0XHRpZiAoc3RhcnQgPCAwKSB7IHN0YXJ0ICs9IGxpbmVzLmxlbmd0aDsgfVxuXHRcdFx0XHRcdFx0c3RhcnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihzdGFydCAtIDEsIGxpbmVzLmxlbmd0aCkpO1xuXHRcdFx0XHRcdFx0aWYgKGVuZCA8IDApIHsgZW5kICs9IGxpbmVzLmxlbmd0aDsgfVxuXHRcdFx0XHRcdFx0ZW5kID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZW5kLCBsaW5lcy5sZW5ndGgpKTtcblxuXHRcdFx0XHRcdFx0dGV4dCA9IGxpbmVzLnNsaWNlKHN0YXJ0LCBlbmQpLmpvaW4oJ1xcbicpO1xuXG5cdFx0XHRcdFx0XHQvLyBhZGQgZGF0YS1zdGFydCBmb3IgbGluZSBudW1iZXJzXG5cdFx0XHRcdFx0XHRpZiAoIXByZS5oYXNBdHRyaWJ1dGUoJ2RhdGEtc3RhcnQnKSkge1xuXHRcdFx0XHRcdFx0XHRwcmUuc2V0QXR0cmlidXRlKCdkYXRhLXN0YXJ0JywgU3RyaW5nKHN0YXJ0ICsgMSkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIGhpZ2hsaWdodCBjb2RlXG5cdFx0XHRcdFx0Y29kZS50ZXh0Q29udGVudCA9IHRleHQ7XG5cdFx0XHRcdFx0UHJpc20uaGlnaGxpZ2h0RWxlbWVudChjb2RlKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0ZnVuY3Rpb24gKGVycm9yKSB7XG5cdFx0XHRcdFx0Ly8gbWFyayBhcyBmYWlsZWRcblx0XHRcdFx0XHRwcmUuc2V0QXR0cmlidXRlKFNUQVRVU19BVFRSLCBTVEFUVVNfRkFJTEVEKTtcblxuXHRcdFx0XHRcdGNvZGUudGV4dENvbnRlbnQgPSBlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0XHR9XG5cdH0pO1xuXG5cdFByaXNtLnBsdWdpbnMuZmlsZUhpZ2hsaWdodCA9IHtcblx0XHQvKipcblx0XHQgKiBFeGVjdXRlcyB0aGUgRmlsZSBIaWdobGlnaHQgcGx1Z2luIGZvciBhbGwgbWF0Y2hpbmcgYHByZWAgZWxlbWVudHMgdW5kZXIgdGhlIGdpdmVuIGNvbnRhaW5lci5cblx0XHQgKlxuXHRcdCAqIE5vdGU6IEVsZW1lbnRzIHdoaWNoIGFyZSBhbHJlYWR5IGxvYWRlZCBvciBjdXJyZW50bHkgbG9hZGluZyB3aWxsIG5vdCBiZSB0b3VjaGVkIGJ5IHRoaXMgbWV0aG9kLlxuXHRcdCAqXG5cdFx0ICogQHBhcmFtIHtQYXJlbnROb2RlfSBbY29udGFpbmVyPWRvY3VtZW50XVxuXHRcdCAqL1xuXHRcdGhpZ2hsaWdodDogZnVuY3Rpb24gaGlnaGxpZ2h0KGNvbnRhaW5lcikge1xuXHRcdFx0dmFyIGVsZW1lbnRzID0gKGNvbnRhaW5lciB8fCBkb2N1bWVudCkucXVlcnlTZWxlY3RvckFsbChTRUxFQ1RPUik7XG5cblx0XHRcdGZvciAodmFyIGkgPSAwLCBlbGVtZW50OyAoZWxlbWVudCA9IGVsZW1lbnRzW2krK10pOykge1xuXHRcdFx0XHRQcmlzbS5oaWdobGlnaHRFbGVtZW50KGVsZW1lbnQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblxuXHR2YXIgbG9nZ2VkID0gZmFsc2U7XG5cdC8qKiBAZGVwcmVjYXRlZCBVc2UgYFByaXNtLnBsdWdpbnMuZmlsZUhpZ2hsaWdodC5oaWdobGlnaHRgIGluc3RlYWQuICovXG5cdFByaXNtLmZpbGVIaWdobGlnaHQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0aWYgKCFsb2dnZWQpIHtcblx0XHRcdGNvbnNvbGUud2FybignUHJpc20uZmlsZUhpZ2hsaWdodCBpcyBkZXByZWNhdGVkLiBVc2UgYFByaXNtLnBsdWdpbnMuZmlsZUhpZ2hsaWdodC5oaWdobGlnaHRgIGluc3RlYWQuJyk7XG5cdFx0XHRsb2dnZWQgPSB0cnVlO1xuXHRcdH1cblx0XHRQcmlzbS5wbHVnaW5zLmZpbGVIaWdobGlnaHQuaGlnaGxpZ2h0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cdH07XG5cbn0oKSk7XG5cbiIsICIvKipcbiAqIEBsaWNlbnNlIE1JVFxuICogdG9wYmFyIDEuMC4wLCAyMDIxLTAxLTA2XG4gKiBodHRwOi8vYnV1bmd1eWVuLmdpdGh1Yi5pby90b3BiYXJcbiAqIENvcHlyaWdodCAoYykgMjAyMSBCdXUgTmd1eWVuXG4gKi9cbihmdW5jdGlvbiAod2luZG93LCBkb2N1bWVudCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICAvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9wYXVsaXJpc2gvMTU3OTY3MVxuICAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBsYXN0VGltZSA9IDA7XG4gICAgdmFyIHZlbmRvcnMgPSBbXCJtc1wiLCBcIm1velwiLCBcIndlYmtpdFwiLCBcIm9cIl07XG4gICAgZm9yICh2YXIgeCA9IDA7IHggPCB2ZW5kb3JzLmxlbmd0aCAmJiAhd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTsgKyt4KSB7XG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID1cbiAgICAgICAgd2luZG93W3ZlbmRvcnNbeF0gKyBcIlJlcXVlc3RBbmltYXRpb25GcmFtZVwiXTtcbiAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9XG4gICAgICAgIHdpbmRvd1t2ZW5kb3JzW3hdICsgXCJDYW5jZWxBbmltYXRpb25GcmFtZVwiXSB8fFxuICAgICAgICB3aW5kb3dbdmVuZG9yc1t4XSArIFwiQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCJdO1xuICAgIH1cbiAgICBpZiAoIXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpXG4gICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24gKGNhbGxiYWNrLCBlbGVtZW50KSB7XG4gICAgICAgIHZhciBjdXJyVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB2YXIgdGltZVRvQ2FsbCA9IE1hdGgubWF4KDAsIDE2IC0gKGN1cnJUaW1lIC0gbGFzdFRpbWUpKTtcbiAgICAgICAgdmFyIGlkID0gd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGNhbGxiYWNrKGN1cnJUaW1lICsgdGltZVRvQ2FsbCk7XG4gICAgICAgIH0sIHRpbWVUb0NhbGwpO1xuICAgICAgICBsYXN0VGltZSA9IGN1cnJUaW1lICsgdGltZVRvQ2FsbDtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgfTtcbiAgICBpZiAoIXdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSlcbiAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoaWQpO1xuICAgICAgfTtcbiAgfSkoKTtcblxuICB2YXIgY2FudmFzLFxuICAgIHByb2dyZXNzVGltZXJJZCxcbiAgICBmYWRlVGltZXJJZCxcbiAgICBjdXJyZW50UHJvZ3Jlc3MsXG4gICAgc2hvd2luZyxcbiAgICBhZGRFdmVudCA9IGZ1bmN0aW9uIChlbGVtLCB0eXBlLCBoYW5kbGVyKSB7XG4gICAgICBpZiAoZWxlbS5hZGRFdmVudExpc3RlbmVyKSBlbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgZWxzZSBpZiAoZWxlbS5hdHRhY2hFdmVudCkgZWxlbS5hdHRhY2hFdmVudChcIm9uXCIgKyB0eXBlLCBoYW5kbGVyKTtcbiAgICAgIGVsc2UgZWxlbVtcIm9uXCIgKyB0eXBlXSA9IGhhbmRsZXI7XG4gICAgfSxcbiAgICBvcHRpb25zID0ge1xuICAgICAgYXV0b1J1bjogdHJ1ZSxcbiAgICAgIGJhclRoaWNrbmVzczogMyxcbiAgICAgIGJhckNvbG9yczoge1xuICAgICAgICAwOiBcInJnYmEoMjYsICAxODgsIDE1NiwgLjkpXCIsXG4gICAgICAgIFwiLjI1XCI6IFwicmdiYSg1MiwgIDE1MiwgMjE5LCAuOSlcIixcbiAgICAgICAgXCIuNTBcIjogXCJyZ2JhKDI0MSwgMTk2LCAxNSwgIC45KVwiLFxuICAgICAgICBcIi43NVwiOiBcInJnYmEoMjMwLCAxMjYsIDM0LCAgLjkpXCIsXG4gICAgICAgIFwiMS4wXCI6IFwicmdiYSgyMTEsIDg0LCAgMCwgICAuOSlcIixcbiAgICAgIH0sXG4gICAgICBzaGFkb3dCbHVyOiAxMCxcbiAgICAgIHNoYWRvd0NvbG9yOiBcInJnYmEoMCwgICAwLCAgIDAsICAgLjYpXCIsXG4gICAgICBjbGFzc05hbWU6IG51bGwsXG4gICAgfSxcbiAgICByZXBhaW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgY2FudmFzLndpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gb3B0aW9ucy5iYXJUaGlja25lc3MgKiA1OyAvLyBuZWVkIHNwYWNlIGZvciBzaGFkb3dcblxuICAgICAgdmFyIGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICBjdHguc2hhZG93Qmx1ciA9IG9wdGlvbnMuc2hhZG93Qmx1cjtcbiAgICAgIGN0eC5zaGFkb3dDb2xvciA9IG9wdGlvbnMuc2hhZG93Q29sb3I7XG5cbiAgICAgIHZhciBsaW5lR3JhZGllbnQgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgY2FudmFzLndpZHRoLCAwKTtcbiAgICAgIGZvciAodmFyIHN0b3AgaW4gb3B0aW9ucy5iYXJDb2xvcnMpXG4gICAgICAgIGxpbmVHcmFkaWVudC5hZGRDb2xvclN0b3Aoc3RvcCwgb3B0aW9ucy5iYXJDb2xvcnNbc3RvcF0pO1xuICAgICAgY3R4LmxpbmVXaWR0aCA9IG9wdGlvbnMuYmFyVGhpY2tuZXNzO1xuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgY3R4Lm1vdmVUbygwLCBvcHRpb25zLmJhclRoaWNrbmVzcyAvIDIpO1xuICAgICAgY3R4LmxpbmVUbyhcbiAgICAgICAgTWF0aC5jZWlsKGN1cnJlbnRQcm9ncmVzcyAqIGNhbnZhcy53aWR0aCksXG4gICAgICAgIG9wdGlvbnMuYmFyVGhpY2tuZXNzIC8gMlxuICAgICAgKTtcbiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IGxpbmVHcmFkaWVudDtcbiAgICAgIGN0eC5zdHJva2UoKTtcbiAgICB9LFxuICAgIGNyZWF0ZUNhbnZhcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgICB2YXIgc3R5bGUgPSBjYW52YXMuc3R5bGU7XG4gICAgICBzdHlsZS5wb3NpdGlvbiA9IFwiZml4ZWRcIjtcbiAgICAgIHN0eWxlLnRvcCA9IHN0eWxlLmxlZnQgPSBzdHlsZS5yaWdodCA9IHN0eWxlLm1hcmdpbiA9IHN0eWxlLnBhZGRpbmcgPSAwO1xuICAgICAgc3R5bGUuekluZGV4ID0gMTAwMDAxO1xuICAgICAgc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgaWYgKG9wdGlvbnMuY2xhc3NOYW1lKSBjYW52YXMuY2xhc3NMaXN0LmFkZChvcHRpb25zLmNsYXNzTmFtZSk7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgICBhZGRFdmVudCh3aW5kb3csIFwicmVzaXplXCIsIHJlcGFpbnQpO1xuICAgIH0sXG4gICAgdG9wYmFyID0ge1xuICAgICAgY29uZmlnOiBmdW5jdGlvbiAob3B0cykge1xuICAgICAgICBmb3IgKHZhciBrZXkgaW4gb3B0cylcbiAgICAgICAgICBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShrZXkpKSBvcHRpb25zW2tleV0gPSBvcHRzW2tleV07XG4gICAgICB9LFxuICAgICAgc2hvdzogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoc2hvd2luZykgcmV0dXJuO1xuICAgICAgICBzaG93aW5nID0gdHJ1ZTtcbiAgICAgICAgaWYgKGZhZGVUaW1lcklkICE9PSBudWxsKSB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoZmFkZVRpbWVySWQpO1xuICAgICAgICBpZiAoIWNhbnZhcykgY3JlYXRlQ2FudmFzKCk7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5vcGFjaXR5ID0gMTtcbiAgICAgICAgY2FudmFzLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgIHRvcGJhci5wcm9ncmVzcygwKTtcbiAgICAgICAgaWYgKG9wdGlvbnMuYXV0b1J1bikge1xuICAgICAgICAgIChmdW5jdGlvbiBsb29wKCkge1xuICAgICAgICAgICAgcHJvZ3Jlc3NUaW1lcklkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShsb29wKTtcbiAgICAgICAgICAgIHRvcGJhci5wcm9ncmVzcyhcbiAgICAgICAgICAgICAgXCIrXCIgKyAwLjA1ICogTWF0aC5wb3coMSAtIE1hdGguc3FydChjdXJyZW50UHJvZ3Jlc3MpLCAyKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KSgpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uICh0bykge1xuICAgICAgICBpZiAodHlwZW9mIHRvID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gY3VycmVudFByb2dyZXNzO1xuICAgICAgICBpZiAodHlwZW9mIHRvID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgdG8gPVxuICAgICAgICAgICAgKHRvLmluZGV4T2YoXCIrXCIpID49IDAgfHwgdG8uaW5kZXhPZihcIi1cIikgPj0gMFxuICAgICAgICAgICAgICA/IGN1cnJlbnRQcm9ncmVzc1xuICAgICAgICAgICAgICA6IDApICsgcGFyc2VGbG9hdCh0byk7XG4gICAgICAgIH1cbiAgICAgICAgY3VycmVudFByb2dyZXNzID0gdG8gPiAxID8gMSA6IHRvO1xuICAgICAgICByZXBhaW50KCk7XG4gICAgICAgIHJldHVybiBjdXJyZW50UHJvZ3Jlc3M7XG4gICAgICB9LFxuICAgICAgaGlkZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoIXNob3dpbmcpIHJldHVybjtcbiAgICAgICAgc2hvd2luZyA9IGZhbHNlO1xuICAgICAgICBpZiAocHJvZ3Jlc3NUaW1lcklkICE9IG51bGwpIHtcbiAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUocHJvZ3Jlc3NUaW1lcklkKTtcbiAgICAgICAgICBwcm9ncmVzc1RpbWVySWQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIChmdW5jdGlvbiBsb29wKCkge1xuICAgICAgICAgIGlmICh0b3BiYXIucHJvZ3Jlc3MoXCIrLjFcIikgPj0gMSkge1xuICAgICAgICAgICAgY2FudmFzLnN0eWxlLm9wYWNpdHkgLT0gMC4wNTtcbiAgICAgICAgICAgIGlmIChjYW52YXMuc3R5bGUub3BhY2l0eSA8PSAwLjA1KSB7XG4gICAgICAgICAgICAgIGNhbnZhcy5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICAgICAgICAgIGZhZGVUaW1lcklkID0gbnVsbDtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBmYWRlVGltZXJJZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7XG4gICAgICAgIH0pKCk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgaWYgKHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG1vZHVsZS5leHBvcnRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSB0b3BiYXI7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHRvcGJhcjtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLnRvcGJhciA9IHRvcGJhcjtcbiAgfVxufS5jYWxsKHRoaXMsIHdpbmRvdywgZG9jdW1lbnQpKTtcbiIsICJpbXBvcnQgJCBmcm9tIFwianF1ZXJ5XCI7XG53aW5kb3cuJCA9ICQ7XG53aW5kb3cualF1ZXJ5ID0gJDtcblxuaW1wb3J0IFwiYm9vdHN0cmFwXCI7XG5pbXBvcnQgXCIuLi92ZW5kb3IvcHJpc21cIjtcblxuaW1wb3J0IFwiLi9yZXBvc2l0b3J5XCI7XG5pbXBvcnQgXCIuL2tteF9hbmltXCI7XG5cbi8vIElmIHlvdSB3YW50IHRvIHVzZSBQaG9lbml4IGNoYW5uZWxzLCBydW4gYG1peCBoZWxwIHBoeC5nZW4uY2hhbm5lbGBcbi8vIHRvIGdldCBzdGFydGVkIGFuZCB0aGVuIHVuY29tbWVudCB0aGUgbGluZSBiZWxvdy5cbi8vIGltcG9ydCBcIi4vdXNlcl9zb2NrZXQuanNcIlxuXG4vLyBJbmNsdWRlIHBob2VuaXhfaHRtbCB0byBoYW5kbGUgbWV0aG9kPVBVVC9ERUxFVEUgaW4gZm9ybXMgYW5kIGJ1dHRvbnMuXG5pbXBvcnQgXCJwaG9lbml4X2h0bWxcIjtcbi8vIEVzdGFibGlzaCBQaG9lbml4IFNvY2tldCBhbmQgTGl2ZVZpZXcgY29uZmlndXJhdGlvbi5cbmltcG9ydCB7U29ja2V0fSBmcm9tIFwicGhvZW5peFwiO1xuaW1wb3J0IHtMaXZlU29ja2V0fSBmcm9tIFwicGhvZW5peF9saXZlX3ZpZXdcIjtcbmltcG9ydCB0b3BiYXIgZnJvbSBcIi4uL3ZlbmRvci90b3BiYXJcIjtcblxubGV0IGNzcmZUb2tlbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJtZXRhW25hbWU9J2NzcmYtdG9rZW4nXVwiKS5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpO1xubGV0IGxpdmVTb2NrZXQgPSBuZXcgTGl2ZVNvY2tldChcIi9saXZlXCIsIFNvY2tldCwge3BhcmFtczoge19jc3JmX3Rva2VuOiBjc3JmVG9rZW59fSk7XG5cbi8vIFNob3cgcHJvZ3Jlc3MgYmFyIG9uIGxpdmUgbmF2aWdhdGlvbiBhbmQgZm9ybSBzdWJtaXRzXG50b3BiYXIuY29uZmlnKHtiYXJDb2xvcnM6IHswOiBcIiMyOWRcIn0sIHNoYWRvd0NvbG9yOiBcInJnYmEoMCwgMCwgMCwgLjMpXCJ9KTtcbndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCBpbmZvID0+IHRvcGJhci5zaG93KCkpO1xud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwaHg6cGFnZS1sb2FkaW5nLXN0b3BcIiwgaW5mbyA9PiB0b3BiYXIuaGlkZSgpKTtcblxuLy8gY29ubmVjdCBpZiB0aGVyZSBhcmUgYW55IExpdmVWaWV3cyBvbiB0aGUgcGFnZVxubGl2ZVNvY2tldC5jb25uZWN0KCk7XG5cbi8vIGV4cG9zZSBsaXZlU29ja2V0IG9uIHdpbmRvdyBmb3Igd2ViIGNvbnNvbGUgZGVidWcgbG9ncyBhbmQgbGF0ZW5jeSBzaW11bGF0aW9uOlxuLy8gPj4gbGl2ZVNvY2tldC5lbmFibGVEZWJ1ZygpXG4vLyA+PiBsaXZlU29ja2V0LmVuYWJsZUxhdGVuY3lTaW0oMTAwMCkgIC8vIGVuYWJsZWQgZm9yIGR1cmF0aW9uIG9mIGJyb3dzZXIgc2Vzc2lvblxuLy8gPj4gbGl2ZVNvY2tldC5kaXNhYmxlTGF0ZW5jeVNpbSgpXG53aW5kb3cubGl2ZVNvY2tldCA9IGxpdmVTb2NrZXQ7XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vZW51bXMuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL21vZGlmaWVycy9pbmRleC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IHBvcHBlckdlbmVyYXRvciwgZGV0ZWN0T3ZlcmZsb3csIGNyZWF0ZVBvcHBlciBhcyBjcmVhdGVQb3BwZXJCYXNlIH0gZnJvbSBcIi4vY3JlYXRlUG9wcGVyLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyIH0gZnJvbSBcIi4vcG9wcGVyLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgY3JlYXRlUG9wcGVyIGFzIGNyZWF0ZVBvcHBlckxpdGUgfSBmcm9tIFwiLi9wb3BwZXItbGl0ZS5qc1wiOyIsICJleHBvcnQgdmFyIHRvcCA9ICd0b3AnO1xuZXhwb3J0IHZhciBib3R0b20gPSAnYm90dG9tJztcbmV4cG9ydCB2YXIgcmlnaHQgPSAncmlnaHQnO1xuZXhwb3J0IHZhciBsZWZ0ID0gJ2xlZnQnO1xuZXhwb3J0IHZhciBhdXRvID0gJ2F1dG8nO1xuZXhwb3J0IHZhciBiYXNlUGxhY2VtZW50cyA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xuZXhwb3J0IHZhciBzdGFydCA9ICdzdGFydCc7XG5leHBvcnQgdmFyIGVuZCA9ICdlbmQnO1xuZXhwb3J0IHZhciBjbGlwcGluZ1BhcmVudHMgPSAnY2xpcHBpbmdQYXJlbnRzJztcbmV4cG9ydCB2YXIgdmlld3BvcnQgPSAndmlld3BvcnQnO1xuZXhwb3J0IHZhciBwb3BwZXIgPSAncG9wcGVyJztcbmV4cG9ydCB2YXIgcmVmZXJlbmNlID0gJ3JlZmVyZW5jZSc7XG5leHBvcnQgdmFyIHZhcmlhdGlvblBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovYmFzZVBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTtcbmV4cG9ydCB2YXIgcGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9bXS5jb25jYXQoYmFzZVBsYWNlbWVudHMsIFthdXRvXSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICByZXR1cm4gYWNjLmNvbmNhdChbcGxhY2VtZW50LCBwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pOyAvLyBtb2RpZmllcnMgdGhhdCBuZWVkIHRvIHJlYWQgdGhlIERPTVxuXG5leHBvcnQgdmFyIGJlZm9yZVJlYWQgPSAnYmVmb3JlUmVhZCc7XG5leHBvcnQgdmFyIHJlYWQgPSAncmVhZCc7XG5leHBvcnQgdmFyIGFmdGVyUmVhZCA9ICdhZnRlclJlYWQnOyAvLyBwdXJlLWxvZ2ljIG1vZGlmaWVyc1xuXG5leHBvcnQgdmFyIGJlZm9yZU1haW4gPSAnYmVmb3JlTWFpbic7XG5leHBvcnQgdmFyIG1haW4gPSAnbWFpbic7XG5leHBvcnQgdmFyIGFmdGVyTWFpbiA9ICdhZnRlck1haW4nOyAvLyBtb2RpZmllciB3aXRoIHRoZSBwdXJwb3NlIHRvIHdyaXRlIHRvIHRoZSBET00gKG9yIHdyaXRlIGludG8gYSBmcmFtZXdvcmsgc3RhdGUpXG5cbmV4cG9ydCB2YXIgYmVmb3JlV3JpdGUgPSAnYmVmb3JlV3JpdGUnO1xuZXhwb3J0IHZhciB3cml0ZSA9ICd3cml0ZSc7XG5leHBvcnQgdmFyIGFmdGVyV3JpdGUgPSAnYWZ0ZXJXcml0ZSc7XG5leHBvcnQgdmFyIG1vZGlmaWVyUGhhc2VzID0gW2JlZm9yZVJlYWQsIHJlYWQsIGFmdGVyUmVhZCwgYmVmb3JlTWFpbiwgbWFpbiwgYWZ0ZXJNYWluLCBiZWZvcmVXcml0ZSwgd3JpdGUsIGFmdGVyV3JpdGVdOyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlTmFtZShlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50ID8gKGVsZW1lbnQubm9kZU5hbWUgfHwgJycpLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xufSIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIGlmIChub2RlLnRvU3RyaW5nKCkgIT09ICdbb2JqZWN0IFdpbmRvd10nKSB7XG4gICAgdmFyIG93bmVyRG9jdW1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgcmV0dXJuIG93bmVyRG9jdW1lbnQgPyBvd25lckRvY3VtZW50LmRlZmF1bHRWaWV3IHx8IHdpbmRvdyA6IHdpbmRvdztcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gaXNTaGFkb3dSb290KG5vZGUpIHtcbiAgLy8gSUUgMTEgaGFzIG5vIFNoYWRvd1Jvb3RcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBPd25FbGVtZW50ID0gZ2V0V2luZG93KG5vZGUpLlNoYWRvd1Jvb3Q7XG4gIHJldHVybiBub2RlIGluc3RhbmNlb2YgT3duRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbn1cblxuZXhwb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50LCBpc1NoYWRvd1Jvb3QgfTsiLCAiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gVGhpcyBtb2RpZmllciB0YWtlcyB0aGUgc3R5bGVzIHByZXBhcmVkIGJ5IHRoZSBgY29tcHV0ZVN0eWxlc2AgbW9kaWZpZXJcbi8vIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlIEhUTUxFbGVtZW50cyBzdWNoIGFzIHBvcHBlciBhbmQgYXJyb3dcblxuZnVuY3Rpb24gYXBwbHlTdHlsZXMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlO1xuICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBzdHlsZSA9IHN0YXRlLnN0eWxlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0byBleHRlbmQgdGhpcyBwcm9wZXJ0eSwgYnV0IGl0J3MgdGhlIG1vc3RcbiAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgIC8vICRGbG93Rml4TWVbY2Fubm90LXdyaXRlXVxuXG5cbiAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHN0eWxlKTtcbiAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICB2YXIgdmFsdWUgPSBhdHRyaWJ1dGVzW25hbWVdO1xuXG4gICAgICBpZiAodmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKG5hbWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUgPT09IHRydWUgPyAnJyA6IHZhbHVlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGVmZmVjdChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZTtcbiAgdmFyIGluaXRpYWxTdHlsZXMgPSB7XG4gICAgcG9wcGVyOiB7XG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgbWFyZ2luOiAnMCdcbiAgICB9LFxuICAgIGFycm93OiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fVxuICB9O1xuICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5zdHlsZSwgaW5pdGlhbFN0eWxlcy5wb3BwZXIpO1xuICBzdGF0ZS5zdHlsZXMgPSBpbml0aWFsU3R5bGVzO1xuXG4gIGlmIChzdGF0ZS5lbGVtZW50cy5hcnJvdykge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMuYXJyb3cuc3R5bGUsIGluaXRpYWxTdHlsZXMuYXJyb3cpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICAgIHZhciBzdHlsZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBzdGF0ZS5zdHlsZXNbbmFtZV0gOiBpbml0aWFsU3R5bGVzW25hbWVdKTsgLy8gU2V0IGFsbCB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIHVuc2V0IHRoZW1cblxuICAgICAgdmFyIHN0eWxlID0gc3R5bGVQcm9wZXJ0aWVzLnJlZHVjZShmdW5jdGlvbiAoc3R5bGUsIHByb3BlcnR5KSB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LCB7fSk7IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSk7XG4gICAgICBPYmplY3Qua2V5cyhhdHRyaWJ1dGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHtcbiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYXR0cmlidXRlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3Q6IGVmZmVjdCxcbiAgcmVxdWlyZXM6IFsnY29tcHV0ZVN0eWxlcyddXG59OyIsICJpbXBvcnQgeyBhdXRvIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59IiwgImV4cG9ydCB2YXIgbWF4ID0gTWF0aC5tYXg7XG5leHBvcnQgdmFyIG1pbiA9IE1hdGgubWluO1xuZXhwb3J0IHZhciByb3VuZCA9IE1hdGgucm91bmQ7IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFVBU3RyaW5nKCkge1xuICB2YXIgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG5cbiAgaWYgKHVhRGF0YSAhPSBudWxsICYmIHVhRGF0YS5icmFuZHMpIHtcbiAgICByZXR1cm4gdWFEYXRhLmJyYW5kcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLmJyYW5kICsgXCIvXCIgKyBpdGVtLnZlcnNpb247XG4gICAgfSkuam9pbignICcpO1xuICB9XG5cbiAgcmV0dXJuIG5hdmlnYXRvci51c2VyQWdlbnQ7XG59IiwgImltcG9ydCBnZXRVQVN0cmluZyBmcm9tIFwiLi4vdXRpbHMvdXNlckFnZW50LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBpc0xheW91dFZpZXdwb3J0KCkge1xuICByZXR1cm4gIS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7XG59IiwgImltcG9ydCB7IGlzRWxlbWVudCwgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCB7IHJvdW5kIH0gZnJvbSBcIi4uL3V0aWxzL21hdGguanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgaXNMYXlvdXRWaWV3cG9ydCBmcm9tIFwiLi9pc0xheW91dFZpZXdwb3J0LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCwgaW5jbHVkZVNjYWxlLCBpc0ZpeGVkU3RyYXRlZ3kpIHtcbiAgaWYgKGluY2x1ZGVTY2FsZSA9PT0gdm9pZCAwKSB7XG4gICAgaW5jbHVkZVNjYWxlID0gZmFsc2U7XG4gIH1cblxuICBpZiAoaXNGaXhlZFN0cmF0ZWd5ID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkU3RyYXRlZ3kgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBjbGllbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IDE7XG4gIHZhciBzY2FsZVkgPSAxO1xuXG4gIGlmIChpbmNsdWRlU2NhbGUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIHNjYWxlWCA9IGVsZW1lbnQub2Zmc2V0V2lkdGggPiAwID8gcm91bmQoY2xpZW50UmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDEgOiAxO1xuICAgIHNjYWxlWSA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gMCA/IHJvdW5kKGNsaWVudFJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDEgOiAxO1xuICB9XG5cbiAgdmFyIF9yZWYgPSBpc0VsZW1lbnQoZWxlbWVudCkgPyBnZXRXaW5kb3coZWxlbWVudCkgOiB3aW5kb3csXG4gICAgICB2aXN1YWxWaWV3cG9ydCA9IF9yZWYudmlzdWFsVmlld3BvcnQ7XG5cbiAgdmFyIGFkZFZpc3VhbE9mZnNldHMgPSAhaXNMYXlvdXRWaWV3cG9ydCgpICYmIGlzRml4ZWRTdHJhdGVneTtcbiAgdmFyIHggPSAoY2xpZW50UmVjdC5sZWZ0ICsgKGFkZFZpc3VhbE9mZnNldHMgJiYgdmlzdWFsVmlld3BvcnQgPyB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0IDogMCkpIC8gc2NhbGVYO1xuICB2YXIgeSA9IChjbGllbnRSZWN0LnRvcCArIChhZGRWaXN1YWxPZmZzZXRzICYmIHZpc3VhbFZpZXdwb3J0ID8gdmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wIDogMCkpIC8gc2NhbGVZO1xuICB2YXIgd2lkdGggPSBjbGllbnRSZWN0LndpZHRoIC8gc2NhbGVYO1xuICB2YXIgaGVpZ2h0ID0gY2xpZW50UmVjdC5oZWlnaHQgLyBzY2FsZVk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHRvcDogeSxcbiAgICByaWdodDogeCArIHdpZHRoLFxuICAgIGJvdHRvbTogeSArIGhlaWdodCxcbiAgICBsZWZ0OiB4LFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufSIsICJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiOyAvLyBSZXR1cm5zIHRoZSBsYXlvdXQgcmVjdCBvZiBhbiBlbGVtZW50IHJlbGF0aXZlIHRvIGl0cyBvZmZzZXRQYXJlbnQuIExheW91dFxuLy8gbWVhbnMgaXQgZG9lc24ndCB0YWtlIGludG8gYWNjb3VudCB0cmFuc2Zvcm1zLlxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRMYXlvdXRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIGNsaWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCk7IC8vIFVzZSB0aGUgY2xpZW50UmVjdCBzaXplcyBpZiBpdCdzIG5vdCBiZWVuIHRyYW5zZm9ybWVkLlxuICAvLyBGaXhlcyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzEyMjNcblxuICB2YXIgd2lkdGggPSBlbGVtZW50Lm9mZnNldFdpZHRoO1xuICB2YXIgaGVpZ2h0ID0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG5cbiAgaWYgKE1hdGguYWJzKGNsaWVudFJlY3Qud2lkdGggLSB3aWR0aCkgPD0gMSkge1xuICAgIHdpZHRoID0gY2xpZW50UmVjdC53aWR0aDtcbiAgfVxuXG4gIGlmIChNYXRoLmFicyhjbGllbnRSZWN0LmhlaWdodCAtIGhlaWdodCkgPD0gMSkge1xuICAgIGhlaWdodCA9IGNsaWVudFJlY3QuaGVpZ2h0O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiBlbGVtZW50Lm9mZnNldExlZnQsXG4gICAgeTogZWxlbWVudC5vZmZzZXRUb3AsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH07XG59IiwgImltcG9ydCB7IGlzU2hhZG93Um9vdCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgdmFyIHJvb3ROb2RlID0gY2hpbGQuZ2V0Um9vdE5vZGUgJiYgY2hpbGQuZ2V0Um9vdE5vZGUoKTsgLy8gRmlyc3QsIGF0dGVtcHQgd2l0aCBmYXN0ZXIgbmF0aXZlIG1ldGhvZFxuXG4gIGlmIChwYXJlbnQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gdGhlbiBmYWxsYmFjayB0byBjdXN0b20gaW1wbGVtZW50YXRpb24gd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnRcbiAgZWxzZSBpZiAocm9vdE5vZGUgJiYgaXNTaGFkb3dSb290KHJvb3ROb2RlKSkge1xuICAgICAgdmFyIG5leHQgPSBjaGlsZDtcblxuICAgICAgZG8ge1xuICAgICAgICBpZiAobmV4dCAmJiBwYXJlbnQuaXNTYW1lTm9kZShuZXh0KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXTogbmVlZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuLi5cblxuXG4gICAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgICAgfSB3aGlsZSAobmV4dCk7XG4gICAgfSAvLyBHaXZlIHVwLCB0aGUgcmVzdWx0IGlzIGZhbHNlXG5cblxuICByZXR1cm4gZmFsc2U7XG59IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldFdpbmRvdyhlbGVtZW50KS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xufSIsICJpbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGlzVGFibGVFbGVtZW50KGVsZW1lbnQpIHtcbiAgcmV0dXJuIFsndGFibGUnLCAndGQnLCAndGgnXS5pbmRleE9mKGdldE5vZGVOYW1lKGVsZW1lbnQpKSA+PSAwO1xufSIsICJpbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkge1xuICAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBhc3N1bWUgYm9keSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gIHJldHVybiAoKGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICBlbGVtZW50LmRvY3VtZW50KSB8fCB3aW5kb3cuZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudDtcbn0iLCAiaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IHsgaXNTaGFkb3dSb290IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShlbGVtZW50KSB7XG4gIGlmIChnZXROb2RlTmFtZShlbGVtZW50KSA9PT0gJ2h0bWwnKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICByZXR1cm4gKC8vIHRoaXMgaXMgYSBxdWlja2VyIChidXQgbGVzcyB0eXBlIHNhZmUpIHdheSB0byBzYXZlIHF1aXRlIHNvbWUgYnl0ZXMgZnJvbSB0aGUgYnVuZGxlXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXVxuICAgIC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8ICggLy8gRE9NIEVsZW1lbnQgZGV0ZWN0ZWRcbiAgICBpc1NoYWRvd1Jvb3QoZWxlbWVudCkgPyBlbGVtZW50Lmhvc3QgOiBudWxsKSB8fCAvLyBTaGFkb3dSb290IGRldGVjdGVkXG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtY2FsbF06IEhUTUxFbGVtZW50IGlzIGEgTm9kZVxuICAgIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSAvLyBmYWxsYmFja1xuXG4gICk7XG59IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQsIGlzU2hhZG93Um9vdCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBpc1RhYmxlRWxlbWVudCBmcm9tIFwiLi9pc1RhYmxlRWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGdldFVBU3RyaW5nIGZyb20gXCIuLi91dGlscy91c2VyQWdlbnQuanNcIjtcblxuZnVuY3Rpb24gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KSB7XG4gIGlmICghaXNIVE1MRWxlbWVudChlbGVtZW50KSB8fCAvLyBodHRwczovL2dpdGh1Yi5jb20vcG9wcGVyanMvcG9wcGVyLWNvcmUvaXNzdWVzLzgzN1xuICBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudC5vZmZzZXRQYXJlbnQ7XG59IC8vIGAub2Zmc2V0UGFyZW50YCByZXBvcnRzIGBudWxsYCBmb3IgZml4ZWQgZWxlbWVudHMsIHdoaWxlIGFic29sdXRlIGVsZW1lbnRzXG4vLyByZXR1cm4gdGhlIGNvbnRhaW5pbmcgYmxvY2tcblxuXG5mdW5jdGlvbiBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkge1xuICB2YXIgaXNGaXJlZm94ID0gL2ZpcmVmb3gvaS50ZXN0KGdldFVBU3RyaW5nKCkpO1xuICB2YXIgaXNJRSA9IC9UcmlkZW50L2kudGVzdChnZXRVQVN0cmluZygpKTtcblxuICBpZiAoaXNJRSAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgLy8gSW4gSUUgOSwgMTAgYW5kIDExIGZpeGVkIGVsZW1lbnRzIGNvbnRhaW5pbmcgYmxvY2sgaXMgYWx3YXlzIGVzdGFibGlzaGVkIGJ5IHRoZSB2aWV3cG9ydFxuICAgIHZhciBlbGVtZW50Q3NzID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcblxuICAgIGlmIChlbGVtZW50Q3NzLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICB2YXIgY3VycmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKGVsZW1lbnQpO1xuXG4gIGlmIChpc1NoYWRvd1Jvb3QoY3VycmVudE5vZGUpKSB7XG4gICAgY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5ob3N0O1xuICB9XG5cbiAgd2hpbGUgKGlzSFRNTEVsZW1lbnQoY3VycmVudE5vZGUpICYmIFsnaHRtbCcsICdib2R5J10uaW5kZXhPZihnZXROb2RlTmFtZShjdXJyZW50Tm9kZSkpIDwgMCkge1xuICAgIHZhciBjc3MgPSBnZXRDb21wdXRlZFN0eWxlKGN1cnJlbnROb2RlKTsgLy8gVGhpcyBpcyBub24tZXhoYXVzdGl2ZSBidXQgY292ZXJzIHRoZSBtb3N0IGNvbW1vbiBDU1MgcHJvcGVydGllcyB0aGF0XG4gICAgLy8gY3JlYXRlIGEgY29udGFpbmluZyBibG9jay5cbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9DU1MvQ29udGFpbmluZ19ibG9jayNpZGVudGlmeWluZ190aGVfY29udGFpbmluZ19ibG9ja1xuXG4gICAgaWYgKGNzcy50cmFuc2Zvcm0gIT09ICdub25lJyB8fCBjc3MucGVyc3BlY3RpdmUgIT09ICdub25lJyB8fCBjc3MuY29udGFpbiA9PT0gJ3BhaW50JyB8fCBbJ3RyYW5zZm9ybScsICdwZXJzcGVjdGl2ZSddLmluZGV4T2YoY3NzLndpbGxDaGFuZ2UpICE9PSAtMSB8fCBpc0ZpcmVmb3ggJiYgY3NzLndpbGxDaGFuZ2UgPT09ICdmaWx0ZXInIHx8IGlzRmlyZWZveCAmJiBjc3MuZmlsdGVyICYmIGNzcy5maWx0ZXIgIT09ICdub25lJykge1xuICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59IC8vIEdldHMgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgcG9zaXRpb25lZCBlbGVtZW50LiBIYW5kbGVzIHNvbWUgZWRnZSBjYXNlcyxcbi8vIHN1Y2ggYXMgdGFibGUgYW5jZXN0b3JzIGFuZCBjcm9zcyBicm93c2VyIGJ1Z3MuXG5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgdmFyIHdpbmRvdyA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCk7XG5cbiAgd2hpbGUgKG9mZnNldFBhcmVudCAmJiBpc1RhYmxlRWxlbWVudChvZmZzZXRQYXJlbnQpICYmIGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcbiAgICBvZmZzZXRQYXJlbnQgPSBnZXRUcnVlT2Zmc2V0UGFyZW50KG9mZnNldFBhcmVudCk7XG4gIH1cblxuICBpZiAob2Zmc2V0UGFyZW50ICYmIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnaHRtbCcgfHwgZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2JvZHknICYmIGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpKSB7XG4gICAgcmV0dXJuIHdpbmRvdztcbiAgfVxuXG4gIHJldHVybiBvZmZzZXRQYXJlbnQgfHwgZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHx8IHdpbmRvdztcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gWyd0b3AnLCAnYm90dG9tJ10uaW5kZXhPZihwbGFjZW1lbnQpID49IDAgPyAneCcgOiAneSc7XG59IiwgImltcG9ydCB7IG1heCBhcyBtYXRoTWF4LCBtaW4gYXMgbWF0aE1pbiB9IGZyb20gXCIuL21hdGguanNcIjtcbmV4cG9ydCBmdW5jdGlvbiB3aXRoaW4obWluLCB2YWx1ZSwgbWF4KSB7XG4gIHJldHVybiBtYXRoTWF4KG1pbiwgbWF0aE1pbih2YWx1ZSwgbWF4KSk7XG59XG5leHBvcnQgZnVuY3Rpb24gd2l0aGluTWF4Q2xhbXAobWluLCB2YWx1ZSwgbWF4KSB7XG4gIHZhciB2ID0gd2l0aGluKG1pbiwgdmFsdWUsIG1heCk7XG4gIHJldHVybiB2ID4gbWF4ID8gbWF4IDogdjtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RnJlc2hTaWRlT2JqZWN0KCkge1xuICByZXR1cm4ge1xuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMFxuICB9O1xufSIsICJpbXBvcnQgZ2V0RnJlc2hTaWRlT2JqZWN0IGZyb20gXCIuL2dldEZyZXNoU2lkZU9iamVjdC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VQYWRkaW5nT2JqZWN0KHBhZGRpbmdPYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGdldEZyZXNoU2lkZU9iamVjdCgpLCBwYWRkaW5nT2JqZWN0KTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwKHZhbHVlLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAoaGFzaE1hcCwga2V5KSB7XG4gICAgaGFzaE1hcFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGhhc2hNYXA7XG4gIH0sIHt9KTtcbn0iLCAiaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRMYXlvdXRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGNvbnRhaW5zIGZyb20gXCIuLi9kb20tdXRpbHMvY29udGFpbnMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgd2l0aGluIH0gZnJvbSBcIi4uL3V0aWxzL3dpdGhpbi5qc1wiO1xuaW1wb3J0IG1lcmdlUGFkZGluZ09iamVjdCBmcm9tIFwiLi4vdXRpbHMvbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuLi91dGlscy9leHBhbmRUb0hhc2hNYXAuanNcIjtcbmltcG9ydCB7IGxlZnQsIHJpZ2h0LCBiYXNlUGxhY2VtZW50cywgdG9wLCBib3R0b20gfSBmcm9tIFwiLi4vZW51bXMuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgdG9QYWRkaW5nT2JqZWN0ID0gZnVuY3Rpb24gdG9QYWRkaW5nT2JqZWN0KHBhZGRpbmcsIHN0YXRlKSB7XG4gIHBhZGRpbmcgPSB0eXBlb2YgcGFkZGluZyA9PT0gJ2Z1bmN0aW9uJyA/IHBhZGRpbmcoT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMsIHtcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KSkgOiBwYWRkaW5nO1xuICByZXR1cm4gbWVyZ2VQYWRkaW5nT2JqZWN0KHR5cGVvZiBwYWRkaW5nICE9PSAnbnVtYmVyJyA/IHBhZGRpbmcgOiBleHBhbmRUb0hhc2hNYXAocGFkZGluZywgYmFzZVBsYWNlbWVudHMpKTtcbn07XG5cbmZ1bmN0aW9uIGFycm93KF9yZWYpIHtcbiAgdmFyIF9zdGF0ZSRtb2RpZmllcnNEYXRhJDtcblxuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgYXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGlzVmVydGljYWwgPSBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgaWYgKCFhcnJvd0VsZW1lbnQgfHwgIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGFkZGluZ09iamVjdCA9IHRvUGFkZGluZ09iamVjdChvcHRpb25zLnBhZGRpbmcsIHN0YXRlKTtcbiAgdmFyIGFycm93UmVjdCA9IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KTtcbiAgdmFyIG1pblByb3AgPSBheGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICB2YXIgbWF4UHJvcCA9IGF4aXMgPT09ICd5JyA/IGJvdHRvbSA6IHJpZ2h0O1xuICB2YXIgZW5kRGlmZiA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtsZW5dICsgc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdIC0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnBvcHBlcltsZW5dO1xuICB2YXIgc3RhcnREaWZmID0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXTtcbiAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGFycm93RWxlbWVudCk7XG4gIHZhciBjbGllbnRTaXplID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBheGlzID09PSAneScgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRIZWlnaHQgfHwgMCA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFdpZHRoIHx8IDAgOiAwO1xuICB2YXIgY2VudGVyVG9SZWZlcmVuY2UgPSBlbmREaWZmIC8gMiAtIHN0YXJ0RGlmZiAvIDI7IC8vIE1ha2Ugc3VyZSB0aGUgYXJyb3cgZG9lc24ndCBvdmVyZmxvdyB0aGUgcG9wcGVyIGlmIHRoZSBjZW50ZXIgcG9pbnQgaXNcbiAgLy8gb3V0c2lkZSBvZiB0aGUgcG9wcGVyIGJvdW5kc1xuXG4gIHZhciBtaW4gPSBwYWRkaW5nT2JqZWN0W21pblByb3BdO1xuICB2YXIgbWF4ID0gY2xpZW50U2l6ZSAtIGFycm93UmVjdFtsZW5dIC0gcGFkZGluZ09iamVjdFttYXhQcm9wXTtcbiAgdmFyIGNlbnRlciA9IGNsaWVudFNpemUgLyAyIC0gYXJyb3dSZWN0W2xlbl0gLyAyICsgY2VudGVyVG9SZWZlcmVuY2U7XG4gIHZhciBvZmZzZXQgPSB3aXRoaW4obWluLCBjZW50ZXIsIG1heCk7IC8vIFByZXZlbnRzIGJyZWFraW5nIHN5bnRheCBoaWdobGlnaHRpbmcuLi5cblxuICB2YXIgYXhpc1Byb3AgPSBheGlzO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gKF9zdGF0ZSRtb2RpZmllcnNEYXRhJCA9IHt9LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSRbYXhpc1Byb3BdID0gb2Zmc2V0LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQuY2VudGVyT2Zmc2V0ID0gb2Zmc2V0IC0gY2VudGVyLCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQpO1xufVxuXG5mdW5jdGlvbiBlZmZlY3QoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucztcbiAgdmFyIF9vcHRpb25zJGVsZW1lbnQgPSBvcHRpb25zLmVsZW1lbnQsXG4gICAgICBhcnJvd0VsZW1lbnQgPSBfb3B0aW9ucyRlbGVtZW50ID09PSB2b2lkIDAgPyAnW2RhdGEtcG9wcGVyLWFycm93XScgOiBfb3B0aW9ucyRlbGVtZW50O1xuXG4gIGlmIChhcnJvd0VsZW1lbnQgPT0gbnVsbCkge1xuICAgIHJldHVybjtcbiAgfSAvLyBDU1Mgc2VsZWN0b3JcblxuXG4gIGlmICh0eXBlb2YgYXJyb3dFbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLnBvcHBlci5xdWVyeVNlbGVjdG9yKGFycm93RWxlbWVudCk7XG5cbiAgICBpZiAoIWFycm93RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoYXJyb3dFbGVtZW50KSkge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhcnJvd1wiIGVsZW1lbnQgbXVzdCBiZSBhbiBIVE1MRWxlbWVudCAobm90IGFuIFNWR0VsZW1lbnQpLicsICdUbyB1c2UgYW4gU1ZHIGFycm93LCB3cmFwIGl0IGluIGFuIEhUTUxFbGVtZW50IHRoYXQgd2lsbCBiZSB1c2VkIGFzJywgJ3RoZSBhcnJvdy4nXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29udGFpbnMoc3RhdGUuZWxlbWVudHMucG9wcGVyLCBhcnJvd0VsZW1lbnQpKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhcnJvd1wiIG1vZGlmaWVyXFwncyBgZWxlbWVudGAgbXVzdCBiZSBhIGNoaWxkIG9mIHRoZSBwb3BwZXInLCAnZWxlbWVudC4nXS5qb2luKCcgJykpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIHN0YXRlLmVsZW1lbnRzLmFycm93ID0gYXJyb3dFbGVtZW50O1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnYXJyb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogYXJyb3csXG4gIGVmZmVjdDogZWZmZWN0LFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J11cbn07IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xufSIsICJpbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20sIGVuZCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldE9mZnNldFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldFdpbmRvdy5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRDb21wdXRlZFN0eWxlLmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxudmFyIHVuc2V0U2lkZXMgPSB7XG4gIHRvcDogJ2F1dG8nLFxuICByaWdodDogJ2F1dG8nLFxuICBib3R0b206ICdhdXRvJyxcbiAgbGVmdDogJ2F1dG8nXG59OyAvLyBSb3VuZCB0aGUgb2Zmc2V0cyB0byB0aGUgbmVhcmVzdCBzdWl0YWJsZSBzdWJwaXhlbCBiYXNlZCBvbiB0aGUgRFBSLlxuLy8gWm9vbWluZyBjYW4gY2hhbmdlIHRoZSBEUFIsIGJ1dCBpdCBzZWVtcyB0byByZXBvcnQgYSB2YWx1ZSB0aGF0IHdpbGxcbi8vIGNsZWFubHkgZGl2aWRlIHRoZSB2YWx1ZXMgaW50byB0aGUgYXBwcm9wcmlhdGUgc3VicGl4ZWxzLlxuXG5mdW5jdGlvbiByb3VuZE9mZnNldHNCeURQUihfcmVmKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueTtcbiAgdmFyIHdpbiA9IHdpbmRvdztcbiAgdmFyIGRwciA9IHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiB7XG4gICAgeDogcm91bmQoeCAqIGRwcikgLyBkcHIgfHwgMCxcbiAgICB5OiByb3VuZCh5ICogZHByKSAvIGRwciB8fCAwXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXBUb1N0eWxlcyhfcmVmMikge1xuICB2YXIgX09iamVjdCRhc3NpZ24yO1xuXG4gIHZhciBwb3BwZXIgPSBfcmVmMi5wb3BwZXIsXG4gICAgICBwb3BwZXJSZWN0ID0gX3JlZjIucG9wcGVyUmVjdCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYyLnBsYWNlbWVudCxcbiAgICAgIHZhcmlhdGlvbiA9IF9yZWYyLnZhcmlhdGlvbixcbiAgICAgIG9mZnNldHMgPSBfcmVmMi5vZmZzZXRzLFxuICAgICAgcG9zaXRpb24gPSBfcmVmMi5wb3NpdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9yZWYyLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGFkYXB0aXZlID0gX3JlZjIuYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHMgPSBfcmVmMi5yb3VuZE9mZnNldHMsXG4gICAgICBpc0ZpeGVkID0gX3JlZjIuaXNGaXhlZDtcbiAgdmFyIF9vZmZzZXRzJHggPSBvZmZzZXRzLngsXG4gICAgICB4ID0gX29mZnNldHMkeCA9PT0gdm9pZCAwID8gMCA6IF9vZmZzZXRzJHgsXG4gICAgICBfb2Zmc2V0cyR5ID0gb2Zmc2V0cy55LFxuICAgICAgeSA9IF9vZmZzZXRzJHkgPT09IHZvaWQgMCA/IDAgOiBfb2Zmc2V0cyR5O1xuXG4gIHZhciBfcmVmMyA9IHR5cGVvZiByb3VuZE9mZnNldHMgPT09ICdmdW5jdGlvbicgPyByb3VuZE9mZnNldHMoe1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9KSA6IHtcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcblxuICB4ID0gX3JlZjMueDtcbiAgeSA9IF9yZWYzLnk7XG4gIHZhciBoYXNYID0gb2Zmc2V0cy5oYXNPd25Qcm9wZXJ0eSgneCcpO1xuICB2YXIgaGFzWSA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3knKTtcbiAgdmFyIHNpZGVYID0gbGVmdDtcbiAgdmFyIHNpZGVZID0gdG9wO1xuICB2YXIgd2luID0gd2luZG93O1xuXG4gIGlmIChhZGFwdGl2ZSkge1xuICAgIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKTtcbiAgICB2YXIgaGVpZ2h0UHJvcCA9ICdjbGllbnRIZWlnaHQnO1xuICAgIHZhciB3aWR0aFByb3AgPSAnY2xpZW50V2lkdGgnO1xuXG4gICAgaWYgKG9mZnNldFBhcmVudCA9PT0gZ2V0V2luZG93KHBvcHBlcikpIHtcbiAgICAgIG9mZnNldFBhcmVudCA9IGdldERvY3VtZW50RWxlbWVudChwb3BwZXIpO1xuXG4gICAgICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uICE9PSAnc3RhdGljJyAmJiBwb3NpdGlvbiA9PT0gJ2Fic29sdXRlJykge1xuICAgICAgICBoZWlnaHRQcm9wID0gJ3Njcm9sbEhlaWdodCc7XG4gICAgICAgIHdpZHRoUHJvcCA9ICdzY3JvbGxXaWR0aCc7XG4gICAgICB9XG4gICAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1jYXN0XTogZm9yY2UgdHlwZSByZWZpbmVtZW50LCB3ZSBjb21wYXJlIG9mZnNldFBhcmVudCB3aXRoIHdpbmRvdyBhYm92ZSwgYnV0IEZsb3cgZG9lc24ndCBkZXRlY3QgaXRcblxuXG4gICAgb2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50O1xuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gdG9wIHx8IChwbGFjZW1lbnQgPT09IGxlZnQgfHwgcGxhY2VtZW50ID09PSByaWdodCkgJiYgdmFyaWF0aW9uID09PSBlbmQpIHtcbiAgICAgIHNpZGVZID0gYm90dG9tO1xuICAgICAgdmFyIG9mZnNldFkgPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC5oZWlnaHQgOiAvLyAkRmxvd0ZpeE1lW3Byb3AtbWlzc2luZ11cbiAgICAgIG9mZnNldFBhcmVudFtoZWlnaHRQcm9wXTtcbiAgICAgIHkgLT0gb2Zmc2V0WSAtIHBvcHBlclJlY3QuaGVpZ2h0O1xuICAgICAgeSAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gbGVmdCB8fCAocGxhY2VtZW50ID09PSB0b3AgfHwgcGxhY2VtZW50ID09PSBib3R0b20pICYmIHZhcmlhdGlvbiA9PT0gZW5kKSB7XG4gICAgICBzaWRlWCA9IHJpZ2h0O1xuICAgICAgdmFyIG9mZnNldFggPSBpc0ZpeGVkICYmIG9mZnNldFBhcmVudCA9PT0gd2luICYmIHdpbi52aXN1YWxWaWV3cG9ydCA/IHdpbi52aXN1YWxWaWV3cG9ydC53aWR0aCA6IC8vICRGbG93Rml4TWVbcHJvcC1taXNzaW5nXVxuICAgICAgb2Zmc2V0UGFyZW50W3dpZHRoUHJvcF07XG4gICAgICB4IC09IG9mZnNldFggLSBwb3BwZXJSZWN0LndpZHRoO1xuICAgICAgeCAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIHBvc2l0aW9uOiBwb3NpdGlvblxuICB9LCBhZGFwdGl2ZSAmJiB1bnNldFNpZGVzKTtcblxuICB2YXIgX3JlZjQgPSByb3VuZE9mZnNldHMgPT09IHRydWUgPyByb3VuZE9mZnNldHNCeURQUih7XG4gICAgeDogeCxcbiAgICB5OiB5XG4gIH0pIDoge1xuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xuXG4gIHggPSBfcmVmNC54O1xuICB5ID0gX3JlZjQueTtcblxuICBpZiAoZ3B1QWNjZWxlcmF0aW9uKSB7XG4gICAgdmFyIF9PYmplY3QkYXNzaWduO1xuXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywgKF9PYmplY3QkYXNzaWduID0ge30sIF9PYmplY3QkYXNzaWduW3NpZGVZXSA9IGhhc1kgPyAnMCcgOiAnJywgX09iamVjdCRhc3NpZ25bc2lkZVhdID0gaGFzWCA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbi50cmFuc2Zvcm0gPSAod2luLmRldmljZVBpeGVsUmF0aW8gfHwgMSkgPD0gMSA/IFwidHJhbnNsYXRlKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgpXCIgOiBcInRyYW5zbGF0ZTNkKFwiICsgeCArIFwicHgsIFwiICsgeSArIFwicHgsIDApXCIsIF9PYmplY3QkYXNzaWduKSk7XG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzLCAoX09iamVjdCRhc3NpZ24yID0ge30sIF9PYmplY3QkYXNzaWduMltzaWRlWV0gPSBoYXNZID8geSArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjJbc2lkZVhdID0gaGFzWCA/IHggKyBcInB4XCIgOiAnJywgX09iamVjdCRhc3NpZ24yLnRyYW5zZm9ybSA9ICcnLCBfT2JqZWN0JGFzc2lnbjIpKTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVN0eWxlcyhfcmVmNSkge1xuICB2YXIgc3RhdGUgPSBfcmVmNS5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmNS5vcHRpb25zO1xuICB2YXIgX29wdGlvbnMkZ3B1QWNjZWxlcmF0ID0gb3B0aW9ucy5ncHVBY2NlbGVyYXRpb24sXG4gICAgICBncHVBY2NlbGVyYXRpb24gPSBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRncHVBY2NlbGVyYXQsXG4gICAgICBfb3B0aW9ucyRhZGFwdGl2ZSA9IG9wdGlvbnMuYWRhcHRpdmUsXG4gICAgICBhZGFwdGl2ZSA9IF9vcHRpb25zJGFkYXB0aXZlID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkYWRhcHRpdmUsXG4gICAgICBfb3B0aW9ucyRyb3VuZE9mZnNldHMgPSBvcHRpb25zLnJvdW5kT2Zmc2V0cyxcbiAgICAgIHJvdW5kT2Zmc2V0cyA9IF9vcHRpb25zJHJvdW5kT2Zmc2V0cyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHJvdW5kT2Zmc2V0cztcblxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgdmFyIHRyYW5zaXRpb25Qcm9wZXJ0eSA9IGdldENvbXB1dGVkU3R5bGUoc3RhdGUuZWxlbWVudHMucG9wcGVyKS50cmFuc2l0aW9uUHJvcGVydHkgfHwgJyc7XG5cbiAgICBpZiAoYWRhcHRpdmUgJiYgWyd0cmFuc2Zvcm0nLCAndG9wJywgJ3JpZ2h0JywgJ2JvdHRvbScsICdsZWZ0J10uc29tZShmdW5jdGlvbiAocHJvcGVydHkpIHtcbiAgICAgIHJldHVybiB0cmFuc2l0aW9uUHJvcGVydHkuaW5kZXhPZihwcm9wZXJ0eSkgPj0gMDtcbiAgICB9KSkge1xuICAgICAgY29uc29sZS53YXJuKFsnUG9wcGVyOiBEZXRlY3RlZCBDU1MgdHJhbnNpdGlvbnMgb24gYXQgbGVhc3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcnLCAnQ1NTIHByb3BlcnRpZXM6IFwidHJhbnNmb3JtXCIsIFwidG9wXCIsIFwicmlnaHRcIiwgXCJib3R0b21cIiwgXCJsZWZ0XCIuJywgJ1xcblxcbicsICdEaXNhYmxlIHRoZSBcImNvbXB1dGVTdHlsZXNcIiBtb2RpZmllclxcJ3MgYGFkYXB0aXZlYCBvcHRpb24gdG8gYWxsb3cnLCAnZm9yIHNtb290aCB0cmFuc2l0aW9ucywgb3IgcmVtb3ZlIHRoZXNlIHByb3BlcnRpZXMgZnJvbSB0aGUgQ1NTJywgJ3RyYW5zaXRpb24gZGVjbGFyYXRpb24gb24gdGhlIHBvcHBlciBlbGVtZW50IGlmIG9ubHkgdHJhbnNpdGlvbmluZycsICdvcGFjaXR5IG9yIGJhY2tncm91bmQtY29sb3IgZm9yIGV4YW1wbGUuJywgJ1xcblxcbicsICdXZSByZWNvbW1lbmQgdXNpbmcgdGhlIHBvcHBlciBlbGVtZW50IGFzIGEgd3JhcHBlciBhcm91bmQgYW4gaW5uZXInLCAnZWxlbWVudCB0aGF0IGNhbiBoYXZlIGFueSBDU1MgcHJvcGVydHkgdHJhbnNpdGlvbmVkIGZvciBhbmltYXRpb25zLiddLmpvaW4oJyAnKSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGNvbW1vblN0eWxlcyA9IHtcbiAgICBwbGFjZW1lbnQ6IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KSxcbiAgICB2YXJpYXRpb246IGdldFZhcmlhdGlvbihzdGF0ZS5wbGFjZW1lbnQpLFxuICAgIHBvcHBlcjogc3RhdGUuZWxlbWVudHMucG9wcGVyLFxuICAgIHBvcHBlclJlY3Q6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBncHVBY2NlbGVyYXRpb246IGdwdUFjY2VsZXJhdGlvbixcbiAgICBpc0ZpeGVkOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnXG4gIH07XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5wb3BwZXIsIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcywge1xuICAgICAgb2Zmc2V0czogc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLFxuICAgICAgcG9zaXRpb246IHN0YXRlLm9wdGlvbnMuc3RyYXRlZ3ksXG4gICAgICBhZGFwdGl2ZTogYWRhcHRpdmUsXG4gICAgICByb3VuZE9mZnNldHM6IHJvdW5kT2Zmc2V0c1xuICAgIH0pKSk7XG4gIH1cblxuICBpZiAoc3RhdGUubW9kaWZpZXJzRGF0YS5hcnJvdyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLmFycm93ID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLmFycm93LCBtYXBUb1N0eWxlcyhPYmplY3QuYXNzaWduKHt9LCBjb21tb25TdHlsZXMsIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3csXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGFkYXB0aXZlOiBmYWxzZSxcbiAgICAgIHJvdW5kT2Zmc2V0czogcm91bmRPZmZzZXRzXG4gICAgfSkpKTtcbiAgfVxuXG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIsIHtcbiAgICAnZGF0YS1wb3BwZXItcGxhY2VtZW50Jzogc3RhdGUucGxhY2VtZW50XG4gIH0pO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnY29tcHV0ZVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnYmVmb3JlV3JpdGUnLFxuICBmbjogY29tcHV0ZVN0eWxlcyxcbiAgZGF0YToge31cbn07IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRXaW5kb3cuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG52YXIgcGFzc2l2ZSA9IHtcbiAgcGFzc2l2ZTogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRzY3JvbGwgPSBvcHRpb25zLnNjcm9sbCxcbiAgICAgIHNjcm9sbCA9IF9vcHRpb25zJHNjcm9sbCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHNjcm9sbCxcbiAgICAgIF9vcHRpb25zJHJlc2l6ZSA9IG9wdGlvbnMucmVzaXplLFxuICAgICAgcmVzaXplID0gX29wdGlvbnMkcmVzaXplID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcmVzaXplO1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KHN0YXRlLmVsZW1lbnRzLnBvcHBlcik7XG4gIHZhciBzY3JvbGxQYXJlbnRzID0gW10uY29uY2F0KHN0YXRlLnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLCBzdGF0ZS5zY3JvbGxQYXJlbnRzLnBvcHBlcik7XG5cbiAgaWYgKHNjcm9sbCkge1xuICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICBzY3JvbGxQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChyZXNpemUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNjcm9sbCkge1xuICAgICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgICAgc2Nyb2xsUGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmVzaXplKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdldmVudExpc3RlbmVycycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogZnVuY3Rpb24gZm4oKSB7fSxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIGRhdGE6IHt9XG59OyIsICJ2YXIgaGFzaCA9IHtcbiAgbGVmdDogJ3JpZ2h0JyxcbiAgcmlnaHQ6ICdsZWZ0JyxcbiAgYm90dG9tOiAndG9wJyxcbiAgdG9wOiAnYm90dG9tJ1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn0iLCAidmFyIGhhc2ggPSB7XG4gIHN0YXJ0OiAnZW5kJyxcbiAgZW5kOiAnc3RhcnQnXG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVWYXJpYXRpb25QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvc3RhcnR8ZW5kL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7XG4gICAgcmV0dXJuIGhhc2hbbWF0Y2hlZF07XG4gIH0pO1xufSIsICJpbXBvcnQgZ2V0V2luZG93IGZyb20gXCIuL2dldFdpbmRvdy5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsKG5vZGUpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhub2RlKTtcbiAgdmFyIHNjcm9sbExlZnQgPSB3aW4ucGFnZVhPZmZzZXQ7XG4gIHZhciBzY3JvbGxUb3AgPSB3aW4ucGFnZVlPZmZzZXQ7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IHNjcm9sbFRvcFxuICB9O1xufSIsICJpbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuL2dldEJvdW5kaW5nQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpIHtcbiAgLy8gSWYgPGh0bWw+IGhhcyBhIENTUyB3aWR0aCBncmVhdGVyIHRoYW4gdGhlIHZpZXdwb3J0LCB0aGVuIHRoaXMgd2lsbCBiZVxuICAvLyBpbmNvcnJlY3QgZm9yIFJUTC5cbiAgLy8gUG9wcGVyIDEgaXMgYnJva2VuIGluIHRoaXMgY2FzZSBhbmQgbmV2ZXIgaGFkIGEgYnVnIHJlcG9ydCBzbyBsZXQncyBhc3N1bWVcbiAgLy8gaXQncyBub3QgYW4gaXNzdWUuIEkgZG9uJ3QgdGhpbmsgYW55b25lIGV2ZXIgc3BlY2lmaWVzIHdpZHRoIG9uIDxodG1sPlxuICAvLyBhbnl3YXkuXG4gIC8vIEJyb3dzZXJzIHdoZXJlIHRoZSBsZWZ0IHNjcm9sbGJhciBkb2Vzbid0IGNhdXNlIGFuIGlzc3VlIHJlcG9ydCBgMGAgZm9yXG4gIC8vIHRoaXMgKGUuZy4gRWRnZSAyMDE5LCBJRTExLCBTYWZhcmkpXG4gIHJldHVybiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpKS5sZWZ0ICsgZ2V0V2luZG93U2Nyb2xsKGVsZW1lbnQpLnNjcm9sbExlZnQ7XG59IiwgImltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldFdpbmRvd1Njcm9sbEJhclggZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsQmFyWC5qc1wiO1xuaW1wb3J0IGlzTGF5b3V0Vmlld3BvcnQgZnJvbSBcIi4vaXNMYXlvdXRWaWV3cG9ydC5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coZWxlbWVudCk7XG4gIHZhciBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICB2YXIgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gIHZhciB3aWR0aCA9IGh0bWwuY2xpZW50V2lkdGg7XG4gIHZhciBoZWlnaHQgPSBodG1sLmNsaWVudEhlaWdodDtcbiAgdmFyIHggPSAwO1xuICB2YXIgeSA9IDA7XG5cbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7XG4gICAgdmFyIGxheW91dFZpZXdwb3J0ID0gaXNMYXlvdXRWaWV3cG9ydCgpO1xuXG4gICAgaWYgKGxheW91dFZpZXdwb3J0IHx8ICFsYXlvdXRWaWV3cG9ydCAmJiBzdHJhdGVneSA9PT0gJ2ZpeGVkJykge1xuICAgICAgeCA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQ7XG4gICAgICB5ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHg6IHggKyBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpLFxuICAgIHk6IHlcbiAgfTtcbn0iLCAiaW1wb3J0IGdldERvY3VtZW50RWxlbWVudCBmcm9tIFwiLi9nZXREb2N1bWVudEVsZW1lbnQuanNcIjtcbmltcG9ydCBnZXRDb21wdXRlZFN0eWxlIGZyb20gXCIuL2dldENvbXB1dGVkU3R5bGUuanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGxCYXJYIGZyb20gXCIuL2dldFdpbmRvd1Njcm9sbEJhclguanNcIjtcbmltcG9ydCBnZXRXaW5kb3dTY3JvbGwgZnJvbSBcIi4vZ2V0V2luZG93U2Nyb2xsLmpzXCI7XG5pbXBvcnQgeyBtYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiOyAvLyBHZXRzIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgc2Nyb2xsYWJsZSBkb2N1bWVudCBhcmVhLCBldmVuIGV4dGVuZGluZyBvdXRzaWRlXG4vLyBvZiB0aGUgYDxodG1sPmAgYW5kIGA8Ym9keT5gIHJlY3QgYm91bmRzIGlmIGhvcml6b250YWxseSBzY3JvbGxhYmxlXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERvY3VtZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciBfZWxlbWVudCRvd25lckRvY3VtZW47XG5cbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB3aW5TY3JvbGwgPSBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5O1xuICB2YXIgd2lkdGggPSBtYXgoaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgYm9keSA/IGJvZHkuc2Nyb2xsV2lkdGggOiAwLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApO1xuICB2YXIgaGVpZ2h0ID0gbWF4KGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgYm9keSA/IGJvZHkuc2Nyb2xsSGVpZ2h0IDogMCwgYm9keSA/IGJvZHkuY2xpZW50SGVpZ2h0IDogMCk7XG4gIHZhciB4ID0gLXdpblNjcm9sbC5zY3JvbGxMZWZ0ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KTtcbiAgdmFyIHkgPSAtd2luU2Nyb2xsLnNjcm9sbFRvcDtcblxuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShib2R5IHx8IGh0bWwpLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICB4ICs9IG1heChodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5jbGllbnRXaWR0aCA6IDApIC0gd2lkdGg7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4LFxuICAgIHk6IHlcbiAgfTtcbn0iLCAiaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAvLyBGaXJlZm94IHdhbnRzIHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gIHZhciBfZ2V0Q29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCksXG4gICAgICBvdmVyZmxvdyA9IF9nZXRDb21wdXRlZFN0eWxlLm92ZXJmbG93LFxuICAgICAgb3ZlcmZsb3dYID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dYLFxuICAgICAgb3ZlcmZsb3dZID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3dZO1xuXG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufSIsICJpbXBvcnQgZ2V0UGFyZW50Tm9kZSBmcm9tIFwiLi9nZXRQYXJlbnROb2RlLmpzXCI7XG5pbXBvcnQgaXNTY3JvbGxQYXJlbnQgZnJvbSBcIi4vaXNTY3JvbGxQYXJlbnQuanNcIjtcbmltcG9ydCBnZXROb2RlTmFtZSBmcm9tIFwiLi9nZXROb2RlTmFtZS5qc1wiO1xuaW1wb3J0IHsgaXNIVE1MRWxlbWVudCB9IGZyb20gXCIuL2luc3RhbmNlT2YuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldFNjcm9sbFBhcmVudChub2RlKSB7XG4gIGlmIChbJ2h0bWwnLCAnYm9keScsICcjZG9jdW1lbnQnXS5pbmRleE9mKGdldE5vZGVOYW1lKG5vZGUpKSA+PSAwKSB7XG4gICAgLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtcmV0dXJuXTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIGlmIChpc0hUTUxFbGVtZW50KG5vZGUpICYmIGlzU2Nyb2xsUGFyZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gZ2V0U2Nyb2xsUGFyZW50KGdldFBhcmVudE5vZGUobm9kZSkpO1xufSIsICJpbXBvcnQgZ2V0U2Nyb2xsUGFyZW50IGZyb20gXCIuL2dldFNjcm9sbFBhcmVudC5qc1wiO1xuaW1wb3J0IGdldFBhcmVudE5vZGUgZnJvbSBcIi4vZ2V0UGFyZW50Tm9kZS5qc1wiO1xuaW1wb3J0IGdldFdpbmRvdyBmcm9tIFwiLi9nZXRXaW5kb3cuanNcIjtcbmltcG9ydCBpc1Njcm9sbFBhcmVudCBmcm9tIFwiLi9pc1Njcm9sbFBhcmVudC5qc1wiO1xuLypcbmdpdmVuIGEgRE9NIGVsZW1lbnQsIHJldHVybiB0aGUgbGlzdCBvZiBhbGwgc2Nyb2xsIHBhcmVudHMsIHVwIHRoZSBsaXN0IG9mIGFuY2Vzb3JzXG51bnRpbCB3ZSBnZXQgdG8gdGhlIHRvcCB3aW5kb3cgb2JqZWN0LiBUaGlzIGxpc3QgaXMgd2hhdCB3ZSBhdHRhY2ggc2Nyb2xsIGxpc3RlbmVyc1xudG8sIGJlY2F1c2UgaWYgYW55IG9mIHRoZXNlIHBhcmVudCBlbGVtZW50cyBzY3JvbGwsIHdlJ2xsIG5lZWQgdG8gcmUtY2FsY3VsYXRlIHRoZVxucmVmZXJlbmNlIGVsZW1lbnQncyBwb3NpdGlvbi5cbiovXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxpc3RTY3JvbGxQYXJlbnRzKGVsZW1lbnQsIGxpc3QpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICBpZiAobGlzdCA9PT0gdm9pZCAwKSB7XG4gICAgbGlzdCA9IFtdO1xuICB9XG5cbiAgdmFyIHNjcm9sbFBhcmVudCA9IGdldFNjcm9sbFBhcmVudChlbGVtZW50KTtcbiAgdmFyIGlzQm9keSA9IHNjcm9sbFBhcmVudCA9PT0gKChfZWxlbWVudCRvd25lckRvY3VtZW4gPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZWxlbWVudCRvd25lckRvY3VtZW4uYm9keSk7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsUGFyZW50KTtcbiAgdmFyIHRhcmdldCA9IGlzQm9keSA/IFt3aW5dLmNvbmNhdCh3aW4udmlzdWFsVmlld3BvcnQgfHwgW10sIGlzU2Nyb2xsUGFyZW50KHNjcm9sbFBhcmVudCkgPyBzY3JvbGxQYXJlbnQgOiBbXSkgOiBzY3JvbGxQYXJlbnQ7XG4gIHZhciB1cGRhdGVkTGlzdCA9IGxpc3QuY29uY2F0KHRhcmdldCk7XG4gIHJldHVybiBpc0JvZHkgPyB1cGRhdGVkTGlzdCA6IC8vICRGbG93Rml4TWVbaW5jb21wYXRpYmxlLWNhbGxdOiBpc0JvZHkgdGVsbHMgdXMgdGFyZ2V0IHdpbGwgYmUgYW4gSFRNTEVsZW1lbnQgaGVyZVxuICB1cGRhdGVkTGlzdC5jb25jYXQobGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZSh0YXJnZXQpKSk7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlY3RUb0NsaWVudFJlY3QocmVjdCkge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgcmVjdCwge1xuICAgIGxlZnQ6IHJlY3QueCxcbiAgICB0b3A6IHJlY3QueSxcbiAgICByaWdodDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBib3R0b206IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH0pO1xufSIsICJpbXBvcnQgeyB2aWV3cG9ydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZpZXdwb3J0UmVjdCBmcm9tIFwiLi9nZXRWaWV3cG9ydFJlY3QuanNcIjtcbmltcG9ydCBnZXREb2N1bWVudFJlY3QgZnJvbSBcIi4vZ2V0RG9jdW1lbnRSZWN0LmpzXCI7XG5pbXBvcnQgbGlzdFNjcm9sbFBhcmVudHMgZnJvbSBcIi4vbGlzdFNjcm9sbFBhcmVudHMuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4vZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGdldENvbXB1dGVkU3R5bGUgZnJvbSBcIi4vZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50LCBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCBmcm9tIFwiLi9nZXRCb3VuZGluZ0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCBnZXRQYXJlbnROb2RlIGZyb20gXCIuL2dldFBhcmVudE5vZGUuanNcIjtcbmltcG9ydCBjb250YWlucyBmcm9tIFwiLi9jb250YWlucy5qc1wiO1xuaW1wb3J0IGdldE5vZGVOYW1lIGZyb20gXCIuL2dldE5vZGVOYW1lLmpzXCI7XG5pbXBvcnQgcmVjdFRvQ2xpZW50UmVjdCBmcm9tIFwiLi4vdXRpbHMvcmVjdFRvQ2xpZW50UmVjdC5qc1wiO1xuaW1wb3J0IHsgbWF4LCBtaW4gfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICB2YXIgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBmYWxzZSwgc3RyYXRlZ3kgPT09ICdmaXhlZCcpO1xuICByZWN0LnRvcCA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIHJlY3QubGVmdCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC53aWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3QuaGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QueCA9IHJlY3QubGVmdDtcbiAgcmVjdC55ID0gcmVjdC50b3A7XG4gIHJldHVybiByZWN0O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCwgc3RyYXRlZ3kpIHtcbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50ID09PSB2aWV3cG9ydCA/IHJlY3RUb0NsaWVudFJlY3QoZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSkgOiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpID8gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSA6IHJlY3RUb0NsaWVudFJlY3QoZ2V0RG9jdW1lbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkpO1xufSAvLyBBIFwiY2xpcHBpbmcgcGFyZW50XCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcblxuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkge1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gbGlzdFNjcm9sbFBhcmVudHMoZ2V0UGFyZW50Tm9kZShlbGVtZW50KSk7XG4gIHZhciBjYW5Fc2NhcGVDbGlwcGluZyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXS5pbmRleE9mKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24pID49IDA7XG4gIHZhciBjbGlwcGVyRWxlbWVudCA9IGNhbkVzY2FwZUNsaXBwaW5nICYmIGlzSFRNTEVsZW1lbnQoZWxlbWVudCkgPyBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkgOiBlbGVtZW50O1xuXG4gIGlmICghaXNFbGVtZW50KGNsaXBwZXJFbGVtZW50KSkge1xuICAgIHJldHVybiBbXTtcbiAgfSAvLyAkRmxvd0ZpeE1lW2luY29tcGF0aWJsZS1yZXR1cm5dOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svZmxvdy9pc3N1ZXMvMTQxNFxuXG5cbiAgcmV0dXJuIGNsaXBwaW5nUGFyZW50cy5maWx0ZXIoZnVuY3Rpb24gKGNsaXBwaW5nUGFyZW50KSB7XG4gICAgcmV0dXJuIGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkgJiYgY29udGFpbnMoY2xpcHBpbmdQYXJlbnQsIGNsaXBwZXJFbGVtZW50KSAmJiBnZXROb2RlTmFtZShjbGlwcGluZ1BhcmVudCkgIT09ICdib2R5JztcbiAgfSk7XG59IC8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIHBhcmVudHNcblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDbGlwcGluZ1JlY3QoZWxlbWVudCwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSwgc3RyYXRlZ3kpIHtcbiAgdmFyIG1haW5DbGlwcGluZ1BhcmVudHMgPSBib3VuZGFyeSA9PT0gJ2NsaXBwaW5nUGFyZW50cycgPyBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkgOiBbXS5jb25jYXQoYm91bmRhcnkpO1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gW10uY29uY2F0KG1haW5DbGlwcGluZ1BhcmVudHMsIFtyb290Qm91bmRhcnldKTtcbiAgdmFyIGZpcnN0Q2xpcHBpbmdQYXJlbnQgPSBjbGlwcGluZ1BhcmVudHNbMF07XG4gIHZhciBjbGlwcGluZ1JlY3QgPSBjbGlwcGluZ1BhcmVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2NSZWN0LCBjbGlwcGluZ1BhcmVudCkge1xuICAgIHZhciByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KTtcbiAgICBhY2NSZWN0LnRvcCA9IG1heChyZWN0LnRvcCwgYWNjUmVjdC50b3ApO1xuICAgIGFjY1JlY3QucmlnaHQgPSBtaW4ocmVjdC5yaWdodCwgYWNjUmVjdC5yaWdodCk7XG4gICAgYWNjUmVjdC5ib3R0b20gPSBtaW4ocmVjdC5ib3R0b20sIGFjY1JlY3QuYm90dG9tKTtcbiAgICBhY2NSZWN0LmxlZnQgPSBtYXgocmVjdC5sZWZ0LCBhY2NSZWN0LmxlZnQpO1xuICAgIHJldHVybiBhY2NSZWN0O1xuICB9LCBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBmaXJzdENsaXBwaW5nUGFyZW50LCBzdHJhdGVneSkpO1xuICBjbGlwcGluZ1JlY3Qud2lkdGggPSBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LmhlaWdodCA9IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wO1xuICBjbGlwcGluZ1JlY3QueCA9IGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QueSA9IGNsaXBwaW5nUmVjdC50b3A7XG4gIHJldHVybiBjbGlwcGluZ1JlY3Q7XG59IiwgImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50IGZyb20gXCIuL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0LCBzdGFydCwgZW5kIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wdXRlT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciByZWZlcmVuY2UgPSBfcmVmLnJlZmVyZW5jZSxcbiAgICAgIGVsZW1lbnQgPSBfcmVmLmVsZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfcmVmLnBsYWNlbWVudDtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBwbGFjZW1lbnQgPyBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgdmFyaWF0aW9uID0gcGxhY2VtZW50ID8gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgOiBudWxsO1xuICB2YXIgY29tbW9uWCA9IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoIC8gMiAtIGVsZW1lbnQud2lkdGggLyAyO1xuICB2YXIgY29tbW9uWSA9IHJlZmVyZW5jZS55ICsgcmVmZXJlbmNlLmhlaWdodCAvIDIgLSBlbGVtZW50LmhlaWdodCAvIDI7XG4gIHZhciBvZmZzZXRzO1xuXG4gIHN3aXRjaCAoYmFzZVBsYWNlbWVudCkge1xuICAgIGNhc2UgdG9wOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgLSBlbGVtZW50LmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBib3R0b206XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgcmlnaHQ6XG4gICAgICBvZmZzZXRzID0ge1xuICAgICAgICB4OiByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBsZWZ0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBlbGVtZW50LndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG5cbiAgdmFyIG1haW5BeGlzID0gYmFzZVBsYWNlbWVudCA/IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KSA6IG51bGw7XG5cbiAgaWYgKG1haW5BeGlzICE9IG51bGwpIHtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcblxuICAgIHN3aXRjaCAodmFyaWF0aW9uKSB7XG4gICAgICBjYXNlIHN0YXJ0OlxuICAgICAgICBvZmZzZXRzW21haW5BeGlzXSA9IG9mZnNldHNbbWFpbkF4aXNdIC0gKHJlZmVyZW5jZVtsZW5dIC8gMiAtIGVsZW1lbnRbbGVuXSAvIDIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBlbmQ6XG4gICAgICAgIG9mZnNldHNbbWFpbkF4aXNdID0gb2Zmc2V0c1ttYWluQXhpc10gKyAocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvZmZzZXRzO1xufSIsICJpbXBvcnQgZ2V0Q2xpcHBpbmdSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Q2xpcHBpbmdSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0RG9jdW1lbnRFbGVtZW50LmpzXCI7XG5pbXBvcnQgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZyb20gXCIuLi9kb20tdXRpbHMvZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgY29tcHV0ZU9mZnNldHMgZnJvbSBcIi4vY29tcHV0ZU9mZnNldHMuanNcIjtcbmltcG9ydCByZWN0VG9DbGllbnRSZWN0IGZyb20gXCIuL3JlY3RUb0NsaWVudFJlY3QuanNcIjtcbmltcG9ydCB7IGNsaXBwaW5nUGFyZW50cywgcmVmZXJlbmNlLCBwb3BwZXIsIGJvdHRvbSwgdG9wLCByaWdodCwgYmFzZVBsYWNlbWVudHMsIHZpZXdwb3J0IH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tIFwiLi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCBtZXJnZVBhZGRpbmdPYmplY3QgZnJvbSBcIi4vbWVyZ2VQYWRkaW5nT2JqZWN0LmpzXCI7XG5pbXBvcnQgZXhwYW5kVG9IYXNoTWFwIGZyb20gXCIuL2V4cGFuZFRvSGFzaE1hcC5qc1wiOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRldGVjdE92ZXJmbG93KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgX29wdGlvbnMkcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMkcGxhY2VtZW50ID09PSB2b2lkIDAgPyBzdGF0ZS5wbGFjZW1lbnQgOiBfb3B0aW9ucyRwbGFjZW1lbnQsXG4gICAgICBfb3B0aW9ucyRzdHJhdGVneSA9IF9vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgc3RyYXRlZ3kgPSBfb3B0aW9ucyRzdHJhdGVneSA9PT0gdm9pZCAwID8gc3RhdGUuc3RyYXRlZ3kgOiBfb3B0aW9ucyRzdHJhdGVneSxcbiAgICAgIF9vcHRpb25zJGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zJGJvdW5kYXJ5ID09PSB2b2lkIDAgPyBjbGlwcGluZ1BhcmVudHMgOiBfb3B0aW9ucyRib3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9PT0gdm9pZCAwID8gdmlld3BvcnQgOiBfb3B0aW9ucyRyb290Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRlbGVtZW50Q29udGUgPSBfb3B0aW9ucy5lbGVtZW50Q29udGV4dCxcbiAgICAgIGVsZW1lbnRDb250ZXh0ID0gX29wdGlvbnMkZWxlbWVudENvbnRlID09PSB2b2lkIDAgPyBwb3BwZXIgOiBfb3B0aW9ucyRlbGVtZW50Q29udGUsXG4gICAgICBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9IF9vcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zJHBhZGRpbmcgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRwYWRkaW5nO1xuICB2YXIgcGFkZGluZ09iamVjdCA9IG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG4gIHZhciBhbHRDb250ZXh0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHJlZmVyZW5jZSA6IHBvcHBlcjtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBlbGVtZW50ID0gc3RhdGUuZWxlbWVudHNbYWx0Qm91bmRhcnkgPyBhbHRDb250ZXh0IDogZWxlbWVudENvbnRleHRdO1xuICB2YXIgY2xpcHBpbmdDbGllbnRSZWN0ID0gZ2V0Q2xpcHBpbmdSZWN0KGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQgOiBlbGVtZW50LmNvbnRleHRFbGVtZW50IHx8IGdldERvY3VtZW50RWxlbWVudChzdGF0ZS5lbGVtZW50cy5wb3BwZXIpLCBib3VuZGFyeSwgcm9vdEJvdW5kYXJ5LCBzdHJhdGVneSk7XG4gIHZhciByZWZlcmVuY2VDbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHN0YXRlLmVsZW1lbnRzLnJlZmVyZW5jZSk7XG4gIHZhciBwb3BwZXJPZmZzZXRzID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlQ2xpZW50UmVjdCxcbiAgICBlbGVtZW50OiBwb3BwZXJSZWN0LFxuICAgIHN0cmF0ZWd5OiAnYWJzb2x1dGUnLFxuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pO1xuICB2YXIgcG9wcGVyQ2xpZW50UmVjdCA9IHJlY3RUb0NsaWVudFJlY3QoT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyUmVjdCwgcG9wcGVyT2Zmc2V0cykpO1xuICB2YXIgZWxlbWVudENsaWVudFJlY3QgPSBlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyID8gcG9wcGVyQ2xpZW50UmVjdCA6IHJlZmVyZW5jZUNsaWVudFJlY3Q7IC8vIHBvc2l0aXZlID0gb3ZlcmZsb3dpbmcgdGhlIGNsaXBwaW5nIHJlY3RcbiAgLy8gMCBvciBuZWdhdGl2ZSA9IHdpdGhpbiB0aGUgY2xpcHBpbmcgcmVjdFxuXG4gIHZhciBvdmVyZmxvd09mZnNldHMgPSB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOiBlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OiBlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHRcbiAgfTtcbiAgdmFyIG9mZnNldERhdGEgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDsgLy8gT2Zmc2V0cyBjYW4gYmUgYXBwbGllZCBvbmx5IHRvIHRoZSBwb3BwZXIgZWxlbWVudFxuXG4gIGlmIChlbGVtZW50Q29udGV4dCA9PT0gcG9wcGVyICYmIG9mZnNldERhdGEpIHtcbiAgICB2YXIgb2Zmc2V0ID0gb2Zmc2V0RGF0YVtwbGFjZW1lbnRdO1xuICAgIE9iamVjdC5rZXlzKG92ZXJmbG93T2Zmc2V0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgbXVsdGlwbHkgPSBbcmlnaHQsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAxIDogLTE7XG4gICAgICB2YXIgYXhpcyA9IFt0b3AsIGJvdHRvbV0uaW5kZXhPZihrZXkpID49IDAgPyAneScgOiAneCc7XG4gICAgICBvdmVyZmxvd09mZnNldHNba2V5XSArPSBvZmZzZXRbYXhpc10gKiBtdWx0aXBseTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBvdmVyZmxvd09mZnNldHM7XG59IiwgImltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4vZ2V0VmFyaWF0aW9uLmpzXCI7XG5pbXBvcnQgeyB2YXJpYXRpb25QbGFjZW1lbnRzLCBiYXNlUGxhY2VtZW50cywgcGxhY2VtZW50cyBhcyBhbGxQbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7XG5pbXBvcnQgZGV0ZWN0T3ZlcmZsb3cgZnJvbSBcIi4vZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGNvbXB1dGVBdXRvUGxhY2VtZW50KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9IF9vcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyA9IF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9PT0gdm9pZCAwID8gYWxsUGxhY2VtZW50cyA6IF9vcHRpb25zJGFsbG93ZWRBdXRvUDtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpO1xuICB2YXIgcGxhY2VtZW50cyA9IHZhcmlhdGlvbiA/IGZsaXBWYXJpYXRpb25zID8gdmFyaWF0aW9uUGxhY2VtZW50cyA6IHZhcmlhdGlvblBsYWNlbWVudHMuZmlsdGVyKGZ1bmN0aW9uIChwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHZhcmlhdGlvbjtcbiAgfSkgOiBiYXNlUGxhY2VtZW50cztcbiAgdmFyIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBhbGxvd2VkQXV0b1BsYWNlbWVudHMuaW5kZXhPZihwbGFjZW1lbnQpID49IDA7XG4gIH0pO1xuXG4gIGlmIChhbGxvd2VkUGxhY2VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBhbGxvd2VkUGxhY2VtZW50cyA9IHBsYWNlbWVudHM7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnUG9wcGVyOiBUaGUgYGFsbG93ZWRBdXRvUGxhY2VtZW50c2Agb3B0aW9uIGRpZCBub3QgYWxsb3cgYW55JywgJ3BsYWNlbWVudHMuIEVuc3VyZSB0aGUgYHBsYWNlbWVudGAgb3B0aW9uIG1hdGNoZXMgdGhlIHZhcmlhdGlvbicsICdvZiB0aGUgYWxsb3dlZCBwbGFjZW1lbnRzLicsICdGb3IgZXhhbXBsZSwgXCJhdXRvXCIgY2Fubm90IGJlIHVzZWQgdG8gYWxsb3cgXCJib3R0b20tc3RhcnRcIi4nLCAnVXNlIFwiYXV0by1zdGFydFwiIGluc3RlYWQuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH0gLy8gJEZsb3dGaXhNZVtpbmNvbXBhdGlibGUtdHlwZV06IEZsb3cgc2VlbXMgdG8gaGF2ZSBwcm9ibGVtcyB3aXRoIHR3byBhcnJheSB1bmlvbnMuLi5cblxuXG4gIHZhciBvdmVyZmxvd3MgPSBhbGxvd2VkUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gICAgYWNjW3BsYWNlbWVudF0gPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmdcbiAgICB9KVtnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCldO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG92ZXJmbG93cykuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBvdmVyZmxvd3NbYV0gLSBvdmVyZmxvd3NbYl07XG4gIH0pO1xufSIsICJpbXBvcnQgZ2V0T3Bwb3NpdGVQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE9wcG9zaXRlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi4vdXRpbHMvZ2V0QmFzZVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IGNvbXB1dGVBdXRvUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9jb21wdXRlQXV0b1BsYWNlbWVudC5qc1wiO1xuaW1wb3J0IHsgYm90dG9tLCB0b3AsIHN0YXJ0LCByaWdodCwgbGVmdCwgYXV0byB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldFZhcmlhdGlvbiBmcm9tIFwiLi4vdXRpbHMvZ2V0VmFyaWF0aW9uLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGlmIChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuXG5mdW5jdGlvbiBmbGlwKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzID0gb3B0aW9ucy5mYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPSBvcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRmbGlwVmFyaWF0aW8sXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBvcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cztcbiAgdmFyIHByZWZlcnJlZFBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcbiAgdmFyIGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwVmFyaWF0aW9ucyA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHByZWZlcnJlZFBsYWNlbWVudCkpO1xuICB2YXIgcGxhY2VtZW50cyA9IFtwcmVmZXJyZWRQbGFjZW1lbnRdLmNvbmNhdChmYWxsYmFja1BsYWNlbWVudHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8gPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9uczogZmxpcFZhcmlhdGlvbnMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IGFsbG93ZWRBdXRvUGxhY2VtZW50c1xuICAgIH0pIDogcGxhY2VtZW50KTtcbiAgfSwgW10pO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBjaGVja3NNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBtYWtlRmFsbGJhY2tDaGVja3MgPSB0cnVlO1xuICB2YXIgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50c1swXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcGxhY2VtZW50c1tpXTtcblxuICAgIHZhciBfYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIHZhciBpc1ZlcnRpY2FsID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKF9iYXNlUGxhY2VtZW50KSA+PSAwO1xuICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pO1xuICAgIHZhciBtYWluVmFyaWF0aW9uU2lkZSA9IGlzVmVydGljYWwgPyBpc1N0YXJ0VmFyaWF0aW9uID8gcmlnaHQgOiBsZWZ0IDogaXNTdGFydFZhcmlhdGlvbiA/IGJvdHRvbSA6IHRvcDtcblxuICAgIGlmIChyZWZlcmVuY2VSZWN0W2xlbl0gPiBwb3BwZXJSZWN0W2xlbl0pIHtcbiAgICAgIG1haW5WYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIH1cblxuICAgIHZhciBhbHRWYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIHZhciBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tfYmFzZVBsYWNlbWVudF0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICByZXR1cm4gY2hlY2s7XG4gICAgfSkpIHtcbiAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgIG1ha2VGYWxsYmFja0NoZWNrcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hlY2tzTWFwLnNldChwbGFjZW1lbnQsIGNoZWNrcyk7XG4gIH1cblxuICBpZiAobWFrZUZhbGxiYWNrQ2hlY2tzKSB7XG4gICAgLy8gYDJgIG1heSBiZSBkZXNpcmVkIGluIHNvbWUgY2FzZXMgXHUyMDEzIHJlc2VhcmNoIGxhdGVyXG4gICAgdmFyIG51bWJlck9mQ2hlY2tzID0gZmxpcFZhcmlhdGlvbnMgPyAzIDogMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9pKSB7XG4gICAgICB2YXIgZml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHMuZmluZChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGNoZWNrcykge1xuICAgICAgICAgIHJldHVybiBjaGVja3Muc2xpY2UoMCwgX2kpLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgX2kgPSBudW1iZXJPZkNoZWNrczsgX2kgPiAwOyBfaS0tKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKF9pKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnZmxpcCcsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIGZuOiBmbGlwLFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddLFxuICBkYXRhOiB7XG4gICAgX3NraXA6IGZhbHNlXG4gIH1cbn07IiwgImltcG9ydCB7IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGRldGVjdE92ZXJmbG93IGZyb20gXCIuLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuXG5mdW5jdGlvbiBnZXRTaWRlT2Zmc2V0cyhvdmVyZmxvdywgcmVjdCwgcHJldmVudGVkT2Zmc2V0cykge1xuICBpZiAocHJldmVudGVkT2Zmc2V0cyA9PT0gdm9pZCAwKSB7XG4gICAgcHJldmVudGVkT2Zmc2V0cyA9IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdG9wOiBvdmVyZmxvdy50b3AgLSByZWN0LmhlaWdodCAtIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICByaWdodDogb3ZlcmZsb3cucmlnaHQgLSByZWN0LndpZHRoICsgcHJldmVudGVkT2Zmc2V0cy54LFxuICAgIGJvdHRvbTogb3ZlcmZsb3cuYm90dG9tIC0gcmVjdC5oZWlnaHQgKyBwcmV2ZW50ZWRPZmZzZXRzLnksXG4gICAgbGVmdDogb3ZlcmZsb3cubGVmdCAtIHJlY3Qud2lkdGggLSBwcmV2ZW50ZWRPZmZzZXRzLnhcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG92ZXJmbG93KSB7XG4gIHJldHVybiBbdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XS5zb21lKGZ1bmN0aW9uIChzaWRlKSB7XG4gICAgcmV0dXJuIG92ZXJmbG93W3NpZGVdID49IDA7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBoaWRlKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHByZXZlbnRlZE9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnByZXZlbnRPdmVyZmxvdztcbiAgdmFyIHJlZmVyZW5jZU92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgfSk7XG4gIHZhciBwb3BwZXJBbHRPdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgfSk7XG4gIHZhciByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhyZWZlcmVuY2VPdmVyZmxvdywgcmVmZXJlbmNlUmVjdCk7XG4gIHZhciBwb3BwZXJFc2NhcGVPZmZzZXRzID0gZ2V0U2lkZU9mZnNldHMocG9wcGVyQWx0T3ZlcmZsb3csIHBvcHBlclJlY3QsIHByZXZlbnRlZE9mZnNldHMpO1xuICB2YXIgaXNSZWZlcmVuY2VIaWRkZW4gPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzKTtcbiAgdmFyIGhhc1BvcHBlckVzY2FwZWQgPSBpc0FueVNpZGVGdWxseUNsaXBwZWQocG9wcGVyRXNjYXBlT2Zmc2V0cyk7XG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSB7XG4gICAgcmVmZXJlbmNlQ2xpcHBpbmdPZmZzZXRzOiByZWZlcmVuY2VDbGlwcGluZ09mZnNldHMsXG4gICAgcG9wcGVyRXNjYXBlT2Zmc2V0czogcG9wcGVyRXNjYXBlT2Zmc2V0cyxcbiAgICBpc1JlZmVyZW5jZUhpZGRlbjogaXNSZWZlcmVuY2VIaWRkZW4sXG4gICAgaGFzUG9wcGVyRXNjYXBlZDogaGFzUG9wcGVyRXNjYXBlZFxuICB9O1xuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyLCB7XG4gICAgJ2RhdGEtcG9wcGVyLXJlZmVyZW5jZS1oaWRkZW4nOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICAnZGF0YS1wb3BwZXItZXNjYXBlZCc6IGhhc1BvcHBlckVzY2FwZWRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdoaWRlJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydwcmV2ZW50T3ZlcmZsb3cnXSxcbiAgZm46IGhpZGVcbn07IiwgImltcG9ydCBnZXRCYXNlUGxhY2VtZW50IGZyb20gXCIuLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgeyB0b3AsIGxlZnQsIHJpZ2h0LCBwbGFjZW1lbnRzIH0gZnJvbSBcIi4uL2VudW1zLmpzXCI7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IGZ1bmN0aW9uIGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgcmVjdHMsIG9mZnNldCkge1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgdmFyIGludmVydERpc3RhbmNlID0gW2xlZnQsIHRvcF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8gLTEgOiAxO1xuXG4gIHZhciBfcmVmID0gdHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IG9mZnNldChPYmplY3QuYXNzaWduKHt9LCByZWN0cywge1xuICAgIHBsYWNlbWVudDogcGxhY2VtZW50XG4gIH0pKSA6IG9mZnNldCxcbiAgICAgIHNraWRkaW5nID0gX3JlZlswXSxcbiAgICAgIGRpc3RhbmNlID0gX3JlZlsxXTtcblxuICBza2lkZGluZyA9IHNraWRkaW5nIHx8IDA7XG4gIGRpc3RhbmNlID0gKGRpc3RhbmNlIHx8IDApICogaW52ZXJ0RGlzdGFuY2U7XG4gIHJldHVybiBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMCA/IHtcbiAgICB4OiBkaXN0YW5jZSxcbiAgICB5OiBza2lkZGluZ1xuICB9IDoge1xuICAgIHg6IHNraWRkaW5nLFxuICAgIHk6IGRpc3RhbmNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIG9mZnNldChfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYyLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRvZmZzZXQgPSBvcHRpb25zLm9mZnNldCxcbiAgICAgIG9mZnNldCA9IF9vcHRpb25zJG9mZnNldCA9PT0gdm9pZCAwID8gWzAsIDBdIDogX29wdGlvbnMkb2Zmc2V0O1xuICB2YXIgZGF0YSA9IHBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGlzdGFuY2VBbmRTa2lkZGluZ1RvWFkocGxhY2VtZW50LCBzdGF0ZS5yZWN0cywgb2Zmc2V0KTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHZhciBfZGF0YSRzdGF0ZSRwbGFjZW1lbnQgPSBkYXRhW3N0YXRlLnBsYWNlbWVudF0sXG4gICAgICB4ID0gX2RhdGEkc3RhdGUkcGxhY2VtZW50LngsXG4gICAgICB5ID0gX2RhdGEkc3RhdGUkcGxhY2VtZW50Lnk7XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyAhPSBudWxsKSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnggKz0geDtcbiAgICBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMueSArPSB5O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdvZmZzZXQnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIGZuOiBvZmZzZXRcbn07IiwgImltcG9ydCBjb21wdXRlT2Zmc2V0cyBmcm9tIFwiLi4vdXRpbHMvY29tcHV0ZU9mZnNldHMuanNcIjtcblxuZnVuY3Rpb24gcG9wcGVyT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuICAvLyBPZmZzZXRzIGFyZSB0aGUgYWN0dWFsIHBvc2l0aW9uIHRoZSBwb3BwZXIgbmVlZHMgdG8gaGF2ZSB0byBiZVxuICAvLyBwcm9wZXJseSBwb3NpdGlvbmVkIG5lYXIgaXRzIHJlZmVyZW5jZSBlbGVtZW50XG4gIC8vIFRoaXMgaXMgdGhlIG1vc3QgYmFzaWMgcGxhY2VtZW50LCBhbmQgd2lsbCBiZSBhZGp1c3RlZCBieVxuICAvLyB0aGUgbW9kaWZpZXJzIGluIHRoZSBuZXh0IHN0ZXBcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHN0YXRlLnJlY3RzLnJlZmVyZW5jZSxcbiAgICBlbGVtZW50OiBzdGF0ZS5yZWN0cy5wb3BwZXIsXG4gICAgc3RyYXRlZ3k6ICdhYnNvbHV0ZScsXG4gICAgcGxhY2VtZW50OiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwb3BwZXJPZmZzZXRzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdyZWFkJyxcbiAgZm46IHBvcHBlck9mZnNldHMsXG4gIGRhdGE6IHt9XG59OyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jztcbn0iLCAiaW1wb3J0IHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tLCBzdGFydCB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xuaW1wb3J0IGdldEJhc2VQbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldEJhc2VQbGFjZW1lbnQuanNcIjtcbmltcG9ydCBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQgZnJvbSBcIi4uL3V0aWxzL2dldE1haW5BeGlzRnJvbVBsYWNlbWVudC5qc1wiO1xuaW1wb3J0IGdldEFsdEF4aXMgZnJvbSBcIi4uL3V0aWxzL2dldEFsdEF4aXMuanNcIjtcbmltcG9ydCB7IHdpdGhpbiwgd2l0aGluTWF4Q2xhbXAgfSBmcm9tIFwiLi4vdXRpbHMvd2l0aGluLmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi4vZG9tLXV0aWxzL2dldExheW91dFJlY3QuanNcIjtcbmltcG9ydCBnZXRPZmZzZXRQYXJlbnQgZnJvbSBcIi4uL2RvbS11dGlscy9nZXRPZmZzZXRQYXJlbnQuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi4vdXRpbHMvZGV0ZWN0T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBnZXRWYXJpYXRpb24gZnJvbSBcIi4uL3V0aWxzL2dldFZhcmlhdGlvbi5qc1wiO1xuaW1wb3J0IGdldEZyZXNoU2lkZU9iamVjdCBmcm9tIFwiLi4vdXRpbHMvZ2V0RnJlc2hTaWRlT2JqZWN0LmpzXCI7XG5pbXBvcnQgeyBtaW4gYXMgbWF0aE1pbiwgbWF4IGFzIG1hdGhNYXggfSBmcm9tIFwiLi4vdXRpbHMvbWF0aC5qc1wiO1xuXG5mdW5jdGlvbiBwcmV2ZW50T3ZlcmZsb3coX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRtYWluQXhpcyA9IG9wdGlvbnMubWFpbkF4aXMsXG4gICAgICBjaGVja01haW5BeGlzID0gX29wdGlvbnMkbWFpbkF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRtYWluQXhpcyxcbiAgICAgIF9vcHRpb25zJGFsdEF4aXMgPSBvcHRpb25zLmFsdEF4aXMsXG4gICAgICBjaGVja0FsdEF4aXMgPSBfb3B0aW9ucyRhbHRBeGlzID09PSB2b2lkIDAgPyBmYWxzZSA6IF9vcHRpb25zJGFsdEF4aXMsXG4gICAgICBib3VuZGFyeSA9IG9wdGlvbnMuYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnkgPSBvcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIGFsdEJvdW5kYXJ5ID0gb3B0aW9ucy5hbHRCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBfb3B0aW9ucyR0ZXRoZXIgPSBvcHRpb25zLnRldGhlcixcbiAgICAgIHRldGhlciA9IF9vcHRpb25zJHRldGhlciA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHRldGhlcixcbiAgICAgIF9vcHRpb25zJHRldGhlck9mZnNldCA9IG9wdGlvbnMudGV0aGVyT2Zmc2V0LFxuICAgICAgdGV0aGVyT2Zmc2V0ID0gX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID09PSB2b2lkIDAgPyAwIDogX29wdGlvbnMkdGV0aGVyT2Zmc2V0O1xuICB2YXIgb3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICBwYWRkaW5nOiBwYWRkaW5nLFxuICAgIGFsdEJvdW5kYXJ5OiBhbHRCb3VuZGFyeVxuICB9KTtcbiAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCk7XG4gIHZhciB2YXJpYXRpb24gPSBnZXRWYXJpYXRpb24oc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9ICF2YXJpYXRpb247XG4gIHZhciBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGFsdEF4aXMgPSBnZXRBbHRBeGlzKG1haW5BeGlzKTtcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciByZWZlcmVuY2VSZWN0ID0gc3RhdGUucmVjdHMucmVmZXJlbmNlO1xuICB2YXIgcG9wcGVyUmVjdCA9IHN0YXRlLnJlY3RzLnBvcHBlcjtcbiAgdmFyIHRldGhlck9mZnNldFZhbHVlID0gdHlwZW9mIHRldGhlck9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IHRldGhlck9mZnNldChPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5yZWN0cywge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHRldGhlck9mZnNldDtcbiAgdmFyIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZSA9IHR5cGVvZiB0ZXRoZXJPZmZzZXRWYWx1ZSA9PT0gJ251bWJlcicgPyB7XG4gICAgbWFpbkF4aXM6IHRldGhlck9mZnNldFZhbHVlLFxuICAgIGFsdEF4aXM6IHRldGhlck9mZnNldFZhbHVlXG4gIH0gOiBPYmplY3QuYXNzaWduKHtcbiAgICBtYWluQXhpczogMCxcbiAgICBhbHRBeGlzOiAwXG4gIH0sIHRldGhlck9mZnNldFZhbHVlKTtcbiAgdmFyIG9mZnNldE1vZGlmaWVyU3RhdGUgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldCA/IHN0YXRlLm1vZGlmaWVyc0RhdGEub2Zmc2V0W3N0YXRlLnBsYWNlbWVudF0gOiBudWxsO1xuICB2YXIgZGF0YSA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQ7XG5cbiAgICB2YXIgbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgICB2YXIgYWx0U2lkZSA9IG1haW5BeGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICB2YXIgb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1ttYWluQXhpc107XG4gICAgdmFyIG1pbiA9IG9mZnNldCArIG92ZXJmbG93W21haW5TaWRlXTtcbiAgICB2YXIgbWF4ID0gb2Zmc2V0IC0gb3ZlcmZsb3dbYWx0U2lkZV07XG4gICAgdmFyIGFkZGl0aXZlID0gdGV0aGVyID8gLXBvcHBlclJlY3RbbGVuXSAvIDIgOiAwO1xuICAgIHZhciBtaW5MZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gcmVmZXJlbmNlUmVjdFtsZW5dIDogcG9wcGVyUmVjdFtsZW5dO1xuICAgIHZhciBtYXhMZW4gPSB2YXJpYXRpb24gPT09IHN0YXJ0ID8gLXBvcHBlclJlY3RbbGVuXSA6IC1yZWZlcmVuY2VSZWN0W2xlbl07IC8vIFdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgYXJyb3cgaW4gdGhlIGNhbGN1bGF0aW9uIHNvIHRoZSBhcnJvdyBkb2Vzbid0IGdvXG4gICAgLy8gb3V0c2lkZSB0aGUgcmVmZXJlbmNlIGJvdW5kc1xuXG4gICAgdmFyIGFycm93RWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzLmFycm93O1xuICAgIHZhciBhcnJvd1JlY3QgPSB0ZXRoZXIgJiYgYXJyb3dFbGVtZW50ID8gZ2V0TGF5b3V0UmVjdChhcnJvd0VsZW1lbnQpIDoge1xuICAgICAgd2lkdGg6IDAsXG4gICAgICBoZWlnaHQ6IDBcbiAgICB9O1xuICAgIHZhciBhcnJvd1BhZGRpbmdPYmplY3QgPSBzdGF0ZS5tb2RpZmllcnNEYXRhWydhcnJvdyNwZXJzaXN0ZW50J10gPyBzdGF0ZS5tb2RpZmllcnNEYXRhWydhcnJvdyNwZXJzaXN0ZW50J10ucGFkZGluZyA6IGdldEZyZXNoU2lkZU9iamVjdCgpO1xuICAgIHZhciBhcnJvd1BhZGRpbmdNaW4gPSBhcnJvd1BhZGRpbmdPYmplY3RbbWFpblNpZGVdO1xuICAgIHZhciBhcnJvd1BhZGRpbmdNYXggPSBhcnJvd1BhZGRpbmdPYmplY3RbYWx0U2lkZV07IC8vIElmIHRoZSByZWZlcmVuY2UgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbiB0aGUgYXJyb3cgbGVuZ3RoLCB3ZSBkb24ndCB3YW50XG4gICAgLy8gdG8gaW5jbHVkZSBpdHMgZnVsbCBzaXplIGluIHRoZSBjYWxjdWxhdGlvbi4gSWYgdGhlIHJlZmVyZW5jZSBpcyBzbWFsbFxuICAgIC8vIGFuZCBuZWFyIHRoZSBlZGdlIG9mIGEgYm91bmRhcnksIHRoZSBwb3BwZXIgY2FuIG92ZXJmbG93IGV2ZW4gaWYgdGhlXG4gICAgLy8gcmVmZXJlbmNlIGlzIG5vdCBvdmVyZmxvd2luZyBhcyB3ZWxsIChlLmcuIHZpcnR1YWwgZWxlbWVudHMgd2l0aCBub1xuICAgIC8vIHdpZHRoIG9yIGhlaWdodClcblxuICAgIHZhciBhcnJvd0xlbiA9IHdpdGhpbigwLCByZWZlcmVuY2VSZWN0W2xlbl0sIGFycm93UmVjdFtsZW5dKTtcbiAgICB2YXIgbWluT2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiAtIGFkZGl0aXZlIC0gYXJyb3dMZW4gLSBhcnJvd1BhZGRpbmdNaW4gLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXMgOiBtaW5MZW4gLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIG5vcm1hbGl6ZWRUZXRoZXJPZmZzZXRWYWx1ZS5tYWluQXhpcztcbiAgICB2YXIgbWF4T2Zmc2V0ID0gaXNCYXNlUGxhY2VtZW50ID8gLXJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgKyBhZGRpdGl2ZSArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgbm9ybWFsaXplZFRldGhlck9mZnNldFZhbHVlLm1haW5BeGlzIDogbWF4TGVuICsgYXJyb3dMZW4gKyBhcnJvd1BhZGRpbmdNYXggKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUubWFpbkF4aXM7XG4gICAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3cgJiYgZ2V0T2Zmc2V0UGFyZW50KHN0YXRlLmVsZW1lbnRzLmFycm93KTtcbiAgICB2YXIgY2xpZW50T2Zmc2V0ID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBtYWluQXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50VG9wIHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRMZWZ0IHx8IDAgOiAwO1xuICAgIHZhciBvZmZzZXRNb2RpZmllclZhbHVlID0gKF9vZmZzZXRNb2RpZmllclN0YXRlJCA9IG9mZnNldE1vZGlmaWVyU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IG9mZnNldE1vZGlmaWVyU3RhdGVbbWFpbkF4aXNdKSAhPSBudWxsID8gX29mZnNldE1vZGlmaWVyU3RhdGUkIDogMDtcbiAgICB2YXIgdGV0aGVyTWluID0gb2Zmc2V0ICsgbWluT2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZSAtIGNsaWVudE9mZnNldDtcbiAgICB2YXIgdGV0aGVyTWF4ID0gb2Zmc2V0ICsgbWF4T2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZTtcbiAgICB2YXIgcHJldmVudGVkT2Zmc2V0ID0gd2l0aGluKHRldGhlciA/IG1hdGhNaW4obWluLCB0ZXRoZXJNaW4pIDogbWluLCBvZmZzZXQsIHRldGhlciA/IG1hdGhNYXgobWF4LCB0ZXRoZXJNYXgpIDogbWF4KTtcbiAgICBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSA9IHByZXZlbnRlZE9mZnNldDtcbiAgICBkYXRhW21haW5BeGlzXSA9IHByZXZlbnRlZE9mZnNldCAtIG9mZnNldDtcbiAgfVxuXG4gIGlmIChjaGVja0FsdEF4aXMpIHtcbiAgICB2YXIgX29mZnNldE1vZGlmaWVyU3RhdGUkMjtcblxuICAgIHZhciBfbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3gnID8gdG9wIDogbGVmdDtcblxuICAgIHZhciBfYWx0U2lkZSA9IG1haW5BeGlzID09PSAneCcgPyBib3R0b20gOiByaWdodDtcblxuICAgIHZhciBfb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1thbHRBeGlzXTtcblxuICAgIHZhciBfbGVuID0gYWx0QXhpcyA9PT0gJ3knID8gJ2hlaWdodCcgOiAnd2lkdGgnO1xuXG4gICAgdmFyIF9taW4gPSBfb2Zmc2V0ICsgb3ZlcmZsb3dbX21haW5TaWRlXTtcblxuICAgIHZhciBfbWF4ID0gX29mZnNldCAtIG92ZXJmbG93W19hbHRTaWRlXTtcblxuICAgIHZhciBpc09yaWdpblNpZGUgPSBbdG9wLCBsZWZ0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpICE9PSAtMTtcblxuICAgIHZhciBfb2Zmc2V0TW9kaWZpZXJWYWx1ZSA9IChfb2Zmc2V0TW9kaWZpZXJTdGF0ZSQyID0gb2Zmc2V0TW9kaWZpZXJTdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogb2Zmc2V0TW9kaWZpZXJTdGF0ZVthbHRBeGlzXSkgIT0gbnVsbCA/IF9vZmZzZXRNb2RpZmllclN0YXRlJDIgOiAwO1xuXG4gICAgdmFyIF90ZXRoZXJNaW4gPSBpc09yaWdpblNpZGUgPyBfbWluIDogX29mZnNldCAtIHJlZmVyZW5jZVJlY3RbX2xlbl0gLSBwb3BwZXJSZWN0W19sZW5dIC0gX29mZnNldE1vZGlmaWVyVmFsdWUgKyBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpcztcblxuICAgIHZhciBfdGV0aGVyTWF4ID0gaXNPcmlnaW5TaWRlID8gX29mZnNldCArIHJlZmVyZW5jZVJlY3RbX2xlbl0gKyBwb3BwZXJSZWN0W19sZW5dIC0gX29mZnNldE1vZGlmaWVyVmFsdWUgLSBub3JtYWxpemVkVGV0aGVyT2Zmc2V0VmFsdWUuYWx0QXhpcyA6IF9tYXg7XG5cbiAgICB2YXIgX3ByZXZlbnRlZE9mZnNldCA9IHRldGhlciAmJiBpc09yaWdpblNpZGUgPyB3aXRoaW5NYXhDbGFtcChfdGV0aGVyTWluLCBfb2Zmc2V0LCBfdGV0aGVyTWF4KSA6IHdpdGhpbih0ZXRoZXIgPyBfdGV0aGVyTWluIDogX21pbiwgX29mZnNldCwgdGV0aGVyID8gX3RldGhlck1heCA6IF9tYXgpO1xuXG4gICAgcG9wcGVyT2Zmc2V0c1thbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVthbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQgLSBfb2Zmc2V0O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogcHJldmVudE92ZXJmbG93LFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddXG59OyIsICJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRIVE1MRWxlbWVudFNjcm9sbChlbGVtZW50KSB7XG4gIHJldHVybiB7XG4gICAgc2Nyb2xsTGVmdDogZWxlbWVudC5zY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgfTtcbn0iLCAiaW1wb3J0IGdldFdpbmRvd1Njcm9sbCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGwuanNcIjtcbmltcG9ydCBnZXRXaW5kb3cgZnJvbSBcIi4vZ2V0V2luZG93LmpzXCI7XG5pbXBvcnQgeyBpc0hUTUxFbGVtZW50IH0gZnJvbSBcIi4vaW5zdGFuY2VPZi5qc1wiO1xuaW1wb3J0IGdldEhUTUxFbGVtZW50U2Nyb2xsIGZyb20gXCIuL2dldEhUTUxFbGVtZW50U2Nyb2xsLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXROb2RlU2Nyb2xsKG5vZGUpIHtcbiAgaWYgKG5vZGUgPT09IGdldFdpbmRvdyhub2RlKSB8fCAhaXNIVE1MRWxlbWVudChub2RlKSkge1xuICAgIHJldHVybiBnZXRXaW5kb3dTY3JvbGwobm9kZSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGdldEhUTUxFbGVtZW50U2Nyb2xsKG5vZGUpO1xuICB9XG59IiwgImltcG9ydCBnZXRCb3VuZGluZ0NsaWVudFJlY3QgZnJvbSBcIi4vZ2V0Qm91bmRpbmdDbGllbnRSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZVNjcm9sbCBmcm9tIFwiLi9nZXROb2RlU2Nyb2xsLmpzXCI7XG5pbXBvcnQgZ2V0Tm9kZU5hbWUgZnJvbSBcIi4vZ2V0Tm9kZU5hbWUuanNcIjtcbmltcG9ydCB7IGlzSFRNTEVsZW1lbnQgfSBmcm9tIFwiLi9pbnN0YW5jZU9mLmpzXCI7XG5pbXBvcnQgZ2V0V2luZG93U2Nyb2xsQmFyWCBmcm9tIFwiLi9nZXRXaW5kb3dTY3JvbGxCYXJYLmpzXCI7XG5pbXBvcnQgZ2V0RG9jdW1lbnRFbGVtZW50IGZyb20gXCIuL2dldERvY3VtZW50RWxlbWVudC5qc1wiO1xuaW1wb3J0IGlzU2Nyb2xsUGFyZW50IGZyb20gXCIuL2lzU2Nyb2xsUGFyZW50LmpzXCI7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gXCIuLi91dGlscy9tYXRoLmpzXCI7XG5cbmZ1bmN0aW9uIGlzRWxlbWVudFNjYWxlZChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgdmFyIHNjYWxlWCA9IHJvdW5kKHJlY3Qud2lkdGgpIC8gZWxlbWVudC5vZmZzZXRXaWR0aCB8fCAxO1xuICB2YXIgc2NhbGVZID0gcm91bmQocmVjdC5oZWlnaHQpIC8gZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwgMTtcbiAgcmV0dXJuIHNjYWxlWCAhPT0gMSB8fCBzY2FsZVkgIT09IDE7XG59IC8vIFJldHVybnMgdGhlIGNvbXBvc2l0ZSByZWN0IG9mIGFuIGVsZW1lbnQgcmVsYXRpdmUgdG8gaXRzIG9mZnNldFBhcmVudC5cbi8vIENvbXBvc2l0ZSBtZWFucyBpdCB0YWtlcyBpbnRvIGFjY291bnQgdHJhbnNmb3JtcyBhcyB3ZWxsIGFzIGxheW91dC5cblxuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRDb21wb3NpdGVSZWN0KGVsZW1lbnRPclZpcnR1YWxFbGVtZW50LCBvZmZzZXRQYXJlbnQsIGlzRml4ZWQpIHtcbiAgaWYgKGlzRml4ZWQgPT09IHZvaWQgMCkge1xuICAgIGlzRml4ZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHZhciBpc09mZnNldFBhcmVudEFuRWxlbWVudCA9IGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcbiAgdmFyIG9mZnNldFBhcmVudElzU2NhbGVkID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpICYmIGlzRWxlbWVudFNjYWxlZChvZmZzZXRQYXJlbnQpO1xuICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnRPclZpcnR1YWxFbGVtZW50LCBvZmZzZXRQYXJlbnRJc1NjYWxlZCwgaXNGaXhlZCk7XG4gIHZhciBzY3JvbGwgPSB7XG4gICAgc2Nyb2xsTGVmdDogMCxcbiAgICBzY3JvbGxUb3A6IDBcbiAgfTtcbiAgdmFyIG9mZnNldHMgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50IHx8ICFpc09mZnNldFBhcmVudEFuRWxlbWVudCAmJiAhaXNGaXhlZCkge1xuICAgIGlmIChnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpICE9PSAnYm9keScgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy8xMDc4XG4gICAgaXNTY3JvbGxQYXJlbnQoZG9jdW1lbnRFbGVtZW50KSkge1xuICAgICAgc2Nyb2xsID0gZ2V0Tm9kZVNjcm9sbChvZmZzZXRQYXJlbnQpO1xuICAgIH1cblxuICAgIGlmIChpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCkpIHtcbiAgICAgIG9mZnNldHMgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3Qob2Zmc2V0UGFyZW50LCB0cnVlKTtcbiAgICAgIG9mZnNldHMueCArPSBvZmZzZXRQYXJlbnQuY2xpZW50TGVmdDtcbiAgICAgIG9mZnNldHMueSArPSBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiByZWN0LmxlZnQgKyBzY3JvbGwuc2Nyb2xsTGVmdCAtIG9mZnNldHMueCxcbiAgICB5OiByZWN0LnRvcCArIHNjcm9sbC5zY3JvbGxUb3AgLSBvZmZzZXRzLnksXG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICB9O1xufSIsICJpbXBvcnQgeyBtb2RpZmllclBoYXNlcyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiOyAvLyBzb3VyY2U6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ5ODc1MjU1XG5cbmZ1bmN0aW9uIG9yZGVyKG1vZGlmaWVycykge1xuICB2YXIgbWFwID0gbmV3IE1hcCgpO1xuICB2YXIgdmlzaXRlZCA9IG5ldyBTZXQoKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBtYXAuc2V0KG1vZGlmaWVyLm5hbWUsIG1vZGlmaWVyKTtcbiAgfSk7IC8vIE9uIHZpc2l0aW5nIG9iamVjdCwgY2hlY2sgZm9yIGl0cyBkZXBlbmRlbmNpZXMgYW5kIHZpc2l0IHRoZW0gcmVjdXJzaXZlbHlcblxuICBmdW5jdGlvbiBzb3J0KG1vZGlmaWVyKSB7XG4gICAgdmlzaXRlZC5hZGQobW9kaWZpZXIubmFtZSk7XG4gICAgdmFyIHJlcXVpcmVzID0gW10uY29uY2F0KG1vZGlmaWVyLnJlcXVpcmVzIHx8IFtdLCBtb2RpZmllci5yZXF1aXJlc0lmRXhpc3RzIHx8IFtdKTtcbiAgICByZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChkZXApIHtcbiAgICAgIGlmICghdmlzaXRlZC5oYXMoZGVwKSkge1xuICAgICAgICB2YXIgZGVwTW9kaWZpZXIgPSBtYXAuZ2V0KGRlcCk7XG5cbiAgICAgICAgaWYgKGRlcE1vZGlmaWVyKSB7XG4gICAgICAgICAgc29ydChkZXBNb2RpZmllcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXN1bHQucHVzaChtb2RpZmllcik7XG4gIH1cblxuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBpZiAoIXZpc2l0ZWQuaGFzKG1vZGlmaWVyLm5hbWUpKSB7XG4gICAgICAvLyBjaGVjayBmb3IgdmlzaXRlZCBvYmplY3RcbiAgICAgIHNvcnQobW9kaWZpZXIpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG9yZGVyTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICAvLyBvcmRlciBiYXNlZCBvbiBkZXBlbmRlbmNpZXNcbiAgdmFyIG9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcihtb2RpZmllcnMpOyAvLyBvcmRlciBiYXNlZCBvbiBwaGFzZVxuXG4gIHJldHVybiBtb2RpZmllclBoYXNlcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGhhc2UpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgIHJldHVybiBtb2RpZmllci5waGFzZSA9PT0gcGhhc2U7XG4gICAgfSkpO1xuICB9LCBbXSk7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRlYm91bmNlKGZuKSB7XG4gIHZhciBwZW5kaW5nO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgcGVuZGluZyA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHBlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmVzb2x2ZShmbigpKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZm9ybWF0KHN0cikge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gW10uY29uY2F0KGFyZ3MpLnJlZHVjZShmdW5jdGlvbiAocCwgYykge1xuICAgIHJldHVybiBwLnJlcGxhY2UoLyVzLywgYyk7XG4gIH0sIHN0cik7XG59IiwgImltcG9ydCBmb3JtYXQgZnJvbSBcIi4vZm9ybWF0LmpzXCI7XG5pbXBvcnQgeyBtb2RpZmllclBoYXNlcyB9IGZyb20gXCIuLi9lbnVtcy5qc1wiO1xudmFyIElOVkFMSURfTU9ESUZJRVJfRVJST1IgPSAnUG9wcGVyOiBtb2RpZmllciBcIiVzXCIgcHJvdmlkZWQgYW4gaW52YWxpZCAlcyBwcm9wZXJ0eSwgZXhwZWN0ZWQgJXMgYnV0IGdvdCAlcyc7XG52YXIgTUlTU0lOR19ERVBFTkRFTkNZX0VSUk9SID0gJ1BvcHBlcjogbW9kaWZpZXIgXCIlc1wiIHJlcXVpcmVzIFwiJXNcIiwgYnV0IFwiJXNcIiBtb2RpZmllciBpcyBub3QgYXZhaWxhYmxlJztcbnZhciBWQUxJRF9QUk9QRVJUSUVTID0gWyduYW1lJywgJ2VuYWJsZWQnLCAncGhhc2UnLCAnZm4nLCAnZWZmZWN0JywgJ3JlcXVpcmVzJywgJ29wdGlvbnMnXTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHZhbGlkYXRlTW9kaWZpZXJzKG1vZGlmaWVycykge1xuICBtb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICBbXS5jb25jYXQoT2JqZWN0LmtleXMobW9kaWZpZXIpLCBWQUxJRF9QUk9QRVJUSUVTKSAvLyBJRTExLWNvbXBhdGlibGUgcmVwbGFjZW1lbnQgZm9yIGBuZXcgU2V0KGl0ZXJhYmxlKWBcbiAgICAuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSwgaW5kZXgsIHNlbGYpIHtcbiAgICAgIHJldHVybiBzZWxmLmluZGV4T2YodmFsdWUpID09PSBpbmRleDtcbiAgICB9KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIubmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIFN0cmluZyhtb2RpZmllci5uYW1lKSwgJ1wibmFtZVwiJywgJ1wic3RyaW5nXCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5uYW1lKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZW5hYmxlZCc6XG4gICAgICAgICAgaWYgKHR5cGVvZiBtb2RpZmllci5lbmFibGVkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcImVuYWJsZWRcIicsICdcImJvb2xlYW5cIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLmVuYWJsZWQpICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdwaGFzZSc6XG4gICAgICAgICAgaWYgKG1vZGlmaWVyUGhhc2VzLmluZGV4T2YobW9kaWZpZXIucGhhc2UpIDwgMCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgbW9kaWZpZXIubmFtZSwgJ1wicGhhc2VcIicsIFwiZWl0aGVyIFwiICsgbW9kaWZpZXJQaGFzZXMuam9pbignLCAnKSwgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIucGhhc2UpICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdmbic6XG4gICAgICAgICAgaWYgKHR5cGVvZiBtb2RpZmllci5mbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgbW9kaWZpZXIubmFtZSwgJ1wiZm5cIicsICdcImZ1bmN0aW9uXCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5mbikgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2VmZmVjdCc6XG4gICAgICAgICAgaWYgKG1vZGlmaWVyLmVmZmVjdCAhPSBudWxsICYmIHR5cGVvZiBtb2RpZmllci5lZmZlY3QgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcImVmZmVjdFwiJywgJ1wiZnVuY3Rpb25cIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLmZuKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAncmVxdWlyZXMnOlxuICAgICAgICAgIGlmIChtb2RpZmllci5yZXF1aXJlcyAhPSBudWxsICYmICFBcnJheS5pc0FycmF5KG1vZGlmaWVyLnJlcXVpcmVzKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgbW9kaWZpZXIubmFtZSwgJ1wicmVxdWlyZXNcIicsICdcImFycmF5XCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5yZXF1aXJlcykgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3JlcXVpcmVzSWZFeGlzdHMnOlxuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShtb2RpZmllci5yZXF1aXJlc0lmRXhpc3RzKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoSU5WQUxJRF9NT0RJRklFUl9FUlJPUiwgbW9kaWZpZXIubmFtZSwgJ1wicmVxdWlyZXNJZkV4aXN0c1wiJywgJ1wiYXJyYXlcIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMpICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdvcHRpb25zJzpcbiAgICAgICAgY2FzZSAnZGF0YSc6XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUG9wcGVySlM6IGFuIGludmFsaWQgcHJvcGVydHkgaGFzIGJlZW4gcHJvdmlkZWQgdG8gdGhlIFxcXCJcIiArIG1vZGlmaWVyLm5hbWUgKyBcIlxcXCIgbW9kaWZpZXIsIHZhbGlkIHByb3BlcnRpZXMgYXJlIFwiICsgVkFMSURfUFJPUEVSVElFUy5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHJldHVybiBcIlxcXCJcIiArIHMgKyBcIlxcXCJcIjtcbiAgICAgICAgICB9KS5qb2luKCcsICcpICsgXCI7IGJ1dCBcXFwiXCIgKyBrZXkgKyBcIlxcXCIgd2FzIHByb3ZpZGVkLlwiKTtcbiAgICAgIH1cblxuICAgICAgbW9kaWZpZXIucmVxdWlyZXMgJiYgbW9kaWZpZXIucmVxdWlyZXMuZm9yRWFjaChmdW5jdGlvbiAocmVxdWlyZW1lbnQpIHtcbiAgICAgICAgaWYgKG1vZGlmaWVycy5maW5kKGZ1bmN0aW9uIChtb2QpIHtcbiAgICAgICAgICByZXR1cm4gbW9kLm5hbWUgPT09IHJlcXVpcmVtZW50O1xuICAgICAgICB9KSA9PSBudWxsKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihmb3JtYXQoTUlTU0lOR19ERVBFTkRFTkNZX0VSUk9SLCBTdHJpbmcobW9kaWZpZXIubmFtZSksIHJlcXVpcmVtZW50LCByZXF1aXJlbWVudCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59IiwgImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHVuaXF1ZUJ5KGFyciwgZm4pIHtcbiAgdmFyIGlkZW50aWZpZXJzID0gbmV3IFNldCgpO1xuICByZXR1cm4gYXJyLmZpbHRlcihmdW5jdGlvbiAoaXRlbSkge1xuICAgIHZhciBpZGVudGlmaWVyID0gZm4oaXRlbSk7XG5cbiAgICBpZiAoIWlkZW50aWZpZXJzLmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgaWRlbnRpZmllcnMuYWRkKGlkZW50aWZpZXIpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9KTtcbn0iLCAiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbWVyZ2VCeU5hbWUobW9kaWZpZXJzKSB7XG4gIHZhciBtZXJnZWQgPSBtb2RpZmllcnMucmVkdWNlKGZ1bmN0aW9uIChtZXJnZWQsIGN1cnJlbnQpIHtcbiAgICB2YXIgZXhpc3RpbmcgPSBtZXJnZWRbY3VycmVudC5uYW1lXTtcbiAgICBtZXJnZWRbY3VycmVudC5uYW1lXSA9IGV4aXN0aW5nID8gT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcsIGN1cnJlbnQsIHtcbiAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nLm9wdGlvbnMsIGN1cnJlbnQub3B0aW9ucyksXG4gICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5kYXRhLCBjdXJyZW50LmRhdGEpXG4gICAgfSkgOiBjdXJyZW50O1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH0sIHt9KTsgLy8gSUUxMSBkb2VzIG5vdCBzdXBwb3J0IE9iamVjdC52YWx1ZXNcblxuICByZXR1cm4gT2JqZWN0LmtleXMobWVyZ2VkKS5tYXAoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBtZXJnZWRba2V5XTtcbiAgfSk7XG59IiwgImltcG9ydCBnZXRDb21wb3NpdGVSZWN0IGZyb20gXCIuL2RvbS11dGlscy9nZXRDb21wb3NpdGVSZWN0LmpzXCI7XG5pbXBvcnQgZ2V0TGF5b3V0UmVjdCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0TGF5b3V0UmVjdC5qc1wiO1xuaW1wb3J0IGxpc3RTY3JvbGxQYXJlbnRzIGZyb20gXCIuL2RvbS11dGlscy9saXN0U2Nyb2xsUGFyZW50cy5qc1wiO1xuaW1wb3J0IGdldE9mZnNldFBhcmVudCBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0T2Zmc2V0UGFyZW50LmpzXCI7XG5pbXBvcnQgZ2V0Q29tcHV0ZWRTdHlsZSBmcm9tIFwiLi9kb20tdXRpbHMvZ2V0Q29tcHV0ZWRTdHlsZS5qc1wiO1xuaW1wb3J0IG9yZGVyTW9kaWZpZXJzIGZyb20gXCIuL3V0aWxzL29yZGVyTW9kaWZpZXJzLmpzXCI7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSBcIi4vdXRpbHMvZGVib3VuY2UuanNcIjtcbmltcG9ydCB2YWxpZGF0ZU1vZGlmaWVycyBmcm9tIFwiLi91dGlscy92YWxpZGF0ZU1vZGlmaWVycy5qc1wiO1xuaW1wb3J0IHVuaXF1ZUJ5IGZyb20gXCIuL3V0aWxzL3VuaXF1ZUJ5LmpzXCI7XG5pbXBvcnQgZ2V0QmFzZVBsYWNlbWVudCBmcm9tIFwiLi91dGlscy9nZXRCYXNlUGxhY2VtZW50LmpzXCI7XG5pbXBvcnQgbWVyZ2VCeU5hbWUgZnJvbSBcIi4vdXRpbHMvbWVyZ2VCeU5hbWUuanNcIjtcbmltcG9ydCBkZXRlY3RPdmVyZmxvdyBmcm9tIFwiLi91dGlscy9kZXRlY3RPdmVyZmxvdy5qc1wiO1xuaW1wb3J0IHsgaXNFbGVtZW50IH0gZnJvbSBcIi4vZG9tLXV0aWxzL2luc3RhbmNlT2YuanNcIjtcbmltcG9ydCB7IGF1dG8gfSBmcm9tIFwiLi9lbnVtcy5qc1wiO1xudmFyIElOVkFMSURfRUxFTUVOVF9FUlJPUiA9ICdQb3BwZXI6IEludmFsaWQgcmVmZXJlbmNlIG9yIHBvcHBlciBhcmd1bWVudCBwcm92aWRlZC4gVGhleSBtdXN0IGJlIGVpdGhlciBhIERPTSBlbGVtZW50IG9yIHZpcnR1YWwgZWxlbWVudC4nO1xudmFyIElORklOSVRFX0xPT1BfRVJST1IgPSAnUG9wcGVyOiBBbiBpbmZpbml0ZSBsb29wIGluIHRoZSBtb2RpZmllcnMgY3ljbGUgaGFzIGJlZW4gZGV0ZWN0ZWQhIFRoZSBjeWNsZSBoYXMgYmVlbiBpbnRlcnJ1cHRlZCB0byBwcmV2ZW50IGEgYnJvd3NlciBjcmFzaC4nO1xudmFyIERFRkFVTFRfT1BUSU9OUyA9IHtcbiAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgbW9kaWZpZXJzOiBbXSxcbiAgc3RyYXRlZ3k6ICdhYnNvbHV0ZSdcbn07XG5cbmZ1bmN0aW9uIGFyZVZhbGlkRWxlbWVudHMoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBhcmdzID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cblxuICByZXR1cm4gIWFyZ3Muc29tZShmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIHJldHVybiAhKGVsZW1lbnQgJiYgdHlwZW9mIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ID09PSAnZnVuY3Rpb24nKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwb3BwZXJHZW5lcmF0b3IoZ2VuZXJhdG9yT3B0aW9ucykge1xuICBpZiAoZ2VuZXJhdG9yT3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgZ2VuZXJhdG9yT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgdmFyIF9nZW5lcmF0b3JPcHRpb25zID0gZ2VuZXJhdG9yT3B0aW9ucyxcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9IF9nZW5lcmF0b3JPcHRpb25zLmRlZmF1bHRNb2RpZmllcnMsXG4gICAgICBkZWZhdWx0TW9kaWZpZXJzID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmID09PSB2b2lkIDAgPyBbXSA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZixcbiAgICAgIF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0T3B0aW9ucyxcbiAgICAgIGRlZmF1bHRPcHRpb25zID0gX2dlbmVyYXRvck9wdGlvbnMkZGVmMiA9PT0gdm9pZCAwID8gREVGQVVMVF9PUFRJT05TIDogX2dlbmVyYXRvck9wdGlvbnMkZGVmMjtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZVBvcHBlcihyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICAgIG9wdGlvbnMgPSBkZWZhdWx0T3B0aW9ucztcbiAgICB9XG5cbiAgICB2YXIgc3RhdGUgPSB7XG4gICAgICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICAgICAgb3JkZXJlZE1vZGlmaWVyczogW10sXG4gICAgICBvcHRpb25zOiBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMsIGRlZmF1bHRPcHRpb25zKSxcbiAgICAgIG1vZGlmaWVyc0RhdGE6IHt9LFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlOiByZWZlcmVuY2UsXG4gICAgICAgIHBvcHBlcjogcG9wcGVyXG4gICAgICB9LFxuICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICBzdHlsZXM6IHt9XG4gICAgfTtcbiAgICB2YXIgZWZmZWN0Q2xlYW51cEZucyA9IFtdO1xuICAgIHZhciBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuICAgIHZhciBpbnN0YW5jZSA9IHtcbiAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgIHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoc2V0T3B0aW9uc0FjdGlvbikge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHR5cGVvZiBzZXRPcHRpb25zQWN0aW9uID09PSAnZnVuY3Rpb24nID8gc2V0T3B0aW9uc0FjdGlvbihzdGF0ZS5vcHRpb25zKSA6IHNldE9wdGlvbnNBY3Rpb247XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgc3RhdGUub3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBzdGF0ZS5vcHRpb25zLCBvcHRpb25zKTtcbiAgICAgICAgc3RhdGUuc2Nyb2xsUGFyZW50cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGlzRWxlbWVudChyZWZlcmVuY2UpID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlKSA6IHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCA/IGxpc3RTY3JvbGxQYXJlbnRzKHJlZmVyZW5jZS5jb250ZXh0RWxlbWVudCkgOiBbXSxcbiAgICAgICAgICBwb3BwZXI6IGxpc3RTY3JvbGxQYXJlbnRzKHBvcHBlcilcbiAgICAgICAgfTsgLy8gT3JkZXJzIHRoZSBtb2RpZmllcnMgYmFzZWQgb24gdGhlaXIgZGVwZW5kZW5jaWVzIGFuZCBgcGhhc2VgXG4gICAgICAgIC8vIHByb3BlcnRpZXNcblxuICAgICAgICB2YXIgb3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyTW9kaWZpZXJzKG1lcmdlQnlOYW1lKFtdLmNvbmNhdChkZWZhdWx0TW9kaWZpZXJzLCBzdGF0ZS5vcHRpb25zLm1vZGlmaWVycykpKTsgLy8gU3RyaXAgb3V0IGRpc2FibGVkIG1vZGlmaWVyc1xuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMgPSBvcmRlcmVkTW9kaWZpZXJzLmZpbHRlcihmdW5jdGlvbiAobSkge1xuICAgICAgICAgIHJldHVybiBtLmVuYWJsZWQ7XG4gICAgICAgIH0pOyAvLyBWYWxpZGF0ZSB0aGUgcHJvdmlkZWQgbW9kaWZpZXJzIHNvIHRoYXQgdGhlIGNvbnN1bWVyIHdpbGwgZ2V0IHdhcm5lZFxuICAgICAgICAvLyBpZiBvbmUgb2YgdGhlIG1vZGlmaWVycyBpcyBpbnZhbGlkIGZvciBhbnkgcmVhc29uXG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIHZhciBtb2RpZmllcnMgPSB1bmlxdWVCeShbXS5jb25jYXQob3JkZXJlZE1vZGlmaWVycywgc3RhdGUub3B0aW9ucy5tb2RpZmllcnMpLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBfcmVmLm5hbWU7XG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YWxpZGF0ZU1vZGlmaWVycyhtb2RpZmllcnMpO1xuXG4gICAgICAgICAgaWYgKGdldEJhc2VQbGFjZW1lbnQoc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgICAgICAgICB2YXIgZmxpcE1vZGlmaWVyID0gc3RhdGUub3JkZXJlZE1vZGlmaWVycy5maW5kKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgICAgICB2YXIgbmFtZSA9IF9yZWYyLm5hbWU7XG4gICAgICAgICAgICAgIHJldHVybiBuYW1lID09PSAnZmxpcCc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFmbGlwTW9kaWZpZXIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhdXRvXCIgcGxhY2VtZW50cyByZXF1aXJlIHRoZSBcImZsaXBcIiBtb2RpZmllciBiZScsICdwcmVzZW50IGFuZCBlbmFibGVkIHRvIHdvcmsuJ10uam9pbignICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHBvcHBlciksXG4gICAgICAgICAgICAgIG1hcmdpblRvcCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpblRvcCxcbiAgICAgICAgICAgICAgbWFyZ2luUmlnaHQgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5SaWdodCxcbiAgICAgICAgICAgICAgbWFyZ2luQm90dG9tID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luQm90dG9tLFxuICAgICAgICAgICAgICBtYXJnaW5MZWZ0ID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luTGVmdDsgLy8gV2Ugbm8gbG9uZ2VyIHRha2UgaW50byBhY2NvdW50IGBtYXJnaW5zYCBvbiB0aGUgcG9wcGVyLCBhbmQgaXQgY2FuXG4gICAgICAgICAgLy8gY2F1c2UgYnVncyB3aXRoIHBvc2l0aW9uaW5nLCBzbyB3ZSdsbCB3YXJuIHRoZSBjb25zdW1lclxuXG5cbiAgICAgICAgICBpZiAoW21hcmdpblRvcCwgbWFyZ2luUmlnaHQsIG1hcmdpbkJvdHRvbSwgbWFyZ2luTGVmdF0uc29tZShmdW5jdGlvbiAobWFyZ2luKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtYXJnaW4pO1xuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oWydQb3BwZXI6IENTUyBcIm1hcmdpblwiIHN0eWxlcyBjYW5ub3QgYmUgdXNlZCB0byBhcHBseSBwYWRkaW5nJywgJ2JldHdlZW4gdGhlIHBvcHBlciBhbmQgaXRzIHJlZmVyZW5jZSBlbGVtZW50IG9yIGJvdW5kYXJ5LicsICdUbyByZXBsaWNhdGUgbWFyZ2luLCB1c2UgdGhlIGBvZmZzZXRgIG1vZGlmaWVyLCBhcyB3ZWxsIGFzJywgJ3RoZSBgcGFkZGluZ2Agb3B0aW9uIGluIHRoZSBgcHJldmVudE92ZXJmbG93YCBhbmQgYGZsaXBgJywgJ21vZGlmaWVycy4nXS5qb2luKCcgJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bk1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgLy8gU3luYyB1cGRhdGUgXHUyMDEzIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKCkge1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3N0YXRlJGVsZW1lbnRzID0gc3RhdGUuZWxlbWVudHMsXG4gICAgICAgICAgICByZWZlcmVuY2UgPSBfc3RhdGUkZWxlbWVudHMucmVmZXJlbmNlLFxuICAgICAgICAgICAgcG9wcGVyID0gX3N0YXRlJGVsZW1lbnRzLnBvcHBlcjsgLy8gRG9uJ3QgcHJvY2VlZCBpZiBgcmVmZXJlbmNlYCBvciBgcG9wcGVyYCBhcmUgbm90IHZhbGlkIGVsZW1lbnRzXG4gICAgICAgIC8vIGFueW1vcmVcblxuICAgICAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTlZBTElEX0VMRU1FTlRfRVJST1IpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSAvLyBTdG9yZSB0aGUgcmVmZXJlbmNlIGFuZCBwb3BwZXIgcmVjdHMgdG8gYmUgcmVhZCBieSBtb2RpZmllcnNcblxuXG4gICAgICAgIHN0YXRlLnJlY3RzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogZ2V0Q29tcG9zaXRlUmVjdChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChwb3BwZXIpLCBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5ID09PSAnZml4ZWQnKSxcbiAgICAgICAgICBwb3BwZXI6IGdldExheW91dFJlY3QocG9wcGVyKVxuICAgICAgICB9OyAvLyBNb2RpZmllcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byByZXNldCB0aGUgY3VycmVudCB1cGRhdGUgY3ljbGUuIFRoZVxuICAgICAgICAvLyBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGUgYGZsaXBgIG1vZGlmaWVyIGNoYW5naW5nIHRoZVxuICAgICAgICAvLyBwbGFjZW1lbnQsIHdoaWNoIHRoZW4gbmVlZHMgdG8gcmUtcnVuIGFsbCB0aGUgbW9kaWZpZXJzLCBiZWNhdXNlIHRoZVxuICAgICAgICAvLyBsb2dpYyB3YXMgcHJldmlvdXNseSByYW4gZm9yIHRoZSBwcmV2aW91cyBwbGFjZW1lbnQgYW5kIGlzIHRoZXJlZm9yZVxuICAgICAgICAvLyBzdGFsZS9pbmNvcnJlY3RcblxuICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5wbGFjZW1lbnQgPSBzdGF0ZS5vcHRpb25zLnBsYWNlbWVudDsgLy8gT24gZWFjaCB1cGRhdGUgY3ljbGUsIHRoZSBgbW9kaWZpZXJzRGF0YWAgcHJvcGVydHkgZm9yIGVhY2ggbW9kaWZpZXJcbiAgICAgICAgLy8gaXMgZmlsbGVkIHdpdGggdGhlIGluaXRpYWwgZGF0YSBzcGVjaWZpZWQgYnkgdGhlIG1vZGlmaWVyLiBUaGlzIG1lYW5zXG4gICAgICAgIC8vIGl0IGRvZXNuJ3QgcGVyc2lzdCBhbmQgaXMgZnJlc2ggb24gZWFjaCB1cGRhdGUuXG4gICAgICAgIC8vIFRvIGVuc3VyZSBwZXJzaXN0ZW50IGRhdGEsIHVzZSBgJHtuYW1lfSNwZXJzaXN0ZW50YFxuXG4gICAgICAgIHN0YXRlLm9yZGVyZWRNb2RpZmllcnMuZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gc3RhdGUubW9kaWZpZXJzRGF0YVttb2RpZmllci5uYW1lXSA9IE9iamVjdC5hc3NpZ24oe30sIG1vZGlmaWVyLmRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdmFyIF9fZGVidWdfbG9vcHNfXyA9IDA7XG5cbiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHN0YXRlLm9yZGVyZWRNb2RpZmllcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgX19kZWJ1Z19sb29wc19fICs9IDE7XG5cbiAgICAgICAgICAgIGlmIChfX2RlYnVnX2xvb3BzX18gPiAxMDApIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihJTkZJTklURV9MT09QX0VSUk9SKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXRlLnJlc2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNldCA9IGZhbHNlO1xuICAgICAgICAgICAgaW5kZXggPSAtMTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBfc3RhdGUkb3JkZXJlZE1vZGlmaWUgPSBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzW2luZGV4XSxcbiAgICAgICAgICAgICAgZm4gPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUuZm4sXG4gICAgICAgICAgICAgIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUub3B0aW9ucyxcbiAgICAgICAgICAgICAgX29wdGlvbnMgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUyID09PSB2b2lkIDAgPyB7fSA6IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIsXG4gICAgICAgICAgICAgIG5hbWUgPSBfc3RhdGUkb3JkZXJlZE1vZGlmaWUubmFtZTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHN0YXRlID0gZm4oe1xuICAgICAgICAgICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICAgICAgICAgIG9wdGlvbnM6IF9vcHRpb25zLFxuICAgICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2VcbiAgICAgICAgICAgIH0pIHx8IHN0YXRlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIEFzeW5jIGFuZCBvcHRpbWlzdGljYWxseSBvcHRpbWl6ZWQgdXBkYXRlIFx1MjAxMyBpdCB3aWxsIG5vdCBiZSBleGVjdXRlZCBpZlxuICAgICAgLy8gbm90IG5lY2Vzc2FyeSAoZGVib3VuY2VkIHRvIHJ1biBhdCBtb3N0IG9uY2UtcGVyLXRpY2spXG4gICAgICB1cGRhdGU6IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgICAgaW5zdGFuY2UuZm9yY2VVcGRhdGUoKTtcbiAgICAgICAgICByZXNvbHZlKHN0YXRlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSxcbiAgICAgIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgICAgIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKTtcbiAgICAgICAgaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoSU5WQUxJRF9FTEVNRU5UX0VSUk9SKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucykudGhlbihmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmICghaXNEZXN0cm95ZWQgJiYgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKSB7XG4gICAgICAgIG9wdGlvbnMub25GaXJzdFVwZGF0ZShzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuXG4gICAgZnVuY3Rpb24gcnVuTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYzLm5hbWUsXG4gICAgICAgICAgICBfcmVmMyRvcHRpb25zID0gX3JlZjMub3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfcmVmMyRvcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9yZWYzJG9wdGlvbnMsXG4gICAgICAgICAgICBlZmZlY3QgPSBfcmVmMy5lZmZlY3Q7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlZmZlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2xlYW51cEZuID0gZWZmZWN0KHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgbm9vcEZuID0gZnVuY3Rpb24gbm9vcEZuKCkge307XG5cbiAgICAgICAgICBlZmZlY3RDbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuIHx8IG5vb3BGbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuZXhwb3J0IHZhciBjcmVhdGVQb3BwZXIgPSAvKiNfX1BVUkVfXyovcG9wcGVyR2VuZXJhdG9yKCk7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuZXhwb3J0IHsgZGV0ZWN0T3ZlcmZsb3cgfTsiLCAiaW1wb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdyB9IGZyb20gXCIuL2NyZWF0ZVBvcHBlci5qc1wiO1xuaW1wb3J0IGV2ZW50TGlzdGVuZXJzIGZyb20gXCIuL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qc1wiO1xuaW1wb3J0IHBvcHBlck9mZnNldHMgZnJvbSBcIi4vbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanNcIjtcbmltcG9ydCBjb21wdXRlU3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzXCI7XG5pbXBvcnQgYXBwbHlTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2FwcGx5U3R5bGVzLmpzXCI7XG52YXIgZGVmYXVsdE1vZGlmaWVycyA9IFtldmVudExpc3RlbmVycywgcG9wcGVyT2Zmc2V0cywgY29tcHV0ZVN0eWxlcywgYXBwbHlTdHlsZXNdO1xudmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBkZWZhdWx0TW9kaWZpZXJzXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgeyBjcmVhdGVQb3BwZXIsIHBvcHBlckdlbmVyYXRvciwgZGVmYXVsdE1vZGlmaWVycywgZGV0ZWN0T3ZlcmZsb3cgfTsiLCAiaW1wb3J0IHsgcG9wcGVyR2VuZXJhdG9yLCBkZXRlY3RPdmVyZmxvdyB9IGZyb20gXCIuL2NyZWF0ZVBvcHBlci5qc1wiO1xuaW1wb3J0IGV2ZW50TGlzdGVuZXJzIGZyb20gXCIuL21vZGlmaWVycy9ldmVudExpc3RlbmVycy5qc1wiO1xuaW1wb3J0IHBvcHBlck9mZnNldHMgZnJvbSBcIi4vbW9kaWZpZXJzL3BvcHBlck9mZnNldHMuanNcIjtcbmltcG9ydCBjb21wdXRlU3R5bGVzIGZyb20gXCIuL21vZGlmaWVycy9jb21wdXRlU3R5bGVzLmpzXCI7XG5pbXBvcnQgYXBwbHlTdHlsZXMgZnJvbSBcIi4vbW9kaWZpZXJzL2FwcGx5U3R5bGVzLmpzXCI7XG5pbXBvcnQgb2Zmc2V0IGZyb20gXCIuL21vZGlmaWVycy9vZmZzZXQuanNcIjtcbmltcG9ydCBmbGlwIGZyb20gXCIuL21vZGlmaWVycy9mbGlwLmpzXCI7XG5pbXBvcnQgcHJldmVudE92ZXJmbG93IGZyb20gXCIuL21vZGlmaWVycy9wcmV2ZW50T3ZlcmZsb3cuanNcIjtcbmltcG9ydCBhcnJvdyBmcm9tIFwiLi9tb2RpZmllcnMvYXJyb3cuanNcIjtcbmltcG9ydCBoaWRlIGZyb20gXCIuL21vZGlmaWVycy9oaWRlLmpzXCI7XG52YXIgZGVmYXVsdE1vZGlmaWVycyA9IFtldmVudExpc3RlbmVycywgcG9wcGVyT2Zmc2V0cywgY29tcHV0ZVN0eWxlcywgYXBwbHlTdHlsZXMsIG9mZnNldCwgZmxpcCwgcHJldmVudE92ZXJmbG93LCBhcnJvdywgaGlkZV07XG52YXIgY3JlYXRlUG9wcGVyID0gLyojX19QVVJFX18qL3BvcHBlckdlbmVyYXRvcih7XG4gIGRlZmF1bHRNb2RpZmllcnM6IGRlZmF1bHRNb2RpZmllcnNcbn0pOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciwgcG9wcGVyR2VuZXJhdG9yLCBkZWZhdWx0TW9kaWZpZXJzLCBkZXRlY3RPdmVyZmxvdyB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cbmV4cG9ydCB7IGNyZWF0ZVBvcHBlciBhcyBjcmVhdGVQb3BwZXJMaXRlIH0gZnJvbSBcIi4vcG9wcGVyLWxpdGUuanNcIjsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnQgKiBmcm9tIFwiLi9tb2RpZmllcnMvaW5kZXguanNcIjsiLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjMpOiB1dGlsL2luZGV4LmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuY29uc3QgTUFYX1VJRCA9IDFfMDAwXzAwMFxuY29uc3QgTUlMTElTRUNPTkRTX01VTFRJUExJRVIgPSAxMDAwXG5jb25zdCBUUkFOU0lUSU9OX0VORCA9ICd0cmFuc2l0aW9uZW5kJ1xuXG4vLyBTaG91dC1vdXQgQW5ndXMgQ3JvbGwgKGh0dHBzOi8vZ29vLmdsL3B4d1FHcClcbmNvbnN0IHRvVHlwZSA9IG9iamVjdCA9PiB7XG4gIGlmIChvYmplY3QgPT09IG51bGwgfHwgb2JqZWN0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYCR7b2JqZWN0fWBcbiAgfVxuXG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KS5tYXRjaCgvXFxzKFthLXpdKykvaSlbMV0udG9Mb3dlckNhc2UoKVxufVxuXG4vKipcbiAqIFB1YmxpYyBVdGlsIEFQSVxuICovXG5cbmNvbnN0IGdldFVJRCA9IHByZWZpeCA9PiB7XG4gIGRvIHtcbiAgICBwcmVmaXggKz0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogTUFYX1VJRClcbiAgfSB3aGlsZSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocHJlZml4KSlcblxuICByZXR1cm4gcHJlZml4XG59XG5cbmNvbnN0IGdldFNlbGVjdG9yID0gZWxlbWVudCA9PiB7XG4gIGxldCBzZWxlY3RvciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLXRhcmdldCcpXG5cbiAgaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gJyMnKSB7XG4gICAgbGV0IGhyZWZBdHRyaWJ1dGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaHJlZicpXG5cbiAgICAvLyBUaGUgb25seSB2YWxpZCBjb250ZW50IHRoYXQgY291bGQgZG91YmxlIGFzIGEgc2VsZWN0b3IgYXJlIElEcyBvciBjbGFzc2VzLFxuICAgIC8vIHNvIGV2ZXJ5dGhpbmcgc3RhcnRpbmcgd2l0aCBgI2Agb3IgYC5gLiBJZiBhIFwicmVhbFwiIFVSTCBpcyB1c2VkIGFzIHRoZSBzZWxlY3RvcixcbiAgICAvLyBgZG9jdW1lbnQucXVlcnlTZWxlY3RvcmAgd2lsbCByaWdodGZ1bGx5IGNvbXBsYWluIGl0IGlzIGludmFsaWQuXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9pc3N1ZXMvMzIyNzNcbiAgICBpZiAoIWhyZWZBdHRyaWJ1dGUgfHwgKCFocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnLicpKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICAvLyBKdXN0IGluIGNhc2Ugc29tZSBDTVMgcHV0cyBvdXQgYSBmdWxsIFVSTCB3aXRoIHRoZSBhbmNob3IgYXBwZW5kZWRcbiAgICBpZiAoaHJlZkF0dHJpYnV0ZS5pbmNsdWRlcygnIycpICYmICFocmVmQXR0cmlidXRlLnN0YXJ0c1dpdGgoJyMnKSkge1xuICAgICAgaHJlZkF0dHJpYnV0ZSA9IGAjJHtocmVmQXR0cmlidXRlLnNwbGl0KCcjJylbMV19YFxuICAgIH1cblxuICAgIHNlbGVjdG9yID0gaHJlZkF0dHJpYnV0ZSAmJiBocmVmQXR0cmlidXRlICE9PSAnIycgPyBocmVmQXR0cmlidXRlLnRyaW0oKSA6IG51bGxcbiAgfVxuXG4gIHJldHVybiBzZWxlY3RvclxufVxuXG5jb25zdCBnZXRTZWxlY3RvckZyb21FbGVtZW50ID0gZWxlbWVudCA9PiB7XG4gIGNvbnN0IHNlbGVjdG9yID0gZ2V0U2VsZWN0b3IoZWxlbWVudClcblxuICBpZiAoc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgPyBzZWxlY3RvciA6IG51bGxcbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbmNvbnN0IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IgPSBlbGVtZW50ID0+IHtcbiAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvcihlbGVtZW50KVxuXG4gIHJldHVybiBzZWxlY3RvciA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIDogbnVsbFxufVxuXG5jb25zdCBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gMFxuICB9XG5cbiAgLy8gR2V0IHRyYW5zaXRpb24tZHVyYXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgbGV0IHsgdHJhbnNpdGlvbkR1cmF0aW9uLCB0cmFuc2l0aW9uRGVsYXkgfSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpXG5cbiAgY29uc3QgZmxvYXRUcmFuc2l0aW9uRHVyYXRpb24gPSBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRHVyYXRpb24pXG4gIGNvbnN0IGZsb2F0VHJhbnNpdGlvbkRlbGF5ID0gTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkRlbGF5KVxuXG4gIC8vIFJldHVybiAwIGlmIGVsZW1lbnQgb3IgdHJhbnNpdGlvbiBkdXJhdGlvbiBpcyBub3QgZm91bmRcbiAgaWYgKCFmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiAmJiAhZmxvYXRUcmFuc2l0aW9uRGVsYXkpIHtcbiAgICByZXR1cm4gMFxuICB9XG5cbiAgLy8gSWYgbXVsdGlwbGUgZHVyYXRpb25zIGFyZSBkZWZpbmVkLCB0YWtlIHRoZSBmaXJzdFxuICB0cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb24uc3BsaXQoJywnKVswXVxuICB0cmFuc2l0aW9uRGVsYXkgPSB0cmFuc2l0aW9uRGVsYXkuc3BsaXQoJywnKVswXVxuXG4gIHJldHVybiAoTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkR1cmF0aW9uKSArIE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSkpICogTUlMTElTRUNPTkRTX01VTFRJUExJRVJcbn1cblxuY29uc3QgdHJpZ2dlclRyYW5zaXRpb25FbmQgPSBlbGVtZW50ID0+IHtcbiAgZWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChUUkFOU0lUSU9OX0VORCkpXG59XG5cbmNvbnN0IGlzRWxlbWVudCA9IG9iamVjdCA9PiB7XG4gIGlmICghb2JqZWN0IHx8IHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBpZiAodHlwZW9mIG9iamVjdC5qcXVlcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgb2JqZWN0ID0gb2JqZWN0WzBdXG4gIH1cblxuICByZXR1cm4gdHlwZW9mIG9iamVjdC5ub2RlVHlwZSAhPT0gJ3VuZGVmaW5lZCdcbn1cblxuY29uc3QgZ2V0RWxlbWVudCA9IG9iamVjdCA9PiB7XG4gIC8vIGl0J3MgYSBqUXVlcnkgb2JqZWN0IG9yIGEgbm9kZSBlbGVtZW50XG4gIGlmIChpc0VsZW1lbnQob2JqZWN0KSkge1xuICAgIHJldHVybiBvYmplY3QuanF1ZXJ5ID8gb2JqZWN0WzBdIDogb2JqZWN0XG4gIH1cblxuICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihvYmplY3QpXG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5jb25zdCBpc1Zpc2libGUgPSBlbGVtZW50ID0+IHtcbiAgaWYgKCFpc0VsZW1lbnQoZWxlbWVudCkgfHwgZWxlbWVudC5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgY29uc3QgZWxlbWVudElzVmlzaWJsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgndmlzaWJpbGl0eScpID09PSAndmlzaWJsZSdcbiAgLy8gSGFuZGxlIGBkZXRhaWxzYCBlbGVtZW50IGFzIGl0cyBjb250ZW50IG1heSBmYWxzaWUgYXBwZWFyIHZpc2libGUgd2hlbiBpdCBpcyBjbG9zZWRcbiAgY29uc3QgY2xvc2VkRGV0YWlscyA9IGVsZW1lbnQuY2xvc2VzdCgnZGV0YWlsczpub3QoW29wZW5dKScpXG5cbiAgaWYgKCFjbG9zZWREZXRhaWxzKSB7XG4gICAgcmV0dXJuIGVsZW1lbnRJc1Zpc2libGVcbiAgfVxuXG4gIGlmIChjbG9zZWREZXRhaWxzICE9PSBlbGVtZW50KSB7XG4gICAgY29uc3Qgc3VtbWFyeSA9IGVsZW1lbnQuY2xvc2VzdCgnc3VtbWFyeScpXG4gICAgaWYgKHN1bW1hcnkgJiYgc3VtbWFyeS5wYXJlbnROb2RlICE9PSBjbG9zZWREZXRhaWxzKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoc3VtbWFyeSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnRJc1Zpc2libGVcbn1cblxuY29uc3QgaXNEaXNhYmxlZCA9IGVsZW1lbnQgPT4ge1xuICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgZWxlbWVudC5kaXNhYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZWxlbWVudC5kaXNhYmxlZFxuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXNhYmxlZCcpICE9PSAnZmFsc2UnXG59XG5cbmNvbnN0IGZpbmRTaGFkb3dSb290ID0gZWxlbWVudCA9PiB7XG4gIGlmICghZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmF0dGFjaFNoYWRvdykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICAvLyBDYW4gZmluZCB0aGUgc2hhZG93IHJvb3Qgb3RoZXJ3aXNlIGl0J2xsIHJldHVybiB0aGUgZG9jdW1lbnRcbiAgaWYgKHR5cGVvZiBlbGVtZW50LmdldFJvb3ROb2RlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3Qgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKVxuICAgIHJldHVybiByb290IGluc3RhbmNlb2YgU2hhZG93Um9vdCA/IHJvb3QgOiBudWxsXG4gIH1cblxuICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QpIHtcbiAgICByZXR1cm4gZWxlbWVudFxuICB9XG5cbiAgLy8gd2hlbiB3ZSBkb24ndCBmaW5kIGEgc2hhZG93IHJvb3RcbiAgaWYgKCFlbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIGZpbmRTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSlcbn1cblxuY29uc3Qgbm9vcCA9ICgpID0+IHt9XG5cbi8qKlxuICogVHJpY2sgdG8gcmVzdGFydCBhbiBlbGVtZW50J3MgYW5pbWF0aW9uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudFxuICogQHJldHVybiB2b2lkXG4gKlxuICogQHNlZSBodHRwczovL3d3dy5jaGFyaXN0aGVvLmlvL2Jsb2cvMjAyMS8wMi9yZXN0YXJ0LWEtY3NzLWFuaW1hdGlvbi13aXRoLWphdmFzY3JpcHQvI3Jlc3RhcnRpbmctYS1jc3MtYW5pbWF0aW9uXG4gKi9cbmNvbnN0IHJlZmxvdyA9IGVsZW1lbnQgPT4ge1xuICBlbGVtZW50Lm9mZnNldEhlaWdodCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC1leHByZXNzaW9uc1xufVxuXG5jb25zdCBnZXRqUXVlcnkgPSAoKSA9PiB7XG4gIGlmICh3aW5kb3cualF1ZXJ5ICYmICFkb2N1bWVudC5ib2R5Lmhhc0F0dHJpYnV0ZSgnZGF0YS1icy1uby1qcXVlcnknKSkge1xuICAgIHJldHVybiB3aW5kb3cualF1ZXJ5XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG5jb25zdCBET01Db250ZW50TG9hZGVkQ2FsbGJhY2tzID0gW11cblxuY29uc3Qgb25ET01Db250ZW50TG9hZGVkID0gY2FsbGJhY2sgPT4ge1xuICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2xvYWRpbmcnKSB7XG4gICAgLy8gYWRkIGxpc3RlbmVyIG9uIHRoZSBmaXJzdCBjYWxsIHdoZW4gdGhlIGRvY3VtZW50IGlzIGluIGxvYWRpbmcgc3RhdGVcbiAgICBpZiAoIURPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MubGVuZ3RoKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MpIHtcbiAgICAgICAgICBjYWxsYmFjaygpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKVxuICB9IGVsc2Uge1xuICAgIGNhbGxiYWNrKClcbiAgfVxufVxuXG5jb25zdCBpc1JUTCA9ICgpID0+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kaXIgPT09ICdydGwnXG5cbmNvbnN0IGRlZmluZUpRdWVyeVBsdWdpbiA9IHBsdWdpbiA9PiB7XG4gIG9uRE9NQ29udGVudExvYWRlZCgoKSA9PiB7XG4gICAgY29uc3QgJCA9IGdldGpRdWVyeSgpXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG4gICAgaWYgKCQpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSBwbHVnaW4uTkFNRVxuICAgICAgY29uc3QgSlFVRVJZX05PX0NPTkZMSUNUID0gJC5mbltuYW1lXVxuICAgICAgJC5mbltuYW1lXSA9IHBsdWdpbi5qUXVlcnlJbnRlcmZhY2VcbiAgICAgICQuZm5bbmFtZV0uQ29uc3RydWN0b3IgPSBwbHVnaW5cbiAgICAgICQuZm5bbmFtZV0ubm9Db25mbGljdCA9ICgpID0+IHtcbiAgICAgICAgJC5mbltuYW1lXSA9IEpRVUVSWV9OT19DT05GTElDVFxuICAgICAgICByZXR1cm4gcGx1Z2luLmpRdWVyeUludGVyZmFjZVxuICAgICAgfVxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgZXhlY3V0ZSA9IGNhbGxiYWNrID0+IHtcbiAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrKClcbiAgfVxufVxuXG5jb25zdCBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uID0gKGNhbGxiYWNrLCB0cmFuc2l0aW9uRWxlbWVudCwgd2FpdEZvclRyYW5zaXRpb24gPSB0cnVlKSA9PiB7XG4gIGlmICghd2FpdEZvclRyYW5zaXRpb24pIHtcbiAgICBleGVjdXRlKGNhbGxiYWNrKVxuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgZHVyYXRpb25QYWRkaW5nID0gNVxuICBjb25zdCBlbXVsYXRlZER1cmF0aW9uID0gZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodHJhbnNpdGlvbkVsZW1lbnQpICsgZHVyYXRpb25QYWRkaW5nXG5cbiAgbGV0IGNhbGxlZCA9IGZhbHNlXG5cbiAgY29uc3QgaGFuZGxlciA9ICh7IHRhcmdldCB9KSA9PiB7XG4gICAgaWYgKHRhcmdldCAhPT0gdHJhbnNpdGlvbkVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNhbGxlZCA9IHRydWVcbiAgICB0cmFuc2l0aW9uRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFRSQU5TSVRJT05fRU5ELCBoYW5kbGVyKVxuICAgIGV4ZWN1dGUoY2FsbGJhY2spXG4gIH1cblxuICB0cmFuc2l0aW9uRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFRSQU5TSVRJT05fRU5ELCBoYW5kbGVyKVxuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodHJhbnNpdGlvbkVsZW1lbnQpXG4gICAgfVxuICB9LCBlbXVsYXRlZER1cmF0aW9uKVxufVxuXG4vKipcbiAqIFJldHVybiB0aGUgcHJldmlvdXMvbmV4dCBlbGVtZW50IG9mIGEgbGlzdC5cbiAqXG4gKiBAcGFyYW0ge2FycmF5fSBsaXN0ICAgIFRoZSBsaXN0IG9mIGVsZW1lbnRzXG4gKiBAcGFyYW0gYWN0aXZlRWxlbWVudCAgIFRoZSBhY3RpdmUgZWxlbWVudFxuICogQHBhcmFtIHNob3VsZEdldE5leHQgICBDaG9vc2UgdG8gZ2V0IG5leHQgb3IgcHJldmlvdXMgZWxlbWVudFxuICogQHBhcmFtIGlzQ3ljbGVBbGxvd2VkXG4gKiBAcmV0dXJuIHtFbGVtZW50fGVsZW19IFRoZSBwcm9wZXIgZWxlbWVudFxuICovXG5jb25zdCBnZXROZXh0QWN0aXZlRWxlbWVudCA9IChsaXN0LCBhY3RpdmVFbGVtZW50LCBzaG91bGRHZXROZXh0LCBpc0N5Y2xlQWxsb3dlZCkgPT4ge1xuICBjb25zdCBsaXN0TGVuZ3RoID0gbGlzdC5sZW5ndGhcbiAgbGV0IGluZGV4ID0gbGlzdC5pbmRleE9mKGFjdGl2ZUVsZW1lbnQpXG5cbiAgLy8gaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGxpc3QgcmV0dXJuIGFuIGVsZW1lbnRcbiAgLy8gZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24gYW5kIGlmIGN5Y2xlIGlzIGFsbG93ZWRcbiAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgIHJldHVybiAhc2hvdWxkR2V0TmV4dCAmJiBpc0N5Y2xlQWxsb3dlZCA/IGxpc3RbbGlzdExlbmd0aCAtIDFdIDogbGlzdFswXVxuICB9XG5cbiAgaW5kZXggKz0gc2hvdWxkR2V0TmV4dCA/IDEgOiAtMVxuXG4gIGlmIChpc0N5Y2xlQWxsb3dlZCkge1xuICAgIGluZGV4ID0gKGluZGV4ICsgbGlzdExlbmd0aCkgJSBsaXN0TGVuZ3RoXG4gIH1cblxuICByZXR1cm4gbGlzdFtNYXRoLm1heCgwLCBNYXRoLm1pbihpbmRleCwgbGlzdExlbmd0aCAtIDEpKV1cbn1cblxuZXhwb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBleGVjdXRlLFxuICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uLFxuICBmaW5kU2hhZG93Um9vdCxcbiAgZ2V0RWxlbWVudCxcbiAgZ2V0RWxlbWVudEZyb21TZWxlY3RvcixcbiAgZ2V0alF1ZXJ5LFxuICBnZXROZXh0QWN0aXZlRWxlbWVudCxcbiAgZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCxcbiAgZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQsXG4gIGdldFVJRCxcbiAgaXNEaXNhYmxlZCxcbiAgaXNFbGVtZW50LFxuICBpc1JUTCxcbiAgaXNWaXNpYmxlLFxuICBub29wLFxuICBvbkRPTUNvbnRlbnRMb2FkZWQsXG4gIHJlZmxvdyxcbiAgdHJpZ2dlclRyYW5zaXRpb25FbmQsXG4gIHRvVHlwZVxufVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4zKTogZG9tL2V2ZW50LWhhbmRsZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBnZXRqUXVlcnkgfSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IG5hbWVzcGFjZVJlZ2V4ID0gL1teLl0qKD89XFwuLiopXFwufC4qL1xuY29uc3Qgc3RyaXBOYW1lUmVnZXggPSAvXFwuLiovXG5jb25zdCBzdHJpcFVpZFJlZ2V4ID0gLzo6XFxkKyQvXG5jb25zdCBldmVudFJlZ2lzdHJ5ID0ge30gLy8gRXZlbnRzIHN0b3JhZ2VcbmxldCB1aWRFdmVudCA9IDFcbmNvbnN0IGN1c3RvbUV2ZW50cyA9IHtcbiAgbW91c2VlbnRlcjogJ21vdXNlb3ZlcicsXG4gIG1vdXNlbGVhdmU6ICdtb3VzZW91dCdcbn1cblxuY29uc3QgbmF0aXZlRXZlbnRzID0gbmV3IFNldChbXG4gICdjbGljaycsXG4gICdkYmxjbGljaycsXG4gICdtb3VzZXVwJyxcbiAgJ21vdXNlZG93bicsXG4gICdjb250ZXh0bWVudScsXG4gICdtb3VzZXdoZWVsJyxcbiAgJ0RPTU1vdXNlU2Nyb2xsJyxcbiAgJ21vdXNlb3ZlcicsXG4gICdtb3VzZW91dCcsXG4gICdtb3VzZW1vdmUnLFxuICAnc2VsZWN0c3RhcnQnLFxuICAnc2VsZWN0ZW5kJyxcbiAgJ2tleWRvd24nLFxuICAna2V5cHJlc3MnLFxuICAna2V5dXAnLFxuICAnb3JpZW50YXRpb25jaGFuZ2UnLFxuICAndG91Y2hzdGFydCcsXG4gICd0b3VjaG1vdmUnLFxuICAndG91Y2hlbmQnLFxuICAndG91Y2hjYW5jZWwnLFxuICAncG9pbnRlcmRvd24nLFxuICAncG9pbnRlcm1vdmUnLFxuICAncG9pbnRlcnVwJyxcbiAgJ3BvaW50ZXJsZWF2ZScsXG4gICdwb2ludGVyY2FuY2VsJyxcbiAgJ2dlc3R1cmVzdGFydCcsXG4gICdnZXN0dXJlY2hhbmdlJyxcbiAgJ2dlc3R1cmVlbmQnLFxuICAnZm9jdXMnLFxuICAnYmx1cicsXG4gICdjaGFuZ2UnLFxuICAncmVzZXQnLFxuICAnc2VsZWN0JyxcbiAgJ3N1Ym1pdCcsXG4gICdmb2N1c2luJyxcbiAgJ2ZvY3Vzb3V0JyxcbiAgJ2xvYWQnLFxuICAndW5sb2FkJyxcbiAgJ2JlZm9yZXVubG9hZCcsXG4gICdyZXNpemUnLFxuICAnbW92ZScsXG4gICdET01Db250ZW50TG9hZGVkJyxcbiAgJ3JlYWR5c3RhdGVjaGFuZ2UnLFxuICAnZXJyb3InLFxuICAnYWJvcnQnLFxuICAnc2Nyb2xsJ1xuXSlcblxuLyoqXG4gKiBQcml2YXRlIG1ldGhvZHNcbiAqL1xuXG5mdW5jdGlvbiBtYWtlRXZlbnRVaWQoZWxlbWVudCwgdWlkKSB7XG4gIHJldHVybiAodWlkICYmIGAke3VpZH06OiR7dWlkRXZlbnQrK31gKSB8fCBlbGVtZW50LnVpZEV2ZW50IHx8IHVpZEV2ZW50Kytcbn1cblxuZnVuY3Rpb24gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KSB7XG4gIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChlbGVtZW50KVxuXG4gIGVsZW1lbnQudWlkRXZlbnQgPSB1aWRcbiAgZXZlbnRSZWdpc3RyeVt1aWRdID0gZXZlbnRSZWdpc3RyeVt1aWRdIHx8IHt9XG5cbiAgcmV0dXJuIGV2ZW50UmVnaXN0cnlbdWlkXVxufVxuXG5mdW5jdGlvbiBib290c3RyYXBIYW5kbGVyKGVsZW1lbnQsIGZuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50KSB7XG4gICAgaHlkcmF0ZU9iaihldmVudCwgeyBkZWxlZ2F0ZVRhcmdldDogZWxlbWVudCB9KVxuXG4gICAgaWYgKGhhbmRsZXIub25lT2ZmKSB7XG4gICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsIGV2ZW50LnR5cGUsIGZuKVxuICAgIH1cblxuICAgIHJldHVybiBmbi5hcHBseShlbGVtZW50LCBbZXZlbnRdKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyKGVsZW1lbnQsIHNlbGVjdG9yLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgIGNvbnN0IGRvbUVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuXG4gICAgZm9yIChsZXQgeyB0YXJnZXQgfSA9IGV2ZW50OyB0YXJnZXQgJiYgdGFyZ2V0ICE9PSB0aGlzOyB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZSkge1xuICAgICAgZm9yIChjb25zdCBkb21FbGVtZW50IG9mIGRvbUVsZW1lbnRzKSB7XG4gICAgICAgIGlmIChkb21FbGVtZW50ICE9PSB0YXJnZXQpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgaHlkcmF0ZU9iaihldmVudCwgeyBkZWxlZ2F0ZVRhcmdldDogdGFyZ2V0IH0pXG5cbiAgICAgICAgaWYgKGhhbmRsZXIub25lT2ZmKSB7XG4gICAgICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBzZWxlY3RvciwgZm4pXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm4uYXBwbHkodGFyZ2V0LCBbZXZlbnRdKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kSGFuZGxlcihldmVudHMsIGNhbGxhYmxlLCBkZWxlZ2F0aW9uU2VsZWN0b3IgPSBudWxsKSB7XG4gIHJldHVybiBPYmplY3QudmFsdWVzKGV2ZW50cylcbiAgICAuZmluZChldmVudCA9PiBldmVudC5jYWxsYWJsZSA9PT0gY2FsbGFibGUgJiYgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yID09PSBkZWxlZ2F0aW9uU2VsZWN0b3IpXG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICBjb25zdCBpc0RlbGVnYXRlZCA9IHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJ1xuICAvLyB0b2RvOiB0b29sdGlwIHBhc3NlcyBgZmFsc2VgIGluc3RlYWQgb2Ygc2VsZWN0b3IsIHNvIHdlIG5lZWQgdG8gY2hlY2tcbiAgY29uc3QgY2FsbGFibGUgPSBpc0RlbGVnYXRlZCA/IGRlbGVnYXRpb25GdW5jdGlvbiA6IChoYW5kbGVyIHx8IGRlbGVnYXRpb25GdW5jdGlvbilcbiAgbGV0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChvcmlnaW5hbFR5cGVFdmVudClcblxuICBpZiAoIW5hdGl2ZUV2ZW50cy5oYXModHlwZUV2ZW50KSkge1xuICAgIHR5cGVFdmVudCA9IG9yaWdpbmFsVHlwZUV2ZW50XG4gIH1cblxuICByZXR1cm4gW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XVxufVxuXG5mdW5jdGlvbiBhZGRIYW5kbGVyKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIG9uZU9mZikge1xuICBpZiAodHlwZW9mIG9yaWdpbmFsVHlwZUV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgbGV0IFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF0gPSBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pXG5cbiAgLy8gaW4gY2FzZSBvZiBtb3VzZWVudGVyIG9yIG1vdXNlbGVhdmUgd3JhcCB0aGUgaGFuZGxlciB3aXRoaW4gYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyBmb3IgaXRzIERPTSBwb3NpdGlvblxuICAvLyB0aGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gYmVpbmcgZGlzcGF0Y2hlZCB0aGUgc2FtZSB3YXkgYXMgbW91c2VvdmVyIG9yIG1vdXNlb3V0IGRvZXNcbiAgaWYgKG9yaWdpbmFsVHlwZUV2ZW50IGluIGN1c3RvbUV2ZW50cykge1xuICAgIGNvbnN0IHdyYXBGdW5jdGlvbiA9IGZuID0+IHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgaWYgKCFldmVudC5yZWxhdGVkVGFyZ2V0IHx8IChldmVudC5yZWxhdGVkVGFyZ2V0ICE9PSBldmVudC5kZWxlZ2F0ZVRhcmdldCAmJiAhZXZlbnQuZGVsZWdhdGVUYXJnZXQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpKSB7XG4gICAgICAgICAgcmV0dXJuIGZuLmNhbGwodGhpcywgZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYWJsZSA9IHdyYXBGdW5jdGlvbihjYWxsYWJsZSlcbiAgfVxuXG4gIGNvbnN0IGV2ZW50cyA9IGdldEVsZW1lbnRFdmVudHMoZWxlbWVudClcbiAgY29uc3QgaGFuZGxlcnMgPSBldmVudHNbdHlwZUV2ZW50XSB8fCAoZXZlbnRzW3R5cGVFdmVudF0gPSB7fSlcbiAgY29uc3QgcHJldmlvdXNGdW5jdGlvbiA9IGZpbmRIYW5kbGVyKGhhbmRsZXJzLCBjYWxsYWJsZSwgaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbClcblxuICBpZiAocHJldmlvdXNGdW5jdGlvbikge1xuICAgIHByZXZpb3VzRnVuY3Rpb24ub25lT2ZmID0gcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgJiYgb25lT2ZmXG5cbiAgICByZXR1cm5cbiAgfVxuXG4gIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChjYWxsYWJsZSwgb3JpZ2luYWxUeXBlRXZlbnQucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKVxuICBjb25zdCBmbiA9IGlzRGVsZWdhdGVkID9cbiAgICBib290c3RyYXBEZWxlZ2F0aW9uSGFuZGxlcihlbGVtZW50LCBoYW5kbGVyLCBjYWxsYWJsZSkgOlxuICAgIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgY2FsbGFibGUpXG5cbiAgZm4uZGVsZWdhdGlvblNlbGVjdG9yID0gaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbFxuICBmbi5jYWxsYWJsZSA9IGNhbGxhYmxlXG4gIGZuLm9uZU9mZiA9IG9uZU9mZlxuICBmbi51aWRFdmVudCA9IHVpZFxuICBoYW5kbGVyc1t1aWRdID0gZm5cblxuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodHlwZUV2ZW50LCBmbiwgaXNEZWxlZ2F0ZWQpXG59XG5cbmZ1bmN0aW9uIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25TZWxlY3Rvcikge1xuICBjb25zdCBmbiA9IGZpbmRIYW5kbGVyKGV2ZW50c1t0eXBlRXZlbnRdLCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpXG5cbiAgaWYgKCFmbikge1xuICAgIHJldHVyblxuICB9XG5cbiAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIEJvb2xlYW4oZGVsZWdhdGlvblNlbGVjdG9yKSlcbiAgZGVsZXRlIGV2ZW50c1t0eXBlRXZlbnRdW2ZuLnVpZEV2ZW50XVxufVxuXG5mdW5jdGlvbiByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIG5hbWVzcGFjZSkge1xuICBjb25zdCBzdG9yZUVsZW1lbnRFdmVudCA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IHt9XG5cbiAgZm9yIChjb25zdCBoYW5kbGVyS2V5IG9mIE9iamVjdC5rZXlzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgIGlmIChoYW5kbGVyS2V5LmluY2x1ZGVzKG5hbWVzcGFjZSkpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gc3RvcmVFbGVtZW50RXZlbnRbaGFuZGxlcktleV1cbiAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGV2ZW50LmNhbGxhYmxlLCBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IpXG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFR5cGVFdmVudChldmVudCkge1xuICAvLyBhbGxvdyB0byBnZXQgdGhlIG5hdGl2ZSBldmVudHMgZnJvbSBuYW1lc3BhY2VkIGV2ZW50cyAoJ2NsaWNrLmJzLmJ1dHRvbicgLS0+ICdjbGljaycpXG4gIGV2ZW50ID0gZXZlbnQucmVwbGFjZShzdHJpcE5hbWVSZWdleCwgJycpXG4gIHJldHVybiBjdXN0b21FdmVudHNbZXZlbnRdIHx8IGV2ZW50XG59XG5cbmNvbnN0IEV2ZW50SGFuZGxlciA9IHtcbiAgb24oZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbikge1xuICAgIGFkZEhhbmRsZXIoZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbiwgZmFsc2UpXG4gIH0sXG5cbiAgb25lKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIHRydWUpXG4gIH0sXG5cbiAgb2ZmKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBpZiAodHlwZW9mIG9yaWdpbmFsVHlwZUV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XSA9IG5vcm1hbGl6ZVBhcmFtZXRlcnMob3JpZ2luYWxUeXBlRXZlbnQsIGhhbmRsZXIsIGRlbGVnYXRpb25GdW5jdGlvbilcbiAgICBjb25zdCBpbk5hbWVzcGFjZSA9IHR5cGVFdmVudCAhPT0gb3JpZ2luYWxUeXBlRXZlbnRcbiAgICBjb25zdCBldmVudHMgPSBnZXRFbGVtZW50RXZlbnRzKGVsZW1lbnQpXG4gICAgY29uc3Qgc3RvcmVFbGVtZW50RXZlbnQgPSBldmVudHNbdHlwZUV2ZW50XSB8fCB7fVxuICAgIGNvbnN0IGlzTmFtZXNwYWNlID0gb3JpZ2luYWxUeXBlRXZlbnQuc3RhcnRzV2l0aCgnLicpXG5cbiAgICBpZiAodHlwZW9mIGNhbGxhYmxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gU2ltcGxlc3QgY2FzZTogaGFuZGxlciBpcyBwYXNzZWQsIHJlbW92ZSB0aGF0IGxpc3RlbmVyIE9OTFkuXG4gICAgICBpZiAoIU9iamVjdC5rZXlzKHN0b3JlRWxlbWVudEV2ZW50KS5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGNhbGxhYmxlLCBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGlzTmFtZXNwYWNlKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnRFdmVudCBvZiBPYmplY3Qua2V5cyhldmVudHMpKSB7XG4gICAgICAgIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIGVsZW1lbnRFdmVudCwgb3JpZ2luYWxUeXBlRXZlbnQuc2xpY2UoMSkpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXlIYW5kbGVycyBvZiBPYmplY3Qua2V5cyhzdG9yZUVsZW1lbnRFdmVudCkpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJLZXkgPSBrZXlIYW5kbGVycy5yZXBsYWNlKHN0cmlwVWlkUmVnZXgsICcnKVxuXG4gICAgICBpZiAoIWluTmFtZXNwYWNlIHx8IG9yaWdpbmFsVHlwZUV2ZW50LmluY2x1ZGVzKGhhbmRsZXJLZXkpKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gc3RvcmVFbGVtZW50RXZlbnRba2V5SGFuZGxlcnNdXG4gICAgICAgIHJlbW92ZUhhbmRsZXIoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIGV2ZW50LmNhbGxhYmxlLCBldmVudC5kZWxlZ2F0aW9uU2VsZWN0b3IpXG4gICAgICB9XG4gICAgfVxuICB9LFxuXG4gIHRyaWdnZXIoZWxlbWVudCwgZXZlbnQsIGFyZ3MpIHtcbiAgICBpZiAodHlwZW9mIGV2ZW50ICE9PSAnc3RyaW5nJyB8fCAhZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KClcbiAgICBjb25zdCB0eXBlRXZlbnQgPSBnZXRUeXBlRXZlbnQoZXZlbnQpXG4gICAgY29uc3QgaW5OYW1lc3BhY2UgPSBldmVudCAhPT0gdHlwZUV2ZW50XG5cbiAgICBsZXQgalF1ZXJ5RXZlbnQgPSBudWxsXG4gICAgbGV0IGJ1YmJsZXMgPSB0cnVlXG4gICAgbGV0IG5hdGl2ZURpc3BhdGNoID0gdHJ1ZVxuICAgIGxldCBkZWZhdWx0UHJldmVudGVkID0gZmFsc2VcblxuICAgIGlmIChpbk5hbWVzcGFjZSAmJiAkKSB7XG4gICAgICBqUXVlcnlFdmVudCA9ICQuRXZlbnQoZXZlbnQsIGFyZ3MpXG5cbiAgICAgICQoZWxlbWVudCkudHJpZ2dlcihqUXVlcnlFdmVudClcbiAgICAgIGJ1YmJsZXMgPSAhalF1ZXJ5RXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKVxuICAgICAgbmF0aXZlRGlzcGF0Y2ggPSAhalF1ZXJ5RXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKVxuICAgICAgZGVmYXVsdFByZXZlbnRlZCA9IGpRdWVyeUV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpXG4gICAgfVxuXG4gICAgbGV0IGV2dCA9IG5ldyBFdmVudChldmVudCwgeyBidWJibGVzLCBjYW5jZWxhYmxlOiB0cnVlIH0pXG4gICAgZXZ0ID0gaHlkcmF0ZU9iaihldnQsIGFyZ3MpXG5cbiAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KClcbiAgICB9XG5cbiAgICBpZiAobmF0aXZlRGlzcGF0Y2gpIHtcbiAgICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChldnQpXG4gICAgfVxuXG4gICAgaWYgKGV2dC5kZWZhdWx0UHJldmVudGVkICYmIGpRdWVyeUV2ZW50KSB7XG4gICAgICBqUXVlcnlFdmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gICAgfVxuXG4gICAgcmV0dXJuIGV2dFxuICB9XG59XG5cbmZ1bmN0aW9uIGh5ZHJhdGVPYmoob2JqLCBtZXRhKSB7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG1ldGEgfHwge30pKSB7XG4gICAgdHJ5IHtcbiAgICAgIG9ialtrZXldID0gdmFsdWVcbiAgICB9IGNhdGNoIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldCgpIHtcbiAgICAgICAgICByZXR1cm4gdmFsdWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqXG59XG5cbmV4cG9ydCBkZWZhdWx0IEV2ZW50SGFuZGxlclxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4zKTogZG9tL2RhdGEuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IGVsZW1lbnRNYXAgPSBuZXcgTWFwKClcblxuZXhwb3J0IGRlZmF1bHQge1xuICBzZXQoZWxlbWVudCwga2V5LCBpbnN0YW5jZSkge1xuICAgIGlmICghZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIGVsZW1lbnRNYXAuc2V0KGVsZW1lbnQsIG5ldyBNYXAoKSlcbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpXG5cbiAgICAvLyBtYWtlIGl0IGNsZWFyIHdlIG9ubHkgd2FudCBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnRcbiAgICAvLyBjYW4gYmUgcmVtb3ZlZCBsYXRlciB3aGVuIG11bHRpcGxlIGtleS9pbnN0YW5jZXMgYXJlIGZpbmUgdG8gYmUgdXNlZFxuICAgIGlmICghaW5zdGFuY2VNYXAuaGFzKGtleSkgJiYgaW5zdGFuY2VNYXAuc2l6ZSAhPT0gMCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEJvb3RzdHJhcCBkb2Vzbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnQuIEJvdW5kIGluc3RhbmNlOiAke0FycmF5LmZyb20oaW5zdGFuY2VNYXAua2V5cygpKVswXX0uYClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKVxuICB9LFxuXG4gIGdldChlbGVtZW50LCBrZXkpIHtcbiAgICBpZiAoZWxlbWVudE1hcC5oYXMoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBlbGVtZW50TWFwLmdldChlbGVtZW50KS5nZXQoa2V5KSB8fCBudWxsXG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGxcbiAgfSxcblxuICByZW1vdmUoZWxlbWVudCwga2V5KSB7XG4gICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFuY2VNYXAgPSBlbGVtZW50TWFwLmdldChlbGVtZW50KVxuXG4gICAgaW5zdGFuY2VNYXAuZGVsZXRlKGtleSlcblxuICAgIC8vIGZyZWUgdXAgZWxlbWVudCByZWZlcmVuY2VzIGlmIHRoZXJlIGFyZSBubyBpbnN0YW5jZXMgbGVmdCBmb3IgYW4gZWxlbWVudFxuICAgIGlmIChpbnN0YW5jZU1hcC5zaXplID09PSAwKSB7XG4gICAgICBlbGVtZW50TWFwLmRlbGV0ZShlbGVtZW50KVxuICAgIH1cbiAgfVxufVxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4zKTogZG9tL21hbmlwdWxhdG9yLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuZnVuY3Rpb24gbm9ybWFsaXplRGF0YSh2YWx1ZSkge1xuICBpZiAodmFsdWUgPT09ICd0cnVlJykge1xuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gTnVtYmVyKHZhbHVlKS50b1N0cmluZygpKSB7XG4gICAgcmV0dXJuIE51bWJlcih2YWx1ZSlcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09ICdudWxsJykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVVUklDb21wb25lbnQodmFsdWUpKVxuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdmFsdWVcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVEYXRhS2V5KGtleSkge1xuICByZXR1cm4ga2V5LnJlcGxhY2UoL1tBLVpdL2csIGNociA9PiBgLSR7Y2hyLnRvTG93ZXJDYXNlKCl9YClcbn1cblxuY29uc3QgTWFuaXB1bGF0b3IgPSB7XG4gIHNldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5LCB2YWx1ZSkge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWAsIHZhbHVlKVxuICB9LFxuXG4gIHJlbW92ZURhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5KSB7XG4gICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoYGRhdGEtYnMtJHtub3JtYWxpemVEYXRhS2V5KGtleSl9YClcbiAgfSxcblxuICBnZXREYXRhQXR0cmlidXRlcyhlbGVtZW50KSB7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge31cbiAgICBjb25zdCBic0tleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50LmRhdGFzZXQpLmZpbHRlcihrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoJ2JzJykgJiYgIWtleS5zdGFydHNXaXRoKCdic0NvbmZpZycpKVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgYnNLZXlzKSB7XG4gICAgICBsZXQgcHVyZUtleSA9IGtleS5yZXBsYWNlKC9eYnMvLCAnJylcbiAgICAgIHB1cmVLZXkgPSBwdXJlS2V5LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgcHVyZUtleS5zbGljZSgxLCBwdXJlS2V5Lmxlbmd0aClcbiAgICAgIGF0dHJpYnV0ZXNbcHVyZUtleV0gPSBub3JtYWxpemVEYXRhKGVsZW1lbnQuZGF0YXNldFtrZXldKVxuICAgIH1cblxuICAgIHJldHVybiBhdHRyaWJ1dGVzXG4gIH0sXG5cbiAgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICByZXR1cm4gbm9ybWFsaXplRGF0YShlbGVtZW50LmdldEF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNYW5pcHVsYXRvclxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4zKTogdXRpbC9jb25maWcuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBpc0VsZW1lbnQsIHRvVHlwZSB9IGZyb20gJy4vaW5kZXgnXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi4vZG9tL21hbmlwdWxhdG9yJ1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDb25maWcge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIHt9XG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdZb3UgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIHN0YXRpYyBtZXRob2QgXCJOQU1FXCIsIGZvciBlYWNoIGNvbXBvbmVudCEnKVxuICB9XG5cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcpXG4gICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpXG4gICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZylcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfbWVyZ2VDb25maWdPYmooY29uZmlnLCBlbGVtZW50KSB7XG4gICAgY29uc3QganNvbkNvbmZpZyA9IGlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgJ2NvbmZpZycpIDoge30gLy8gdHJ5IHRvIHBhcnNlXG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LFxuICAgICAgLi4uKHR5cGVvZiBqc29uQ29uZmlnID09PSAnb2JqZWN0JyA/IGpzb25Db25maWcgOiB7fSksXG4gICAgICAuLi4oaXNFbGVtZW50KGVsZW1lbnQpID8gTWFuaXB1bGF0b3IuZ2V0RGF0YUF0dHJpYnV0ZXMoZWxlbWVudCkgOiB7fSksXG4gICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiB7fSlcbiAgICB9XG4gIH1cblxuICBfdHlwZUNoZWNrQ29uZmlnKGNvbmZpZywgY29uZmlnVHlwZXMgPSB0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRUeXBlKSB7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBPYmplY3Qua2V5cyhjb25maWdUeXBlcykpIHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkVHlwZXMgPSBjb25maWdUeXBlc1twcm9wZXJ0eV1cbiAgICAgIGNvbnN0IHZhbHVlID0gY29uZmlnW3Byb3BlcnR5XVxuICAgICAgY29uc3QgdmFsdWVUeXBlID0gaXNFbGVtZW50KHZhbHVlKSA/ICdlbGVtZW50JyA6IHRvVHlwZSh2YWx1ZSlcblxuICAgICAgaWYgKCFuZXcgUmVnRXhwKGV4cGVjdGVkVHlwZXMpLnRlc3QodmFsdWVUeXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGAke3RoaXMuY29uc3RydWN0b3IuTkFNRS50b1VwcGVyQ2FzZSgpfTogT3B0aW9uIFwiJHtwcm9wZXJ0eX1cIiBwcm92aWRlZCB0eXBlIFwiJHt2YWx1ZVR5cGV9XCIgYnV0IGV4cGVjdGVkIHR5cGUgXCIke2V4cGVjdGVkVHlwZXN9XCIuYFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbmZpZ1xuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4zKTogYmFzZS1jb21wb25lbnQuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgRGF0YSBmcm9tICcuL2RvbS9kYXRhJ1xuaW1wb3J0IHsgZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiwgZ2V0RWxlbWVudCB9IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBDb25maWcgZnJvbSAnLi91dGlsL2NvbmZpZydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBWRVJTSU9OID0gJzUuMi4zJ1xuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBCYXNlQ29tcG9uZW50IGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoKVxuXG4gICAgZWxlbWVudCA9IGdldEVsZW1lbnQoZWxlbWVudClcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50XG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcblxuICAgIERhdGEuc2V0KHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVksIHRoaXMpXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZGlzcG9zZSgpIHtcbiAgICBEYXRhLnJlbW92ZSh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKVxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpXG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuICAgICAgdGhpc1twcm9wZXJ0eU5hbWVdID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIF9xdWV1ZUNhbGxiYWNrKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkID0gdHJ1ZSkge1xuICAgIGV4ZWN1dGVBZnRlclRyYW5zaXRpb24oY2FsbGJhY2ssIGVsZW1lbnQsIGlzQW5pbWF0ZWQpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHRoaXMuX21lcmdlQ29uZmlnT2JqKGNvbmZpZywgdGhpcy5fZWxlbWVudClcbiAgICBjb25maWcgPSB0aGlzLl9jb25maWdBZnRlck1lcmdlKGNvbmZpZylcbiAgICB0aGlzLl90eXBlQ2hlY2tDb25maWcoY29uZmlnKVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgZ2V0SW5zdGFuY2UoZWxlbWVudCkge1xuICAgIHJldHVybiBEYXRhLmdldChnZXRFbGVtZW50KGVsZW1lbnQpLCB0aGlzLkRBVEFfS0VZKVxuICB9XG5cbiAgc3RhdGljIGdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgY29uZmlnID0ge30pIHtcbiAgICByZXR1cm4gdGhpcy5nZXRJbnN0YW5jZShlbGVtZW50KSB8fCBuZXcgdGhpcyhlbGVtZW50LCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGwpXG4gIH1cblxuICBzdGF0aWMgZ2V0IFZFUlNJT04oKSB7XG4gICAgcmV0dXJuIFZFUlNJT05cbiAgfVxuXG4gIHN0YXRpYyBnZXQgREFUQV9LRVkoKSB7XG4gICAgcmV0dXJuIGBicy4ke3RoaXMuTkFNRX1gXG4gIH1cblxuICBzdGF0aWMgZ2V0IEVWRU5UX0tFWSgpIHtcbiAgICByZXR1cm4gYC4ke3RoaXMuREFUQV9LRVl9YFxuICB9XG5cbiAgc3RhdGljIGV2ZW50TmFtZShuYW1lKSB7XG4gICAgcmV0dXJuIGAke25hbWV9JHt0aGlzLkVWRU5UX0tFWX1gXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmFzZUNvbXBvbmVudFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4zKTogdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCB7IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IsIGlzRGlzYWJsZWQgfSBmcm9tICcuL2luZGV4J1xuXG5jb25zdCBlbmFibGVEaXNtaXNzVHJpZ2dlciA9IChjb21wb25lbnQsIG1ldGhvZCA9ICdoaWRlJykgPT4ge1xuICBjb25zdCBjbGlja0V2ZW50ID0gYGNsaWNrLmRpc21pc3Mke2NvbXBvbmVudC5FVkVOVF9LRVl9YFxuICBjb25zdCBuYW1lID0gY29tcG9uZW50Lk5BTUVcblxuICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIGNsaWNrRXZlbnQsIGBbZGF0YS1icy1kaXNtaXNzPVwiJHtuYW1lfVwiXWAsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICB9XG5cbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0aGlzKSB8fCB0aGlzLmNsb3Nlc3QoYC4ke25hbWV9YClcbiAgICBjb25zdCBpbnN0YW5jZSA9IGNvbXBvbmVudC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldClcblxuICAgIC8vIE1ldGhvZCBhcmd1bWVudCBpcyBsZWZ0LCBmb3IgQWxlcnQgYW5kIG9ubHksIGFzIGl0IGRvZXNuJ3QgaW1wbGVtZW50IHRoZSAnaGlkZScgbWV0aG9kXG4gICAgaW5zdGFuY2VbbWV0aG9kXSgpXG4gIH0pXG59XG5cbmV4cG9ydCB7XG4gIGVuYWJsZURpc21pc3NUcmlnZ2VyXG59XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjMpOiBhbGVydC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiB9IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5pbXBvcnQgeyBlbmFibGVEaXNtaXNzVHJpZ2dlciB9IGZyb20gJy4vdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnYWxlcnQnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5hbGVydCdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5cbmNvbnN0IEVWRU5UX0NMT1NFID0gYGNsb3NlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xPU0VEID0gYGNsb3NlZCR7RVZFTlRfS0VZfWBcbmNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEFsZXJ0IGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgY2xvc2UoKSB7XG4gICAgY29uc3QgY2xvc2VFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0NMT1NFKVxuXG4gICAgaWYgKGNsb3NlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcblxuICAgIGNvbnN0IGlzQW5pbWF0ZWQgPSB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB0aGlzLl9kZXN0cm95RWxlbWVudCgpLCB0aGlzLl9lbGVtZW50LCBpc0FuaW1hdGVkKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZGVzdHJveUVsZW1lbnQoKSB7XG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKVxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0NMT1NFRClcbiAgICB0aGlzLmRpc3Bvc2UoKVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQWxlcnQuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSh0aGlzKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbmVuYWJsZURpc21pc3NUcmlnZ2VyKEFsZXJ0LCAnY2xvc2UnKVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihBbGVydClcblxuZXhwb3J0IGRlZmF1bHQgQWxlcnRcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMyk6IGJ1dHRvbi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiB9IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdidXR0b24nXG5jb25zdCBEQVRBX0tFWSA9ICdicy5idXR0b24nXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwiYnV0dG9uXCJdJ1xuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJ1dHRvbiBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICAvLyBUb2dnbGUgY2xhc3MgYW5kIHN5bmMgdGhlIGBhcmlhLXByZXNzZWRgIGF0dHJpYnV0ZSB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGAudG9nZ2xlKClgIG1ldGhvZFxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLXByZXNzZWQnLCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoQ0xBU1NfTkFNRV9BQ1RJVkUpKVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gQnV0dG9uLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcylcblxuICAgICAgaWYgKGNvbmZpZyA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgZGF0YVtjb25maWddKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZXZlbnQgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgY29uc3QgYnV0dG9uID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoU0VMRUNUT1JfREFUQV9UT0dHTEUpXG4gIGNvbnN0IGRhdGEgPSBCdXR0b24uZ2V0T3JDcmVhdGVJbnN0YW5jZShidXR0b24pXG5cbiAgZGF0YS50b2dnbGUoKVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQnV0dG9uKVxuXG5leHBvcnQgZGVmYXVsdCBCdXR0b25cbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMyk6IGRvbS9zZWxlY3Rvci1lbmdpbmUuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBpc0Rpc2FibGVkLCBpc1Zpc2libGUgfSBmcm9tICcuLi91dGlsL2luZGV4J1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IFNlbGVjdG9yRW5naW5lID0ge1xuICBmaW5kKHNlbGVjdG9yLCBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCguLi5FbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZWxlbWVudCwgc2VsZWN0b3IpKVxuICB9LFxuXG4gIGZpbmRPbmUoc2VsZWN0b3IsIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICByZXR1cm4gRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3Rvci5jYWxsKGVsZW1lbnQsIHNlbGVjdG9yKVxuICB9LFxuXG4gIGNoaWxkcmVuKGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuIFtdLmNvbmNhdCguLi5lbGVtZW50LmNoaWxkcmVuKS5maWx0ZXIoY2hpbGQgPT4gY2hpbGQubWF0Y2hlcyhzZWxlY3RvcikpXG4gIH0sXG5cbiAgcGFyZW50cyhlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgIGNvbnN0IHBhcmVudHMgPSBbXVxuICAgIGxldCBhbmNlc3RvciA9IGVsZW1lbnQucGFyZW50Tm9kZS5jbG9zZXN0KHNlbGVjdG9yKVxuXG4gICAgd2hpbGUgKGFuY2VzdG9yKSB7XG4gICAgICBwYXJlbnRzLnB1c2goYW5jZXN0b3IpXG4gICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudE5vZGUuY2xvc2VzdChzZWxlY3RvcilcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyZW50c1xuICB9LFxuXG4gIHByZXYoZWxlbWVudCwgc2VsZWN0b3IpIHtcbiAgICBsZXQgcHJldmlvdXMgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmdcblxuICAgIHdoaWxlIChwcmV2aW91cykge1xuICAgICAgaWYgKHByZXZpb3VzLm1hdGNoZXMoc2VsZWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBbcHJldmlvdXNdXG4gICAgICB9XG5cbiAgICAgIHByZXZpb3VzID0gcHJldmlvdXMucHJldmlvdXNFbGVtZW50U2libGluZ1xuICAgIH1cblxuICAgIHJldHVybiBbXVxuICB9LFxuICAvLyBUT0RPOiB0aGlzIGlzIG5vdyB1bnVzZWQ7IHJlbW92ZSBsYXRlciBhbG9uZyB3aXRoIHByZXYoKVxuICBuZXh0KGVsZW1lbnQsIHNlbGVjdG9yKSB7XG4gICAgbGV0IG5leHQgPSBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZ1xuXG4gICAgd2hpbGUgKG5leHQpIHtcbiAgICAgIGlmIChuZXh0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XG4gICAgICAgIHJldHVybiBbbmV4dF1cbiAgICAgIH1cblxuICAgICAgbmV4dCA9IG5leHQubmV4dEVsZW1lbnRTaWJsaW5nXG4gICAgfVxuXG4gICAgcmV0dXJuIFtdXG4gIH0sXG5cbiAgZm9jdXNhYmxlQ2hpbGRyZW4oZWxlbWVudCkge1xuICAgIGNvbnN0IGZvY3VzYWJsZXMgPSBbXG4gICAgICAnYScsXG4gICAgICAnYnV0dG9uJyxcbiAgICAgICdpbnB1dCcsXG4gICAgICAndGV4dGFyZWEnLFxuICAgICAgJ3NlbGVjdCcsXG4gICAgICAnZGV0YWlscycsXG4gICAgICAnW3RhYmluZGV4XScsXG4gICAgICAnW2NvbnRlbnRlZGl0YWJsZT1cInRydWVcIl0nXG4gICAgXS5tYXAoc2VsZWN0b3IgPT4gYCR7c2VsZWN0b3J9Om5vdChbdGFiaW5kZXhePVwiLVwiXSlgKS5qb2luKCcsJylcblxuICAgIHJldHVybiB0aGlzLmZpbmQoZm9jdXNhYmxlcywgZWxlbWVudCkuZmlsdGVyKGVsID0+ICFpc0Rpc2FibGVkKGVsKSAmJiBpc1Zpc2libGUoZWwpKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNlbGVjdG9yRW5naW5lXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjMpOiB1dGlsL3N3aXBlLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IENvbmZpZyBmcm9tICcuL2NvbmZpZydcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgeyBleGVjdXRlIH0gZnJvbSAnLi9pbmRleCdcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3N3aXBlJ1xuY29uc3QgRVZFTlRfS0VZID0gJy5icy5zd2lwZSdcbmNvbnN0IEVWRU5UX1RPVUNIU1RBUlQgPSBgdG91Y2hzdGFydCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1RPVUNITU9WRSA9IGB0b3VjaG1vdmUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9UT1VDSEVORCA9IGB0b3VjaGVuZCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1BPSU5URVJET1dOID0gYHBvaW50ZXJkb3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfUE9JTlRFUlVQID0gYHBvaW50ZXJ1cCR7RVZFTlRfS0VZfWBcbmNvbnN0IFBPSU5URVJfVFlQRV9UT1VDSCA9ICd0b3VjaCdcbmNvbnN0IFBPSU5URVJfVFlQRV9QRU4gPSAncGVuJ1xuY29uc3QgQ0xBU1NfTkFNRV9QT0lOVEVSX0VWRU5UID0gJ3BvaW50ZXItZXZlbnQnXG5jb25zdCBTV0lQRV9USFJFU0hPTEQgPSA0MFxuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBlbmRDYWxsYmFjazogbnVsbCxcbiAgbGVmdENhbGxiYWNrOiBudWxsLFxuICByaWdodENhbGxiYWNrOiBudWxsXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBlbmRDYWxsYmFjazogJyhmdW5jdGlvbnxudWxsKScsXG4gIGxlZnRDYWxsYmFjazogJyhmdW5jdGlvbnxudWxsKScsXG4gIHJpZ2h0Q2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIFN3aXBlIGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50XG5cbiAgICBpZiAoIWVsZW1lbnQgfHwgIVN3aXBlLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG4gICAgdGhpcy5fZGVsdGFYID0gMFxuICAgIHRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzID0gQm9vbGVhbih3aW5kb3cuUG9pbnRlckV2ZW50KVxuICAgIHRoaXMuX2luaXRFdmVudHMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBkaXNwb3NlKCkge1xuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfc3RhcnQoZXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzKSB7XG4gICAgICB0aGlzLl9kZWx0YVggPSBldmVudC50b3VjaGVzWzBdLmNsaWVudFhcblxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2V2ZW50SXNQb2ludGVyUGVuVG91Y2goZXZlbnQpKSB7XG4gICAgICB0aGlzLl9kZWx0YVggPSBldmVudC5jbGllbnRYXG4gICAgfVxuICB9XG5cbiAgX2VuZChldmVudCkge1xuICAgIGlmICh0aGlzLl9ldmVudElzUG9pbnRlclBlblRvdWNoKGV2ZW50KSkge1xuICAgICAgdGhpcy5fZGVsdGFYID0gZXZlbnQuY2xpZW50WCAtIHRoaXMuX2RlbHRhWFxuICAgIH1cblxuICAgIHRoaXMuX2hhbmRsZVN3aXBlKClcbiAgICBleGVjdXRlKHRoaXMuX2NvbmZpZy5lbmRDYWxsYmFjaylcbiAgfVxuXG4gIF9tb3ZlKGV2ZW50KSB7XG4gICAgdGhpcy5fZGVsdGFYID0gZXZlbnQudG91Y2hlcyAmJiBldmVudC50b3VjaGVzLmxlbmd0aCA+IDEgP1xuICAgICAgMCA6XG4gICAgICBldmVudC50b3VjaGVzWzBdLmNsaWVudFggLSB0aGlzLl9kZWx0YVhcbiAgfVxuXG4gIF9oYW5kbGVTd2lwZSgpIHtcbiAgICBjb25zdCBhYnNEZWx0YVggPSBNYXRoLmFicyh0aGlzLl9kZWx0YVgpXG5cbiAgICBpZiAoYWJzRGVsdGFYIDw9IFNXSVBFX1RIUkVTSE9MRCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZGlyZWN0aW9uID0gYWJzRGVsdGFYIC8gdGhpcy5fZGVsdGFYXG5cbiAgICB0aGlzLl9kZWx0YVggPSAwXG5cbiAgICBpZiAoIWRpcmVjdGlvbikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZXhlY3V0ZShkaXJlY3Rpb24gPiAwID8gdGhpcy5fY29uZmlnLnJpZ2h0Q2FsbGJhY2sgOiB0aGlzLl9jb25maWcubGVmdENhbGxiYWNrKVxuICB9XG5cbiAgX2luaXRFdmVudHMoKSB7XG4gICAgaWYgKHRoaXMuX3N1cHBvcnRQb2ludGVyRXZlbnRzKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfUE9JTlRFUkRPV04sIGV2ZW50ID0+IHRoaXMuX3N0YXJ0KGV2ZW50KSlcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9QT0lOVEVSVVAsIGV2ZW50ID0+IHRoaXMuX2VuZChldmVudCkpXG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQpXG4gICAgfSBlbHNlIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9UT1VDSFNUQVJULCBldmVudCA9PiB0aGlzLl9zdGFydChldmVudCkpXG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfVE9VQ0hNT1ZFLCBldmVudCA9PiB0aGlzLl9tb3ZlKGV2ZW50KSlcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9UT1VDSEVORCwgZXZlbnQgPT4gdGhpcy5fZW5kKGV2ZW50KSlcbiAgICB9XG4gIH1cblxuICBfZXZlbnRJc1BvaW50ZXJQZW5Ub3VjaChldmVudCkge1xuICAgIHJldHVybiB0aGlzLl9zdXBwb3J0UG9pbnRlckV2ZW50cyAmJiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFBPSU5URVJfVFlQRV9QRU4gfHwgZXZlbnQucG9pbnRlclR5cGUgPT09IFBPSU5URVJfVFlQRV9UT1VDSClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgaXNTdXBwb3J0ZWQoKSB7XG4gICAgcmV0dXJuICdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3dpcGVcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMyk6IGNhcm91c2VsLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBnZXRFbGVtZW50RnJvbVNlbGVjdG9yLFxuICBnZXROZXh0QWN0aXZlRWxlbWVudCxcbiAgaXNSVEwsXG4gIGlzVmlzaWJsZSxcbiAgcmVmbG93LFxuICB0cmlnZ2VyVHJhbnNpdGlvbkVuZFxufSBmcm9tICcuL3V0aWwvaW5kZXgnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi9kb20vbWFuaXB1bGF0b3InXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lJ1xuaW1wb3J0IFN3aXBlIGZyb20gJy4vdXRpbC9zd2lwZSdcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdjYXJvdXNlbCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLmNhcm91c2VsJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IEFSUk9XX0xFRlRfS0VZID0gJ0Fycm93TGVmdCdcbmNvbnN0IEFSUk9XX1JJR0hUX0tFWSA9ICdBcnJvd1JpZ2h0J1xuY29uc3QgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCA9IDUwMCAvLyBUaW1lIGZvciBtb3VzZSBjb21wYXQgZXZlbnRzIHRvIGZpcmUgYWZ0ZXIgdG91Y2hcblxuY29uc3QgT1JERVJfTkVYVCA9ICduZXh0J1xuY29uc3QgT1JERVJfUFJFViA9ICdwcmV2J1xuY29uc3QgRElSRUNUSU9OX0xFRlQgPSAnbGVmdCdcbmNvbnN0IERJUkVDVElPTl9SSUdIVCA9ICdyaWdodCdcblxuY29uc3QgRVZFTlRfU0xJREUgPSBgc2xpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TTElEID0gYHNsaWQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9LRVlET1dOID0gYGtleWRvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRUVOVEVSID0gYG1vdXNlZW50ZXIke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRUxFQVZFID0gYG1vdXNlbGVhdmUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9EUkFHX1NUQVJUID0gYGRyYWdzdGFydCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0xPQURfREFUQV9BUEkgPSBgbG9hZCR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX0NBUk9VU0VMID0gJ2Nhcm91c2VsJ1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuY29uc3QgQ0xBU1NfTkFNRV9TTElERSA9ICdzbGlkZSdcbmNvbnN0IENMQVNTX05BTUVfRU5EID0gJ2Nhcm91c2VsLWl0ZW0tZW5kJ1xuY29uc3QgQ0xBU1NfTkFNRV9TVEFSVCA9ICdjYXJvdXNlbC1pdGVtLXN0YXJ0J1xuY29uc3QgQ0xBU1NfTkFNRV9ORVhUID0gJ2Nhcm91c2VsLWl0ZW0tbmV4dCdcbmNvbnN0IENMQVNTX05BTUVfUFJFViA9ICdjYXJvdXNlbC1pdGVtLXByZXYnXG5cbmNvbnN0IFNFTEVDVE9SX0FDVElWRSA9ICcuYWN0aXZlJ1xuY29uc3QgU0VMRUNUT1JfSVRFTSA9ICcuY2Fyb3VzZWwtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0FDVElWRV9JVEVNID0gU0VMRUNUT1JfQUNUSVZFICsgU0VMRUNUT1JfSVRFTVxuY29uc3QgU0VMRUNUT1JfSVRFTV9JTUcgPSAnLmNhcm91c2VsLWl0ZW0gaW1nJ1xuY29uc3QgU0VMRUNUT1JfSU5ESUNBVE9SUyA9ICcuY2Fyb3VzZWwtaW5kaWNhdG9ycydcbmNvbnN0IFNFTEVDVE9SX0RBVEFfU0xJREUgPSAnW2RhdGEtYnMtc2xpZGVdLCBbZGF0YS1icy1zbGlkZS10b10nXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1JJREUgPSAnW2RhdGEtYnMtcmlkZT1cImNhcm91c2VsXCJdJ1xuXG5jb25zdCBLRVlfVE9fRElSRUNUSU9OID0ge1xuICBbQVJST1dfTEVGVF9LRVldOiBESVJFQ1RJT05fUklHSFQsXG4gIFtBUlJPV19SSUdIVF9LRVldOiBESVJFQ1RJT05fTEVGVFxufVxuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBpbnRlcnZhbDogNTAwMCxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIHBhdXNlOiAnaG92ZXInLFxuICByaWRlOiBmYWxzZSxcbiAgdG91Y2g6IHRydWUsXG4gIHdyYXA6IHRydWVcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGludGVydmFsOiAnKG51bWJlcnxib29sZWFuKScsIC8vIFRPRE86djYgcmVtb3ZlIGJvb2xlYW4gc3VwcG9ydFxuICBrZXlib2FyZDogJ2Jvb2xlYW4nLFxuICBwYXVzZTogJyhzdHJpbmd8Ym9vbGVhbiknLFxuICByaWRlOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIHRvdWNoOiAnYm9vbGVhbicsXG4gIHdyYXA6ICdib29sZWFuJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBDYXJvdXNlbCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9pbnRlcnZhbCA9IG51bGxcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbnVsbFxuICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlXG4gICAgdGhpcy50b3VjaFRpbWVvdXQgPSBudWxsXG4gICAgdGhpcy5fc3dpcGVIZWxwZXIgPSBudWxsXG5cbiAgICB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudCA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfSU5ESUNBVE9SUywgdGhpcy5fZWxlbWVudClcbiAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpXG5cbiAgICBpZiAodGhpcy5fY29uZmlnLnJpZGUgPT09IENMQVNTX05BTUVfQ0FST1VTRUwpIHtcbiAgICAgIHRoaXMuY3ljbGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgbmV4dCgpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9ORVhUKVxuICB9XG5cbiAgbmV4dFdoZW5WaXNpYmxlKCkge1xuICAgIC8vIEZJWE1FIFRPRE8gdXNlIGBkb2N1bWVudC52aXNpYmlsaXR5U3RhdGVgXG4gICAgLy8gRG9uJ3QgY2FsbCBuZXh0IHdoZW4gdGhlIHBhZ2UgaXNuJ3QgdmlzaWJsZVxuICAgIC8vIG9yIHRoZSBjYXJvdXNlbCBvciBpdHMgcGFyZW50IGlzbid0IHZpc2libGVcbiAgICBpZiAoIWRvY3VtZW50LmhpZGRlbiAmJiBpc1Zpc2libGUodGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIHRoaXMubmV4dCgpXG4gICAgfVxuICB9XG5cbiAgcHJldigpIHtcbiAgICB0aGlzLl9zbGlkZShPUkRFUl9QUkVWKVxuICB9XG5cbiAgcGF1c2UoKSB7XG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgdHJpZ2dlclRyYW5zaXRpb25FbmQodGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICB0aGlzLl9jbGVhckludGVydmFsKClcbiAgfVxuXG4gIGN5Y2xlKCkge1xuICAgIHRoaXMuX2NsZWFySW50ZXJ2YWwoKVxuICAgIHRoaXMuX3VwZGF0ZUludGVydmFsKClcblxuICAgIHRoaXMuX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5uZXh0V2hlblZpc2libGUoKSwgdGhpcy5fY29uZmlnLmludGVydmFsKVxuICB9XG5cbiAgX21heWJlRW5hYmxlQ3ljbGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcucmlkZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2lzU2xpZGluZykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uZSh0aGlzLl9lbGVtZW50LCBFVkVOVF9TTElELCAoKSA9PiB0aGlzLmN5Y2xlKCkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLmN5Y2xlKClcbiAgfVxuXG4gIHRvKGluZGV4KSB7XG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLl9nZXRJdGVtcygpXG4gICAgaWYgKGluZGV4ID4gaXRlbXMubGVuZ3RoIC0gMSB8fCBpbmRleCA8IDApIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9pc1NsaWRpbmcpIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vbmUodGhpcy5fZWxlbWVudCwgRVZFTlRfU0xJRCwgKCkgPT4gdGhpcy50byhpbmRleCkpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVJbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleCh0aGlzLl9nZXRBY3RpdmUoKSlcbiAgICBpZiAoYWN0aXZlSW5kZXggPT09IGluZGV4KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBvcmRlciA9IGluZGV4ID4gYWN0aXZlSW5kZXggPyBPUkRFUl9ORVhUIDogT1JERVJfUFJFVlxuXG4gICAgdGhpcy5fc2xpZGUob3JkZXIsIGl0ZW1zW2luZGV4XSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuX3N3aXBlSGVscGVyKSB7XG4gICAgICB0aGlzLl9zd2lwZUhlbHBlci5kaXNwb3NlKClcbiAgICB9XG5cbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgY29uZmlnLmRlZmF1bHRJbnRlcnZhbCA9IGNvbmZpZy5pbnRlcnZhbFxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTiwgZXZlbnQgPT4gdGhpcy5fa2V5ZG93bihldmVudCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5wYXVzZSA9PT0gJ2hvdmVyJykge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRU5URVIsICgpID0+IHRoaXMucGF1c2UoKSlcbiAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRUxFQVZFLCAoKSA9PiB0aGlzLl9tYXliZUVuYWJsZUN5Y2xlKCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy50b3VjaCAmJiBTd2lwZS5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICB0aGlzLl9hZGRUb3VjaEV2ZW50TGlzdGVuZXJzKClcbiAgICB9XG4gIH1cblxuICBfYWRkVG91Y2hFdmVudExpc3RlbmVycygpIHtcbiAgICBmb3IgKGNvbnN0IGltZyBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lURU1fSU1HLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKGltZywgRVZFTlRfRFJBR19TVEFSVCwgZXZlbnQgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSlcbiAgICB9XG5cbiAgICBjb25zdCBlbmRDYWxsQmFjayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcucGF1c2UgIT09ICdob3ZlcicpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGl0J3MgYSB0b3VjaC1lbmFibGVkIGRldmljZSwgbW91c2VlbnRlci9sZWF2ZSBhcmUgZmlyZWQgYXNcbiAgICAgIC8vIHBhcnQgb2YgdGhlIG1vdXNlIGNvbXBhdGliaWxpdHkgZXZlbnRzIG9uIGZpcnN0IHRhcCAtIHRoZSBjYXJvdXNlbFxuICAgICAgLy8gd291bGQgc3RvcCBjeWNsaW5nIHVudGlsIHVzZXIgdGFwcGVkIG91dCBvZiBpdDtcbiAgICAgIC8vIGhlcmUsIHdlIGxpc3RlbiBmb3IgdG91Y2hlbmQsIGV4cGxpY2l0bHkgcGF1c2UgdGhlIGNhcm91c2VsXG4gICAgICAvLyAoYXMgaWYgaXQncyB0aGUgc2Vjb25kIHRpbWUgd2UgdGFwIG9uIGl0LCBtb3VzZWVudGVyIGNvbXBhdCBldmVudFxuICAgICAgLy8gaXMgTk9UIGZpcmVkKSBhbmQgYWZ0ZXIgYSB0aW1lb3V0ICh0byBhbGxvdyBmb3IgbW91c2UgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gZXZlbnRzIHRvIGZpcmUpIHdlIGV4cGxpY2l0bHkgcmVzdGFydCBjeWNsaW5nXG5cbiAgICAgIHRoaXMucGF1c2UoKVxuICAgICAgaWYgKHRoaXMudG91Y2hUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvdWNoVGltZW91dClcbiAgICAgIH1cblxuICAgICAgdGhpcy50b3VjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuX21heWJlRW5hYmxlQ3ljbGUoKSwgVE9VQ0hFVkVOVF9DT01QQVRfV0FJVCArIHRoaXMuX2NvbmZpZy5pbnRlcnZhbClcbiAgICB9XG5cbiAgICBjb25zdCBzd2lwZUNvbmZpZyA9IHtcbiAgICAgIGxlZnRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fTEVGVCkpLFxuICAgICAgcmlnaHRDYWxsYmFjazogKCkgPT4gdGhpcy5fc2xpZGUodGhpcy5fZGlyZWN0aW9uVG9PcmRlcihESVJFQ1RJT05fUklHSFQpKSxcbiAgICAgIGVuZENhbGxiYWNrOiBlbmRDYWxsQmFja1xuICAgIH1cblxuICAgIHRoaXMuX3N3aXBlSGVscGVyID0gbmV3IFN3aXBlKHRoaXMuX2VsZW1lbnQsIHN3aXBlQ29uZmlnKVxuICB9XG5cbiAgX2tleWRvd24oZXZlbnQpIHtcbiAgICBpZiAoL2lucHV0fHRleHRhcmVhL2kudGVzdChldmVudC50YXJnZXQudGFnTmFtZSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IEtFWV9UT19ESVJFQ1RJT05bZXZlbnQua2V5XVxuICAgIGlmIChkaXJlY3Rpb24pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KClcbiAgICAgIHRoaXMuX3NsaWRlKHRoaXMuX2RpcmVjdGlvblRvT3JkZXIoZGlyZWN0aW9uKSlcbiAgICB9XG4gIH1cblxuICBfZ2V0SXRlbUluZGV4KGVsZW1lbnQpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0SXRlbXMoKS5pbmRleE9mKGVsZW1lbnQpXG4gIH1cblxuICBfc2V0QWN0aXZlSW5kaWNhdG9yRWxlbWVudChpbmRleCkge1xuICAgIGlmICghdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGFjdGl2ZUluZGljYXRvciA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfQUNUSVZFLCB0aGlzLl9pbmRpY2F0b3JzRWxlbWVudClcblxuICAgIGFjdGl2ZUluZGljYXRvci5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuICAgIGFjdGl2ZUluZGljYXRvci5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcpXG5cbiAgICBjb25zdCBuZXdBY3RpdmVJbmRpY2F0b3IgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKGBbZGF0YS1icy1zbGlkZS10bz1cIiR7aW5kZXh9XCJdYCwgdGhpcy5faW5kaWNhdG9yc0VsZW1lbnQpXG5cbiAgICBpZiAobmV3QWN0aXZlSW5kaWNhdG9yKSB7XG4gICAgICBuZXdBY3RpdmVJbmRpY2F0b3IuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcbiAgICAgIG5ld0FjdGl2ZUluZGljYXRvci5zZXRBdHRyaWJ1dGUoJ2FyaWEtY3VycmVudCcsICd0cnVlJylcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlSW50ZXJ2YWwoKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2FjdGl2ZUVsZW1lbnQgfHwgdGhpcy5fZ2V0QWN0aXZlKClcblxuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudEludGVydmFsID0gTnVtYmVyLnBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLWludGVydmFsJyksIDEwKVxuXG4gICAgdGhpcy5fY29uZmlnLmludGVydmFsID0gZWxlbWVudEludGVydmFsIHx8IHRoaXMuX2NvbmZpZy5kZWZhdWx0SW50ZXJ2YWxcbiAgfVxuXG4gIF9zbGlkZShvcmRlciwgZWxlbWVudCA9IG51bGwpIHtcbiAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5fZ2V0QWN0aXZlKClcbiAgICBjb25zdCBpc05leHQgPSBvcmRlciA9PT0gT1JERVJfTkVYVFxuICAgIGNvbnN0IG5leHRFbGVtZW50ID0gZWxlbWVudCB8fCBnZXROZXh0QWN0aXZlRWxlbWVudCh0aGlzLl9nZXRJdGVtcygpLCBhY3RpdmVFbGVtZW50LCBpc05leHQsIHRoaXMuX2NvbmZpZy53cmFwKVxuXG4gICAgaWYgKG5leHRFbGVtZW50ID09PSBhY3RpdmVFbGVtZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBuZXh0RWxlbWVudEluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4KG5leHRFbGVtZW50KVxuXG4gICAgY29uc3QgdHJpZ2dlckV2ZW50ID0gZXZlbnROYW1lID0+IHtcbiAgICAgIHJldHVybiBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBldmVudE5hbWUsIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldDogbmV4dEVsZW1lbnQsXG4gICAgICAgIGRpcmVjdGlvbjogdGhpcy5fb3JkZXJUb0RpcmVjdGlvbihvcmRlciksXG4gICAgICAgIGZyb206IHRoaXMuX2dldEl0ZW1JbmRleChhY3RpdmVFbGVtZW50KSxcbiAgICAgICAgdG86IG5leHRFbGVtZW50SW5kZXhcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgY29uc3Qgc2xpZGVFdmVudCA9IHRyaWdnZXJFdmVudChFVkVOVF9TTElERSlcblxuICAgIGlmIChzbGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCAhbmV4dEVsZW1lbnQpIHtcbiAgICAgIC8vIFNvbWUgd2VpcmRuZXNzIGlzIGhhcHBlbmluZywgc28gd2UgYmFpbFxuICAgICAgLy8gdG9kbzogY2hhbmdlIHRlc3RzIHRoYXQgdXNlIGVtcHR5IGRpdnMgdG8gYXZvaWQgdGhpcyBjaGVja1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaXNDeWNsaW5nID0gQm9vbGVhbih0aGlzLl9pbnRlcnZhbClcbiAgICB0aGlzLnBhdXNlKClcblxuICAgIHRoaXMuX2lzU2xpZGluZyA9IHRydWVcblxuICAgIHRoaXMuX3NldEFjdGl2ZUluZGljYXRvckVsZW1lbnQobmV4dEVsZW1lbnRJbmRleClcbiAgICB0aGlzLl9hY3RpdmVFbGVtZW50ID0gbmV4dEVsZW1lbnRcblxuICAgIGNvbnN0IGRpcmVjdGlvbmFsQ2xhc3NOYW1lID0gaXNOZXh0ID8gQ0xBU1NfTkFNRV9TVEFSVCA6IENMQVNTX05BTUVfRU5EXG4gICAgY29uc3Qgb3JkZXJDbGFzc05hbWUgPSBpc05leHQgPyBDTEFTU19OQU1FX05FWFQgOiBDTEFTU19OQU1FX1BSRVZcblxuICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQob3JkZXJDbGFzc05hbWUpXG5cbiAgICByZWZsb3cobmV4dEVsZW1lbnQpXG5cbiAgICBhY3RpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoZGlyZWN0aW9uYWxDbGFzc05hbWUpXG4gICAgbmV4dEVsZW1lbnQuY2xhc3NMaXN0LmFkZChkaXJlY3Rpb25hbENsYXNzTmFtZSlcblxuICAgIGNvbnN0IGNvbXBsZXRlQ2FsbEJhY2sgPSAoKSA9PiB7XG4gICAgICBuZXh0RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGRpcmVjdGlvbmFsQ2xhc3NOYW1lLCBvcmRlckNsYXNzTmFtZSlcbiAgICAgIG5leHRFbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG5cbiAgICAgIGFjdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0FDVElWRSwgb3JkZXJDbGFzc05hbWUsIGRpcmVjdGlvbmFsQ2xhc3NOYW1lKVxuXG4gICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZVxuXG4gICAgICB0cmlnZ2VyRXZlbnQoRVZFTlRfU0xJRClcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbEJhY2ssIGFjdGl2ZUVsZW1lbnQsIHRoaXMuX2lzQW5pbWF0ZWQoKSlcblxuICAgIGlmIChpc0N5Y2xpbmcpIHtcbiAgICAgIHRoaXMuY3ljbGUoKVxuICAgIH1cbiAgfVxuXG4gIF9pc0FuaW1hdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NMSURFKVxuICB9XG5cbiAgX2dldEFjdGl2ZSgpIHtcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9BQ1RJVkVfSVRFTSwgdGhpcy5fZWxlbWVudClcbiAgfVxuXG4gIF9nZXRJdGVtcygpIHtcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9JVEVNLCB0aGlzLl9lbGVtZW50KVxuICB9XG5cbiAgX2NsZWFySW50ZXJ2YWwoKSB7XG4gICAgaWYgKHRoaXMuX2ludGVydmFsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuX2ludGVydmFsKVxuICAgICAgdGhpcy5faW50ZXJ2YWwgPSBudWxsXG4gICAgfVxuICB9XG5cbiAgX2RpcmVjdGlvblRvT3JkZXIoZGlyZWN0aW9uKSB7XG4gICAgaWYgKGlzUlRMKCkpIHtcbiAgICAgIHJldHVybiBkaXJlY3Rpb24gPT09IERJUkVDVElPTl9MRUZUID8gT1JERVJfUFJFViA6IE9SREVSX05FWFRcbiAgICB9XG5cbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSBESVJFQ1RJT05fTEVGVCA/IE9SREVSX05FWFQgOiBPUkRFUl9QUkVWXG4gIH1cblxuICBfb3JkZXJUb0RpcmVjdGlvbihvcmRlcikge1xuICAgIGlmIChpc1JUTCgpKSB7XG4gICAgICByZXR1cm4gb3JkZXIgPT09IE9SREVSX1BSRVYgPyBESVJFQ1RJT05fTEVGVCA6IERJUkVDVElPTl9SSUdIVFxuICAgIH1cblxuICAgIHJldHVybiBvcmRlciA9PT0gT1JERVJfUFJFViA/IERJUkVDVElPTl9SSUdIVCA6IERJUkVDVElPTl9MRUZUXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBDYXJvdXNlbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGRhdGEudG8oY29uZmlnKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9TTElERSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcylcblxuICBpZiAoIXRhcmdldCB8fCAhdGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0NBUk9VU0VMKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuXG4gIGNvbnN0IGNhcm91c2VsID0gQ2Fyb3VzZWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG4gIGNvbnN0IHNsaWRlSW5kZXggPSB0aGlzLmdldEF0dHJpYnV0ZSgnZGF0YS1icy1zbGlkZS10bycpXG5cbiAgaWYgKHNsaWRlSW5kZXgpIHtcbiAgICBjYXJvdXNlbC50byhzbGlkZUluZGV4KVxuICAgIGNhcm91c2VsLl9tYXliZUVuYWJsZUN5Y2xlKClcbiAgICByZXR1cm5cbiAgfVxuXG4gIGlmIChNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKHRoaXMsICdzbGlkZScpID09PSAnbmV4dCcpIHtcbiAgICBjYXJvdXNlbC5uZXh0KClcbiAgICBjYXJvdXNlbC5fbWF5YmVFbmFibGVDeWNsZSgpXG4gICAgcmV0dXJuXG4gIH1cblxuICBjYXJvdXNlbC5wcmV2KClcbiAgY2Fyb3VzZWwuX21heWJlRW5hYmxlQ3ljbGUoKVxufSlcblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBjb25zdCBjYXJvdXNlbHMgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfUklERSlcblxuICBmb3IgKGNvbnN0IGNhcm91c2VsIG9mIGNhcm91c2Vscykge1xuICAgIENhcm91c2VsLmdldE9yQ3JlYXRlSW5zdGFuY2UoY2Fyb3VzZWwpXG4gIH1cbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKENhcm91c2VsKVxuXG5leHBvcnQgZGVmYXVsdCBDYXJvdXNlbFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4zKTogY29sbGFwc2UuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQge1xuICBkZWZpbmVKUXVlcnlQbHVnaW4sXG4gIGdldEVsZW1lbnQsXG4gIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IsXG4gIGdldFNlbGVjdG9yRnJvbUVsZW1lbnQsXG4gIHJlZmxvd1xufSBmcm9tICcuL3V0aWwvaW5kZXgnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudCdcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2NvbGxhcHNlJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMuY29sbGFwc2UnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTRSA9ICdjb2xsYXBzZSdcbmNvbnN0IENMQVNTX05BTUVfQ09MTEFQU0lORyA9ICdjb2xsYXBzaW5nJ1xuY29uc3QgQ0xBU1NfTkFNRV9DT0xMQVBTRUQgPSAnY29sbGFwc2VkJ1xuY29uc3QgQ0xBU1NfTkFNRV9ERUVQRVJfQ0hJTERSRU4gPSBgOnNjb3BlIC4ke0NMQVNTX05BTUVfQ09MTEFQU0V9IC4ke0NMQVNTX05BTUVfQ09MTEFQU0V9YFxuY29uc3QgQ0xBU1NfTkFNRV9IT1JJWk9OVEFMID0gJ2NvbGxhcHNlLWhvcml6b250YWwnXG5cbmNvbnN0IFdJRFRIID0gJ3dpZHRoJ1xuY29uc3QgSEVJR0hUID0gJ2hlaWdodCdcblxuY29uc3QgU0VMRUNUT1JfQUNUSVZFUyA9ICcuY29sbGFwc2Uuc2hvdywgLmNvbGxhcHNlLmNvbGxhcHNpbmcnXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSA9ICdbZGF0YS1icy10b2dnbGU9XCJjb2xsYXBzZVwiXSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgcGFyZW50OiBudWxsLFxuICB0b2dnbGU6IHRydWVcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIHBhcmVudDogJyhudWxsfGVsZW1lbnQpJyxcbiAgdG9nZ2xlOiAnYm9vbGVhbidcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgQ29sbGFwc2UgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcbiAgICB0aGlzLl90cmlnZ2VyQXJyYXkgPSBbXVxuXG4gICAgY29uc3QgdG9nZ2xlTGlzdCA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9UT0dHTEUpXG5cbiAgICBmb3IgKGNvbnN0IGVsZW0gb2YgdG9nZ2xlTGlzdCkge1xuICAgICAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvckZyb21FbGVtZW50KGVsZW0pXG4gICAgICBjb25zdCBmaWx0ZXJFbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvcilcbiAgICAgICAgLmZpbHRlcihmb3VuZEVsZW1lbnQgPT4gZm91bmRFbGVtZW50ID09PSB0aGlzLl9lbGVtZW50KVxuXG4gICAgICBpZiAoc2VsZWN0b3IgIT09IG51bGwgJiYgZmlsdGVyRWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5fdHJpZ2dlckFycmF5LnB1c2goZWxlbSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl9pbml0aWFsaXplQ2hpbGRyZW4oKVxuXG4gICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICB0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModGhpcy5fdHJpZ2dlckFycmF5LCB0aGlzLl9pc1Nob3duKCkpXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy50b2dnbGUpIHtcbiAgICAgIHRoaXMudG9nZ2xlKClcbiAgICB9XG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZSgpIHtcbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLmhpZGUoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3coKVxuICAgIH1cbiAgfVxuXG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuX2lzVHJhbnNpdGlvbmluZyB8fCB0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCBhY3RpdmVDaGlsZHJlbiA9IFtdXG5cbiAgICAvLyBmaW5kIGFjdGl2ZSBjaGlsZHJlblxuICAgIGlmICh0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICBhY3RpdmVDaGlsZHJlbiA9IHRoaXMuX2dldEZpcnN0TGV2ZWxDaGlsZHJlbihTRUxFQ1RPUl9BQ1RJVkVTKVxuICAgICAgICAuZmlsdGVyKGVsZW1lbnQgPT4gZWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudClcbiAgICAgICAgLm1hcChlbGVtZW50ID0+IENvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UoZWxlbWVudCwgeyB0b2dnbGU6IGZhbHNlIH0pKVxuICAgIH1cblxuICAgIGlmIChhY3RpdmVDaGlsZHJlbi5sZW5ndGggJiYgYWN0aXZlQ2hpbGRyZW5bMF0uX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1cpXG4gICAgaWYgKHN0YXJ0RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBhY3RpdmVJbnN0YW5jZSBvZiBhY3RpdmVDaGlsZHJlbikge1xuICAgICAgYWN0aXZlSW5zdGFuY2UuaGlkZSgpXG4gICAgfVxuXG4gICAgY29uc3QgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKClcblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNFKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNJTkcpXG5cbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAwXG5cbiAgICB0aGlzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3ModGhpcy5fdHJpZ2dlckFycmF5LCB0cnVlKVxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWVcblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcblxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0lORylcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNFLCBDTEFTU19OQU1FX1NIT1cpXG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnXG5cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOKVxuICAgIH1cblxuICAgIGNvbnN0IGNhcGl0YWxpemVkRGltZW5zaW9uID0gZGltZW5zaW9uWzBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoMSlcbiAgICBjb25zdCBzY3JvbGxTaXplID0gYHNjcm9sbCR7Y2FwaXRhbGl6ZWREaW1lbnNpb259YFxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdHJ1ZSlcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSBgJHt0aGlzLl9lbGVtZW50W3Njcm9sbFNpemVdfXB4YFxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICF0aGlzLl9pc1Nob3duKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFKVxuICAgIGlmIChzdGFydEV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpXG5cbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSBgJHt0aGlzLl9lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RpbWVuc2lvbl19cHhgXG5cbiAgICByZWZsb3codGhpcy5fZWxlbWVudClcblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0NPTExBUFNJTkcpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQ09MTEFQU0UsIENMQVNTX05BTUVfU0hPVylcblxuICAgIGZvciAoY29uc3QgdHJpZ2dlciBvZiB0aGlzLl90cmlnZ2VyQXJyYXkpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBnZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRyaWdnZXIpXG5cbiAgICAgIGlmIChlbGVtZW50ICYmICF0aGlzLl9pc1Nob3duKGVsZW1lbnQpKSB7XG4gICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhbdHJpZ2dlcl0sIGZhbHNlKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWVcblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0NPTExBUFNJTkcpXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9DT0xMQVBTRSlcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTilcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAnJ1xuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdHJ1ZSlcbiAgfVxuXG4gIF9pc1Nob3duKGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50KSB7XG4gICAgcmV0dXJuIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVylcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgY29uZmlnLnRvZ2dsZSA9IEJvb2xlYW4oY29uZmlnLnRvZ2dsZSkgLy8gQ29lcmNlIHN0cmluZyB2YWx1ZXNcbiAgICBjb25maWcucGFyZW50ID0gZ2V0RWxlbWVudChjb25maWcucGFyZW50KVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9nZXREaW1lbnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfSE9SSVpPTlRBTCkgPyBXSURUSCA6IEhFSUdIVFxuICB9XG5cbiAgX2luaXRpYWxpemVDaGlsZHJlbigpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5wYXJlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5fZ2V0Rmlyc3RMZXZlbENoaWxkcmVuKFNFTEVDVE9SX0RBVEFfVE9HR0xFKVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudClcblxuICAgICAgaWYgKHNlbGVjdGVkKSB7XG4gICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyhbZWxlbWVudF0sIHRoaXMuX2lzU2hvd24oc2VsZWN0ZWQpKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9nZXRGaXJzdExldmVsQ2hpbGRyZW4oc2VsZWN0b3IpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmQoQ0xBU1NfTkFNRV9ERUVQRVJfQ0hJTERSRU4sIHRoaXMuX2NvbmZpZy5wYXJlbnQpXG4gICAgLy8gcmVtb3ZlIGNoaWxkcmVuIGlmIGdyZWF0ZXIgZGVwdGhcbiAgICByZXR1cm4gU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvciwgdGhpcy5fY29uZmlnLnBhcmVudCkuZmlsdGVyKGVsZW1lbnQgPT4gIWNoaWxkcmVuLmluY2x1ZGVzKGVsZW1lbnQpKVxuICB9XG5cbiAgX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0cmlnZ2VyQXJyYXksIGlzT3Blbikge1xuICAgIGlmICghdHJpZ2dlckFycmF5Lmxlbmd0aCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRyaWdnZXJBcnJheSkge1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKENMQVNTX05BTUVfQ09MTEFQU0VELCAhaXNPcGVuKVxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCBpc09wZW4pXG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgY29uc3QgX2NvbmZpZyA9IHt9XG4gICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnICYmIC9zaG93fGhpZGUvLnRlc3QoY29uZmlnKSkge1xuICAgICAgX2NvbmZpZy50b2dnbGUgPSBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IENvbGxhcHNlLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgX2NvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAvLyBwcmV2ZW50RGVmYXVsdCBvbmx5IGZvciA8YT4gZWxlbWVudHMgKHdoaWNoIGNoYW5nZSB0aGUgVVJMKSBub3QgaW5zaWRlIHRoZSBjb2xsYXBzaWJsZSBlbGVtZW50XG4gIGlmIChldmVudC50YXJnZXQudGFnTmFtZSA9PT0gJ0EnIHx8IChldmVudC5kZWxlZ2F0ZVRhcmdldCAmJiBldmVudC5kZWxlZ2F0ZVRhcmdldC50YWdOYW1lID09PSAnQScpKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgY29uc3Qgc2VsZWN0b3IgPSBnZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMpXG4gIGNvbnN0IHNlbGVjdG9yRWxlbWVudHMgPSBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yKVxuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBzZWxlY3RvckVsZW1lbnRzKSB7XG4gICAgQ29sbGFwc2UuZ2V0T3JDcmVhdGVJbnN0YW5jZShlbGVtZW50LCB7IHRvZ2dsZTogZmFsc2UgfSkudG9nZ2xlKClcbiAgfVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oQ29sbGFwc2UpXG5cbmV4cG9ydCBkZWZhdWx0IENvbGxhcHNlXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjMpOiBkcm9wZG93bi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCAqIGFzIFBvcHBlciBmcm9tICdAcG9wcGVyanMvY29yZSdcbmltcG9ydCB7XG4gIGRlZmluZUpRdWVyeVBsdWdpbixcbiAgZ2V0RWxlbWVudCxcbiAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQsXG4gIGlzRGlzYWJsZWQsXG4gIGlzRWxlbWVudCxcbiAgaXNSVEwsXG4gIGlzVmlzaWJsZSxcbiAgbm9vcFxufSBmcm9tICcuL3V0aWwvaW5kZXgnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi9kb20vbWFuaXB1bGF0b3InXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudCdcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2Ryb3Bkb3duJ1xuY29uc3QgREFUQV9LRVkgPSAnYnMuZHJvcGRvd24nXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgREFUQV9BUElfS0VZID0gJy5kYXRhLWFwaSdcblxuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnXG5jb25zdCBUQUJfS0VZID0gJ1RhYidcbmNvbnN0IEFSUk9XX1VQX0tFWSA9ICdBcnJvd1VwJ1xuY29uc3QgQVJST1dfRE9XTl9LRVkgPSAnQXJyb3dEb3duJ1xuY29uc3QgUklHSFRfTU9VU0VfQlVUVE9OID0gMiAvLyBNb3VzZUV2ZW50LmJ1dHRvbiB2YWx1ZSBmb3IgdGhlIHNlY29uZGFyeSBidXR0b24sIHVzdWFsbHkgdGhlIHJpZ2h0IGJ1dHRvblxuXG5jb25zdCBFVkVOVF9ISURFID0gYGhpZGUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWURPV05fREFUQV9BUEkgPSBga2V5ZG93biR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWVVQX0RBVEFfQVBJID0gYGtleXVwJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IENMQVNTX05BTUVfRFJPUFVQID0gJ2Ryb3B1cCdcbmNvbnN0IENMQVNTX05BTUVfRFJPUEVORCA9ICdkcm9wZW5kJ1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QU1RBUlQgPSAnZHJvcHN0YXJ0J1xuY29uc3QgQ0xBU1NfTkFNRV9EUk9QVVBfQ0VOVEVSID0gJ2Ryb3B1cC1jZW50ZXInXG5jb25zdCBDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUiA9ICdkcm9wZG93bi1jZW50ZXInXG5cbmNvbnN0IFNFTEVDVE9SX0RBVEFfVE9HR0xFID0gJ1tkYXRhLWJzLXRvZ2dsZT1cImRyb3Bkb3duXCJdOm5vdCguZGlzYWJsZWQpOm5vdCg6ZGlzYWJsZWQpJ1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfU0hPV04gPSBgJHtTRUxFQ1RPUl9EQVRBX1RPR0dMRX0uJHtDTEFTU19OQU1FX1NIT1d9YFxuY29uc3QgU0VMRUNUT1JfTUVOVSA9ICcuZHJvcGRvd24tbWVudSdcbmNvbnN0IFNFTEVDVE9SX05BVkJBUiA9ICcubmF2YmFyJ1xuY29uc3QgU0VMRUNUT1JfTkFWQkFSX05BViA9ICcubmF2YmFyLW5hdidcbmNvbnN0IFNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMgPSAnLmRyb3Bkb3duLW1lbnUgLmRyb3Bkb3duLWl0ZW06bm90KC5kaXNhYmxlZCk6bm90KDpkaXNhYmxlZCknXG5cbmNvbnN0IFBMQUNFTUVOVF9UT1AgPSBpc1JUTCgpID8gJ3RvcC1lbmQnIDogJ3RvcC1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9UT1BFTkQgPSBpc1JUTCgpID8gJ3RvcC1zdGFydCcgOiAndG9wLWVuZCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT00gPSBpc1JUTCgpID8gJ2JvdHRvbS1lbmQnIDogJ2JvdHRvbS1zdGFydCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT01FTkQgPSBpc1JUTCgpID8gJ2JvdHRvbS1zdGFydCcgOiAnYm90dG9tLWVuZCdcbmNvbnN0IFBMQUNFTUVOVF9SSUdIVCA9IGlzUlRMKCkgPyAnbGVmdC1zdGFydCcgOiAncmlnaHQtc3RhcnQnXG5jb25zdCBQTEFDRU1FTlRfTEVGVCA9IGlzUlRMKCkgPyAncmlnaHQtc3RhcnQnIDogJ2xlZnQtc3RhcnQnXG5jb25zdCBQTEFDRU1FTlRfVE9QQ0VOVEVSID0gJ3RvcCdcbmNvbnN0IFBMQUNFTUVOVF9CT1RUT01DRU5URVIgPSAnYm90dG9tJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhdXRvQ2xvc2U6IHRydWUsXG4gIGJvdW5kYXJ5OiAnY2xpcHBpbmdQYXJlbnRzJyxcbiAgZGlzcGxheTogJ2R5bmFtaWMnLFxuICBvZmZzZXQ6IFswLCAyXSxcbiAgcG9wcGVyQ29uZmlnOiBudWxsLFxuICByZWZlcmVuY2U6ICd0b2dnbGUnXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhdXRvQ2xvc2U6ICcoYm9vbGVhbnxzdHJpbmcpJyxcbiAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJyxcbiAgZGlzcGxheTogJ3N0cmluZycsXG4gIG9mZnNldDogJyhhcnJheXxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgcG9wcGVyQ29uZmlnOiAnKG51bGx8b2JqZWN0fGZ1bmN0aW9uKScsXG4gIHJlZmVyZW5jZTogJyhzdHJpbmd8ZWxlbWVudHxvYmplY3QpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBEcm9wZG93biBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9wb3BwZXIgPSBudWxsXG4gICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlIC8vIGRyb3Bkb3duIHdyYXBwZXJcbiAgICAvLyB0b2RvOiB2NiByZXZlcnQgIzM3MDExICYgY2hhbmdlIG1hcmt1cCBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjIvZm9ybXMvaW5wdXQtZ3JvdXAvXG4gICAgdGhpcy5fbWVudSA9IFNlbGVjdG9yRW5naW5lLm5leHQodGhpcy5fZWxlbWVudCwgU0VMRUNUT1JfTUVOVSlbMF0gfHxcbiAgICAgIFNlbGVjdG9yRW5naW5lLnByZXYodGhpcy5fZWxlbWVudCwgU0VMRUNUT1JfTUVOVSlbMF0gfHxcbiAgICAgIFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoU0VMRUNUT1JfTUVOVSwgdGhpcy5fcGFyZW50KVxuICAgIHRoaXMuX2luTmF2YmFyID0gdGhpcy5fZGV0ZWN0TmF2YmFyKClcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgdG9nZ2xlKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duKCkgPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdygpXG4gIH1cblxuICBzaG93KCkge1xuICAgIGlmIChpc0Rpc2FibGVkKHRoaXMuX2VsZW1lbnQpIHx8IHRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgIHJlbGF0ZWRUYXJnZXQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XLCByZWxhdGVkVGFyZ2V0KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jcmVhdGVQb3BwZXIoKVxuXG4gICAgLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgdG8gdGhlIGJvZHkncyBpbW1lZGlhdGUgY2hpbGRyZW47XG4gICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICF0aGlzLl9wYXJlbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVJfTkFWKSkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5mb2N1cygpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKVxuXG4gICAgdGhpcy5fbWVudS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCByZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoaXNEaXNhYmxlZCh0aGlzLl9lbGVtZW50KSB8fCAhdGhpcy5faXNTaG93bigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgcmVsYXRlZFRhcmdldDogdGhpcy5fZWxlbWVudFxuICAgIH1cblxuICAgIHRoaXMuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fcG9wcGVyKSB7XG4gICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpXG4gICAgfVxuXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgdGhpcy5faW5OYXZiYXIgPSB0aGlzLl9kZXRlY3ROYXZiYXIoKVxuICAgIGlmICh0aGlzLl9wb3BwZXIpIHtcbiAgICAgIHRoaXMuX3BvcHBlci51cGRhdGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSwgcmVsYXRlZFRhcmdldClcbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSByZW1vdmUgdGhlIGV4dHJhXG4gICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcbiAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW10uY29uY2F0KC4uLmRvY3VtZW50LmJvZHkuY2hpbGRyZW4pKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKVxuICAgIH1cblxuICAgIHRoaXMuX21lbnUuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpXG4gICAgTWFuaXB1bGF0b3IucmVtb3ZlRGF0YUF0dHJpYnV0ZSh0aGlzLl9tZW51LCAncG9wcGVyJylcbiAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURERU4sIHJlbGF0ZWRUYXJnZXQpXG4gIH1cblxuICBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgIGNvbmZpZyA9IHN1cGVyLl9nZXRDb25maWcoY29uZmlnKVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcucmVmZXJlbmNlID09PSAnb2JqZWN0JyAmJiAhaXNFbGVtZW50KGNvbmZpZy5yZWZlcmVuY2UpICYmXG4gICAgICB0eXBlb2YgY29uZmlnLnJlZmVyZW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QgIT09ICdmdW5jdGlvbidcbiAgICApIHtcbiAgICAgIC8vIFBvcHBlciB2aXJ0dWFsIGVsZW1lbnRzIHJlcXVpcmUgYSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgbWV0aG9kXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGAke05BTUUudG9VcHBlckNhc2UoKX06IE9wdGlvbiBcInJlZmVyZW5jZVwiIHByb3ZpZGVkIHR5cGUgXCJvYmplY3RcIiB3aXRob3V0IGEgcmVxdWlyZWQgXCJnZXRCb3VuZGluZ0NsaWVudFJlY3RcIiBtZXRob2QuYClcbiAgICB9XG5cbiAgICByZXR1cm4gY29uZmlnXG4gIH1cblxuICBfY3JlYXRlUG9wcGVyKCkge1xuICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyBkcm9wZG93bnMgcmVxdWlyZSBQb3BwZXIgKGh0dHBzOi8vcG9wcGVyLmpzLm9yZyknKVxuICAgIH1cblxuICAgIGxldCByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fZWxlbWVudFxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UgPT09ICdwYXJlbnQnKSB7XG4gICAgICByZWZlcmVuY2VFbGVtZW50ID0gdGhpcy5fcGFyZW50XG4gICAgfSBlbHNlIGlmIChpc0VsZW1lbnQodGhpcy5fY29uZmlnLnJlZmVyZW5jZSkpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSBnZXRFbGVtZW50KHRoaXMuX2NvbmZpZy5yZWZlcmVuY2UpXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fY29uZmlnLnJlZmVyZW5jZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJlZmVyZW5jZUVsZW1lbnQgPSB0aGlzLl9jb25maWcucmVmZXJlbmNlXG4gICAgfVxuXG4gICAgY29uc3QgcG9wcGVyQ29uZmlnID0gdGhpcy5fZ2V0UG9wcGVyQ29uZmlnKClcbiAgICB0aGlzLl9wb3BwZXIgPSBQb3BwZXIuY3JlYXRlUG9wcGVyKHJlZmVyZW5jZUVsZW1lbnQsIHRoaXMuX21lbnUsIHBvcHBlckNvbmZpZylcbiAgfVxuXG4gIF9pc1Nob3duKCkge1xuICAgIHJldHVybiB0aGlzLl9tZW51LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG4gIH1cblxuICBfZ2V0UGxhY2VtZW50KCkge1xuICAgIGNvbnN0IHBhcmVudERyb3Bkb3duID0gdGhpcy5fcGFyZW50XG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUEVORCkpIHtcbiAgICAgIHJldHVybiBQTEFDRU1FTlRfUklHSFRcbiAgICB9XG5cbiAgICBpZiAocGFyZW50RHJvcGRvd24uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRFJPUFNUQVJUKSkge1xuICAgICAgcmV0dXJuIFBMQUNFTUVOVF9MRUZUXG4gICAgfVxuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BVUF9DRU5URVIpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX1RPUENFTlRFUlxuICAgIH1cblxuICAgIGlmIChwYXJlbnREcm9wZG93bi5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9DRU5URVIpKSB7XG4gICAgICByZXR1cm4gUExBQ0VNRU5UX0JPVFRPTUNFTlRFUlxuICAgIH1cblxuICAgIC8vIFdlIG5lZWQgdG8gdHJpbSB0aGUgdmFsdWUgYmVjYXVzZSBjdXN0b20gcHJvcGVydGllcyBjYW4gYWxzbyBpbmNsdWRlIHNwYWNlc1xuICAgIGNvbnN0IGlzRW5kID0gZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLl9tZW51KS5nZXRQcm9wZXJ0eVZhbHVlKCctLWJzLXBvc2l0aW9uJykudHJpbSgpID09PSAnZW5kJ1xuXG4gICAgaWYgKHBhcmVudERyb3Bkb3duLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0RST1BVUCkpIHtcbiAgICAgIHJldHVybiBpc0VuZCA/IFBMQUNFTUVOVF9UT1BFTkQgOiBQTEFDRU1FTlRfVE9QXG4gICAgfVxuXG4gICAgcmV0dXJuIGlzRW5kID8gUExBQ0VNRU5UX0JPVFRPTUVORCA6IFBMQUNFTUVOVF9CT1RUT01cbiAgfVxuXG4gIF9kZXRlY3ROYXZiYXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9OQVZCQVIpICE9PSBudWxsXG4gIH1cblxuICBfZ2V0T2Zmc2V0KCkge1xuICAgIGNvbnN0IHsgb2Zmc2V0IH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIG9mZnNldC5zcGxpdCgnLCcpLm1hcCh2YWx1ZSA9PiBOdW1iZXIucGFyc2VJbnQodmFsdWUsIDEwKSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHBvcHBlckRhdGEgPT4gb2Zmc2V0KHBvcHBlckRhdGEsIHRoaXMuX2VsZW1lbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuIG9mZnNldFxuICB9XG5cbiAgX2dldFBvcHBlckNvbmZpZygpIHtcbiAgICBjb25zdCBkZWZhdWx0QnNQb3BwZXJDb25maWcgPSB7XG4gICAgICBwbGFjZW1lbnQ6IHRoaXMuX2dldFBsYWNlbWVudCgpLFxuICAgICAgbW9kaWZpZXJzOiBbe1xuICAgICAgICBuYW1lOiAncHJldmVudE92ZXJmbG93JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGJvdW5kYXJ5OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICBvZmZzZXQ6IHRoaXMuX2dldE9mZnNldCgpXG4gICAgICAgIH1cbiAgICAgIH1dXG4gICAgfVxuXG4gICAgLy8gRGlzYWJsZSBQb3BwZXIgaWYgd2UgaGF2ZSBhIHN0YXRpYyBkaXNwbGF5IG9yIERyb3Bkb3duIGlzIGluIE5hdmJhclxuICAgIGlmICh0aGlzLl9pbk5hdmJhciB8fCB0aGlzLl9jb25maWcuZGlzcGxheSA9PT0gJ3N0YXRpYycpIHtcbiAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUodGhpcy5fbWVudSwgJ3BvcHBlcicsICdzdGF0aWMnKSAvLyB0b2RvOnY2IHJlbW92ZVxuICAgICAgZGVmYXVsdEJzUG9wcGVyQ29uZmlnLm1vZGlmaWVycyA9IFt7XG4gICAgICAgIG5hbWU6ICdhcHBseVN0eWxlcycsXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXG4gICAgICB9XVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWZhdWx0QnNQb3BwZXJDb25maWcsXG4gICAgICAuLi4odHlwZW9mIHRoaXMuX2NvbmZpZy5wb3BwZXJDb25maWcgPT09ICdmdW5jdGlvbicgPyB0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnKGRlZmF1bHRCc1BvcHBlckNvbmZpZykgOiB0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnKVxuICAgIH1cbiAgfVxuXG4gIF9zZWxlY3RNZW51SXRlbSh7IGtleSwgdGFyZ2V0IH0pIHtcbiAgICBjb25zdCBpdGVtcyA9IFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfVklTSUJMRV9JVEVNUywgdGhpcy5fbWVudSkuZmlsdGVyKGVsZW1lbnQgPT4gaXNWaXNpYmxlKGVsZW1lbnQpKVxuXG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGlmIHRhcmdldCBpc24ndCBpbmNsdWRlZCBpbiBpdGVtcyAoZS5nLiB3aGVuIGV4cGFuZGluZyB0aGUgZHJvcGRvd24pXG4gICAgLy8gYWxsb3cgY3ljbGluZyB0byBnZXQgdGhlIGxhc3QgaXRlbSBpbiBjYXNlIGtleSBlcXVhbHMgQVJST1dfVVBfS0VZXG4gICAgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQoaXRlbXMsIHRhcmdldCwga2V5ID09PSBBUlJPV19ET1dOX0tFWSwgIWl0ZW1zLmluY2x1ZGVzKHRhcmdldCkpLmZvY3VzKClcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxuXG4gIHN0YXRpYyBjbGVhck1lbnVzKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gUklHSFRfTU9VU0VfQlVUVE9OIHx8IChldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LmtleSAhPT0gVEFCX0tFWSkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IG9wZW5Ub2dnbGVzID0gU2VsZWN0b3JFbmdpbmUuZmluZChTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTilcblxuICAgIGZvciAoY29uc3QgdG9nZ2xlIG9mIG9wZW5Ub2dnbGVzKSB7XG4gICAgICBjb25zdCBjb250ZXh0ID0gRHJvcGRvd24uZ2V0SW5zdGFuY2UodG9nZ2xlKVxuICAgICAgaWYgKCFjb250ZXh0IHx8IGNvbnRleHQuX2NvbmZpZy5hdXRvQ2xvc2UgPT09IGZhbHNlKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNvbXBvc2VkUGF0aCA9IGV2ZW50LmNvbXBvc2VkUGF0aCgpXG4gICAgICBjb25zdCBpc01lbnVUYXJnZXQgPSBjb21wb3NlZFBhdGguaW5jbHVkZXMoY29udGV4dC5fbWVudSlcbiAgICAgIGlmIChcbiAgICAgICAgY29tcG9zZWRQYXRoLmluY2x1ZGVzKGNvbnRleHQuX2VsZW1lbnQpIHx8XG4gICAgICAgIChjb250ZXh0Ll9jb25maWcuYXV0b0Nsb3NlID09PSAnaW5zaWRlJyAmJiAhaXNNZW51VGFyZ2V0KSB8fFxuICAgICAgICAoY29udGV4dC5fY29uZmlnLmF1dG9DbG9zZSA9PT0gJ291dHNpZGUnICYmIGlzTWVudVRhcmdldClcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyBUYWIgbmF2aWdhdGlvbiB0aHJvdWdoIHRoZSBkcm9wZG93biBtZW51IG9yIGV2ZW50cyBmcm9tIGNvbnRhaW5lZCBpbnB1dHMgc2hvdWxkbid0IGNsb3NlIHRoZSBtZW51XG4gICAgICBpZiAoY29udGV4dC5fbWVudS5jb250YWlucyhldmVudC50YXJnZXQpICYmICgoZXZlbnQudHlwZSA9PT0gJ2tleXVwJyAmJiBldmVudC5rZXkgPT09IFRBQl9LRVkpIHx8IC9pbnB1dHxzZWxlY3R8b3B0aW9ufHRleHRhcmVhfGZvcm0vaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVsYXRlZFRhcmdldCA9IHsgcmVsYXRlZFRhcmdldDogY29udGV4dC5fZWxlbWVudCB9XG5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQuY2xpY2tFdmVudCA9IGV2ZW50XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX2NvbXBsZXRlSGlkZShyZWxhdGVkVGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBkYXRhQXBpS2V5ZG93bkhhbmRsZXIoZXZlbnQpIHtcbiAgICAvLyBJZiBub3QgYW4gVVAgfCBET1dOIHwgRVNDQVBFIGtleSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgLy8gSWYgaW5wdXQvdGV4dGFyZWEgJiYgaWYga2V5IGlzIG90aGVyIHRoYW4gRVNDQVBFID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcblxuICAgIGNvbnN0IGlzSW5wdXQgPSAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKVxuICAgIGNvbnN0IGlzRXNjYXBlRXZlbnQgPSBldmVudC5rZXkgPT09IEVTQ0FQRV9LRVlcbiAgICBjb25zdCBpc1VwT3JEb3duRXZlbnQgPSBbQVJST1dfVVBfS0VZLCBBUlJPV19ET1dOX0tFWV0uaW5jbHVkZXMoZXZlbnQua2V5KVxuXG4gICAgaWYgKCFpc1VwT3JEb3duRXZlbnQgJiYgIWlzRXNjYXBlRXZlbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChpc0lucHV0ICYmICFpc0VzY2FwZUV2ZW50KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAvLyB0b2RvOiB2NiByZXZlcnQgIzM3MDExICYgY2hhbmdlIG1hcmt1cCBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjIvZm9ybXMvaW5wdXQtZ3JvdXAvXG4gICAgY29uc3QgZ2V0VG9nZ2xlQnV0dG9uID0gdGhpcy5tYXRjaGVzKFNFTEVDVE9SX0RBVEFfVE9HR0xFKSA/XG4gICAgICB0aGlzIDpcbiAgICAgIChTZWxlY3RvckVuZ2luZS5wcmV2KHRoaXMsIFNFTEVDVE9SX0RBVEFfVE9HR0xFKVswXSB8fFxuICAgICAgICBTZWxlY3RvckVuZ2luZS5uZXh0KHRoaXMsIFNFTEVDVE9SX0RBVEFfVE9HR0xFKVswXSB8fFxuICAgICAgICBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBldmVudC5kZWxlZ2F0ZVRhcmdldC5wYXJlbnROb2RlKSlcblxuICAgIGNvbnN0IGluc3RhbmNlID0gRHJvcGRvd24uZ2V0T3JDcmVhdGVJbnN0YW5jZShnZXRUb2dnbGVCdXR0b24pXG5cbiAgICBpZiAoaXNVcE9yRG93bkV2ZW50KSB7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKVxuICAgICAgaW5zdGFuY2Uuc2hvdygpXG4gICAgICBpbnN0YW5jZS5fc2VsZWN0TWVudUl0ZW0oZXZlbnQpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UuX2lzU2hvd24oKSkgeyAvLyBlbHNlIGlzIGVzY2FwZSBhbmQgd2UgY2hlY2sgaWYgaXQgaXMgc2hvd25cbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICBpbnN0YW5jZS5oaWRlKClcbiAgICAgIGdldFRvZ2dsZUJ1dHRvbi5mb2N1cygpXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBEcm9wZG93bi5kYXRhQXBpS2V5ZG93bkhhbmRsZXIpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fREFUQV9BUEksIFNFTEVDVE9SX01FTlUsIERyb3Bkb3duLmRhdGFBcGlLZXlkb3duSGFuZGxlcilcbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIERyb3Bkb3duLmNsZWFyTWVudXMpXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWVVQX0RBVEFfQVBJLCBEcm9wZG93bi5jbGVhck1lbnVzKVxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIERyb3Bkb3duLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcykudG9nZ2xlKClcbn0pXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKERyb3Bkb3duKVxuXG5leHBvcnQgZGVmYXVsdCBEcm9wZG93blxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4zKTogdXRpbC9zY3JvbGxCYXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZSdcbmltcG9ydCBNYW5pcHVsYXRvciBmcm9tICcuLi9kb20vbWFuaXB1bGF0b3InXG5pbXBvcnQgeyBpc0VsZW1lbnQgfSBmcm9tICcuL2luZGV4J1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQgPSAnLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCdcbmNvbnN0IFNFTEVDVE9SX1NUSUNLWV9DT05URU5UID0gJy5zdGlja3ktdG9wJ1xuY29uc3QgUFJPUEVSVFlfUEFERElORyA9ICdwYWRkaW5nLXJpZ2h0J1xuY29uc3QgUFJPUEVSVFlfTUFSR0lOID0gJ21hcmdpbi1yaWdodCdcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgU2Nyb2xsQmFySGVscGVyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fZWxlbWVudCA9IGRvY3VtZW50LmJvZHlcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBnZXRXaWR0aCgpIHtcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2lubmVyV2lkdGgjdXNhZ2Vfbm90ZXNcbiAgICBjb25zdCBkb2N1bWVudFdpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoXG4gICAgcmV0dXJuIE1hdGguYWJzKHdpbmRvdy5pbm5lcldpZHRoIC0gZG9jdW1lbnRXaWR0aClcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFdpZHRoKClcbiAgICB0aGlzLl9kaXNhYmxlT3ZlckZsb3coKVxuICAgIC8vIGdpdmUgcGFkZGluZyB0byBlbGVtZW50IHRvIGJhbGFuY2UgdGhlIGhpZGRlbiBzY3JvbGxiYXIgd2lkdGhcbiAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCBQUk9QRVJUWV9QQURESU5HLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlICsgd2lkdGgpXG4gICAgLy8gdHJpY2s6IFdlIGFkanVzdCBwb3NpdGl2ZSBwYWRkaW5nUmlnaHQgYW5kIG5lZ2F0aXZlIG1hcmdpblJpZ2h0IHRvIHN0aWNreS10b3AgZWxlbWVudHMgdG8ga2VlcCBzaG93aW5nIGZ1bGx3aWR0aFxuICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX0ZJWEVEX0NPTlRFTlQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aClcbiAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCwgUFJPUEVSVFlfTUFSR0lOLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlIC0gd2lkdGgpXG4gIH1cblxuICByZXNldCgpIHtcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpXG4gICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCBQUk9QRVJUWV9QQURESU5HKVxuICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfRklYRURfQ09OVEVOVCwgUFJPUEVSVFlfUEFERElORylcbiAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4pXG4gIH1cblxuICBpc092ZXJmbG93aW5nKCkge1xuICAgIHJldHVybiB0aGlzLmdldFdpZHRoKCkgPiAwXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9kaXNhYmxlT3ZlckZsb3coKSB7XG4gICAgdGhpcy5fc2F2ZUluaXRpYWxBdHRyaWJ1dGUodGhpcy5fZWxlbWVudCwgJ292ZXJmbG93JylcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbidcbiAgfVxuXG4gIF9zZXRFbGVtZW50QXR0cmlidXRlcyhzZWxlY3Rvciwgc3R5bGVQcm9wZXJ0eSwgY2FsbGJhY2spIHtcbiAgICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IHRoaXMuZ2V0V2lkdGgoKVxuICAgIGNvbnN0IG1hbmlwdWxhdGlvbkNhbGxCYWNrID0gZWxlbWVudCA9PiB7XG4gICAgICBpZiAoZWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCAmJiB3aW5kb3cuaW5uZXJXaWR0aCA+IGVsZW1lbnQuY2xpZW50V2lkdGggKyBzY3JvbGxiYXJXaWR0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2F2ZUluaXRpYWxBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSlcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRWYWx1ZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoc3R5bGVQcm9wZXJ0eSlcbiAgICAgIGVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoc3R5bGVQcm9wZXJ0eSwgYCR7Y2FsbGJhY2soTnVtYmVyLnBhcnNlRmxvYXQoY2FsY3VsYXRlZFZhbHVlKSl9cHhgKVxuICAgIH1cblxuICAgIHRoaXMuX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIG1hbmlwdWxhdGlvbkNhbGxCYWNrKVxuICB9XG5cbiAgX3NhdmVJbml0aWFsQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpIHtcbiAgICBjb25zdCBhY3R1YWxWYWx1ZSA9IGVsZW1lbnQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3BlcnR5KVxuICAgIGlmIChhY3R1YWxWYWx1ZSkge1xuICAgICAgTWFuaXB1bGF0b3Iuc2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5LCBhY3R1YWxWYWx1ZSlcbiAgICB9XG4gIH1cblxuICBfcmVzZXRFbGVtZW50QXR0cmlidXRlcyhzZWxlY3Rvciwgc3R5bGVQcm9wZXJ0eSkge1xuICAgIGNvbnN0IG1hbmlwdWxhdGlvbkNhbGxCYWNrID0gZWxlbWVudCA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSlcbiAgICAgIC8vIFdlIG9ubHkgd2FudCB0byByZW1vdmUgdGhlIHByb3BlcnR5IGlmIHRoZSB2YWx1ZSBpcyBgbnVsbGA7IHRoZSB2YWx1ZSBjYW4gYWxzbyBiZSB6ZXJvXG4gICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShzdHlsZVByb3BlcnR5KVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgTWFuaXB1bGF0b3IucmVtb3ZlRGF0YUF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KVxuICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCB2YWx1ZSlcbiAgICB9XG5cbiAgICB0aGlzLl9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBtYW5pcHVsYXRpb25DYWxsQmFjaylcbiAgfVxuXG4gIF9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBjYWxsQmFjaykge1xuICAgIGlmIChpc0VsZW1lbnQoc2VsZWN0b3IpKSB7XG4gICAgICBjYWxsQmFjayhzZWxlY3RvcilcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2VsIG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoc2VsZWN0b3IsIHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICBjYWxsQmFjayhzZWwpXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNjcm9sbEJhckhlbHBlclxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4zKTogdXRpbC9iYWNrZHJvcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgeyBleGVjdXRlLCBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uLCBnZXRFbGVtZW50LCByZWZsb3cgfSBmcm9tICcuL2luZGV4J1xuaW1wb3J0IENvbmZpZyBmcm9tICcuL2NvbmZpZydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ2JhY2tkcm9wJ1xuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdydcbmNvbnN0IEVWRU5UX01PVVNFRE9XTiA9IGBtb3VzZWRvd24uYnMuJHtOQU1FfWBcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgY2xhc3NOYW1lOiAnbW9kYWwtYmFja2Ryb3AnLFxuICBjbGlja0NhbGxiYWNrOiBudWxsLFxuICBpc0FuaW1hdGVkOiBmYWxzZSxcbiAgaXNWaXNpYmxlOiB0cnVlLCAvLyBpZiBmYWxzZSwgd2UgdXNlIHRoZSBiYWNrZHJvcCBoZWxwZXIgd2l0aG91dCBhZGRpbmcgYW55IGVsZW1lbnQgdG8gdGhlIGRvbVxuICByb290RWxlbWVudDogJ2JvZHknIC8vIGdpdmUgdGhlIGNob2ljZSB0byBwbGFjZSBiYWNrZHJvcCB1bmRlciBkaWZmZXJlbnQgZWxlbWVudHNcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gIGNsaWNrQ2FsbGJhY2s6ICcoZnVuY3Rpb258bnVsbCknLFxuICBpc0FuaW1hdGVkOiAnYm9vbGVhbicsXG4gIGlzVmlzaWJsZTogJ2Jvb2xlYW4nLFxuICByb290RWxlbWVudDogJyhlbGVtZW50fHN0cmluZyknXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIEJhY2tkcm9wIGV4dGVuZHMgQ29uZmlnIHtcbiAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgc3VwZXIoKVxuICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpXG4gICAgdGhpcy5faXNBcHBlbmRlZCA9IGZhbHNlXG4gICAgdGhpcy5fZWxlbWVudCA9IG51bGxcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgc2hvdyhjYWxsYmFjaykge1xuICAgIGlmICghdGhpcy5fY29uZmlnLmlzVmlzaWJsZSkge1xuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2FwcGVuZCgpXG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5pc0FuaW1hdGVkKSB7XG4gICAgICByZWZsb3coZWxlbWVudClcbiAgICB9XG5cbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKVxuICAgIH0pXG4gIH1cblxuICBoaWRlKGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuaXNWaXNpYmxlKSB7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZ2V0RWxlbWVudCgpLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICB0aGlzLmRpc3Bvc2UoKVxuICAgICAgZXhlY3V0ZShjYWxsYmFjaylcbiAgICB9KVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzQXBwZW5kZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOKVxuXG4gICAgdGhpcy5fZWxlbWVudC5yZW1vdmUoKVxuICAgIHRoaXMuX2lzQXBwZW5kZWQgPSBmYWxzZVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZ2V0RWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMuX2VsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGJhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICAgIGJhY2tkcm9wLmNsYXNzTmFtZSA9IHRoaXMuX2NvbmZpZy5jbGFzc05hbWVcbiAgICAgIGlmICh0aGlzLl9jb25maWcuaXNBbmltYXRlZCkge1xuICAgICAgICBiYWNrZHJvcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSlcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZWxlbWVudCA9IGJhY2tkcm9wXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRcbiAgfVxuXG4gIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgIC8vIHVzZSBnZXRFbGVtZW50KCkgd2l0aCB0aGUgZGVmYXVsdCBcImJvZHlcIiB0byBnZXQgYSBmcmVzaCBFbGVtZW50IG9uIGVhY2ggaW5zdGFudGlhdGlvblxuICAgIGNvbmZpZy5yb290RWxlbWVudCA9IGdldEVsZW1lbnQoY29uZmlnLnJvb3RFbGVtZW50KVxuICAgIHJldHVybiBjb25maWdcbiAgfVxuXG4gIF9hcHBlbmQoKSB7XG4gICAgaWYgKHRoaXMuX2lzQXBwZW5kZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9nZXRFbGVtZW50KClcbiAgICB0aGlzLl9jb25maWcucm9vdEVsZW1lbnQuYXBwZW5kKGVsZW1lbnQpXG5cbiAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOLCAoKSA9PiB7XG4gICAgICBleGVjdXRlKHRoaXMuX2NvbmZpZy5jbGlja0NhbGxiYWNrKVxuICAgIH0pXG5cbiAgICB0aGlzLl9pc0FwcGVuZGVkID0gdHJ1ZVxuICB9XG5cbiAgX2VtdWxhdGVBbmltYXRpb24oY2FsbGJhY2spIHtcbiAgICBleGVjdXRlQWZ0ZXJUcmFuc2l0aW9uKGNhbGxiYWNrLCB0aGlzLl9nZXRFbGVtZW50KCksIHRoaXMuX2NvbmZpZy5pc0FuaW1hdGVkKVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJhY2tkcm9wXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjMpOiB1dGlsL2ZvY3VzdHJhcC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZSdcbmltcG9ydCBDb25maWcgZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdmb2N1c3RyYXAnXG5jb25zdCBEQVRBX0tFWSA9ICdicy5mb2N1c3RyYXAnXG5jb25zdCBFVkVOVF9LRVkgPSBgLiR7REFUQV9LRVl9YFxuY29uc3QgRVZFTlRfRk9DVVNJTiA9IGBmb2N1c2luJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9UQUIgPSBga2V5ZG93bi50YWIke0VWRU5UX0tFWX1gXG5cbmNvbnN0IFRBQl9LRVkgPSAnVGFiJ1xuY29uc3QgVEFCX05BVl9GT1JXQVJEID0gJ2ZvcndhcmQnXG5jb25zdCBUQUJfTkFWX0JBQ0tXQVJEID0gJ2JhY2t3YXJkJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBhdXRvZm9jdXM6IHRydWUsXG4gIHRyYXBFbGVtZW50OiBudWxsIC8vIFRoZSBlbGVtZW50IHRvIHRyYXAgZm9jdXMgaW5zaWRlIG9mXG59XG5cbmNvbnN0IERlZmF1bHRUeXBlID0ge1xuICBhdXRvZm9jdXM6ICdib29sZWFuJyxcbiAgdHJhcEVsZW1lbnQ6ICdlbGVtZW50J1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBGb2N1c1RyYXAgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlXG4gICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IG51bGxcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgYWN0aXZhdGUoKSB7XG4gICAgaWYgKHRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAodGhpcy5fY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgdGhpcy5fY29uZmlnLnRyYXBFbGVtZW50LmZvY3VzKClcbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIub2ZmKGRvY3VtZW50LCBFVkVOVF9LRVkpIC8vIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgZm9jdXMgbG9vcFxuICAgIEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfRk9DVVNJTiwgZXZlbnQgPT4gdGhpcy5faGFuZGxlRm9jdXNpbihldmVudCkpXG4gICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9LRVlET1dOX1RBQiwgZXZlbnQgPT4gdGhpcy5faGFuZGxlS2V5ZG93bihldmVudCkpXG5cbiAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWVcbiAgfVxuXG4gIGRlYWN0aXZhdGUoKSB7XG4gICAgaWYgKCF0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZVxuICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSlcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2hhbmRsZUZvY3VzaW4oZXZlbnQpIHtcbiAgICBjb25zdCB7IHRyYXBFbGVtZW50IH0gPSB0aGlzLl9jb25maWdcblxuICAgIGlmIChldmVudC50YXJnZXQgPT09IGRvY3VtZW50IHx8IGV2ZW50LnRhcmdldCA9PT0gdHJhcEVsZW1lbnQgfHwgdHJhcEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSBTZWxlY3RvckVuZ2luZS5mb2N1c2FibGVDaGlsZHJlbih0cmFwRWxlbWVudClcblxuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRyYXBFbGVtZW50LmZvY3VzKClcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2xhc3RUYWJOYXZEaXJlY3Rpb24gPT09IFRBQl9OQVZfQkFDS1dBUkQpIHtcbiAgICAgIGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdLmZvY3VzKClcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbWVudHNbMF0uZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIF9oYW5kbGVLZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSAhPT0gVEFCX0tFWSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5ID8gVEFCX05BVl9CQUNLV0FSRCA6IFRBQl9OQVZfRk9SV0FSRFxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZvY3VzVHJhcFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4zKTogbW9kYWwuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4sIGdldEVsZW1lbnRGcm9tU2VsZWN0b3IsIGlzUlRMLCBpc1Zpc2libGUsIHJlZmxvdyB9IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUnXG5pbXBvcnQgU2Nyb2xsQmFySGVscGVyIGZyb20gJy4vdXRpbC9zY3JvbGxiYXInXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50J1xuaW1wb3J0IEJhY2tkcm9wIGZyb20gJy4vdXRpbC9iYWNrZHJvcCdcbmltcG9ydCBGb2N1c1RyYXAgZnJvbSAnLi91dGlsL2ZvY3VzdHJhcCdcbmltcG9ydCB7IGVuYWJsZURpc21pc3NUcmlnZ2VyIH0gZnJvbSAnLi91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdtb2RhbCdcbmNvbnN0IERBVEFfS0VZID0gJ2JzLm1vZGFsJ1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5jb25zdCBFU0NBUEVfS0VZID0gJ0VzY2FwZSdcblxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElERV9QUkVWRU5URUQgPSBgaGlkZVByZXZlbnRlZCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1JFU0laRSA9IGByZXNpemUke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19ESVNNSVNTID0gYGNsaWNrLmRpc21pc3Mke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRURPV05fRElTTUlTUyA9IGBtb3VzZWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0tFWURPV05fRElTTUlTUyA9IGBrZXlkb3duLmRpc21pc3Mke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9DTElDS19EQVRBX0FQSSA9IGBjbGljayR7RVZFTlRfS0VZfSR7REFUQV9BUElfS0VZfWBcblxuY29uc3QgQ0xBU1NfTkFNRV9PUEVOID0gJ21vZGFsLW9wZW4nXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9TVEFUSUMgPSAnbW9kYWwtc3RhdGljJ1xuXG5jb25zdCBPUEVOX1NFTEVDVE9SID0gJy5tb2RhbC5zaG93J1xuY29uc3QgU0VMRUNUT1JfRElBTE9HID0gJy5tb2RhbC1kaWFsb2cnXG5jb25zdCBTRUxFQ1RPUl9NT0RBTF9CT0RZID0gJy5tb2RhbC1ib2R5J1xuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIl0nXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGJhY2tkcm9wOiB0cnVlLFxuICBmb2N1czogdHJ1ZSxcbiAga2V5Ym9hcmQ6IHRydWVcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGZvY3VzOiAnYm9vbGVhbicsXG4gIGtleWJvYXJkOiAnYm9vbGVhbidcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgTW9kYWwgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgdGhpcy5fZGlhbG9nID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9ESUFMT0csIHRoaXMuX2VsZW1lbnQpXG4gICAgdGhpcy5fYmFja2Ryb3AgPSB0aGlzLl9pbml0aWFsaXplQmFja0Ryb3AoKVxuICAgIHRoaXMuX2ZvY3VzdHJhcCA9IHRoaXMuX2luaXRpYWxpemVGb2N1c1RyYXAoKVxuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZVxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlXG4gICAgdGhpcy5fc2Nyb2xsQmFyID0gbmV3IFNjcm9sbEJhckhlbHBlcigpXG5cbiAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpXG4gIH1cblxuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gUHVibGljXG4gIHRvZ2dsZShyZWxhdGVkVGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdyhyZWxhdGVkVGFyZ2V0KVxuICB9XG5cbiAgc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XLCB7XG4gICAgICByZWxhdGVkVGFyZ2V0XG4gICAgfSlcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNTaG93biA9IHRydWVcbiAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlXG5cbiAgICB0aGlzLl9zY3JvbGxCYXIuaGlkZSgpXG5cbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9PUEVOKVxuXG4gICAgdGhpcy5fYWRqdXN0RGlhbG9nKClcblxuICAgIHRoaXMuX2JhY2tkcm9wLnNob3coKCkgPT4gdGhpcy5fc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREUpXG5cbiAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZVxuICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IHRydWVcbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpXG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB0aGlzLl9oaWRlTW9kYWwoKSwgdGhpcy5fZWxlbWVudCwgdGhpcy5faXNBbmltYXRlZCgpKVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBmb3IgKGNvbnN0IGh0bWxFbGVtZW50IG9mIFt3aW5kb3csIHRoaXMuX2RpYWxvZ10pIHtcbiAgICAgIEV2ZW50SGFuZGxlci5vZmYoaHRtbEVsZW1lbnQsIEVWRU5UX0tFWSlcbiAgICB9XG5cbiAgICB0aGlzLl9iYWNrZHJvcC5kaXNwb3NlKClcbiAgICB0aGlzLl9mb2N1c3RyYXAuZGVhY3RpdmF0ZSgpXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICBoYW5kbGVVcGRhdGUoKSB7XG4gICAgdGhpcy5fYWRqdXN0RGlhbG9nKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2luaXRpYWxpemVCYWNrRHJvcCgpIHtcbiAgICByZXR1cm4gbmV3IEJhY2tkcm9wKHtcbiAgICAgIGlzVmlzaWJsZTogQm9vbGVhbih0aGlzLl9jb25maWcuYmFja2Ryb3ApLCAvLyAnc3RhdGljJyBvcHRpb24gd2lsbCBiZSB0cmFuc2xhdGVkIHRvIHRydWUsIGFuZCBib29sZWFucyB3aWxsIGtlZXAgdGhlaXIgdmFsdWUsXG4gICAgICBpc0FuaW1hdGVkOiB0aGlzLl9pc0FuaW1hdGVkKClcbiAgICB9KVxuICB9XG5cbiAgX2luaXRpYWxpemVGb2N1c1RyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBGb2N1c1RyYXAoe1xuICAgICAgdHJhcEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9KVxuICB9XG5cbiAgX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAvLyB0cnkgdG8gYXBwZW5kIGR5bmFtaWMgbW9kYWxcbiAgICBpZiAoIWRvY3VtZW50LmJvZHkuY29udGFpbnModGhpcy5fZWxlbWVudCkpIHtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHRoaXMuX2VsZW1lbnQpXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJ1xuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCB0cnVlKVxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpXG4gICAgdGhpcy5fZWxlbWVudC5zY3JvbGxUb3AgPSAwXG5cbiAgICBjb25zdCBtb2RhbEJvZHkgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX01PREFMX0JPRFksIHRoaXMuX2RpYWxvZylcbiAgICBpZiAobW9kYWxCb2R5KSB7XG4gICAgICBtb2RhbEJvZHkuc2Nyb2xsVG9wID0gMFxuICAgIH1cblxuICAgIHJlZmxvdyh0aGlzLl9lbGVtZW50KVxuXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcblxuICAgIGNvbnN0IHRyYW5zaXRpb25Db21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9jb25maWcuZm9jdXMpIHtcbiAgICAgICAgdGhpcy5fZm9jdXN0cmFwLmFjdGl2YXRlKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXRcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayh0cmFuc2l0aW9uQ29tcGxldGUsIHRoaXMuX2RpYWxvZywgdGhpcy5faXNBbmltYXRlZCgpKVxuICB9XG5cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLl9jb25maWcua2V5Ym9hcmQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB0aGlzLmhpZGUoKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpXG4gICAgfSlcblxuICAgIEV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX1JFU0laRSwgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuX2lzU2hvd24gJiYgIXRoaXMuX2lzVHJhbnNpdGlvbmluZykge1xuICAgICAgICB0aGlzLl9hZGp1c3REaWFsb2coKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgIC8vIGEgYmFkIHRyaWNrIHRvIHNlZ3JlZ2F0ZSBjbGlja3MgdGhhdCBtYXkgc3RhcnQgaW5zaWRlIGRpYWxvZyBidXQgZW5kIG91dHNpZGUsIGFuZCBhdm9pZCBsaXN0ZW4gdG8gc2Nyb2xsYmFyIGNsaWNrc1xuICAgICAgRXZlbnRIYW5kbGVyLm9uZSh0aGlzLl9lbGVtZW50LCBFVkVOVF9DTElDS19ESVNNSVNTLCBldmVudDIgPT4ge1xuICAgICAgICBpZiAodGhpcy5fZWxlbWVudCAhPT0gZXZlbnQudGFyZ2V0IHx8IHRoaXMuX2VsZW1lbnQgIT09IGV2ZW50Mi50YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3AgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgICAgdGhpcy5fdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wKSB7XG4gICAgICAgICAgdGhpcy5oaWRlKClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgX2hpZGVNb2RhbCgpIHtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSdcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCB0cnVlKVxuICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLW1vZGFsJylcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgncm9sZScpXG4gICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2VcblxuICAgIHRoaXMuX2JhY2tkcm9wLmhpZGUoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfT1BFTilcbiAgICAgIHRoaXMuX3Jlc2V0QWRqdXN0bWVudHMoKVxuICAgICAgdGhpcy5fc2Nyb2xsQmFyLnJlc2V0KClcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJRERFTilcbiAgICB9KVxuICB9XG5cbiAgX2lzQW5pbWF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSlcbiAgfVxuXG4gIF90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCkge1xuICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKVxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaXNNb2RhbE92ZXJmbG93aW5nID0gdGhpcy5fZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgY29uc3QgaW5pdGlhbE92ZXJmbG93WSA9IHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZXG4gICAgLy8gcmV0dXJuIGlmIHRoZSBmb2xsb3dpbmcgYmFja2dyb3VuZCB0cmFuc2l0aW9uIGhhc24ndCB5ZXQgY29tcGxldGVkXG4gICAgaWYgKGluaXRpYWxPdmVyZmxvd1kgPT09ICdoaWRkZW4nIHx8IHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU1RBVElDKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKCFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3dZID0gJ2hpZGRlbidcbiAgICB9XG5cbiAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TVEFUSUMpXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TVEFUSUMpXG4gICAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBpbml0aWFsT3ZlcmZsb3dZXG4gICAgICB9LCB0aGlzLl9kaWFsb2cpXG4gICAgfSwgdGhpcy5fZGlhbG9nKVxuXG4gICAgdGhpcy5fZWxlbWVudC5mb2N1cygpXG4gIH1cblxuICAvKipcbiAgICogVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIGhhbmRsZSBvdmVyZmxvd2luZyBtb2RhbHNcbiAgICovXG5cbiAgX2FkanVzdERpYWxvZygpIHtcbiAgICBjb25zdCBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICBjb25zdCBzY3JvbGxiYXJXaWR0aCA9IHRoaXMuX3Njcm9sbEJhci5nZXRXaWR0aCgpXG4gICAgY29uc3QgaXNCb2R5T3ZlcmZsb3dpbmcgPSBzY3JvbGxiYXJXaWR0aCA+IDBcblxuICAgIGlmIChpc0JvZHlPdmVyZmxvd2luZyAmJiAhaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IGlzUlRMKCkgPyAncGFkZGluZ0xlZnQnIDogJ3BhZGRpbmdSaWdodCdcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbcHJvcGVydHldID0gYCR7c2Nyb2xsYmFyV2lkdGh9cHhgXG4gICAgfVxuXG4gICAgaWYgKCFpc0JvZHlPdmVyZmxvd2luZyAmJiBpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gaXNSVEwoKSA/ICdwYWRkaW5nUmlnaHQnIDogJ3BhZGRpbmdMZWZ0J1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGBcbiAgICB9XG4gIH1cblxuICBfcmVzZXRBZGp1c3RtZW50cygpIHtcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gJydcbiAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcnXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcsIHJlbGF0ZWRUYXJnZXQpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMsIGNvbmZpZylcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRhdGFbY29uZmlnXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgfVxuXG4gICAgICBkYXRhW2NvbmZpZ10ocmVsYXRlZFRhcmdldClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAqL1xuXG5FdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0NMSUNLX0RBVEFfQVBJLCBTRUxFQ1RPUl9EQVRBX1RPR0dMRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gIGNvbnN0IHRhcmdldCA9IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcylcblxuICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgRXZlbnRIYW5kbGVyLm9uZSh0YXJnZXQsIEVWRU5UX1NIT1csIHNob3dFdmVudCA9PiB7XG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAvLyBvbmx5IHJlZ2lzdGVyIGZvY3VzIHJlc3RvcmVyIGlmIG1vZGFsIHdpbGwgYWN0dWFsbHkgZ2V0IHNob3duXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfSElEREVOLCAoKSA9PiB7XG4gICAgICBpZiAoaXNWaXNpYmxlKHRoaXMpKSB7XG4gICAgICAgIHRoaXMuZm9jdXMoKVxuICAgICAgfVxuICAgIH0pXG4gIH0pXG5cbiAgLy8gYXZvaWQgY29uZmxpY3Qgd2hlbiBjbGlja2luZyBtb2RhbCB0b2dnbGVyIHdoaWxlIGFub3RoZXIgb25lIGlzIG9wZW5cbiAgY29uc3QgYWxyZWFkeU9wZW4gPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKE9QRU5fU0VMRUNUT1IpXG4gIGlmIChhbHJlYWR5T3Blbikge1xuICAgIE1vZGFsLmdldEluc3RhbmNlKGFscmVhZHlPcGVuKS5oaWRlKClcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBNb2RhbC5nZXRPckNyZWF0ZUluc3RhbmNlKHRhcmdldClcblxuICBkYXRhLnRvZ2dsZSh0aGlzKVxufSlcblxuZW5hYmxlRGlzbWlzc1RyaWdnZXIoTW9kYWwpXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKE1vZGFsKVxuXG5leHBvcnQgZGVmYXVsdCBNb2RhbFxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4zKTogb2ZmY2FudmFzLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cblxuaW1wb3J0IHtcbiAgZGVmaW5lSlF1ZXJ5UGx1Z2luLFxuICBnZXRFbGVtZW50RnJvbVNlbGVjdG9yLFxuICBpc0Rpc2FibGVkLFxuICBpc1Zpc2libGVcbn0gZnJvbSAnLi91dGlsL2luZGV4J1xuaW1wb3J0IFNjcm9sbEJhckhlbHBlciBmcm9tICcuL3V0aWwvc2Nyb2xsYmFyJ1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2RvbS9ldmVudC1oYW5kbGVyJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudCdcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUnXG5pbXBvcnQgQmFja2Ryb3AgZnJvbSAnLi91dGlsL2JhY2tkcm9wJ1xuaW1wb3J0IEZvY3VzVHJhcCBmcm9tICcuL3V0aWwvZm9jdXN0cmFwJ1xuaW1wb3J0IHsgZW5hYmxlRGlzbWlzc1RyaWdnZXIgfSBmcm9tICcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucydcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ29mZmNhbnZhcydcbmNvbnN0IERBVEFfS0VZID0gJ2JzLm9mZmNhbnZhcydcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5jb25zdCBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJ1xuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSA9IGBsb2FkJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVNDQVBFX0tFWSA9ICdFc2NhcGUnXG5cbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XSU5HID0gJ3Nob3dpbmcnXG5jb25zdCBDTEFTU19OQU1FX0hJRElORyA9ICdoaWRpbmcnXG5jb25zdCBDTEFTU19OQU1FX0JBQ0tEUk9QID0gJ29mZmNhbnZhcy1iYWNrZHJvcCdcbmNvbnN0IE9QRU5fU0VMRUNUT1IgPSAnLm9mZmNhbnZhcy5zaG93J1xuXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJREVfUFJFVkVOVEVEID0gYGhpZGVQcmV2ZW50ZWQke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfUkVTSVpFID0gYHJlc2l6ZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9JHtEQVRBX0FQSV9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTl9ESVNNSVNTID0gYGtleWRvd24uZGlzbWlzcyR7RVZFTlRfS0VZfWBcblxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwib2ZmY2FudmFzXCJdJ1xuXG5jb25zdCBEZWZhdWx0ID0ge1xuICBiYWNrZHJvcDogdHJ1ZSxcbiAga2V5Ym9hcmQ6IHRydWUsXG4gIHNjcm9sbDogZmFsc2Vcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gIHNjcm9sbDogJ2Jvb2xlYW4nXG59XG5cbi8qKlxuICogQ2xhc3MgZGVmaW5pdGlvblxuICovXG5cbmNsYXNzIE9mZmNhbnZhcyBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICBzdXBlcihlbGVtZW50LCBjb25maWcpXG5cbiAgICB0aGlzLl9pc1Nob3duID0gZmFsc2VcbiAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpXG4gICAgdGhpcy5fZm9jdXN0cmFwID0gdGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpXG4gICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICB0b2dnbGUocmVsYXRlZFRhcmdldCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldClcbiAgfVxuXG4gIHNob3cocmVsYXRlZFRhcmdldCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG93RXZlbnQgPSBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XLCB7IHJlbGF0ZWRUYXJnZXQgfSlcblxuICAgIGlmIChzaG93RXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5faXNTaG93biA9IHRydWVcbiAgICB0aGlzLl9iYWNrZHJvcC5zaG93KClcblxuICAgIGlmICghdGhpcy5fY29uZmlnLnNjcm9sbCkge1xuICAgICAgbmV3IFNjcm9sbEJhckhlbHBlcigpLmhpZGUoKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLW1vZGFsJywgdHJ1ZSlcbiAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdkaWFsb2cnKVxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1dJTkcpXG5cbiAgICBjb25zdCBjb21wbGV0ZUNhbGxCYWNrID0gKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLl9jb25maWcuc2Nyb2xsIHx8IHRoaXMuX2NvbmZpZy5iYWNrZHJvcCkge1xuICAgICAgICB0aGlzLl9mb2N1c3RyYXAuYWN0aXZhdGUoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPV0lORylcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCB7IHJlbGF0ZWRUYXJnZXQgfSlcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlQ2FsbEJhY2ssIHRoaXMuX2VsZW1lbnQsIHRydWUpXG4gIH1cblxuICBoaWRlKCkge1xuICAgIGlmICghdGhpcy5faXNTaG93bikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcblxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKVxuICAgIHRoaXMuX2VsZW1lbnQuYmx1cigpXG4gICAgdGhpcy5faXNTaG93biA9IGZhbHNlXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfSElESU5HKVxuICAgIHRoaXMuX2JhY2tkcm9wLmhpZGUoKVxuXG4gICAgY29uc3QgY29tcGxldGVDYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1csIENMQVNTX05BTUVfSElESU5HKVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKVxuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKVxuXG4gICAgICBpZiAoIXRoaXMuX2NvbmZpZy5zY3JvbGwpIHtcbiAgICAgICAgbmV3IFNjcm9sbEJhckhlbHBlcigpLnJlc2V0KClcbiAgICAgIH1cblxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGVDYWxsYmFjaywgdGhpcy5fZWxlbWVudCwgdHJ1ZSlcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5fYmFja2Ryb3AuZGlzcG9zZSgpXG4gICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKVxuICAgIHN1cGVyLmRpc3Bvc2UoKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfaW5pdGlhbGl6ZUJhY2tEcm9wKCkge1xuICAgIGNvbnN0IGNsaWNrQ2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9ISURFX1BSRVZFTlRFRClcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGlkZSgpXG4gICAgfVxuXG4gICAgLy8gJ3N0YXRpYycgb3B0aW9uIHdpbGwgYmUgdHJhbnNsYXRlZCB0byB0cnVlLCBhbmQgYm9vbGVhbnMgd2lsbCBrZWVwIHRoZWlyIHZhbHVlXG4gICAgY29uc3QgaXNWaXNpYmxlID0gQm9vbGVhbih0aGlzLl9jb25maWcuYmFja2Ryb3ApXG5cbiAgICByZXR1cm4gbmV3IEJhY2tkcm9wKHtcbiAgICAgIGNsYXNzTmFtZTogQ0xBU1NfTkFNRV9CQUNLRFJPUCxcbiAgICAgIGlzVmlzaWJsZSxcbiAgICAgIGlzQW5pbWF0ZWQ6IHRydWUsXG4gICAgICByb290RWxlbWVudDogdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLFxuICAgICAgY2xpY2tDYWxsYmFjazogaXNWaXNpYmxlID8gY2xpY2tDYWxsYmFjayA6IG51bGxcbiAgICB9KVxuICB9XG5cbiAgX2luaXRpYWxpemVGb2N1c1RyYXAoKSB7XG4gICAgcmV0dXJuIG5ldyBGb2N1c1RyYXAoe1xuICAgICAgdHJhcEVsZW1lbnQ6IHRoaXMuX2VsZW1lbnRcbiAgICB9KVxuICB9XG5cbiAgX2FkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOX0RJU01JU1MsIGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgdGhpcy5oaWRlKClcbiAgICB9KVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gT2ZmY2FudmFzLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSh0aGlzKVxuICAgIH0pXG4gIH1cbn1cblxuLyoqXG4gKiBEYXRhIEFQSSBpbXBsZW1lbnRhdGlvblxuICovXG5cbkV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgRVZFTlRfQ0xJQ0tfREFUQV9BUEksIFNFTEVDVE9SX0RBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgY29uc3QgdGFyZ2V0ID0gZ2V0RWxlbWVudEZyb21TZWxlY3Rvcih0aGlzKVxuXG4gIGlmIChbJ0EnLCAnQVJFQSddLmluY2x1ZGVzKHRoaXMudGFnTmFtZSkpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpXG4gIH1cblxuICBpZiAoaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgRXZlbnRIYW5kbGVyLm9uZSh0YXJnZXQsIEVWRU5UX0hJRERFTiwgKCkgPT4ge1xuICAgIC8vIGZvY3VzIG9uIHRyaWdnZXIgd2hlbiBpdCBpcyBjbG9zZWRcbiAgICBpZiAoaXNWaXNpYmxlKHRoaXMpKSB7XG4gICAgICB0aGlzLmZvY3VzKClcbiAgICB9XG4gIH0pXG5cbiAgLy8gYXZvaWQgY29uZmxpY3Qgd2hlbiBjbGlja2luZyBhIHRvZ2dsZXIgb2YgYW4gb2ZmY2FudmFzLCB3aGlsZSBhbm90aGVyIGlzIG9wZW5cbiAgY29uc3QgYWxyZWFkeU9wZW4gPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKE9QRU5fU0VMRUNUT1IpXG4gIGlmIChhbHJlYWR5T3BlbiAmJiBhbHJlYWR5T3BlbiAhPT0gdGFyZ2V0KSB7XG4gICAgT2ZmY2FudmFzLmdldEluc3RhbmNlKGFscmVhZHlPcGVuKS5oaWRlKClcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBPZmZjYW52YXMuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpXG4gIGRhdGEudG9nZ2xlKHRoaXMpXG59KVxuXG5FdmVudEhhbmRsZXIub24od2luZG93LCBFVkVOVF9MT0FEX0RBVEFfQVBJLCAoKSA9PiB7XG4gIGZvciAoY29uc3Qgc2VsZWN0b3Igb2YgU2VsZWN0b3JFbmdpbmUuZmluZChPUEVOX1NFTEVDVE9SKSkge1xuICAgIE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKHNlbGVjdG9yKS5zaG93KClcbiAgfVxufSlcblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfUkVTSVpFLCAoKSA9PiB7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKCdbYXJpYS1tb2RhbF1bY2xhc3MqPXNob3ddW2NsYXNzKj1vZmZjYW52YXMtXScpKSB7XG4gICAgaWYgKGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gIT09ICdmaXhlZCcpIHtcbiAgICAgIE9mZmNhbnZhcy5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQpLmhpZGUoKVxuICAgIH1cbiAgfVxufSlcblxuZW5hYmxlRGlzbWlzc1RyaWdnZXIoT2ZmY2FudmFzKVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihPZmZjYW52YXMpXG5cbmV4cG9ydCBkZWZhdWx0IE9mZmNhbnZhc1xuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4zKTogdXRpbC9zYW5pdGl6ZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5jb25zdCB1cmlBdHRyaWJ1dGVzID0gbmV3IFNldChbXG4gICdiYWNrZ3JvdW5kJyxcbiAgJ2NpdGUnLFxuICAnaHJlZicsXG4gICdpdGVtdHlwZScsXG4gICdsb25nZGVzYycsXG4gICdwb3N0ZXInLFxuICAnc3JjJyxcbiAgJ3hsaW5rOmhyZWYnXG5dKVxuXG5jb25zdCBBUklBX0FUVFJJQlVURV9QQVRURVJOID0gL15hcmlhLVtcXHctXSokL2lcblxuLyoqXG4gKiBBIHBhdHRlcm4gdGhhdCByZWNvZ25pemVzIGEgY29tbW9ubHkgdXNlZnVsIHN1YnNldCBvZiBVUkxzIHRoYXQgYXJlIHNhZmUuXG4gKlxuICogU2hvdXQtb3V0IHRvIEFuZ3VsYXIgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9ibG9iLzEyLjIueC9wYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vdXJsX3Nhbml0aXplci50c1xuICovXG5jb25zdCBTQUZFX1VSTF9QQVRURVJOID0gL14oPzooPzpodHRwcz98bWFpbHRvfGZ0cHx0ZWx8ZmlsZXxzbXMpOnxbXiMmLzo/XSooPzpbIy8/XXwkKSkvaVxuXG4vKipcbiAqIEEgcGF0dGVybiB0aGF0IG1hdGNoZXMgc2FmZSBkYXRhIFVSTHMuIE9ubHkgbWF0Y2hlcyBpbWFnZSwgdmlkZW8gYW5kIGF1ZGlvIHR5cGVzLlxuICpcbiAqIFNob3V0LW91dCB0byBBbmd1bGFyIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvYmxvYi8xMi4yLngvcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3VybF9zYW5pdGl6ZXIudHNcbiAqL1xuY29uc3QgREFUQV9VUkxfUEFUVEVSTiA9IC9eZGF0YTooPzppbWFnZVxcLyg/OmJtcHxnaWZ8anBlZ3xqcGd8cG5nfHRpZmZ8d2VicCl8dmlkZW9cXC8oPzptcGVnfG1wNHxvZ2d8d2VibSl8YXVkaW9cXC8oPzptcDN8b2dhfG9nZ3xvcHVzKSk7YmFzZTY0LFtcXGQrL2Etel0rPSokL2lcblxuY29uc3QgYWxsb3dlZEF0dHJpYnV0ZSA9IChhdHRyaWJ1dGUsIGFsbG93ZWRBdHRyaWJ1dGVMaXN0KSA9PiB7XG4gIGNvbnN0IGF0dHJpYnV0ZU5hbWUgPSBhdHRyaWJ1dGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKVxuXG4gIGlmIChhbGxvd2VkQXR0cmlidXRlTGlzdC5pbmNsdWRlcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgIGlmICh1cmlBdHRyaWJ1dGVzLmhhcyhhdHRyaWJ1dGVOYW1lKSkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4oU0FGRV9VUkxfUEFUVEVSTi50ZXN0KGF0dHJpYnV0ZS5ub2RlVmFsdWUpIHx8IERBVEFfVVJMX1BBVFRFUk4udGVzdChhdHRyaWJ1dGUubm9kZVZhbHVlKSlcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLy8gQ2hlY2sgaWYgYSByZWd1bGFyIGV4cHJlc3Npb24gdmFsaWRhdGVzIHRoZSBhdHRyaWJ1dGUuXG4gIHJldHVybiBhbGxvd2VkQXR0cmlidXRlTGlzdC5maWx0ZXIoYXR0cmlidXRlUmVnZXggPT4gYXR0cmlidXRlUmVnZXggaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgLnNvbWUocmVnZXggPT4gcmVnZXgudGVzdChhdHRyaWJ1dGVOYW1lKSlcbn1cblxuZXhwb3J0IGNvbnN0IERlZmF1bHRBbGxvd2xpc3QgPSB7XG4gIC8vIEdsb2JhbCBhdHRyaWJ1dGVzIGFsbG93ZWQgb24gYW55IHN1cHBsaWVkIGVsZW1lbnQgYmVsb3cuXG4gICcqJzogWydjbGFzcycsICdkaXInLCAnaWQnLCAnbGFuZycsICdyb2xlJywgQVJJQV9BVFRSSUJVVEVfUEFUVEVSTl0sXG4gIGE6IFsndGFyZ2V0JywgJ2hyZWYnLCAndGl0bGUnLCAncmVsJ10sXG4gIGFyZWE6IFtdLFxuICBiOiBbXSxcbiAgYnI6IFtdLFxuICBjb2w6IFtdLFxuICBjb2RlOiBbXSxcbiAgZGl2OiBbXSxcbiAgZW06IFtdLFxuICBocjogW10sXG4gIGgxOiBbXSxcbiAgaDI6IFtdLFxuICBoMzogW10sXG4gIGg0OiBbXSxcbiAgaDU6IFtdLFxuICBoNjogW10sXG4gIGk6IFtdLFxuICBpbWc6IFsnc3JjJywgJ3NyY3NldCcsICdhbHQnLCAndGl0bGUnLCAnd2lkdGgnLCAnaGVpZ2h0J10sXG4gIGxpOiBbXSxcbiAgb2w6IFtdLFxuICBwOiBbXSxcbiAgcHJlOiBbXSxcbiAgczogW10sXG4gIHNtYWxsOiBbXSxcbiAgc3BhbjogW10sXG4gIHN1YjogW10sXG4gIHN1cDogW10sXG4gIHN0cm9uZzogW10sXG4gIHU6IFtdLFxuICB1bDogW11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNhbml0aXplSHRtbCh1bnNhZmVIdG1sLCBhbGxvd0xpc3QsIHNhbml0aXplRnVuY3Rpb24pIHtcbiAgaWYgKCF1bnNhZmVIdG1sLmxlbmd0aCkge1xuICAgIHJldHVybiB1bnNhZmVIdG1sXG4gIH1cblxuICBpZiAoc2FuaXRpemVGdW5jdGlvbiAmJiB0eXBlb2Ygc2FuaXRpemVGdW5jdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBzYW5pdGl6ZUZ1bmN0aW9uKHVuc2FmZUh0bWwpXG4gIH1cblxuICBjb25zdCBkb21QYXJzZXIgPSBuZXcgd2luZG93LkRPTVBhcnNlcigpXG4gIGNvbnN0IGNyZWF0ZWREb2N1bWVudCA9IGRvbVBhcnNlci5wYXJzZUZyb21TdHJpbmcodW5zYWZlSHRtbCwgJ3RleHQvaHRtbCcpXG4gIGNvbnN0IGVsZW1lbnRzID0gW10uY29uY2F0KC4uLmNyZWF0ZWREb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKSlcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBjb25zdCBlbGVtZW50TmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKVxuXG4gICAgaWYgKCFPYmplY3Qua2V5cyhhbGxvd0xpc3QpLmluY2x1ZGVzKGVsZW1lbnROYW1lKSkge1xuICAgICAgZWxlbWVudC5yZW1vdmUoKVxuXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IGF0dHJpYnV0ZUxpc3QgPSBbXS5jb25jYXQoLi4uZWxlbWVudC5hdHRyaWJ1dGVzKVxuICAgIGNvbnN0IGFsbG93ZWRBdHRyaWJ1dGVzID0gW10uY29uY2F0KGFsbG93TGlzdFsnKiddIHx8IFtdLCBhbGxvd0xpc3RbZWxlbWVudE5hbWVdIHx8IFtdKVxuXG4gICAgZm9yIChjb25zdCBhdHRyaWJ1dGUgb2YgYXR0cmlidXRlTGlzdCkge1xuICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlKGF0dHJpYnV0ZSwgYWxsb3dlZEF0dHJpYnV0ZXMpKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZS5ub2RlTmFtZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY3JlYXRlZERvY3VtZW50LmJvZHkuaW5uZXJIVE1MXG59XG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjMpOiB1dGlsL3RlbXBsYXRlLWZhY3RvcnkuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBEZWZhdWx0QWxsb3dsaXN0LCBzYW5pdGl6ZUh0bWwgfSBmcm9tICcuL3Nhbml0aXplcidcbmltcG9ydCB7IGdldEVsZW1lbnQsIGlzRWxlbWVudCB9IGZyb20gJy4uL3V0aWwvaW5kZXgnXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZSdcbmltcG9ydCBDb25maWcgZnJvbSAnLi9jb25maWcnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdUZW1wbGF0ZUZhY3RvcnknXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFsbG93TGlzdDogRGVmYXVsdEFsbG93bGlzdCxcbiAgY29udGVudDoge30sIC8vIHsgc2VsZWN0b3IgOiB0ZXh0ICwgIHNlbGVjdG9yMiA6IHRleHQyICwgfVxuICBleHRyYUNsYXNzOiAnJyxcbiAgaHRtbDogZmFsc2UsXG4gIHNhbml0aXplOiB0cnVlLFxuICBzYW5pdGl6ZUZuOiBudWxsLFxuICB0ZW1wbGF0ZTogJzxkaXY+PC9kaXY+J1xufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgYWxsb3dMaXN0OiAnb2JqZWN0JyxcbiAgY29udGVudDogJ29iamVjdCcsXG4gIGV4dHJhQ2xhc3M6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIGh0bWw6ICdib29sZWFuJyxcbiAgc2FuaXRpemU6ICdib29sZWFuJyxcbiAgc2FuaXRpemVGbjogJyhudWxsfGZ1bmN0aW9uKScsXG4gIHRlbXBsYXRlOiAnc3RyaW5nJ1xufVxuXG5jb25zdCBEZWZhdWx0Q29udGVudFR5cGUgPSB7XG4gIGVudHJ5OiAnKHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9ufG51bGwpJyxcbiAgc2VsZWN0b3I6ICcoc3RyaW5nfGVsZW1lbnQpJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUZW1wbGF0ZUZhY3RvcnkgZXh0ZW5kcyBDb25maWcge1xuICBjb25zdHJ1Y3Rvcihjb25maWcpIHtcbiAgICBzdXBlcigpXG4gICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZylcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZ2V0Q29udGVudCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9jb25maWcuY29udGVudClcbiAgICAgIC5tYXAoY29uZmlnID0+IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGNvbmZpZykpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gIH1cblxuICBoYXNDb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLmdldENvbnRlbnQoKS5sZW5ndGggPiAwXG4gIH1cblxuICBjaGFuZ2VDb250ZW50KGNvbnRlbnQpIHtcbiAgICB0aGlzLl9jaGVja0NvbnRlbnQoY29udGVudClcbiAgICB0aGlzLl9jb25maWcuY29udGVudCA9IHsgLi4udGhpcy5fY29uZmlnLmNvbnRlbnQsIC4uLmNvbnRlbnQgfVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICB0b0h0bWwoKSB7XG4gICAgY29uc3QgdGVtcGxhdGVXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JylcbiAgICB0ZW1wbGF0ZVdyYXBwZXIuaW5uZXJIVE1MID0gdGhpcy5fbWF5YmVTYW5pdGl6ZSh0aGlzLl9jb25maWcudGVtcGxhdGUpXG5cbiAgICBmb3IgKGNvbnN0IFtzZWxlY3RvciwgdGV4dF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fY29uZmlnLmNvbnRlbnQpKSB7XG4gICAgICB0aGlzLl9zZXRDb250ZW50KHRlbXBsYXRlV3JhcHBlciwgdGV4dCwgc2VsZWN0b3IpXG4gICAgfVxuXG4gICAgY29uc3QgdGVtcGxhdGUgPSB0ZW1wbGF0ZVdyYXBwZXIuY2hpbGRyZW5bMF1cbiAgICBjb25zdCBleHRyYUNsYXNzID0gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLmV4dHJhQ2xhc3MpXG5cbiAgICBpZiAoZXh0cmFDbGFzcykge1xuICAgICAgdGVtcGxhdGUuY2xhc3NMaXN0LmFkZCguLi5leHRyYUNsYXNzLnNwbGl0KCcgJykpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRlbXBsYXRlXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF90eXBlQ2hlY2tDb25maWcoY29uZmlnKSB7XG4gICAgc3VwZXIuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpXG4gICAgdGhpcy5fY2hlY2tDb250ZW50KGNvbmZpZy5jb250ZW50KVxuICB9XG5cbiAgX2NoZWNrQ29udGVudChhcmcpIHtcbiAgICBmb3IgKGNvbnN0IFtzZWxlY3RvciwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXMoYXJnKSkge1xuICAgICAgc3VwZXIuX3R5cGVDaGVja0NvbmZpZyh7IHNlbGVjdG9yLCBlbnRyeTogY29udGVudCB9LCBEZWZhdWx0Q29udGVudFR5cGUpXG4gICAgfVxuICB9XG5cbiAgX3NldENvbnRlbnQodGVtcGxhdGUsIGNvbnRlbnQsIHNlbGVjdG9yKSB7XG4gICAgY29uc3QgdGVtcGxhdGVFbGVtZW50ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvciwgdGVtcGxhdGUpXG5cbiAgICBpZiAoIXRlbXBsYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29udGVudCA9IHRoaXMuX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGNvbnRlbnQpXG5cbiAgICBpZiAoIWNvbnRlbnQpIHtcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKGlzRWxlbWVudChjb250ZW50KSkge1xuICAgICAgdGhpcy5fcHV0RWxlbWVudEluVGVtcGxhdGUoZ2V0RWxlbWVudChjb250ZW50KSwgdGVtcGxhdGVFbGVtZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5odG1sKSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuaW5uZXJIVE1MID0gdGhpcy5fbWF5YmVTYW5pdGl6ZShjb250ZW50KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGVtcGxhdGVFbGVtZW50LnRleHRDb250ZW50ID0gY29udGVudFxuICB9XG5cbiAgX21heWJlU2FuaXRpemUoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZSA/IHNhbml0aXplSHRtbChhcmcsIHRoaXMuX2NvbmZpZy5hbGxvd0xpc3QsIHRoaXMuX2NvbmZpZy5zYW5pdGl6ZUZuKSA6IGFyZ1xuICB9XG5cbiAgX3Jlc29sdmVQb3NzaWJsZUZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nID8gYXJnKHRoaXMpIDogYXJnXG4gIH1cblxuICBfcHV0RWxlbWVudEluVGVtcGxhdGUoZWxlbWVudCwgdGVtcGxhdGVFbGVtZW50KSB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZy5odG1sKSB7XG4gICAgICB0ZW1wbGF0ZUVsZW1lbnQuaW5uZXJIVE1MID0gJydcbiAgICAgIHRlbXBsYXRlRWxlbWVudC5hcHBlbmQoZWxlbWVudClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRlbXBsYXRlRWxlbWVudC50ZXh0Q29udGVudCA9IGVsZW1lbnQudGV4dENvbnRlbnRcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBUZW1wbGF0ZUZhY3RvcnlcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMyk6IHRvb2x0aXAuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgKiBhcyBQb3BwZXIgZnJvbSAnQHBvcHBlcmpzL2NvcmUnXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4sIGZpbmRTaGFkb3dSb290LCBnZXRFbGVtZW50LCBnZXRVSUQsIGlzUlRMLCBub29wIH0gZnJvbSAnLi91dGlsL2luZGV4J1xuaW1wb3J0IHsgRGVmYXVsdEFsbG93bGlzdCB9IGZyb20gJy4vdXRpbC9zYW5pdGl6ZXInXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgTWFuaXB1bGF0b3IgZnJvbSAnLi9kb20vbWFuaXB1bGF0b3InXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50J1xuaW1wb3J0IFRlbXBsYXRlRmFjdG9yeSBmcm9tICcuL3V0aWwvdGVtcGxhdGUtZmFjdG9yeSdcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3Rvb2x0aXAnXG5jb25zdCBESVNBTExPV0VEX0FUVFJJQlVURVMgPSBuZXcgU2V0KFsnc2FuaXRpemUnLCAnYWxsb3dMaXN0JywgJ3Nhbml0aXplRm4nXSlcblxuY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnXG5jb25zdCBDTEFTU19OQU1FX01PREFMID0gJ21vZGFsJ1xuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5cbmNvbnN0IFNFTEVDVE9SX1RPT0xUSVBfSU5ORVIgPSAnLnRvb2x0aXAtaW5uZXInXG5jb25zdCBTRUxFQ1RPUl9NT0RBTCA9IGAuJHtDTEFTU19OQU1FX01PREFMfWBcblxuY29uc3QgRVZFTlRfTU9EQUxfSElERSA9ICdoaWRlLmJzLm1vZGFsJ1xuXG5jb25zdCBUUklHR0VSX0hPVkVSID0gJ2hvdmVyJ1xuY29uc3QgVFJJR0dFUl9GT0NVUyA9ICdmb2N1cydcbmNvbnN0IFRSSUdHRVJfQ0xJQ0sgPSAnY2xpY2snXG5jb25zdCBUUklHR0VSX01BTlVBTCA9ICdtYW51YWwnXG5cbmNvbnN0IEVWRU5UX0hJREUgPSAnaGlkZSdcbmNvbnN0IEVWRU5UX0hJRERFTiA9ICdoaWRkZW4nXG5jb25zdCBFVkVOVF9TSE9XID0gJ3Nob3cnXG5jb25zdCBFVkVOVF9TSE9XTiA9ICdzaG93bidcbmNvbnN0IEVWRU5UX0lOU0VSVEVEID0gJ2luc2VydGVkJ1xuY29uc3QgRVZFTlRfQ0xJQ0sgPSAnY2xpY2snXG5jb25zdCBFVkVOVF9GT0NVU0lOID0gJ2ZvY3VzaW4nXG5jb25zdCBFVkVOVF9GT0NVU09VVCA9ICdmb2N1c291dCdcbmNvbnN0IEVWRU5UX01PVVNFRU5URVIgPSAnbW91c2VlbnRlcidcbmNvbnN0IEVWRU5UX01PVVNFTEVBVkUgPSAnbW91c2VsZWF2ZSdcblxuY29uc3QgQXR0YWNobWVudE1hcCA9IHtcbiAgQVVUTzogJ2F1dG8nLFxuICBUT1A6ICd0b3AnLFxuICBSSUdIVDogaXNSVEwoKSA/ICdsZWZ0JyA6ICdyaWdodCcsXG4gIEJPVFRPTTogJ2JvdHRvbScsXG4gIExFRlQ6IGlzUlRMKCkgPyAncmlnaHQnIDogJ2xlZnQnXG59XG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIGFsbG93TGlzdDogRGVmYXVsdEFsbG93bGlzdCxcbiAgYW5pbWF0aW9uOiB0cnVlLFxuICBib3VuZGFyeTogJ2NsaXBwaW5nUGFyZW50cycsXG4gIGNvbnRhaW5lcjogZmFsc2UsXG4gIGN1c3RvbUNsYXNzOiAnJyxcbiAgZGVsYXk6IDAsXG4gIGZhbGxiYWNrUGxhY2VtZW50czogWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXSxcbiAgaHRtbDogZmFsc2UsXG4gIG9mZnNldDogWzAsIDBdLFxuICBwbGFjZW1lbnQ6ICd0b3AnLFxuICBwb3BwZXJDb25maWc6IG51bGwsXG4gIHNhbml0aXplOiB0cnVlLFxuICBzYW5pdGl6ZUZuOiBudWxsLFxuICBzZWxlY3RvcjogZmFsc2UsXG4gIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPicgK1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ0b29sdGlwLWFycm93XCI+PC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInRvb2x0aXAtaW5uZXJcIj48L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nLFxuICB0aXRsZTogJycsXG4gIHRyaWdnZXI6ICdob3ZlciBmb2N1cydcbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGFsbG93TGlzdDogJ29iamVjdCcsXG4gIGFuaW1hdGlvbjogJ2Jvb2xlYW4nLFxuICBib3VuZGFyeTogJyhzdHJpbmd8ZWxlbWVudCknLFxuICBjb250YWluZXI6ICcoc3RyaW5nfGVsZW1lbnR8Ym9vbGVhbiknLFxuICBjdXN0b21DbGFzczogJyhzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgZGVsYXk6ICcobnVtYmVyfG9iamVjdCknLFxuICBmYWxsYmFja1BsYWNlbWVudHM6ICdhcnJheScsXG4gIGh0bWw6ICdib29sZWFuJyxcbiAgb2Zmc2V0OiAnKGFycmF5fHN0cmluZ3xmdW5jdGlvbiknLFxuICBwbGFjZW1lbnQ6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gIHBvcHBlckNvbmZpZzogJyhudWxsfG9iamVjdHxmdW5jdGlvbiknLFxuICBzYW5pdGl6ZTogJ2Jvb2xlYW4nLFxuICBzYW5pdGl6ZUZuOiAnKG51bGx8ZnVuY3Rpb24pJyxcbiAgc2VsZWN0b3I6ICcoc3RyaW5nfGJvb2xlYW4pJyxcbiAgdGVtcGxhdGU6ICdzdHJpbmcnLFxuICB0aXRsZTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknLFxuICB0cmlnZ2VyOiAnc3RyaW5nJ1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBUb29sdGlwIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgIGlmICh0eXBlb2YgUG9wcGVyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyB0b29sdGlwcyByZXF1aXJlIFBvcHBlciAoaHR0cHM6Ly9wb3BwZXIuanMub3JnKScpXG4gICAgfVxuXG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWVcbiAgICB0aGlzLl90aW1lb3V0ID0gMFxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IG51bGxcbiAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyID0ge31cbiAgICB0aGlzLl9wb3BwZXIgPSBudWxsXG4gICAgdGhpcy5fdGVtcGxhdGVGYWN0b3J5ID0gbnVsbFxuICAgIHRoaXMuX25ld0NvbnRlbnQgPSBudWxsXG5cbiAgICAvLyBQcm90ZWN0ZWRcbiAgICB0aGlzLnRpcCA9IG51bGxcblxuICAgIHRoaXMuX3NldExpc3RlbmVycygpXG5cbiAgICBpZiAoIXRoaXMuX2NvbmZpZy5zZWxlY3Rvcikge1xuICAgICAgdGhpcy5fZml4VGl0bGUoKVxuICAgIH1cbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgZW5hYmxlKCkge1xuICAgIHRoaXMuX2lzRW5hYmxlZCA9IHRydWVcbiAgfVxuXG4gIGRpc2FibGUoKSB7XG4gICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2VcbiAgfVxuXG4gIHRvZ2dsZUVuYWJsZWQoKSB7XG4gICAgdGhpcy5faXNFbmFibGVkID0gIXRoaXMuX2lzRW5hYmxlZFxuICB9XG5cbiAgdG9nZ2xlKCkge1xuICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyLmNsaWNrID0gIXRoaXMuX2FjdGl2ZVRyaWdnZXIuY2xpY2tcbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLl9sZWF2ZSgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9lbnRlcigpXG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KVxuXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9lbGVtZW50LmNsb3Nlc3QoU0VMRUNUT1JfTU9EQUwpLCBFVkVOVF9NT0RBTF9ISURFLCB0aGlzLl9oaWRlTW9kYWxIYW5kbGVyKVxuXG4gICAgaWYgKHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCd0aXRsZScsIHRoaXMuX2VsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWJzLW9yaWdpbmFsLXRpdGxlJykpXG4gICAgfVxuXG4gICAgdGhpcy5fZGlzcG9zZVBvcHBlcigpXG4gICAgc3VwZXIuZGlzcG9zZSgpXG4gIH1cblxuICBzaG93KCkge1xuICAgIGlmICh0aGlzLl9lbGVtZW50LnN0eWxlLmRpc3BsYXkgPT09ICdub25lJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgdXNlIHNob3cgb24gdmlzaWJsZSBlbGVtZW50cycpXG4gICAgfVxuXG4gICAgaWYgKCEodGhpcy5faXNXaXRoQ29udGVudCgpICYmIHRoaXMuX2lzRW5hYmxlZCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX1NIT1cpKVxuICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBmaW5kU2hhZG93Um9vdCh0aGlzLl9lbGVtZW50KVxuICAgIGNvbnN0IGlzSW5UaGVEb20gPSAoc2hhZG93Um9vdCB8fCB0aGlzLl9lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5jb250YWlucyh0aGlzLl9lbGVtZW50KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICFpc0luVGhlRG9tKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyB0b2RvIHY2IHJlbW92ZSB0aGlzIE9SIG1ha2UgaXQgb3B0aW9uYWxcbiAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKClcblxuICAgIGNvbnN0IHRpcCA9IHRoaXMuX2dldFRpcEVsZW1lbnQoKVxuXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aXAuZ2V0QXR0cmlidXRlKCdpZCcpKVxuXG4gICAgY29uc3QgeyBjb250YWluZXIgfSA9IHRoaXMuX2NvbmZpZ1xuXG4gICAgaWYgKCF0aGlzLl9lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zKHRoaXMudGlwKSkge1xuICAgICAgY29udGFpbmVyLmFwcGVuZCh0aXApXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9JTlNFUlRFRCkpXG4gICAgfVxuXG4gICAgdGhpcy5fcG9wcGVyID0gdGhpcy5fY3JlYXRlUG9wcGVyKHRpcClcblxuICAgIHRpcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVylcblxuICAgIC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHRvIHRoZSBib2R5J3MgaW1tZWRpYXRlIGNoaWxkcmVuO1xuICAgIC8vIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgYnJva2VuIGV2ZW50IGRlbGVnYXRpb24gb24gaU9TXG4gICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgJ21vdXNlb3ZlcicsIG5vb3ApXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9TSE9XTikpXG5cbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuX2xlYXZlKClcbiAgICAgIH1cblxuICAgICAgdGhpcy5faXNIb3ZlcmVkID0gZmFsc2VcbiAgICB9XG5cbiAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKGNvbXBsZXRlLCB0aGlzLnRpcCwgdGhpcy5faXNBbmltYXRlZCgpKVxuICB9XG5cbiAgaGlkZSgpIHtcbiAgICBpZiAoIXRoaXMuX2lzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfSElERSkpXG4gICAgaWYgKGhpZGVFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB0aXAgPSB0aGlzLl9nZXRUaXBFbGVtZW50KClcbiAgICB0aXAuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG5cbiAgICAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgIC8vIGVtcHR5IG1vdXNlb3ZlciBsaXN0ZW5lcnMgd2UgYWRkZWQgZm9yIGlPUyBzdXBwb3J0XG4gICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtdLmNvbmNhdCguLi5kb2N1bWVudC5ib2R5LmNoaWxkcmVuKSkge1xuICAgICAgICBFdmVudEhhbmRsZXIub2ZmKGVsZW1lbnQsICdtb3VzZW92ZXInLCBub29wKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9DTElDS10gPSBmYWxzZVxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9GT0NVU10gPSBmYWxzZVxuICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVFJJR0dFUl9IT1ZFUl0gPSBmYWxzZVxuICAgIHRoaXMuX2lzSG92ZXJlZCA9IG51bGwgLy8gaXQgaXMgYSB0cmljayB0byBzdXBwb3J0IG1hbnVhbCB0cmlnZ2VyaW5nXG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc1dpdGhBY3RpdmVUcmlnZ2VyKCkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5faXNIb3ZlcmVkKSB7XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2VQb3BwZXIoKVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9ISURERU4pKVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIHRoaXMudGlwLCB0aGlzLl9pc0FuaW1hdGVkKCkpXG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLnVwZGF0ZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gUHJvdGVjdGVkXG4gIF9pc1dpdGhDb250ZW50KCkge1xuICAgIHJldHVybiBCb29sZWFuKHRoaXMuX2dldFRpdGxlKCkpXG4gIH1cblxuICBfZ2V0VGlwRWxlbWVudCgpIHtcbiAgICBpZiAoIXRoaXMudGlwKSB7XG4gICAgICB0aGlzLnRpcCA9IHRoaXMuX2NyZWF0ZVRpcEVsZW1lbnQodGhpcy5fbmV3Q29udGVudCB8fCB0aGlzLl9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSlcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50aXBcbiAgfVxuXG4gIF9jcmVhdGVUaXBFbGVtZW50KGNvbnRlbnQpIHtcbiAgICBjb25zdCB0aXAgPSB0aGlzLl9nZXRUZW1wbGF0ZUZhY3RvcnkoY29udGVudCkudG9IdG1sKClcblxuICAgIC8vIHRvZG86IHJlbW92ZSB0aGlzIGNoZWNrIG9uIHY2XG4gICAgaWYgKCF0aXApIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfVxuXG4gICAgdGlwLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9GQURFLCBDTEFTU19OQU1FX1NIT1cpXG4gICAgLy8gdG9kbzogb24gdjYgdGhlIGZvbGxvd2luZyBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBDU1Mgb25seVxuICAgIHRpcC5jbGFzc0xpc3QuYWRkKGBicy0ke3RoaXMuY29uc3RydWN0b3IuTkFNRX0tYXV0b2ApXG5cbiAgICBjb25zdCB0aXBJZCA9IGdldFVJRCh0aGlzLmNvbnN0cnVjdG9yLk5BTUUpLnRvU3RyaW5nKClcblxuICAgIHRpcC5zZXRBdHRyaWJ1dGUoJ2lkJywgdGlwSWQpXG5cbiAgICBpZiAodGhpcy5faXNBbmltYXRlZCgpKSB7XG4gICAgICB0aXAuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0ZBREUpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRpcFxuICB9XG5cbiAgc2V0Q29udGVudChjb250ZW50KSB7XG4gICAgdGhpcy5fbmV3Q29udGVudCA9IGNvbnRlbnRcbiAgICBpZiAodGhpcy5faXNTaG93bigpKSB7XG4gICAgICB0aGlzLl9kaXNwb3NlUG9wcGVyKClcbiAgICAgIHRoaXMuc2hvdygpXG4gICAgfVxuICB9XG5cbiAgX2dldFRlbXBsYXRlRmFjdG9yeShjb250ZW50KSB7XG4gICAgaWYgKHRoaXMuX3RlbXBsYXRlRmFjdG9yeSkge1xuICAgICAgdGhpcy5fdGVtcGxhdGVGYWN0b3J5LmNoYW5nZUNvbnRlbnQoY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdGVtcGxhdGVGYWN0b3J5ID0gbmV3IFRlbXBsYXRlRmFjdG9yeSh7XG4gICAgICAgIC4uLnRoaXMuX2NvbmZpZyxcbiAgICAgICAgLy8gdGhlIGBjb250ZW50YCB2YXIgaGFzIHRvIGJlIGFmdGVyIGB0aGlzLl9jb25maWdgXG4gICAgICAgIC8vIHRvIG92ZXJyaWRlIGNvbmZpZy5jb250ZW50IGluIGNhc2Ugb2YgcG9wb3ZlclxuICAgICAgICBjb250ZW50LFxuICAgICAgICBleHRyYUNsYXNzOiB0aGlzLl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbih0aGlzLl9jb25maWcuY3VzdG9tQ2xhc3MpXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZUZhY3RvcnlcbiAgfVxuXG4gIF9nZXRDb250ZW50Rm9yVGVtcGxhdGUoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIFtTRUxFQ1RPUl9UT09MVElQX0lOTkVSXTogdGhpcy5fZ2V0VGl0bGUoKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRUaXRsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLnRpdGxlKSB8fCB0aGlzLl9lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1icy1vcmlnaW5hbC10aXRsZScpXG4gIH1cblxuICAvLyBQcml2YXRlXG4gIF9pbml0aWFsaXplT25EZWxlZ2F0ZWRUYXJnZXQoZXZlbnQpIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5nZXRPckNyZWF0ZUluc3RhbmNlKGV2ZW50LmRlbGVnYXRlVGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKVxuICB9XG5cbiAgX2lzQW5pbWF0ZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5hbmltYXRpb24gfHwgKHRoaXMudGlwICYmIHRoaXMudGlwLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpKVxuICB9XG5cbiAgX2lzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMudGlwICYmIHRoaXMudGlwLmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NIT1cpXG4gIH1cblxuICBfY3JlYXRlUG9wcGVyKHRpcCkge1xuICAgIGNvbnN0IHBsYWNlbWVudCA9IHR5cGVvZiB0aGlzLl9jb25maWcucGxhY2VtZW50ID09PSAnZnVuY3Rpb24nID9cbiAgICAgIHRoaXMuX2NvbmZpZy5wbGFjZW1lbnQuY2FsbCh0aGlzLCB0aXAsIHRoaXMuX2VsZW1lbnQpIDpcbiAgICAgIHRoaXMuX2NvbmZpZy5wbGFjZW1lbnRcbiAgICBjb25zdCBhdHRhY2htZW50ID0gQXR0YWNobWVudE1hcFtwbGFjZW1lbnQudG9VcHBlckNhc2UoKV1cbiAgICByZXR1cm4gUG9wcGVyLmNyZWF0ZVBvcHBlcih0aGlzLl9lbGVtZW50LCB0aXAsIHRoaXMuX2dldFBvcHBlckNvbmZpZyhhdHRhY2htZW50KSlcbiAgfVxuXG4gIF9nZXRPZmZzZXQoKSB7XG4gICAgY29uc3QgeyBvZmZzZXQgfSA9IHRoaXMuX2NvbmZpZ1xuXG4gICAgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gb2Zmc2V0LnNwbGl0KCcsJykubWFwKHZhbHVlID0+IE51bWJlci5wYXJzZUludCh2YWx1ZSwgMTApKVxuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcG9wcGVyRGF0YSA9PiBvZmZzZXQocG9wcGVyRGF0YSwgdGhpcy5fZWxlbWVudClcbiAgICB9XG5cbiAgICByZXR1cm4gb2Zmc2V0XG4gIH1cblxuICBfcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24oYXJnKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbicgPyBhcmcuY2FsbCh0aGlzLl9lbGVtZW50KSA6IGFyZ1xuICB9XG5cbiAgX2dldFBvcHBlckNvbmZpZyhhdHRhY2htZW50KSB7XG4gICAgY29uc3QgZGVmYXVsdEJzUG9wcGVyQ29uZmlnID0ge1xuICAgICAgcGxhY2VtZW50OiBhdHRhY2htZW50LFxuICAgICAgbW9kaWZpZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnZmxpcCcsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzOiB0aGlzLl9jb25maWcuZmFsbGJhY2tQbGFjZW1lbnRzXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgb2Zmc2V0OiB0aGlzLl9nZXRPZmZzZXQoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGJvdW5kYXJ5OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnYXJyb3cnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IGAuJHt0aGlzLmNvbnN0cnVjdG9yLk5BTUV9LWFycm93YFxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdwcmVTZXRQbGFjZW1lbnQnLFxuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgcGhhc2U6ICdiZWZvcmVNYWluJyxcbiAgICAgICAgICBmbjogZGF0YSA9PiB7XG4gICAgICAgICAgICAvLyBQcmUtc2V0IFBvcHBlcidzIHBsYWNlbWVudCBhdHRyaWJ1dGUgaW4gb3JkZXIgdG8gcmVhZCB0aGUgYXJyb3cgc2l6ZXMgcHJvcGVybHkuXG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIFBvcHBlciBtaXhlcyB1cCB0aGUgd2lkdGggYW5kIGhlaWdodCBkaW1lbnNpb25zIHNpbmNlIHRoZSBpbml0aWFsIGFycm93IHN0eWxlIGlzIGZvciB0b3AgcGxhY2VtZW50XG4gICAgICAgICAgICB0aGlzLl9nZXRUaXBFbGVtZW50KCkuc2V0QXR0cmlidXRlKCdkYXRhLXBvcHBlci1wbGFjZW1lbnQnLCBkYXRhLnN0YXRlLnBsYWNlbWVudClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmYXVsdEJzUG9wcGVyQ29uZmlnLFxuICAgICAgLi4uKHR5cGVvZiB0aGlzLl9jb25maWcucG9wcGVyQ29uZmlnID09PSAnZnVuY3Rpb24nID8gdGhpcy5fY29uZmlnLnBvcHBlckNvbmZpZyhkZWZhdWx0QnNQb3BwZXJDb25maWcpIDogdGhpcy5fY29uZmlnLnBvcHBlckNvbmZpZylcbiAgICB9XG4gIH1cblxuICBfc2V0TGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gdGhpcy5fY29uZmlnLnRyaWdnZXIuc3BsaXQoJyAnKVxuXG4gICAgZm9yIChjb25zdCB0cmlnZ2VyIG9mIHRyaWdnZXJzKSB7XG4gICAgICBpZiAodHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5ldmVudE5hbWUoRVZFTlRfQ0xJQ0spLCB0aGlzLl9jb25maWcuc2VsZWN0b3IsIGV2ZW50ID0+IHtcbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5faW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0KGV2ZW50KVxuICAgICAgICAgIGNvbnRleHQudG9nZ2xlKClcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPT0gVFJJR0dFUl9NQU5VQUwpIHtcbiAgICAgICAgY29uc3QgZXZlbnRJbiA9IHRyaWdnZXIgPT09IFRSSUdHRVJfSE9WRVIgP1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX01PVVNFRU5URVIpIDpcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9GT0NVU0lOKVxuICAgICAgICBjb25zdCBldmVudE91dCA9IHRyaWdnZXIgPT09IFRSSUdHRVJfSE9WRVIgP1xuICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZXZlbnROYW1lKEVWRU5UX01PVVNFTEVBVkUpIDpcbiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmV2ZW50TmFtZShFVkVOVF9GT0NVU09VVClcblxuICAgICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgZXZlbnRJbiwgdGhpcy5fY29uZmlnLnNlbGVjdG9yLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudClcbiAgICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c2luJyA/IFRSSUdHRVJfRk9DVVMgOiBUUklHR0VSX0hPVkVSXSA9IHRydWVcbiAgICAgICAgICBjb250ZXh0Ll9lbnRlcigpXG4gICAgICAgIH0pXG4gICAgICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBldmVudE91dCwgdGhpcy5fY29uZmlnLnNlbGVjdG9yLCBldmVudCA9PiB7XG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2luaXRpYWxpemVPbkRlbGVnYXRlZFRhcmdldChldmVudClcbiAgICAgICAgICBjb250ZXh0Ll9hY3RpdmVUcmlnZ2VyW2V2ZW50LnR5cGUgPT09ICdmb2N1c291dCcgPyBUUklHR0VSX0ZPQ1VTIDogVFJJR0dFUl9IT1ZFUl0gPVxuICAgICAgICAgICAgY29udGV4dC5fZWxlbWVudC5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KVxuXG4gICAgICAgICAgY29udGV4dC5fbGVhdmUoKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2hpZGVNb2RhbEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fZWxlbWVudCkge1xuICAgICAgICB0aGlzLmhpZGUoKVxuICAgICAgfVxuICAgIH1cblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LmNsb3Nlc3QoU0VMRUNUT1JfTU9EQUwpLCBFVkVOVF9NT0RBTF9ISURFLCB0aGlzLl9oaWRlTW9kYWxIYW5kbGVyKVxuICB9XG5cbiAgX2ZpeFRpdGxlKCkge1xuICAgIGNvbnN0IHRpdGxlID0gdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RpdGxlJylcblxuICAgIGlmICghdGl0bGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICghdGhpcy5fZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSAmJiAhdGhpcy5fZWxlbWVudC50ZXh0Q29udGVudC50cmltKCkpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywgdGl0bGUpXG4gICAgfVxuXG4gICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtb3JpZ2luYWwtdGl0bGUnLCB0aXRsZSkgLy8gRE8gTk9UIFVTRSBJVC4gSXMgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICB0aGlzLl9lbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGl0bGUnKVxuICB9XG5cbiAgX2VudGVyKCkge1xuICAgIGlmICh0aGlzLl9pc1Nob3duKCkgfHwgdGhpcy5faXNIb3ZlcmVkKSB7XG4gICAgICB0aGlzLl9pc0hvdmVyZWQgPSB0cnVlXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc0hvdmVyZWQgPSB0cnVlXG5cbiAgICB0aGlzLl9zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLl9pc0hvdmVyZWQpIHtcbiAgICAgICAgdGhpcy5zaG93KClcbiAgICAgIH1cbiAgICB9LCB0aGlzLl9jb25maWcuZGVsYXkuc2hvdylcbiAgfVxuXG4gIF9sZWF2ZSgpIHtcbiAgICBpZiAodGhpcy5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9pc0hvdmVyZWQgPSBmYWxzZVxuXG4gICAgdGhpcy5fc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuX2lzSG92ZXJlZCkge1xuICAgICAgICB0aGlzLmhpZGUoKVxuICAgICAgfVxuICAgIH0sIHRoaXMuX2NvbmZpZy5kZWxheS5oaWRlKVxuICB9XG5cbiAgX3NldFRpbWVvdXQoaGFuZGxlciwgdGltZW91dCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KVxuICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGhhbmRsZXIsIHRpbWVvdXQpXG4gIH1cblxuICBfaXNXaXRoQWN0aXZlVHJpZ2dlcigpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9hY3RpdmVUcmlnZ2VyKS5pbmNsdWRlcyh0cnVlKVxuICB9XG5cbiAgX2dldENvbmZpZyhjb25maWcpIHtcbiAgICBjb25zdCBkYXRhQXR0cmlidXRlcyA9IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQpXG5cbiAgICBmb3IgKGNvbnN0IGRhdGFBdHRyaWJ1dGUgb2YgT2JqZWN0LmtleXMoZGF0YUF0dHJpYnV0ZXMpKSB7XG4gICAgICBpZiAoRElTQUxMT1dFRF9BVFRSSUJVVEVTLmhhcyhkYXRhQXR0cmlidXRlKSkge1xuICAgICAgICBkZWxldGUgZGF0YUF0dHJpYnV0ZXNbZGF0YUF0dHJpYnV0ZV1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25maWcgPSB7XG4gICAgICAuLi5kYXRhQXR0cmlidXRlcyxcbiAgICAgIC4uLih0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcgPyBjb25maWcgOiB7fSlcbiAgICB9XG4gICAgY29uZmlnID0gdGhpcy5fbWVyZ2VDb25maWdPYmooY29uZmlnKVxuICAgIGNvbmZpZyA9IHRoaXMuX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKVxuICAgIHRoaXMuX3R5cGVDaGVja0NvbmZpZyhjb25maWcpXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgY29uZmlnLmNvbnRhaW5lciA9IGNvbmZpZy5jb250YWluZXIgPT09IGZhbHNlID8gZG9jdW1lbnQuYm9keSA6IGdldEVsZW1lbnQoY29uZmlnLmNvbnRhaW5lcilcblxuICAgIGlmICh0eXBlb2YgY29uZmlnLmRlbGF5ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLmRlbGF5ID0ge1xuICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgIGhpZGU6IGNvbmZpZy5kZWxheVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29uZmlnLnRpdGxlID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLnRpdGxlID0gY29uZmlnLnRpdGxlLnRvU3RyaW5nKClcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy5jb250ZW50ID09PSAnbnVtYmVyJykge1xuICAgICAgY29uZmlnLmNvbnRlbnQgPSBjb25maWcuY29udGVudC50b1N0cmluZygpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2dldERlbGVnYXRlQ29uZmlnKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHt9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLl9jb25maWcpIHtcbiAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRba2V5XSAhPT0gdGhpcy5fY29uZmlnW2tleV0pIHtcbiAgICAgICAgY29uZmlnW2tleV0gPSB0aGlzLl9jb25maWdba2V5XVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbmZpZy5zZWxlY3RvciA9IGZhbHNlXG4gICAgY29uZmlnLnRyaWdnZXIgPSAnbWFudWFsJ1xuXG4gICAgLy8gSW4gdGhlIGZ1dHVyZSBjYW4gYmUgcmVwbGFjZWQgd2l0aDpcbiAgICAvLyBjb25zdCBrZXlzV2l0aERpZmZlcmVudFZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKHRoaXMuX2NvbmZpZykuZmlsdGVyKGVudHJ5ID0+IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFtlbnRyeVswXV0gIT09IHRoaXMuX2NvbmZpZ1tlbnRyeVswXV0pXG4gICAgLy8gYE9iamVjdC5mcm9tRW50cmllcyhrZXlzV2l0aERpZmZlcmVudFZhbHVlcylgXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX2Rpc3Bvc2VQb3BwZXIoKSB7XG4gICAgaWYgKHRoaXMuX3BvcHBlcikge1xuICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKVxuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbFxuICAgIH1cblxuICAgIGlmICh0aGlzLnRpcCkge1xuICAgICAgdGhpcy50aXAucmVtb3ZlKClcbiAgICAgIHRoaXMudGlwID0gbnVsbFxuICAgIH1cbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRvb2x0aXAuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpXG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYE5vIG1ldGhvZCBuYW1lZCBcIiR7Y29uZmlnfVwiYClcbiAgICAgIH1cblxuICAgICAgZGF0YVtjb25maWddKClcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvb2x0aXApXG5cbmV4cG9ydCBkZWZhdWx0IFRvb2x0aXBcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMyk6IHBvcG92ZXIuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4gfSBmcm9tICcuL3V0aWwvaW5kZXgnXG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuL3Rvb2x0aXAnXG5cbi8qKlxuICogQ29uc3RhbnRzXG4gKi9cblxuY29uc3QgTkFNRSA9ICdwb3BvdmVyJ1xuXG5jb25zdCBTRUxFQ1RPUl9USVRMRSA9ICcucG9wb3Zlci1oZWFkZXInXG5jb25zdCBTRUxFQ1RPUl9DT05URU5UID0gJy5wb3BvdmVyLWJvZHknXG5cbmNvbnN0IERlZmF1bHQgPSB7XG4gIC4uLlRvb2x0aXAuRGVmYXVsdCxcbiAgY29udGVudDogJycsXG4gIG9mZnNldDogWzAsIDhdLFxuICBwbGFjZW1lbnQ6ICdyaWdodCcsXG4gIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInBvcG92ZXJcIiByb2xlPVwidG9vbHRpcFwiPicgK1xuICAgICc8ZGl2IGNsYXNzPVwicG9wb3Zlci1hcnJvd1wiPjwvZGl2PicgK1xuICAgICc8aDMgY2xhc3M9XCJwb3BvdmVyLWhlYWRlclwiPjwvaDM+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwb3BvdmVyLWJvZHlcIj48L2Rpdj4nICtcbiAgICAnPC9kaXY+JyxcbiAgdHJpZ2dlcjogJ2NsaWNrJ1xufVxuXG5jb25zdCBEZWZhdWx0VHlwZSA9IHtcbiAgLi4uVG9vbHRpcC5EZWZhdWx0VHlwZSxcbiAgY29udGVudDogJyhudWxsfHN0cmluZ3xlbGVtZW50fGZ1bmN0aW9uKSdcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgUG9wb3ZlciBleHRlbmRzIFRvb2x0aXAge1xuICAvLyBHZXR0ZXJzXG4gIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFxuICB9XG5cbiAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICByZXR1cm4gRGVmYXVsdFR5cGVcbiAgfVxuXG4gIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICByZXR1cm4gTkFNRVxuICB9XG5cbiAgLy8gT3ZlcnJpZGVzXG4gIF9pc1dpdGhDb250ZW50KCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRUaXRsZSgpIHx8IHRoaXMuX2dldENvbnRlbnQoKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfZ2V0Q29udGVudEZvclRlbXBsYXRlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBbU0VMRUNUT1JfVElUTEVdOiB0aGlzLl9nZXRUaXRsZSgpLFxuICAgICAgW1NFTEVDVE9SX0NPTlRFTlRdOiB0aGlzLl9nZXRDb250ZW50KClcbiAgICB9XG4gIH1cblxuICBfZ2V0Q29udGVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZVBvc3NpYmxlRnVuY3Rpb24odGhpcy5fY29uZmlnLmNvbnRlbnQpXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBQb3BvdmVyLmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihQb3BvdmVyKVxuXG5leHBvcnQgZGVmYXVsdCBQb3BvdmVyXG4iLCAiLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NS4yLjMpOiBzY3JvbGxzcHkuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4sIGdldEVsZW1lbnQsIGlzRGlzYWJsZWQsIGlzVmlzaWJsZSB9IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBTZWxlY3RvckVuZ2luZSBmcm9tICcuL2RvbS9zZWxlY3Rvci1lbmdpbmUnXG5pbXBvcnQgQmFzZUNvbXBvbmVudCBmcm9tICcuL2Jhc2UtY29tcG9uZW50J1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAnc2Nyb2xsc3B5J1xuY29uc3QgREFUQV9LRVkgPSAnYnMuc2Nyb2xsc3B5J1xuY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWBcbmNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknXG5cbmNvbnN0IEVWRU5UX0FDVElWQVRFID0gYGFjdGl2YXRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfQ0xJQ0sgPSBgY2xpY2ske0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9MT0FEX0RBVEFfQVBJID0gYGxvYWQke0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gXG5cbmNvbnN0IENMQVNTX05BTUVfRFJPUERPV05fSVRFTSA9ICdkcm9wZG93bi1pdGVtJ1xuY29uc3QgQ0xBU1NfTkFNRV9BQ1RJVkUgPSAnYWN0aXZlJ1xuXG5jb25zdCBTRUxFQ1RPUl9EQVRBX1NQWSA9ICdbZGF0YS1icy1zcHk9XCJzY3JvbGxcIl0nXG5jb25zdCBTRUxFQ1RPUl9UQVJHRVRfTElOS1MgPSAnW2hyZWZdJ1xuY29uc3QgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVAgPSAnLm5hdiwgLmxpc3QtZ3JvdXAnXG5jb25zdCBTRUxFQ1RPUl9OQVZfTElOS1MgPSAnLm5hdi1saW5rJ1xuY29uc3QgU0VMRUNUT1JfTkFWX0lURU1TID0gJy5uYXYtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0xJU1RfSVRFTVMgPSAnLmxpc3QtZ3JvdXAtaXRlbSdcbmNvbnN0IFNFTEVDVE9SX0xJTktfSVRFTVMgPSBgJHtTRUxFQ1RPUl9OQVZfTElOS1N9LCAke1NFTEVDVE9SX05BVl9JVEVNU30gPiAke1NFTEVDVE9SX05BVl9MSU5LU30sICR7U0VMRUNUT1JfTElTVF9JVEVNU31gXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTiA9ICcuZHJvcGRvd24nXG5jb25zdCBTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSAnLmRyb3Bkb3duLXRvZ2dsZSdcblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgb2Zmc2V0OiBudWxsLCAvLyBUT0RPOiB2NiBAZGVwcmVjYXRlZCwga2VlcCBpdCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcmVhc29uc1xuICByb290TWFyZ2luOiAnMHB4IDBweCAtMjUlJyxcbiAgc21vb3RoU2Nyb2xsOiBmYWxzZSxcbiAgdGFyZ2V0OiBudWxsLFxuICB0aHJlc2hvbGQ6IFswLjEsIDAuNSwgMV1cbn1cblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIG9mZnNldDogJyhudW1iZXJ8bnVsbCknLCAvLyBUT0RPIHY2IEBkZXByZWNhdGVkLCBrZWVwIGl0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zXG4gIHJvb3RNYXJnaW46ICdzdHJpbmcnLFxuICBzbW9vdGhTY3JvbGw6ICdib29sZWFuJyxcbiAgdGFyZ2V0OiAnZWxlbWVudCcsXG4gIHRocmVzaG9sZDogJ2FycmF5J1xufVxuXG4vKipcbiAqIENsYXNzIGRlZmluaXRpb25cbiAqL1xuXG5jbGFzcyBTY3JvbGxTcHkgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgLy8gdGhpcy5fZWxlbWVudCBpcyB0aGUgb2JzZXJ2YWJsZXNDb250YWluZXIgYW5kIGNvbmZpZy50YXJnZXQgdGhlIG1lbnUgbGlua3Mgd3JhcHBlclxuICAgIHRoaXMuX3RhcmdldExpbmtzID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zID0gbmV3IE1hcCgpXG4gICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuX2VsZW1lbnQpLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnID8gbnVsbCA6IHRoaXMuX2VsZW1lbnRcbiAgICB0aGlzLl9hY3RpdmVUYXJnZXQgPSBudWxsXG4gICAgdGhpcy5fb2JzZXJ2ZXIgPSBudWxsXG4gICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhID0ge1xuICAgICAgdmlzaWJsZUVudHJ5VG9wOiAwLFxuICAgICAgcGFyZW50U2Nyb2xsVG9wOiAwXG4gICAgfVxuICAgIHRoaXMucmVmcmVzaCgpIC8vIGluaXRpYWxpemVcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgIHJldHVybiBEZWZhdWx0XG4gIH1cblxuICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgIHJldHVybiBEZWZhdWx0VHlwZVxuICB9XG5cbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgcmVmcmVzaCgpIHtcbiAgICB0aGlzLl9pbml0aWFsaXplVGFyZ2V0c0FuZE9ic2VydmFibGVzKClcbiAgICB0aGlzLl9tYXliZUVuYWJsZVNtb290aFNjcm9sbCgpXG5cbiAgICBpZiAodGhpcy5fb2JzZXJ2ZXIpIHtcbiAgICAgIHRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9vYnNlcnZlciA9IHRoaXMuX2dldE5ld09ic2VydmVyKClcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zLnZhbHVlcygpKSB7XG4gICAgICB0aGlzLl9vYnNlcnZlci5vYnNlcnZlKHNlY3Rpb24pXG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIC8vIFByaXZhdGVcbiAgX2NvbmZpZ0FmdGVyTWVyZ2UoY29uZmlnKSB7XG4gICAgLy8gVE9ETzogb24gdjYgdGFyZ2V0IHNob3VsZCBiZSBnaXZlbiBleHBsaWNpdGx5ICYgcmVtb3ZlIHRoZSB7dGFyZ2V0OiAnc3MtdGFyZ2V0J30gY2FzZVxuICAgIGNvbmZpZy50YXJnZXQgPSBnZXRFbGVtZW50KGNvbmZpZy50YXJnZXQpIHx8IGRvY3VtZW50LmJvZHlcblxuICAgIC8vIFRPRE86IHY2IE9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMuIFVzZSByb290TWFyZ2luIG9ubHlcbiAgICBjb25maWcucm9vdE1hcmdpbiA9IGNvbmZpZy5vZmZzZXQgPyBgJHtjb25maWcub2Zmc2V0fXB4IDBweCAtMzAlYCA6IGNvbmZpZy5yb290TWFyZ2luXG5cbiAgICBpZiAodHlwZW9mIGNvbmZpZy50aHJlc2hvbGQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25maWcudGhyZXNob2xkID0gY29uZmlnLnRocmVzaG9sZC5zcGxpdCgnLCcpLm1hcCh2YWx1ZSA9PiBOdW1iZXIucGFyc2VGbG9hdCh2YWx1ZSkpXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmZpZ1xuICB9XG5cbiAgX21heWJlRW5hYmxlU21vb3RoU2Nyb2xsKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlnLnNtb290aFNjcm9sbCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gdW5yZWdpc3RlciBhbnkgcHJldmlvdXMgbGlzdGVuZXJzXG4gICAgRXZlbnRIYW5kbGVyLm9mZih0aGlzLl9jb25maWcudGFyZ2V0LCBFVkVOVF9DTElDSylcblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9jb25maWcudGFyZ2V0LCBFVkVOVF9DTElDSywgU0VMRUNUT1JfVEFSR0VUX0xJTktTLCBldmVudCA9PiB7XG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IHRoaXMuX29ic2VydmFibGVTZWN0aW9ucy5nZXQoZXZlbnQudGFyZ2V0Lmhhc2gpXG4gICAgICBpZiAob2JzZXJ2YWJsZVNlY3Rpb24pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5fcm9vdEVsZW1lbnQgfHwgd2luZG93XG4gICAgICAgIGNvbnN0IGhlaWdodCA9IG9ic2VydmFibGVTZWN0aW9uLm9mZnNldFRvcCAtIHRoaXMuX2VsZW1lbnQub2Zmc2V0VG9wXG4gICAgICAgIGlmIChyb290LnNjcm9sbFRvKSB7XG4gICAgICAgICAgcm9vdC5zY3JvbGxUbyh7IHRvcDogaGVpZ2h0LCBiZWhhdmlvcjogJ3Ntb290aCcgfSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENocm9tZSA2MCBkb2Vzbid0IHN1cHBvcnQgYHNjcm9sbFRvYFxuICAgICAgICByb290LnNjcm9sbFRvcCA9IGhlaWdodFxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBfZ2V0TmV3T2JzZXJ2ZXIoKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHJvb3Q6IHRoaXMuX3Jvb3RFbGVtZW50LFxuICAgICAgdGhyZXNob2xkOiB0aGlzLl9jb25maWcudGhyZXNob2xkLFxuICAgICAgcm9vdE1hcmdpbjogdGhpcy5fY29uZmlnLnJvb3RNYXJnaW5cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGVudHJpZXMgPT4gdGhpcy5fb2JzZXJ2ZXJDYWxsYmFjayhlbnRyaWVzKSwgb3B0aW9ucylcbiAgfVxuXG4gIC8vIFRoZSBsb2dpYyBvZiBzZWxlY3Rpb25cbiAgX29ic2VydmVyQ2FsbGJhY2soZW50cmllcykge1xuICAgIGNvbnN0IHRhcmdldEVsZW1lbnQgPSBlbnRyeSA9PiB0aGlzLl90YXJnZXRMaW5rcy5nZXQoYCMke2VudHJ5LnRhcmdldC5pZH1gKVxuICAgIGNvbnN0IGFjdGl2YXRlID0gZW50cnkgPT4ge1xuICAgICAgdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcCA9IGVudHJ5LnRhcmdldC5vZmZzZXRUb3BcbiAgICAgIHRoaXMuX3Byb2Nlc3ModGFyZ2V0RWxlbWVudChlbnRyeSkpXG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50U2Nyb2xsVG9wID0gKHRoaXMuX3Jvb3RFbGVtZW50IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuc2Nyb2xsVG9wXG4gICAgY29uc3QgdXNlclNjcm9sbHNEb3duID0gcGFyZW50U2Nyb2xsVG9wID49IHRoaXMuX3ByZXZpb3VzU2Nyb2xsRGF0YS5wYXJlbnRTY3JvbGxUb3BcbiAgICB0aGlzLl9wcmV2aW91c1Njcm9sbERhdGEucGFyZW50U2Nyb2xsVG9wID0gcGFyZW50U2Nyb2xsVG9wXG5cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmICghZW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gbnVsbFxuICAgICAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRhcmdldEVsZW1lbnQoZW50cnkpKVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGVudHJ5SXNMb3dlclRoYW5QcmV2aW91cyA9IGVudHJ5LnRhcmdldC5vZmZzZXRUb3AgPj0gdGhpcy5fcHJldmlvdXNTY3JvbGxEYXRhLnZpc2libGVFbnRyeVRvcFxuICAgICAgLy8gaWYgd2UgYXJlIHNjcm9sbGluZyBkb3duLCBwaWNrIHRoZSBiaWdnZXIgb2Zmc2V0VG9wXG4gICAgICBpZiAodXNlclNjcm9sbHNEb3duICYmIGVudHJ5SXNMb3dlclRoYW5QcmV2aW91cykge1xuICAgICAgICBhY3RpdmF0ZShlbnRyeSlcbiAgICAgICAgLy8gaWYgcGFyZW50IGlzbid0IHNjcm9sbGVkLCBsZXQncyBrZWVwIHRoZSBmaXJzdCB2aXNpYmxlIGl0ZW0sIGJyZWFraW5nIHRoZSBpdGVyYXRpb25cbiAgICAgICAgaWYgKCFwYXJlbnRTY3JvbGxUb3ApIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHdlIGFyZSBzY3JvbGxpbmcgdXAsIHBpY2sgdGhlIHNtYWxsZXN0IG9mZnNldFRvcFxuICAgICAgaWYgKCF1c2VyU2Nyb2xsc0Rvd24gJiYgIWVudHJ5SXNMb3dlclRoYW5QcmV2aW91cykge1xuICAgICAgICBhY3RpdmF0ZShlbnRyeSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBfaW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcygpIHtcbiAgICB0aGlzLl90YXJnZXRMaW5rcyA9IG5ldyBNYXAoKVxuICAgIHRoaXMuX29ic2VydmFibGVTZWN0aW9ucyA9IG5ldyBNYXAoKVxuXG4gICAgY29uc3QgdGFyZ2V0TGlua3MgPSBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX1RBUkdFVF9MSU5LUywgdGhpcy5fY29uZmlnLnRhcmdldClcblxuICAgIGZvciAoY29uc3QgYW5jaG9yIG9mIHRhcmdldExpbmtzKSB7XG4gICAgICAvLyBlbnN1cmUgdGhhdCB0aGUgYW5jaG9yIGhhcyBhbiBpZCBhbmQgaXMgbm90IGRpc2FibGVkXG4gICAgICBpZiAoIWFuY2hvci5oYXNoIHx8IGlzRGlzYWJsZWQoYW5jaG9yKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBvYnNlcnZhYmxlU2VjdGlvbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoYW5jaG9yLmhhc2gsIHRoaXMuX2VsZW1lbnQpXG5cbiAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSBvYnNlcnZhYmxlU2VjdGlvbiBleGlzdHMgJiBpcyB2aXNpYmxlXG4gICAgICBpZiAoaXNWaXNpYmxlKG9ic2VydmFibGVTZWN0aW9uKSkge1xuICAgICAgICB0aGlzLl90YXJnZXRMaW5rcy5zZXQoYW5jaG9yLmhhc2gsIGFuY2hvcilcbiAgICAgICAgdGhpcy5fb2JzZXJ2YWJsZVNlY3Rpb25zLnNldChhbmNob3IuaGFzaCwgb2JzZXJ2YWJsZVNlY3Rpb24pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX3Byb2Nlc3ModGFyZ2V0KSB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZVRhcmdldCA9PT0gdGFyZ2V0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9jbGVhckFjdGl2ZUNsYXNzKHRoaXMuX2NvbmZpZy50YXJnZXQpXG4gICAgdGhpcy5fYWN0aXZlVGFyZ2V0ID0gdGFyZ2V0XG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgdGhpcy5fYWN0aXZhdGVQYXJlbnRzKHRhcmdldClcblxuICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0FDVElWQVRFLCB7IHJlbGF0ZWRUYXJnZXQ6IHRhcmdldCB9KVxuICB9XG5cbiAgX2FjdGl2YXRlUGFyZW50cyh0YXJnZXQpIHtcbiAgICAvLyBBY3RpdmF0ZSBkcm9wZG93biBwYXJlbnRzXG4gICAgaWYgKHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9EUk9QRE9XTl9JVEVNKSkge1xuICAgICAgU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUsIHRhcmdldC5jbG9zZXN0KFNFTEVDVE9SX0RST1BET1dOKSlcbiAgICAgICAgLmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxpc3RHcm91cCBvZiBTZWxlY3RvckVuZ2luZS5wYXJlbnRzKHRhcmdldCwgU0VMRUNUT1JfTkFWX0xJU1RfR1JPVVApKSB7XG4gICAgICAvLyBTZXQgdHJpZ2dlcmVkIGxpbmtzIHBhcmVudHMgYXMgYWN0aXZlXG4gICAgICAvLyBXaXRoIGJvdGggPHVsPiBhbmQgPG5hdj4gbWFya3VwIGEgcGFyZW50IGlzIHRoZSBwcmV2aW91cyBzaWJsaW5nIG9mIGFueSBuYXYgYW5jZXN0b3JcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBTZWxlY3RvckVuZ2luZS5wcmV2KGxpc3RHcm91cCwgU0VMRUNUT1JfTElOS19JVEVNUykpIHtcbiAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfQUNUSVZFKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIF9jbGVhckFjdGl2ZUNsYXNzKHBhcmVudCkge1xuICAgIHBhcmVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuXG4gICAgY29uc3QgYWN0aXZlTm9kZXMgPSBTZWxlY3RvckVuZ2luZS5maW5kKGAke1NFTEVDVE9SX1RBUkdFVF9MSU5LU30uJHtDTEFTU19OQU1FX0FDVElWRX1gLCBwYXJlbnQpXG4gICAgZm9yIChjb25zdCBub2RlIG9mIGFjdGl2ZU5vZGVzKSB7XG4gICAgICBub2RlLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gICAgfVxuICB9XG5cbiAgLy8gU3RhdGljXG4gIHN0YXRpYyBqUXVlcnlJbnRlcmZhY2UoY29uZmlnKSB7XG4gICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBkYXRhID0gU2Nyb2xsU3B5LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKHdpbmRvdywgRVZFTlRfTE9BRF9EQVRBX0FQSSwgKCkgPT4ge1xuICBmb3IgKGNvbnN0IHNweSBvZiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0RBVEFfU1BZKSkge1xuICAgIFNjcm9sbFNweS5nZXRPckNyZWF0ZUluc3RhbmNlKHNweSlcbiAgfVxufSlcblxuLyoqXG4gKiBqUXVlcnlcbiAqL1xuXG5kZWZpbmVKUXVlcnlQbHVnaW4oU2Nyb2xsU3B5KVxuXG5leHBvcnQgZGVmYXVsdCBTY3JvbGxTcHlcbiIsICIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY1LjIuMyk6IHRhYi5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG5cbmltcG9ydCB7IGRlZmluZUpRdWVyeVBsdWdpbiwgZ2V0RWxlbWVudEZyb21TZWxlY3RvciwgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQsIGlzRGlzYWJsZWQgfSBmcm9tICcuL3V0aWwvaW5kZXgnXG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZG9tL2V2ZW50LWhhbmRsZXInXG5pbXBvcnQgU2VsZWN0b3JFbmdpbmUgZnJvbSAnLi9kb20vc2VsZWN0b3ItZW5naW5lJ1xuaW1wb3J0IEJhc2VDb21wb25lbnQgZnJvbSAnLi9iYXNlLWNvbXBvbmVudCdcblxuLyoqXG4gKiBDb25zdGFudHNcbiAqL1xuXG5jb25zdCBOQU1FID0gJ3RhYidcbmNvbnN0IERBVEFfS0VZID0gJ2JzLnRhYidcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5cbmNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0hJRERFTiA9IGBoaWRkZW4ke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XID0gYHNob3cke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9TSE9XTiA9IGBzaG93biR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0NMSUNLX0RBVEFfQVBJID0gYGNsaWNrJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfS0VZRE9XTiA9IGBrZXlkb3duJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfTE9BRF9EQVRBX0FQSSA9IGBsb2FkJHtFVkVOVF9LRVl9YFxuXG5jb25zdCBBUlJPV19MRUZUX0tFWSA9ICdBcnJvd0xlZnQnXG5jb25zdCBBUlJPV19SSUdIVF9LRVkgPSAnQXJyb3dSaWdodCdcbmNvbnN0IEFSUk9XX1VQX0tFWSA9ICdBcnJvd1VwJ1xuY29uc3QgQVJST1dfRE9XTl9LRVkgPSAnQXJyb3dEb3duJ1xuXG5jb25zdCBDTEFTU19OQU1FX0FDVElWRSA9ICdhY3RpdmUnXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfU0hPVyA9ICdzaG93J1xuY29uc3QgQ0xBU1NfRFJPUERPV04gPSAnZHJvcGRvd24nXG5cbmNvbnN0IFNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSA9ICcuZHJvcGRvd24tdG9nZ2xlJ1xuY29uc3QgU0VMRUNUT1JfRFJPUERPV05fTUVOVSA9ICcuZHJvcGRvd24tbWVudSdcbmNvbnN0IE5PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUgPSAnOm5vdCguZHJvcGRvd24tdG9nZ2xlKSdcblxuY29uc3QgU0VMRUNUT1JfVEFCX1BBTkVMID0gJy5saXN0LWdyb3VwLCAubmF2LCBbcm9sZT1cInRhYmxpc3RcIl0nXG5jb25zdCBTRUxFQ1RPUl9PVVRFUiA9ICcubmF2LWl0ZW0sIC5saXN0LWdyb3VwLWl0ZW0nXG5jb25zdCBTRUxFQ1RPUl9JTk5FUiA9IGAubmF2LWxpbmske05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9LCAubGlzdC1ncm91cC1pdGVtJHtOT1RfU0VMRUNUT1JfRFJPUERPV05fVE9HR0xFfSwgW3JvbGU9XCJ0YWJcIl0ke05PVF9TRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEV9YFxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwidGFiXCJdLCBbZGF0YS1icy10b2dnbGU9XCJwaWxsXCJdLCBbZGF0YS1icy10b2dnbGU9XCJsaXN0XCJdJyAvLyB0b2RvOnY2OiBjb3VsZCBiZSBvbmx5IGB0YWJgXG5jb25zdCBTRUxFQ1RPUl9JTk5FUl9FTEVNID0gYCR7U0VMRUNUT1JfSU5ORVJ9LCAke1NFTEVDVE9SX0RBVEFfVE9HR0xFfWBcblxuY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEVfQUNUSVZFID0gYC4ke0NMQVNTX05BTUVfQUNUSVZFfVtkYXRhLWJzLXRvZ2dsZT1cInRhYlwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwicGlsbFwiXSwgLiR7Q0xBU1NfTkFNRV9BQ1RJVkV9W2RhdGEtYnMtdG9nZ2xlPVwibGlzdFwiXWBcblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVGFiIGV4dGVuZHMgQmFzZUNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHtcbiAgICBzdXBlcihlbGVtZW50KVxuICAgIHRoaXMuX3BhcmVudCA9IHRoaXMuX2VsZW1lbnQuY2xvc2VzdChTRUxFQ1RPUl9UQUJfUEFORUwpXG5cbiAgICBpZiAoIXRoaXMuX3BhcmVudCkge1xuICAgICAgcmV0dXJuXG4gICAgICAvLyB0b2RvOiBzaG91bGQgVGhyb3cgZXhjZXB0aW9uIG9uIHY2XG4gICAgICAvLyB0aHJvdyBuZXcgVHlwZUVycm9yKGAke2VsZW1lbnQub3V0ZXJIVE1MfSBoYXMgbm90IGEgdmFsaWQgcGFyZW50ICR7U0VMRUNUT1JfSU5ORVJfRUxFTX1gKVxuICAgIH1cblxuICAgIC8vIFNldCB1cCBpbml0aWFsIGFyaWEgYXR0cmlidXRlc1xuICAgIHRoaXMuX3NldEluaXRpYWxBdHRyaWJ1dGVzKHRoaXMuX3BhcmVudCwgdGhpcy5fZ2V0Q2hpbGRyZW4oKSlcblxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9LRVlET1dOLCBldmVudCA9PiB0aGlzLl9rZXlkb3duKGV2ZW50KSlcbiAgfVxuXG4gIC8vIEdldHRlcnNcbiAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgIHJldHVybiBOQU1FXG4gIH1cblxuICAvLyBQdWJsaWNcbiAgc2hvdygpIHsgLy8gU2hvd3MgdGhpcyBlbGVtIGFuZCBkZWFjdGl2YXRlIHRoZSBhY3RpdmUgc2libGluZyBpZiBleGlzdHNcbiAgICBjb25zdCBpbm5lckVsZW0gPSB0aGlzLl9lbGVtZW50XG4gICAgaWYgKHRoaXMuX2VsZW1Jc0FjdGl2ZShpbm5lckVsZW0pKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBTZWFyY2ggZm9yIGFjdGl2ZSB0YWIgb24gc2FtZSBwYXJlbnQgdG8gZGVhY3RpdmF0ZSBpdFxuICAgIGNvbnN0IGFjdGl2ZSA9IHRoaXMuX2dldEFjdGl2ZUVsZW0oKVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gYWN0aXZlID9cbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKGFjdGl2ZSwgRVZFTlRfSElERSwgeyByZWxhdGVkVGFyZ2V0OiBpbm5lckVsZW0gfSkgOlxuICAgICAgbnVsbFxuXG4gICAgY29uc3Qgc2hvd0V2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIoaW5uZXJFbGVtLCBFVkVOVF9TSE9XLCB7IHJlbGF0ZWRUYXJnZXQ6IGFjdGl2ZSB9KVxuXG4gICAgaWYgKHNob3dFdmVudC5kZWZhdWx0UHJldmVudGVkIHx8IChoaWRlRXZlbnQgJiYgaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9kZWFjdGl2YXRlKGFjdGl2ZSwgaW5uZXJFbGVtKVxuICAgIHRoaXMuX2FjdGl2YXRlKGlubmVyRWxlbSwgYWN0aXZlKVxuICB9XG5cbiAgLy8gUHJpdmF0ZVxuICBfYWN0aXZhdGUoZWxlbWVudCwgcmVsYXRlZEVsZW0pIHtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX0FDVElWRSlcblxuICAgIHRoaXMuX2FjdGl2YXRlKGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkpIC8vIFNlYXJjaCBhbmQgYWN0aXZhdGUvc2hvdyB0aGUgcHJvcGVyIHNlY3Rpb25cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgIT09ICd0YWInKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKVxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCB0cnVlKVxuICAgICAgdGhpcy5fdG9nZ2xlRHJvcERvd24oZWxlbWVudCwgdHJ1ZSlcbiAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKGVsZW1lbnQsIEVWRU5UX1NIT1dOLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRFbGVtXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soY29tcGxldGUsIGVsZW1lbnQsIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfRkFERSkpXG4gIH1cblxuICBfZGVhY3RpdmF0ZShlbGVtZW50LCByZWxhdGVkRWxlbSkge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfQUNUSVZFKVxuICAgIGVsZW1lbnQuYmx1cigpXG5cbiAgICB0aGlzLl9kZWFjdGl2YXRlKGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoZWxlbWVudCkpIC8vIFNlYXJjaCBhbmQgZGVhY3RpdmF0ZSB0aGUgc2hvd24gc2VjdGlvbiB0b29cblxuICAgIGNvbnN0IGNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgIT09ICd0YWInKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1cpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIGZhbHNlKVxuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJylcbiAgICAgIHRoaXMuX3RvZ2dsZURyb3BEb3duKGVsZW1lbnQsIGZhbHNlKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIoZWxlbWVudCwgRVZFTlRfSElEREVOLCB7IHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRFbGVtIH0pXG4gICAgfVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgZWxlbWVudCwgZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9GQURFKSlcbiAgfVxuXG4gIF9rZXlkb3duKGV2ZW50KSB7XG4gICAgaWYgKCEoW0FSUk9XX0xFRlRfS0VZLCBBUlJPV19SSUdIVF9LRVksIEFSUk9XX1VQX0tFWSwgQVJST1dfRE9XTl9LRVldLmluY2x1ZGVzKGV2ZW50LmtleSkpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKS8vIHN0b3BQcm9wYWdhdGlvbi9wcmV2ZW50RGVmYXVsdCBib3RoIGFkZGVkIHRvIHN1cHBvcnQgdXAvZG93biBrZXlzIHdpdGhvdXQgc2Nyb2xsaW5nIHRoZSBwYWdlXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgIGNvbnN0IGlzTmV4dCA9IFtBUlJPV19SSUdIVF9LRVksIEFSUk9XX0RPV05fS0VZXS5pbmNsdWRlcyhldmVudC5rZXkpXG4gICAgY29uc3QgbmV4dEFjdGl2ZUVsZW1lbnQgPSBnZXROZXh0QWN0aXZlRWxlbWVudCh0aGlzLl9nZXRDaGlsZHJlbigpLmZpbHRlcihlbGVtZW50ID0+ICFpc0Rpc2FibGVkKGVsZW1lbnQpKSwgZXZlbnQudGFyZ2V0LCBpc05leHQsIHRydWUpXG5cbiAgICBpZiAobmV4dEFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgIG5leHRBY3RpdmVFbGVtZW50LmZvY3VzKHsgcHJldmVudFNjcm9sbDogdHJ1ZSB9KVxuICAgICAgVGFiLmdldE9yQ3JlYXRlSW5zdGFuY2UobmV4dEFjdGl2ZUVsZW1lbnQpLnNob3coKVxuICAgIH1cbiAgfVxuXG4gIF9nZXRDaGlsZHJlbigpIHsgLy8gY29sbGVjdGlvbiBvZiBpbm5lciBlbGVtZW50c1xuICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kKFNFTEVDVE9SX0lOTkVSX0VMRU0sIHRoaXMuX3BhcmVudClcbiAgfVxuXG4gIF9nZXRBY3RpdmVFbGVtKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRDaGlsZHJlbigpLmZpbmQoY2hpbGQgPT4gdGhpcy5fZWxlbUlzQWN0aXZlKGNoaWxkKSkgfHwgbnVsbFxuICB9XG5cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzKHBhcmVudCwgY2hpbGRyZW4pIHtcbiAgICB0aGlzLl9zZXRBdHRyaWJ1dGVJZk5vdEV4aXN0cyhwYXJlbnQsICdyb2xlJywgJ3RhYmxpc3QnKVxuXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXNPbkNoaWxkKGNoaWxkKVxuICAgIH1cbiAgfVxuXG4gIF9zZXRJbml0aWFsQXR0cmlidXRlc09uQ2hpbGQoY2hpbGQpIHtcbiAgICBjaGlsZCA9IHRoaXMuX2dldElubmVyRWxlbWVudChjaGlsZClcbiAgICBjb25zdCBpc0FjdGl2ZSA9IHRoaXMuX2VsZW1Jc0FjdGl2ZShjaGlsZClcbiAgICBjb25zdCBvdXRlckVsZW0gPSB0aGlzLl9nZXRPdXRlckVsZW1lbnQoY2hpbGQpXG4gICAgY2hpbGQuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgaXNBY3RpdmUpXG5cbiAgICBpZiAob3V0ZXJFbGVtICE9PSBjaGlsZCkge1xuICAgICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMob3V0ZXJFbGVtLCAncm9sZScsICdwcmVzZW50YXRpb24nKVxuICAgIH1cblxuICAgIGlmICghaXNBY3RpdmUpIHtcbiAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKVxuICAgIH1cblxuICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKGNoaWxkLCAncm9sZScsICd0YWInKVxuXG4gICAgLy8gc2V0IGF0dHJpYnV0ZXMgdG8gdGhlIHJlbGF0ZWQgcGFuZWwgdG9vXG4gICAgdGhpcy5fc2V0SW5pdGlhbEF0dHJpYnV0ZXNPblRhcmdldFBhbmVsKGNoaWxkKVxuICB9XG5cbiAgX3NldEluaXRpYWxBdHRyaWJ1dGVzT25UYXJnZXRQYW5lbChjaGlsZCkge1xuICAgIGNvbnN0IHRhcmdldCA9IGdldEVsZW1lbnRGcm9tU2VsZWN0b3IoY2hpbGQpXG5cbiAgICBpZiAoIXRhcmdldCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdGhpcy5fc2V0QXR0cmlidXRlSWZOb3RFeGlzdHModGFyZ2V0LCAncm9sZScsICd0YWJwYW5lbCcpXG5cbiAgICBpZiAoY2hpbGQuaWQpIHtcbiAgICAgIHRoaXMuX3NldEF0dHJpYnV0ZUlmTm90RXhpc3RzKHRhcmdldCwgJ2FyaWEtbGFiZWxsZWRieScsIGAjJHtjaGlsZC5pZH1gKVxuICAgIH1cbiAgfVxuXG4gIF90b2dnbGVEcm9wRG93bihlbGVtZW50LCBvcGVuKSB7XG4gICAgY29uc3Qgb3V0ZXJFbGVtID0gdGhpcy5fZ2V0T3V0ZXJFbGVtZW50KGVsZW1lbnQpXG4gICAgaWYgKCFvdXRlckVsZW0uY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX0RST1BET1dOKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdG9nZ2xlID0gKHNlbGVjdG9yLCBjbGFzc05hbWUpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKHNlbGVjdG9yLCBvdXRlckVsZW0pXG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoY2xhc3NOYW1lLCBvcGVuKVxuICAgICAgfVxuICAgIH1cblxuICAgIHRvZ2dsZShTRUxFQ1RPUl9EUk9QRE9XTl9UT0dHTEUsIENMQVNTX05BTUVfQUNUSVZFKVxuICAgIHRvZ2dsZShTRUxFQ1RPUl9EUk9QRE9XTl9NRU5VLCBDTEFTU19OQU1FX1NIT1cpXG4gICAgb3V0ZXJFbGVtLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIG9wZW4pXG4gIH1cblxuICBfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSkge1xuICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCB2YWx1ZSlcbiAgICB9XG4gIH1cblxuICBfZWxlbUlzQWN0aXZlKGVsZW0pIHtcbiAgICByZXR1cm4gZWxlbS5jbGFzc0xpc3QuY29udGFpbnMoQ0xBU1NfTkFNRV9BQ1RJVkUpXG4gIH1cblxuICAvLyBUcnkgdG8gZ2V0IHRoZSBpbm5lciBlbGVtZW50ICh1c3VhbGx5IHRoZSAubmF2LWxpbmspXG4gIF9nZXRJbm5lckVsZW1lbnQoZWxlbSkge1xuICAgIHJldHVybiBlbGVtLm1hdGNoZXMoU0VMRUNUT1JfSU5ORVJfRUxFTSkgPyBlbGVtIDogU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9JTk5FUl9FTEVNLCBlbGVtKVxuICB9XG5cbiAgLy8gVHJ5IHRvIGdldCB0aGUgb3V0ZXIgZWxlbWVudCAodXN1YWxseSB0aGUgLm5hdi1pdGVtKVxuICBfZ2V0T3V0ZXJFbGVtZW50KGVsZW0pIHtcbiAgICByZXR1cm4gZWxlbS5jbG9zZXN0KFNFTEVDVE9SX09VVEVSKSB8fCBlbGVtXG4gIH1cblxuICAvLyBTdGF0aWNcbiAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBUYWIuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhW2NvbmZpZ10gPT09IHVuZGVmaW5lZCB8fCBjb25maWcuc3RhcnRzV2l0aCgnXycpIHx8IGNvbmZpZyA9PT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBObyBtZXRob2QgbmFtZWQgXCIke2NvbmZpZ31cImApXG4gICAgICB9XG5cbiAgICAgIGRhdGFbY29uZmlnXSgpXG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKVxuICB9XG5cbiAgaWYgKGlzRGlzYWJsZWQodGhpcykpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKHRoaXMpLnNob3coKVxufSlcblxuLyoqXG4gKiBJbml0aWFsaXplIG9uIGZvY3VzXG4gKi9cbkV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX0xPQURfREFUQV9BUEksICgpID0+IHtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIFNlbGVjdG9yRW5naW5lLmZpbmQoU0VMRUNUT1JfREFUQV9UT0dHTEVfQUNUSVZFKSkge1xuICAgIFRhYi5nZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQpXG4gIH1cbn0pXG4vKipcbiAqIGpRdWVyeVxuICovXG5cbmRlZmluZUpRdWVyeVBsdWdpbihUYWIpXG5cbmV4cG9ydCBkZWZhdWx0IFRhYlxuIiwgIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjUuMi4zKTogdG9hc3QuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xuXG5pbXBvcnQgeyBkZWZpbmVKUXVlcnlQbHVnaW4sIHJlZmxvdyB9IGZyb20gJy4vdXRpbC9pbmRleCdcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi9kb20vZXZlbnQtaGFuZGxlcidcbmltcG9ydCBCYXNlQ29tcG9uZW50IGZyb20gJy4vYmFzZS1jb21wb25lbnQnXG5pbXBvcnQgeyBlbmFibGVEaXNtaXNzVHJpZ2dlciB9IGZyb20gJy4vdXRpbC9jb21wb25lbnQtZnVuY3Rpb25zJ1xuXG4vKipcbiAqIENvbnN0YW50c1xuICovXG5cbmNvbnN0IE5BTUUgPSAndG9hc3QnXG5jb25zdCBEQVRBX0tFWSA9ICdicy50b2FzdCdcbmNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gXG5cbmNvbnN0IEVWRU5UX01PVVNFT1ZFUiA9IGBtb3VzZW92ZXIke0VWRU5UX0tFWX1gXG5jb25zdCBFVkVOVF9NT1VTRU9VVCA9IGBtb3VzZW91dCR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0ZPQ1VTSU4gPSBgZm9jdXNpbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX0ZPQ1VTT1VUID0gYGZvY3Vzb3V0JHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElERSA9IGBoaWRlJHtFVkVOVF9LRVl9YFxuY29uc3QgRVZFTlRfSElEREVOID0gYGhpZGRlbiR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1cgPSBgc2hvdyR7RVZFTlRfS0VZfWBcbmNvbnN0IEVWRU5UX1NIT1dOID0gYHNob3duJHtFVkVOVF9LRVl9YFxuXG5jb25zdCBDTEFTU19OQU1FX0ZBREUgPSAnZmFkZSdcbmNvbnN0IENMQVNTX05BTUVfSElERSA9ICdoaWRlJyAvLyBAZGVwcmVjYXRlZCAtIGtlcHQgaGVyZSBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnXG5jb25zdCBDTEFTU19OQU1FX1NIT1dJTkcgPSAnc2hvd2luZydcblxuY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gIGFuaW1hdGlvbjogJ2Jvb2xlYW4nLFxuICBhdXRvaGlkZTogJ2Jvb2xlYW4nLFxuICBkZWxheTogJ251bWJlcidcbn1cblxuY29uc3QgRGVmYXVsdCA9IHtcbiAgYW5pbWF0aW9uOiB0cnVlLFxuICBhdXRvaGlkZTogdHJ1ZSxcbiAgZGVsYXk6IDUwMDBcbn1cblxuLyoqXG4gKiBDbGFzcyBkZWZpbml0aW9uXG4gKi9cblxuY2xhc3MgVG9hc3QgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgY29uZmlnKVxuXG4gICAgdGhpcy5fdGltZW91dCA9IG51bGxcbiAgICB0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9uID0gZmFsc2VcbiAgICB0aGlzLl9oYXNLZXlib2FyZEludGVyYWN0aW9uID0gZmFsc2VcbiAgICB0aGlzLl9zZXRMaXN0ZW5lcnMoKVxuICB9XG5cbiAgLy8gR2V0dGVyc1xuICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRcbiAgfVxuXG4gIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgcmV0dXJuIERlZmF1bHRUeXBlXG4gIH1cblxuICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgcmV0dXJuIE5BTUVcbiAgfVxuXG4gIC8vIFB1YmxpY1xuICBzaG93KCkge1xuICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1cpXG5cbiAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX2NsZWFyVGltZW91dCgpXG5cbiAgICBpZiAodGhpcy5fY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSlcbiAgICB9XG5cbiAgICBjb25zdCBjb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX1NIT1dJTkcpXG4gICAgICBFdmVudEhhbmRsZXIudHJpZ2dlcih0aGlzLl9lbGVtZW50LCBFVkVOVF9TSE9XTilcblxuICAgICAgdGhpcy5fbWF5YmVTY2hlZHVsZUhpZGUoKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShDTEFTU19OQU1FX0hJREUpIC8vIEBkZXByZWNhdGVkXG4gICAgcmVmbG93KHRoaXMuX2VsZW1lbnQpXG4gICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfU0hPVywgQ0xBU1NfTkFNRV9TSE9XSU5HKVxuXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbilcbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2hvd24oKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSlcblxuICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY29tcGxldGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5hZGQoQ0xBU1NfTkFNRV9ISURFKSAvLyBAZGVwcmVjYXRlZFxuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPV0lORywgQ0xBU1NfTkFNRV9TSE9XKVxuICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKVxuICAgIH1cblxuICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1dJTkcpXG4gICAgdGhpcy5fcXVldWVDYWxsYmFjayhjb21wbGV0ZSwgdGhpcy5fZWxlbWVudCwgdGhpcy5fY29uZmlnLmFuaW1hdGlvbilcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5fY2xlYXJUaW1lb3V0KClcblxuICAgIGlmICh0aGlzLmlzU2hvd24oKSkge1xuICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU0hPVylcbiAgICB9XG5cbiAgICBzdXBlci5kaXNwb3NlKClcbiAgfVxuXG4gIGlzU2hvd24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKENMQVNTX05BTUVfU0hPVylcbiAgfVxuXG4gIC8vIFByaXZhdGVcblxuICBfbWF5YmVTY2hlZHVsZUhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuYXV0b2hpZGUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLl9oYXNNb3VzZUludGVyYWN0aW9uIHx8IHRoaXMuX2hhc0tleWJvYXJkSW50ZXJhY3Rpb24pIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIHRoaXMuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaGlkZSgpXG4gICAgfSwgdGhpcy5fY29uZmlnLmRlbGF5KVxuICB9XG5cbiAgX29uSW50ZXJhY3Rpb24oZXZlbnQsIGlzSW50ZXJhY3RpbmcpIHtcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgICBjYXNlICdtb3VzZW91dCc6IHtcbiAgICAgICAgdGhpcy5faGFzTW91c2VJbnRlcmFjdGlvbiA9IGlzSW50ZXJhY3RpbmdcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnZm9jdXNpbic6XG4gICAgICBjYXNlICdmb2N1c291dCc6IHtcbiAgICAgICAgdGhpcy5faGFzS2V5Ym9hcmRJbnRlcmFjdGlvbiA9IGlzSW50ZXJhY3RpbmdcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc0ludGVyYWN0aW5nKSB7XG4gICAgICB0aGlzLl9jbGVhclRpbWVvdXQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgbmV4dEVsZW1lbnQgPSBldmVudC5yZWxhdGVkVGFyZ2V0XG4gICAgaWYgKHRoaXMuX2VsZW1lbnQgPT09IG5leHRFbGVtZW50IHx8IHRoaXMuX2VsZW1lbnQuY29udGFpbnMobmV4dEVsZW1lbnQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICB0aGlzLl9tYXliZVNjaGVkdWxlSGlkZSgpXG4gIH1cblxuICBfc2V0TGlzdGVuZXJzKCkge1xuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRU9WRVIsIGV2ZW50ID0+IHRoaXMuX29uSW50ZXJhY3Rpb24oZXZlbnQsIHRydWUpKVxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9NT1VTRU9VVCwgZXZlbnQgPT4gdGhpcy5fb25JbnRlcmFjdGlvbihldmVudCwgZmFsc2UpKVxuICAgIEV2ZW50SGFuZGxlci5vbih0aGlzLl9lbGVtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9vbkludGVyYWN0aW9uKGV2ZW50LCB0cnVlKSlcbiAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfRk9DVVNPVVQsIGV2ZW50ID0+IHRoaXMuX29uSW50ZXJhY3Rpb24oZXZlbnQsIGZhbHNlKSlcbiAgfVxuXG4gIF9jbGVhclRpbWVvdXQoKSB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpXG4gICAgdGhpcy5fdGltZW91dCA9IG51bGxcbiAgfVxuXG4gIC8vIFN0YXRpY1xuICBzdGF0aWMgalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgZGF0YSA9IFRvYXN0LmdldE9yQ3JlYXRlSW5zdGFuY2UodGhpcywgY29uZmlnKVxuXG4gICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKVxuICAgICAgICB9XG5cbiAgICAgICAgZGF0YVtjb25maWddKHRoaXMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxufVxuXG4vKipcbiAqIERhdGEgQVBJIGltcGxlbWVudGF0aW9uXG4gKi9cblxuZW5hYmxlRGlzbWlzc1RyaWdnZXIoVG9hc3QpXG5cbi8qKlxuICogalF1ZXJ5XG4gKi9cblxuZGVmaW5lSlF1ZXJ5UGx1Z2luKFRvYXN0KVxuXG5leHBvcnQgZGVmYXVsdCBUb2FzdFxuIiwgImltcG9ydCAkIGZyb20gXCJqcXVlcnlcIlxuXG4kKGZ1bmN0aW9uICgpIHtcbiAgJChcInNlbGVjdC50cmVlXCIpLmNoYW5nZShmdW5jdGlvbiAoKSB7XG4gICAgZG9jdW1lbnQubG9jYXRpb24gPSB0aGlzLnZhbHVlO1xuICB9KTtcbn0pO1xuIiwgImltcG9ydCAkIGZyb20gXCJqcXVlcnlcIjtcbmltcG9ydCBrbXhfY29sb3JzIGZyb20gXCIuL2tteF9jb2xvcnNcIjtcblxuZnVuY3Rpb24gZ2V0UmFuZG9tSW50KG1heCkge1xuICByZXR1cm4gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogbWF4KTtcbn1cblxuJChmdW5jdGlvbigpIHtcbiAgc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgaSA9IGdldFJhbmRvbUludChrbXhfY29sb3JzLmluZGV4Lmxlbmd0aCk7XG4gICAgY29uc3QgbmFtZSA9IGtteF9jb2xvcnMuaW5kZXhbaV07XG4gICAgY29uc3QgY29sb3IgPSBrbXhfY29sb3JzW25hbWVdO1xuICAgIGNvbnN0IHggPSAoZ2V0UmFuZG9tSW50KDk5KSAtIDQ4KSAqIDAuMDAyO1xuICAgICQoXCJhXCIpLmNzcyhcInRleHQtc2hhZG93XCIsIFwiMCAwIDBcIik7XG4gICAgJChcImE6aG92ZXJcIikuY3NzKFwidGV4dC1zaGFkb3dcIiwgeCArIFwiZW0gMCAwIFwiICsgY29sb3IpO1xuICB9LCAyMDApO1xufSk7XG4iLCAiY29uc3Qga214X2NvbG9ycyA9IHtcbiAgXCJrbXgtYmxhY2tcIjogICBcIiMxZTFmMWRcIixcbiAgXCJrbXgtYmx1ZVwiOiAgICBcIiM1YTYwZjlcIixcbiAgXCJrbXgtYmx1ZTFcIjogICBcIiM2ZjcyZjlcIixcbiAgXCJrbXgtYmx1ZTJcIjogICBcIiM5Yzk5ZmRcIixcbiAgXCJrbXgtYmx1ZTNcIjogICBcIiM1YTYwZjlcIixcbiAgXCJrbXgtYmx1ZTRcIjogICBcIiM2ZjcyZjlcIixcbiAgXCJrbXgtYmx1ZTVcIjogICBcIiM5Yzk5ZmRcIixcbiAgXCJpbmRleFwiOiBbXG4gICAgXCJrbXgtYmxhY2tcIixcbiAgICBcImtteC1ibHVlXCIsXG4gICAgXCJrbXgtYmx1ZTFcIixcbiAgICBcImtteC1ibHVlMlwiLFxuICAgIFwia214LWJsdWUzXCIsXG4gICAgXCJrbXgtYmx1ZTRcIixcbiAgICBcImtteC1ibHVlNVwiLFxuICAgIFwia214LWN5YW5cIixcbiAgICBcImtteC1jeWFuMVwiLFxuICAgIFwia214LWdyZWVuXCIsXG4gICAgXCJrbXgtZ3JlZW4xXCIsXG4gICAgXCJrbXgtb3JhbmdlXCIsXG4gICAgXCJrbXgtb3JhbmdlMVwiLFxuICAgIFwia214LW9yYW5nZTJcIixcbiAgICBcImtteC1waW5rXCIsXG4gICAgXCJrbXgtd2hpdGVcIixcbiAgICBcImtteC13aGl0ZTFcIixcbiAgICBcImtteC13aGl0ZTJcIixcbiAgICBcImtteC15ZWxsb3dcIixcbiAgICBcImtteC15ZWxsb3cxXCIsXG4gICAgXCJrbXgteWVsbG93MlwiLFxuICAgIFwia214LXllbGxvdzNcIlxuICBdLFxuICBcImtteC1jeWFuXCI6ICAgIFwiI2Q0ZjNmNlwiLFxuICBcImtteC1jeWFuMVwiOiAgIFwiI2Q0ZjNmNlwiLFxuICBcImtteC1ncmVlblwiOiAgIFwiI2M0ZWQzYVwiLFxuICBcImtteC1ncmVlbjFcIjogIFwiI2M0ZWQzYVwiLFxuICBcImtteC1vcmFuZ2VcIjogIFwiI2Y4NjgxY1wiLFxuICBcImtteC1vcmFuZ2UxXCI6IFwiI2ZhNzczNFwiLFxuICBcImtteC1vcmFuZ2UyXCI6IFwiI2ZmYTUzMlwiLFxuICBcImtteC1waW5rXCI6ICAgIFwiI2ZjOWVmOVwiLFxuICBcImtteC13aGl0ZVwiOiAgIFwiI2Y1ZjhmNFwiLFxuICBcImtteC13aGl0ZTFcIjogIFwiI2ZmZjlmMlwiLFxuICBcImtteC13aGl0ZTJcIjogIFwiI2ZmZmZmZlwiLFxuICBcImtteC15ZWxsb3dcIjogIFwiI2VjZmU0OVwiLFxuICBcImtteC15ZWxsb3cxXCI6IFwiI2ZmZjQzZVwiLFxuICBcImtteC15ZWxsb3cyXCI6ICBcIiNlY2ZlNDlcIixcbiAgXCJrbXgteWVsbG93M1wiOiBcIiNmZmY0M2VcIlxufTtcbmV4cG9ydCBkZWZhdWx0IGtteF9jb2xvcnM7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG5cbihmdW5jdGlvbigpIHtcbiAgdmFyIFBvbHlmaWxsRXZlbnQgPSBldmVudENvbnN0cnVjdG9yKCk7XG5cbiAgZnVuY3Rpb24gZXZlbnRDb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gd2luZG93LkN1c3RvbUV2ZW50O1xuICAgIC8vIElFPD05IFN1cHBvcnRcbiAgICBmdW5jdGlvbiBDdXN0b21FdmVudChldmVudCwgcGFyYW1zKSB7XG4gICAgICBwYXJhbXMgPSBwYXJhbXMgfHwge2J1YmJsZXM6IGZhbHNlLCBjYW5jZWxhYmxlOiBmYWxzZSwgZGV0YWlsOiB1bmRlZmluZWR9O1xuICAgICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICAgICAgZXZ0LmluaXRDdXN0b21FdmVudChldmVudCwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgICAgIHJldHVybiBldnQ7XG4gICAgfVxuICAgIEN1c3RvbUV2ZW50LnByb3RvdHlwZSA9IHdpbmRvdy5FdmVudC5wcm90b3R5cGU7XG4gICAgcmV0dXJuIEN1c3RvbUV2ZW50O1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRIaWRkZW5JbnB1dChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgICBpbnB1dC50eXBlID0gXCJoaWRkZW5cIjtcbiAgICBpbnB1dC5uYW1lID0gbmFtZTtcbiAgICBpbnB1dC52YWx1ZSA9IHZhbHVlO1xuICAgIHJldHVybiBpbnB1dDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZUNsaWNrKGVsZW1lbnQsIHRhcmdldE1vZGlmaWVyS2V5KSB7XG4gICAgdmFyIHRvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRvXCIpLFxuICAgICAgICBtZXRob2QgPSBidWlsZEhpZGRlbklucHV0KFwiX21ldGhvZFwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpKSxcbiAgICAgICAgY3NyZiA9IGJ1aWxkSGlkZGVuSW5wdXQoXCJfY3NyZl90b2tlblwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY3NyZlwiKSksXG4gICAgICAgIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKSxcbiAgICAgICAgdGFyZ2V0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIik7XG5cbiAgICBmb3JtLm1ldGhvZCA9IChlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpID09PSBcImdldFwiKSA/IFwiZ2V0XCIgOiBcInBvc3RcIjtcbiAgICBmb3JtLmFjdGlvbiA9IHRvO1xuICAgIGZvcm0uc3R5bGUuZGlzcGxheSA9IFwiaGlkZGVuXCI7XG5cbiAgICBpZiAodGFyZ2V0KSBmb3JtLnRhcmdldCA9IHRhcmdldDtcbiAgICBlbHNlIGlmICh0YXJnZXRNb2RpZmllcktleSkgZm9ybS50YXJnZXQgPSBcIl9ibGFua1wiO1xuXG4gICAgZm9ybS5hcHBlbmRDaGlsZChjc3JmKTtcbiAgICBmb3JtLmFwcGVuZENoaWxkKG1ldGhvZCk7XG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChmb3JtKTtcbiAgICBmb3JtLnN1Ym1pdCgpO1xuICB9XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbihlKSB7XG4gICAgdmFyIGVsZW1lbnQgPSBlLnRhcmdldDtcbiAgICBpZiAoZS5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47XG5cbiAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSkge1xuICAgICAgdmFyIHBob2VuaXhMaW5rRXZlbnQgPSBuZXcgUG9seWZpbGxFdmVudCgncGhvZW5peC5saW5rLmNsaWNrJywge1xuICAgICAgICBcImJ1YmJsZXNcIjogdHJ1ZSwgXCJjYW5jZWxhYmxlXCI6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWVsZW1lbnQuZGlzcGF0Y2hFdmVudChwaG9lbml4TGlua0V2ZW50KSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tZXRob2RcIikpIHtcbiAgICAgICAgaGFuZGxlQ2xpY2soZWxlbWVudCwgZS5tZXRhS2V5IHx8IGUuc2hpZnRLZXkpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQgPSBlbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICB9XG4gICAgfVxuICB9LCBmYWxzZSk7XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Bob2VuaXgubGluay5jbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgdmFyIG1lc3NhZ2UgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoXCJkYXRhLWNvbmZpcm1cIik7XG4gICAgaWYobWVzc2FnZSAmJiAhd2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sIGZhbHNlKTtcbn0pKCk7XG4iLCAiLy8gd3JhcHMgdmFsdWUgaW4gY2xvc3VyZSBvciByZXR1cm5zIGNsb3N1cmVcbmV4cG9ydCBsZXQgY2xvc3VyZSA9ICh2YWx1ZSkgPT4ge1xuICBpZih0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIil7XG4gICAgcmV0dXJuIHZhbHVlXG4gIH0gZWxzZSB7XG4gICAgbGV0IGNsb3N1cmUgPSBmdW5jdGlvbiAoKXsgcmV0dXJuIHZhbHVlIH1cbiAgICByZXR1cm4gY2xvc3VyZVxuICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGdsb2JhbFNlbGYgPSB0eXBlb2Ygc2VsZiAhPT0gXCJ1bmRlZmluZWRcIiA/IHNlbGYgOiBudWxsXG5leHBvcnQgY29uc3QgcGh4V2luZG93ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IG51bGxcbmV4cG9ydCBjb25zdCBnbG9iYWwgPSBnbG9iYWxTZWxmIHx8IHBoeFdpbmRvdyB8fCB0aGlzXG5leHBvcnQgY29uc3QgREVGQVVMVF9WU04gPSBcIjIuMC4wXCJcbmV4cG9ydCBjb25zdCBTT0NLRVRfU1RBVEVTID0ge2Nvbm5lY3Rpbmc6IDAsIG9wZW46IDEsIGNsb3Npbmc6IDIsIGNsb3NlZDogM31cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RJTUVPVVQgPSAxMDAwMFxuZXhwb3J0IGNvbnN0IFdTX0NMT1NFX05PUk1BTCA9IDEwMDBcbmV4cG9ydCBjb25zdCBDSEFOTkVMX1NUQVRFUyA9IHtcbiAgY2xvc2VkOiBcImNsb3NlZFwiLFxuICBlcnJvcmVkOiBcImVycm9yZWRcIixcbiAgam9pbmVkOiBcImpvaW5lZFwiLFxuICBqb2luaW5nOiBcImpvaW5pbmdcIixcbiAgbGVhdmluZzogXCJsZWF2aW5nXCIsXG59XG5leHBvcnQgY29uc3QgQ0hBTk5FTF9FVkVOVFMgPSB7XG4gIGNsb3NlOiBcInBoeF9jbG9zZVwiLFxuICBlcnJvcjogXCJwaHhfZXJyb3JcIixcbiAgam9pbjogXCJwaHhfam9pblwiLFxuICByZXBseTogXCJwaHhfcmVwbHlcIixcbiAgbGVhdmU6IFwicGh4X2xlYXZlXCJcbn1cblxuZXhwb3J0IGNvbnN0IFRSQU5TUE9SVFMgPSB7XG4gIGxvbmdwb2xsOiBcImxvbmdwb2xsXCIsXG4gIHdlYnNvY2tldDogXCJ3ZWJzb2NrZXRcIlxufVxuZXhwb3J0IGNvbnN0IFhIUl9TVEFURVMgPSB7XG4gIGNvbXBsZXRlOiA0XG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHVzaFxuICogQHBhcmFtIHtDaGFubmVsfSBjaGFubmVsIC0gVGhlIENoYW5uZWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIFRoZSBldmVudCwgZm9yIGV4YW1wbGUgYFwicGh4X2pvaW5cImBcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkIC0gVGhlIHBheWxvYWQsIGZvciBleGFtcGxlIGB7dXNlcl9pZDogMTIzfWBcbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IC0gVGhlIHB1c2ggdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHVzaCB7XG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIGV2ZW50LCBwYXlsb2FkLCB0aW1lb3V0KXtcbiAgICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsXG4gICAgdGhpcy5ldmVudCA9IGV2ZW50XG4gICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZCB8fCBmdW5jdGlvbiAoKXsgcmV0dXJuIHt9IH1cbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gICAgdGhpcy5yZWNIb29rcyA9IFtdXG4gICAgdGhpcy5zZW50ID0gZmFsc2VcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdGltZW91dFxuICAgKi9cbiAgcmVzZW5kKHRpbWVvdXQpe1xuICAgIHRoaXMudGltZW91dCA9IHRpbWVvdXRcbiAgICB0aGlzLnJlc2V0KClcbiAgICB0aGlzLnNlbmQoKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqL1xuICBzZW5kKCl7XG4gICAgaWYodGhpcy5oYXNSZWNlaXZlZChcInRpbWVvdXRcIikpeyByZXR1cm4gfVxuICAgIHRoaXMuc3RhcnRUaW1lb3V0KClcbiAgICB0aGlzLnNlbnQgPSB0cnVlXG4gICAgdGhpcy5jaGFubmVsLnNvY2tldC5wdXNoKHtcbiAgICAgIHRvcGljOiB0aGlzLmNoYW5uZWwudG9waWMsXG4gICAgICBldmVudDogdGhpcy5ldmVudCxcbiAgICAgIHBheWxvYWQ6IHRoaXMucGF5bG9hZCgpLFxuICAgICAgcmVmOiB0aGlzLnJlZixcbiAgICAgIGpvaW5fcmVmOiB0aGlzLmNoYW5uZWwuam9pblJlZigpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0geyp9IHN0YXR1c1xuICAgKiBAcGFyYW0geyp9IGNhbGxiYWNrXG4gICAqL1xuICByZWNlaXZlKHN0YXR1cywgY2FsbGJhY2spe1xuICAgIGlmKHRoaXMuaGFzUmVjZWl2ZWQoc3RhdHVzKSl7XG4gICAgICBjYWxsYmFjayh0aGlzLnJlY2VpdmVkUmVzcC5yZXNwb25zZSlcbiAgICB9XG5cbiAgICB0aGlzLnJlY0hvb2tzLnB1c2goe3N0YXR1cywgY2FsbGJhY2t9KVxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlc2V0KCl7XG4gICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgdGhpcy5yZWYgPSBudWxsXG4gICAgdGhpcy5yZWZFdmVudCA9IG51bGxcbiAgICB0aGlzLnJlY2VpdmVkUmVzcCA9IG51bGxcbiAgICB0aGlzLnNlbnQgPSBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYXRjaFJlY2VpdmUoe3N0YXR1cywgcmVzcG9uc2UsIF9yZWZ9KXtcbiAgICB0aGlzLnJlY0hvb2tzLmZpbHRlcihoID0+IGguc3RhdHVzID09PSBzdGF0dXMpXG4gICAgICAuZm9yRWFjaChoID0+IGguY2FsbGJhY2socmVzcG9uc2UpKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWxSZWZFdmVudCgpe1xuICAgIGlmKCF0aGlzLnJlZkV2ZW50KXsgcmV0dXJuIH1cbiAgICB0aGlzLmNoYW5uZWwub2ZmKHRoaXMucmVmRXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbFRpbWVvdXQoKXtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0VGltZXIpXG4gICAgdGhpcy50aW1lb3V0VGltZXIgPSBudWxsXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXJ0VGltZW91dCgpe1xuICAgIGlmKHRoaXMudGltZW91dFRpbWVyKXsgdGhpcy5jYW5jZWxUaW1lb3V0KCkgfVxuICAgIHRoaXMucmVmID0gdGhpcy5jaGFubmVsLnNvY2tldC5tYWtlUmVmKClcbiAgICB0aGlzLnJlZkV2ZW50ID0gdGhpcy5jaGFubmVsLnJlcGx5RXZlbnROYW1lKHRoaXMucmVmKVxuXG4gICAgdGhpcy5jaGFubmVsLm9uKHRoaXMucmVmRXZlbnQsIHBheWxvYWQgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxSZWZFdmVudCgpXG4gICAgICB0aGlzLmNhbmNlbFRpbWVvdXQoKVxuICAgICAgdGhpcy5yZWNlaXZlZFJlc3AgPSBwYXlsb2FkXG4gICAgICB0aGlzLm1hdGNoUmVjZWl2ZShwYXlsb2FkKVxuICAgIH0pXG5cbiAgICB0aGlzLnRpbWVvdXRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50cmlnZ2VyKFwidGltZW91dFwiLCB7fSlcbiAgICB9LCB0aGlzLnRpbWVvdXQpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGhhc1JlY2VpdmVkKHN0YXR1cyl7XG4gICAgcmV0dXJuIHRoaXMucmVjZWl2ZWRSZXNwICYmIHRoaXMucmVjZWl2ZWRSZXNwLnN0YXR1cyA9PT0gc3RhdHVzXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyaWdnZXIoc3RhdHVzLCByZXNwb25zZSl7XG4gICAgdGhpcy5jaGFubmVsLnRyaWdnZXIodGhpcy5yZWZFdmVudCwge3N0YXR1cywgcmVzcG9uc2V9KVxuICB9XG59XG4iLCAiLyoqXG4gKlxuICogQ3JlYXRlcyBhIHRpbWVyIHRoYXQgYWNjZXB0cyBhIGB0aW1lckNhbGNgIGZ1bmN0aW9uIHRvIHBlcmZvcm1cbiAqIGNhbGN1bGF0ZWQgdGltZW91dCByZXRyaWVzLCBzdWNoIGFzIGV4cG9uZW50aWFsIGJhY2tvZmYuXG4gKlxuICogQGV4YW1wbGVcbiAqIGxldCByZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB0aGlzLmNvbm5lY3QoKSwgZnVuY3Rpb24odHJpZXMpe1xuICogICByZXR1cm4gWzEwMDAsIDUwMDAsIDEwMDAwXVt0cmllcyAtIDFdIHx8IDEwMDAwXG4gKiB9KVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgNTAwMFxuICogcmVjb25uZWN0VGltZXIucmVzZXQoKVxuICogcmVjb25uZWN0VGltZXIuc2NoZWR1bGVUaW1lb3V0KCkgLy8gZmlyZXMgYWZ0ZXIgMTAwMFxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0aW1lckNhbGNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGltZXIge1xuICBjb25zdHJ1Y3RvcihjYWxsYmFjaywgdGltZXJDYWxjKXtcbiAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2tcbiAgICB0aGlzLnRpbWVyQ2FsYyA9IHRpbWVyQ2FsY1xuICAgIHRoaXMudGltZXIgPSBudWxsXG4gICAgdGhpcy50cmllcyA9IDBcbiAgfVxuXG4gIHJlc2V0KCl7XG4gICAgdGhpcy50cmllcyA9IDBcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcilcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWxzIGFueSBwcmV2aW91cyBzY2hlZHVsZVRpbWVvdXQgYW5kIHNjaGVkdWxlcyBjYWxsYmFja1xuICAgKi9cbiAgc2NoZWR1bGVUaW1lb3V0KCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpXG5cbiAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyaWVzID0gdGhpcy50cmllcyArIDFcbiAgICAgIHRoaXMuY2FsbGJhY2soKVxuICAgIH0sIHRoaXMudGltZXJDYWxjKHRoaXMudHJpZXMgKyAxKSlcbiAgfVxufVxuIiwgImltcG9ydCB7Y2xvc3VyZX0gZnJvbSBcIi4vdXRpbHNcIlxuaW1wb3J0IHtcbiAgQ0hBTk5FTF9FVkVOVFMsXG4gIENIQU5ORUxfU1RBVEVTLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQgUHVzaCBmcm9tIFwiLi9wdXNoXCJcbmltcG9ydCBUaW1lciBmcm9tIFwiLi90aW1lclwiXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0b3BpY1xuICogQHBhcmFtIHsoT2JqZWN0fGZ1bmN0aW9uKX0gcGFyYW1zXG4gKiBAcGFyYW0ge1NvY2tldH0gc29ja2V0XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoYW5uZWwge1xuICBjb25zdHJ1Y3Rvcih0b3BpYywgcGFyYW1zLCBzb2NrZXQpe1xuICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5jbG9zZWRcbiAgICB0aGlzLnRvcGljID0gdG9waWNcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUocGFyYW1zIHx8IHt9KVxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0XG4gICAgdGhpcy5iaW5kaW5ncyA9IFtdXG4gICAgdGhpcy5iaW5kaW5nUmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IHRoaXMuc29ja2V0LnRpbWVvdXRcbiAgICB0aGlzLmpvaW5lZE9uY2UgPSBmYWxzZVxuICAgIHRoaXMuam9pblB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5qb2luLCB0aGlzLnBhcmFtcywgdGhpcy50aW1lb3V0KVxuICAgIHRoaXMucHVzaEJ1ZmZlciA9IFtdXG4gICAgdGhpcy5zdGF0ZUNoYW5nZVJlZnMgPSBbXVxuXG4gICAgdGhpcy5yZWpvaW5UaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW4oKSB9XG4gICAgfSwgdGhpcy5zb2NrZXQucmVqb2luQWZ0ZXJNcylcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uRXJyb3IoKCkgPT4gdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpKSlcbiAgICB0aGlzLnN0YXRlQ2hhbmdlUmVmcy5wdXNoKHRoaXMuc29ja2V0Lm9uT3BlbigoKSA9PiB7XG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuaXNFcnJvcmVkKCkpeyB0aGlzLnJlam9pbigpIH1cbiAgICB9KVxuICAgIClcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuam9pbmVkXG4gICAgICB0aGlzLnJlam9pblRpbWVyLnJlc2V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5mb3JFYWNoKHB1c2hFdmVudCA9PiBwdXNoRXZlbnQuc2VuZCgpKVxuICAgICAgdGhpcy5wdXNoQnVmZmVyID0gW11cbiAgICB9KVxuICAgIHRoaXMuam9pblB1c2gucmVjZWl2ZShcImVycm9yXCIsICgpID0+IHtcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLm9uQ2xvc2UoKCkgPT4ge1xuICAgICAgdGhpcy5yZWpvaW5UaW1lci5yZXNldCgpXG4gICAgICBpZih0aGlzLnNvY2tldC5oYXNMb2dnZXIoKSkgdGhpcy5zb2NrZXQubG9nKFwiY2hhbm5lbFwiLCBgY2xvc2UgJHt0aGlzLnRvcGljfSAke3RoaXMuam9pblJlZigpfWApXG4gICAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkXG4gICAgICB0aGlzLnNvY2tldC5yZW1vdmUodGhpcylcbiAgICB9KVxuICAgIHRoaXMub25FcnJvcihyZWFzb24gPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGVycm9yICR7dGhpcy50b3BpY31gLCByZWFzb24pXG4gICAgICBpZih0aGlzLmlzSm9pbmluZygpKXsgdGhpcy5qb2luUHVzaC5yZXNldCgpIH1cbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICBpZih0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpKXsgdGhpcy5yZWpvaW5UaW1lci5zY2hlZHVsZVRpbWVvdXQoKSB9XG4gICAgfSlcbiAgICB0aGlzLmpvaW5QdXNoLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IHtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIGB0aW1lb3V0ICR7dGhpcy50b3BpY30gKCR7dGhpcy5qb2luUmVmKCl9KWAsIHRoaXMuam9pblB1c2gudGltZW91dClcbiAgICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRoaXMudGltZW91dClcbiAgICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICAgIHRoaXMuc3RhdGUgPSBDSEFOTkVMX1NUQVRFUy5lcnJvcmVkXG4gICAgICB0aGlzLmpvaW5QdXNoLnJlc2V0KClcbiAgICAgIGlmKHRoaXMuc29ja2V0LmlzQ29ubmVjdGVkKCkpeyB0aGlzLnJlam9pblRpbWVyLnNjaGVkdWxlVGltZW91dCgpIH1cbiAgICB9KVxuICAgIHRoaXMub24oQ0hBTk5FTF9FVkVOVFMucmVwbHksIChwYXlsb2FkLCByZWYpID0+IHtcbiAgICAgIHRoaXMudHJpZ2dlcih0aGlzLnJlcGx5RXZlbnROYW1lKHJlZiksIHBheWxvYWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBKb2luIHRoZSBjaGFubmVsXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGpvaW4odGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgaWYodGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRyaWVkIHRvIGpvaW4gbXVsdGlwbGUgdGltZXMuICdqb2luJyBjYW4gb25seSBiZSBjYWxsZWQgYSBzaW5nbGUgdGltZSBwZXIgY2hhbm5lbCBpbnN0YW5jZVwiKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgICB0aGlzLmpvaW5lZE9uY2UgPSB0cnVlXG4gICAgICB0aGlzLnJlam9pbigpXG4gICAgICByZXR1cm4gdGhpcy5qb2luUHVzaFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIb29rIGludG8gY2hhbm5lbCBjbG9zZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25DbG9zZShjYWxsYmFjayl7XG4gICAgdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5jbG9zZSwgY2FsbGJhY2spXG4gIH1cblxuICAvKipcbiAgICogSG9vayBpbnRvIGNoYW5uZWwgZXJyb3JzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkVycm9yKGNhbGxiYWNrKXtcbiAgICByZXR1cm4gdGhpcy5vbihDSEFOTkVMX0VWRU5UUy5lcnJvciwgcmVhc29uID0+IGNhbGxiYWNrKHJlYXNvbikpXG4gIH1cblxuICAvKipcbiAgICogU3Vic2NyaWJlcyBvbiBjaGFubmVsIGV2ZW50c1xuICAgKlxuICAgKiBTdWJzY3JpcHRpb24gcmV0dXJucyBhIHJlZiBjb3VudGVyLCB3aGljaCBjYW4gYmUgdXNlZCBsYXRlciB0b1xuICAgKiB1bnN1YnNjcmliZSB0aGUgZXhhY3QgZXZlbnQgbGlzdGVuZXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY29uc3QgcmVmMiA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19vdGhlcl9zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKiAvLyBTaW5jZSB1bnN1YnNjcmlwdGlvbiwgZG9fc3R1ZmYgd29uJ3QgZmlyZSxcbiAgICogLy8gd2hpbGUgZG9fb3RoZXJfc3R1ZmYgd2lsbCBrZWVwIGZpcmluZyBvbiB0aGUgXCJldmVudFwiXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7aW50ZWdlcn0gcmVmXG4gICAqL1xuICBvbihldmVudCwgY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLmJpbmRpbmdSZWYrK1xuICAgIHRoaXMuYmluZGluZ3MucHVzaCh7ZXZlbnQsIHJlZiwgY2FsbGJhY2t9KVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZXMgb2ZmIG9mIGNoYW5uZWwgZXZlbnRzXG4gICAqXG4gICAqIFVzZSB0aGUgcmVmIHJldHVybmVkIGZyb20gYSBjaGFubmVsLm9uKCkgdG8gdW5zdWJzY3JpYmUgb25lXG4gICAqIGhhbmRsZXIsIG9yIHBhc3Mgbm90aGluZyBmb3IgdGhlIHJlZiB0byB1bnN1YnNjcmliZSBhbGxcbiAgICogaGFuZGxlcnMgZm9yIHRoZSBnaXZlbiBldmVudC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gVW5zdWJzY3JpYmUgdGhlIGRvX3N0dWZmIGhhbmRsZXJcbiAgICogY29uc3QgcmVmMSA9IGNoYW5uZWwub24oXCJldmVudFwiLCBkb19zdHVmZilcbiAgICogY2hhbm5lbC5vZmYoXCJldmVudFwiLCByZWYxKVxuICAgKlxuICAgKiAvLyBVbnN1YnNjcmliZSBhbGwgaGFuZGxlcnMgZnJvbSBldmVudFxuICAgKiBjaGFubmVsLm9mZihcImV2ZW50XCIpXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IHJlZlxuICAgKi9cbiAgb2ZmKGV2ZW50LCByZWYpe1xuICAgIHRoaXMuYmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcigoYmluZCkgPT4ge1xuICAgICAgcmV0dXJuICEoYmluZC5ldmVudCA9PT0gZXZlbnQgJiYgKHR5cGVvZiByZWYgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVmID09PSBiaW5kLnJlZikpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuUHVzaCgpeyByZXR1cm4gdGhpcy5zb2NrZXQuaXNDb25uZWN0ZWQoKSAmJiB0aGlzLmlzSm9pbmVkKCkgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIG1lc3NhZ2UgYGV2ZW50YCB0byBwaG9lbml4IHdpdGggdGhlIHBheWxvYWQgYHBheWxvYWRgLlxuICAgKiBQaG9lbml4IHJlY2VpdmVzIHRoaXMgaW4gdGhlIGBoYW5kbGVfaW4oZXZlbnQsIHBheWxvYWQsIHNvY2tldClgXG4gICAqIGZ1bmN0aW9uLiBpZiBwaG9lbml4IHJlcGxpZXMgb3IgaXQgdGltZXMgb3V0IChkZWZhdWx0IDEwMDAwbXMpLFxuICAgKiB0aGVuIG9wdGlvbmFsbHkgdGhlIHJlcGx5IGNhbiBiZSByZWNlaXZlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY2hhbm5lbC5wdXNoKFwiZXZlbnRcIilcbiAgICogICAucmVjZWl2ZShcIm9rXCIsIHBheWxvYWQgPT4gY29uc29sZS5sb2coXCJwaG9lbml4IHJlcGxpZWQ6XCIsIHBheWxvYWQpKVxuICAgKiAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgZXJyID0+IGNvbnNvbGUubG9nKFwicGhvZW5peCBlcnJvcmVkXCIsIGVycikpXG4gICAqICAgLnJlY2VpdmUoXCJ0aW1lb3V0XCIsICgpID0+IGNvbnNvbGUubG9nKFwidGltZWQgb3V0IHB1c2hpbmdcIikpXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFxuICAgKiBAcGFyYW0ge09iamVjdH0gcGF5bG9hZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW3RpbWVvdXRdXG4gICAqIEByZXR1cm5zIHtQdXNofVxuICAgKi9cbiAgcHVzaChldmVudCwgcGF5bG9hZCwgdGltZW91dCA9IHRoaXMudGltZW91dCl7XG4gICAgcGF5bG9hZCA9IHBheWxvYWQgfHwge31cbiAgICBpZighdGhpcy5qb2luZWRPbmNlKXtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdHJpZWQgdG8gcHVzaCAnJHtldmVudH0nIHRvICcke3RoaXMudG9waWN9JyBiZWZvcmUgam9pbmluZy4gVXNlIGNoYW5uZWwuam9pbigpIGJlZm9yZSBwdXNoaW5nIGV2ZW50c2ApXG4gICAgfVxuICAgIGxldCBwdXNoRXZlbnQgPSBuZXcgUHVzaCh0aGlzLCBldmVudCwgZnVuY3Rpb24gKCl7IHJldHVybiBwYXlsb2FkIH0sIHRpbWVvdXQpXG4gICAgaWYodGhpcy5jYW5QdXNoKCkpe1xuICAgICAgcHVzaEV2ZW50LnNlbmQoKVxuICAgIH0gZWxzZSB7XG4gICAgICBwdXNoRXZlbnQuc3RhcnRUaW1lb3V0KClcbiAgICAgIHRoaXMucHVzaEJ1ZmZlci5wdXNoKHB1c2hFdmVudClcbiAgICB9XG5cbiAgICByZXR1cm4gcHVzaEV2ZW50XG4gIH1cblxuICAvKiogTGVhdmVzIHRoZSBjaGFubmVsXG4gICAqXG4gICAqIFVuc3Vic2NyaWJlcyBmcm9tIHNlcnZlciBldmVudHMsIGFuZFxuICAgKiBpbnN0cnVjdHMgY2hhbm5lbCB0byB0ZXJtaW5hdGUgb24gc2VydmVyXG4gICAqXG4gICAqIFRyaWdnZXJzIG9uQ2xvc2UoKSBob29rc1xuICAgKlxuICAgKiBUbyByZWNlaXZlIGxlYXZlIGFja25vd2xlZGdlbWVudHMsIHVzZSB0aGUgYHJlY2VpdmVgXG4gICAqIGhvb2sgdG8gYmluZCB0byB0aGUgc2VydmVyIGFjaywgaWU6XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNoYW5uZWwubGVhdmUoKS5yZWNlaXZlKFwib2tcIiwgKCkgPT4gYWxlcnQoXCJsZWZ0IVwiKSApXG4gICAqXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gdGltZW91dFxuICAgKiBAcmV0dXJucyB7UHVzaH1cbiAgICovXG4gIGxlYXZlKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIHRoaXMucmVqb2luVGltZXIucmVzZXQoKVxuICAgIHRoaXMuam9pblB1c2guY2FuY2VsVGltZW91dCgpXG5cbiAgICB0aGlzLnN0YXRlID0gQ0hBTk5FTF9TVEFURVMubGVhdmluZ1xuICAgIGxldCBvbkNsb3NlID0gKCkgPT4ge1xuICAgICAgaWYodGhpcy5zb2NrZXQuaGFzTG9nZ2VyKCkpIHRoaXMuc29ja2V0LmxvZyhcImNoYW5uZWxcIiwgYGxlYXZlICR7dGhpcy50b3BpY31gKVxuICAgICAgdGhpcy50cmlnZ2VyKENIQU5ORUxfRVZFTlRTLmNsb3NlLCBcImxlYXZlXCIpXG4gICAgfVxuICAgIGxldCBsZWF2ZVB1c2ggPSBuZXcgUHVzaCh0aGlzLCBDSEFOTkVMX0VWRU5UUy5sZWF2ZSwgY2xvc3VyZSh7fSksIHRpbWVvdXQpXG4gICAgbGVhdmVQdXNoLnJlY2VpdmUoXCJva1wiLCAoKSA9PiBvbkNsb3NlKCkpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgKCkgPT4gb25DbG9zZSgpKVxuICAgIGxlYXZlUHVzaC5zZW5kKClcbiAgICBpZighdGhpcy5jYW5QdXNoKCkpeyBsZWF2ZVB1c2gudHJpZ2dlcihcIm9rXCIsIHt9KSB9XG5cbiAgICByZXR1cm4gbGVhdmVQdXNoXG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGFibGUgbWVzc2FnZSBob29rXG4gICAqXG4gICAqIFJlY2VpdmVzIGFsbCBldmVudHMgZm9yIHNwZWNpYWxpemVkIG1lc3NhZ2UgaGFuZGxpbmdcbiAgICogYmVmb3JlIGRpc3BhdGNoaW5nIHRvIHRoZSBjaGFubmVsIGNhbGxiYWNrcy5cbiAgICpcbiAgICogTXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXlsb2FkXG4gICAqIEBwYXJhbSB7aW50ZWdlcn0gcmVmXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBvbk1lc3NhZ2UoX2V2ZW50LCBwYXlsb2FkLCBfcmVmKXsgcmV0dXJuIHBheWxvYWQgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaXNNZW1iZXIodG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmKXtcbiAgICBpZih0aGlzLnRvcGljICE9PSB0b3BpYyl7IHJldHVybiBmYWxzZSB9XG5cbiAgICBpZihqb2luUmVmICYmIGpvaW5SZWYgIT09IHRoaXMuam9pblJlZigpKXtcbiAgICAgIGlmKHRoaXMuc29ja2V0Lmhhc0xvZ2dlcigpKSB0aGlzLnNvY2tldC5sb2coXCJjaGFubmVsXCIsIFwiZHJvcHBpbmcgb3V0ZGF0ZWQgbWVzc2FnZVwiLCB7dG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luUmVmfSlcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgam9pblJlZigpeyByZXR1cm4gdGhpcy5qb2luUHVzaC5yZWYgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVqb2luKHRpbWVvdXQgPSB0aGlzLnRpbWVvdXQpe1xuICAgIGlmKHRoaXMuaXNMZWF2aW5nKCkpeyByZXR1cm4gfVxuICAgIHRoaXMuc29ja2V0LmxlYXZlT3BlblRvcGljKHRoaXMudG9waWMpXG4gICAgdGhpcy5zdGF0ZSA9IENIQU5ORUxfU1RBVEVTLmpvaW5pbmdcbiAgICB0aGlzLmpvaW5QdXNoLnJlc2VuZCh0aW1lb3V0KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmlnZ2VyKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpe1xuICAgIGxldCBoYW5kbGVkUGF5bG9hZCA9IHRoaXMub25NZXNzYWdlKGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5SZWYpXG4gICAgaWYocGF5bG9hZCAmJiAhaGFuZGxlZFBheWxvYWQpeyB0aHJvdyBuZXcgRXJyb3IoXCJjaGFubmVsIG9uTWVzc2FnZSBjYWxsYmFja3MgbXVzdCByZXR1cm4gdGhlIHBheWxvYWQsIG1vZGlmaWVkIG9yIHVubW9kaWZpZWRcIikgfVxuXG4gICAgbGV0IGV2ZW50QmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmZpbHRlcihiaW5kID0+IGJpbmQuZXZlbnQgPT09IGV2ZW50KVxuXG4gICAgZm9yKGxldCBpID0gMDsgaSA8IGV2ZW50QmluZGluZ3MubGVuZ3RoOyBpKyspe1xuICAgICAgbGV0IGJpbmQgPSBldmVudEJpbmRpbmdzW2ldXG4gICAgICBiaW5kLmNhbGxiYWNrKGhhbmRsZWRQYXlsb2FkLCByZWYsIGpvaW5SZWYgfHwgdGhpcy5qb2luUmVmKCkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXBseUV2ZW50TmFtZShyZWYpeyByZXR1cm4gYGNoYW5fcmVwbHlfJHtyZWZ9YCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0Nsb3NlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuY2xvc2VkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzRXJyb3JlZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuZXJyb3JlZCB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0pvaW5lZCgpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmVkIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzSm9pbmluZygpeyByZXR1cm4gdGhpcy5zdGF0ZSA9PT0gQ0hBTk5FTF9TVEFURVMuam9pbmluZyB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc0xlYXZpbmcoKXsgcmV0dXJuIHRoaXMuc3RhdGUgPT09IENIQU5ORUxfU1RBVEVTLmxlYXZpbmcgfVxufVxuIiwgImltcG9ydCB7XG4gIGdsb2JhbCxcbiAgWEhSX1NUQVRFU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBamF4IHtcblxuICBzdGF0aWMgcmVxdWVzdChtZXRob2QsIGVuZFBvaW50LCBhY2NlcHQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIGlmKGdsb2JhbC5YRG9tYWluUmVxdWVzdCl7XG4gICAgICBsZXQgcmVxID0gbmV3IGdsb2JhbC5YRG9tYWluUmVxdWVzdCgpIC8vIElFOCwgSUU5XG4gICAgICB0aGlzLnhkb21haW5SZXF1ZXN0KHJlcSwgbWV0aG9kLCBlbmRQb2ludCwgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjaylcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHJlcSA9IG5ldyBnbG9iYWwuWE1MSHR0cFJlcXVlc3QoKSAvLyBJRTcrLCBGaXJlZm94LCBDaHJvbWUsIE9wZXJhLCBTYWZhcmlcbiAgICAgIHRoaXMueGhyUmVxdWVzdChyZXEsIG1ldGhvZCwgZW5kUG9pbnQsIGFjY2VwdCwgYm9keSwgdGltZW91dCwgb250aW1lb3V0LCBjYWxsYmFjaylcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgeGRvbWFpblJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBib2R5LCB0aW1lb3V0LCBvbnRpbWVvdXQsIGNhbGxiYWNrKXtcbiAgICByZXEudGltZW91dCA9IHRpbWVvdXRcbiAgICByZXEub3BlbihtZXRob2QsIGVuZFBvaW50KVxuICAgIHJlcS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBsZXQgcmVzcG9uc2UgPSB0aGlzLnBhcnNlSlNPTihyZXEucmVzcG9uc2VUZXh0KVxuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcG9uc2UpXG4gICAgfVxuICAgIGlmKG9udGltZW91dCl7IHJlcS5vbnRpbWVvdXQgPSBvbnRpbWVvdXQgfVxuXG4gICAgLy8gV29yayBhcm91bmQgYnVnIGluIElFOSB0aGF0IHJlcXVpcmVzIGFuIGF0dGFjaGVkIG9ucHJvZ3Jlc3MgaGFuZGxlclxuICAgIHJlcS5vbnByb2dyZXNzID0gKCkgPT4geyB9XG5cbiAgICByZXEuc2VuZChib2R5KVxuICB9XG5cbiAgc3RhdGljIHhoclJlcXVlc3QocmVxLCBtZXRob2QsIGVuZFBvaW50LCBhY2NlcHQsIGJvZHksIHRpbWVvdXQsIG9udGltZW91dCwgY2FsbGJhY2spe1xuICAgIHJlcS5vcGVuKG1ldGhvZCwgZW5kUG9pbnQsIHRydWUpXG4gICAgcmVxLnRpbWVvdXQgPSB0aW1lb3V0XG4gICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoXCJDb250ZW50LVR5cGVcIiwgYWNjZXB0KVxuICAgIHJlcS5vbmVycm9yID0gKCkgPT4geyBjYWxsYmFjayAmJiBjYWxsYmFjayhudWxsKSB9XG4gICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9ICgpID0+IHtcbiAgICAgIGlmKHJlcS5yZWFkeVN0YXRlID09PSBYSFJfU1RBVEVTLmNvbXBsZXRlICYmIGNhbGxiYWNrKXtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gdGhpcy5wYXJzZUpTT04ocmVxLnJlc3BvbnNlVGV4dClcbiAgICAgICAgY2FsbGJhY2socmVzcG9uc2UpXG4gICAgICB9XG4gICAgfVxuICAgIGlmKG9udGltZW91dCl7IHJlcS5vbnRpbWVvdXQgPSBvbnRpbWVvdXQgfVxuXG4gICAgcmVxLnNlbmQoYm9keSlcbiAgfVxuXG4gIHN0YXRpYyBwYXJzZUpTT04ocmVzcCl7XG4gICAgaWYoIXJlc3AgfHwgcmVzcCA9PT0gXCJcIil7IHJldHVybiBudWxsIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXNwKVxuICAgIH0gY2F0Y2ggKGUpe1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcImZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlXCIsIHJlc3ApXG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBzZXJpYWxpemUob2JqLCBwYXJlbnRLZXkpe1xuICAgIGxldCBxdWVyeVN0ciA9IFtdXG4gICAgZm9yKHZhciBrZXkgaW4gb2JqKXtcbiAgICAgIGlmKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKXsgY29udGludWUgfVxuICAgICAgbGV0IHBhcmFtS2V5ID0gcGFyZW50S2V5ID8gYCR7cGFyZW50S2V5fVske2tleX1dYCA6IGtleVxuICAgICAgbGV0IHBhcmFtVmFsID0gb2JqW2tleV1cbiAgICAgIGlmKHR5cGVvZiBwYXJhbVZhbCA9PT0gXCJvYmplY3RcIil7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2godGhpcy5zZXJpYWxpemUocGFyYW1WYWwsIHBhcmFtS2V5KSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5U3RyLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtS2V5KSArIFwiPVwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtVmFsKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHF1ZXJ5U3RyLmpvaW4oXCImXCIpXG4gIH1cblxuICBzdGF0aWMgYXBwZW5kUGFyYW1zKHVybCwgcGFyYW1zKXtcbiAgICBpZihPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCA9PT0gMCl7IHJldHVybiB1cmwgfVxuXG4gICAgbGV0IHByZWZpeCA9IHVybC5tYXRjaCgvXFw/LykgPyBcIiZcIiA6IFwiP1wiXG4gICAgcmV0dXJuIGAke3VybH0ke3ByZWZpeH0ke3RoaXMuc2VyaWFsaXplKHBhcmFtcyl9YFxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgU09DS0VUX1NUQVRFUyxcbiAgVFJBTlNQT1JUU1xufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQgQWpheCBmcm9tIFwiLi9hamF4XCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9uZ1BvbGwge1xuXG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50KXtcbiAgICB0aGlzLmVuZFBvaW50ID0gbnVsbFxuICAgIHRoaXMudG9rZW4gPSBudWxsXG4gICAgdGhpcy5za2lwSGVhcnRiZWF0ID0gdHJ1ZVxuICAgIHRoaXMub25vcGVuID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgIHRoaXMub25lcnJvciA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9ubWVzc2FnZSA9IGZ1bmN0aW9uICgpeyB9IC8vIG5vb3BcbiAgICB0aGlzLm9uY2xvc2UgPSBmdW5jdGlvbiAoKXsgfSAvLyBub29wXG4gICAgdGhpcy5wb2xsRW5kcG9pbnQgPSB0aGlzLm5vcm1hbGl6ZUVuZHBvaW50KGVuZFBvaW50KVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZ1xuXG4gICAgdGhpcy5wb2xsKClcbiAgfVxuXG4gIG5vcm1hbGl6ZUVuZHBvaW50KGVuZFBvaW50KXtcbiAgICByZXR1cm4gKGVuZFBvaW50XG4gICAgICAucmVwbGFjZShcIndzOi8vXCIsIFwiaHR0cDovL1wiKVxuICAgICAgLnJlcGxhY2UoXCJ3c3M6Ly9cIiwgXCJodHRwczovL1wiKVxuICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChcIiguKilcXC9cIiArIFRSQU5TUE9SVFMud2Vic29ja2V0KSwgXCIkMS9cIiArIFRSQU5TUE9SVFMubG9uZ3BvbGwpKVxuICB9XG5cbiAgZW5kcG9pbnRVUkwoKXtcbiAgICByZXR1cm4gQWpheC5hcHBlbmRQYXJhbXModGhpcy5wb2xsRW5kcG9pbnQsIHt0b2tlbjogdGhpcy50b2tlbn0pXG4gIH1cblxuICBjbG9zZUFuZFJldHJ5KCl7XG4gICAgdGhpcy5jbG9zZSgpXG4gICAgdGhpcy5yZWFkeVN0YXRlID0gU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nXG4gIH1cblxuICBvbnRpbWVvdXQoKXtcbiAgICB0aGlzLm9uZXJyb3IoXCJ0aW1lb3V0XCIpXG4gICAgdGhpcy5jbG9zZUFuZFJldHJ5KClcbiAgfVxuXG4gIHBvbGwoKXtcbiAgICBpZighKHRoaXMucmVhZHlTdGF0ZSA9PT0gU09DS0VUX1NUQVRFUy5vcGVuIHx8IHRoaXMucmVhZHlTdGF0ZSA9PT0gU09DS0VUX1NUQVRFUy5jb25uZWN0aW5nKSl7IHJldHVybiB9XG5cbiAgICBBamF4LnJlcXVlc3QoXCJHRVRcIiwgdGhpcy5lbmRwb2ludFVSTCgpLCBcImFwcGxpY2F0aW9uL2pzb25cIiwgbnVsbCwgdGhpcy50aW1lb3V0LCB0aGlzLm9udGltZW91dC5iaW5kKHRoaXMpLCAocmVzcCkgPT4ge1xuICAgICAgaWYocmVzcCl7XG4gICAgICAgIHZhciB7c3RhdHVzLCB0b2tlbiwgbWVzc2FnZXN9ID0gcmVzcFxuICAgICAgICB0aGlzLnRva2VuID0gdG9rZW5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXR1cyA9IDBcbiAgICAgIH1cblxuICAgICAgc3dpdGNoKHN0YXR1cyl7XG4gICAgICAgIGNhc2UgMjAwOlxuICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobXNnID0+IHtcbiAgICAgICAgICAgIC8vIFRhc2tzIGFyZSB3aGF0IHRoaW5ncyBsaWtlIGV2ZW50IGhhbmRsZXJzLCBzZXRUaW1lb3V0IGNhbGxiYWNrcyxcbiAgICAgICAgICAgIC8vIHByb21pc2UgcmVzb2x2ZXMgYW5kIG1vcmUgYXJlIHJ1biB3aXRoaW4uXG4gICAgICAgICAgICAvLyBJbiBtb2Rlcm4gYnJvd3NlcnMsIHRoZXJlIGFyZSB0d28gZGlmZmVyZW50IGtpbmRzIG9mIHRhc2tzLFxuICAgICAgICAgICAgLy8gbWljcm90YXNrcyBhbmQgbWFjcm90YXNrcy5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYXJlIG1haW5seSB1c2VkIGZvciBQcm9taXNlcywgd2hpbGUgbWFjcm90YXNrcyBhcmVcbiAgICAgICAgICAgIC8vIHVzZWQgZm9yIGV2ZXJ5dGhpbmcgZWxzZS5cbiAgICAgICAgICAgIC8vIE1pY3JvdGFza3MgYWx3YXlzIGhhdmUgcHJpb3JpdHkgb3ZlciBtYWNyb3Rhc2tzLiBJZiB0aGUgSlMgZW5naW5lXG4gICAgICAgICAgICAvLyBpcyBsb29raW5nIGZvciBhIHRhc2sgdG8gcnVuLCBpdCB3aWxsIGFsd2F5cyB0cnkgdG8gZW1wdHkgdGhlXG4gICAgICAgICAgICAvLyBtaWNyb3Rhc2sgcXVldWUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcnVuIGFueXRoaW5nIGZyb20gdGhlXG4gICAgICAgICAgICAvLyBtYWNyb3Rhc2sgcXVldWUuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gRm9yIHRoZSBXZWJTb2NrZXQgdHJhbnNwb3J0LCBtZXNzYWdlcyBhbHdheXMgYXJyaXZlIGluIHRoZWlyIG93blxuICAgICAgICAgICAgLy8gZXZlbnQuIFRoaXMgbWVhbnMgdGhhdCBpZiBhbnkgcHJvbWlzZXMgYXJlIHJlc29sdmVkIGZyb20gd2l0aGluLFxuICAgICAgICAgICAgLy8gdGhlaXIgY2FsbGJhY2tzIHdpbGwgYWx3YXlzIGZpbmlzaCBleGVjdXRpb24gYnkgdGhlIHRpbWUgdGhlXG4gICAgICAgICAgICAvLyBuZXh0IG1lc3NhZ2UgZXZlbnQgaGFuZGxlciBpcyBydW4uXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gZW11bGF0ZSB0aGlzIGJlaGF2aW91ciwgd2UgbmVlZCB0byBtYWtlIHN1cmUgZWFjaFxuICAgICAgICAgICAgLy8gb25tZXNzYWdlIGhhbmRsZXIgaXMgcnVuIHdpdGhpbiBpdCdzIG93biBtYWNyb3Rhc2suXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5vbm1lc3NhZ2Uoe2RhdGE6IG1zZ30pXG4gICAgICAgICAgICB9LCAwKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgdGhpcy5wb2xsKClcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDIwNDpcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDEwOlxuICAgICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFNPQ0tFVF9TVEFURVMub3BlblxuICAgICAgICAgIHRoaXMub25vcGVuKClcbiAgICAgICAgICB0aGlzLnBvbGwoKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgNDAzOlxuICAgICAgICAgIHRoaXMub25lcnJvcigpXG4gICAgICAgICAgdGhpcy5jbG9zZSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDUwMDpcbiAgICAgICAgICB0aGlzLm9uZXJyb3IoKVxuICAgICAgICAgIHRoaXMuY2xvc2VBbmRSZXRyeSgpXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKGB1bmhhbmRsZWQgcG9sbCBzdGF0dXMgJHtzdGF0dXN9YClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgc2VuZChib2R5KXtcbiAgICBBamF4LnJlcXVlc3QoXCJQT1NUXCIsIHRoaXMuZW5kcG9pbnRVUkwoKSwgXCJhcHBsaWNhdGlvbi9qc29uXCIsIGJvZHksIHRoaXMudGltZW91dCwgdGhpcy5vbmVycm9yLmJpbmQodGhpcywgXCJ0aW1lb3V0XCIpLCAocmVzcCkgPT4ge1xuICAgICAgaWYoIXJlc3AgfHwgcmVzcC5zdGF0dXMgIT09IDIwMCl7XG4gICAgICAgIHRoaXMub25lcnJvcihyZXNwICYmIHJlc3Auc3RhdHVzKVxuICAgICAgICB0aGlzLmNsb3NlQW5kUmV0cnkoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjbG9zZShfY29kZSwgX3JlYXNvbil7XG4gICAgdGhpcy5yZWFkeVN0YXRlID0gU09DS0VUX1NUQVRFUy5jbG9zZWRcbiAgICB0aGlzLm9uY2xvc2UoKVxuICB9XG59XG4iLCAiLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgUHJlc2VuY2VcbiAqIEBwYXJhbSB7Q2hhbm5lbH0gY2hhbm5lbCAtIFRoZSBDaGFubmVsXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFRoZSBvcHRpb25zLFxuICogICAgICAgIGZvciBleGFtcGxlIGB7ZXZlbnRzOiB7c3RhdGU6IFwic3RhdGVcIiwgZGlmZjogXCJkaWZmXCJ9fWBcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJlc2VuY2Uge1xuXG4gIGNvbnN0cnVjdG9yKGNoYW5uZWwsIG9wdHMgPSB7fSl7XG4gICAgbGV0IGV2ZW50cyA9IG9wdHMuZXZlbnRzIHx8IHtzdGF0ZTogXCJwcmVzZW5jZV9zdGF0ZVwiLCBkaWZmOiBcInByZXNlbmNlX2RpZmZcIn1cbiAgICB0aGlzLnN0YXRlID0ge31cbiAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbFxuICAgIHRoaXMuam9pblJlZiA9IG51bGxcbiAgICB0aGlzLmNhbGxlciA9IHtcbiAgICAgIG9uSm9pbjogZnVuY3Rpb24gKCl7IH0sXG4gICAgICBvbkxlYXZlOiBmdW5jdGlvbiAoKXsgfSxcbiAgICAgIG9uU3luYzogZnVuY3Rpb24gKCl7IH1cbiAgICB9XG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLnN0YXRlLCBuZXdTdGF0ZSA9PiB7XG4gICAgICBsZXQge29uSm9pbiwgb25MZWF2ZSwgb25TeW5jfSA9IHRoaXMuY2FsbGVyXG5cbiAgICAgIHRoaXMuam9pblJlZiA9IHRoaXMuY2hhbm5lbC5qb2luUmVmKClcbiAgICAgIHRoaXMuc3RhdGUgPSBQcmVzZW5jZS5zeW5jU3RhdGUodGhpcy5zdGF0ZSwgbmV3U3RhdGUsIG9uSm9pbiwgb25MZWF2ZSlcblxuICAgICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaChkaWZmID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgIH0pXG4gICAgICB0aGlzLnBlbmRpbmdEaWZmcyA9IFtdXG4gICAgICBvblN5bmMoKVxuICAgIH0pXG5cbiAgICB0aGlzLmNoYW5uZWwub24oZXZlbnRzLmRpZmYsIGRpZmYgPT4ge1xuICAgICAgbGV0IHtvbkpvaW4sIG9uTGVhdmUsIG9uU3luY30gPSB0aGlzLmNhbGxlclxuXG4gICAgICBpZih0aGlzLmluUGVuZGluZ1N5bmNTdGF0ZSgpKXtcbiAgICAgICAgdGhpcy5wZW5kaW5nRGlmZnMucHVzaChkaWZmKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IFByZXNlbmNlLnN5bmNEaWZmKHRoaXMuc3RhdGUsIGRpZmYsIG9uSm9pbiwgb25MZWF2ZSlcbiAgICAgICAgb25TeW5jKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgb25Kb2luKGNhbGxiYWNrKXsgdGhpcy5jYWxsZXIub25Kb2luID0gY2FsbGJhY2sgfVxuXG4gIG9uTGVhdmUoY2FsbGJhY2speyB0aGlzLmNhbGxlci5vbkxlYXZlID0gY2FsbGJhY2sgfVxuXG4gIG9uU3luYyhjYWxsYmFjayl7IHRoaXMuY2FsbGVyLm9uU3luYyA9IGNhbGxiYWNrIH1cblxuICBsaXN0KGJ5KXsgcmV0dXJuIFByZXNlbmNlLmxpc3QodGhpcy5zdGF0ZSwgYnkpIH1cblxuICBpblBlbmRpbmdTeW5jU3RhdGUoKXtcbiAgICByZXR1cm4gIXRoaXMuam9pblJlZiB8fCAodGhpcy5qb2luUmVmICE9PSB0aGlzLmNoYW5uZWwuam9pblJlZigpKVxuICB9XG5cbiAgLy8gbG93ZXItbGV2ZWwgcHVibGljIHN0YXRpYyBBUElcblxuICAvKipcbiAgICogVXNlZCB0byBzeW5jIHRoZSBsaXN0IG9mIHByZXNlbmNlcyBvbiB0aGUgc2VydmVyXG4gICAqIHdpdGggdGhlIGNsaWVudCdzIHN0YXRlLiBBbiBvcHRpb25hbCBgb25Kb2luYCBhbmQgYG9uTGVhdmVgIGNhbGxiYWNrIGNhblxuICAgKiBiZSBwcm92aWRlZCB0byByZWFjdCB0byBjaGFuZ2VzIGluIHRoZSBjbGllbnQncyBsb2NhbCBwcmVzZW5jZXMgYWNyb3NzXG4gICAqIGRpc2Nvbm5lY3RzIGFuZCByZWNvbm5lY3RzIHdpdGggdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNTdGF0ZShjdXJyZW50U3RhdGUsIG5ld1N0YXRlLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCBzdGF0ZSA9IHRoaXMuY2xvbmUoY3VycmVudFN0YXRlKVxuICAgIGxldCBqb2lucyA9IHt9XG4gICAgbGV0IGxlYXZlcyA9IHt9XG5cbiAgICB0aGlzLm1hcChzdGF0ZSwgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIGlmKCFuZXdTdGF0ZVtrZXldKXtcbiAgICAgICAgbGVhdmVzW2tleV0gPSBwcmVzZW5jZVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5tYXAobmV3U3RhdGUsIChrZXksIG5ld1ByZXNlbmNlKSA9PiB7XG4gICAgICBsZXQgY3VycmVudFByZXNlbmNlID0gc3RhdGVba2V5XVxuICAgICAgaWYoY3VycmVudFByZXNlbmNlKXtcbiAgICAgICAgbGV0IG5ld1JlZnMgPSBuZXdQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJSZWZzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLm1hcChtID0+IG0ucGh4X3JlZilcbiAgICAgICAgbGV0IGpvaW5lZE1ldGFzID0gbmV3UHJlc2VuY2UubWV0YXMuZmlsdGVyKG0gPT4gY3VyUmVmcy5pbmRleE9mKG0ucGh4X3JlZikgPCAwKVxuICAgICAgICBsZXQgbGVmdE1ldGFzID0gY3VycmVudFByZXNlbmNlLm1ldGFzLmZpbHRlcihtID0+IG5ld1JlZnMuaW5kZXhPZihtLnBoeF9yZWYpIDwgMClcbiAgICAgICAgaWYoam9pbmVkTWV0YXMubGVuZ3RoID4gMCl7XG4gICAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICAgICAgam9pbnNba2V5XS5tZXRhcyA9IGpvaW5lZE1ldGFzXG4gICAgICAgIH1cbiAgICAgICAgaWYobGVmdE1ldGFzLmxlbmd0aCA+IDApe1xuICAgICAgICAgIGxlYXZlc1trZXldID0gdGhpcy5jbG9uZShjdXJyZW50UHJlc2VuY2UpXG4gICAgICAgICAgbGVhdmVzW2tleV0ubWV0YXMgPSBsZWZ0TWV0YXNcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgam9pbnNba2V5XSA9IG5ld1ByZXNlbmNlXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gdGhpcy5zeW5jRGlmZihzdGF0ZSwge2pvaW5zOiBqb2lucywgbGVhdmVzOiBsZWF2ZXN9LCBvbkpvaW4sIG9uTGVhdmUpXG4gIH1cblxuICAvKipcbiAgICpcbiAgICogVXNlZCB0byBzeW5jIGEgZGlmZiBvZiBwcmVzZW5jZSBqb2luIGFuZCBsZWF2ZVxuICAgKiBldmVudHMgZnJvbSB0aGUgc2VydmVyLCBhcyB0aGV5IGhhcHBlbi4gTGlrZSBgc3luY1N0YXRlYCwgYHN5bmNEaWZmYFxuICAgKiBhY2NlcHRzIG9wdGlvbmFsIGBvbkpvaW5gIGFuZCBgb25MZWF2ZWAgY2FsbGJhY2tzIHRvIHJlYWN0IHRvIGEgdXNlclxuICAgKiBqb2luaW5nIG9yIGxlYXZpbmcgZnJvbSBhIGRldmljZS5cbiAgICpcbiAgICogQHJldHVybnMge1ByZXNlbmNlfVxuICAgKi9cbiAgc3RhdGljIHN5bmNEaWZmKHN0YXRlLCBkaWZmLCBvbkpvaW4sIG9uTGVhdmUpe1xuICAgIGxldCB7am9pbnMsIGxlYXZlc30gPSB0aGlzLmNsb25lKGRpZmYpXG4gICAgaWYoIW9uSm9pbil7IG9uSm9pbiA9IGZ1bmN0aW9uICgpeyB9IH1cbiAgICBpZighb25MZWF2ZSl7IG9uTGVhdmUgPSBmdW5jdGlvbiAoKXsgfSB9XG5cbiAgICB0aGlzLm1hcChqb2lucywgKGtleSwgbmV3UHJlc2VuY2UpID0+IHtcbiAgICAgIGxldCBjdXJyZW50UHJlc2VuY2UgPSBzdGF0ZVtrZXldXG4gICAgICBzdGF0ZVtrZXldID0gdGhpcy5jbG9uZShuZXdQcmVzZW5jZSlcbiAgICAgIGlmKGN1cnJlbnRQcmVzZW5jZSl7XG4gICAgICAgIGxldCBqb2luZWRSZWZzID0gc3RhdGVba2V5XS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICAgIGxldCBjdXJNZXRhcyA9IGN1cnJlbnRQcmVzZW5jZS5tZXRhcy5maWx0ZXIobSA9PiBqb2luZWRSZWZzLmluZGV4T2YobS5waHhfcmVmKSA8IDApXG4gICAgICAgIHN0YXRlW2tleV0ubWV0YXMudW5zaGlmdCguLi5jdXJNZXRhcylcbiAgICAgIH1cbiAgICAgIG9uSm9pbihrZXksIGN1cnJlbnRQcmVzZW5jZSwgbmV3UHJlc2VuY2UpXG4gICAgfSlcbiAgICB0aGlzLm1hcChsZWF2ZXMsIChrZXksIGxlZnRQcmVzZW5jZSkgPT4ge1xuICAgICAgbGV0IGN1cnJlbnRQcmVzZW5jZSA9IHN0YXRlW2tleV1cbiAgICAgIGlmKCFjdXJyZW50UHJlc2VuY2UpeyByZXR1cm4gfVxuICAgICAgbGV0IHJlZnNUb1JlbW92ZSA9IGxlZnRQcmVzZW5jZS5tZXRhcy5tYXAobSA9PiBtLnBoeF9yZWYpXG4gICAgICBjdXJyZW50UHJlc2VuY2UubWV0YXMgPSBjdXJyZW50UHJlc2VuY2UubWV0YXMuZmlsdGVyKHAgPT4ge1xuICAgICAgICByZXR1cm4gcmVmc1RvUmVtb3ZlLmluZGV4T2YocC5waHhfcmVmKSA8IDBcbiAgICAgIH0pXG4gICAgICBvbkxlYXZlKGtleSwgY3VycmVudFByZXNlbmNlLCBsZWZ0UHJlc2VuY2UpXG4gICAgICBpZihjdXJyZW50UHJlc2VuY2UubWV0YXMubGVuZ3RoID09PSAwKXtcbiAgICAgICAgZGVsZXRlIHN0YXRlW2tleV1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBzdGF0ZVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGFycmF5IG9mIHByZXNlbmNlcywgd2l0aCBzZWxlY3RlZCBtZXRhZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHByZXNlbmNlc1xuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjaG9vc2VyXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcmVzZW5jZX1cbiAgICovXG4gIHN0YXRpYyBsaXN0KHByZXNlbmNlcywgY2hvb3Nlcil7XG4gICAgaWYoIWNob29zZXIpeyBjaG9vc2VyID0gZnVuY3Rpb24gKGtleSwgcHJlcyl7IHJldHVybiBwcmVzIH0gfVxuXG4gICAgcmV0dXJuIHRoaXMubWFwKHByZXNlbmNlcywgKGtleSwgcHJlc2VuY2UpID0+IHtcbiAgICAgIHJldHVybiBjaG9vc2VyKGtleSwgcHJlc2VuY2UpXG4gICAgfSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBzdGF0aWMgbWFwKG9iaiwgZnVuYyl7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubWFwKGtleSA9PiBmdW5jKGtleSwgb2JqW2tleV0pKVxuICB9XG5cbiAgc3RhdGljIGNsb25lKG9iail7IHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG9iaikpIH1cbn1cbiIsICIvKiBUaGUgZGVmYXVsdCBzZXJpYWxpemVyIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgbWVzc2FnZXMgKi9cbmltcG9ydCB7XG4gIENIQU5ORUxfRVZFTlRTXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgSEVBREVSX0xFTkdUSDogMSxcbiAgTUVUQV9MRU5HVEg6IDQsXG4gIEtJTkRTOiB7cHVzaDogMCwgcmVwbHk6IDEsIGJyb2FkY2FzdDogMn0sXG5cbiAgZW5jb2RlKG1zZywgY2FsbGJhY2spe1xuICAgIGlmKG1zZy5wYXlsb2FkLmNvbnN0cnVjdG9yID09PSBBcnJheUJ1ZmZlcil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sodGhpcy5iaW5hcnlFbmNvZGUobXNnKSlcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBheWxvYWQgPSBbbXNnLmpvaW5fcmVmLCBtc2cucmVmLCBtc2cudG9waWMsIG1zZy5ldmVudCwgbXNnLnBheWxvYWRdXG4gICAgICByZXR1cm4gY2FsbGJhY2soSlNPTi5zdHJpbmdpZnkocGF5bG9hZCkpXG4gICAgfVxuICB9LFxuXG4gIGRlY29kZShyYXdQYXlsb2FkLCBjYWxsYmFjayl7XG4gICAgaWYocmF3UGF5bG9hZC5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpe1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKHRoaXMuYmluYXJ5RGVjb2RlKHJhd1BheWxvYWQpKVxuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgW2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZF0gPSBKU09OLnBhcnNlKHJhd1BheWxvYWQpXG4gICAgICByZXR1cm4gY2FsbGJhY2soe2pvaW5fcmVmLCByZWYsIHRvcGljLCBldmVudCwgcGF5bG9hZH0pXG4gICAgfVxuICB9LFxuXG4gIC8vIHByaXZhdGVcblxuICBiaW5hcnlFbmNvZGUobWVzc2FnZSl7XG4gICAgbGV0IHtqb2luX3JlZiwgcmVmLCBldmVudCwgdG9waWMsIHBheWxvYWR9ID0gbWVzc2FnZVxuICAgIGxldCBtZXRhTGVuZ3RoID0gdGhpcy5NRVRBX0xFTkdUSCArIGpvaW5fcmVmLmxlbmd0aCArIHJlZi5sZW5ndGggKyB0b3BpYy5sZW5ndGggKyBldmVudC5sZW5ndGhcbiAgICBsZXQgaGVhZGVyID0gbmV3IEFycmF5QnVmZmVyKHRoaXMuSEVBREVSX0xFTkdUSCArIG1ldGFMZW5ndGgpXG4gICAgbGV0IHZpZXcgPSBuZXcgRGF0YVZpZXcoaGVhZGVyKVxuICAgIGxldCBvZmZzZXQgPSAwXG5cbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0aGlzLktJTkRTLnB1c2gpIC8vIGtpbmRcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBqb2luX3JlZi5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgcmVmLmxlbmd0aClcbiAgICB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCB0b3BpYy5sZW5ndGgpXG4gICAgdmlldy5zZXRVaW50OChvZmZzZXQrKywgZXZlbnQubGVuZ3RoKVxuICAgIEFycmF5LmZyb20oam9pbl9yZWYsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKHJlZiwgY2hhciA9PiB2aWV3LnNldFVpbnQ4KG9mZnNldCsrLCBjaGFyLmNoYXJDb2RlQXQoMCkpKVxuICAgIEFycmF5LmZyb20odG9waWMsIGNoYXIgPT4gdmlldy5zZXRVaW50OChvZmZzZXQrKywgY2hhci5jaGFyQ29kZUF0KDApKSlcbiAgICBBcnJheS5mcm9tKGV2ZW50LCBjaGFyID0+IHZpZXcuc2V0VWludDgob2Zmc2V0KyssIGNoYXIuY2hhckNvZGVBdCgwKSkpXG5cbiAgICB2YXIgY29tYmluZWQgPSBuZXcgVWludDhBcnJheShoZWFkZXIuYnl0ZUxlbmd0aCArIHBheWxvYWQuYnl0ZUxlbmd0aClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkoaGVhZGVyKSwgMClcbiAgICBjb21iaW5lZC5zZXQobmV3IFVpbnQ4QXJyYXkocGF5bG9hZCksIGhlYWRlci5ieXRlTGVuZ3RoKVxuXG4gICAgcmV0dXJuIGNvbWJpbmVkLmJ1ZmZlclxuICB9LFxuXG4gIGJpbmFyeURlY29kZShidWZmZXIpe1xuICAgIGxldCB2aWV3ID0gbmV3IERhdGFWaWV3KGJ1ZmZlcilcbiAgICBsZXQga2luZCA9IHZpZXcuZ2V0VWludDgoMClcbiAgICBsZXQgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpXG4gICAgc3dpdGNoKGtpbmQpe1xuICAgICAgY2FzZSB0aGlzLktJTkRTLnB1c2g6IHJldHVybiB0aGlzLmRlY29kZVB1c2goYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgICAgY2FzZSB0aGlzLktJTkRTLnJlcGx5OiByZXR1cm4gdGhpcy5kZWNvZGVSZXBseShidWZmZXIsIHZpZXcsIGRlY29kZXIpXG4gICAgICBjYXNlIHRoaXMuS0lORFMuYnJvYWRjYXN0OiByZXR1cm4gdGhpcy5kZWNvZGVCcm9hZGNhc3QoYnVmZmVyLCB2aWV3LCBkZWNvZGVyKVxuICAgIH1cbiAgfSxcblxuICBkZWNvZGVQdXNoKGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDIpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoMylcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSCAtIDEgLy8gcHVzaGVzIGhhdmUgbm8gcmVmXG4gICAgbGV0IGpvaW5SZWYgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBqb2luUmVmU2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgam9pblJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9LFxuXG4gIGRlY29kZVJlcGx5KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IGpvaW5SZWZTaXplID0gdmlldy5nZXRVaW50OCgxKVxuICAgIGxldCByZWZTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCB0b3BpY1NpemUgPSB2aWV3LmdldFVpbnQ4KDMpXG4gICAgbGV0IGV2ZW50U2l6ZSA9IHZpZXcuZ2V0VWludDgoNClcbiAgICBsZXQgb2Zmc2V0ID0gdGhpcy5IRUFERVJfTEVOR1RIICsgdGhpcy5NRVRBX0xFTkdUSFxuICAgIGxldCBqb2luUmVmID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgam9pblJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGpvaW5SZWZTaXplXG4gICAgbGV0IHJlZiA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHJlZlNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHJlZlNpemVcbiAgICBsZXQgdG9waWMgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyB0b3BpY1NpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIHRvcGljU2l6ZVxuICAgIGxldCBldmVudCA9IGRlY29kZXIuZGVjb2RlKGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIGV2ZW50U2l6ZSkpXG4gICAgb2Zmc2V0ID0gb2Zmc2V0ICsgZXZlbnRTaXplXG4gICAgbGV0IGRhdGEgPSBidWZmZXIuc2xpY2Uob2Zmc2V0LCBidWZmZXIuYnl0ZUxlbmd0aClcbiAgICBsZXQgcGF5bG9hZCA9IHtzdGF0dXM6IGV2ZW50LCByZXNwb25zZTogZGF0YX1cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBqb2luUmVmLCByZWY6IHJlZiwgdG9waWM6IHRvcGljLCBldmVudDogQ0hBTk5FTF9FVkVOVFMucmVwbHksIHBheWxvYWQ6IHBheWxvYWR9XG4gIH0sXG5cbiAgZGVjb2RlQnJvYWRjYXN0KGJ1ZmZlciwgdmlldywgZGVjb2Rlcil7XG4gICAgbGV0IHRvcGljU2l6ZSA9IHZpZXcuZ2V0VWludDgoMSlcbiAgICBsZXQgZXZlbnRTaXplID0gdmlldy5nZXRVaW50OCgyKVxuICAgIGxldCBvZmZzZXQgPSB0aGlzLkhFQURFUl9MRU5HVEggKyAyXG4gICAgbGV0IHRvcGljID0gZGVjb2Rlci5kZWNvZGUoYnVmZmVyLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgdG9waWNTaXplKSlcbiAgICBvZmZzZXQgPSBvZmZzZXQgKyB0b3BpY1NpemVcbiAgICBsZXQgZXZlbnQgPSBkZWNvZGVyLmRlY29kZShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBldmVudFNpemUpKVxuICAgIG9mZnNldCA9IG9mZnNldCArIGV2ZW50U2l6ZVxuICAgIGxldCBkYXRhID0gYnVmZmVyLnNsaWNlKG9mZnNldCwgYnVmZmVyLmJ5dGVMZW5ndGgpXG5cbiAgICByZXR1cm4ge2pvaW5fcmVmOiBudWxsLCByZWY6IG51bGwsIHRvcGljOiB0b3BpYywgZXZlbnQ6IGV2ZW50LCBwYXlsb2FkOiBkYXRhfVxuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgZ2xvYmFsLFxuICBwaHhXaW5kb3csXG4gIENIQU5ORUxfRVZFTlRTLFxuICBERUZBVUxUX1RJTUVPVVQsXG4gIERFRkFVTFRfVlNOLFxuICBTT0NLRVRfU1RBVEVTLFxuICBUUkFOU1BPUlRTLFxuICBXU19DTE9TRV9OT1JNQUxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgY2xvc3VyZVxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBBamF4IGZyb20gXCIuL2FqYXhcIlxuaW1wb3J0IENoYW5uZWwgZnJvbSBcIi4vY2hhbm5lbFwiXG5pbXBvcnQgTG9uZ1BvbGwgZnJvbSBcIi4vbG9uZ3BvbGxcIlxuaW1wb3J0IFNlcmlhbGl6ZXIgZnJvbSBcIi4vc2VyaWFsaXplclwiXG5pbXBvcnQgVGltZXIgZnJvbSBcIi4vdGltZXJcIlxuXG4vKiogSW5pdGlhbGl6ZXMgdGhlIFNvY2tldCAqXG4gKlxuICogRm9yIElFOCBzdXBwb3J0IHVzZSBhbiBFUzUtc2hpbSAoaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmRQb2ludCAtIFRoZSBzdHJpbmcgV2ViU29ja2V0IGVuZHBvaW50LCBpZSwgYFwid3M6Ly9leGFtcGxlLmNvbS9zb2NrZXRcImAsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFwid3NzOi8vZXhhbXBsZS5jb21cImBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgXCIvc29ja2V0XCJgIChpbmhlcml0ZWQgaG9zdCAmIHByb3RvY29sKVxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzXSAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLnRyYW5zcG9ydF0gLSBUaGUgV2Vic29ja2V0IFRyYW5zcG9ydCwgZm9yIGV4YW1wbGUgV2ViU29ja2V0IG9yIFBob2VuaXguTG9uZ1BvbGwuXG4gKlxuICogRGVmYXVsdHMgdG8gV2ViU29ja2V0IHdpdGggYXV0b21hdGljIExvbmdQb2xsIGZhbGxiYWNrLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMuZW5jb2RlXSAtIFRoZSBmdW5jdGlvbiB0byBlbmNvZGUgb3V0Z29pbmcgbWVzc2FnZXMuXG4gKlxuICogRGVmYXVsdHMgdG8gSlNPTiBlbmNvZGVyLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtvcHRzLmRlY29kZV0gLSBUaGUgZnVuY3Rpb24gdG8gZGVjb2RlIGluY29taW5nIG1lc3NhZ2VzLlxuICpcbiAqIERlZmF1bHRzIHRvIEpTT046XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogKHBheWxvYWQsIGNhbGxiYWNrKSA9PiBjYWxsYmFjayhKU09OLnBhcnNlKHBheWxvYWQpKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnRpbWVvdXRdIC0gVGhlIGRlZmF1bHQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgdG8gdHJpZ2dlciBwdXNoIHRpbWVvdXRzLlxuICpcbiAqIERlZmF1bHRzIGBERUZBVUxUX1RJTUVPVVRgXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMuaGVhcnRiZWF0SW50ZXJ2YWxNc10gLSBUaGUgbWlsbGlzZWMgaW50ZXJ2YWwgdG8gc2VuZCBhIGhlYXJ0YmVhdCBtZXNzYWdlXG4gKiBAcGFyYW0ge251bWJlcn0gW29wdHMucmVjb25uZWN0QWZ0ZXJNc10gLSBUaGUgb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtaWxsc2VjXG4gKiBzb2NrZXQgcmVjb25uZWN0IGludGVydmFsLlxuICpcbiAqIERlZmF1bHRzIHRvIHN0ZXBwZWQgYmFja29mZiBvZjpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiBmdW5jdGlvbih0cmllcyl7XG4gKiAgIHJldHVybiBbMTAsIDUwLCAxMDAsIDE1MCwgMjAwLCAyNTAsIDUwMCwgMTAwMCwgMjAwMF1bdHJpZXMgLSAxXSB8fCA1MDAwXG4gKiB9XG4gKiBgYGBgXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLnJlam9pbkFmdGVyTXNdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbWlsbHNlY1xuICogcmVqb2luIGludGVydmFsIGZvciBpbmRpdmlkdWFsIGNoYW5uZWxzLlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIGZ1bmN0aW9uKHRyaWVzKXtcbiAqICAgcmV0dXJuIFsxMDAwLCAyMDAwLCA1MDAwXVt0cmllcyAtIDFdIHx8IDEwMDAwXG4gKiB9XG4gKiBgYGBgXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdHMubG9nZ2VyXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiBmb3Igc3BlY2lhbGl6ZWQgbG9nZ2luZywgaWU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogZnVuY3Rpb24oa2luZCwgbXNnLCBkYXRhKSB7XG4gKiAgIGNvbnNvbGUubG9nKGAke2tpbmR9OiAke21zZ31gLCBkYXRhKVxuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IFtvcHRzLmxvbmdwb2xsZXJUaW1lb3V0XSAtIFRoZSBtYXhpbXVtIHRpbWVvdXQgb2YgYSBsb25nIHBvbGwgQUpBWCByZXF1ZXN0LlxuICpcbiAqIERlZmF1bHRzIHRvIDIwcyAoZG91YmxlIHRoZSBzZXJ2ZXIgbG9uZyBwb2xsIHRpbWVyKS5cbiAqXG4gKiBAcGFyYW0geyhPYmplY3R8ZnVuY3Rpb24pfSBbb3B0cy5wYXJhbXNdIC0gVGhlIG9wdGlvbmFsIHBhcmFtcyB0byBwYXNzIHdoZW4gY29ubmVjdGluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLmJpbmFyeVR5cGVdIC0gVGhlIGJpbmFyeSB0eXBlIHRvIHVzZSBmb3IgYmluYXJ5IFdlYlNvY2tldCBmcmFtZXMuXG4gKlxuICogRGVmYXVsdHMgdG8gXCJhcnJheWJ1ZmZlclwiXG4gKlxuICogQHBhcmFtIHt2c259IFtvcHRzLnZzbl0gLSBUaGUgc2VyaWFsaXplcidzIHByb3RvY29sIHZlcnNpb24gdG8gc2VuZCBvbiBjb25uZWN0LlxuICpcbiAqIERlZmF1bHRzIHRvIERFRkFVTFRfVlNOLlxuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNvY2tldCB7XG4gIGNvbnN0cnVjdG9yKGVuZFBvaW50LCBvcHRzID0ge30pe1xuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MgPSB7b3BlbjogW10sIGNsb3NlOiBbXSwgZXJyb3I6IFtdLCBtZXNzYWdlOiBbXX1cbiAgICB0aGlzLmNoYW5uZWxzID0gW11cbiAgICB0aGlzLnNlbmRCdWZmZXIgPSBbXVxuICAgIHRoaXMucmVmID0gMFxuICAgIHRoaXMudGltZW91dCA9IG9wdHMudGltZW91dCB8fCBERUZBVUxUX1RJTUVPVVRcbiAgICB0aGlzLnRyYW5zcG9ydCA9IG9wdHMudHJhbnNwb3J0IHx8IGdsb2JhbC5XZWJTb2NrZXQgfHwgTG9uZ1BvbGxcbiAgICB0aGlzLmVzdGFibGlzaGVkQ29ubmVjdGlvbnMgPSAwXG4gICAgdGhpcy5kZWZhdWx0RW5jb2RlciA9IFNlcmlhbGl6ZXIuZW5jb2RlLmJpbmQoU2VyaWFsaXplcilcbiAgICB0aGlzLmRlZmF1bHREZWNvZGVyID0gU2VyaWFsaXplci5kZWNvZGUuYmluZChTZXJpYWxpemVyKVxuICAgIHRoaXMuY2xvc2VXYXNDbGVhbiA9IGZhbHNlXG4gICAgdGhpcy5iaW5hcnlUeXBlID0gb3B0cy5iaW5hcnlUeXBlIHx8IFwiYXJyYXlidWZmZXJcIlxuICAgIHRoaXMuY29ubmVjdENsb2NrID0gMVxuICAgIGlmKHRoaXMudHJhbnNwb3J0ICE9PSBMb25nUG9sbCl7XG4gICAgICB0aGlzLmVuY29kZSA9IG9wdHMuZW5jb2RlIHx8IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gb3B0cy5kZWNvZGUgfHwgdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuY29kZSA9IHRoaXMuZGVmYXVsdEVuY29kZXJcbiAgICAgIHRoaXMuZGVjb2RlID0gdGhpcy5kZWZhdWx0RGVjb2RlclxuICAgIH1cbiAgICBsZXQgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICBpZihwaHhXaW5kb3cgJiYgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIpe1xuICAgICAgcGh4V2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlaGlkZVwiLCBfZSA9PiB7XG4gICAgICAgIGlmKHRoaXMuY29ubil7XG4gICAgICAgICAgdGhpcy5kaXNjb25uZWN0KClcbiAgICAgICAgICBhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID0gdGhpcy5jb25uZWN0Q2xvY2tcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHBoeFdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZXNob3dcIiwgX2UgPT4ge1xuICAgICAgICBpZihhd2FpdGluZ0Nvbm5lY3Rpb25PblBhZ2VTaG93ID09PSB0aGlzLmNvbm5lY3RDbG9jayl7XG4gICAgICAgICAgYXdhaXRpbmdDb25uZWN0aW9uT25QYWdlU2hvdyA9IG51bGxcbiAgICAgICAgICB0aGlzLmNvbm5lY3QoKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMgPSBvcHRzLmhlYXJ0YmVhdEludGVydmFsTXMgfHwgMzAwMDBcbiAgICB0aGlzLnJlam9pbkFmdGVyTXMgPSAodHJpZXMpID0+IHtcbiAgICAgIGlmKG9wdHMucmVqb2luQWZ0ZXJNcyl7XG4gICAgICAgIHJldHVybiBvcHRzLnJlam9pbkFmdGVyTXModHJpZXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gWzEwMDAsIDIwMDAsIDUwMDBdW3RyaWVzIC0gMV0gfHwgMTAwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5yZWNvbm5lY3RBZnRlck1zID0gKHRyaWVzKSA9PiB7XG4gICAgICBpZihvcHRzLnJlY29ubmVjdEFmdGVyTXMpe1xuICAgICAgICByZXR1cm4gb3B0cy5yZWNvbm5lY3RBZnRlck1zKHRyaWVzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsxMCwgNTAsIDEwMCwgMTUwLCAyMDAsIDI1MCwgNTAwLCAxMDAwLCAyMDAwXVt0cmllcyAtIDFdIHx8IDUwMDBcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2dnZXIgPSBvcHRzLmxvZ2dlciB8fCBudWxsXG4gICAgdGhpcy5sb25ncG9sbGVyVGltZW91dCA9IG9wdHMubG9uZ3BvbGxlclRpbWVvdXQgfHwgMjAwMDBcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUob3B0cy5wYXJhbXMgfHwge30pXG4gICAgdGhpcy5lbmRQb2ludCA9IGAke2VuZFBvaW50fS8ke1RSQU5TUE9SVFMud2Vic29ja2V0fWBcbiAgICB0aGlzLnZzbiA9IG9wdHMudnNuIHx8IERFRkFVTFRfVlNOXG4gICAgdGhpcy5oZWFydGJlYXRUaW1lciA9IG51bGxcbiAgICB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgPSBudWxsXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lciA9IG5ldyBUaW1lcigoKSA9PiB7XG4gICAgICB0aGlzLnRlYXJkb3duKCgpID0+IHRoaXMuY29ubmVjdCgpKVxuICAgIH0sIHRoaXMucmVjb25uZWN0QWZ0ZXJNcylcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb25uZWN0cyBhbmQgcmVwbGFjZXMgdGhlIGFjdGl2ZSB0cmFuc3BvcnRcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gbmV3VHJhbnNwb3J0IC0gVGhlIG5ldyB0cmFuc3BvcnQgY2xhc3MgdG8gaW5zdGFudGlhdGVcbiAgICpcbiAgICovXG4gIHJlcGxhY2VUcmFuc3BvcnQobmV3VHJhbnNwb3J0KXtcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKVxuICAgIHRoaXMudHJhbnNwb3J0ID0gbmV3VHJhbnNwb3J0XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc29ja2V0IHByb3RvY29sXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBwcm90b2NvbCgpeyByZXR1cm4gbG9jYXRpb24ucHJvdG9jb2wubWF0Y2goL15odHRwcy8pID8gXCJ3c3NcIiA6IFwid3NcIiB9XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxseSBxdWFsaWZlZCBzb2NrZXQgdXJsXG4gICAqXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBlbmRQb2ludFVSTCgpe1xuICAgIGxldCB1cmkgPSBBamF4LmFwcGVuZFBhcmFtcyhcbiAgICAgIEFqYXguYXBwZW5kUGFyYW1zKHRoaXMuZW5kUG9pbnQsIHRoaXMucGFyYW1zKCkpLCB7dnNuOiB0aGlzLnZzbn0pXG4gICAgaWYodXJpLmNoYXJBdCgwKSAhPT0gXCIvXCIpeyByZXR1cm4gdXJpIH1cbiAgICBpZih1cmkuY2hhckF0KDEpID09PSBcIi9cIil7IHJldHVybiBgJHt0aGlzLnByb3RvY29sKCl9OiR7dXJpfWAgfVxuXG4gICAgcmV0dXJuIGAke3RoaXMucHJvdG9jb2woKX06Ly8ke2xvY2F0aW9uLmhvc3R9JHt1cml9YFxuICB9XG5cbiAgLyoqXG4gICAqIERpc2Nvbm5lY3RzIHRoZSBzb2NrZXRcbiAgICpcbiAgICogU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DbG9zZUV2ZW50I1N0YXR1c19jb2RlcyBmb3IgdmFsaWQgc3RhdHVzIGNvZGVzLlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayAtIE9wdGlvbmFsIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBzb2NrZXQgaXMgZGlzY29ubmVjdGVkLlxuICAgKiBAcGFyYW0ge2ludGVnZXJ9IGNvZGUgLSBBIHN0YXR1cyBjb2RlIGZvciBkaXNjb25uZWN0aW9uIChPcHRpb25hbCkuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZWFzb24gLSBBIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiB0byBkaXNjb25uZWN0LiAoT3B0aW9uYWwpXG4gICAqL1xuICBkaXNjb25uZWN0KGNhbGxiYWNrLCBjb2RlLCByZWFzb24pe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSB0cnVlXG4gICAgdGhpcy5yZWNvbm5lY3RUaW1lci5yZXNldCgpXG4gICAgdGhpcy50ZWFyZG93bihjYWxsYmFjaywgY29kZSwgcmVhc29uKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBUaGUgcGFyYW1zIHRvIHNlbmQgd2hlbiBjb25uZWN0aW5nLCBmb3IgZXhhbXBsZSBge3VzZXJfaWQ6IHVzZXJUb2tlbn1gXG4gICAqXG4gICAqIFBhc3NpbmcgcGFyYW1zIHRvIGNvbm5lY3QgaXMgZGVwcmVjYXRlZDsgcGFzcyB0aGVtIGluIHRoZSBTb2NrZXQgY29uc3RydWN0b3IgaW5zdGVhZDpcbiAgICogYG5ldyBTb2NrZXQoXCIvc29ja2V0XCIsIHtwYXJhbXM6IHt1c2VyX2lkOiB1c2VyVG9rZW59fSlgLlxuICAgKi9cbiAgY29ubmVjdChwYXJhbXMpe1xuICAgIHRoaXMuY29ubmVjdENsb2NrKytcbiAgICBpZihwYXJhbXMpe1xuICAgICAgY29uc29sZSAmJiBjb25zb2xlLmxvZyhcInBhc3NpbmcgcGFyYW1zIHRvIGNvbm5lY3QgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCBwYXNzIDpwYXJhbXMgdG8gdGhlIFNvY2tldCBjb25zdHJ1Y3RvclwiKVxuICAgICAgdGhpcy5wYXJhbXMgPSBjbG9zdXJlKHBhcmFtcylcbiAgICB9XG4gICAgaWYodGhpcy5jb25uKXsgcmV0dXJuIH1cbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuY29ubiA9IG5ldyB0aGlzLnRyYW5zcG9ydCh0aGlzLmVuZFBvaW50VVJMKCkpXG4gICAgdGhpcy5jb25uLmJpbmFyeVR5cGUgPSB0aGlzLmJpbmFyeVR5cGVcbiAgICB0aGlzLmNvbm4udGltZW91dCA9IHRoaXMubG9uZ3BvbGxlclRpbWVvdXRcbiAgICB0aGlzLmNvbm4ub25vcGVuID0gKCkgPT4gdGhpcy5vbkNvbm5PcGVuKClcbiAgICB0aGlzLmNvbm4ub25lcnJvciA9IGVycm9yID0+IHRoaXMub25Db25uRXJyb3IoZXJyb3IpXG4gICAgdGhpcy5jb25uLm9ubWVzc2FnZSA9IGV2ZW50ID0+IHRoaXMub25Db25uTWVzc2FnZShldmVudClcbiAgICB0aGlzLmNvbm4ub25jbG9zZSA9IGV2ZW50ID0+IHRoaXMub25Db25uQ2xvc2UoZXZlbnQpXG4gIH1cblxuICAvKipcbiAgICogTG9ncyB0aGUgbWVzc2FnZS4gT3ZlcnJpZGUgYHRoaXMubG9nZ2VyYCBmb3Igc3BlY2lhbGl6ZWQgbG9nZ2luZy4gbm9vcHMgYnkgZGVmYXVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2luZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbXNnXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqL1xuICBsb2coa2luZCwgbXNnLCBkYXRhKXsgdGhpcy5sb2dnZXIoa2luZCwgbXNnLCBkYXRhKSB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiBhIGxvZ2dlciBoYXMgYmVlbiBzZXQgb24gdGhpcyBzb2NrZXQuXG4gICAqL1xuICBoYXNMb2dnZXIoKXsgcmV0dXJuIHRoaXMubG9nZ2VyICE9PSBudWxsIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGNhbGxiYWNrcyBmb3IgY29ubmVjdGlvbiBvcGVuIGV2ZW50c1xuICAgKlxuICAgKiBAZXhhbXBsZSBzb2NrZXQub25PcGVuKGZ1bmN0aW9uKCl7IGNvbnNvbGUuaW5mbyhcInRoZSBzb2NrZXQgd2FzIG9wZW5lZFwiKSB9KVxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKi9cbiAgb25PcGVuKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm9wZW4ucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gY2xvc2UgZXZlbnRzXG4gICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gICAqL1xuICBvbkNsb3NlKGNhbGxiYWNrKXtcbiAgICBsZXQgcmVmID0gdGhpcy5tYWtlUmVmKClcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLmNsb3NlLnB1c2goW3JlZiwgY2FsbGJhY2tdKVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgY2FsbGJhY2tzIGZvciBjb25uZWN0aW9uIGVycm9yIGV2ZW50c1xuICAgKlxuICAgKiBAZXhhbXBsZSBzb2NrZXQub25FcnJvcihmdW5jdGlvbihlcnJvcil7IGFsZXJ0KFwiQW4gZXJyb3Igb2NjdXJyZWRcIikgfSlcbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uRXJyb3IoY2FsbGJhY2spe1xuICAgIGxldCByZWYgPSB0aGlzLm1ha2VSZWYoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuZXJyb3IucHVzaChbcmVmLCBjYWxsYmFja10pXG4gICAgcmV0dXJuIHJlZlxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBjYWxsYmFja3MgZm9yIGNvbm5lY3Rpb24gbWVzc2FnZSBldmVudHNcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIG9uTWVzc2FnZShjYWxsYmFjayl7XG4gICAgbGV0IHJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrcy5tZXNzYWdlLnB1c2goW3JlZiwgY2FsbGJhY2tdKVxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgb25Db25uT3Blbigpe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIGBjb25uZWN0ZWQgdG8gJHt0aGlzLmVuZFBvaW50VVJMKCl9YClcbiAgICB0aGlzLmNsb3NlV2FzQ2xlYW4gPSBmYWxzZVxuICAgIHRoaXMuZXN0YWJsaXNoZWRDb25uZWN0aW9ucysrXG4gICAgdGhpcy5mbHVzaFNlbmRCdWZmZXIoKVxuICAgIHRoaXMucmVjb25uZWN0VGltZXIucmVzZXQoKVxuICAgIHRoaXMucmVzZXRIZWFydGJlYXQoKVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mub3Blbi5mb3JFYWNoKChbLCBjYWxsYmFja10pID0+IGNhbGxiYWNrKCkpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG5cbiAgaGVhcnRiZWF0VGltZW91dCgpe1xuICAgIGlmKHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZil7XG4gICAgICB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgPSBudWxsXG4gICAgICBpZih0aGlzLmhhc0xvZ2dlcigpKXsgdGhpcy5sb2coXCJ0cmFuc3BvcnRcIiwgXCJoZWFydGJlYXQgdGltZW91dC4gQXR0ZW1wdGluZyB0byByZS1lc3RhYmxpc2ggY29ubmVjdGlvblwiKSB9XG4gICAgICB0aGlzLmFibm9ybWFsQ2xvc2UoXCJoZWFydGJlYXQgdGltZW91dFwiKVxuICAgIH1cbiAgfVxuXG4gIHJlc2V0SGVhcnRiZWF0KCl7XG4gICAgaWYodGhpcy5jb25uICYmIHRoaXMuY29ubi5za2lwSGVhcnRiZWF0KXsgcmV0dXJuIH1cbiAgICB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWYgPSBudWxsXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaGVhcnRiZWF0VGltZXIpXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbmRIZWFydGJlYXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICB9XG5cbiAgdGVhcmRvd24oY2FsbGJhY2ssIGNvZGUsIHJlYXNvbil7XG4gICAgaWYoIXRoaXMuY29ubil7XG4gICAgICByZXR1cm4gY2FsbGJhY2sgJiYgY2FsbGJhY2soKVxuICAgIH1cblxuICAgIHRoaXMud2FpdEZvckJ1ZmZlckRvbmUoKCkgPT4ge1xuICAgICAgaWYodGhpcy5jb25uKXtcbiAgICAgICAgaWYoY29kZSl7IHRoaXMuY29ubi5jbG9zZShjb2RlLCByZWFzb24gfHwgXCJcIikgfSBlbHNlIHsgdGhpcy5jb25uLmNsb3NlKCkgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLndhaXRGb3JTb2NrZXRDbG9zZWQoKCkgPT4ge1xuICAgICAgICBpZih0aGlzLmNvbm4pe1xuICAgICAgICAgIHRoaXMuY29ubi5vbmNsb3NlID0gZnVuY3Rpb24gKCl7IH0gLy8gbm9vcFxuICAgICAgICAgIHRoaXMuY29ubiA9IG51bGxcbiAgICAgICAgfVxuXG4gICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHdhaXRGb3JCdWZmZXJEb25lKGNhbGxiYWNrLCB0cmllcyA9IDEpe1xuICAgIGlmKHRyaWVzID09PSA1IHx8ICF0aGlzLmNvbm4gfHwgIXRoaXMuY29ubi5idWZmZXJlZEFtb3VudCl7XG4gICAgICBjYWxsYmFjaygpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMud2FpdEZvckJ1ZmZlckRvbmUoY2FsbGJhY2ssIHRyaWVzICsgMSlcbiAgICB9LCAxNTAgKiB0cmllcylcbiAgfVxuXG4gIHdhaXRGb3JTb2NrZXRDbG9zZWQoY2FsbGJhY2ssIHRyaWVzID0gMSl7XG4gICAgaWYodHJpZXMgPT09IDUgfHwgIXRoaXMuY29ubiB8fCB0aGlzLmNvbm4ucmVhZHlTdGF0ZSA9PT0gU09DS0VUX1NUQVRFUy5jbG9zZWQpe1xuICAgICAgY2FsbGJhY2soKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhaXRGb3JTb2NrZXRDbG9zZWQoY2FsbGJhY2ssIHRyaWVzICsgMSlcbiAgICB9LCAxNTAgKiB0cmllcylcbiAgfVxuXG4gIG9uQ29ubkNsb3NlKGV2ZW50KXtcbiAgICBsZXQgY2xvc2VDb2RlID0gZXZlbnQgJiYgZXZlbnQuY29kZVxuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpIHRoaXMubG9nKFwidHJhbnNwb3J0XCIsIFwiY2xvc2VcIiwgZXZlbnQpXG4gICAgdGhpcy50cmlnZ2VyQ2hhbkVycm9yKClcbiAgICBjbGVhclRpbWVvdXQodGhpcy5oZWFydGJlYXRUaW1lcilcbiAgICBpZighdGhpcy5jbG9zZVdhc0NsZWFuICYmIGNsb3NlQ29kZSAhPT0gMTAwMCl7XG4gICAgICB0aGlzLnJlY29ubmVjdFRpbWVyLnNjaGVkdWxlVGltZW91dCgpXG4gICAgfVxuICAgIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MuY2xvc2UuZm9yRWFjaCgoWywgY2FsbGJhY2tdKSA9PiBjYWxsYmFjayhldmVudCkpXG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG9uQ29ubkVycm9yKGVycm9yKXtcbiAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInRyYW5zcG9ydFwiLCBlcnJvcilcbiAgICBsZXQgdHJhbnNwb3J0QmVmb3JlID0gdGhpcy50cmFuc3BvcnRcbiAgICBsZXQgZXN0YWJsaXNoZWRCZWZvcmUgPSB0aGlzLmVzdGFibGlzaGVkQ29ubmVjdGlvbnNcbiAgICB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLmVycm9yLmZvckVhY2goKFssIGNhbGxiYWNrXSkgPT4ge1xuICAgICAgY2FsbGJhY2soZXJyb3IsIHRyYW5zcG9ydEJlZm9yZSwgZXN0YWJsaXNoZWRCZWZvcmUpXG4gICAgfSlcbiAgICBpZih0cmFuc3BvcnRCZWZvcmUgPT09IHRoaXMudHJhbnNwb3J0IHx8IGVzdGFibGlzaGVkQmVmb3JlID4gMCl7XG4gICAgICB0aGlzLnRyaWdnZXJDaGFuRXJyb3IoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdHJpZ2dlckNoYW5FcnJvcigpe1xuICAgIHRoaXMuY2hhbm5lbHMuZm9yRWFjaChjaGFubmVsID0+IHtcbiAgICAgIGlmKCEoY2hhbm5lbC5pc0Vycm9yZWQoKSB8fCBjaGFubmVsLmlzTGVhdmluZygpIHx8IGNoYW5uZWwuaXNDbG9zZWQoKSkpe1xuICAgICAgICBjaGFubmVsLnRyaWdnZXIoQ0hBTk5FTF9FVkVOVFMuZXJyb3IpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgY29ubmVjdGlvblN0YXRlKCl7XG4gICAgc3dpdGNoKHRoaXMuY29ubiAmJiB0aGlzLmNvbm4ucmVhZHlTdGF0ZSl7XG4gICAgICBjYXNlIFNPQ0tFVF9TVEFURVMuY29ubmVjdGluZzogcmV0dXJuIFwiY29ubmVjdGluZ1wiXG4gICAgICBjYXNlIFNPQ0tFVF9TVEFURVMub3BlbjogcmV0dXJuIFwib3BlblwiXG4gICAgICBjYXNlIFNPQ0tFVF9TVEFURVMuY2xvc2luZzogcmV0dXJuIFwiY2xvc2luZ1wiXG4gICAgICBkZWZhdWx0OiByZXR1cm4gXCJjbG9zZWRcIlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGlzQ29ubmVjdGVkKCl7IHJldHVybiB0aGlzLmNvbm5lY3Rpb25TdGF0ZSgpID09PSBcIm9wZW5cIiB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqXG4gICAqIEBwYXJhbSB7Q2hhbm5lbH1cbiAgICovXG4gIHJlbW92ZShjaGFubmVsKXtcbiAgICB0aGlzLm9mZihjaGFubmVsLnN0YXRlQ2hhbmdlUmVmcylcbiAgICB0aGlzLmNoYW5uZWxzID0gdGhpcy5jaGFubmVscy5maWx0ZXIoYyA9PiBjLmpvaW5SZWYoKSAhPT0gY2hhbm5lbC5qb2luUmVmKCkpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYCByZWdpc3RyYXRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge3JlZnN9IC0gbGlzdCBvZiByZWZzIHJldHVybmVkIGJ5IGNhbGxzIHRvXG4gICAqICAgICAgICAgICAgICAgICBgb25PcGVuYCwgYG9uQ2xvc2VgLCBgb25FcnJvcixgIGFuZCBgb25NZXNzYWdlYFxuICAgKi9cbiAgb2ZmKHJlZnMpe1xuICAgIGZvcihsZXQga2V5IGluIHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3Mpe1xuICAgICAgdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldID0gdGhpcy5zdGF0ZUNoYW5nZUNhbGxiYWNrc1trZXldLmZpbHRlcigoW3JlZl0pID0+IHtcbiAgICAgICAgcmV0dXJuIHJlZnMuaW5kZXhPZihyZWYpID09PSAtMVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhdGVzIGEgbmV3IGNoYW5uZWwgZm9yIHRoZSBnaXZlbiB0b3BpY1xuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdG9waWNcbiAgICogQHBhcmFtIHtPYmplY3R9IGNoYW5QYXJhbXMgLSBQYXJhbWV0ZXJzIGZvciB0aGUgY2hhbm5lbFxuICAgKiBAcmV0dXJucyB7Q2hhbm5lbH1cbiAgICovXG4gIGNoYW5uZWwodG9waWMsIGNoYW5QYXJhbXMgPSB7fSl7XG4gICAgbGV0IGNoYW4gPSBuZXcgQ2hhbm5lbCh0b3BpYywgY2hhblBhcmFtcywgdGhpcylcbiAgICB0aGlzLmNoYW5uZWxzLnB1c2goY2hhbilcbiAgICByZXR1cm4gY2hhblxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhXG4gICAqL1xuICBwdXNoKGRhdGEpe1xuICAgIGlmKHRoaXMuaGFzTG9nZ2VyKCkpe1xuICAgICAgbGV0IHt0b3BpYywgZXZlbnQsIHBheWxvYWQsIHJlZiwgam9pbl9yZWZ9ID0gZGF0YVxuICAgICAgdGhpcy5sb2coXCJwdXNoXCIsIGAke3RvcGljfSAke2V2ZW50fSAoJHtqb2luX3JlZn0sICR7cmVmfSlgLCBwYXlsb2FkKVxuICAgIH1cblxuICAgIGlmKHRoaXMuaXNDb25uZWN0ZWQoKSl7XG4gICAgICB0aGlzLmVuY29kZShkYXRhLCByZXN1bHQgPT4gdGhpcy5jb25uLnNlbmQocmVzdWx0KSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZW5kQnVmZmVyLnB1c2goKCkgPT4gdGhpcy5lbmNvZGUoZGF0YSwgcmVzdWx0ID0+IHRoaXMuY29ubi5zZW5kKHJlc3VsdCkpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5leHQgbWVzc2FnZSByZWYsIGFjY291bnRpbmcgZm9yIG92ZXJmbG93c1xuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgbWFrZVJlZigpe1xuICAgIGxldCBuZXdSZWYgPSB0aGlzLnJlZiArIDFcbiAgICBpZihuZXdSZWYgPT09IHRoaXMucmVmKXsgdGhpcy5yZWYgPSAwIH0gZWxzZSB7IHRoaXMucmVmID0gbmV3UmVmIH1cblxuICAgIHJldHVybiB0aGlzLnJlZi50b1N0cmluZygpXG4gIH1cblxuICBzZW5kSGVhcnRiZWF0KCl7XG4gICAgaWYodGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmICYmICF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IHRoaXMubWFrZVJlZigpXG4gICAgdGhpcy5wdXNoKHt0b3BpYzogXCJwaG9lbml4XCIsIGV2ZW50OiBcImhlYXJ0YmVhdFwiLCBwYXlsb2FkOiB7fSwgcmVmOiB0aGlzLnBlbmRpbmdIZWFydGJlYXRSZWZ9KVxuICAgIHRoaXMuaGVhcnRiZWF0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaGVhcnRiZWF0VGltZW91dCgpLCB0aGlzLmhlYXJ0YmVhdEludGVydmFsTXMpXG4gIH1cblxuICBhYm5vcm1hbENsb3NlKHJlYXNvbil7XG4gICAgdGhpcy5jbG9zZVdhc0NsZWFuID0gZmFsc2VcbiAgICBpZih0aGlzLmlzQ29ubmVjdGVkKCkpeyB0aGlzLmNvbm4uY2xvc2UoV1NfQ0xPU0VfTk9STUFMLCByZWFzb24pIH1cbiAgfVxuXG4gIGZsdXNoU2VuZEJ1ZmZlcigpe1xuICAgIGlmKHRoaXMuaXNDb25uZWN0ZWQoKSAmJiB0aGlzLnNlbmRCdWZmZXIubGVuZ3RoID4gMCl7XG4gICAgICB0aGlzLnNlbmRCdWZmZXIuZm9yRWFjaChjYWxsYmFjayA9PiBjYWxsYmFjaygpKVxuICAgICAgdGhpcy5zZW5kQnVmZmVyID0gW11cbiAgICB9XG4gIH1cblxuICBvbkNvbm5NZXNzYWdlKHJhd01lc3NhZ2Upe1xuICAgIHRoaXMuZGVjb2RlKHJhd01lc3NhZ2UuZGF0YSwgbXNnID0+IHtcbiAgICAgIGxldCB7dG9waWMsIGV2ZW50LCBwYXlsb2FkLCByZWYsIGpvaW5fcmVmfSA9IG1zZ1xuICAgICAgaWYocmVmICYmIHJlZiA9PT0gdGhpcy5wZW5kaW5nSGVhcnRiZWF0UmVmKXtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaGVhcnRiZWF0VGltZXIpXG4gICAgICAgIHRoaXMucGVuZGluZ0hlYXJ0YmVhdFJlZiA9IG51bGxcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNlbmRIZWFydGJlYXQoKSwgdGhpcy5oZWFydGJlYXRJbnRlcnZhbE1zKVxuICAgICAgfVxuXG4gICAgICBpZih0aGlzLmhhc0xvZ2dlcigpKSB0aGlzLmxvZyhcInJlY2VpdmVcIiwgYCR7cGF5bG9hZC5zdGF0dXMgfHwgXCJcIn0gJHt0b3BpY30gJHtldmVudH0gJHtyZWYgJiYgXCIoXCIgKyByZWYgKyBcIilcIiB8fCBcIlwifWAsIHBheWxvYWQpXG5cbiAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLmNoYW5uZWxzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuY2hhbm5lbHNbaV1cbiAgICAgICAgaWYoIWNoYW5uZWwuaXNNZW1iZXIodG9waWMsIGV2ZW50LCBwYXlsb2FkLCBqb2luX3JlZikpeyBjb250aW51ZSB9XG4gICAgICAgIGNoYW5uZWwudHJpZ2dlcihldmVudCwgcGF5bG9hZCwgcmVmLCBqb2luX3JlZilcbiAgICAgIH1cblxuICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRoaXMuc3RhdGVDaGFuZ2VDYWxsYmFja3MubWVzc2FnZS5sZW5ndGg7IGkrKyl7XG4gICAgICAgIGxldCBbLCBjYWxsYmFja10gPSB0aGlzLnN0YXRlQ2hhbmdlQ2FsbGJhY2tzLm1lc3NhZ2VbaV1cbiAgICAgICAgY2FsbGJhY2sobXNnKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBsZWF2ZU9wZW5Ub3BpYyh0b3BpYyl7XG4gICAgbGV0IGR1cENoYW5uZWwgPSB0aGlzLmNoYW5uZWxzLmZpbmQoYyA9PiBjLnRvcGljID09PSB0b3BpYyAmJiAoYy5pc0pvaW5lZCgpIHx8IGMuaXNKb2luaW5nKCkpKVxuICAgIGlmKGR1cENoYW5uZWwpe1xuICAgICAgaWYodGhpcy5oYXNMb2dnZXIoKSkgdGhpcy5sb2coXCJ0cmFuc3BvcnRcIiwgYGxlYXZpbmcgZHVwbGljYXRlIHRvcGljIFwiJHt0b3BpY31cImApXG4gICAgICBkdXBDaGFubmVsLmxlYXZlKClcbiAgICB9XG4gIH1cbn1cbiIsICJcbmV4cG9ydCBjb25zdCBDT05TRUNVVElWRV9SRUxPQURTID0gXCJjb25zZWN1dGl2ZS1yZWxvYWRzXCJcbmV4cG9ydCBjb25zdCBNQVhfUkVMT0FEUyA9IDEwXG5leHBvcnQgY29uc3QgUkVMT0FEX0pJVFRFUl9NSU4gPSAxMDAwXG5leHBvcnQgY29uc3QgUkVMT0FEX0pJVFRFUl9NQVggPSAzMDAwXG5leHBvcnQgY29uc3QgRkFJTFNBRkVfSklUVEVSID0gMzAwMDBcbmV4cG9ydCBjb25zdCBQSFhfRVZFTlRfQ0xBU1NFUyA9IFtcbiAgXCJwaHgtY2xpY2stbG9hZGluZ1wiLCBcInBoeC1jaGFuZ2UtbG9hZGluZ1wiLCBcInBoeC1zdWJtaXQtbG9hZGluZ1wiLFxuICBcInBoeC1rZXlkb3duLWxvYWRpbmdcIiwgXCJwaHgta2V5dXAtbG9hZGluZ1wiLCBcInBoeC1ibHVyLWxvYWRpbmdcIiwgXCJwaHgtZm9jdXMtbG9hZGluZ1wiXG5dXG5leHBvcnQgY29uc3QgUEhYX0NPTVBPTkVOVCA9IFwiZGF0YS1waHgtY29tcG9uZW50XCJcbmV4cG9ydCBjb25zdCBQSFhfTElWRV9MSU5LID0gXCJkYXRhLXBoeC1saW5rXCJcbmV4cG9ydCBjb25zdCBQSFhfVFJBQ0tfU1RBVElDID0gXCJ0cmFjay1zdGF0aWNcIlxuZXhwb3J0IGNvbnN0IFBIWF9MSU5LX1NUQVRFID0gXCJkYXRhLXBoeC1saW5rLXN0YXRlXCJcbmV4cG9ydCBjb25zdCBQSFhfUkVGID0gXCJkYXRhLXBoeC1yZWZcIlxuZXhwb3J0IGNvbnN0IFBIWF9SRUZfU1JDID0gXCJkYXRhLXBoeC1yZWYtc3JjXCJcbmV4cG9ydCBjb25zdCBQSFhfVFJBQ0tfVVBMT0FEUyA9IFwidHJhY2stdXBsb2Fkc1wiXG5leHBvcnQgY29uc3QgUEhYX1VQTE9BRF9SRUYgPSBcImRhdGEtcGh4LXVwbG9hZC1yZWZcIlxuZXhwb3J0IGNvbnN0IFBIWF9QUkVGTElHSFRFRF9SRUZTID0gXCJkYXRhLXBoeC1wcmVmbGlnaHRlZC1yZWZzXCJcbmV4cG9ydCBjb25zdCBQSFhfRE9ORV9SRUZTID0gXCJkYXRhLXBoeC1kb25lLXJlZnNcIlxuZXhwb3J0IGNvbnN0IFBIWF9EUk9QX1RBUkdFVCA9IFwiZHJvcC10YXJnZXRcIlxuZXhwb3J0IGNvbnN0IFBIWF9BQ1RJVkVfRU5UUllfUkVGUyA9IFwiZGF0YS1waHgtYWN0aXZlLXJlZnNcIlxuZXhwb3J0IGNvbnN0IFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCA9IFwicGh4OmxpdmUtZmlsZTp1cGRhdGVkXCJcbmV4cG9ydCBjb25zdCBQSFhfU0tJUCA9IFwiZGF0YS1waHgtc2tpcFwiXG5leHBvcnQgY29uc3QgUEhYX1BSVU5FID0gXCJkYXRhLXBoeC1wcnVuZVwiXG5leHBvcnQgY29uc3QgUEhYX1BBR0VfTE9BRElORyA9IFwicGFnZS1sb2FkaW5nXCJcbmV4cG9ydCBjb25zdCBQSFhfQ09OTkVDVEVEX0NMQVNTID0gXCJwaHgtY29ubmVjdGVkXCJcbmV4cG9ydCBjb25zdCBQSFhfRElTQ09OTkVDVEVEX0NMQVNTID0gXCJwaHgtbG9hZGluZ1wiXG5leHBvcnQgY29uc3QgUEhYX05PX0ZFRURCQUNLX0NMQVNTID0gXCJwaHgtbm8tZmVlZGJhY2tcIlxuZXhwb3J0IGNvbnN0IFBIWF9FUlJPUl9DTEFTUyA9IFwicGh4LWVycm9yXCJcbmV4cG9ydCBjb25zdCBQSFhfUEFSRU5UX0lEID0gXCJkYXRhLXBoeC1wYXJlbnQtaWRcIlxuZXhwb3J0IGNvbnN0IFBIWF9NQUlOID0gXCJkYXRhLXBoeC1tYWluXCJcbmV4cG9ydCBjb25zdCBQSFhfUk9PVF9JRCA9IFwiZGF0YS1waHgtcm9vdC1pZFwiXG5leHBvcnQgY29uc3QgUEhYX1RSSUdHRVJfQUNUSU9OID0gXCJ0cmlnZ2VyLWFjdGlvblwiXG5leHBvcnQgY29uc3QgUEhYX0ZFRURCQUNLX0ZPUiA9IFwiZmVlZGJhY2stZm9yXCJcbmV4cG9ydCBjb25zdCBQSFhfSEFTX0ZPQ1VTRUQgPSBcInBoeC1oYXMtZm9jdXNlZFwiXG5leHBvcnQgY29uc3QgRk9DVVNBQkxFX0lOUFVUUyA9IFtcInRleHRcIiwgXCJ0ZXh0YXJlYVwiLCBcIm51bWJlclwiLCBcImVtYWlsXCIsIFwicGFzc3dvcmRcIiwgXCJzZWFyY2hcIiwgXCJ0ZWxcIiwgXCJ1cmxcIiwgXCJkYXRlXCIsIFwidGltZVwiLCBcImRhdGV0aW1lLWxvY2FsXCIsIFwiY29sb3JcIiwgXCJyYW5nZVwiXVxuZXhwb3J0IGNvbnN0IENIRUNLQUJMRV9JTlBVVFMgPSBbXCJjaGVja2JveFwiLCBcInJhZGlvXCJdXG5leHBvcnQgY29uc3QgUEhYX0hBU19TVUJNSVRURUQgPSBcInBoeC1oYXMtc3VibWl0dGVkXCJcbmV4cG9ydCBjb25zdCBQSFhfU0VTU0lPTiA9IFwiZGF0YS1waHgtc2Vzc2lvblwiXG5leHBvcnQgY29uc3QgUEhYX1ZJRVdfU0VMRUNUT1IgPSBgWyR7UEhYX1NFU1NJT059XWBcbmV4cG9ydCBjb25zdCBQSFhfU1RJQ0tZID0gXCJkYXRhLXBoeC1zdGlja3lcIlxuZXhwb3J0IGNvbnN0IFBIWF9TVEFUSUMgPSBcImRhdGEtcGh4LXN0YXRpY1wiXG5leHBvcnQgY29uc3QgUEhYX1JFQURPTkxZID0gXCJkYXRhLXBoeC1yZWFkb25seVwiXG5leHBvcnQgY29uc3QgUEhYX0RJU0FCTEVEID0gXCJkYXRhLXBoeC1kaXNhYmxlZFwiXG5leHBvcnQgY29uc3QgUEhYX0RJU0FCTEVfV0lUSCA9IFwiZGlzYWJsZS13aXRoXCJcbmV4cG9ydCBjb25zdCBQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUgPSBcImRhdGEtcGh4LWRpc2FibGUtd2l0aC1yZXN0b3JlXCJcbmV4cG9ydCBjb25zdCBQSFhfSE9PSyA9IFwiaG9va1wiXG5leHBvcnQgY29uc3QgUEhYX0RFQk9VTkNFID0gXCJkZWJvdW5jZVwiXG5leHBvcnQgY29uc3QgUEhYX1RIUk9UVExFID0gXCJ0aHJvdHRsZVwiXG5leHBvcnQgY29uc3QgUEhYX1VQREFURSA9IFwidXBkYXRlXCJcbmV4cG9ydCBjb25zdCBQSFhfS0VZID0gXCJrZXlcIlxuZXhwb3J0IGNvbnN0IFBIWF9QUklWQVRFID0gXCJwaHhQcml2YXRlXCJcbmV4cG9ydCBjb25zdCBQSFhfQVVUT19SRUNPVkVSID0gXCJhdXRvLXJlY292ZXJcIlxuZXhwb3J0IGNvbnN0IFBIWF9MVl9ERUJVRyA9IFwicGh4OmxpdmUtc29ja2V0OmRlYnVnXCJcbmV4cG9ydCBjb25zdCBQSFhfTFZfUFJPRklMRSA9IFwicGh4OmxpdmUtc29ja2V0OnByb2ZpbGluZ1wiXG5leHBvcnQgY29uc3QgUEhYX0xWX0xBVEVOQ1lfU0lNID0gXCJwaHg6bGl2ZS1zb2NrZXQ6bGF0ZW5jeS1zaW1cIlxuZXhwb3J0IGNvbnN0IFBIWF9QUk9HUkVTUyA9IFwicHJvZ3Jlc3NcIlxuZXhwb3J0IGNvbnN0IExPQURFUl9USU1FT1VUID0gMVxuZXhwb3J0IGNvbnN0IEJFRk9SRV9VTkxPQURfTE9BREVSX1RJTUVPVVQgPSAyMDBcbmV4cG9ydCBjb25zdCBCSU5ESU5HX1BSRUZJWCA9IFwicGh4LVwiXG5leHBvcnQgY29uc3QgUFVTSF9USU1FT1VUID0gMzAwMDBcbmV4cG9ydCBjb25zdCBMSU5LX0hFQURFUiA9IFwieC1yZXF1ZXN0ZWQtd2l0aFwiXG5leHBvcnQgY29uc3QgUkVTUE9OU0VfVVJMX0hFQURFUiA9IFwieC1yZXNwb25zZS11cmxcIlxuZXhwb3J0IGNvbnN0IERFQk9VTkNFX1RSSUdHRVIgPSBcImRlYm91bmNlLXRyaWdnZXJcIlxuZXhwb3J0IGNvbnN0IFRIUk9UVExFRCA9IFwidGhyb3R0bGVkXCJcbmV4cG9ydCBjb25zdCBERUJPVU5DRV9QUkVWX0tFWSA9IFwiZGVib3VuY2UtcHJldi1rZXlcIlxuZXhwb3J0IGNvbnN0IERFRkFVTFRTID0ge1xuICBkZWJvdW5jZTogMzAwLFxuICB0aHJvdHRsZTogMzAwXG59XG5cbi8vIFJlbmRlcmVkXG5leHBvcnQgY29uc3QgRFlOQU1JQ1MgPSBcImRcIlxuZXhwb3J0IGNvbnN0IFNUQVRJQyA9IFwic1wiXG5leHBvcnQgY29uc3QgQ09NUE9ORU5UUyA9IFwiY1wiXG5leHBvcnQgY29uc3QgRVZFTlRTID0gXCJlXCJcbmV4cG9ydCBjb25zdCBSRVBMWSA9IFwiclwiXG5leHBvcnQgY29uc3QgVElUTEUgPSBcInRcIlxuZXhwb3J0IGNvbnN0IFRFTVBMQVRFUyA9IFwicFwiXG4iLCAiaW1wb3J0IHtcbiAgbG9nRXJyb3Jcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbnRyeVVwbG9hZGVyIHtcbiAgY29uc3RydWN0b3IoZW50cnksIGNodW5rU2l6ZSwgbGl2ZVNvY2tldCl7XG4gICAgdGhpcy5saXZlU29ja2V0ID0gbGl2ZVNvY2tldFxuICAgIHRoaXMuZW50cnkgPSBlbnRyeVxuICAgIHRoaXMub2Zmc2V0ID0gMFxuICAgIHRoaXMuY2h1bmtTaXplID0gY2h1bmtTaXplXG4gICAgdGhpcy5jaHVua1RpbWVyID0gbnVsbFxuICAgIHRoaXMudXBsb2FkQ2hhbm5lbCA9IGxpdmVTb2NrZXQuY2hhbm5lbChgbHZ1OiR7ZW50cnkucmVmfWAsIHt0b2tlbjogZW50cnkubWV0YWRhdGEoKX0pXG4gIH1cblxuICBlcnJvcihyZWFzb24pe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmNodW5rVGltZXIpXG4gICAgdGhpcy51cGxvYWRDaGFubmVsLmxlYXZlKClcbiAgICB0aGlzLmVudHJ5LmVycm9yKHJlYXNvbilcbiAgfVxuXG4gIHVwbG9hZCgpe1xuICAgIHRoaXMudXBsb2FkQ2hhbm5lbC5vbkVycm9yKHJlYXNvbiA9PiB0aGlzLmVycm9yKHJlYXNvbikpXG4gICAgdGhpcy51cGxvYWRDaGFubmVsLmpvaW4oKVxuICAgICAgLnJlY2VpdmUoXCJva1wiLCBfZGF0YSA9PiB0aGlzLnJlYWROZXh0Q2h1bmsoKSlcbiAgICAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgcmVhc29uID0+IHRoaXMuZXJyb3IocmVhc29uKSlcbiAgfVxuXG4gIGlzRG9uZSgpeyByZXR1cm4gdGhpcy5vZmZzZXQgPj0gdGhpcy5lbnRyeS5maWxlLnNpemUgfVxuXG4gIHJlYWROZXh0Q2h1bmsoKXtcbiAgICBsZXQgcmVhZGVyID0gbmV3IHdpbmRvdy5GaWxlUmVhZGVyKClcbiAgICBsZXQgYmxvYiA9IHRoaXMuZW50cnkuZmlsZS5zbGljZSh0aGlzLm9mZnNldCwgdGhpcy5jaHVua1NpemUgKyB0aGlzLm9mZnNldClcbiAgICByZWFkZXIub25sb2FkID0gKGUpID0+IHtcbiAgICAgIGlmKGUudGFyZ2V0LmVycm9yID09PSBudWxsKXtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gZS50YXJnZXQucmVzdWx0LmJ5dGVMZW5ndGhcbiAgICAgICAgdGhpcy5wdXNoQ2h1bmsoZS50YXJnZXQucmVzdWx0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKFwiUmVhZCBlcnJvcjogXCIgKyBlLnRhcmdldC5lcnJvcilcbiAgICAgIH1cbiAgICB9XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpXG4gIH1cblxuICBwdXNoQ2h1bmsoY2h1bmspe1xuICAgIGlmKCF0aGlzLnVwbG9hZENoYW5uZWwuaXNKb2luZWQoKSl7IHJldHVybiB9XG4gICAgdGhpcy51cGxvYWRDaGFubmVsLnB1c2goXCJjaHVua1wiLCBjaHVuaylcbiAgICAgIC5yZWNlaXZlKFwib2tcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLmVudHJ5LnByb2dyZXNzKCh0aGlzLm9mZnNldCAvIHRoaXMuZW50cnkuZmlsZS5zaXplKSAqIDEwMClcbiAgICAgICAgaWYoIXRoaXMuaXNEb25lKCkpe1xuICAgICAgICAgIHRoaXMuY2h1bmtUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZWFkTmV4dENodW5rKCksIHRoaXMubGl2ZVNvY2tldC5nZXRMYXRlbmN5U2ltKCkgfHwgMClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIFBIWF9WSUVXX1NFTEVDVE9SXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCBFbnRyeVVwbG9hZGVyIGZyb20gXCIuL2VudHJ5X3VwbG9hZGVyXCJcblxuZXhwb3J0IGxldCBsb2dFcnJvciA9IChtc2csIG9iaikgPT4gY29uc29sZS5lcnJvciAmJiBjb25zb2xlLmVycm9yKG1zZywgb2JqKVxuXG5leHBvcnQgbGV0IGlzQ2lkID0gKGNpZCkgPT4ge1xuICBsZXQgdHlwZSA9IHR5cGVvZihjaWQpXG4gIHJldHVybiB0eXBlID09PSBcIm51bWJlclwiIHx8ICh0eXBlID09PSBcInN0cmluZ1wiICYmIC9eKDB8WzEtOV1cXGQqKSQvLnRlc3QoY2lkKSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdER1cGxpY2F0ZUlkcygpe1xuICBsZXQgaWRzID0gbmV3IFNldCgpXG4gIGxldCBlbGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2lkXVwiKVxuICBmb3IobGV0IGkgPSAwLCBsZW4gPSBlbGVtcy5sZW5ndGg7IGkgPCBsZW47IGkrKyl7XG4gICAgaWYoaWRzLmhhcyhlbGVtc1tpXS5pZCkpe1xuICAgICAgY29uc29sZS5lcnJvcihgTXVsdGlwbGUgSURzIGRldGVjdGVkOiAke2VsZW1zW2ldLmlkfS4gRW5zdXJlIHVuaXF1ZSBlbGVtZW50IGlkcy5gKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZHMuYWRkKGVsZW1zW2ldLmlkKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgbGV0IGRlYnVnID0gKHZpZXcsIGtpbmQsIG1zZywgb2JqKSA9PiB7XG4gIGlmKHZpZXcubGl2ZVNvY2tldC5pc0RlYnVnRW5hYmxlZCgpKXtcbiAgICBjb25zb2xlLmxvZyhgJHt2aWV3LmlkfSAke2tpbmR9OiAke21zZ30gLSBgLCBvYmopXG4gIH1cbn1cblxuLy8gd3JhcHMgdmFsdWUgaW4gY2xvc3VyZSBvciByZXR1cm5zIGNsb3N1cmVcbmV4cG9ydCBsZXQgY2xvc3VyZSA9ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIiA/IHZhbCA6IGZ1bmN0aW9uICgpeyByZXR1cm4gdmFsIH1cblxuZXhwb3J0IGxldCBjbG9uZSA9IChvYmopID0+IHsgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkob2JqKSkgfVxuXG5leHBvcnQgbGV0IGNsb3Nlc3RQaHhCaW5kaW5nID0gKGVsLCBiaW5kaW5nLCBib3JkZXJFbCkgPT4ge1xuICBkbyB7XG4gICAgaWYoZWwubWF0Y2hlcyhgWyR7YmluZGluZ31dYCkpeyByZXR1cm4gZWwgfVxuICAgIGVsID0gZWwucGFyZW50RWxlbWVudCB8fCBlbC5wYXJlbnROb2RlXG4gIH0gd2hpbGUoZWwgIT09IG51bGwgJiYgZWwubm9kZVR5cGUgPT09IDEgJiYgISgoYm9yZGVyRWwgJiYgYm9yZGVyRWwuaXNTYW1lTm9kZShlbCkpIHx8IGVsLm1hdGNoZXMoUEhYX1ZJRVdfU0VMRUNUT1IpKSlcbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0IGxldCBpc09iamVjdCA9IChvYmopID0+IHtcbiAgcmV0dXJuIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmICEob2JqIGluc3RhbmNlb2YgQXJyYXkpXG59XG5cbmV4cG9ydCBsZXQgaXNFcXVhbE9iaiA9IChvYmoxLCBvYmoyKSA9PiBKU09OLnN0cmluZ2lmeShvYmoxKSA9PT0gSlNPTi5zdHJpbmdpZnkob2JqMilcblxuZXhwb3J0IGxldCBpc0VtcHR5ID0gKG9iaikgPT4ge1xuICBmb3IobGV0IHggaW4gb2JqKXsgcmV0dXJuIGZhbHNlIH1cbiAgcmV0dXJuIHRydWVcbn1cblxuZXhwb3J0IGxldCBtYXliZSA9IChlbCwgY2FsbGJhY2spID0+IGVsICYmIGNhbGxiYWNrKGVsKVxuXG5leHBvcnQgbGV0IGNoYW5uZWxVcGxvYWRlciA9IGZ1bmN0aW9uIChlbnRyaWVzLCBvbkVycm9yLCByZXNwLCBsaXZlU29ja2V0KXtcbiAgZW50cmllcy5mb3JFYWNoKGVudHJ5ID0+IHtcbiAgICBsZXQgZW50cnlVcGxvYWRlciA9IG5ldyBFbnRyeVVwbG9hZGVyKGVudHJ5LCByZXNwLmNvbmZpZy5jaHVua19zaXplLCBsaXZlU29ja2V0KVxuICAgIGVudHJ5VXBsb2FkZXIudXBsb2FkKClcbiAgfSlcbn1cbiIsICJsZXQgQnJvd3NlciA9IHtcbiAgY2FuUHVzaFN0YXRlKCl7IHJldHVybiAodHlwZW9mIChoaXN0b3J5LnB1c2hTdGF0ZSkgIT09IFwidW5kZWZpbmVkXCIpIH0sXG5cbiAgZHJvcExvY2FsKGxvY2FsU3RvcmFnZSwgbmFtZXNwYWNlLCBzdWJrZXkpe1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KSlcbiAgfSxcblxuICB1cGRhdGVMb2NhbChsb2NhbFN0b3JhZ2UsIG5hbWVzcGFjZSwgc3Via2V5LCBpbml0aWFsLCBmdW5jKXtcbiAgICBsZXQgY3VycmVudCA9IHRoaXMuZ2V0TG9jYWwobG9jYWxTdG9yYWdlLCBuYW1lc3BhY2UsIHN1YmtleSlcbiAgICBsZXQga2V5ID0gdGhpcy5sb2NhbEtleShuYW1lc3BhY2UsIHN1YmtleSlcbiAgICBsZXQgbmV3VmFsID0gY3VycmVudCA9PT0gbnVsbCA/IGluaXRpYWwgOiBmdW5jKGN1cnJlbnQpXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeShuZXdWYWwpKVxuICAgIHJldHVybiBuZXdWYWxcbiAgfSxcblxuICBnZXRMb2NhbChsb2NhbFN0b3JhZ2UsIG5hbWVzcGFjZSwgc3Via2V5KXtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmxvY2FsS2V5KG5hbWVzcGFjZSwgc3Via2V5KSkpXG4gIH0sXG5cbiAgdXBkYXRlQ3VycmVudFN0YXRlKGNhbGxiYWNrKXtcbiAgICBpZighdGhpcy5jYW5QdXNoU3RhdGUoKSl7IHJldHVybiB9XG4gICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoY2FsbGJhY2soaGlzdG9yeS5zdGF0ZSB8fCB7fSksIFwiXCIsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9LFxuXG4gIHB1c2hTdGF0ZShraW5kLCBtZXRhLCB0byl7XG4gICAgaWYodGhpcy5jYW5QdXNoU3RhdGUoKSl7XG4gICAgICBpZih0byAhPT0gd2luZG93LmxvY2F0aW9uLmhyZWYpe1xuICAgICAgICBpZihtZXRhLnR5cGUgPT0gXCJyZWRpcmVjdFwiICYmIG1ldGEuc2Nyb2xsKXtcbiAgICAgICAgICAvLyBJZiB3ZSdyZSByZWRpcmVjdGluZyBzdG9yZSB0aGUgY3VycmVudCBzY3JvbGxZIGZvciB0aGUgY3VycmVudCBoaXN0b3J5IHN0YXRlLlxuICAgICAgICAgIGxldCBjdXJyZW50U3RhdGUgPSBoaXN0b3J5LnN0YXRlIHx8IHt9XG4gICAgICAgICAgY3VycmVudFN0YXRlLnNjcm9sbCA9IG1ldGEuc2Nyb2xsXG4gICAgICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoY3VycmVudFN0YXRlLCBcIlwiLCB3aW5kb3cubG9jYXRpb24uaHJlZilcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSBtZXRhLnNjcm9sbCAvLyBPbmx5IHN0b3JlIHRoZSBzY3JvbGwgaW4gdGhlIHJlZGlyZWN0IGNhc2UuXG4gICAgICAgIGhpc3Rvcnlba2luZCArIFwiU3RhdGVcIl0obWV0YSwgXCJcIiwgdG8gfHwgbnVsbCkgLy8gSUUgd2lsbCBjb2VyY2UgdW5kZWZpbmVkIHRvIHN0cmluZ1xuICAgICAgICBsZXQgaGFzaEVsID0gdGhpcy5nZXRIYXNoVGFyZ2V0RWwod2luZG93LmxvY2F0aW9uLmhhc2gpXG5cbiAgICAgICAgaWYoaGFzaEVsKXtcbiAgICAgICAgICBoYXNoRWwuc2Nyb2xsSW50b1ZpZXcoKVxuICAgICAgICB9IGVsc2UgaWYobWV0YS50eXBlID09PSBcInJlZGlyZWN0XCIpe1xuICAgICAgICAgIHdpbmRvdy5zY3JvbGwoMCwgMClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlZGlyZWN0KHRvKVxuICAgIH1cbiAgfSxcblxuICBzZXRDb29raWUobmFtZSwgdmFsdWUpe1xuICAgIGRvY3VtZW50LmNvb2tpZSA9IGAke25hbWV9PSR7dmFsdWV9YFxuICB9LFxuXG4gIGdldENvb2tpZShuYW1lKXtcbiAgICByZXR1cm4gZG9jdW1lbnQuY29va2llLnJlcGxhY2UobmV3IFJlZ0V4cChgKD86KD86XnwuKjtcXHMqKSR7bmFtZX1cXHMqXFw9XFxzKihbXjtdKikuKiQpfF4uKiRgKSwgXCIkMVwiKVxuICB9LFxuXG4gIHJlZGlyZWN0KHRvVVJMLCBmbGFzaCl7XG4gICAgaWYoZmxhc2gpeyBCcm93c2VyLnNldENvb2tpZShcIl9fcGhvZW5peF9mbGFzaF9fXCIsIGZsYXNoICsgXCI7IG1heC1hZ2U9NjAwMDA7IHBhdGg9L1wiKSB9XG4gICAgd2luZG93LmxvY2F0aW9uID0gdG9VUkxcbiAgfSxcblxuICBsb2NhbEtleShuYW1lc3BhY2UsIHN1YmtleSl7IHJldHVybiBgJHtuYW1lc3BhY2V9LSR7c3Via2V5fWAgfSxcblxuICBnZXRIYXNoVGFyZ2V0RWwobWF5YmVIYXNoKXtcbiAgICBsZXQgaGFzaCA9IG1heWJlSGFzaC50b1N0cmluZygpLnN1YnN0cmluZygxKVxuICAgIGlmKGhhc2ggPT09IFwiXCIpeyByZXR1cm4gfVxuICAgIHJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChoYXNoKSB8fCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBhW25hbWU9XCIke2hhc2h9XCJdYClcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCcm93c2VyXG4iLCAiaW1wb3J0IHtcbiAgQ0hFQ0tBQkxFX0lOUFVUUyxcbiAgREVCT1VOQ0VfUFJFVl9LRVksXG4gIERFQk9VTkNFX1RSSUdHRVIsXG4gIEZPQ1VTQUJMRV9JTlBVVFMsXG4gIFBIWF9DT01QT05FTlQsXG4gIFBIWF9FVkVOVF9DTEFTU0VTLFxuICBQSFhfSEFTX0ZPQ1VTRUQsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfTUFJTixcbiAgUEhYX05PX0ZFRURCQUNLX0NMQVNTLFxuICBQSFhfUEFSRU5UX0lELFxuICBQSFhfUFJJVkFURSxcbiAgUEhYX1JFRixcbiAgUEhYX1JFRl9TUkMsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfU0VTU0lPTixcbiAgUEhYX1NUQVRJQyxcbiAgUEhYX1VQTE9BRF9SRUYsXG4gIFBIWF9WSUVXX1NFTEVDVE9SLFxuICBQSFhfU1RJQ0tZLFxuICBUSFJPVFRMRURcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgbG9nRXJyb3Jcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5sZXQgRE9NID0ge1xuICBieUlkKGlkKXsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSB8fCBsb2dFcnJvcihgbm8gaWQgZm91bmQgZm9yICR7aWR9YCkgfSxcblxuICByZW1vdmVDbGFzcyhlbCwgY2xhc3NOYW1lKXtcbiAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSlcbiAgICBpZihlbC5jbGFzc0xpc3QubGVuZ3RoID09PSAwKXsgZWwucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIikgfVxuICB9LFxuXG4gIGFsbChub2RlLCBxdWVyeSwgY2FsbGJhY2spe1xuICAgIGlmKCFub2RlKXsgcmV0dXJuIFtdIH1cbiAgICBsZXQgYXJyYXkgPSBBcnJheS5mcm9tKG5vZGUucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpXG4gICAgcmV0dXJuIGNhbGxiYWNrID8gYXJyYXkuZm9yRWFjaChjYWxsYmFjaykgOiBhcnJheVxuICB9LFxuXG4gIGNoaWxkTm9kZUxlbmd0aChodG1sKXtcbiAgICBsZXQgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIilcbiAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBodG1sXG4gICAgcmV0dXJuIHRlbXBsYXRlLmNvbnRlbnQuY2hpbGRFbGVtZW50Q291bnRcbiAgfSxcblxuICBpc1VwbG9hZElucHV0KGVsKXsgcmV0dXJuIGVsLnR5cGUgPT09IFwiZmlsZVwiICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRikgIT09IG51bGwgfSxcblxuICBmaW5kVXBsb2FkSW5wdXRzKG5vZGUpeyByZXR1cm4gdGhpcy5hbGwobm9kZSwgYGlucHV0W3R5cGU9XCJmaWxlXCJdWyR7UEhYX1VQTE9BRF9SRUZ9XWApIH0sXG5cbiAgZmluZENvbXBvbmVudE5vZGVMaXN0KG5vZGUsIGNpZCl7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyV2l0aGluU2FtZUxpdmVWaWV3KHRoaXMuYWxsKG5vZGUsIGBbJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXWApLCBub2RlKVxuICB9LFxuXG4gIGlzUGh4RGVzdHJveWVkKG5vZGUpe1xuICAgIHJldHVybiBub2RlLmlkICYmIERPTS5wcml2YXRlKG5vZGUsIFwiZGVzdHJveWVkXCIpID8gdHJ1ZSA6IGZhbHNlXG4gIH0sXG5cbiAgbWFya1BoeENoaWxkRGVzdHJveWVkKGVsKXtcbiAgICBpZih0aGlzLmlzUGh4Q2hpbGQoZWwpKXsgZWwuc2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OLCBcIlwiKSB9XG4gICAgdGhpcy5wdXRQcml2YXRlKGVsLCBcImRlc3Ryb3llZFwiLCB0cnVlKVxuICB9LFxuXG4gIGZpbmRQaHhDaGlsZHJlbkluRnJhZ21lbnQoaHRtbCwgcGFyZW50SWQpe1xuICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGh0bWxcbiAgICByZXR1cm4gdGhpcy5maW5kUGh4Q2hpbGRyZW4odGVtcGxhdGUuY29udGVudCwgcGFyZW50SWQpXG4gIH0sXG5cbiAgaXNJZ25vcmVkKGVsLCBwaHhVcGRhdGUpe1xuICAgIHJldHVybiAoZWwuZ2V0QXR0cmlidXRlKHBoeFVwZGF0ZSkgfHwgZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtdXBkYXRlXCIpKSA9PT0gXCJpZ25vcmVcIlxuICB9LFxuXG4gIGlzUGh4VXBkYXRlKGVsLCBwaHhVcGRhdGUsIHVwZGF0ZVR5cGVzKXtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIHVwZGF0ZVR5cGVzLmluZGV4T2YoZWwuZ2V0QXR0cmlidXRlKHBoeFVwZGF0ZSkpID49IDBcbiAgfSxcblxuICBmaW5kUGh4U3RpY2t5KGVsKXsgcmV0dXJuIHRoaXMuYWxsKGVsLCBgWyR7UEhYX1NUSUNLWX1dYCkgfSxcblxuICBmaW5kUGh4Q2hpbGRyZW4oZWwsIHBhcmVudElkKXtcbiAgICByZXR1cm4gdGhpcy5hbGwoZWwsIGAke1BIWF9WSUVXX1NFTEVDVE9SfVske1BIWF9QQVJFTlRfSUR9PVwiJHtwYXJlbnRJZH1cIl1gKVxuICB9LFxuXG4gIGZpbmRQYXJlbnRDSURzKG5vZGUsIGNpZHMpe1xuICAgIGxldCBpbml0aWFsID0gbmV3IFNldChjaWRzKVxuICAgIHJldHVybiBjaWRzLnJlZHVjZSgoYWNjLCBjaWQpID0+IHtcbiAgICAgIGxldCBzZWxlY3RvciA9IGBbJHtQSFhfQ09NUE9ORU5UfT1cIiR7Y2lkfVwiXSBbJHtQSFhfQ09NUE9ORU5UfV1gXG5cbiAgICAgIHRoaXMuZmlsdGVyV2l0aGluU2FtZUxpdmVWaWV3KHRoaXMuYWxsKG5vZGUsIHNlbGVjdG9yKSwgbm9kZSlcbiAgICAgICAgLm1hcChlbCA9PiBwYXJzZUludChlbC5nZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVCkpKVxuICAgICAgICAuZm9yRWFjaChjaGlsZENJRCA9PiBhY2MuZGVsZXRlKGNoaWxkQ0lEKSlcblxuICAgICAgcmV0dXJuIGFjY1xuICAgIH0sIGluaXRpYWwpXG4gIH0sXG5cbiAgZmlsdGVyV2l0aGluU2FtZUxpdmVWaWV3KG5vZGVzLCBwYXJlbnQpe1xuICAgIGlmKHBhcmVudC5xdWVyeVNlbGVjdG9yKFBIWF9WSUVXX1NFTEVDVE9SKSl7XG4gICAgICByZXR1cm4gbm9kZXMuZmlsdGVyKGVsID0+IHRoaXMud2l0aGluU2FtZUxpdmVWaWV3KGVsLCBwYXJlbnQpKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbm9kZXNcbiAgICB9XG4gIH0sXG5cbiAgd2l0aGluU2FtZUxpdmVWaWV3KG5vZGUsIHBhcmVudCl7XG4gICAgd2hpbGUobm9kZSA9IG5vZGUucGFyZW50Tm9kZSl7XG4gICAgICBpZihub2RlLmlzU2FtZU5vZGUocGFyZW50KSl7IHJldHVybiB0cnVlIH1cbiAgICAgIGlmKG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9TRVNTSU9OKSAhPT0gbnVsbCl7IHJldHVybiBmYWxzZSB9XG4gICAgfVxuICB9LFxuXG4gIHByaXZhdGUoZWwsIGtleSl7IHJldHVybiBlbFtQSFhfUFJJVkFURV0gJiYgZWxbUEhYX1BSSVZBVEVdW2tleV0gfSxcblxuICBkZWxldGVQcml2YXRlKGVsLCBrZXkpeyBlbFtQSFhfUFJJVkFURV0gJiYgZGVsZXRlIChlbFtQSFhfUFJJVkFURV1ba2V5XSkgfSxcblxuICBwdXRQcml2YXRlKGVsLCBrZXksIHZhbHVlKXtcbiAgICBpZighZWxbUEhYX1BSSVZBVEVdKXsgZWxbUEhYX1BSSVZBVEVdID0ge30gfVxuICAgIGVsW1BIWF9QUklWQVRFXVtrZXldID0gdmFsdWVcbiAgfSxcblxuICB1cGRhdGVQcml2YXRlKGVsLCBrZXksIGRlZmF1bHRWYWwsIHVwZGF0ZUZ1bmMpe1xuICAgIGxldCBleGlzdGluZyA9IHRoaXMucHJpdmF0ZShlbCwga2V5KVxuICAgIGlmKGV4aXN0aW5nID09PSB1bmRlZmluZWQpe1xuICAgICAgdGhpcy5wdXRQcml2YXRlKGVsLCBrZXksIHVwZGF0ZUZ1bmMoZGVmYXVsdFZhbCkpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwga2V5LCB1cGRhdGVGdW5jKGV4aXN0aW5nKSlcbiAgICB9XG4gIH0sXG5cbiAgY29weVByaXZhdGVzKHRhcmdldCwgc291cmNlKXtcbiAgICBpZihzb3VyY2VbUEhYX1BSSVZBVEVdKXtcbiAgICAgIHRhcmdldFtQSFhfUFJJVkFURV0gPSBzb3VyY2VbUEhYX1BSSVZBVEVdXG4gICAgfVxuICB9LFxuXG4gIHB1dFRpdGxlKHN0cil7XG4gICAgbGV0IHRpdGxlRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIilcbiAgICBsZXQge3ByZWZpeCwgc3VmZml4fSA9IHRpdGxlRWwuZGF0YXNldFxuICAgIGRvY3VtZW50LnRpdGxlID0gYCR7cHJlZml4IHx8IFwiXCJ9JHtzdHJ9JHtzdWZmaXggfHwgXCJcIn1gXG4gIH0sXG5cbiAgZGVib3VuY2UoZWwsIGV2ZW50LCBwaHhEZWJvdW5jZSwgZGVmYXVsdERlYm91bmNlLCBwaHhUaHJvdHRsZSwgZGVmYXVsdFRocm90dGxlLCBjYWxsYmFjayl7XG4gICAgbGV0IGRlYm91bmNlID0gZWwuZ2V0QXR0cmlidXRlKHBoeERlYm91bmNlKVxuICAgIGxldCB0aHJvdHRsZSA9IGVsLmdldEF0dHJpYnV0ZShwaHhUaHJvdHRsZSlcbiAgICBpZihkZWJvdW5jZSA9PT0gXCJcIil7IGRlYm91bmNlID0gZGVmYXVsdERlYm91bmNlIH1cbiAgICBpZih0aHJvdHRsZSA9PT0gXCJcIil7IHRocm90dGxlID0gZGVmYXVsdFRocm90dGxlIH1cbiAgICBsZXQgdmFsdWUgPSBkZWJvdW5jZSB8fCB0aHJvdHRsZVxuICAgIHN3aXRjaCh2YWx1ZSl7XG4gICAgICBjYXNlIG51bGw6IHJldHVybiBjYWxsYmFjaygpXG5cbiAgICAgIGNhc2UgXCJibHVyXCI6XG4gICAgICAgIGlmKHRoaXMub25jZShlbCwgXCJkZWJvdW5jZS1ibHVyXCIpKXtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiBjYWxsYmFjaygpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsZXQgdGltZW91dCA9IHBhcnNlSW50KHZhbHVlKVxuICAgICAgICBsZXQgdHJpZ2dlciA9ICgpID0+IHRocm90dGxlID8gdGhpcy5kZWxldGVQcml2YXRlKGVsLCBUSFJPVFRMRUQpIDogY2FsbGJhY2soKVxuICAgICAgICBsZXQgY3VycmVudEN5Y2xlID0gdGhpcy5pbmNDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUiwgdHJpZ2dlcilcbiAgICAgICAgaWYoaXNOYU4odGltZW91dCkpeyByZXR1cm4gbG9nRXJyb3IoYGludmFsaWQgdGhyb3R0bGUvZGVib3VuY2UgdmFsdWU6ICR7dmFsdWV9YCkgfVxuICAgICAgICBpZih0aHJvdHRsZSl7XG4gICAgICAgICAgbGV0IG5ld0tleURvd24gPSBmYWxzZVxuICAgICAgICAgIGlmKGV2ZW50LnR5cGUgPT09IFwia2V5ZG93blwiKXtcbiAgICAgICAgICAgIGxldCBwcmV2S2V5ID0gdGhpcy5wcml2YXRlKGVsLCBERUJPVU5DRV9QUkVWX0tFWSlcbiAgICAgICAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwgREVCT1VOQ0VfUFJFVl9LRVksIGV2ZW50LmtleSlcbiAgICAgICAgICAgIG5ld0tleURvd24gPSBwcmV2S2V5ICE9PSBldmVudC5rZXlcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZighbmV3S2V5RG93biAmJiB0aGlzLnByaXZhdGUoZWwsIFRIUk9UVExFRCkpe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKClcbiAgICAgICAgICAgIHRoaXMucHV0UHJpdmF0ZShlbCwgVEhST1RUTEVELCB0cnVlKVxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUiksIHRpbWVvdXQpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50cmlnZ2VyQ3ljbGUoZWwsIERFQk9VTkNFX1RSSUdHRVIsIGN1cnJlbnRDeWNsZSksIHRpbWVvdXQpXG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBmb3JtID0gZWwuZm9ybVxuICAgICAgICBpZihmb3JtICYmIHRoaXMub25jZShmb3JtLCBcImJpbmQtZGVib3VuY2VcIikpe1xuICAgICAgICAgIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCAoKSA9PiB7XG4gICAgICAgICAgICBBcnJheS5mcm9tKChuZXcgRm9ybURhdGEoZm9ybSkpLmVudHJpZXMoKSwgKFtuYW1lXSkgPT4ge1xuICAgICAgICAgICAgICBsZXQgaW5wdXQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3IoYFtuYW1lPVwiJHtuYW1lfVwiXWApXG4gICAgICAgICAgICAgIHRoaXMuaW5jQ3ljbGUoaW5wdXQsIERFQk9VTkNFX1RSSUdHRVIpXG4gICAgICAgICAgICAgIHRoaXMuZGVsZXRlUHJpdmF0ZShpbnB1dCwgVEhST1RUTEVEKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMub25jZShlbCwgXCJiaW5kLWRlYm91bmNlXCIpKXtcbiAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiB0aGlzLnRyaWdnZXJDeWNsZShlbCwgREVCT1VOQ0VfVFJJR0dFUikpXG4gICAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgdHJpZ2dlckN5Y2xlKGVsLCBrZXksIGN1cnJlbnRDeWNsZSl7XG4gICAgbGV0IFtjeWNsZSwgdHJpZ2dlcl0gPSB0aGlzLnByaXZhdGUoZWwsIGtleSlcbiAgICBpZighY3VycmVudEN5Y2xlKXsgY3VycmVudEN5Y2xlID0gY3ljbGUgfVxuICAgIGlmKGN1cnJlbnRDeWNsZSA9PT0gY3ljbGUpe1xuICAgICAgdGhpcy5pbmNDeWNsZShlbCwga2V5KVxuICAgICAgdHJpZ2dlcigpXG4gICAgfVxuICB9LFxuXG4gIG9uY2UoZWwsIGtleSl7XG4gICAgaWYodGhpcy5wcml2YXRlKGVsLCBrZXkpID09PSB0cnVlKXsgcmV0dXJuIGZhbHNlIH1cbiAgICB0aGlzLnB1dFByaXZhdGUoZWwsIGtleSwgdHJ1ZSlcbiAgICByZXR1cm4gdHJ1ZVxuICB9LFxuXG4gIGluY0N5Y2xlKGVsLCBrZXksIHRyaWdnZXIgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgbGV0IFtjdXJyZW50Q3ljbGVdID0gdGhpcy5wcml2YXRlKGVsLCBrZXkpIHx8IFswLCB0cmlnZ2VyXVxuICAgIGN1cnJlbnRDeWNsZSsrXG4gICAgdGhpcy5wdXRQcml2YXRlKGVsLCBrZXksIFtjdXJyZW50Q3ljbGUsIHRyaWdnZXJdKVxuICAgIHJldHVybiBjdXJyZW50Q3ljbGVcbiAgfSxcblxuICBkaXNjYXJkRXJyb3IoY29udGFpbmVyLCBlbCwgcGh4RmVlZGJhY2tGb3Ipe1xuICAgIGxldCBmaWVsZCA9IGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUocGh4RmVlZGJhY2tGb3IpXG4gICAgLy8gVE9ETzogUmVtb3ZlIGlkIGxvb2t1cCBhZnRlciB3ZSB1cGRhdGUgUGhvZW5peCB0byB1c2UgaW5wdXRfbmFtZSBpbnN0ZWFkIG9mIGlucHV0X2lkXG4gICAgbGV0IGlucHV0ID0gZmllbGQgJiYgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYFtpZD1cIiR7ZmllbGR9XCJdLCBbbmFtZT1cIiR7ZmllbGR9XCJdYClcbiAgICBpZighaW5wdXQpeyByZXR1cm4gfVxuXG4gICAgaWYoISh0aGlzLnByaXZhdGUoaW5wdXQsIFBIWF9IQVNfRk9DVVNFRCkgfHwgdGhpcy5wcml2YXRlKGlucHV0LmZvcm0sIFBIWF9IQVNfU1VCTUlUVEVEKSkpe1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZChQSFhfTk9fRkVFREJBQ0tfQ0xBU1MpXG4gICAgfVxuICB9LFxuXG4gIHNob3dFcnJvcihpbnB1dEVsLCBwaHhGZWVkYmFja0Zvcil7XG4gICAgaWYoaW5wdXRFbC5pZCB8fCBpbnB1dEVsLm5hbWUpe1xuICAgICAgdGhpcy5hbGwoaW5wdXRFbC5mb3JtLCBgWyR7cGh4RmVlZGJhY2tGb3J9PVwiJHtpbnB1dEVsLmlkfVwiXSwgWyR7cGh4RmVlZGJhY2tGb3J9PVwiJHtpbnB1dEVsLm5hbWV9XCJdYCwgKGVsKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoZWwsIFBIWF9OT19GRUVEQkFDS19DTEFTUylcbiAgICAgIH0pXG4gICAgfVxuICB9LFxuXG4gIGlzUGh4Q2hpbGQobm9kZSl7XG4gICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9QQVJFTlRfSUQpXG4gIH0sXG5cbiAgaXNQaHhTdGlja3kobm9kZSl7XG4gICAgcmV0dXJuIG5vZGUuZ2V0QXR0cmlidXRlICYmIG5vZGUuZ2V0QXR0cmlidXRlKFBIWF9TVElDS1kpICE9PSBudWxsXG4gIH0sXG5cbiAgZmlyc3RQaHhDaGlsZChlbCl7XG4gICAgcmV0dXJuIHRoaXMuaXNQaHhDaGlsZChlbCkgPyBlbCA6IHRoaXMuYWxsKGVsLCBgWyR7UEhYX1BBUkVOVF9JRH1dYClbMF1cbiAgfSxcblxuICBkaXNwYXRjaEV2ZW50KHRhcmdldCwgZXZlbnRTdHJpbmcsIGRldGFpbCA9IHt9KXtcbiAgICBsZXQgZXZlbnQgPSBuZXcgQ3VzdG9tRXZlbnQoZXZlbnRTdHJpbmcsIHtidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBkZXRhaWw6IGRldGFpbH0pXG4gICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gIH0sXG5cbiAgY2xvbmVOb2RlKG5vZGUsIGh0bWwpe1xuICAgIGlmKHR5cGVvZiAoaHRtbCkgPT09IFwidW5kZWZpbmVkXCIpe1xuICAgICAgcmV0dXJuIG5vZGUuY2xvbmVOb2RlKHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBjbG9uZWQgPSBub2RlLmNsb25lTm9kZShmYWxzZSlcbiAgICAgIGNsb25lZC5pbm5lckhUTUwgPSBodG1sXG4gICAgICByZXR1cm4gY2xvbmVkXG4gICAgfVxuICB9LFxuXG4gIG1lcmdlQXR0cnModGFyZ2V0LCBzb3VyY2UsIG9wdHMgPSB7fSl7XG4gICAgbGV0IGV4Y2x1ZGUgPSBvcHRzLmV4Y2x1ZGUgfHwgW11cbiAgICBsZXQgaXNJZ25vcmVkID0gb3B0cy5pc0lnbm9yZWRcbiAgICBsZXQgc291cmNlQXR0cnMgPSBzb3VyY2UuYXR0cmlidXRlc1xuICAgIGZvcihsZXQgaSA9IHNvdXJjZUF0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXtcbiAgICAgIGxldCBuYW1lID0gc291cmNlQXR0cnNbaV0ubmFtZVxuICAgICAgaWYoZXhjbHVkZS5pbmRleE9mKG5hbWUpIDwgMCl7IHRhcmdldC5zZXRBdHRyaWJ1dGUobmFtZSwgc291cmNlLmdldEF0dHJpYnV0ZShuYW1lKSkgfVxuICAgIH1cblxuICAgIGxldCB0YXJnZXRBdHRycyA9IHRhcmdldC5hdHRyaWJ1dGVzXG4gICAgZm9yKGxldCBpID0gdGFyZ2V0QXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pe1xuICAgICAgbGV0IG5hbWUgPSB0YXJnZXRBdHRyc1tpXS5uYW1lXG4gICAgICBpZihpc0lnbm9yZWQpe1xuICAgICAgICBpZihuYW1lLnN0YXJ0c1dpdGgoXCJkYXRhLVwiKSAmJiAhc291cmNlLmhhc0F0dHJpYnV0ZShuYW1lKSl7IHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUobmFtZSkgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYoIXNvdXJjZS5oYXNBdHRyaWJ1dGUobmFtZSkpeyB0YXJnZXQucmVtb3ZlQXR0cmlidXRlKG5hbWUpIH1cbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgbWVyZ2VGb2N1c2VkSW5wdXQodGFyZ2V0LCBzb3VyY2Upe1xuICAgIC8vIHNraXAgc2VsZWN0cyBiZWNhdXNlIEZGIHdpbGwgcmVzZXQgaGlnaGxpZ2h0ZWQgaW5kZXggZm9yIGFueSBzZXRBdHRyaWJ1dGVcbiAgICBpZighKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50KSl7IERPTS5tZXJnZUF0dHJzKHRhcmdldCwgc291cmNlLCB7ZXhjZXB0OiBbXCJ2YWx1ZVwiXX0pIH1cbiAgICBpZihzb3VyY2UucmVhZE9ubHkpe1xuICAgICAgdGFyZ2V0LnNldEF0dHJpYnV0ZShcInJlYWRvbmx5XCIsIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC5yZW1vdmVBdHRyaWJ1dGUoXCJyZWFkb25seVwiKVxuICAgIH1cbiAgfSxcblxuICBoYXNTZWxlY3Rpb25SYW5nZShlbCl7XG4gICAgcmV0dXJuIGVsLnNldFNlbGVjdGlvblJhbmdlICYmIChlbC50eXBlID09PSBcInRleHRcIiB8fCBlbC50eXBlID09PSBcInRleHRhcmVhXCIpXG4gIH0sXG5cbiAgcmVzdG9yZUZvY3VzKGZvY3VzZWQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpe1xuICAgIGlmKCFET00uaXNUZXh0dWFsSW5wdXQoZm9jdXNlZCkpeyByZXR1cm4gfVxuICAgIGxldCB3YXNGb2N1c2VkID0gZm9jdXNlZC5tYXRjaGVzKFwiOmZvY3VzXCIpXG4gICAgaWYoZm9jdXNlZC5yZWFkT25seSl7IGZvY3VzZWQuYmx1cigpIH1cbiAgICBpZighd2FzRm9jdXNlZCl7IGZvY3VzZWQuZm9jdXMoKSB9XG4gICAgaWYodGhpcy5oYXNTZWxlY3Rpb25SYW5nZShmb2N1c2VkKSl7XG4gICAgICBmb2N1c2VkLnNldFNlbGVjdGlvblJhbmdlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpXG4gICAgfVxuICB9LFxuXG4gIGlzRm9ybUlucHV0KGVsKXsgcmV0dXJuIC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhKSQvaS50ZXN0KGVsLnRhZ05hbWUpICYmIGVsLnR5cGUgIT09IFwiYnV0dG9uXCIgfSxcblxuICBzeW5jQXR0cnNUb1Byb3BzKGVsKXtcbiAgICBpZihlbCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgQ0hFQ0tBQkxFX0lOUFVUUy5pbmRleE9mKGVsLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSkgPj0gMCl7XG4gICAgICBlbC5jaGVja2VkID0gZWwuZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKSAhPT0gbnVsbFxuICAgIH1cbiAgfSxcblxuICBpc1RleHR1YWxJbnB1dChlbCl7IHJldHVybiBGT0NVU0FCTEVfSU5QVVRTLmluZGV4T2YoZWwudHlwZSkgPj0gMCB9LFxuXG4gIGlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChlbCwgcGh4VHJpZ2dlckV4dGVybmFsKXtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShwaHhUcmlnZ2VyRXh0ZXJuYWwpICE9PSBudWxsXG4gIH0sXG5cbiAgc3luY1BlbmRpbmdSZWYoZnJvbUVsLCB0b0VsLCBkaXNhYmxlV2l0aCl7XG4gICAgbGV0IHJlZiA9IGZyb21FbC5nZXRBdHRyaWJ1dGUoUEhYX1JFRilcbiAgICBpZihyZWYgPT09IG51bGwpeyByZXR1cm4gdHJ1ZSB9XG4gICAgbGV0IHJlZlNyYyA9IGZyb21FbC5nZXRBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpXG5cbiAgICBpZihET00uaXNGb3JtSW5wdXQoZnJvbUVsKSB8fCBmcm9tRWwuZ2V0QXR0cmlidXRlKGRpc2FibGVXaXRoKSAhPT0gbnVsbCl7XG4gICAgICBpZihET00uaXNVcGxvYWRJbnB1dChmcm9tRWwpKXsgRE9NLm1lcmdlQXR0cnMoZnJvbUVsLCB0b0VsLCB7aXNJZ25vcmVkOiB0cnVlfSkgfVxuICAgICAgRE9NLnB1dFByaXZhdGUoZnJvbUVsLCBQSFhfUkVGLCB0b0VsKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIFBIWF9FVkVOVF9DTEFTU0VTLmZvckVhY2goY2xhc3NOYW1lID0+IHtcbiAgICAgICAgZnJvbUVsLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpICYmIHRvRWwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpXG4gICAgICB9KVxuICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoUEhYX1JFRiwgcmVmKVxuICAgICAgdG9FbC5zZXRBdHRyaWJ1dGUoUEhYX1JFRl9TUkMsIHJlZlNyYylcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9LFxuXG4gIGNsZWFuQ2hpbGROb2Rlcyhjb250YWluZXIsIHBoeFVwZGF0ZSl7XG4gICAgaWYoRE9NLmlzUGh4VXBkYXRlKGNvbnRhaW5lciwgcGh4VXBkYXRlLCBbXCJhcHBlbmRcIiwgXCJwcmVwZW5kXCJdKSl7XG4gICAgICBsZXQgdG9SZW1vdmUgPSBbXVxuICAgICAgY29udGFpbmVyLmNoaWxkTm9kZXMuZm9yRWFjaChjaGlsZE5vZGUgPT4ge1xuICAgICAgICBpZighY2hpbGROb2RlLmlkKXtcbiAgICAgICAgICAvLyBTa2lwIHdhcm5pbmcgaWYgaXQncyBhbiBlbXB0eSB0ZXh0IG5vZGUgKGUuZy4gYSBuZXctbGluZSlcbiAgICAgICAgICBsZXQgaXNFbXB0eVRleHROb2RlID0gY2hpbGROb2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZE5vZGUubm9kZVZhbHVlLnRyaW0oKSA9PT0gXCJcIlxuICAgICAgICAgIGlmKCFpc0VtcHR5VGV4dE5vZGUpe1xuICAgICAgICAgICAgbG9nRXJyb3IoXCJvbmx5IEhUTUwgZWxlbWVudCB0YWdzIHdpdGggYW4gaWQgYXJlIGFsbG93ZWQgaW5zaWRlIGNvbnRhaW5lcnMgd2l0aCBwaHgtdXBkYXRlLlxcblxcblwiICtcbiAgICAgICAgICAgICAgYHJlbW92aW5nIGlsbGVnYWwgbm9kZTogXCIkeyhjaGlsZE5vZGUub3V0ZXJIVE1MIHx8IGNoaWxkTm9kZS5ub2RlVmFsdWUpLnRyaW0oKX1cIlxcblxcbmApXG4gICAgICAgICAgfVxuICAgICAgICAgIHRvUmVtb3ZlLnB1c2goY2hpbGROb2RlKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgdG9SZW1vdmUuZm9yRWFjaChjaGlsZE5vZGUgPT4gY2hpbGROb2RlLnJlbW92ZSgpKVxuICAgIH1cbiAgfSxcblxuICByZXBsYWNlUm9vdENvbnRhaW5lcihjb250YWluZXIsIHRhZ05hbWUsIGF0dHJzKXtcbiAgICBsZXQgcmV0YWluZWRBdHRycyA9IG5ldyBTZXQoW1wiaWRcIiwgUEhYX1NFU1NJT04sIFBIWF9TVEFUSUMsIFBIWF9NQUlOLCBQSFhfUk9PVF9JRF0pXG4gICAgaWYoY29udGFpbmVyLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGFnTmFtZS50b0xvd2VyQ2FzZSgpKXtcbiAgICAgIEFycmF5LmZyb20oY29udGFpbmVyLmF0dHJpYnV0ZXMpXG4gICAgICAgIC5maWx0ZXIoYXR0ciA9PiAhcmV0YWluZWRBdHRycy5oYXMoYXR0ci5uYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAuZm9yRWFjaChhdHRyID0+IGNvbnRhaW5lci5yZW1vdmVBdHRyaWJ1dGUoYXR0ci5uYW1lKSlcblxuICAgICAgT2JqZWN0LmtleXMoYXR0cnMpXG4gICAgICAgIC5maWx0ZXIobmFtZSA9PiAhcmV0YWluZWRBdHRycy5oYXMobmFtZS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgLmZvckVhY2goYXR0ciA9PiBjb250YWluZXIuc2V0QXR0cmlidXRlKGF0dHIsIGF0dHJzW2F0dHJdKSlcblxuICAgICAgcmV0dXJuIGNvbnRhaW5lclxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZXdDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpXG4gICAgICBPYmplY3Qua2V5cyhhdHRycykuZm9yRWFjaChhdHRyID0+IG5ld0NvbnRhaW5lci5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cnNbYXR0cl0pKVxuICAgICAgcmV0YWluZWRBdHRycy5mb3JFYWNoKGF0dHIgPT4gbmV3Q29udGFpbmVyLnNldEF0dHJpYnV0ZShhdHRyLCBjb250YWluZXIuZ2V0QXR0cmlidXRlKGF0dHIpKSlcbiAgICAgIG5ld0NvbnRhaW5lci5pbm5lckhUTUwgPSBjb250YWluZXIuaW5uZXJIVE1MXG4gICAgICBjb250YWluZXIucmVwbGFjZVdpdGgobmV3Q29udGFpbmVyKVxuICAgICAgcmV0dXJuIG5ld0NvbnRhaW5lclxuICAgIH1cbiAgfSxcblxuICBnZXRTdGlja3koZWwsIG5hbWUsIGRlZmF1bHRWYWwpe1xuICAgIGxldCBvcCA9IChET00ucHJpdmF0ZShlbCwgXCJzdGlja3lcIikgfHwgW10pLmZpbmQoKFtleGlzdGluZ05hbWUsIF0pID0+IG5hbWUgPT09IGV4aXN0aW5nTmFtZSlcbiAgICBpZihvcCl7XG4gICAgICBsZXQgW19uYW1lLCBfb3AsIHN0YXNoZWRSZXN1bHRdID0gb3BcbiAgICAgIHJldHVybiBzdGFzaGVkUmVzdWx0XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0eXBlb2YoZGVmYXVsdFZhbCkgPT09IFwiZnVuY3Rpb25cIiA/IGRlZmF1bHRWYWwoKSA6IGRlZmF1bHRWYWxcbiAgICB9XG4gIH0sXG5cbiAgZGVsZXRlU3RpY2t5KGVsLCBuYW1lKXtcbiAgICB0aGlzLnVwZGF0ZVByaXZhdGUoZWwsIFwic3RpY2t5XCIsIFtdLCBvcHMgPT4ge1xuICAgICAgcmV0dXJuIG9wcy5maWx0ZXIoKFtleGlzdGluZ05hbWUsIF9dKSA9PiBleGlzdGluZ05hbWUgIT09IG5hbWUpXG4gICAgfSlcbiAgfSxcblxuICBwdXRTdGlja3koZWwsIG5hbWUsIG9wKXtcbiAgICBsZXQgc3Rhc2hlZFJlc3VsdCA9IG9wKGVsKVxuICAgIHRoaXMudXBkYXRlUHJpdmF0ZShlbCwgXCJzdGlja3lcIiwgW10sIG9wcyA9PiB7XG4gICAgICBsZXQgZXhpc3RpbmdJbmRleCA9IG9wcy5maW5kSW5kZXgoKFtleGlzdGluZ05hbWUsIF0pID0+IG5hbWUgPT09IGV4aXN0aW5nTmFtZSlcbiAgICAgIGlmKGV4aXN0aW5nSW5kZXggPj0gMCl7XG4gICAgICAgIG9wc1tleGlzdGluZ0luZGV4XSA9IFtuYW1lLCBvcCwgc3Rhc2hlZFJlc3VsdF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wcy5wdXNoKFtuYW1lLCBvcCwgc3Rhc2hlZFJlc3VsdF0pXG4gICAgICB9XG4gICAgICByZXR1cm4gb3BzXG4gICAgfSlcbiAgfSxcblxuICBhcHBseVN0aWNreU9wZXJhdGlvbnMoZWwpe1xuICAgIGxldCBvcHMgPSBET00ucHJpdmF0ZShlbCwgXCJzdGlja3lcIilcbiAgICBpZighb3BzKXsgcmV0dXJuIH1cblxuICAgIG9wcy5mb3JFYWNoKChbbmFtZSwgb3AsIF9zdGFzaGVkXSkgPT4gdGhpcy5wdXRTdGlja3koZWwsIG5hbWUsIG9wKSlcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBET01cbiIsICJpbXBvcnQge1xuICBQSFhfQUNUSVZFX0VOVFJZX1JFRlMsXG4gIFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCxcbiAgUEhYX1BSRUZMSUdIVEVEX1JFRlNcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCJcblxuaW1wb3J0IHtcbiAgY2hhbm5lbFVwbG9hZGVyLFxuICBsb2dFcnJvclxufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFVwbG9hZEVudHJ5IHtcbiAgc3RhdGljIGlzQWN0aXZlKGZpbGVFbCwgZmlsZSl7XG4gICAgbGV0IGlzTmV3ID0gZmlsZS5fcGh4UmVmID09PSB1bmRlZmluZWRcbiAgICBsZXQgYWN0aXZlUmVmcyA9IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX0FDVElWRV9FTlRSWV9SRUZTKS5zcGxpdChcIixcIilcbiAgICBsZXQgaXNBY3RpdmUgPSBhY3RpdmVSZWZzLmluZGV4T2YoTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSkpID49IDBcbiAgICByZXR1cm4gZmlsZS5zaXplID4gMCAmJiAoaXNOZXcgfHwgaXNBY3RpdmUpXG4gIH1cblxuICBzdGF0aWMgaXNQcmVmbGlnaHRlZChmaWxlRWwsIGZpbGUpe1xuICAgIGxldCBwcmVmbGlnaHRlZFJlZnMgPSBmaWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKS5zcGxpdChcIixcIilcbiAgICBsZXQgaXNQcmVmbGlnaHRlZCA9IHByZWZsaWdodGVkUmVmcy5pbmRleE9mKExpdmVVcGxvYWRlci5nZW5GaWxlUmVmKGZpbGUpKSA+PSAwXG4gICAgcmV0dXJuIGlzUHJlZmxpZ2h0ZWQgJiYgdGhpcy5pc0FjdGl2ZShmaWxlRWwsIGZpbGUpXG4gIH1cblxuICBjb25zdHJ1Y3RvcihmaWxlRWwsIGZpbGUsIHZpZXcpe1xuICAgIHRoaXMucmVmID0gTGl2ZVVwbG9hZGVyLmdlbkZpbGVSZWYoZmlsZSlcbiAgICB0aGlzLmZpbGVFbCA9IGZpbGVFbFxuICAgIHRoaXMuZmlsZSA9IGZpbGVcbiAgICB0aGlzLnZpZXcgPSB2aWV3XG4gICAgdGhpcy5tZXRhID0gbnVsbFxuICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2VcbiAgICB0aGlzLl9pc0RvbmUgPSBmYWxzZVxuICAgIHRoaXMuX3Byb2dyZXNzID0gMFxuICAgIHRoaXMuX2xhc3RQcm9ncmVzc1NlbnQgPSAtMVxuICAgIHRoaXMuX29uRG9uZSA9IGZ1bmN0aW9uICgpeyB9XG4gICAgdGhpcy5fb25FbFVwZGF0ZWQgPSB0aGlzLm9uRWxVcGRhdGVkLmJpbmQodGhpcylcbiAgICB0aGlzLmZpbGVFbC5hZGRFdmVudExpc3RlbmVyKFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCwgdGhpcy5fb25FbFVwZGF0ZWQpXG4gIH1cblxuICBtZXRhZGF0YSgpeyByZXR1cm4gdGhpcy5tZXRhIH1cblxuICBwcm9ncmVzcyhwcm9ncmVzcyl7XG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSBNYXRoLmZsb29yKHByb2dyZXNzKVxuICAgIGlmKHRoaXMuX3Byb2dyZXNzID4gdGhpcy5fbGFzdFByb2dyZXNzU2VudCl7XG4gICAgICBpZih0aGlzLl9wcm9ncmVzcyA+PSAxMDApe1xuICAgICAgICB0aGlzLl9wcm9ncmVzcyA9IDEwMFxuICAgICAgICB0aGlzLl9sYXN0UHJvZ3Jlc3NTZW50ID0gMTAwXG4gICAgICAgIHRoaXMuX2lzRG9uZSA9IHRydWVcbiAgICAgICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCAxMDAsICgpID0+IHtcbiAgICAgICAgICBMaXZlVXBsb2FkZXIudW50cmFja0ZpbGUodGhpcy5maWxlRWwsIHRoaXMuZmlsZSlcbiAgICAgICAgICB0aGlzLl9vbkRvbmUoKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fbGFzdFByb2dyZXNzU2VudCA9IHRoaXMuX3Byb2dyZXNzXG4gICAgICAgIHRoaXMudmlldy5wdXNoRmlsZVByb2dyZXNzKHRoaXMuZmlsZUVsLCB0aGlzLnJlZiwgdGhpcy5fcHJvZ3Jlc3MpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2FuY2VsKCl7XG4gICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlXG4gICAgdGhpcy5faXNEb25lID0gdHJ1ZVxuICAgIHRoaXMuX29uRG9uZSgpXG4gIH1cblxuICBpc0RvbmUoKXsgcmV0dXJuIHRoaXMuX2lzRG9uZSB9XG5cbiAgZXJyb3IocmVhc29uID0gXCJmYWlsZWRcIil7XG4gICAgdGhpcy52aWV3LnB1c2hGaWxlUHJvZ3Jlc3ModGhpcy5maWxlRWwsIHRoaXMucmVmLCB7ZXJyb3I6IHJlYXNvbn0pXG4gICAgTGl2ZVVwbG9hZGVyLmNsZWFyRmlsZXModGhpcy5maWxlRWwpXG4gIH1cblxuICAvL3ByaXZhdGVcblxuICBvbkRvbmUoY2FsbGJhY2spe1xuICAgIHRoaXMuX29uRG9uZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuZmlsZUVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoUEhYX0xJVkVfRklMRV9VUERBVEVELCB0aGlzLl9vbkVsVXBkYXRlZClcbiAgICAgIGNhbGxiYWNrKClcbiAgICB9XG4gIH1cblxuICBvbkVsVXBkYXRlZCgpe1xuICAgIGxldCBhY3RpdmVSZWZzID0gdGhpcy5maWxlRWwuZ2V0QXR0cmlidXRlKFBIWF9BQ1RJVkVfRU5UUllfUkVGUykuc3BsaXQoXCIsXCIpXG4gICAgaWYoYWN0aXZlUmVmcy5pbmRleE9mKHRoaXMucmVmKSA9PT0gLTEpeyB0aGlzLmNhbmNlbCgpIH1cbiAgfVxuXG4gIHRvUHJlZmxpZ2h0UGF5bG9hZCgpe1xuICAgIHJldHVybiB7XG4gICAgICBsYXN0X21vZGlmaWVkOiB0aGlzLmZpbGUubGFzdE1vZGlmaWVkLFxuICAgICAgbmFtZTogdGhpcy5maWxlLm5hbWUsXG4gICAgICBzaXplOiB0aGlzLmZpbGUuc2l6ZSxcbiAgICAgIHR5cGU6IHRoaXMuZmlsZS50eXBlLFxuICAgICAgcmVmOiB0aGlzLnJlZlxuICAgIH1cbiAgfVxuXG4gIHVwbG9hZGVyKHVwbG9hZGVycyl7XG4gICAgaWYodGhpcy5tZXRhLnVwbG9hZGVyKXtcbiAgICAgIGxldCBjYWxsYmFjayA9IHVwbG9hZGVyc1t0aGlzLm1ldGEudXBsb2FkZXJdIHx8IGxvZ0Vycm9yKGBubyB1cGxvYWRlciBjb25maWd1cmVkIGZvciAke3RoaXMubWV0YS51cGxvYWRlcn1gKVxuICAgICAgcmV0dXJuIHtuYW1lOiB0aGlzLm1ldGEudXBsb2FkZXIsIGNhbGxiYWNrOiBjYWxsYmFja31cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtuYW1lOiBcImNoYW5uZWxcIiwgY2FsbGJhY2s6IGNoYW5uZWxVcGxvYWRlcn1cbiAgICB9XG4gIH1cblxuICB6aXBQb3N0RmxpZ2h0KHJlc3Ape1xuICAgIHRoaXMubWV0YSA9IHJlc3AuZW50cmllc1t0aGlzLnJlZl1cbiAgICBpZighdGhpcy5tZXRhKXsgbG9nRXJyb3IoYG5vIHByZWZsaWdodCB1cGxvYWQgcmVzcG9uc2UgcmV0dXJuZWQgd2l0aCByZWYgJHt0aGlzLnJlZn1gLCB7aW5wdXQ6IHRoaXMuZmlsZUVsLCByZXNwb25zZTogcmVzcH0pIH1cbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIFBIWF9ET05FX1JFRlMsXG4gIFBIWF9QUkVGTElHSFRFRF9SRUZTLFxuICBQSFhfVVBMT0FEX1JFRlxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xufSBmcm9tIFwiLi91dGlsc1wiXG5cbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcbmltcG9ydCBVcGxvYWRFbnRyeSBmcm9tIFwiLi91cGxvYWRfZW50cnlcIlxuXG5sZXQgbGl2ZVVwbG9hZGVyRmlsZVJlZiA9IDBcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGl2ZVVwbG9hZGVyIHtcbiAgc3RhdGljIGdlbkZpbGVSZWYoZmlsZSl7XG4gICAgbGV0IHJlZiA9IGZpbGUuX3BoeFJlZlxuICAgIGlmKHJlZiAhPT0gdW5kZWZpbmVkKXtcbiAgICAgIHJldHVybiByZWZcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZS5fcGh4UmVmID0gKGxpdmVVcGxvYWRlckZpbGVSZWYrKykudG9TdHJpbmcoKVxuICAgICAgcmV0dXJuIGZpbGUuX3BoeFJlZlxuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBnZXRFbnRyeURhdGFVUkwoaW5wdXRFbCwgcmVmLCBjYWxsYmFjayl7XG4gICAgbGV0IGZpbGUgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpLmZpbmQoZmlsZSA9PiB0aGlzLmdlbkZpbGVSZWYoZmlsZSkgPT09IHJlZilcbiAgICBjYWxsYmFjayhVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpKVxuICB9XG5cbiAgc3RhdGljIGhhc1VwbG9hZHNJblByb2dyZXNzKGZvcm1FbCl7XG4gICAgbGV0IGFjdGl2ZSA9IDBcbiAgICBET00uZmluZFVwbG9hZElucHV0cyhmb3JtRWwpLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgaWYoaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSAhPT0gaW5wdXQuZ2V0QXR0cmlidXRlKFBIWF9ET05FX1JFRlMpKXtcbiAgICAgICAgYWN0aXZlKytcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBhY3RpdmUgPiAwXG4gIH1cblxuICBzdGF0aWMgc2VyaWFsaXplVXBsb2FkcyhpbnB1dEVsKXtcbiAgICBsZXQgZmlsZXMgPSB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0RWwpXG4gICAgbGV0IGZpbGVEYXRhID0ge31cbiAgICBmaWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgbGV0IGVudHJ5ID0ge3BhdGg6IGlucHV0RWwubmFtZX1cbiAgICAgIGxldCB1cGxvYWRSZWYgPSBpbnB1dEVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRilcbiAgICAgIGZpbGVEYXRhW3VwbG9hZFJlZl0gPSBmaWxlRGF0YVt1cGxvYWRSZWZdIHx8IFtdXG4gICAgICBlbnRyeS5yZWYgPSB0aGlzLmdlbkZpbGVSZWYoZmlsZSlcbiAgICAgIGVudHJ5Lm5hbWUgPSBmaWxlLm5hbWUgfHwgZW50cnkucmVmXG4gICAgICBlbnRyeS50eXBlID0gZmlsZS50eXBlXG4gICAgICBlbnRyeS5zaXplID0gZmlsZS5zaXplXG4gICAgICBmaWxlRGF0YVt1cGxvYWRSZWZdLnB1c2goZW50cnkpXG4gICAgfSlcbiAgICByZXR1cm4gZmlsZURhdGFcbiAgfVxuXG4gIHN0YXRpYyBjbGVhckZpbGVzKGlucHV0RWwpe1xuICAgIGlucHV0RWwudmFsdWUgPSBudWxsXG4gICAgaW5wdXRFbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpXG4gICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBbXSlcbiAgfVxuXG4gIHN0YXRpYyB1bnRyYWNrRmlsZShpbnB1dEVsLCBmaWxlKXtcbiAgICBET00ucHV0UHJpdmF0ZShpbnB1dEVsLCBcImZpbGVzXCIsIERPTS5wcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIikuZmlsdGVyKGYgPT4gIU9iamVjdC5pcyhmLCBmaWxlKSkpXG4gIH1cblxuICBzdGF0aWMgdHJhY2tGaWxlcyhpbnB1dEVsLCBmaWxlcyl7XG4gICAgaWYoaW5wdXRFbC5nZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSAhPT0gbnVsbCl7XG4gICAgICBsZXQgbmV3RmlsZXMgPSBmaWxlcy5maWx0ZXIoZmlsZSA9PiAhdGhpcy5hY3RpdmVGaWxlcyhpbnB1dEVsKS5maW5kKGYgPT4gT2JqZWN0LmlzKGYsIGZpbGUpKSlcbiAgICAgIERPTS5wdXRQcml2YXRlKGlucHV0RWwsIFwiZmlsZXNcIiwgdGhpcy5hY3RpdmVGaWxlcyhpbnB1dEVsKS5jb25jYXQobmV3RmlsZXMpKVxuICAgICAgaW5wdXRFbC52YWx1ZSA9IG51bGxcbiAgICB9IGVsc2Uge1xuICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXRFbCwgXCJmaWxlc1wiLCBmaWxlcylcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYWN0aXZlRmlsZUlucHV0cyhmb3JtRWwpe1xuICAgIGxldCBmaWxlSW5wdXRzID0gRE9NLmZpbmRVcGxvYWRJbnB1dHMoZm9ybUVsKVxuICAgIHJldHVybiBBcnJheS5mcm9tKGZpbGVJbnB1dHMpLmZpbHRlcihlbCA9PiBlbC5maWxlcyAmJiB0aGlzLmFjdGl2ZUZpbGVzKGVsKS5sZW5ndGggPiAwKVxuICB9XG5cbiAgc3RhdGljIGFjdGl2ZUZpbGVzKGlucHV0KXtcbiAgICByZXR1cm4gKERPTS5wcml2YXRlKGlucHV0LCBcImZpbGVzXCIpIHx8IFtdKS5maWx0ZXIoZiA9PiBVcGxvYWRFbnRyeS5pc0FjdGl2ZShpbnB1dCwgZikpXG4gIH1cblxuICBzdGF0aWMgaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKXtcbiAgICBsZXQgZmlsZUlucHV0cyA9IERPTS5maW5kVXBsb2FkSW5wdXRzKGZvcm1FbClcbiAgICByZXR1cm4gQXJyYXkuZnJvbShmaWxlSW5wdXRzKS5maWx0ZXIoaW5wdXQgPT4gdGhpcy5maWxlc0F3YWl0aW5nUHJlZmxpZ2h0KGlucHV0KS5sZW5ndGggPiAwKVxuICB9XG5cbiAgc3RhdGljIGZpbGVzQXdhaXRpbmdQcmVmbGlnaHQoaW5wdXQpe1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZUZpbGVzKGlucHV0KS5maWx0ZXIoZiA9PiAhVXBsb2FkRW50cnkuaXNQcmVmbGlnaHRlZChpbnB1dCwgZikpXG4gIH1cblxuICBjb25zdHJ1Y3RvcihpbnB1dEVsLCB2aWV3LCBvbkNvbXBsZXRlKXtcbiAgICB0aGlzLnZpZXcgPSB2aWV3XG4gICAgdGhpcy5vbkNvbXBsZXRlID0gb25Db21wbGV0ZVxuICAgIHRoaXMuX2VudHJpZXMgPVxuICAgICAgQXJyYXkuZnJvbShMaXZlVXBsb2FkZXIuZmlsZXNBd2FpdGluZ1ByZWZsaWdodChpbnB1dEVsKSB8fCBbXSlcbiAgICAgICAgLm1hcChmaWxlID0+IG5ldyBVcGxvYWRFbnRyeShpbnB1dEVsLCBmaWxlLCB2aWV3KSlcblxuICAgIHRoaXMubnVtRW50cmllc0luUHJvZ3Jlc3MgPSB0aGlzLl9lbnRyaWVzLmxlbmd0aFxuICB9XG5cbiAgZW50cmllcygpeyByZXR1cm4gdGhpcy5fZW50cmllcyB9XG5cbiAgaW5pdEFkYXB0ZXJVcGxvYWQocmVzcCwgb25FcnJvciwgbGl2ZVNvY2tldCl7XG4gICAgdGhpcy5fZW50cmllcyA9XG4gICAgICB0aGlzLl9lbnRyaWVzLm1hcChlbnRyeSA9PiB7XG4gICAgICAgIGVudHJ5LnppcFBvc3RGbGlnaHQocmVzcClcbiAgICAgICAgZW50cnkub25Eb25lKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm51bUVudHJpZXNJblByb2dyZXNzLS1cbiAgICAgICAgICBpZih0aGlzLm51bUVudHJpZXNJblByb2dyZXNzID09PSAwKXsgdGhpcy5vbkNvbXBsZXRlKCkgfVxuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZW50cnlcbiAgICAgIH0pXG5cbiAgICBsZXQgZ3JvdXBlZEVudHJpZXMgPSB0aGlzLl9lbnRyaWVzLnJlZHVjZSgoYWNjLCBlbnRyeSkgPT4ge1xuICAgICAgbGV0IHtuYW1lLCBjYWxsYmFja30gPSBlbnRyeS51cGxvYWRlcihsaXZlU29ja2V0LnVwbG9hZGVycylcbiAgICAgIGFjY1tuYW1lXSA9IGFjY1tuYW1lXSB8fCB7Y2FsbGJhY2s6IGNhbGxiYWNrLCBlbnRyaWVzOiBbXX1cbiAgICAgIGFjY1tuYW1lXS5lbnRyaWVzLnB1c2goZW50cnkpXG4gICAgICByZXR1cm4gYWNjXG4gICAgfSwge30pXG5cbiAgICBmb3IobGV0IG5hbWUgaW4gZ3JvdXBlZEVudHJpZXMpe1xuICAgICAgbGV0IHtjYWxsYmFjaywgZW50cmllc30gPSBncm91cGVkRW50cmllc1tuYW1lXVxuICAgICAgY2FsbGJhY2soZW50cmllcywgb25FcnJvciwgcmVzcCwgbGl2ZVNvY2tldClcbiAgICB9XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBQSFhfQUNUSVZFX0VOVFJZX1JFRlMsXG4gIFBIWF9MSVZFX0ZJTEVfVVBEQVRFRCxcbiAgUEhYX1BSRUZMSUdIVEVEX1JFRlMsXG4gIFBIWF9VUExPQURfUkVGXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCBMaXZlVXBsb2FkZXIgZnJvbSBcIi4vbGl2ZV91cGxvYWRlclwiXG5cbmxldCBIb29rcyA9IHtcbiAgTGl2ZUZpbGVVcGxvYWQ6IHtcbiAgICBhY3RpdmVSZWZzKCl7IHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfQUNUSVZFX0VOVFJZX1JFRlMpIH0sXG5cbiAgICBwcmVmbGlnaHRlZFJlZnMoKXsgcmV0dXJuIHRoaXMuZWwuZ2V0QXR0cmlidXRlKFBIWF9QUkVGTElHSFRFRF9SRUZTKSB9LFxuXG4gICAgbW91bnRlZCgpeyB0aGlzLnByZWZsaWdodGVkV2FzID0gdGhpcy5wcmVmbGlnaHRlZFJlZnMoKSB9LFxuXG4gICAgdXBkYXRlZCgpe1xuICAgICAgbGV0IG5ld1ByZWZsaWdodHMgPSB0aGlzLnByZWZsaWdodGVkUmVmcygpXG4gICAgICBpZih0aGlzLnByZWZsaWdodGVkV2FzICE9PSBuZXdQcmVmbGlnaHRzKXtcbiAgICAgICAgdGhpcy5wcmVmbGlnaHRlZFdhcyA9IG5ld1ByZWZsaWdodHNcbiAgICAgICAgaWYobmV3UHJlZmxpZ2h0cyA9PT0gXCJcIil7XG4gICAgICAgICAgdGhpcy5fX3ZpZXcuY2FuY2VsU3VibWl0KHRoaXMuZWwuZm9ybSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZih0aGlzLmFjdGl2ZVJlZnMoKSA9PT0gXCJcIil7IHRoaXMuZWwudmFsdWUgPSBudWxsIH1cbiAgICAgIHRoaXMuZWwuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoUEhYX0xJVkVfRklMRV9VUERBVEVEKSlcbiAgICB9XG4gIH0sXG5cbiAgTGl2ZUltZ1ByZXZpZXc6IHtcbiAgICBtb3VudGVkKCl7XG4gICAgICB0aGlzLnJlZiA9IHRoaXMuZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1waHgtZW50cnktcmVmXCIpXG4gICAgICB0aGlzLmlucHV0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfVVBMT0FEX1JFRikpXG4gICAgICBMaXZlVXBsb2FkZXIuZ2V0RW50cnlEYXRhVVJMKHRoaXMuaW5wdXRFbCwgdGhpcy5yZWYsIHVybCA9PiB7XG4gICAgICAgIHRoaXMudXJsID0gdXJsXG4gICAgICAgIHRoaXMuZWwuc3JjID0gdXJsXG4gICAgICB9KVxuICAgIH0sXG4gICAgZGVzdHJveWVkKCl7XG4gICAgICBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMudXJsKVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBIb29rc1xuIiwgImltcG9ydCB7XG4gIG1heWJlXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01Qb3N0TW9ycGhSZXN0b3JlciB7XG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lckJlZm9yZSwgY29udGFpbmVyQWZ0ZXIsIHVwZGF0ZVR5cGUpe1xuICAgIGxldCBpZHNCZWZvcmUgPSBuZXcgU2V0KClcbiAgICBsZXQgaWRzQWZ0ZXIgPSBuZXcgU2V0KFsuLi5jb250YWluZXJBZnRlci5jaGlsZHJlbl0ubWFwKGNoaWxkID0+IGNoaWxkLmlkKSlcblxuICAgIGxldCBlbGVtZW50c1RvTW9kaWZ5ID0gW11cblxuICAgIEFycmF5LmZyb20oY29udGFpbmVyQmVmb3JlLmNoaWxkcmVuKS5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGlmKGNoaWxkLmlkKXsgLy8gYWxsIG9mIG91ciBjaGlsZHJlbiBzaG91bGQgYmUgZWxlbWVudHMgd2l0aCBpZHNcbiAgICAgICAgaWRzQmVmb3JlLmFkZChjaGlsZC5pZClcbiAgICAgICAgaWYoaWRzQWZ0ZXIuaGFzKGNoaWxkLmlkKSl7XG4gICAgICAgICAgbGV0IHByZXZpb3VzRWxlbWVudElkID0gY2hpbGQucHJldmlvdXNFbGVtZW50U2libGluZyAmJiBjaGlsZC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLmlkXG4gICAgICAgICAgZWxlbWVudHNUb01vZGlmeS5wdXNoKHtlbGVtZW50SWQ6IGNoaWxkLmlkLCBwcmV2aW91c0VsZW1lbnRJZDogcHJldmlvdXNFbGVtZW50SWR9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuY29udGFpbmVySWQgPSBjb250YWluZXJBZnRlci5pZFxuICAgIHRoaXMudXBkYXRlVHlwZSA9IHVwZGF0ZVR5cGVcbiAgICB0aGlzLmVsZW1lbnRzVG9Nb2RpZnkgPSBlbGVtZW50c1RvTW9kaWZ5XG4gICAgdGhpcy5lbGVtZW50SWRzVG9BZGQgPSBbLi4uaWRzQWZ0ZXJdLmZpbHRlcihpZCA9PiAhaWRzQmVmb3JlLmhhcyhpZCkpXG4gIH1cblxuICAvLyBXZSBkbyB0aGUgZm9sbG93aW5nIHRvIG9wdGltaXplIGFwcGVuZC9wcmVwZW5kIG9wZXJhdGlvbnM6XG4gIC8vICAgMSkgVHJhY2sgaWRzIG9mIG1vZGlmaWVkIGVsZW1lbnRzICYgb2YgbmV3IGVsZW1lbnRzXG4gIC8vICAgMikgQWxsIHRoZSBtb2RpZmllZCBlbGVtZW50cyBhcmUgcHV0IGJhY2sgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24gaW4gdGhlIERPTSB0cmVlXG4gIC8vICAgICAgYnkgc3RvcmluZyB0aGUgaWQgb2YgdGhlaXIgcHJldmlvdXMgc2libGluZ1xuICAvLyAgIDMpIE5ldyBlbGVtZW50cyBhcmUgZ29pbmcgdG8gYmUgcHV0IGluIHRoZSByaWdodCBwbGFjZSBieSBtb3JwaGRvbSBkdXJpbmcgYXBwZW5kLlxuICAvLyAgICAgIEZvciBwcmVwZW5kLCB3ZSBtb3ZlIHRoZW0gdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBjb250YWluZXJcbiAgcGVyZm9ybSgpe1xuICAgIGxldCBjb250YWluZXIgPSBET00uYnlJZCh0aGlzLmNvbnRhaW5lcklkKVxuICAgIHRoaXMuZWxlbWVudHNUb01vZGlmeS5mb3JFYWNoKGVsZW1lbnRUb01vZGlmeSA9PiB7XG4gICAgICBpZihlbGVtZW50VG9Nb2RpZnkucHJldmlvdXNFbGVtZW50SWQpe1xuICAgICAgICBtYXliZShkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtZW50VG9Nb2RpZnkucHJldmlvdXNFbGVtZW50SWQpLCBwcmV2aW91c0VsZW0gPT4ge1xuICAgICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCBlbGVtID0+IHtcbiAgICAgICAgICAgIGxldCBpc0luUmlnaHRQbGFjZSA9IGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZyAmJiBlbGVtLnByZXZpb3VzRWxlbWVudFNpYmxpbmcuaWQgPT0gcHJldmlvdXNFbGVtLmlkXG4gICAgICAgICAgICBpZighaXNJblJpZ2h0UGxhY2Upe1xuICAgICAgICAgICAgICBwcmV2aW91c0VsZW0uaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJlbmRcIiwgZWxlbSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgY29udGFpbmVyXG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRUb01vZGlmeS5lbGVtZW50SWQpLCBlbGVtID0+IHtcbiAgICAgICAgICBsZXQgaXNJblJpZ2h0UGxhY2UgPSBlbGVtLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgPT0gbnVsbFxuICAgICAgICAgIGlmKCFpc0luUmlnaHRQbGFjZSl7XG4gICAgICAgICAgICBjb250YWluZXIuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KFwiYWZ0ZXJiZWdpblwiLCBlbGVtKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYodGhpcy51cGRhdGVUeXBlID09IFwicHJlcGVuZFwiKXtcbiAgICAgIHRoaXMuZWxlbWVudElkc1RvQWRkLnJldmVyc2UoKS5mb3JFYWNoKGVsZW1JZCA9PiB7XG4gICAgICAgIG1heWJlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1JZCksIGVsZW0gPT4gY29udGFpbmVyLmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyYmVnaW5cIiwgZWxlbSkpXG4gICAgICB9KVxuICAgIH1cbiAgfVxufVxuIiwgInZhciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFID0gMTE7XG5cbmZ1bmN0aW9uIG1vcnBoQXR0cnMoZnJvbU5vZGUsIHRvTm9kZSkge1xuICAgIHZhciB0b05vZGVBdHRycyA9IHRvTm9kZS5hdHRyaWJ1dGVzO1xuICAgIHZhciBhdHRyO1xuICAgIHZhciBhdHRyTmFtZTtcbiAgICB2YXIgYXR0ck5hbWVzcGFjZVVSSTtcbiAgICB2YXIgYXR0clZhbHVlO1xuICAgIHZhciBmcm9tVmFsdWU7XG5cbiAgICAvLyBkb2N1bWVudC1mcmFnbWVudHMgZG9udCBoYXZlIGF0dHJpYnV0ZXMgc28gbGV0cyBub3QgZG8gYW55dGhpbmdcbiAgICBpZiAodG9Ob2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFIHx8IGZyb21Ob2RlLm5vZGVUeXBlID09PSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlIGF0dHJpYnV0ZXMgb24gb3JpZ2luYWwgRE9NIGVsZW1lbnRcbiAgICBmb3IgKHZhciBpID0gdG9Ob2RlQXR0cnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgYXR0ciA9IHRvTm9kZUF0dHJzW2ldO1xuICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTtcbiAgICAgICAgYXR0ck5hbWVzcGFjZVVSSSA9IGF0dHIubmFtZXNwYWNlVVJJO1xuICAgICAgICBhdHRyVmFsdWUgPSBhdHRyLnZhbHVlO1xuXG4gICAgICAgIGlmIChhdHRyTmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubG9jYWxOYW1lIHx8IGF0dHJOYW1lO1xuICAgICAgICAgICAgZnJvbVZhbHVlID0gZnJvbU5vZGUuZ2V0QXR0cmlidXRlTlMoYXR0ck5hbWVzcGFjZVVSSSwgYXR0ck5hbWUpO1xuXG4gICAgICAgICAgICBpZiAoZnJvbVZhbHVlICE9PSBhdHRyVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXR0ci5wcmVmaXggPT09ICd4bWxucycpe1xuICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZSA9IGF0dHIubmFtZTsgLy8gSXQncyBub3QgYWxsb3dlZCB0byBzZXQgYW4gYXR0cmlidXRlIHdpdGggdGhlIFhNTE5TIG5hbWVzcGFjZSB3aXRob3V0IHNwZWNpZnlpbmcgdGhlIGB4bWxuc2AgcHJlZml4XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnNldEF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJvbVZhbHVlID0gZnJvbU5vZGUuZ2V0QXR0cmlidXRlKGF0dHJOYW1lKTtcblxuICAgICAgICAgICAgaWYgKGZyb21WYWx1ZSAhPT0gYXR0clZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZnJvbU5vZGUuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGFueSBleHRyYSBhdHRyaWJ1dGVzIGZvdW5kIG9uIHRoZSBvcmlnaW5hbCBET00gZWxlbWVudCB0aGF0XG4gICAgLy8gd2VyZW4ndCBmb3VuZCBvbiB0aGUgdGFyZ2V0IGVsZW1lbnQuXG4gICAgdmFyIGZyb21Ob2RlQXR0cnMgPSBmcm9tTm9kZS5hdHRyaWJ1dGVzO1xuXG4gICAgZm9yICh2YXIgZCA9IGZyb21Ob2RlQXR0cnMubGVuZ3RoIC0gMTsgZCA+PSAwOyBkLS0pIHtcbiAgICAgICAgYXR0ciA9IGZyb21Ob2RlQXR0cnNbZF07XG4gICAgICAgIGF0dHJOYW1lID0gYXR0ci5uYW1lO1xuICAgICAgICBhdHRyTmFtZXNwYWNlVVJJID0gYXR0ci5uYW1lc3BhY2VVUkk7XG5cbiAgICAgICAgaWYgKGF0dHJOYW1lc3BhY2VVUkkpIHtcbiAgICAgICAgICAgIGF0dHJOYW1lID0gYXR0ci5sb2NhbE5hbWUgfHwgYXR0ck5hbWU7XG5cbiAgICAgICAgICAgIGlmICghdG9Ob2RlLmhhc0F0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgIGZyb21Ob2RlLnJlbW92ZUF0dHJpYnV0ZU5TKGF0dHJOYW1lc3BhY2VVUkksIGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghdG9Ob2RlLmhhc0F0dHJpYnV0ZShhdHRyTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBmcm9tTm9kZS5yZW1vdmVBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG52YXIgcmFuZ2U7IC8vIENyZWF0ZSBhIHJhbmdlIG9iamVjdCBmb3IgZWZmaWNlbnRseSByZW5kZXJpbmcgc3RyaW5ncyB0byBlbGVtZW50cy5cbnZhciBOU19YSFRNTCA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcblxudmFyIGRvYyA9IHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBkb2N1bWVudDtcbnZhciBIQVNfVEVNUExBVEVfU1VQUE9SVCA9ICEhZG9jICYmICdjb250ZW50JyBpbiBkb2MuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbnZhciBIQVNfUkFOR0VfU1VQUE9SVCA9ICEhZG9jICYmIGRvYy5jcmVhdGVSYW5nZSAmJiAnY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50JyBpbiBkb2MuY3JlYXRlUmFuZ2UoKTtcblxuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRGcm9tVGVtcGxhdGUoc3RyKSB7XG4gICAgdmFyIHRlbXBsYXRlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc3RyO1xuICAgIHJldHVybiB0ZW1wbGF0ZS5jb250ZW50LmNoaWxkTm9kZXNbMF07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVJhbmdlKHN0cikge1xuICAgIGlmICghcmFuZ2UpIHtcbiAgICAgICAgcmFuZ2UgPSBkb2MuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZShkb2MuYm9keSk7XG4gICAgfVxuXG4gICAgdmFyIGZyYWdtZW50ID0gcmFuZ2UuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHN0cik7XG4gICAgcmV0dXJuIGZyYWdtZW50LmNoaWxkTm9kZXNbMF07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUZyYWdtZW50RnJvbVdyYXAoc3RyKSB7XG4gICAgdmFyIGZyYWdtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2JvZHknKTtcbiAgICBmcmFnbWVudC5pbm5lckhUTUwgPSBzdHI7XG4gICAgcmV0dXJuIGZyYWdtZW50LmNoaWxkTm9kZXNbMF07XG59XG5cbi8qKlxuICogVGhpcyBpcyBhYm91dCB0aGUgc2FtZVxuICogdmFyIGh0bWwgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHN0ciwgJ3RleHQvaHRtbCcpO1xuICogcmV0dXJuIGh0bWwuYm9keS5maXJzdENoaWxkO1xuICpcbiAqIEBtZXRob2QgdG9FbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKi9cbmZ1bmN0aW9uIHRvRWxlbWVudChzdHIpIHtcbiAgICBzdHIgPSBzdHIudHJpbSgpO1xuICAgIGlmIChIQVNfVEVNUExBVEVfU1VQUE9SVCkge1xuICAgICAgLy8gYXZvaWQgcmVzdHJpY3Rpb25zIG9uIGNvbnRlbnQgZm9yIHRoaW5ncyBsaWtlIGA8dHI+PHRoPkhpPC90aD48L3RyPmAgd2hpY2hcbiAgICAgIC8vIGNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCBkb2Vzbid0IHN1cHBvcnRcbiAgICAgIC8vIDx0ZW1wbGF0ZT4gc3VwcG9ydCBub3QgYXZhaWxhYmxlIGluIElFXG4gICAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tVGVtcGxhdGUoc3RyKTtcbiAgICB9IGVsc2UgaWYgKEhBU19SQU5HRV9TVVBQT1JUKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tUmFuZ2Uoc3RyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tV3JhcChzdHIpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0d28gbm9kZSdzIG5hbWVzIGFyZSB0aGUgc2FtZS5cbiAqXG4gKiBOT1RFOiBXZSBkb24ndCBib3RoZXIgY2hlY2tpbmcgYG5hbWVzcGFjZVVSSWAgYmVjYXVzZSB5b3Ugd2lsbCBuZXZlciBmaW5kIHR3byBIVE1MIGVsZW1lbnRzIHdpdGggdGhlIHNhbWVcbiAqICAgICAgIG5vZGVOYW1lIGFuZCBkaWZmZXJlbnQgbmFtZXNwYWNlIFVSSXMuXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSBhXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGIgVGhlIHRhcmdldCBlbGVtZW50XG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBjb21wYXJlTm9kZU5hbWVzKGZyb21FbCwgdG9FbCkge1xuICAgIHZhciBmcm9tTm9kZU5hbWUgPSBmcm9tRWwubm9kZU5hbWU7XG4gICAgdmFyIHRvTm9kZU5hbWUgPSB0b0VsLm5vZGVOYW1lO1xuICAgIHZhciBmcm9tQ29kZVN0YXJ0LCB0b0NvZGVTdGFydDtcblxuICAgIGlmIChmcm9tTm9kZU5hbWUgPT09IHRvTm9kZU5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZnJvbUNvZGVTdGFydCA9IGZyb21Ob2RlTmFtZS5jaGFyQ29kZUF0KDApO1xuICAgIHRvQ29kZVN0YXJ0ID0gdG9Ob2RlTmFtZS5jaGFyQ29kZUF0KDApO1xuXG4gICAgLy8gSWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIGEgdmlydHVhbCBET00gbm9kZSBvciBTVkcgbm9kZSB0aGVuIHdlIG1heVxuICAgIC8vIG5lZWQgdG8gbm9ybWFsaXplIHRoZSB0YWcgbmFtZSBiZWZvcmUgY29tcGFyaW5nLiBOb3JtYWwgSFRNTCBlbGVtZW50cyB0aGF0IGFyZVxuICAgIC8vIGluIHRoZSBcImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWxcIlxuICAgIC8vIGFyZSBjb252ZXJ0ZWQgdG8gdXBwZXIgY2FzZVxuICAgIGlmIChmcm9tQ29kZVN0YXJ0IDw9IDkwICYmIHRvQ29kZVN0YXJ0ID49IDk3KSB7IC8vIGZyb20gaXMgdXBwZXIgYW5kIHRvIGlzIGxvd2VyXG4gICAgICAgIHJldHVybiBmcm9tTm9kZU5hbWUgPT09IHRvTm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICB9IGVsc2UgaWYgKHRvQ29kZVN0YXJ0IDw9IDkwICYmIGZyb21Db2RlU3RhcnQgPj0gOTcpIHsgLy8gdG8gaXMgdXBwZXIgYW5kIGZyb20gaXMgbG93ZXJcbiAgICAgICAgcmV0dXJuIHRvTm9kZU5hbWUgPT09IGZyb21Ob2RlTmFtZS50b1VwcGVyQ2FzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGFuIGVsZW1lbnQsIG9wdGlvbmFsbHkgd2l0aCBhIGtub3duIG5hbWVzcGFjZSBVUkkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGVsZW1lbnQgbmFtZSwgZS5nLiAnZGl2JyBvciAnc3ZnJ1xuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lc3BhY2VVUkldIHRoZSBlbGVtZW50J3MgbmFtZXNwYWNlIFVSSSwgaS5lLiB0aGUgdmFsdWUgb2ZcbiAqIGl0cyBgeG1sbnNgIGF0dHJpYnV0ZSBvciBpdHMgaW5mZXJyZWQgbmFtZXNwYWNlLlxuICpcbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnROUyhuYW1lLCBuYW1lc3BhY2VVUkkpIHtcbiAgICByZXR1cm4gIW5hbWVzcGFjZVVSSSB8fCBuYW1lc3BhY2VVUkkgPT09IE5TX1hIVE1MID9cbiAgICAgICAgZG9jLmNyZWF0ZUVsZW1lbnQobmFtZSkgOlxuICAgICAgICBkb2MuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgbmFtZSk7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSBjaGlsZHJlbiBvZiBvbmUgRE9NIGVsZW1lbnQgdG8gYW5vdGhlciBET00gZWxlbWVudFxuICovXG5mdW5jdGlvbiBtb3ZlQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKSB7XG4gICAgdmFyIGN1ckNoaWxkID0gZnJvbUVsLmZpcnN0Q2hpbGQ7XG4gICAgd2hpbGUgKGN1ckNoaWxkKSB7XG4gICAgICAgIHZhciBuZXh0Q2hpbGQgPSBjdXJDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgdG9FbC5hcHBlbmRDaGlsZChjdXJDaGlsZCk7XG4gICAgICAgIGN1ckNoaWxkID0gbmV4dENoaWxkO1xuICAgIH1cbiAgICByZXR1cm4gdG9FbDtcbn1cblxuZnVuY3Rpb24gc3luY0Jvb2xlYW5BdHRyUHJvcChmcm9tRWwsIHRvRWwsIG5hbWUpIHtcbiAgICBpZiAoZnJvbUVsW25hbWVdICE9PSB0b0VsW25hbWVdKSB7XG4gICAgICAgIGZyb21FbFtuYW1lXSA9IHRvRWxbbmFtZV07XG4gICAgICAgIGlmIChmcm9tRWxbbmFtZV0pIHtcbiAgICAgICAgICAgIGZyb21FbC5zZXRBdHRyaWJ1dGUobmFtZSwgJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZnJvbUVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxudmFyIHNwZWNpYWxFbEhhbmRsZXJzID0ge1xuICAgIE9QVElPTjogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIHZhciBwYXJlbnROb2RlID0gZnJvbUVsLnBhcmVudE5vZGU7XG4gICAgICAgIGlmIChwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50TmFtZSA9IHBhcmVudE5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnROYW1lID09PSAnT1BUR1JPVVAnKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IHBhcmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICBwYXJlbnROYW1lID0gcGFyZW50Tm9kZSAmJiBwYXJlbnROb2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocGFyZW50TmFtZSA9PT0gJ1NFTEVDVCcgJiYgIXBhcmVudE5vZGUuaGFzQXR0cmlidXRlKCdtdWx0aXBsZScpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZyb21FbC5oYXNBdHRyaWJ1dGUoJ3NlbGVjdGVkJykgJiYgIXRvRWwuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgTVMgRWRnZSBidWcgd2hlcmUgdGhlICdzZWxlY3RlZCcgYXR0cmlidXRlIGNhbiBvbmx5IGJlXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZWQgaWYgc2V0IHRvIGEgbm9uLWVtcHR5IHZhbHVlOlxuICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMjA4NzY3OS9cbiAgICAgICAgICAgICAgICAgICAgZnJvbUVsLnNldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnLCAnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbUVsLnJlbW92ZUF0dHJpYnV0ZSgnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byByZXNldCBzZWxlY3QgZWxlbWVudCdzIHNlbGVjdGVkSW5kZXggdG8gLTEsIG90aGVyd2lzZSBzZXR0aW5nXG4gICAgICAgICAgICAgICAgLy8gZnJvbUVsLnNlbGVjdGVkIHVzaW5nIHRoZSBzeW5jQm9vbGVhbkF0dHJQcm9wIGJlbG93IGhhcyBubyBlZmZlY3QuXG4gICAgICAgICAgICAgICAgLy8gVGhlIGNvcnJlY3Qgc2VsZWN0ZWRJbmRleCB3aWxsIGJlIHNldCBpbiB0aGUgU0VMRUNUIHNwZWNpYWwgaGFuZGxlciBiZWxvdy5cbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLnNlbGVjdGVkSW5kZXggPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ3NlbGVjdGVkJyk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBUaGUgXCJ2YWx1ZVwiIGF0dHJpYnV0ZSBpcyBzcGVjaWFsIGZvciB0aGUgPGlucHV0PiBlbGVtZW50IHNpbmNlIGl0IHNldHNcbiAgICAgKiB0aGUgaW5pdGlhbCB2YWx1ZS4gQ2hhbmdpbmcgdGhlIFwidmFsdWVcIiBhdHRyaWJ1dGUgd2l0aG91dCBjaGFuZ2luZyB0aGVcbiAgICAgKiBcInZhbHVlXCIgcHJvcGVydHkgd2lsbCBoYXZlIG5vIGVmZmVjdCBzaW5jZSBpdCBpcyBvbmx5IHVzZWQgdG8gdGhlIHNldCB0aGVcbiAgICAgKiBpbml0aWFsIHZhbHVlLiAgU2ltaWxhciBmb3IgdGhlIFwiY2hlY2tlZFwiIGF0dHJpYnV0ZSwgYW5kIFwiZGlzYWJsZWRcIi5cbiAgICAgKi9cbiAgICBJTlBVVDogZnVuY3Rpb24oZnJvbUVsLCB0b0VsKSB7XG4gICAgICAgIHN5bmNCb29sZWFuQXR0clByb3AoZnJvbUVsLCB0b0VsLCAnY2hlY2tlZCcpO1xuICAgICAgICBzeW5jQm9vbGVhbkF0dHJQcm9wKGZyb21FbCwgdG9FbCwgJ2Rpc2FibGVkJyk7XG5cbiAgICAgICAgaWYgKGZyb21FbC52YWx1ZSAhPT0gdG9FbC52YWx1ZSkge1xuICAgICAgICAgICAgZnJvbUVsLnZhbHVlID0gdG9FbC52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdG9FbC5oYXNBdHRyaWJ1dGUoJ3ZhbHVlJykpIHtcbiAgICAgICAgICAgIGZyb21FbC5yZW1vdmVBdHRyaWJ1dGUoJ3ZhbHVlJyk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgVEVYVEFSRUE6IGZ1bmN0aW9uKGZyb21FbCwgdG9FbCkge1xuICAgICAgICB2YXIgbmV3VmFsdWUgPSB0b0VsLnZhbHVlO1xuICAgICAgICBpZiAoZnJvbUVsLnZhbHVlICE9PSBuZXdWYWx1ZSkge1xuICAgICAgICAgICAgZnJvbUVsLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmlyc3RDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgICAgICBpZiAoZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgLy8gTmVlZGVkIGZvciBJRS4gQXBwYXJlbnRseSBJRSBzZXRzIHRoZSBwbGFjZWhvbGRlciBhcyB0aGVcbiAgICAgICAgICAgIC8vIG5vZGUgdmFsdWUgYW5kIHZpc2UgdmVyc2EuIFRoaXMgaWdub3JlcyBhbiBlbXB0eSB1cGRhdGUuXG4gICAgICAgICAgICB2YXIgb2xkVmFsdWUgPSBmaXJzdENoaWxkLm5vZGVWYWx1ZTtcblxuICAgICAgICAgICAgaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlIHx8ICghbmV3VmFsdWUgJiYgb2xkVmFsdWUgPT0gZnJvbUVsLnBsYWNlaG9sZGVyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZmlyc3RDaGlsZC5ub2RlVmFsdWUgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgU0VMRUNUOiBmdW5jdGlvbihmcm9tRWwsIHRvRWwpIHtcbiAgICAgICAgaWYgKCF0b0VsLmhhc0F0dHJpYnV0ZSgnbXVsdGlwbGUnKSkge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGVkSW5kZXggPSAtMTtcbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbG9vcCB0aHJvdWdoIGNoaWxkcmVuIG9mIGZyb21FbCwgbm90IHRvRWwgc2luY2Ugbm9kZXMgY2FuIGJlIG1vdmVkXG4gICAgICAgICAgICAvLyBmcm9tIHRvRWwgdG8gZnJvbUVsIGRpcmVjdGx5IHdoZW4gbW9ycGhpbmcuXG4gICAgICAgICAgICAvLyBBdCB0aGUgdGltZSB0aGlzIHNwZWNpYWwgaGFuZGxlciBpcyBpbnZva2VkLCBhbGwgY2hpbGRyZW4gaGF2ZSBhbHJlYWR5IGJlZW4gbW9ycGhlZFxuICAgICAgICAgICAgLy8gYW5kIGFwcGVuZGVkIHRvIC8gcmVtb3ZlZCBmcm9tIGZyb21FbCwgc28gdXNpbmcgZnJvbUVsIGhlcmUgaXMgc2FmZSBhbmQgY29ycmVjdC5cbiAgICAgICAgICAgIHZhciBjdXJDaGlsZCA9IGZyb21FbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgdmFyIG9wdGdyb3VwO1xuICAgICAgICAgICAgdmFyIG5vZGVOYW1lO1xuICAgICAgICAgICAgd2hpbGUoY3VyQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICBub2RlTmFtZSA9IGN1ckNoaWxkLm5vZGVOYW1lICYmIGN1ckNoaWxkLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnT1BUR1JPVVAnKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gY3VyQ2hpbGQ7XG4gICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gb3B0Z3JvdXAuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdPUFRJT04nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hpbGQuaGFzQXR0cmlidXRlKCdzZWxlY3RlZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBjdXJDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjdXJDaGlsZCAmJiBvcHRncm91cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBvcHRncm91cC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGdyb3VwID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZnJvbUVsLnNlbGVjdGVkSW5kZXggPSBzZWxlY3RlZEluZGV4O1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIEVMRU1FTlRfTk9ERSA9IDE7XG52YXIgRE9DVU1FTlRfRlJBR01FTlRfTk9ERSQxID0gMTE7XG52YXIgVEVYVF9OT0RFID0gMztcbnZhciBDT01NRU5UX05PREUgPSA4O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gZGVmYXVsdEdldE5vZGVLZXkobm9kZSkge1xuICBpZiAobm9kZSkge1xuICAgICAgcmV0dXJuIChub2RlLmdldEF0dHJpYnV0ZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnaWQnKSkgfHwgbm9kZS5pZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBtb3JwaGRvbUZhY3RvcnkobW9ycGhBdHRycykge1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIG1vcnBoZG9tKGZyb21Ob2RlLCB0b05vZGUsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICBvcHRpb25zID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRvTm9kZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChmcm9tTm9kZS5ub2RlTmFtZSA9PT0gJyNkb2N1bWVudCcgfHwgZnJvbU5vZGUubm9kZU5hbWUgPT09ICdIVE1MJyB8fCBmcm9tTm9kZS5ub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRvTm9kZUh0bWwgPSB0b05vZGU7XG4gICAgICAgICAgICAgICAgdG9Ob2RlID0gZG9jLmNyZWF0ZUVsZW1lbnQoJ2h0bWwnKTtcbiAgICAgICAgICAgICAgICB0b05vZGUuaW5uZXJIVE1MID0gdG9Ob2RlSHRtbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9Ob2RlID0gdG9FbGVtZW50KHRvTm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZ2V0Tm9kZUtleSA9IG9wdGlvbnMuZ2V0Tm9kZUtleSB8fCBkZWZhdWx0R2V0Tm9kZUtleTtcbiAgICAgICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVBZGRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25Ob2RlQWRkZWQgPSBvcHRpb25zLm9uTm9kZUFkZGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbkJlZm9yZUVsVXBkYXRlZCA9IG9wdGlvbnMub25CZWZvcmVFbFVwZGF0ZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uRWxVcGRhdGVkID0gb3B0aW9ucy5vbkVsVXBkYXRlZCB8fCBub29wO1xuICAgICAgICB2YXIgb25CZWZvcmVOb2RlRGlzY2FyZGVkID0gb3B0aW9ucy5vbkJlZm9yZU5vZGVEaXNjYXJkZWQgfHwgbm9vcDtcbiAgICAgICAgdmFyIG9uTm9kZURpc2NhcmRlZCA9IG9wdGlvbnMub25Ob2RlRGlzY2FyZGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBvbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkID0gb3B0aW9ucy5vbkJlZm9yZUVsQ2hpbGRyZW5VcGRhdGVkIHx8IG5vb3A7XG4gICAgICAgIHZhciBjaGlsZHJlbk9ubHkgPSBvcHRpb25zLmNoaWxkcmVuT25seSA9PT0gdHJ1ZTtcblxuICAgICAgICAvLyBUaGlzIG9iamVjdCBpcyB1c2VkIGFzIGEgbG9va3VwIHRvIHF1aWNrbHkgZmluZCBhbGwga2V5ZWQgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlLlxuICAgICAgICB2YXIgZnJvbU5vZGVzTG9va3VwID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgdmFyIGtleWVkUmVtb3ZhbExpc3QgPSBbXTtcblxuICAgICAgICBmdW5jdGlvbiBhZGRLZXllZFJlbW92YWwoa2V5KSB7XG4gICAgICAgICAgICBrZXllZFJlbW92YWxMaXN0LnB1c2goa2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIHdhbGtEaXNjYXJkZWRDaGlsZE5vZGVzKG5vZGUsIHNraXBLZXllZE5vZGVzKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gbm9kZS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNraXBLZXllZE5vZGVzICYmIChrZXkgPSBnZXROb2RlS2V5KGN1ckNoaWxkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBza2lwcGluZyBrZXllZCBub2RlcyB0aGVuIHdlIGFkZCB0aGUga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhIGxpc3Qgc28gdGhhdCBpdCBjYW4gYmUgaGFuZGxlZCBhdCB0aGUgdmVyeSBlbmQuXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRLZXllZFJlbW92YWwoa2V5KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgcmVwb3J0IHRoZSBub2RlIGFzIGRpc2NhcmRlZCBpZiBpdCBpcyBub3Qga2V5ZWQuIFdlIGRvIHRoaXMgYmVjYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCB3ZSBsb29wIHRocm91Z2ggYWxsIGtleWVkIGVsZW1lbnRzIHRoYXQgd2VyZSB1bm1hdGNoZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRpc2NhcmQgdGhlbSBpbiBvbmUgZmluYWwgcGFzcy5cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTm9kZURpc2NhcmRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hpbGQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtEaXNjYXJkZWRDaGlsZE5vZGVzKGN1ckNoaWxkLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdXJDaGlsZCA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZW1vdmVzIGEgRE9NIG5vZGUgb3V0IG9mIHRoZSBvcmlnaW5hbCBET01cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtICB7Tm9kZX0gbm9kZSBUaGUgbm9kZSB0byByZW1vdmVcbiAgICAgICAgICogQHBhcmFtICB7Tm9kZX0gcGFyZW50Tm9kZSBUaGUgbm9kZXMgcGFyZW50XG4gICAgICAgICAqIEBwYXJhbSAge0Jvb2xlYW59IHNraXBLZXllZE5vZGVzIElmIHRydWUgdGhlbiBlbGVtZW50cyB3aXRoIGtleXMgd2lsbCBiZSBza2lwcGVkIGFuZCBub3QgZGlzY2FyZGVkLlxuICAgICAgICAgKiBAcmV0dXJuIHt1bmRlZmluZWR9XG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiByZW1vdmVOb2RlKG5vZGUsIHBhcmVudE5vZGUsIHNraXBLZXllZE5vZGVzKSB7XG4gICAgICAgICAgICBpZiAob25CZWZvcmVOb2RlRGlzY2FyZGVkKG5vZGUpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBvbk5vZGVEaXNjYXJkZWQobm9kZSk7XG4gICAgICAgICAgICB3YWxrRGlzY2FyZGVkQ2hpbGROb2Rlcyhub2RlLCBza2lwS2V5ZWROb2Rlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAvLyBUcmVlV2Fsa2VyIGltcGxlbWVudGF0aW9uIGlzIG5vIGZhc3RlciwgYnV0IGtlZXBpbmcgdGhpcyBhcm91bmQgaW4gY2FzZSB0aGlzIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZVxuICAgICAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUocm9vdCkge1xuICAgICAgICAvLyAgICAgdmFyIHRyZWVXYWxrZXIgPSBkb2N1bWVudC5jcmVhdGVUcmVlV2Fsa2VyKFxuICAgICAgICAvLyAgICAgICAgIHJvb3QsXG4gICAgICAgIC8vICAgICAgICAgTm9kZUZpbHRlci5TSE9XX0VMRU1FTlQpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgdmFyIGVsO1xuICAgICAgICAvLyAgICAgd2hpbGUoKGVsID0gdHJlZVdhbGtlci5uZXh0Tm9kZSgpKSkge1xuICAgICAgICAvLyAgICAgICAgIHZhciBrZXkgPSBnZXROb2RlS2V5KGVsKTtcbiAgICAgICAgLy8gICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgIC8vICAgICAgICAgICAgIGZyb21Ob2Rlc0xvb2t1cFtrZXldID0gZWw7XG4gICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gLy8gTm9kZUl0ZXJhdG9yIGltcGxlbWVudGF0aW9uIGlzIG5vIGZhc3RlciwgYnV0IGtlZXBpbmcgdGhpcyBhcm91bmQgaW4gY2FzZSB0aGlzIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZVxuICAgICAgICAvL1xuICAgICAgICAvLyBmdW5jdGlvbiBpbmRleFRyZWUobm9kZSkge1xuICAgICAgICAvLyAgICAgdmFyIG5vZGVJdGVyYXRvciA9IGRvY3VtZW50LmNyZWF0ZU5vZGVJdGVyYXRvcihub2RlLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCk7XG4gICAgICAgIC8vICAgICB2YXIgZWw7XG4gICAgICAgIC8vICAgICB3aGlsZSgoZWwgPSBub2RlSXRlcmF0b3IubmV4dE5vZGUoKSkpIHtcbiAgICAgICAgLy8gICAgICAgICB2YXIga2V5ID0gZ2V0Tm9kZUtleShlbCk7XG4gICAgICAgIC8vICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAvLyAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGVsO1xuICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGZ1bmN0aW9uIGluZGV4VHJlZShub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFIHx8IG5vZGUubm9kZVR5cGUgPT09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUkMSkge1xuICAgICAgICAgICAgICAgIHZhciBjdXJDaGlsZCA9IG5vZGUuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoY3VyQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tTm9kZXNMb29rdXBba2V5XSA9IGN1ckNoaWxkO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2FsayByZWN1cnNpdmVseVxuICAgICAgICAgICAgICAgICAgICBpbmRleFRyZWUoY3VyQ2hpbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGN1ckNoaWxkID0gY3VyQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXhUcmVlKGZyb21Ob2RlKTtcblxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVOb2RlQWRkZWQoZWwpIHtcbiAgICAgICAgICAgIG9uTm9kZUFkZGVkKGVsKTtcblxuICAgICAgICAgICAgdmFyIGN1ckNoaWxkID0gZWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHdoaWxlIChjdXJDaGlsZCkge1xuICAgICAgICAgICAgICAgIHZhciBuZXh0U2libGluZyA9IGN1ckNoaWxkLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGdldE5vZGVLZXkoY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHVubWF0Y2hlZEZyb21FbCA9IGZyb21Ob2Rlc0xvb2t1cFtrZXldO1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBmaW5kIGEgZHVwbGljYXRlICNpZCBub2RlIGluIGNhY2hlLCByZXBsYWNlIGBlbGAgd2l0aCBjYWNoZSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbW9ycGggaXQgdG8gdGhlIGNoaWxkIG5vZGUuXG4gICAgICAgICAgICAgICAgICAgIGlmICh1bm1hdGNoZWRGcm9tRWwgJiYgY29tcGFyZU5vZGVOYW1lcyhjdXJDaGlsZCwgdW5tYXRjaGVkRnJvbUVsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyQ2hpbGQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQodW5tYXRjaGVkRnJvbUVsLCBjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb3JwaEVsKHVubWF0Y2hlZEZyb21FbCwgY3VyQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU5vZGVBZGRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gcmVjdXJzaXZlbHkgY2FsbCBmb3IgY3VyQ2hpbGQgYW5kIGl0J3MgY2hpbGRyZW4gdG8gc2VlIGlmIHdlIGZpbmQgc29tZXRoaW5nIGluXG4gICAgICAgICAgICAgICAgICAvLyBmcm9tTm9kZXNMb29rdXBcbiAgICAgICAgICAgICAgICAgIGhhbmRsZU5vZGVBZGRlZChjdXJDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VyQ2hpbGQgPSBuZXh0U2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSBwcm9jZXNzZWQgYWxsIG9mIHRoZSBcInRvIG5vZGVzXCIuIElmIGN1ckZyb21Ob2RlQ2hpbGQgaXNcbiAgICAgICAgICAgIC8vIG5vbi1udWxsIHRoZW4gd2Ugc3RpbGwgaGF2ZSBzb21lIGZyb20gbm9kZXMgbGVmdCBvdmVyIHRoYXQgbmVlZFxuICAgICAgICAgICAgLy8gdG8gYmUgcmVtb3ZlZFxuICAgICAgICAgICAgd2hpbGUgKGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICBpZiAoKGN1ckZyb21Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJGcm9tTm9kZUNoaWxkKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgYWRkS2V5ZWRSZW1vdmFsKGN1ckZyb21Ob2RlS2V5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBza2lwIG5lc3RlZCBrZXllZCBub2RlcyBmcm9tIGJlaW5nIHJlbW92ZWQgc2luY2UgdGhlcmUgaXNcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc3RpbGwgYSBjaGFuY2UgdGhleSB3aWxsIGJlIG1hdGNoZWQgdXAgbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBtb3JwaEVsKGZyb21FbCwgdG9FbCwgY2hpbGRyZW5Pbmx5KSB7XG4gICAgICAgICAgICB2YXIgdG9FbEtleSA9IGdldE5vZGVLZXkodG9FbCk7XG5cbiAgICAgICAgICAgIGlmICh0b0VsS2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgYW4gZWxlbWVudCB3aXRoIGFuIElEIGlzIGJlaW5nIG1vcnBoZWQgdGhlbiBpdCB3aWxsIGJlIGluIHRoZSBmaW5hbFxuICAgICAgICAgICAgICAgIC8vIERPTSBzbyBjbGVhciBpdCBvdXQgb2YgdGhlIHNhdmVkIGVsZW1lbnRzIGNvbGxlY3Rpb25cbiAgICAgICAgICAgICAgICBkZWxldGUgZnJvbU5vZGVzTG9va3VwW3RvRWxLZXldO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWNoaWxkcmVuT25seSkge1xuICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsXG4gICAgICAgICAgICAgICAgaWYgKG9uQmVmb3JlRWxVcGRhdGVkKGZyb21FbCwgdG9FbCkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgYXR0cmlidXRlcyBvbiBvcmlnaW5hbCBET00gZWxlbWVudCBmaXJzdFxuICAgICAgICAgICAgICAgIG1vcnBoQXR0cnMoZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgICAgICAvLyBvcHRpb25hbFxuICAgICAgICAgICAgICAgIG9uRWxVcGRhdGVkKGZyb21FbCk7XG5cbiAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVFbENoaWxkcmVuVXBkYXRlZChmcm9tRWwsIHRvRWwpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZnJvbUVsLm5vZGVOYW1lICE9PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgICAgICAgIG1vcnBoQ2hpbGRyZW4oZnJvbUVsLCB0b0VsKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNwZWNpYWxFbEhhbmRsZXJzLlRFWFRBUkVBKGZyb21FbCwgdG9FbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBtb3JwaENoaWxkcmVuKGZyb21FbCwgdG9FbCkge1xuICAgICAgICAgICAgdmFyIGN1clRvTm9kZUNoaWxkID0gdG9FbC5maXJzdENoaWxkO1xuICAgICAgICAgICAgdmFyIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tRWwuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIHZhciBjdXJUb05vZGVLZXk7XG4gICAgICAgICAgICB2YXIgY3VyRnJvbU5vZGVLZXk7XG5cbiAgICAgICAgICAgIHZhciBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB2YXIgdG9OZXh0U2libGluZztcbiAgICAgICAgICAgIHZhciBtYXRjaGluZ0Zyb21FbDtcblxuICAgICAgICAgICAgLy8gd2FsayB0aGUgY2hpbGRyZW5cbiAgICAgICAgICAgIG91dGVyOiB3aGlsZSAoY3VyVG9Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICB0b05leHRTaWJsaW5nID0gY3VyVG9Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgY3VyVG9Ob2RlS2V5ID0gZ2V0Tm9kZUtleShjdXJUb05vZGVDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAvLyB3YWxrIHRoZSBmcm9tTm9kZSBjaGlsZHJlbiBhbGwgdGhlIHdheSB0aHJvdWdoXG4gICAgICAgICAgICAgICAgd2hpbGUgKGN1ckZyb21Ob2RlQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbU5leHRTaWJsaW5nID0gY3VyRnJvbU5vZGVDaGlsZC5uZXh0U2libGluZztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVG9Ob2RlQ2hpbGQuaXNTYW1lTm9kZSAmJiBjdXJUb05vZGVDaGlsZC5pc1NhbWVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IHRvTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUtleSA9IGdldE5vZGVLZXkoY3VyRnJvbU5vZGVDaGlsZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGN1ckZyb21Ob2RlVHlwZSA9IGN1ckZyb21Ob2RlQ2hpbGQubm9kZVR5cGU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBtZWFucyBpZiB0aGUgY3VyRnJvbU5vZGVDaGlsZCBkb2VzbnQgaGF2ZSBhIG1hdGNoIHdpdGggdGhlIGN1clRvTm9kZUNoaWxkXG4gICAgICAgICAgICAgICAgICAgIHZhciBpc0NvbXBhdGlibGUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlVHlwZSA9PT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbm9kZXMgYmVpbmcgY29tcGFyZWQgYXJlIEVsZW1lbnQgbm9kZXNcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHRhcmdldCBub2RlIGhhcyBhIGtleSBzbyB3ZSB3YW50IHRvIG1hdGNoIGl0IHVwIHdpdGggdGhlIGNvcnJlY3QgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1clRvTm9kZUtleSAhPT0gY3VyRnJvbU5vZGVLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIERPTSB0cmVlIGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBrZXkgc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCdzIGNoZWNrIG91ciBsb29rdXAgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERPTSB0cmVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21OZXh0U2libGluZyA9PT0gbWF0Y2hpbmdGcm9tRWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBzaW5nbGUgZWxlbWVudCByZW1vdmFscy4gVG8gYXZvaWQgcmVtb3ZpbmcgdGhlIG9yaWdpbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERPTSBub2RlIG91dCBvZiB0aGUgdHJlZSAoc2luY2UgdGhhdCBjYW4gYnJlYWsgQ1NTIHRyYW5zaXRpb25zLCBldGMuKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCBpbnN0ZWFkIGRpc2NhcmQgdGhlIGN1cnJlbnQgbm9kZSBhbmQgd2FpdCB1bnRpbCB0aGUgbmV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdGVyYXRpb24gdG8gcHJvcGVybHkgbWF0Y2ggdXAgdGhlIGtleWVkIHRhcmdldCBlbGVtZW50IHdpdGggaXRzIG1hdGNoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIHRyZWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgYSBtYXRjaGluZyBrZXllZCBlbGVtZW50IHNvbWV3aGVyZSBpbiB0aGUgb3JpZ2luYWwgRE9NIHRyZWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIG1vdmUgdGhlIG9yaWdpbmFsIERPTSBub2RlIGludG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIG1vcnBoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0LlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IFdlIHVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiByZXBsYWNlQ2hpbGQgYmVjYXVzZSB3ZSB3YW50IHRvIGdvIHRocm91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGByZW1vdmVOb2RlKClgIGZ1bmN0aW9uIGZvciB0aGUgbm9kZSB0aGF0IGlzIGJlaW5nIGRpc2NhcmRlZCBzbyB0aGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBsaWZlY3ljbGUgaG9va3MgYXJlIGNvcnJlY3RseSBpbnZva2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb21FbC5pbnNlcnRCZWZvcmUobWF0Y2hpbmdGcm9tRWwsIGN1ckZyb21Ob2RlQ2hpbGQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb21OZXh0U2libGluZyA9IGN1ckZyb21Ob2RlQ2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1ckZyb21Ob2RlS2V5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGUgbm9kZSBpcyBrZXllZCBpdCBtaWdodCBiZSBtYXRjaGVkIHVwIGxhdGVyIHNvIHdlIGRlZmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWN0dWFsIHJlbW92YWwgdG8gbGF0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEtleWVkUmVtb3ZhbChjdXJGcm9tTm9kZUtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiB3ZSBza2lwIG5lc3RlZCBrZXllZCBub2RlcyBmcm9tIGJlaW5nIHJlbW92ZWQgc2luY2UgdGhlcmUgaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHN0aWxsIGEgY2hhbmNlIHRoZXkgd2lsbCBiZSBtYXRjaGVkIHVwIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVOb2RlKGN1ckZyb21Ob2RlQ2hpbGQsIGZyb21FbCwgdHJ1ZSAvKiBza2lwIGtleWVkIG5vZGVzICovKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBtYXRjaGluZ0Zyb21FbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlcyBhcmUgbm90IGNvbXBhdGlibGUgc2luY2UgdGhlIFwidG9cIiBub2RlIGhhcyBhIGtleSBhbmQgdGhlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBubyBtYXRjaGluZyBrZXllZCBub2RlIGluIHRoZSBzb3VyY2UgdHJlZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgb3JpZ2luYWwgaGFzIGEga2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGF0aWJsZSA9IGlzQ29tcGF0aWJsZSAhPT0gZmFsc2UgJiYgY29tcGFyZU5vZGVOYW1lcyhjdXJGcm9tTm9kZUNoaWxkLCBjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBjb21wYXRpYmxlIERPTSBlbGVtZW50cyBzbyB0cmFuc2Zvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgXCJmcm9tXCIgbm9kZSB0byBtYXRjaCB0aGUgY3VycmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YXJnZXQgRE9NIG5vZGUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1PUlBIXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBoRWwoY3VyRnJvbU5vZGVDaGlsZCwgY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJGcm9tTm9kZVR5cGUgPT09IFRFWFRfTk9ERSB8fCBjdXJGcm9tTm9kZVR5cGUgPT0gQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBub2RlcyBiZWluZyBjb21wYXJlZCBhcmUgVGV4dCBvciBDb21tZW50IG5vZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wYXRpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTaW1wbHkgdXBkYXRlIG5vZGVWYWx1ZSBvbiB0aGUgb3JpZ2luYWwgbm9kZSB0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgdGV4dCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUNoaWxkLm5vZGVWYWx1ZSAhPT0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQubm9kZVZhbHVlID0gY3VyVG9Ob2RlQ2hpbGQubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWR2YW5jZSBib3RoIHRoZSBcInRvXCIgY2hpbGQgYW5kIHRoZSBcImZyb21cIiBjaGlsZCBzaW5jZSB3ZSBmb3VuZCBhIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGVsc2UgdG8gZG8gYXMgd2UgYWxyZWFkeSByZWN1cnNpdmVseSBjYWxsZWQgbW9ycGhDaGlsZHJlbiBhYm92ZVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VyRnJvbU5vZGVDaGlsZCA9IGZyb21OZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm8gY29tcGF0aWJsZSBtYXRjaCBzbyByZW1vdmUgdGhlIG9sZCBub2RlIGZyb20gdGhlIERPTSBhbmQgY29udGludWUgdHJ5aW5nIHRvIGZpbmQgYVxuICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaCBpbiB0aGUgb3JpZ2luYWwgRE9NLiBIb3dldmVyLCB3ZSBvbmx5IGRvIHRoaXMgaWYgdGhlIGZyb20gbm9kZSBpcyBub3Qga2V5ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgaXQgaXMgcG9zc2libGUgdGhhdCBhIGtleWVkIG5vZGUgbWlnaHQgbWF0Y2ggdXAgd2l0aCBhIG5vZGUgc29tZXdoZXJlIGVsc2UgaW4gdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vIHRhcmdldCB0cmVlIGFuZCB3ZSBkb24ndCB3YW50IHRvIGRpc2NhcmQgaXQganVzdCB5ZXQgc2luY2UgaXQgc3RpbGwgbWlnaHQgZmluZCBhXG4gICAgICAgICAgICAgICAgICAgIC8vIGhvbWUgaW4gdGhlIGZpbmFsIERPTSB0cmVlLiBBZnRlciBldmVyeXRoaW5nIGlzIGRvbmUgd2Ugd2lsbCByZW1vdmUgYW55IGtleWVkIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgZGlkbid0IGZpbmQgYSBob21lXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJGcm9tTm9kZUtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgaXMga2V5ZWQgaXQgbWlnaHQgYmUgbWF0Y2hlZCB1cCBsYXRlciBzbyB3ZSBkZWZlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGFjdHVhbCByZW1vdmFsIHRvIGxhdGVyXG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRLZXllZFJlbW92YWwoY3VyRnJvbU5vZGVLZXkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9URTogd2Ugc2tpcCBuZXN0ZWQga2V5ZWQgbm9kZXMgZnJvbSBiZWluZyByZW1vdmVkIHNpbmNlIHRoZXJlIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzdGlsbCBhIGNoYW5jZSB0aGV5IHdpbGwgYmUgbWF0Y2hlZCB1cCBsYXRlclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZShjdXJGcm9tTm9kZUNoaWxkLCBmcm9tRWwsIHRydWUgLyogc2tpcCBrZXllZCBub2RlcyAqLyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjdXJGcm9tTm9kZUNoaWxkID0gZnJvbU5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH0gLy8gRU5EOiB3aGlsZShjdXJGcm9tTm9kZUNoaWxkKSB7fVxuXG4gICAgICAgICAgICAgICAgLy8gSWYgd2UgZ290IHRoaXMgZmFyIHRoZW4gd2UgZGlkIG5vdCBmaW5kIGEgY2FuZGlkYXRlIG1hdGNoIGZvclxuICAgICAgICAgICAgICAgIC8vIG91ciBcInRvIG5vZGVcIiBhbmQgd2UgZXhoYXVzdGVkIGFsbCBvZiB0aGUgY2hpbGRyZW4gXCJmcm9tXCJcbiAgICAgICAgICAgICAgICAvLyBub2Rlcy4gVGhlcmVmb3JlLCB3ZSB3aWxsIGp1c3QgYXBwZW5kIHRoZSBjdXJyZW50IFwidG9cIiBub2RlXG4gICAgICAgICAgICAgICAgLy8gdG8gdGhlIGVuZFxuICAgICAgICAgICAgICAgIGlmIChjdXJUb05vZGVLZXkgJiYgKG1hdGNoaW5nRnJvbUVsID0gZnJvbU5vZGVzTG9va3VwW2N1clRvTm9kZUtleV0pICYmIGNvbXBhcmVOb2RlTmFtZXMobWF0Y2hpbmdGcm9tRWwsIGN1clRvTm9kZUNoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tRWwuYXBwZW5kQ2hpbGQobWF0Y2hpbmdGcm9tRWwpO1xuICAgICAgICAgICAgICAgICAgICAvLyBNT1JQSFxuICAgICAgICAgICAgICAgICAgICBtb3JwaEVsKG1hdGNoaW5nRnJvbUVsLCBjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0ID0gb25CZWZvcmVOb2RlQWRkZWQoY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVOb2RlQWRkZWRSZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob25CZWZvcmVOb2RlQWRkZWRSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJUb05vZGVDaGlsZCA9IG9uQmVmb3JlTm9kZUFkZGVkUmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyVG9Ob2RlQ2hpbGQuYWN0dWFsaXplKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSBjdXJUb05vZGVDaGlsZC5hY3R1YWxpemUoZnJvbUVsLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21FbC5hcHBlbmRDaGlsZChjdXJUb05vZGVDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVOb2RlQWRkZWQoY3VyVG9Ob2RlQ2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY3VyVG9Ob2RlQ2hpbGQgPSB0b05leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIGN1ckZyb21Ob2RlQ2hpbGQgPSBmcm9tTmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNsZWFudXBGcm9tRWwoZnJvbUVsLCBjdXJGcm9tTm9kZUNoaWxkLCBjdXJGcm9tTm9kZUtleSk7XG5cbiAgICAgICAgICAgIHZhciBzcGVjaWFsRWxIYW5kbGVyID0gc3BlY2lhbEVsSGFuZGxlcnNbZnJvbUVsLm5vZGVOYW1lXTtcbiAgICAgICAgICAgIGlmIChzcGVjaWFsRWxIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgc3BlY2lhbEVsSGFuZGxlcihmcm9tRWwsIHRvRWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IC8vIEVORDogbW9ycGhDaGlsZHJlbiguLi4pXG5cbiAgICAgICAgdmFyIG1vcnBoZWROb2RlID0gZnJvbU5vZGU7XG4gICAgICAgIHZhciBtb3JwaGVkTm9kZVR5cGUgPSBtb3JwaGVkTm9kZS5ub2RlVHlwZTtcbiAgICAgICAgdmFyIHRvTm9kZVR5cGUgPSB0b05vZGUubm9kZVR5cGU7XG5cbiAgICAgICAgaWYgKCFjaGlsZHJlbk9ubHkpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBhcmUgZ2l2ZW4gdHdvIERPTSBub2RlcyB0aGF0IGFyZSBub3RcbiAgICAgICAgICAgIC8vIGNvbXBhdGlibGUgKGUuZy4gPGRpdj4gLS0+IDxzcGFuPiBvciA8ZGl2PiAtLT4gVEVYVClcbiAgICAgICAgICAgIGlmIChtb3JwaGVkTm9kZVR5cGUgPT09IEVMRU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgIGlmICh0b05vZGVUeXBlID09PSBFTEVNRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wYXJlTm9kZU5hbWVzKGZyb21Ob2RlLCB0b05vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk5vZGVEaXNjYXJkZWQoZnJvbU5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9ycGhlZE5vZGUgPSBtb3ZlQ2hpbGRyZW4oZnJvbU5vZGUsIGNyZWF0ZUVsZW1lbnROUyh0b05vZGUubm9kZU5hbWUsIHRvTm9kZS5uYW1lc3BhY2VVUkkpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdvaW5nIGZyb20gYW4gZWxlbWVudCBub2RlIHRvIGEgdGV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobW9ycGhlZE5vZGVUeXBlID09PSBURVhUX05PREUgfHwgbW9ycGhlZE5vZGVUeXBlID09PSBDT01NRU5UX05PREUpIHsgLy8gVGV4dCBvciBjb21tZW50IG5vZGVcbiAgICAgICAgICAgICAgICBpZiAodG9Ob2RlVHlwZSA9PT0gbW9ycGhlZE5vZGVUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtb3JwaGVkTm9kZS5ub2RlVmFsdWUgIT09IHRvTm9kZS5ub2RlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlLm5vZGVWYWx1ZSA9IHRvTm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9ycGhlZE5vZGU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGV4dCBub2RlIHRvIHNvbWV0aGluZyBlbHNlXG4gICAgICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlID0gdG9Ob2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtb3JwaGVkTm9kZSA9PT0gdG9Ob2RlKSB7XG4gICAgICAgICAgICAvLyBUaGUgXCJ0byBub2RlXCIgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIFwiZnJvbSBub2RlXCIgc28gd2UgaGFkIHRvXG4gICAgICAgICAgICAvLyB0b3NzIG91dCB0aGUgXCJmcm9tIG5vZGVcIiBhbmQgdXNlIHRoZSBcInRvIG5vZGVcIlxuICAgICAgICAgICAgb25Ob2RlRGlzY2FyZGVkKGZyb21Ob2RlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0b05vZGUuaXNTYW1lTm9kZSAmJiB0b05vZGUuaXNTYW1lTm9kZShtb3JwaGVkTm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG1vcnBoRWwobW9ycGhlZE5vZGUsIHRvTm9kZSwgY2hpbGRyZW5Pbmx5KTtcblxuICAgICAgICAgICAgLy8gV2Ugbm93IG5lZWQgdG8gbG9vcCBvdmVyIGFueSBrZXllZCBub2RlcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmVcbiAgICAgICAgICAgIC8vIHJlbW92ZWQuIFdlIG9ubHkgZG8gdGhlIHJlbW92YWwgaWYgd2Uga25vdyB0aGF0IHRoZSBrZXllZCBub2RlXG4gICAgICAgICAgICAvLyBuZXZlciBmb3VuZCBhIG1hdGNoLiBXaGVuIGEga2V5ZWQgbm9kZSBpcyBtYXRjaGVkIHVwIHdlIHJlbW92ZVxuICAgICAgICAgICAgLy8gaXQgb3V0IG9mIGZyb21Ob2Rlc0xvb2t1cCBhbmQgd2UgdXNlIGZyb21Ob2Rlc0xvb2t1cCB0byBkZXRlcm1pbmVcbiAgICAgICAgICAgIC8vIGlmIGEga2V5ZWQgbm9kZSBoYXMgYmVlbiBtYXRjaGVkIHVwIG9yIG5vdFxuICAgICAgICAgICAgaWYgKGtleWVkUmVtb3ZhbExpc3QpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpPTAsIGxlbj1rZXllZFJlbW92YWxMaXN0Lmxlbmd0aDsgaTxsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZWxUb1JlbW92ZSA9IGZyb21Ob2Rlc0xvb2t1cFtrZXllZFJlbW92YWxMaXN0W2ldXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsVG9SZW1vdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUoZWxUb1JlbW92ZSwgZWxUb1JlbW92ZS5wYXJlbnROb2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWNoaWxkcmVuT25seSAmJiBtb3JwaGVkTm9kZSAhPT0gZnJvbU5vZGUgJiYgZnJvbU5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKG1vcnBoZWROb2RlLmFjdHVhbGl6ZSkge1xuICAgICAgICAgICAgICAgIG1vcnBoZWROb2RlID0gbW9ycGhlZE5vZGUuYWN0dWFsaXplKGZyb21Ob2RlLm93bmVyRG9jdW1lbnQgfHwgZG9jKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHdlIGhhZCB0byBzd2FwIG91dCB0aGUgZnJvbSBub2RlIHdpdGggYSBuZXcgbm9kZSBiZWNhdXNlIHRoZSBvbGRcbiAgICAgICAgICAgIC8vIG5vZGUgd2FzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldCBub2RlIHRoZW4gd2UgbmVlZCB0b1xuICAgICAgICAgICAgLy8gcmVwbGFjZSB0aGUgb2xkIERPTSBub2RlIGluIHRoZSBvcmlnaW5hbCBET00gdHJlZS4gVGhpcyBpcyBvbmx5XG4gICAgICAgICAgICAvLyBwb3NzaWJsZSBpZiB0aGUgb3JpZ2luYWwgRE9NIG5vZGUgd2FzIHBhcnQgb2YgYSBET00gdHJlZSB3aGljaFxuICAgICAgICAgICAgLy8gd2Uga25vdyBpcyB0aGUgY2FzZSBpZiBpdCBoYXMgYSBwYXJlbnQgbm9kZS5cbiAgICAgICAgICAgIGZyb21Ob2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG1vcnBoZWROb2RlLCBmcm9tTm9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbW9ycGhlZE5vZGU7XG4gICAgfTtcbn1cblxudmFyIG1vcnBoZG9tID0gbW9ycGhkb21GYWN0b3J5KG1vcnBoQXR0cnMpO1xuXG5leHBvcnQgZGVmYXVsdCBtb3JwaGRvbTtcbiIsICJpbXBvcnQge1xuICBQSFhfQ09NUE9ORU5ULFxuICBQSFhfRElTQUJMRV9XSVRILFxuICBQSFhfRkVFREJBQ0tfRk9SLFxuICBQSFhfUFJVTkUsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfU0VTU0lPTixcbiAgUEhYX1NLSVAsXG4gIFBIWF9TVEFUSUMsXG4gIFBIWF9UUklHR0VSX0FDVElPTixcbiAgUEhYX1VQREFURVxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xuICBkZXRlY3REdXBsaWNhdGVJZHMsXG4gIGlzQ2lkXG59IGZyb20gXCIuL3V0aWxzXCJcblxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb21cIlxuaW1wb3J0IERPTVBvc3RNb3JwaFJlc3RvcmVyIGZyb20gXCIuL2RvbV9wb3N0X21vcnBoX3Jlc3RvcmVyXCJcbmltcG9ydCBtb3JwaGRvbSBmcm9tIFwibW9ycGhkb21cIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01QYXRjaCB7XG4gIHN0YXRpYyBwYXRjaEVsKGZyb21FbCwgdG9FbCwgYWN0aXZlRWxlbWVudCl7XG4gICAgbW9ycGhkb20oZnJvbUVsLCB0b0VsLCB7XG4gICAgICBjaGlsZHJlbk9ubHk6IGZhbHNlLFxuICAgICAgb25CZWZvcmVFbFVwZGF0ZWQ6IChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgICAgaWYoYWN0aXZlRWxlbWVudCAmJiBhY3RpdmVFbGVtZW50LmlzU2FtZU5vZGUoZnJvbUVsKSAmJiBET00uaXNGb3JtSW5wdXQoZnJvbUVsKSl7XG4gICAgICAgICAgRE9NLm1lcmdlRm9jdXNlZElucHV0KGZyb21FbCwgdG9FbClcbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjb25zdHJ1Y3Rvcih2aWV3LCBjb250YWluZXIsIGlkLCBodG1sLCB0YXJnZXRDSUQpe1xuICAgIHRoaXMudmlldyA9IHZpZXdcbiAgICB0aGlzLmxpdmVTb2NrZXQgPSB2aWV3LmxpdmVTb2NrZXRcbiAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lclxuICAgIHRoaXMuaWQgPSBpZFxuICAgIHRoaXMucm9vdElEID0gdmlldy5yb290LmlkXG4gICAgdGhpcy5odG1sID0gaHRtbFxuICAgIHRoaXMudGFyZ2V0Q0lEID0gdGFyZ2V0Q0lEXG4gICAgdGhpcy5jaWRQYXRjaCA9IGlzQ2lkKHRoaXMudGFyZ2V0Q0lEKVxuICAgIHRoaXMuY2FsbGJhY2tzID0ge1xuICAgICAgYmVmb3JlYWRkZWQ6IFtdLCBiZWZvcmV1cGRhdGVkOiBbXSwgYmVmb3JlcGh4Q2hpbGRBZGRlZDogW10sXG4gICAgICBhZnRlcmFkZGVkOiBbXSwgYWZ0ZXJ1cGRhdGVkOiBbXSwgYWZ0ZXJkaXNjYXJkZWQ6IFtdLCBhZnRlcnBoeENoaWxkQWRkZWQ6IFtdLFxuICAgICAgYWZ0ZXJ0cmFuc2l0aW9uc0Rpc2NhcmRlZDogW11cbiAgICB9XG4gIH1cblxuICBiZWZvcmUoa2luZCwgY2FsbGJhY2speyB0aGlzLmNhbGxiYWNrc1tgYmVmb3JlJHtraW5kfWBdLnB1c2goY2FsbGJhY2spIH1cbiAgYWZ0ZXIoa2luZCwgY2FsbGJhY2speyB0aGlzLmNhbGxiYWNrc1tgYWZ0ZXIke2tpbmR9YF0ucHVzaChjYWxsYmFjaykgfVxuXG4gIHRyYWNrQmVmb3JlKGtpbmQsIC4uLmFyZ3Mpe1xuICAgIHRoaXMuY2FsbGJhY2tzW2BiZWZvcmUke2tpbmR9YF0uZm9yRWFjaChjYWxsYmFjayA9PiBjYWxsYmFjayguLi5hcmdzKSlcbiAgfVxuXG4gIHRyYWNrQWZ0ZXIoa2luZCwgLi4uYXJncyl7XG4gICAgdGhpcy5jYWxsYmFja3NbYGFmdGVyJHtraW5kfWBdLmZvckVhY2goY2FsbGJhY2sgPT4gY2FsbGJhY2soLi4uYXJncykpXG4gIH1cblxuICBtYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpe1xuICAgIERPTS5hbGwodGhpcy5jb250YWluZXIsIFwiW3BoeC11cGRhdGU9YXBwZW5kXSA+ICosIFtwaHgtdXBkYXRlPXByZXBlbmRdID4gKlwiLCBlbCA9PiB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX1BSVU5FLCBcIlwiKVxuICAgIH0pXG4gIH1cblxuICBwZXJmb3JtKCl7XG4gICAgbGV0IHt2aWV3LCBsaXZlU29ja2V0LCBjb250YWluZXIsIGh0bWx9ID0gdGhpc1xuICAgIGxldCB0YXJnZXRDb250YWluZXIgPSB0aGlzLmlzQ0lEUGF0Y2goKSA/IHRoaXMudGFyZ2V0Q0lEQ29udGFpbmVyKGh0bWwpIDogY29udGFpbmVyXG4gICAgaWYodGhpcy5pc0NJRFBhdGNoKCkgJiYgIXRhcmdldENvbnRhaW5lcil7IHJldHVybiB9XG5cbiAgICBsZXQgZm9jdXNlZCA9IGxpdmVTb2NrZXQuZ2V0QWN0aXZlRWxlbWVudCgpXG4gICAgbGV0IHtzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kfSA9IGZvY3VzZWQgJiYgRE9NLmhhc1NlbGVjdGlvblJhbmdlKGZvY3VzZWQpID8gZm9jdXNlZCA6IHt9XG4gICAgbGV0IHBoeFVwZGF0ZSA9IGxpdmVTb2NrZXQuYmluZGluZyhQSFhfVVBEQVRFKVxuICAgIGxldCBwaHhGZWVkYmFja0ZvciA9IGxpdmVTb2NrZXQuYmluZGluZyhQSFhfRkVFREJBQ0tfRk9SKVxuICAgIGxldCBkaXNhYmxlV2l0aCA9IGxpdmVTb2NrZXQuYmluZGluZyhQSFhfRElTQUJMRV9XSVRIKVxuICAgIGxldCBwaHhUcmlnZ2VyRXh0ZXJuYWwgPSBsaXZlU29ja2V0LmJpbmRpbmcoUEhYX1RSSUdHRVJfQUNUSU9OKVxuICAgIGxldCBwaHhSZW1vdmUgPSBsaXZlU29ja2V0LmJpbmRpbmcoXCJyZW1vdmVcIilcbiAgICBsZXQgYWRkZWQgPSBbXVxuICAgIGxldCB1cGRhdGVzID0gW11cbiAgICBsZXQgYXBwZW5kUHJlcGVuZFVwZGF0ZXMgPSBbXVxuICAgIGxldCBwZW5kaW5nUmVtb3ZlcyA9IFtdXG4gICAgbGV0IGV4dGVybmFsRm9ybVRyaWdnZXJlZCA9IG51bGxcblxuICAgIGxldCBkaWZmSFRNTCA9IGxpdmVTb2NrZXQudGltZShcInByZW1vcnBoIGNvbnRhaW5lciBwcmVwXCIsICgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkRGlmZkhUTUwoY29udGFpbmVyLCBodG1sLCBwaHhVcGRhdGUsIHRhcmdldENvbnRhaW5lcilcbiAgICB9KVxuXG4gICAgdGhpcy50cmFja0JlZm9yZShcImFkZGVkXCIsIGNvbnRhaW5lcilcbiAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBjb250YWluZXIsIGNvbnRhaW5lcilcblxuICAgIGxpdmVTb2NrZXQudGltZShcIm1vcnBoZG9tXCIsICgpID0+IHtcbiAgICAgIG1vcnBoZG9tKHRhcmdldENvbnRhaW5lciwgZGlmZkhUTUwsIHtcbiAgICAgICAgY2hpbGRyZW5Pbmx5OiB0YXJnZXRDb250YWluZXIuZ2V0QXR0cmlidXRlKFBIWF9DT01QT05FTlQpID09PSBudWxsLFxuICAgICAgICBnZXROb2RlS2V5OiAobm9kZSkgPT4ge1xuICAgICAgICAgIHJldHVybiBET00uaXNQaHhEZXN0cm95ZWQobm9kZSkgPyBudWxsIDogbm9kZS5pZFxuICAgICAgICB9LFxuICAgICAgICBvbkJlZm9yZU5vZGVBZGRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgdGhpcy50cmFja0JlZm9yZShcImFkZGVkXCIsIGVsKVxuICAgICAgICAgIHJldHVybiBlbFxuICAgICAgICB9LFxuICAgICAgICBvbk5vZGVBZGRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgLy8gaGFjayB0byBmaXggU2FmYXJpIGhhbmRsaW5nIG9mIGltZyBzcmNzZXQgYW5kIHZpZGVvIHRhZ3NcbiAgICAgICAgICBpZihlbCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgZWwuc3Jjc2V0KXtcbiAgICAgICAgICAgIGVsLnNyY3NldCA9IGVsLnNyY3NldFxuICAgICAgICAgIH0gZWxzZSBpZihlbCBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgJiYgZWwuYXV0b3BsYXkpe1xuICAgICAgICAgICAgZWwucGxheSgpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKERPTS5pc05vd1RyaWdnZXJGb3JtRXh0ZXJuYWwoZWwsIHBoeFRyaWdnZXJFeHRlcm5hbCkpe1xuICAgICAgICAgICAgZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkID0gZWxcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9pbnB1dCBoYW5kbGluZ1xuICAgICAgICAgIERPTS5kaXNjYXJkRXJyb3IodGFyZ2V0Q29udGFpbmVyLCBlbCwgcGh4RmVlZGJhY2tGb3IpXG4gICAgICAgICAgLy8gbmVzdGVkIHZpZXcgaGFuZGxpbmdcbiAgICAgICAgICBpZigoRE9NLmlzUGh4Q2hpbGQoZWwpICYmIHZpZXcub3duc0VsZW1lbnQoZWwpKSB8fCBET00uaXNQaHhTdGlja3koZWwpICYmIHZpZXcub3duc0VsZW1lbnQoZWwucGFyZW50Tm9kZSkpe1xuICAgICAgICAgICAgdGhpcy50cmFja0FmdGVyKFwicGh4Q2hpbGRBZGRlZFwiLCBlbClcbiAgICAgICAgICB9XG4gICAgICAgICAgYWRkZWQucHVzaChlbClcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob2RlRGlzY2FyZGVkOiAoZWwpID0+IHtcbiAgICAgICAgICAvLyBuZXN0ZWQgdmlldyBoYW5kbGluZ1xuICAgICAgICAgIGlmKERPTS5pc1BoeENoaWxkKGVsKSB8fCBET00uaXNQaHhTdGlja3koZWwpKXsgbGl2ZVNvY2tldC5kZXN0cm95Vmlld0J5RWwoZWwpIH1cbiAgICAgICAgICB0aGlzLnRyYWNrQWZ0ZXIoXCJkaXNjYXJkZWRcIiwgZWwpXG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlTm9kZURpc2NhcmRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYoZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfUFJVTkUpICE9PSBudWxsKXsgcmV0dXJuIHRydWUgfVxuICAgICAgICAgIGlmKGVsLnBhcmVudE5vZGUgIT09IG51bGwgJiYgRE9NLmlzUGh4VXBkYXRlKGVsLnBhcmVudE5vZGUsIHBoeFVwZGF0ZSwgW1wiYXBwZW5kXCIsIFwicHJlcGVuZFwiXSkgJiYgZWwuaWQpeyByZXR1cm4gZmFsc2UgfVxuICAgICAgICAgIGlmKGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUocGh4UmVtb3ZlKSl7XG4gICAgICAgICAgICBwZW5kaW5nUmVtb3Zlcy5wdXNoKGVsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHRoaXMuc2tpcENJRFNpYmxpbmcoZWwpKXsgcmV0dXJuIGZhbHNlIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBvbkVsVXBkYXRlZDogKGVsKSA9PiB7XG4gICAgICAgICAgaWYoRE9NLmlzTm93VHJpZ2dlckZvcm1FeHRlcm5hbChlbCwgcGh4VHJpZ2dlckV4dGVybmFsKSl7XG4gICAgICAgICAgICBleHRlcm5hbEZvcm1UcmlnZ2VyZWQgPSBlbFxuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVzLnB1c2goZWwpXG4gICAgICAgIH0sXG4gICAgICAgIG9uQmVmb3JlRWxVcGRhdGVkOiAoZnJvbUVsLCB0b0VsKSA9PiB7XG4gICAgICAgICAgRE9NLmNsZWFuQ2hpbGROb2Rlcyh0b0VsLCBwaHhVcGRhdGUpXG4gICAgICAgICAgaWYodGhpcy5za2lwQ0lEU2libGluZyh0b0VsKSl7IHJldHVybiBmYWxzZSB9XG4gICAgICAgICAgaWYoRE9NLmlzUGh4U3RpY2t5KGZyb21FbCkpeyByZXR1cm4gZmFsc2UgfVxuICAgICAgICAgIGlmKERPTS5pc0lnbm9yZWQoZnJvbUVsLCBwaHhVcGRhdGUpKXtcbiAgICAgICAgICAgIHRoaXMudHJhY2tCZWZvcmUoXCJ1cGRhdGVkXCIsIGZyb21FbCwgdG9FbClcbiAgICAgICAgICAgIERPTS5tZXJnZUF0dHJzKGZyb21FbCwgdG9FbCwge2lzSWdub3JlZDogdHJ1ZX0pXG4gICAgICAgICAgICB1cGRhdGVzLnB1c2goZnJvbUVsKVxuICAgICAgICAgICAgRE9NLmFwcGx5U3RpY2t5T3BlcmF0aW9ucyhmcm9tRWwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYoZnJvbUVsLnR5cGUgPT09IFwibnVtYmVyXCIgJiYgKGZyb21FbC52YWxpZGl0eSAmJiBmcm9tRWwudmFsaWRpdHkuYmFkSW5wdXQpKXsgcmV0dXJuIGZhbHNlIH1cbiAgICAgICAgICBpZighRE9NLnN5bmNQZW5kaW5nUmVmKGZyb21FbCwgdG9FbCwgZGlzYWJsZVdpdGgpKXtcbiAgICAgICAgICAgIGlmKERPTS5pc1VwbG9hZElucHV0KGZyb21FbCkpe1xuICAgICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpXG4gICAgICAgICAgICAgIHVwZGF0ZXMucHVzaChmcm9tRWwpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKGZyb21FbClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIG5lc3RlZCB2aWV3IGhhbmRsaW5nXG4gICAgICAgICAgaWYoRE9NLmlzUGh4Q2hpbGQodG9FbCkpe1xuICAgICAgICAgICAgbGV0IHByZXZTZXNzaW9uID0gZnJvbUVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTilcbiAgICAgICAgICAgIERPTS5tZXJnZUF0dHJzKGZyb21FbCwgdG9FbCwge2V4Y2x1ZGU6IFtQSFhfU1RBVElDXX0pXG4gICAgICAgICAgICBpZihwcmV2U2Vzc2lvbiAhPT0gXCJcIil7IGZyb21FbC5zZXRBdHRyaWJ1dGUoUEhYX1NFU1NJT04sIHByZXZTZXNzaW9uKSB9XG4gICAgICAgICAgICBmcm9tRWwuc2V0QXR0cmlidXRlKFBIWF9ST09UX0lELCB0aGlzLnJvb3RJRClcbiAgICAgICAgICAgIERPTS5hcHBseVN0aWNreU9wZXJhdGlvbnMoZnJvbUVsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaW5wdXQgaGFuZGxpbmdcbiAgICAgICAgICBET00uY29weVByaXZhdGVzKHRvRWwsIGZyb21FbClcbiAgICAgICAgICBET00uZGlzY2FyZEVycm9yKHRhcmdldENvbnRhaW5lciwgdG9FbCwgcGh4RmVlZGJhY2tGb3IpXG5cbiAgICAgICAgICBsZXQgaXNGb2N1c2VkRm9ybUVsID0gZm9jdXNlZCAmJiBmcm9tRWwuaXNTYW1lTm9kZShmb2N1c2VkKSAmJiBET00uaXNGb3JtSW5wdXQoZnJvbUVsKVxuICAgICAgICAgIGlmKGlzRm9jdXNlZEZvcm1FbCl7XG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpXG4gICAgICAgICAgICBET00ubWVyZ2VGb2N1c2VkSW5wdXQoZnJvbUVsLCB0b0VsKVxuICAgICAgICAgICAgRE9NLnN5bmNBdHRyc1RvUHJvcHMoZnJvbUVsKVxuICAgICAgICAgICAgdXBkYXRlcy5wdXNoKGZyb21FbClcbiAgICAgICAgICAgIERPTS5hcHBseVN0aWNreU9wZXJhdGlvbnMoZnJvbUVsKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmKERPTS5pc1BoeFVwZGF0ZSh0b0VsLCBwaHhVcGRhdGUsIFtcImFwcGVuZFwiLCBcInByZXBlbmRcIl0pKXtcbiAgICAgICAgICAgICAgYXBwZW5kUHJlcGVuZFVwZGF0ZXMucHVzaChuZXcgRE9NUG9zdE1vcnBoUmVzdG9yZXIoZnJvbUVsLCB0b0VsLCB0b0VsLmdldEF0dHJpYnV0ZShwaHhVcGRhdGUpKSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIERPTS5zeW5jQXR0cnNUb1Byb3BzKHRvRWwpXG4gICAgICAgICAgICBET00uYXBwbHlTdGlja3lPcGVyYXRpb25zKHRvRWwpXG4gICAgICAgICAgICB0aGlzLnRyYWNrQmVmb3JlKFwidXBkYXRlZFwiLCBmcm9tRWwsIHRvRWwpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaWYobGl2ZVNvY2tldC5pc0RlYnVnRW5hYmxlZCgpKXsgZGV0ZWN0RHVwbGljYXRlSWRzKCkgfVxuXG4gICAgaWYoYXBwZW5kUHJlcGVuZFVwZGF0ZXMubGVuZ3RoID4gMCl7XG4gICAgICBsaXZlU29ja2V0LnRpbWUoXCJwb3N0LW1vcnBoIGFwcGVuZC9wcmVwZW5kIHJlc3RvcmF0aW9uXCIsICgpID0+IHtcbiAgICAgICAgYXBwZW5kUHJlcGVuZFVwZGF0ZXMuZm9yRWFjaCh1cGRhdGUgPT4gdXBkYXRlLnBlcmZvcm0oKSlcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgbGl2ZVNvY2tldC5zaWxlbmNlRXZlbnRzKCgpID0+IERPTS5yZXN0b3JlRm9jdXMoZm9jdXNlZCwgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCkpXG4gICAgRE9NLmRpc3BhdGNoRXZlbnQoZG9jdW1lbnQsIFwicGh4OnVwZGF0ZVwiKVxuICAgIGFkZGVkLmZvckVhY2goZWwgPT4gdGhpcy50cmFja0FmdGVyKFwiYWRkZWRcIiwgZWwpKVxuICAgIHVwZGF0ZXMuZm9yRWFjaChlbCA9PiB0aGlzLnRyYWNrQWZ0ZXIoXCJ1cGRhdGVkXCIsIGVsKSlcblxuICAgIGlmKHBlbmRpbmdSZW1vdmVzLmxlbmd0aCA+IDApe1xuICAgICAgbGl2ZVNvY2tldC50cmFuc2l0aW9uUmVtb3ZlcyhwZW5kaW5nUmVtb3ZlcylcbiAgICAgIGxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmVzLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgIGxldCBjaGlsZCA9IERPTS5maXJzdFBoeENoaWxkKGVsKVxuICAgICAgICAgIGlmKGNoaWxkKXsgbGl2ZVNvY2tldC5kZXN0cm95Vmlld0J5RWwoY2hpbGQpIH1cbiAgICAgICAgICBlbC5yZW1vdmUoKVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnRyYWNrQWZ0ZXIoXCJ0cmFuc2l0aW9uc0Rpc2NhcmRlZFwiLCBwZW5kaW5nUmVtb3ZlcylcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYoZXh0ZXJuYWxGb3JtVHJpZ2dlcmVkKXtcbiAgICAgIGxpdmVTb2NrZXQuZGlzY29ubmVjdCgpXG4gICAgICBleHRlcm5hbEZvcm1UcmlnZ2VyZWQuc3VibWl0KClcbiAgICB9XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlzQ0lEUGF0Y2goKXsgcmV0dXJuIHRoaXMuY2lkUGF0Y2ggfVxuXG4gIHNraXBDSURTaWJsaW5nKGVsKXtcbiAgICByZXR1cm4gZWwubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfU0tJUCkgIT09IG51bGxcbiAgfVxuXG4gIHRhcmdldENJRENvbnRhaW5lcihodG1sKXtcbiAgICBpZighdGhpcy5pc0NJRFBhdGNoKCkpeyByZXR1cm4gfVxuICAgIGxldCBbZmlyc3QsIC4uLnJlc3RdID0gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmNvbnRhaW5lciwgdGhpcy50YXJnZXRDSUQpXG4gICAgaWYocmVzdC5sZW5ndGggPT09IDAgJiYgRE9NLmNoaWxkTm9kZUxlbmd0aChodG1sKSA9PT0gMSl7XG4gICAgICByZXR1cm4gZmlyc3RcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpcnN0ICYmIGZpcnN0LnBhcmVudE5vZGVcbiAgICB9XG4gIH1cblxuICAvLyBidWlsZHMgSFRNTCBmb3IgbW9ycGhkb20gcGF0Y2hcbiAgLy8gLSBmb3IgZnVsbCBwYXRjaGVzIG9mIExpdmVWaWV3IG9yIGEgY29tcG9uZW50IHdpdGggYSBzaW5nbGVcbiAgLy8gICByb290IG5vZGUsIHNpbXBseSByZXR1cm5zIHRoZSBIVE1MXG4gIC8vIC0gZm9yIHBhdGNoZXMgb2YgYSBjb21wb25lbnQgd2l0aCBtdWx0aXBsZSByb290IG5vZGVzLCB0aGVcbiAgLy8gICBwYXJlbnQgbm9kZSBiZWNvbWVzIHRoZSB0YXJnZXQgY29udGFpbmVyIGFuZCBub24tY29tcG9uZW50XG4gIC8vICAgc2libGluZ3MgYXJlIG1hcmtlZCBhcyBza2lwLlxuICBidWlsZERpZmZIVE1MKGNvbnRhaW5lciwgaHRtbCwgcGh4VXBkYXRlLCB0YXJnZXRDb250YWluZXIpe1xuICAgIGxldCBpc0NJRFBhdGNoID0gdGhpcy5pc0NJRFBhdGNoKClcbiAgICBsZXQgaXNDSURXaXRoU2luZ2xlUm9vdCA9IGlzQ0lEUGF0Y2ggJiYgdGFyZ2V0Q29udGFpbmVyLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSA9PT0gdGhpcy50YXJnZXRDSUQudG9TdHJpbmcoKVxuICAgIGlmKCFpc0NJRFBhdGNoIHx8IGlzQ0lEV2l0aFNpbmdsZVJvb3Qpe1xuICAgICAgcmV0dXJuIGh0bWxcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29tcG9uZW50IHBhdGNoIHdpdGggbXVsdGlwbGUgQ0lEIHJvb3RzXG4gICAgICBsZXQgZGlmZkNvbnRhaW5lciA9IG51bGxcbiAgICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgICAgZGlmZkNvbnRhaW5lciA9IERPTS5jbG9uZU5vZGUodGFyZ2V0Q29udGFpbmVyKVxuICAgICAgbGV0IFtmaXJzdENvbXBvbmVudCwgLi4ucmVzdF0gPSBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KGRpZmZDb250YWluZXIsIHRoaXMudGFyZ2V0Q0lEKVxuICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbFxuICAgICAgcmVzdC5mb3JFYWNoKGVsID0+IGVsLnJlbW92ZSgpKVxuICAgICAgQXJyYXkuZnJvbShkaWZmQ29udGFpbmVyLmNoaWxkTm9kZXMpLmZvckVhY2goY2hpbGQgPT4ge1xuICAgICAgICAvLyB3ZSBjYW4gb25seSBza2lwIHRyYWNrYWJsZSBub2RlcyB3aXRoIGFuIElEXG4gICAgICAgIGlmKGNoaWxkLmlkICYmIGNoaWxkLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjaGlsZC5nZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVCkgIT09IHRoaXMudGFyZ2V0Q0lELnRvU3RyaW5nKCkpe1xuICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShQSFhfU0tJUCwgXCJcIilcbiAgICAgICAgICBjaGlsZC5pbm5lckhUTUwgPSBcIlwiXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBBcnJheS5mcm9tKHRlbXBsYXRlLmNvbnRlbnQuY2hpbGROb2RlcykuZm9yRWFjaChlbCA9PiBkaWZmQ29udGFpbmVyLmluc2VydEJlZm9yZShlbCwgZmlyc3RDb21wb25lbnQpKVxuICAgICAgZmlyc3RDb21wb25lbnQucmVtb3ZlKClcbiAgICAgIHJldHVybiBkaWZmQ29udGFpbmVyLm91dGVySFRNTFxuICAgIH1cbiAgfVxufVxuIiwgImltcG9ydCB7XG4gIENPTVBPTkVOVFMsXG4gIERZTkFNSUNTLFxuICBURU1QTEFURVMsXG4gIEVWRU5UUyxcbiAgUEhYX0NPTVBPTkVOVCxcbiAgUEhYX1NLSVAsXG4gIFJFUExZLFxuICBTVEFUSUMsXG4gIFRJVExFXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGlzT2JqZWN0LFxuICBsb2dFcnJvcixcbiAgaXNDaWQsXG59IGZyb20gXCIuL3V0aWxzXCJcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVuZGVyZWQge1xuICBzdGF0aWMgZXh0cmFjdChkaWZmKXtcbiAgICBsZXQge1tSRVBMWV06IHJlcGx5LCBbRVZFTlRTXTogZXZlbnRzLCBbVElUTEVdOiB0aXRsZX0gPSBkaWZmXG4gICAgZGVsZXRlIGRpZmZbUkVQTFldXG4gICAgZGVsZXRlIGRpZmZbRVZFTlRTXVxuICAgIGRlbGV0ZSBkaWZmW1RJVExFXVxuICAgIHJldHVybiB7ZGlmZiwgdGl0bGUsIHJlcGx5OiByZXBseSB8fCBudWxsLCBldmVudHM6IGV2ZW50cyB8fCBbXX1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHZpZXdJZCwgcmVuZGVyZWQpe1xuICAgIHRoaXMudmlld0lkID0gdmlld0lkXG4gICAgdGhpcy5yZW5kZXJlZCA9IHt9XG4gICAgdGhpcy5tZXJnZURpZmYocmVuZGVyZWQpXG4gIH1cblxuICBwYXJlbnRWaWV3SWQoKXsgcmV0dXJuIHRoaXMudmlld0lkIH1cblxuICB0b1N0cmluZyhvbmx5Q2lkcyl7XG4gICAgcmV0dXJuIHRoaXMucmVjdXJzaXZlVG9TdHJpbmcodGhpcy5yZW5kZXJlZCwgdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSwgb25seUNpZHMpXG4gIH1cblxuICByZWN1cnNpdmVUb1N0cmluZyhyZW5kZXJlZCwgY29tcG9uZW50cyA9IHJlbmRlcmVkW0NPTVBPTkVOVFNdLCBvbmx5Q2lkcyl7XG4gICAgb25seUNpZHMgPSBvbmx5Q2lkcyA/IG5ldyBTZXQob25seUNpZHMpIDogbnVsbFxuICAgIGxldCBvdXRwdXQgPSB7YnVmZmVyOiBcIlwiLCBjb21wb25lbnRzOiBjb21wb25lbnRzLCBvbmx5Q2lkczogb25seUNpZHN9XG4gICAgdGhpcy50b091dHB1dEJ1ZmZlcihyZW5kZXJlZCwgbnVsbCwgb3V0cHV0KVxuICAgIHJldHVybiBvdXRwdXQuYnVmZmVyXG4gIH1cblxuICBjb21wb25lbnRDSURzKGRpZmYpeyByZXR1cm4gT2JqZWN0LmtleXMoZGlmZltDT01QT05FTlRTXSB8fCB7fSkubWFwKGkgPT4gcGFyc2VJbnQoaSkpIH1cblxuICBpc0NvbXBvbmVudE9ubHlEaWZmKGRpZmYpe1xuICAgIGlmKCFkaWZmW0NPTVBPTkVOVFNdKXsgcmV0dXJuIGZhbHNlIH1cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZGlmZikubGVuZ3RoID09PSAxXG4gIH1cblxuICBnZXRDb21wb25lbnQoZGlmZiwgY2lkKXsgcmV0dXJuIGRpZmZbQ09NUE9ORU5UU11bY2lkXSB9XG5cbiAgbWVyZ2VEaWZmKGRpZmYpe1xuICAgIGxldCBuZXdjID0gZGlmZltDT01QT05FTlRTXVxuICAgIGxldCBjYWNoZSA9IHt9XG4gICAgZGVsZXRlIGRpZmZbQ09NUE9ORU5UU11cbiAgICB0aGlzLnJlbmRlcmVkID0gdGhpcy5tdXRhYmxlTWVyZ2UodGhpcy5yZW5kZXJlZCwgZGlmZilcbiAgICB0aGlzLnJlbmRlcmVkW0NPTVBPTkVOVFNdID0gdGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSB8fCB7fVxuXG4gICAgaWYobmV3Yyl7XG4gICAgICBsZXQgb2xkYyA9IHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU11cblxuICAgICAgZm9yKGxldCBjaWQgaW4gbmV3Yyl7XG4gICAgICAgIG5ld2NbY2lkXSA9IHRoaXMuY2FjaGVkRmluZENvbXBvbmVudChjaWQsIG5ld2NbY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpXG4gICAgICB9XG5cbiAgICAgIGZvcihsZXQgY2lkIGluIG5ld2MpeyBvbGRjW2NpZF0gPSBuZXdjW2NpZF0gfVxuICAgICAgZGlmZltDT01QT05FTlRTXSA9IG5ld2NcbiAgICB9XG4gIH1cblxuICBjYWNoZWRGaW5kQ29tcG9uZW50KGNpZCwgY2RpZmYsIG9sZGMsIG5ld2MsIGNhY2hlKXtcbiAgICBpZihjYWNoZVtjaWRdKXtcbiAgICAgIHJldHVybiBjYWNoZVtjaWRdXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBuZGlmZiwgc3RhdCwgc2NpZCA9IGNkaWZmW1NUQVRJQ11cblxuICAgICAgaWYoaXNDaWQoc2NpZCkpe1xuICAgICAgICBsZXQgdGRpZmZcblxuICAgICAgICBpZihzY2lkID4gMCl7XG4gICAgICAgICAgdGRpZmYgPSB0aGlzLmNhY2hlZEZpbmRDb21wb25lbnQoc2NpZCwgbmV3Y1tzY2lkXSwgb2xkYywgbmV3YywgY2FjaGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGRpZmYgPSBvbGRjWy1zY2lkXVxuICAgICAgICB9XG5cbiAgICAgICAgc3RhdCA9IHRkaWZmW1NUQVRJQ11cbiAgICAgICAgbmRpZmYgPSB0aGlzLmNsb25lTWVyZ2UodGRpZmYsIGNkaWZmKVxuICAgICAgICBuZGlmZltTVEFUSUNdID0gc3RhdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmRpZmYgPSBjZGlmZltTVEFUSUNdICE9PSB1bmRlZmluZWQgPyBjZGlmZiA6IHRoaXMuY2xvbmVNZXJnZShvbGRjW2NpZF0gfHwge30sIGNkaWZmKVxuICAgICAgfVxuXG4gICAgICBjYWNoZVtjaWRdID0gbmRpZmZcbiAgICAgIHJldHVybiBuZGlmZlxuICAgIH1cbiAgfVxuXG4gIG11dGFibGVNZXJnZSh0YXJnZXQsIHNvdXJjZSl7XG4gICAgaWYoc291cmNlW1NUQVRJQ10gIT09IHVuZGVmaW5lZCl7XG4gICAgICByZXR1cm4gc291cmNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZG9NdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2UpXG4gICAgICByZXR1cm4gdGFyZ2V0XG4gICAgfVxuICB9XG5cbiAgZG9NdXRhYmxlTWVyZ2UodGFyZ2V0LCBzb3VyY2Upe1xuICAgIGZvcihsZXQga2V5IGluIHNvdXJjZSl7XG4gICAgICBsZXQgdmFsID0gc291cmNlW2tleV1cbiAgICAgIGxldCB0YXJnZXRWYWwgPSB0YXJnZXRba2V5XVxuICAgICAgaWYoaXNPYmplY3QodmFsKSAmJiB2YWxbU1RBVElDXSA9PT0gdW5kZWZpbmVkICYmIGlzT2JqZWN0KHRhcmdldFZhbCkpe1xuICAgICAgICB0aGlzLmRvTXV0YWJsZU1lcmdlKHRhcmdldFZhbCwgdmFsKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0W2tleV0gPSB2YWxcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbG9uZU1lcmdlKHRhcmdldCwgc291cmNlKXtcbiAgICBsZXQgbWVyZ2VkID0gey4uLnRhcmdldCwgLi4uc291cmNlfVxuICAgIGZvcihsZXQga2V5IGluIG1lcmdlZCl7XG4gICAgICBsZXQgdmFsID0gc291cmNlW2tleV1cbiAgICAgIGxldCB0YXJnZXRWYWwgPSB0YXJnZXRba2V5XVxuICAgICAgaWYoaXNPYmplY3QodmFsKSAmJiB2YWxbU1RBVElDXSA9PT0gdW5kZWZpbmVkICYmIGlzT2JqZWN0KHRhcmdldFZhbCkpe1xuICAgICAgICBtZXJnZWRba2V5XSA9IHRoaXMuY2xvbmVNZXJnZSh0YXJnZXRWYWwsIHZhbClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1lcmdlZFxuICB9XG5cbiAgY29tcG9uZW50VG9TdHJpbmcoY2lkKXsgcmV0dXJuIHRoaXMucmVjdXJzaXZlQ0lEVG9TdHJpbmcodGhpcy5yZW5kZXJlZFtDT01QT05FTlRTXSwgY2lkKSB9XG5cbiAgcHJ1bmVDSURzKGNpZHMpe1xuICAgIGNpZHMuZm9yRWFjaChjaWQgPT4gZGVsZXRlIHRoaXMucmVuZGVyZWRbQ09NUE9ORU5UU11bY2lkXSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICBnZXQoKXsgcmV0dXJuIHRoaXMucmVuZGVyZWQgfVxuXG4gIGlzTmV3RmluZ2VycHJpbnQoZGlmZiA9IHt9KXsgcmV0dXJuICEhZGlmZltTVEFUSUNdIH1cblxuICB0ZW1wbGF0ZVN0YXRpYyhwYXJ0LCB0ZW1wbGF0ZXMpe1xuICAgIGlmKHR5cGVvZiAocGFydCkgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiB0ZW1wbGF0ZXNbcGFydF1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHBhcnRcbiAgICB9XG4gIH1cblxuICB0b091dHB1dEJ1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQpe1xuICAgIGlmKHJlbmRlcmVkW0RZTkFNSUNTXSl7IHJldHVybiB0aGlzLmNvbXByZWhlbnNpb25Ub0J1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQpIH1cbiAgICBsZXQge1tTVEFUSUNdOiBzdGF0aWNzfSA9IHJlbmRlcmVkXG4gICAgc3RhdGljcyA9IHRoaXMudGVtcGxhdGVTdGF0aWMoc3RhdGljcywgdGVtcGxhdGVzKVxuXG4gICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzWzBdXG4gICAgZm9yKGxldCBpID0gMTsgaSA8IHN0YXRpY3MubGVuZ3RoOyBpKyspe1xuICAgICAgdGhpcy5keW5hbWljVG9CdWZmZXIocmVuZGVyZWRbaSAtIDFdLCB0ZW1wbGF0ZXMsIG91dHB1dClcbiAgICAgIG91dHB1dC5idWZmZXIgKz0gc3RhdGljc1tpXVxuICAgIH1cbiAgfVxuXG4gIGNvbXByZWhlbnNpb25Ub0J1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQpe1xuICAgIGxldCB7W0RZTkFNSUNTXTogZHluYW1pY3MsIFtTVEFUSUNdOiBzdGF0aWNzfSA9IHJlbmRlcmVkXG4gICAgc3RhdGljcyA9IHRoaXMudGVtcGxhdGVTdGF0aWMoc3RhdGljcywgdGVtcGxhdGVzKVxuICAgIGxldCBjb21wVGVtcGxhdGVzID0gdGVtcGxhdGVzIHx8IHJlbmRlcmVkW1RFTVBMQVRFU11cblxuICAgIGZvcihsZXQgZCA9IDA7IGQgPCBkeW5hbWljcy5sZW5ndGg7IGQrKyl7XG4gICAgICBsZXQgZHluYW1pYyA9IGR5bmFtaWNzW2RdXG4gICAgICBvdXRwdXQuYnVmZmVyICs9IHN0YXRpY3NbMF1cbiAgICAgIGZvcihsZXQgaSA9IDE7IGkgPCBzdGF0aWNzLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgdGhpcy5keW5hbWljVG9CdWZmZXIoZHluYW1pY1tpIC0gMV0sIGNvbXBUZW1wbGF0ZXMsIG91dHB1dClcbiAgICAgICAgb3V0cHV0LmJ1ZmZlciArPSBzdGF0aWNzW2ldXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZHluYW1pY1RvQnVmZmVyKHJlbmRlcmVkLCB0ZW1wbGF0ZXMsIG91dHB1dCl7XG4gICAgaWYodHlwZW9mIChyZW5kZXJlZCkgPT09IFwibnVtYmVyXCIpe1xuICAgICAgb3V0cHV0LmJ1ZmZlciArPSB0aGlzLnJlY3Vyc2l2ZUNJRFRvU3RyaW5nKG91dHB1dC5jb21wb25lbnRzLCByZW5kZXJlZCwgb3V0cHV0Lm9ubHlDaWRzKVxuICAgIH0gZWxzZSBpZihpc09iamVjdChyZW5kZXJlZCkpe1xuICAgICAgdGhpcy50b091dHB1dEJ1ZmZlcihyZW5kZXJlZCwgdGVtcGxhdGVzLCBvdXRwdXQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5idWZmZXIgKz0gcmVuZGVyZWRcbiAgICB9XG4gIH1cblxuICByZWN1cnNpdmVDSURUb1N0cmluZyhjb21wb25lbnRzLCBjaWQsIG9ubHlDaWRzKXtcbiAgICBsZXQgY29tcG9uZW50ID0gY29tcG9uZW50c1tjaWRdIHx8IGxvZ0Vycm9yKGBubyBjb21wb25lbnQgZm9yIENJRCAke2NpZH1gLCBjb21wb25lbnRzKVxuICAgIGxldCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiKVxuICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHRoaXMucmVjdXJzaXZlVG9TdHJpbmcoY29tcG9uZW50LCBjb21wb25lbnRzLCBvbmx5Q2lkcylcbiAgICBsZXQgY29udGFpbmVyID0gdGVtcGxhdGUuY29udGVudFxuICAgIGxldCBza2lwID0gb25seUNpZHMgJiYgIW9ubHlDaWRzLmhhcyhjaWQpXG5cbiAgICBsZXQgW2hhc0NoaWxkTm9kZXMsIGhhc0NoaWxkQ29tcG9uZW50c10gPVxuICAgICAgQXJyYXkuZnJvbShjb250YWluZXIuY2hpbGROb2RlcykucmVkdWNlKChbaGFzTm9kZXMsIGhhc0NvbXBvbmVudHNdLCBjaGlsZCwgaSkgPT4ge1xuICAgICAgICBpZihjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpe1xuICAgICAgICAgIGlmKGNoaWxkLmdldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5UKSl7XG4gICAgICAgICAgICByZXR1cm4gW2hhc05vZGVzLCB0cnVlXVxuICAgICAgICAgIH1cbiAgICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVCwgY2lkKVxuICAgICAgICAgIGlmKCFjaGlsZC5pZCl7IGNoaWxkLmlkID0gYCR7dGhpcy5wYXJlbnRWaWV3SWQoKX0tJHtjaWR9LSR7aX1gIH1cbiAgICAgICAgICBpZihza2lwKXtcbiAgICAgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZShQSFhfU0tJUCwgXCJcIilcbiAgICAgICAgICAgIGNoaWxkLmlubmVySFRNTCA9IFwiXCJcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFt0cnVlLCBoYXNDb21wb25lbnRzXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmKGNoaWxkLm5vZGVWYWx1ZS50cmltKCkgIT09IFwiXCIpe1xuICAgICAgICAgICAgbG9nRXJyb3IoXCJvbmx5IEhUTUwgZWxlbWVudCB0YWdzIGFyZSBhbGxvd2VkIGF0IHRoZSByb290IG9mIGNvbXBvbmVudHMuXFxuXFxuXCIgK1xuICAgICAgICAgICAgICBgZ290OiBcIiR7Y2hpbGQubm9kZVZhbHVlLnRyaW0oKX1cIlxcblxcbmAgK1xuICAgICAgICAgICAgICBcIndpdGhpbjpcXG5cIiwgdGVtcGxhdGUuaW5uZXJIVE1MLnRyaW0oKSlcbiAgICAgICAgICAgIGNoaWxkLnJlcGxhY2VXaXRoKHRoaXMuY3JlYXRlU3BhbihjaGlsZC5ub2RlVmFsdWUsIGNpZCkpXG4gICAgICAgICAgICByZXR1cm4gW3RydWUsIGhhc0NvbXBvbmVudHNdXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoaWxkLnJlbW92ZSgpXG4gICAgICAgICAgICByZXR1cm4gW2hhc05vZGVzLCBoYXNDb21wb25lbnRzXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgW2ZhbHNlLCBmYWxzZV0pXG5cbiAgICBpZighaGFzQ2hpbGROb2RlcyAmJiAhaGFzQ2hpbGRDb21wb25lbnRzKXtcbiAgICAgIGxvZ0Vycm9yKFwiZXhwZWN0ZWQgYXQgbGVhc3Qgb25lIEhUTUwgZWxlbWVudCB0YWcgaW5zaWRlIGEgY29tcG9uZW50LCBidXQgdGhlIGNvbXBvbmVudCBpcyBlbXB0eTpcXG5cIixcbiAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MLnRyaW0oKSlcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVNwYW4oXCJcIiwgY2lkKS5vdXRlckhUTUxcbiAgICB9IGVsc2UgaWYoIWhhc0NoaWxkTm9kZXMgJiYgaGFzQ2hpbGRDb21wb25lbnRzKXtcbiAgICAgIGxvZ0Vycm9yKFwiZXhwZWN0ZWQgYXQgbGVhc3Qgb25lIEhUTUwgZWxlbWVudCB0YWcgZGlyZWN0bHkgaW5zaWRlIGEgY29tcG9uZW50LCBidXQgb25seSBzdWJjb21wb25lbnRzIHdlcmUgZm91bmQuIEEgY29tcG9uZW50IG11c3QgcmVuZGVyIGF0IGxlYXN0IG9uZSBIVE1MIHRhZyBkaXJlY3RseSBpbnNpZGUgaXRzZWxmLlwiLFxuICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwudHJpbSgpKVxuICAgICAgcmV0dXJuIHRlbXBsYXRlLmlubmVySFRNTFxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGVtcGxhdGUuaW5uZXJIVE1MXG4gICAgfVxuICB9XG5cbiAgY3JlYXRlU3Bhbih0ZXh0LCBjaWQpe1xuICAgIGxldCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIilcbiAgICBzcGFuLmlubmVyVGV4dCA9IHRleHRcbiAgICBzcGFuLnNldEF0dHJpYnV0ZShQSFhfQ09NUE9ORU5ULCBjaWQpXG4gICAgcmV0dXJuIHNwYW5cbiAgfVxufVxuIiwgImxldCB2aWV3SG9va0lEID0gMVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlld0hvb2sge1xuICBzdGF0aWMgbWFrZUlEKCl7IHJldHVybiB2aWV3SG9va0lEKysgfVxuICBzdGF0aWMgZWxlbWVudElEKGVsKXsgcmV0dXJuIGVsLnBoeEhvb2tJZCB9XG5cbiAgY29uc3RydWN0b3IodmlldywgZWwsIGNhbGxiYWNrcyl7XG4gICAgdGhpcy5fX3ZpZXcgPSB2aWV3XG4gICAgdGhpcy5fX2xpdmVTb2NrZXQgPSB2aWV3LmxpdmVTb2NrZXRcbiAgICB0aGlzLl9fY2FsbGJhY2tzID0gY2FsbGJhY2tzXG4gICAgdGhpcy5fX2xpc3RlbmVycyA9IG5ldyBTZXQoKVxuICAgIHRoaXMuX19pc0Rpc2Nvbm5lY3RlZCA9IGZhbHNlXG4gICAgdGhpcy5lbCA9IGVsXG4gICAgdGhpcy5lbC5waHhIb29rSWQgPSB0aGlzLmNvbnN0cnVjdG9yLm1ha2VJRCgpXG4gICAgZm9yKGxldCBrZXkgaW4gdGhpcy5fX2NhbGxiYWNrcyl7IHRoaXNba2V5XSA9IHRoaXMuX19jYWxsYmFja3Nba2V5XSB9XG4gIH1cblxuICBfX21vdW50ZWQoKXsgdGhpcy5tb3VudGVkICYmIHRoaXMubW91bnRlZCgpIH1cbiAgX191cGRhdGVkKCl7IHRoaXMudXBkYXRlZCAmJiB0aGlzLnVwZGF0ZWQoKSB9XG4gIF9fYmVmb3JlVXBkYXRlKCl7IHRoaXMuYmVmb3JlVXBkYXRlICYmIHRoaXMuYmVmb3JlVXBkYXRlKCkgfVxuICBfX2Rlc3Ryb3llZCgpeyB0aGlzLmRlc3Ryb3llZCAmJiB0aGlzLmRlc3Ryb3llZCgpIH1cbiAgX19yZWNvbm5lY3RlZCgpe1xuICAgIGlmKHRoaXMuX19pc0Rpc2Nvbm5lY3RlZCl7XG4gICAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSBmYWxzZVxuICAgICAgdGhpcy5yZWNvbm5lY3RlZCAmJiB0aGlzLnJlY29ubmVjdGVkKClcbiAgICB9XG4gIH1cbiAgX19kaXNjb25uZWN0ZWQoKXtcbiAgICB0aGlzLl9faXNEaXNjb25uZWN0ZWQgPSB0cnVlXG4gICAgdGhpcy5kaXNjb25uZWN0ZWQgJiYgdGhpcy5kaXNjb25uZWN0ZWQoKVxuICB9XG5cbiAgcHVzaEV2ZW50KGV2ZW50LCBwYXlsb2FkID0ge30sIG9uUmVwbHkgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3LnB1c2hIb29rRXZlbnQobnVsbCwgZXZlbnQsIHBheWxvYWQsIG9uUmVwbHkpXG4gIH1cblxuICBwdXNoRXZlbnRUbyhwaHhUYXJnZXQsIGV2ZW50LCBwYXlsb2FkID0ge30sIG9uUmVwbHkgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3LndpdGhpblRhcmdldHMocGh4VGFyZ2V0LCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICByZXR1cm4gdmlldy5wdXNoSG9va0V2ZW50KHRhcmdldEN0eCwgZXZlbnQsIHBheWxvYWQsIG9uUmVwbHkpXG4gICAgfSlcbiAgfVxuXG4gIGhhbmRsZUV2ZW50KGV2ZW50LCBjYWxsYmFjayl7XG4gICAgbGV0IGNhbGxiYWNrUmVmID0gKGN1c3RvbUV2ZW50LCBieXBhc3MpID0+IGJ5cGFzcyA/IGV2ZW50IDogY2FsbGJhY2soY3VzdG9tRXZlbnQuZGV0YWlsKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGBwaHg6JHtldmVudH1gLCBjYWxsYmFja1JlZilcbiAgICB0aGlzLl9fbGlzdGVuZXJzLmFkZChjYWxsYmFja1JlZilcbiAgICByZXR1cm4gY2FsbGJhY2tSZWZcbiAgfVxuXG4gIHJlbW92ZUhhbmRsZUV2ZW50KGNhbGxiYWNrUmVmKXtcbiAgICBsZXQgZXZlbnQgPSBjYWxsYmFja1JlZihudWxsLCB0cnVlKVxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGBwaHg6JHtldmVudH1gLCBjYWxsYmFja1JlZilcbiAgICB0aGlzLl9fbGlzdGVuZXJzLmRlbGV0ZShjYWxsYmFja1JlZilcbiAgfVxuXG4gIHVwbG9hZChuYW1lLCBmaWxlcyl7XG4gICAgcmV0dXJuIHRoaXMuX192aWV3LmRpc3BhdGNoVXBsb2FkcyhuYW1lLCBmaWxlcylcbiAgfVxuXG4gIHVwbG9hZFRvKHBoeFRhcmdldCwgbmFtZSwgZmlsZXMpe1xuICAgIHJldHVybiB0aGlzLl9fdmlldy53aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgdmlldyA9PiB2aWV3LmRpc3BhdGNoVXBsb2FkcyhuYW1lLCBmaWxlcykpXG4gIH1cblxuICBfX2NsZWFudXBfXygpe1xuICAgIHRoaXMuX19saXN0ZW5lcnMuZm9yRWFjaChjYWxsYmFja1JlZiA9PiB0aGlzLnJlbW92ZUhhbmRsZUV2ZW50KGNhbGxiYWNrUmVmKSlcbiAgfVxufVxuIiwgImltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcblxubGV0IEpTID0ge1xuICBleGVjKGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBkZWZhdWx0cyl7XG4gICAgbGV0IFtkZWZhdWx0S2luZCwgZGVmYXVsdEFyZ3NdID0gZGVmYXVsdHMgfHwgW251bGwsIHt9XVxuICAgIGxldCBjb21tYW5kcyA9IHBoeEV2ZW50LmNoYXJBdCgwKSA9PT0gXCJbXCIgP1xuICAgICAgSlNPTi5wYXJzZShwaHhFdmVudCkgOiBbW2RlZmF1bHRLaW5kLCBkZWZhdWx0QXJnc11dXG5cbiAgICBjb21tYW5kcy5mb3JFYWNoKChba2luZCwgYXJnc10pID0+IHtcbiAgICAgIGlmKGtpbmQgPT09IGRlZmF1bHRLaW5kICYmIGRlZmF1bHRBcmdzLmRhdGEpe1xuICAgICAgICBhcmdzLmRhdGEgPSBPYmplY3QuYXNzaWduKGFyZ3MuZGF0YSB8fCB7fSwgZGVmYXVsdEFyZ3MuZGF0YSlcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlsdGVyVG9FbHMoc291cmNlRWwsIGFyZ3MpLmZvckVhY2goZWwgPT4ge1xuICAgICAgICB0aGlzW2BleGVjXyR7a2luZH1gXShldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIGFyZ3MpXG4gICAgICB9KVxuICAgIH0pXG4gIH0sXG5cbiAgaXNWaXNpYmxlKGVsKXtcbiAgICByZXR1cm4gISEoZWwub2Zmc2V0V2lkdGggfHwgZWwub2Zmc2V0SGVpZ2h0IHx8IGVsLmdldENsaWVudFJlY3RzKCkubGVuZ3RoID4gMClcbiAgfSxcblxuICAvLyBwcml2YXRlXG5cbiAgLy8gY29tbWFuZHNcblxuICBleGVjX2Rpc3BhdGNoKGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge3RvLCBldmVudCwgZGV0YWlsfSl7XG4gICAgRE9NLmRpc3BhdGNoRXZlbnQoZWwsIGV2ZW50LCBkZXRhaWwpXG4gIH0sXG5cbiAgZXhlY19wdXNoKGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwgYXJncyl7XG4gICAgbGV0IHtldmVudCwgZGF0YSwgdGFyZ2V0LCBwYWdlX2xvYWRpbmcsIGxvYWRpbmcsIHZhbHVlfSA9IGFyZ3NcbiAgICBsZXQgcHVzaE9wdHMgPSB7bG9hZGluZywgdmFsdWUsIHRhcmdldCwgcGFnZV9sb2FkaW5nOiAhIXBhZ2VfbG9hZGluZ31cbiAgICBsZXQgdGFyZ2V0U3JjID0gZXZlbnRUeXBlID09PSBcImNoYW5nZVwiID8gc291cmNlRWwuZm9ybSA6IHNvdXJjZUVsXG4gICAgbGV0IHBoeFRhcmdldCA9IHRhcmdldCB8fCB0YXJnZXRTcmMuZ2V0QXR0cmlidXRlKHZpZXcuYmluZGluZyhcInRhcmdldFwiKSkgfHwgdGFyZ2V0U3JjXG4gICAgdmlldy53aXRoaW5UYXJnZXRzKHBoeFRhcmdldCwgKHRhcmdldFZpZXcsIHRhcmdldEN0eCkgPT4ge1xuICAgICAgaWYoZXZlbnRUeXBlID09PSBcImNoYW5nZVwiKXtcbiAgICAgICAgbGV0IHtuZXdDaWQsIF90YXJnZXQsIGNhbGxiYWNrfSA9IGFyZ3NcbiAgICAgICAgaWYoX3RhcmdldCl7IHB1c2hPcHRzLl90YXJnZXQgPSBfdGFyZ2V0IH1cbiAgICAgICAgdGFyZ2V0Vmlldy5wdXNoSW5wdXQoc291cmNlRWwsIHRhcmdldEN0eCwgbmV3Q2lkLCBldmVudCB8fCBwaHhFdmVudCwgcHVzaE9wdHMsIGNhbGxiYWNrKVxuICAgICAgfSBlbHNlIGlmKGV2ZW50VHlwZSA9PT0gXCJzdWJtaXRcIil7XG4gICAgICAgIHRhcmdldFZpZXcuc3VibWl0Rm9ybShzb3VyY2VFbCwgdGFyZ2V0Q3R4LCBldmVudCB8fCBwaHhFdmVudCwgcHVzaE9wdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXRWaWV3LnB1c2hFdmVudChldmVudFR5cGUsIHNvdXJjZUVsLCB0YXJnZXRDdHgsIGV2ZW50IHx8IHBoeEV2ZW50LCBkYXRhLCBwdXNoT3B0cylcbiAgICAgIH1cbiAgICB9KVxuICB9LFxuXG4gIGV4ZWNfYWRkX2NsYXNzKGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge25hbWVzLCB0cmFuc2l0aW9uLCB0aW1lfSl7XG4gICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIG5hbWVzLCBbXSwgdHJhbnNpdGlvbiwgdGltZSwgdmlldylcbiAgfSxcblxuICBleGVjX3JlbW92ZV9jbGFzcyhldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHtuYW1lcywgdHJhbnNpdGlvbiwgdGltZX0pe1xuICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgbmFtZXMsIHRyYW5zaXRpb24sIHRpbWUsIHZpZXcpXG4gIH0sXG5cbiAgZXhlY190cmFuc2l0aW9uKGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge3RpbWUsIHRyYW5zaXRpb259KXtcbiAgICBsZXQgW3RyYW5zaXRpb25fc3RhcnQsIHJ1bm5pbmcsIHRyYW5zaXRpb25fZW5kXSA9IHRyYW5zaXRpb25cbiAgICBsZXQgb25TdGFydCA9ICgpID0+IHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCB0cmFuc2l0aW9uX3N0YXJ0LmNvbmNhdChydW5uaW5nKSwgW10pXG4gICAgbGV0IG9uRG9uZSA9ICgpID0+IHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCB0cmFuc2l0aW9uX2VuZCwgdHJhbnNpdGlvbl9zdGFydC5jb25jYXQocnVubmluZykpXG4gICAgdmlldy50cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSlcbiAgfSxcblxuICBleGVjX3RvZ2dsZShldmVudFR5cGUsIHBoeEV2ZW50LCB2aWV3LCBzb3VyY2VFbCwgZWwsIHtkaXNwbGF5LCBpbnMsIG91dHMsIHRpbWV9KXtcbiAgICB0aGlzLnRvZ2dsZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCBpbnMsIG91dHMsIHRpbWUpXG4gIH0sXG5cbiAgZXhlY19zaG93KGV2ZW50VHlwZSwgcGh4RXZlbnQsIHZpZXcsIHNvdXJjZUVsLCBlbCwge2Rpc3BsYXksIHRyYW5zaXRpb24sIHRpbWV9KXtcbiAgICB0aGlzLnNob3coZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZSlcbiAgfSxcblxuICBleGVjX2hpZGUoZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7ZGlzcGxheSwgdHJhbnNpdGlvbiwgdGltZX0pe1xuICAgIHRoaXMuaGlkZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lKVxuICB9LFxuXG4gIGV4ZWNfc2V0X2F0dHIoZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7YXR0cjogW2F0dHIsIHZhbF19KXtcbiAgICB0aGlzLnNldE9yUmVtb3ZlQXR0cnMoZWwsIFtbYXR0ciwgdmFsXV0sIFtdKVxuICB9LFxuXG4gIGV4ZWNfcmVtb3ZlX2F0dHIoZXZlbnRUeXBlLCBwaHhFdmVudCwgdmlldywgc291cmNlRWwsIGVsLCB7YXR0cn0pe1xuICAgIHRoaXMuc2V0T3JSZW1vdmVBdHRycyhlbCwgW10sIFthdHRyXSlcbiAgfSxcblxuICAvLyB1dGlscyBmb3IgY29tbWFuZHNcblxuICBzaG93KGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIHRyYW5zaXRpb24sIHRpbWUpe1xuICAgIGlmKCF0aGlzLmlzVmlzaWJsZShlbCkpe1xuICAgICAgdGhpcy50b2dnbGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgdHJhbnNpdGlvbiwgbnVsbCwgdGltZSlcbiAgICB9XG4gIH0sXG5cbiAgaGlkZShldmVudFR5cGUsIHZpZXcsIGVsLCBkaXNwbGF5LCB0cmFuc2l0aW9uLCB0aW1lKXtcbiAgICBpZih0aGlzLmlzVmlzaWJsZShlbCkpe1xuICAgICAgdGhpcy50b2dnbGUoZXZlbnRUeXBlLCB2aWV3LCBlbCwgZGlzcGxheSwgbnVsbCwgdHJhbnNpdGlvbiwgdGltZSlcbiAgICB9XG4gIH0sXG5cbiAgdG9nZ2xlKGV2ZW50VHlwZSwgdmlldywgZWwsIGRpc3BsYXksIGlucywgb3V0cywgdGltZSl7XG4gICAgbGV0IFtpbkNsYXNzZXMsIGluU3RhcnRDbGFzc2VzLCBpbkVuZENsYXNzZXNdID0gaW5zIHx8IFtbXSwgW10sIFtdXVxuICAgIGxldCBbb3V0Q2xhc3Nlcywgb3V0U3RhcnRDbGFzc2VzLCBvdXRFbmRDbGFzc2VzXSA9IG91dHMgfHwgW1tdLCBbXSwgW11dXG4gICAgaWYoaW5DbGFzc2VzLmxlbmd0aCA+IDAgfHwgb3V0Q2xhc3Nlcy5sZW5ndGggPiAwKXtcbiAgICAgIGlmKHRoaXMuaXNWaXNpYmxlKGVsKSl7XG4gICAgICAgIGxldCBvblN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBvdXRTdGFydENsYXNzZXMsIGluQ2xhc3Nlcy5jb25jYXQoaW5TdGFydENsYXNzZXMpLmNvbmNhdChpbkVuZENsYXNzZXMpKVxuICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIG91dENsYXNzZXMsIFtdKVxuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgb3V0RW5kQ2xhc3Nlcywgb3V0U3RhcnRDbGFzc2VzKSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtc3RhcnRcIikpXG4gICAgICAgIHZpZXcudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNsYXNzZXMoZWwsIFtdLCBvdXRDbGFzc2VzLmNvbmNhdChvdXRFbmRDbGFzc2VzKSlcbiAgICAgICAgICBET00ucHV0U3RpY2t5KGVsLCBcInRvZ2dsZVwiLCBjdXJyZW50RWwgPT4gY3VycmVudEVsLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIilcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpoaWRlLWVuZFwiKSlcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmKGV2ZW50VHlwZSA9PT0gXCJyZW1vdmVcIil7IHJldHVybiB9XG4gICAgICAgIGxldCBvblN0YXJ0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBpblN0YXJ0Q2xhc3Nlcywgb3V0Q2xhc3Nlcy5jb25jYXQob3V0U3RhcnRDbGFzc2VzKS5jb25jYXQob3V0RW5kQ2xhc3NlcykpXG4gICAgICAgICAgRE9NLnB1dFN0aWNreShlbCwgXCJ0b2dnbGVcIiwgY3VycmVudEVsID0+IGN1cnJlbnRFbC5zdHlsZS5kaXNwbGF5ID0gKGRpc3BsYXkgfHwgXCJibG9ja1wiKSlcbiAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBpbkNsYXNzZXMsIFtdKVxuICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgaW5FbmRDbGFzc2VzLCBpblN0YXJ0Q2xhc3NlcykpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LXN0YXJ0XCIpKVxuICAgICAgICB2aWV3LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBbXSwgaW5DbGFzc2VzLmNvbmNhdChpbkVuZENsYXNzZXMpKVxuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OnNob3ctZW5kXCIpKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZih0aGlzLmlzVmlzaWJsZShlbCkpe1xuICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpoaWRlLXN0YXJ0XCIpKVxuICAgICAgICAgIERPTS5wdXRTdGlja3koZWwsIFwidG9nZ2xlXCIsIGN1cnJlbnRFbCA9PiBjdXJyZW50RWwuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiKVxuICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwicGh4OmhpZGUtZW5kXCIpKVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJwaHg6c2hvdy1zdGFydFwiKSlcbiAgICAgICAgICBET00ucHV0U3RpY2t5KGVsLCBcInRvZ2dsZVwiLCBjdXJyZW50RWwgPT4gY3VycmVudEVsLnN0eWxlLmRpc3BsYXkgPSBkaXNwbGF5IHx8IFwiYmxvY2tcIilcbiAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcInBoeDpzaG93LWVuZFwiKSlcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgYWRkT3JSZW1vdmVDbGFzc2VzKGVsLCBhZGRzLCByZW1vdmVzLCB0cmFuc2l0aW9uLCB0aW1lLCB2aWV3KXtcbiAgICBsZXQgW3RyYW5zaXRpb25fcnVuLCB0cmFuc2l0aW9uX3N0YXJ0LCB0cmFuc2l0aW9uX2VuZF0gPSB0cmFuc2l0aW9uIHx8IFtbXSwgW10sIFtdXVxuICAgIGlmKHRyYW5zaXRpb25fcnVuLmxlbmd0aCA+IDApe1xuICAgICAgbGV0IG9uU3RhcnQgPSAoKSA9PiB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgdHJhbnNpdGlvbl9zdGFydC5jb25jYXQodHJhbnNpdGlvbl9ydW4pLCBbXSlcbiAgICAgIGxldCBvbkRvbmUgPSAoKSA9PiB0aGlzLmFkZE9yUmVtb3ZlQ2xhc3NlcyhlbCwgYWRkcy5jb25jYXQodHJhbnNpdGlvbl9lbmQpLCByZW1vdmVzLmNvbmNhdCh0cmFuc2l0aW9uX3J1bikuY29uY2F0KHRyYW5zaXRpb25fc3RhcnQpKVxuICAgICAgcmV0dXJuIHZpZXcudHJhbnNpdGlvbih0aW1lLCBvblN0YXJ0LCBvbkRvbmUpXG4gICAgfVxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgbGV0IFtwcmV2QWRkcywgcHJldlJlbW92ZXNdID0gRE9NLmdldFN0aWNreShlbCwgXCJjbGFzc2VzXCIsIFtbXSwgW11dKVxuICAgICAgbGV0IGtlZXBBZGRzID0gYWRkcy5maWx0ZXIobmFtZSA9PiBwcmV2QWRkcy5pbmRleE9mKG5hbWUpIDwgMCAmJiAhZWwuY2xhc3NMaXN0LmNvbnRhaW5zKG5hbWUpKVxuICAgICAgbGV0IGtlZXBSZW1vdmVzID0gcmVtb3Zlcy5maWx0ZXIobmFtZSA9PiBwcmV2UmVtb3Zlcy5pbmRleE9mKG5hbWUpIDwgMCAmJiBlbC5jbGFzc0xpc3QuY29udGFpbnMobmFtZSkpXG4gICAgICBsZXQgbmV3QWRkcyA9IHByZXZBZGRzLmZpbHRlcihuYW1lID0+IHJlbW92ZXMuaW5kZXhPZihuYW1lKSA8IDApLmNvbmNhdChrZWVwQWRkcylcbiAgICAgIGxldCBuZXdSZW1vdmVzID0gcHJldlJlbW92ZXMuZmlsdGVyKG5hbWUgPT4gYWRkcy5pbmRleE9mKG5hbWUpIDwgMCkuY29uY2F0KGtlZXBSZW1vdmVzKVxuXG4gICAgICBET00ucHV0U3RpY2t5KGVsLCBcImNsYXNzZXNcIiwgY3VycmVudEVsID0+IHtcbiAgICAgICAgY3VycmVudEVsLmNsYXNzTGlzdC5yZW1vdmUoLi4ubmV3UmVtb3ZlcylcbiAgICAgICAgY3VycmVudEVsLmNsYXNzTGlzdC5hZGQoLi4ubmV3QWRkcylcbiAgICAgICAgcmV0dXJuIFtuZXdBZGRzLCBuZXdSZW1vdmVzXVxuICAgICAgfSlcbiAgICB9KVxuICB9LFxuXG4gIHNldE9yUmVtb3ZlQXR0cnMoZWwsIHNldHMsIHJlbW92ZXMpe1xuICAgIGxldCBbcHJldlNldHMsIHByZXZSZW1vdmVzXSA9IERPTS5nZXRTdGlja3koZWwsIFwiYXR0cnNcIiwgW1tdLCBbXV0pXG4gICAgbGV0IGtlZXBTZXRzID0gc2V0cy5maWx0ZXIoKFthdHRyLCBfdmFsXSkgPT4gIXRoaXMuaGFzU2V0KHByZXZTZXRzLCBhdHRyKSAmJiAhZWwuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0cikpXG4gICAgbGV0IGtlZXBSZW1vdmVzID0gcmVtb3Zlcy5maWx0ZXIoYXR0ciA9PiBwcmV2UmVtb3Zlcy5pbmRleE9mKGF0dHIpIDwgMCAmJiBlbC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShhdHRyKSlcbiAgICBsZXQgbmV3U2V0cyA9IHByZXZTZXRzLmZpbHRlcigoW2F0dHIsIF92YWxdKSA9PiByZW1vdmVzLmluZGV4T2YoYXR0cikgPCAwKS5jb25jYXQoa2VlcFNldHMpXG4gICAgbGV0IG5ld1JlbW92ZXMgPSBwcmV2UmVtb3Zlcy5maWx0ZXIoYXR0ciA9PiAhdGhpcy5oYXNTZXQoc2V0cywgYXR0cikpLmNvbmNhdChrZWVwUmVtb3ZlcylcblxuICAgIERPTS5wdXRTdGlja3koZWwsIFwiYXR0cnNcIiwgY3VycmVudEVsID0+IHtcbiAgICAgIG5ld1JlbW92ZXMuZm9yRWFjaChhdHRyID0+IGN1cnJlbnRFbC5yZW1vdmVBdHRyaWJ1dGUoYXR0cikpXG4gICAgICBuZXdTZXRzLmZvckVhY2goKFthdHRyLCB2YWxdKSA9PiBjdXJyZW50RWwuc2V0QXR0cmlidXRlKGF0dHIsIHZhbCkpXG4gICAgICByZXR1cm4gW25ld1NldHMsIG5ld1JlbW92ZXNdXG4gICAgfSlcbiAgfSxcblxuICBoYXNTZXQoc2V0cywgbmFtZVNlYXJjaCl7IHJldHVybiBzZXRzLmZpbmQoKFtuYW1lLCB2YWxdKSA9PiBuYW1lID09PSBuYW1lU2VhcmNoKSB9LFxuXG4gIGhhc0FsbENsYXNzZXMoZWwsIGNsYXNzZXMpeyByZXR1cm4gY2xhc3Nlcy5ldmVyeShuYW1lID0+IGVsLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKSkgfSxcblxuICBpc1RvZ2dsZWRPdXQoZWwsIG91dENsYXNzZXMpe1xuICAgIHJldHVybiAhdGhpcy5pc1Zpc2libGUoZWwpIHx8IHRoaXMuaGFzQWxsQ2xhc3NlcyhlbCwgb3V0Q2xhc3NlcylcbiAgfSxcblxuICBmaWx0ZXJUb0Vscyhzb3VyY2VFbCwge3RvfSl7XG4gICAgcmV0dXJuIHRvID8gRE9NLmFsbChkb2N1bWVudCwgdG8pIDogW3NvdXJjZUVsXVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEpTXG4iLCAiaW1wb3J0IHtcbiAgQkVGT1JFX1VOTE9BRF9MT0FERVJfVElNRU9VVCxcbiAgQ0hFQ0tBQkxFX0lOUFVUUyxcbiAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgUEhYX0FVVE9fUkVDT1ZFUixcbiAgUEhYX0NPTVBPTkVOVCxcbiAgUEhYX0NPTk5FQ1RFRF9DTEFTUyxcbiAgUEhYX0RJU0FCTEVfV0lUSCxcbiAgUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFLFxuICBQSFhfRElTQUJMRUQsXG4gIFBIWF9ESVNDT05ORUNURURfQ0xBU1MsXG4gIFBIWF9FVkVOVF9DTEFTU0VTLFxuICBQSFhfRVJST1JfQ0xBU1MsXG4gIFBIWF9GRUVEQkFDS19GT1IsXG4gIFBIWF9IQVNfU1VCTUlUVEVELFxuICBQSFhfSE9PSyxcbiAgUEhYX1BBR0VfTE9BRElORyxcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1BST0dSRVNTLFxuICBQSFhfUkVBRE9OTFksXG4gIFBIWF9SRUYsXG4gIFBIWF9SRUZfU1JDLFxuICBQSFhfUk9PVF9JRCxcbiAgUEhYX1NFU1NJT04sXG4gIFBIWF9TVEFUSUMsXG4gIFBIWF9UUkFDS19TVEFUSUMsXG4gIFBIWF9UUkFDS19VUExPQURTLFxuICBQSFhfVVBEQVRFLFxuICBQSFhfVVBMT0FEX1JFRixcbiAgUEhYX1ZJRVdfU0VMRUNUT1IsXG4gIFBVU0hfVElNRU9VVCxcbiAgUEhYX01BSU4sXG59IGZyb20gXCIuL2NvbnN0YW50c1wiXG5cbmltcG9ydCB7XG4gIGNsb25lLFxuICBjbG9zZXN0UGh4QmluZGluZyxcbiAgaXNFbXB0eSxcbiAgaXNFcXVhbE9iaixcbiAgbG9nRXJyb3IsXG4gIG1heWJlLFxuICBpc0NpZCxcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQnJvd3NlciBmcm9tIFwiLi9icm93c2VyXCJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcbmltcG9ydCBET01QYXRjaCBmcm9tIFwiLi9kb21fcGF0Y2hcIlxuaW1wb3J0IExpdmVVcGxvYWRlciBmcm9tIFwiLi9saXZlX3VwbG9hZGVyXCJcbmltcG9ydCBSZW5kZXJlZCBmcm9tIFwiLi9yZW5kZXJlZFwiXG5pbXBvcnQgVmlld0hvb2sgZnJvbSBcIi4vdmlld19ob29rXCJcbmltcG9ydCBKUyBmcm9tIFwiLi9qc1wiXG5cbmxldCBzZXJpYWxpemVGb3JtID0gKGZvcm0sIG1ldGEgPSB7fSkgPT4ge1xuICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZm9ybSlcbiAgbGV0IHRvUmVtb3ZlID0gW11cblxuICBmb3JtRGF0YS5mb3JFYWNoKCh2YWwsIGtleSwgX2luZGV4KSA9PiB7XG4gICAgaWYodmFsIGluc3RhbmNlb2YgRmlsZSl7IHRvUmVtb3ZlLnB1c2goa2V5KSB9XG4gIH0pXG5cbiAgLy8gQ2xlYW51cCBhZnRlciBidWlsZGluZyBmaWxlRGF0YVxuICB0b1JlbW92ZS5mb3JFYWNoKGtleSA9PiBmb3JtRGF0YS5kZWxldGUoa2V5KSlcblxuICBsZXQgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpXG4gIGZvcihsZXQgW2tleSwgdmFsXSBvZiBmb3JtRGF0YS5lbnRyaWVzKCkpeyBwYXJhbXMuYXBwZW5kKGtleSwgdmFsKSB9XG4gIGZvcihsZXQgbWV0YUtleSBpbiBtZXRhKXsgcGFyYW1zLmFwcGVuZChtZXRhS2V5LCBtZXRhW21ldGFLZXldKSB9XG5cbiAgcmV0dXJuIHBhcmFtcy50b1N0cmluZygpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpZXcge1xuICBjb25zdHJ1Y3RvcihlbCwgbGl2ZVNvY2tldCwgcGFyZW50VmlldywgZmxhc2gpe1xuICAgIHRoaXMubGl2ZVNvY2tldCA9IGxpdmVTb2NrZXRcbiAgICB0aGlzLmZsYXNoID0gZmxhc2hcbiAgICB0aGlzLnBhcmVudCA9IHBhcmVudFZpZXdcbiAgICB0aGlzLnJvb3QgPSBwYXJlbnRWaWV3ID8gcGFyZW50Vmlldy5yb290IDogdGhpc1xuICAgIHRoaXMuZWwgPSBlbFxuICAgIHRoaXMuaWQgPSB0aGlzLmVsLmlkXG4gICAgdGhpcy5yZWYgPSAwXG4gICAgdGhpcy5jaGlsZEpvaW5zID0gMFxuICAgIHRoaXMubG9hZGVyVGltZXIgPSBudWxsXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXVxuICAgIHRoaXMucHJ1bmluZ0NJRHMgPSBbXVxuICAgIHRoaXMucmVkaXJlY3QgPSBmYWxzZVxuICAgIHRoaXMuaHJlZiA9IG51bGxcbiAgICB0aGlzLmpvaW5Db3VudCA9IHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQuam9pbkNvdW50IC0gMSA6IDBcbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gdHJ1ZVxuICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2VcbiAgICB0aGlzLmpvaW5DYWxsYmFjayA9IGZ1bmN0aW9uKG9uRG9uZSl7IG9uRG9uZSAmJiBvbkRvbmUoKSB9XG4gICAgdGhpcy5zdG9wQ2FsbGJhY2sgPSBmdW5jdGlvbigpeyB9XG4gICAgdGhpcy5wZW5kaW5nSm9pbk9wcyA9IHRoaXMucGFyZW50ID8gbnVsbCA6IFtdXG4gICAgdGhpcy52aWV3SG9va3MgPSB7fVxuICAgIHRoaXMudXBsb2FkZXJzID0ge31cbiAgICB0aGlzLmZvcm1TdWJtaXRzID0gW11cbiAgICB0aGlzLmNoaWxkcmVuID0gdGhpcy5wYXJlbnQgPyBudWxsIDoge31cbiAgICB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF0gPSB7fVxuICAgIHRoaXMuY2hhbm5lbCA9IHRoaXMubGl2ZVNvY2tldC5jaGFubmVsKGBsdjoke3RoaXMuaWR9YCwgKCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVkaXJlY3Q6IHRoaXMucmVkaXJlY3QgPyB0aGlzLmhyZWYgOiB1bmRlZmluZWQsXG4gICAgICAgIHVybDogdGhpcy5yZWRpcmVjdCA/IHVuZGVmaW5lZCA6IHRoaXMuaHJlZiB8fCB1bmRlZmluZWQsXG4gICAgICAgIHBhcmFtczogdGhpcy5jb25uZWN0UGFyYW1zKCksXG4gICAgICAgIHNlc3Npb246IHRoaXMuZ2V0U2Vzc2lvbigpLFxuICAgICAgICBzdGF0aWM6IHRoaXMuZ2V0U3RhdGljKCksXG4gICAgICAgIGZsYXNoOiB0aGlzLmZsYXNoXG4gICAgICB9XG4gICAgfSlcbiAgICB0aGlzLnNob3dMb2FkZXIodGhpcy5saXZlU29ja2V0LmxvYWRlclRpbWVvdXQpXG4gICAgdGhpcy5iaW5kQ2hhbm5lbCgpXG4gIH1cblxuICBzZXRIcmVmKGhyZWYpeyB0aGlzLmhyZWYgPSBocmVmIH1cblxuICBzZXRSZWRpcmVjdChocmVmKXtcbiAgICB0aGlzLnJlZGlyZWN0ID0gdHJ1ZVxuICAgIHRoaXMuaHJlZiA9IGhyZWZcbiAgfVxuXG4gIGlzTWFpbigpeyByZXR1cm4gdGhpcy5lbC5nZXRBdHRyaWJ1dGUoUEhYX01BSU4pICE9PSBudWxsIH1cblxuICBjb25uZWN0UGFyYW1zKCl7XG4gICAgbGV0IHBhcmFtcyA9IHRoaXMubGl2ZVNvY2tldC5wYXJhbXModGhpcy5lbClcbiAgICBsZXQgbWFuaWZlc3QgPVxuICAgICAgRE9NLmFsbChkb2N1bWVudCwgYFske3RoaXMuYmluZGluZyhQSFhfVFJBQ0tfU1RBVElDKX1dYClcbiAgICAgICAgLm1hcChub2RlID0+IG5vZGUuc3JjIHx8IG5vZGUuaHJlZikuZmlsdGVyKHVybCA9PiB0eXBlb2YgKHVybCkgPT09IFwic3RyaW5nXCIpXG5cbiAgICBpZihtYW5pZmVzdC5sZW5ndGggPiAwKXsgcGFyYW1zW1wiX3RyYWNrX3N0YXRpY1wiXSA9IG1hbmlmZXN0IH1cbiAgICBwYXJhbXNbXCJfbW91bnRzXCJdID0gdGhpcy5qb2luQ291bnRcblxuICAgIHJldHVybiBwYXJhbXNcbiAgfVxuXG4gIGlzQ29ubmVjdGVkKCl7IHJldHVybiB0aGlzLmNoYW5uZWwuY2FuUHVzaCgpIH1cblxuICBnZXRTZXNzaW9uKCl7IHJldHVybiB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTikgfVxuXG4gIGdldFN0YXRpYygpe1xuICAgIGxldCB2YWwgPSB0aGlzLmVsLmdldEF0dHJpYnV0ZShQSFhfU1RBVElDKVxuICAgIHJldHVybiB2YWwgPT09IFwiXCIgPyBudWxsIDogdmFsXG4gIH1cblxuICBkZXN0cm95KGNhbGxiYWNrID0gZnVuY3Rpb24gKCl7IH0pe1xuICAgIHRoaXMuZGVzdHJveUFsbENoaWxkcmVuKClcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWVcbiAgICBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdXG4gICAgaWYodGhpcy5wYXJlbnQpeyBkZWxldGUgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMucGFyZW50LmlkXVt0aGlzLmlkXSB9XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGVyVGltZXIpXG4gICAgbGV0IG9uRmluaXNoZWQgPSAoKSA9PiB7XG4gICAgICBjYWxsYmFjaygpXG4gICAgICBmb3IobGV0IGlkIGluIHRoaXMudmlld0hvb2tzKXtcbiAgICAgICAgdGhpcy5kZXN0cm95SG9vayh0aGlzLnZpZXdIb29rc1tpZF0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgRE9NLm1hcmtQaHhDaGlsZERlc3Ryb3llZCh0aGlzLmVsKVxuXG4gICAgdGhpcy5sb2coXCJkZXN0cm95ZWRcIiwgKCkgPT4gW1widGhlIGNoaWxkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcGFyZW50XCJdKVxuICAgIHRoaXMuY2hhbm5lbC5sZWF2ZSgpXG4gICAgICAucmVjZWl2ZShcIm9rXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcImVycm9yXCIsIG9uRmluaXNoZWQpXG4gICAgICAucmVjZWl2ZShcInRpbWVvdXRcIiwgb25GaW5pc2hlZClcbiAgfVxuXG4gIHNldENvbnRhaW5lckNsYXNzZXMoLi4uY2xhc3Nlcyl7XG4gICAgdGhpcy5lbC5jbGFzc0xpc3QucmVtb3ZlKFxuICAgICAgUEhYX0NPTk5FQ1RFRF9DTEFTUyxcbiAgICAgIFBIWF9ESVNDT05ORUNURURfQ0xBU1MsXG4gICAgICBQSFhfRVJST1JfQ0xBU1NcbiAgICApXG4gICAgdGhpcy5lbC5jbGFzc0xpc3QuYWRkKC4uLmNsYXNzZXMpXG4gIH1cblxuICBzaG93TG9hZGVyKHRpbWVvdXQpe1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmxvYWRlclRpbWVyKVxuICAgIGlmKHRpbWVvdXQpe1xuICAgICAgdGhpcy5sb2FkZXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zaG93TG9hZGVyKCksIHRpbWVvdXQpXG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcihsZXQgaWQgaW4gdGhpcy52aWV3SG9va3MpeyB0aGlzLnZpZXdIb29rc1tpZF0uX19kaXNjb25uZWN0ZWQoKSB9XG4gICAgICB0aGlzLnNldENvbnRhaW5lckNsYXNzZXMoUEhYX0RJU0NPTk5FQ1RFRF9DTEFTUylcbiAgICB9XG4gIH1cblxuICBoaWRlTG9hZGVyKCl7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMubG9hZGVyVGltZXIpXG4gICAgdGhpcy5zZXRDb250YWluZXJDbGFzc2VzKFBIWF9DT05ORUNURURfQ0xBU1MpXG4gIH1cblxuICB0cmlnZ2VyUmVjb25uZWN0ZWQoKXtcbiAgICBmb3IobGV0IGlkIGluIHRoaXMudmlld0hvb2tzKXsgdGhpcy52aWV3SG9va3NbaWRdLl9fcmVjb25uZWN0ZWQoKSB9XG4gIH1cblxuICBsb2coa2luZCwgbXNnQ2FsbGJhY2spe1xuICAgIHRoaXMubGl2ZVNvY2tldC5sb2codGhpcywga2luZCwgbXNnQ2FsbGJhY2spXG4gIH1cblxuICB0cmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSA9IGZ1bmN0aW9uKCl7fSl7XG4gICAgdGhpcy5saXZlU29ja2V0LnRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lKVxuICB9XG5cbiAgd2l0aGluVGFyZ2V0cyhwaHhUYXJnZXQsIGNhbGxiYWNrKXtcbiAgICBpZihwaHhUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBwaHhUYXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KXtcbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQub3duZXIocGh4VGFyZ2V0LCB2aWV3ID0+IGNhbGxiYWNrKHZpZXcsIHBoeFRhcmdldCkpXG4gICAgfVxuXG4gICAgaWYoaXNDaWQocGh4VGFyZ2V0KSl7XG4gICAgICBsZXQgdGFyZ2V0cyA9IERPTS5maW5kQ29tcG9uZW50Tm9kZUxpc3QodGhpcy5lbCwgcGh4VGFyZ2V0KVxuICAgICAgaWYodGFyZ2V0cy5sZW5ndGggPT09IDApe1xuICAgICAgICBsb2dFcnJvcihgbm8gY29tcG9uZW50IGZvdW5kIG1hdGNoaW5nIHBoeC10YXJnZXQgb2YgJHtwaHhUYXJnZXR9YClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrKHRoaXMsIHBhcnNlSW50KHBoeFRhcmdldCkpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCB0YXJnZXRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHBoeFRhcmdldCkpXG4gICAgICBpZih0YXJnZXRzLmxlbmd0aCA9PT0gMCl7IGxvZ0Vycm9yKGBub3RoaW5nIGZvdW5kIG1hdGNoaW5nIHRoZSBwaHgtdGFyZ2V0IHNlbGVjdG9yIFwiJHtwaHhUYXJnZXR9XCJgKSB9XG4gICAgICB0YXJnZXRzLmZvckVhY2godGFyZ2V0ID0+IHRoaXMubGl2ZVNvY2tldC5vd25lcih0YXJnZXQsIHZpZXcgPT4gY2FsbGJhY2sodmlldywgdGFyZ2V0KSkpXG4gICAgfVxuICB9XG5cbiAgYXBwbHlEaWZmKHR5cGUsIHJhd0RpZmYsIGNhbGxiYWNrKXtcbiAgICB0aGlzLmxvZyh0eXBlLCAoKSA9PiBbXCJcIiwgY2xvbmUocmF3RGlmZildKVxuICAgIGxldCB7ZGlmZiwgcmVwbHksIGV2ZW50cywgdGl0bGV9ID0gUmVuZGVyZWQuZXh0cmFjdChyYXdEaWZmKVxuICAgIGlmKHRpdGxlKXsgRE9NLnB1dFRpdGxlKHRpdGxlKSB9XG5cbiAgICBjYWxsYmFjayh7ZGlmZiwgcmVwbHksIGV2ZW50c30pXG4gICAgcmV0dXJuIHJlcGx5XG4gIH1cblxuICBvbkpvaW4ocmVzcCl7XG4gICAgbGV0IHtyZW5kZXJlZCwgY29udGFpbmVyfSA9IHJlc3BcbiAgICBpZihjb250YWluZXIpe1xuICAgICAgbGV0IFt0YWcsIGF0dHJzXSA9IGNvbnRhaW5lclxuICAgICAgdGhpcy5lbCA9IERPTS5yZXBsYWNlUm9vdENvbnRhaW5lcih0aGlzLmVsLCB0YWcsIGF0dHJzKVxuICAgIH1cbiAgICB0aGlzLmNoaWxkSm9pbnMgPSAwXG4gICAgdGhpcy5qb2luUGVuZGluZyA9IHRydWVcbiAgICB0aGlzLmZsYXNoID0gbnVsbFxuXG4gICAgQnJvd3Nlci5kcm9wTG9jYWwodGhpcy5saXZlU29ja2V0LmxvY2FsU3RvcmFnZSwgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLCBDT05TRUNVVElWRV9SRUxPQURTKVxuICAgIHRoaXMuYXBwbHlEaWZmKFwibW91bnRcIiwgcmVuZGVyZWQsICh7ZGlmZiwgZXZlbnRzfSkgPT4ge1xuICAgICAgdGhpcy5yZW5kZXJlZCA9IG5ldyBSZW5kZXJlZCh0aGlzLmlkLCBkaWZmKVxuICAgICAgbGV0IGh0bWwgPSB0aGlzLnJlbmRlckNvbnRhaW5lcihudWxsLCBcImpvaW5cIilcbiAgICAgIHRoaXMuZHJvcFBlbmRpbmdSZWZzKClcbiAgICAgIGxldCBmb3JtcyA9IHRoaXMuZm9ybXNGb3JSZWNvdmVyeShodG1sKVxuICAgICAgdGhpcy5qb2luQ291bnQrK1xuXG4gICAgICBpZihmb3Jtcy5sZW5ndGggPiAwKXtcbiAgICAgICAgZm9ybXMuZm9yRWFjaCgoW2Zvcm0sIG5ld0Zvcm0sIG5ld0NpZF0sIGkpID0+IHtcbiAgICAgICAgICB0aGlzLnB1c2hGb3JtUmVjb3ZlcnkoZm9ybSwgbmV3Q2lkLCByZXNwID0+IHtcbiAgICAgICAgICAgIGlmKGkgPT09IGZvcm1zLmxlbmd0aCAtIDEpe1xuICAgICAgICAgICAgICB0aGlzLm9uSm9pbkNvbXBsZXRlKHJlc3AsIGh0bWwsIGV2ZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkpvaW5Db21wbGV0ZShyZXNwLCBodG1sLCBldmVudHMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGRyb3BQZW5kaW5nUmVmcygpe1xuICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHtQSFhfUkVGX1NSQ309XCIke3RoaXMuaWR9XCJdWyR7UEhYX1JFRn1dYCwgZWwgPT4ge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUYpXG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRl9TUkMpXG4gICAgfSlcbiAgfVxuXG4gIG9uSm9pbkNvbXBsZXRlKHtsaXZlX3BhdGNofSwgaHRtbCwgZXZlbnRzKXtcbiAgICAvLyBJbiBvcmRlciB0byBwcm92aWRlIGEgYmV0dGVyIGV4cGVyaWVuY2UsIHdlIHdhbnQgdG8gam9pblxuICAgIC8vIGFsbCBMaXZlVmlld3MgZmlyc3QgYW5kIG9ubHkgdGhlbiBhcHBseSB0aGVpciBwYXRjaGVzLlxuICAgIGlmKHRoaXMuam9pbkNvdW50ID4gMSB8fCAodGhpcy5wYXJlbnQgJiYgIXRoaXMucGFyZW50LmlzSm9pblBlbmRpbmcoKSkpe1xuICAgICAgcmV0dXJuIHRoaXMuYXBwbHlKb2luUGF0Y2gobGl2ZV9wYXRjaCwgaHRtbCwgZXZlbnRzKVxuICAgIH1cblxuICAgIC8vIE9uZSBkb3duc2lkZSBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgd2UgbmVlZCB0byBmaW5kIHBoeENoaWxkcmVuXG4gICAgLy8gaW4gdGhlIGh0bWwgZnJhZ21lbnQsIGluc3RlYWQgb2YgZGlyZWN0bHkgb24gdGhlIERPTS4gVGhlIGZyYWdtZW50XG4gICAgLy8gYWxzbyBkb2VzIG5vdCBpbmNsdWRlIFBIWF9TVEFUSUMsIHNvIHdlIG5lZWQgdG8gY29weSBpdCBvdmVyIGZyb21cbiAgICAvLyB0aGUgRE9NLlxuICAgIGxldCBuZXdDaGlsZHJlbiA9IERPTS5maW5kUGh4Q2hpbGRyZW5JbkZyYWdtZW50KGh0bWwsIHRoaXMuaWQpLmZpbHRlcih0b0VsID0+IHtcbiAgICAgIGxldCBmcm9tRWwgPSB0b0VsLmlkICYmIHRoaXMuZWwucXVlcnlTZWxlY3RvcihgW2lkPVwiJHt0b0VsLmlkfVwiXWApXG4gICAgICBsZXQgcGh4U3RhdGljID0gZnJvbUVsICYmIGZyb21FbC5nZXRBdHRyaWJ1dGUoUEhYX1NUQVRJQylcbiAgICAgIGlmKHBoeFN0YXRpYyl7IHRvRWwuc2V0QXR0cmlidXRlKFBIWF9TVEFUSUMsIHBoeFN0YXRpYykgfVxuICAgICAgcmV0dXJuIHRoaXMuam9pbkNoaWxkKHRvRWwpXG4gICAgfSlcblxuICAgIGlmKG5ld0NoaWxkcmVuLmxlbmd0aCA9PT0gMCl7XG4gICAgICBpZih0aGlzLnBhcmVudCl7XG4gICAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiB0aGlzLmFwcGx5Sm9pblBhdGNoKGxpdmVfcGF0Y2gsIGh0bWwsIGV2ZW50cyldKVxuICAgICAgICB0aGlzLnBhcmVudC5hY2tKb2luKHRoaXMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uQWxsQ2hpbGRKb2luc0NvbXBsZXRlKClcbiAgICAgICAgdGhpcy5hcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBldmVudHMpXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9vdC5wZW5kaW5nSm9pbk9wcy5wdXNoKFt0aGlzLCAoKSA9PiB0aGlzLmFwcGx5Sm9pblBhdGNoKGxpdmVfcGF0Y2gsIGh0bWwsIGV2ZW50cyldKVxuICAgIH1cbiAgfVxuXG4gIGF0dGFjaFRydWVEb2NFbCgpe1xuICAgIHRoaXMuZWwgPSBET00uYnlJZCh0aGlzLmlkKVxuICAgIHRoaXMuZWwuc2V0QXR0cmlidXRlKFBIWF9ST09UX0lELCB0aGlzLnJvb3QuaWQpXG4gIH1cblxuICBhcHBseUpvaW5QYXRjaChsaXZlX3BhdGNoLCBodG1sLCBldmVudHMpe1xuICAgIHRoaXMuYXR0YWNoVHJ1ZURvY0VsKClcbiAgICBsZXQgcGF0Y2ggPSBuZXcgRE9NUGF0Y2godGhpcywgdGhpcy5lbCwgdGhpcy5pZCwgaHRtbCwgbnVsbClcbiAgICBwYXRjaC5tYXJrUHJ1bmFibGVDb250ZW50Rm9yUmVtb3ZhbCgpXG4gICAgdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIGZhbHNlKVxuICAgIHRoaXMuam9pbk5ld0NoaWxkcmVuKClcbiAgICBET00uYWxsKHRoaXMuZWwsIGBbJHt0aGlzLmJpbmRpbmcoUEhYX0hPT0spfV0sIFtkYXRhLXBoeC0ke1BIWF9IT09LfV1gLCBob29rRWwgPT4ge1xuICAgICAgbGV0IGhvb2sgPSB0aGlzLmFkZEhvb2soaG9va0VsKVxuICAgICAgaWYoaG9vayl7IGhvb2suX19tb3VudGVkKCkgfVxuICAgIH0pXG5cbiAgICB0aGlzLmpvaW5QZW5kaW5nID0gZmFsc2VcbiAgICB0aGlzLmxpdmVTb2NrZXQuZGlzcGF0Y2hFdmVudHMoZXZlbnRzKVxuICAgIHRoaXMuYXBwbHlQZW5kaW5nVXBkYXRlcygpXG5cbiAgICBpZihsaXZlX3BhdGNoKXtcbiAgICAgIGxldCB7a2luZCwgdG99ID0gbGl2ZV9wYXRjaFxuICAgICAgdGhpcy5saXZlU29ja2V0Lmhpc3RvcnlQYXRjaCh0bywga2luZClcbiAgICB9XG4gICAgdGhpcy5oaWRlTG9hZGVyKClcbiAgICBpZih0aGlzLmpvaW5Db3VudCA+IDEpeyB0aGlzLnRyaWdnZXJSZWNvbm5lY3RlZCgpIH1cbiAgICB0aGlzLnN0b3BDYWxsYmFjaygpXG4gIH1cblxuICB0cmlnZ2VyQmVmb3JlVXBkYXRlSG9vayhmcm9tRWwsIHRvRWwpe1xuICAgIHRoaXMubGl2ZVNvY2tldC50cmlnZ2VyRE9NKFwib25CZWZvcmVFbFVwZGF0ZWRcIiwgW2Zyb21FbCwgdG9FbF0pXG4gICAgbGV0IGhvb2sgPSB0aGlzLmdldEhvb2soZnJvbUVsKVxuICAgIGxldCBpc0lnbm9yZWQgPSBob29rICYmIERPTS5pc0lnbm9yZWQoZnJvbUVsLCB0aGlzLmJpbmRpbmcoUEhYX1VQREFURSkpXG4gICAgaWYoaG9vayAmJiAhZnJvbUVsLmlzRXF1YWxOb2RlKHRvRWwpICYmICEoaXNJZ25vcmVkICYmIGlzRXF1YWxPYmooZnJvbUVsLmRhdGFzZXQsIHRvRWwuZGF0YXNldCkpKXtcbiAgICAgIGhvb2suX19iZWZvcmVVcGRhdGUoKVxuICAgICAgcmV0dXJuIGhvb2tcbiAgICB9XG4gIH1cblxuICBwZXJmb3JtUGF0Y2gocGF0Y2gsIHBydW5lQ2lkcyl7XG4gICAgbGV0IHJlbW92ZWRFbHMgPSBbXVxuICAgIGxldCBwaHhDaGlsZHJlbkFkZGVkID0gZmFsc2VcbiAgICBsZXQgdXBkYXRlZEhvb2tJZHMgPSBuZXcgU2V0KClcblxuICAgIHBhdGNoLmFmdGVyKFwiYWRkZWRcIiwgZWwgPT4ge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnRyaWdnZXJET00oXCJvbk5vZGVBZGRlZFwiLCBbZWxdKVxuXG4gICAgICBsZXQgbmV3SG9vayA9IHRoaXMuYWRkSG9vayhlbClcbiAgICAgIGlmKG5ld0hvb2speyBuZXdIb29rLl9fbW91bnRlZCgpIH1cbiAgICB9KVxuXG4gICAgcGF0Y2guYWZ0ZXIoXCJwaHhDaGlsZEFkZGVkXCIsIGVsID0+IHtcbiAgICAgIGlmKERPTS5pc1BoeFN0aWNreShlbCkpe1xuICAgICAgICB0aGlzLmxpdmVTb2NrZXQuam9pblJvb3RWaWV3cygpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5iZWZvcmUoXCJ1cGRhdGVkXCIsIChmcm9tRWwsIHRvRWwpID0+IHtcbiAgICAgIGxldCBob29rID0gdGhpcy50cmlnZ2VyQmVmb3JlVXBkYXRlSG9vayhmcm9tRWwsIHRvRWwpXG4gICAgICBpZihob29rKXsgdXBkYXRlZEhvb2tJZHMuYWRkKGZyb21FbC5pZCkgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5hZnRlcihcInVwZGF0ZWRcIiwgZWwgPT4ge1xuICAgICAgaWYodXBkYXRlZEhvb2tJZHMuaGFzKGVsLmlkKSl7IHRoaXMuZ2V0SG9vayhlbCkuX191cGRhdGVkKCkgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5hZnRlcihcImRpc2NhcmRlZFwiLCAoZWwpID0+IHtcbiAgICAgIGlmKGVsLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSl7IHJlbW92ZWRFbHMucHVzaChlbCkgfVxuICAgIH0pXG5cbiAgICBwYXRjaC5hZnRlcihcInRyYW5zaXRpb25zRGlzY2FyZGVkXCIsIGVscyA9PiB0aGlzLmFmdGVyRWxlbWVudHNSZW1vdmVkKGVscywgcHJ1bmVDaWRzKSlcbiAgICBwYXRjaC5wZXJmb3JtKClcbiAgICB0aGlzLmFmdGVyRWxlbWVudHNSZW1vdmVkKHJlbW92ZWRFbHMsIHBydW5lQ2lkcylcblxuICAgIHJldHVybiBwaHhDaGlsZHJlbkFkZGVkXG4gIH1cblxuICBhZnRlckVsZW1lbnRzUmVtb3ZlZChlbGVtZW50cywgcHJ1bmVDaWRzKXtcbiAgICBsZXQgZGVzdHJveWVkQ0lEcyA9IFtdXG4gICAgZWxlbWVudHMuZm9yRWFjaChwYXJlbnQgPT4ge1xuICAgICAgbGV0IGNvbXBvbmVudHMgPSBET00uYWxsKHBhcmVudCwgYFske1BIWF9DT01QT05FTlR9XWApXG4gICAgICAgIGNvbXBvbmVudHMuY29uY2F0KHBhcmVudCkuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgIGxldCBjaWQgPSB0aGlzLmNvbXBvbmVudElEKGVsKVxuICAgICAgICBpZihpc0NpZChjaWQpICYmIGRlc3Ryb3llZENJRHMuaW5kZXhPZihjaWQpID09PSAtMSl7IGRlc3Ryb3llZENJRHMucHVzaChjaWQpIH1cbiAgICAgICAgbGV0IGhvb2sgPSB0aGlzLmdldEhvb2soZWwpXG4gICAgICAgIGhvb2sgJiYgdGhpcy5kZXN0cm95SG9vayhob29rKVxuICAgICAgfSlcbiAgICB9KVxuICAgIC8vIFdlIHNob3VsZCBub3QgcHJ1bmVDaWRzIG9uIGpvaW5zLiBPdGhlcndpc2UsIGluIGNhc2Ugb2ZcbiAgICAvLyByZWpvaW5zLCB3ZSBtYXkgbm90aWZ5IGNpZHMgdGhhdCBubyBsb25nZXIgYmVsb25nIHRvIHRoZVxuICAgIC8vIGN1cnJlbnQgTGl2ZVZpZXcgdG8gYmUgcmVtb3ZlZC5cbiAgICBpZihwcnVuZUNpZHMpe1xuICAgICAgdGhpcy5tYXliZVB1c2hDb21wb25lbnRzRGVzdHJveWVkKGRlc3Ryb3llZENJRHMpXG4gICAgfVxuICB9XG5cbiAgam9pbk5ld0NoaWxkcmVuKCl7XG4gICAgRE9NLmZpbmRQaHhDaGlsZHJlbih0aGlzLmVsLCB0aGlzLmlkKS5mb3JFYWNoKGVsID0+IHRoaXMuam9pbkNoaWxkKGVsKSlcbiAgfVxuXG4gIGdldENoaWxkQnlJZChpZCl7IHJldHVybiB0aGlzLnJvb3QuY2hpbGRyZW5bdGhpcy5pZF1baWRdIH1cblxuICBnZXREZXNjZW5kZW50QnlFbChlbCl7XG4gICAgaWYoZWwuaWQgPT09IHRoaXMuaWQpe1xuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuY2hpbGRyZW5bZWwuZ2V0QXR0cmlidXRlKFBIWF9QQVJFTlRfSUQpXVtlbC5pZF1cbiAgICB9XG4gIH1cblxuICBkZXN0cm95RGVzY2VuZGVudChpZCl7XG4gICAgZm9yKGxldCBwYXJlbnRJZCBpbiB0aGlzLnJvb3QuY2hpbGRyZW4pe1xuICAgICAgZm9yKGxldCBjaGlsZElkIGluIHRoaXMucm9vdC5jaGlsZHJlbltwYXJlbnRJZF0pe1xuICAgICAgICBpZihjaGlsZElkID09PSBpZCl7IHJldHVybiB0aGlzLnJvb3QuY2hpbGRyZW5bcGFyZW50SWRdW2NoaWxkSWRdLmRlc3Ryb3koKSB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgam9pbkNoaWxkKGVsKXtcbiAgICBsZXQgY2hpbGQgPSB0aGlzLmdldENoaWxkQnlJZChlbC5pZClcbiAgICBpZighY2hpbGQpe1xuICAgICAgbGV0IHZpZXcgPSBuZXcgVmlldyhlbCwgdGhpcy5saXZlU29ja2V0LCB0aGlzKVxuICAgICAgdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdW3ZpZXcuaWRdID0gdmlld1xuICAgICAgdmlldy5qb2luKClcbiAgICAgIHRoaXMuY2hpbGRKb2lucysrXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGlzSm9pblBlbmRpbmcoKXsgcmV0dXJuIHRoaXMuam9pblBlbmRpbmcgfVxuXG4gIGFja0pvaW4oX2NoaWxkKXtcbiAgICB0aGlzLmNoaWxkSm9pbnMtLVxuXG4gICAgaWYodGhpcy5jaGlsZEpvaW5zID09PSAwKXtcbiAgICAgIGlmKHRoaXMucGFyZW50KXtcbiAgICAgICAgdGhpcy5wYXJlbnQuYWNrSm9pbih0aGlzKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkFsbENoaWxkSm9pbnNDb21wbGV0ZSgpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25BbGxDaGlsZEpvaW5zQ29tcGxldGUoKXtcbiAgICB0aGlzLmpvaW5DYWxsYmFjaygoKSA9PiB7XG4gICAgICB0aGlzLnBlbmRpbmdKb2luT3BzLmZvckVhY2goKFt2aWV3LCBvcF0pID0+IHtcbiAgICAgICAgaWYoIXZpZXcuaXNEZXN0cm95ZWQoKSl7IG9wKCkgfVxuICAgICAgfSlcbiAgICAgIHRoaXMucGVuZGluZ0pvaW5PcHMgPSBbXVxuICAgIH0pXG4gIH1cblxuICB1cGRhdGUoZGlmZiwgZXZlbnRzKXtcbiAgICBpZih0aGlzLmlzSm9pblBlbmRpbmcoKSB8fCB0aGlzLmxpdmVTb2NrZXQuaGFzUGVuZGluZ0xpbmsoKSl7XG4gICAgICByZXR1cm4gdGhpcy5wZW5kaW5nRGlmZnMucHVzaCh7ZGlmZiwgZXZlbnRzfSlcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVkLm1lcmdlRGlmZihkaWZmKVxuICAgIGxldCBwaHhDaGlsZHJlbkFkZGVkID0gZmFsc2VcblxuICAgIC8vIFdoZW4gdGhlIGRpZmYgb25seSBjb250YWlucyBjb21wb25lbnQgZGlmZnMsIHRoZW4gd2FsayBjb21wb25lbnRzXG4gICAgLy8gYW5kIHBhdGNoIG9ubHkgdGhlIHBhcmVudCBjb21wb25lbnQgY29udGFpbmVycyBmb3VuZCBpbiB0aGUgZGlmZi5cbiAgICAvLyBPdGhlcndpc2UsIHBhdGNoIGVudGlyZSBMViBjb250YWluZXIuXG4gICAgaWYodGhpcy5yZW5kZXJlZC5pc0NvbXBvbmVudE9ubHlEaWZmKGRpZmYpKXtcbiAgICAgIHRoaXMubGl2ZVNvY2tldC50aW1lKFwiY29tcG9uZW50IHBhdGNoIGNvbXBsZXRlXCIsICgpID0+IHtcbiAgICAgICAgbGV0IHBhcmVudENpZHMgPSBET00uZmluZFBhcmVudENJRHModGhpcy5lbCwgdGhpcy5yZW5kZXJlZC5jb21wb25lbnRDSURzKGRpZmYpKVxuICAgICAgICBwYXJlbnRDaWRzLmZvckVhY2gocGFyZW50Q0lEID0+IHtcbiAgICAgICAgICBpZih0aGlzLmNvbXBvbmVudFBhdGNoKHRoaXMucmVuZGVyZWQuZ2V0Q29tcG9uZW50KGRpZmYsIHBhcmVudENJRCksIHBhcmVudENJRCkpeyBwaHhDaGlsZHJlbkFkZGVkID0gdHJ1ZSB9XG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZighaXNFbXB0eShkaWZmKSl7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQudGltZShcImZ1bGwgcGF0Y2ggY29tcGxldGVcIiwgKCkgPT4ge1xuICAgICAgICBsZXQgaHRtbCA9IHRoaXMucmVuZGVyQ29udGFpbmVyKGRpZmYsIFwidXBkYXRlXCIpXG4gICAgICAgIGxldCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBudWxsKVxuICAgICAgICBwaHhDaGlsZHJlbkFkZGVkID0gdGhpcy5wZXJmb3JtUGF0Y2gocGF0Y2gsIHRydWUpXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMubGl2ZVNvY2tldC5kaXNwYXRjaEV2ZW50cyhldmVudHMpXG4gICAgaWYocGh4Q2hpbGRyZW5BZGRlZCl7IHRoaXMuam9pbk5ld0NoaWxkcmVuKCkgfVxuICB9XG5cbiAgcmVuZGVyQ29udGFpbmVyKGRpZmYsIGtpbmQpe1xuICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQudGltZShgdG9TdHJpbmcgZGlmZiAoJHtraW5kfSlgLCAoKSA9PiB7XG4gICAgICBsZXQgdGFnID0gdGhpcy5lbC50YWdOYW1lXG4gICAgICAvLyBEb24ndCBza2lwIGFueSBjb21wb25lbnQgaW4gdGhlIGRpZmYgbm9yIGFueSBtYXJrZWQgYXMgcHJ1bmVkXG4gICAgICAvLyAoYXMgdGhleSBtYXkgaGF2ZSBiZWVuIGFkZGVkIGJhY2spXG4gICAgICBsZXQgY2lkcyA9IGRpZmYgPyB0aGlzLnJlbmRlcmVkLmNvbXBvbmVudENJRHMoZGlmZikuY29uY2F0KHRoaXMucHJ1bmluZ0NJRHMpIDogbnVsbFxuICAgICAgbGV0IGh0bWwgPSB0aGlzLnJlbmRlcmVkLnRvU3RyaW5nKGNpZHMpXG4gICAgICByZXR1cm4gYDwke3RhZ30+JHtodG1sfTwvJHt0YWd9PmBcbiAgICB9KVxuICB9XG5cbiAgY29tcG9uZW50UGF0Y2goZGlmZiwgY2lkKXtcbiAgICBpZihpc0VtcHR5KGRpZmYpKSByZXR1cm4gZmFsc2VcbiAgICBsZXQgaHRtbCA9IHRoaXMucmVuZGVyZWQuY29tcG9uZW50VG9TdHJpbmcoY2lkKVxuICAgIGxldCBwYXRjaCA9IG5ldyBET01QYXRjaCh0aGlzLCB0aGlzLmVsLCB0aGlzLmlkLCBodG1sLCBjaWQpXG4gICAgbGV0IGNoaWxkcmVuQWRkZWQgPSB0aGlzLnBlcmZvcm1QYXRjaChwYXRjaCwgdHJ1ZSlcbiAgICByZXR1cm4gY2hpbGRyZW5BZGRlZFxuICB9XG5cbiAgZ2V0SG9vayhlbCl7IHJldHVybiB0aGlzLnZpZXdIb29rc1tWaWV3SG9vay5lbGVtZW50SUQoZWwpXSB9XG5cbiAgYWRkSG9vayhlbCl7XG4gICAgaWYoVmlld0hvb2suZWxlbWVudElEKGVsKSB8fCAhZWwuZ2V0QXR0cmlidXRlKXsgcmV0dXJuIH1cbiAgICBsZXQgaG9va05hbWUgPSBlbC5nZXRBdHRyaWJ1dGUoYGRhdGEtcGh4LSR7UEhYX0hPT0t9YCkgfHwgZWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfSE9PSykpXG4gICAgaWYoaG9va05hbWUgJiYgIXRoaXMub3duc0VsZW1lbnQoZWwpKXsgcmV0dXJuIH1cbiAgICBsZXQgY2FsbGJhY2tzID0gdGhpcy5saXZlU29ja2V0LmdldEhvb2tDYWxsYmFja3MoaG9va05hbWUpXG5cbiAgICBpZihjYWxsYmFja3Mpe1xuICAgICAgaWYoIWVsLmlkKXsgbG9nRXJyb3IoYG5vIERPTSBJRCBmb3IgaG9vayBcIiR7aG9va05hbWV9XCIuIEhvb2tzIHJlcXVpcmUgYSB1bmlxdWUgSUQgb24gZWFjaCBlbGVtZW50LmAsIGVsKSB9XG4gICAgICBsZXQgaG9vayA9IG5ldyBWaWV3SG9vayh0aGlzLCBlbCwgY2FsbGJhY2tzKVxuICAgICAgdGhpcy52aWV3SG9va3NbVmlld0hvb2suZWxlbWVudElEKGhvb2suZWwpXSA9IGhvb2tcbiAgICAgIHJldHVybiBob29rXG4gICAgfSBlbHNlIGlmKGhvb2tOYW1lICE9PSBudWxsKXtcbiAgICAgIGxvZ0Vycm9yKGB1bmtub3duIGhvb2sgZm91bmQgZm9yIFwiJHtob29rTmFtZX1cImAsIGVsKVxuICAgIH1cbiAgfVxuXG4gIGRlc3Ryb3lIb29rKGhvb2spe1xuICAgIGhvb2suX19kZXN0cm95ZWQoKVxuICAgIGhvb2suX19jbGVhbnVwX18oKVxuICAgIGRlbGV0ZSB0aGlzLnZpZXdIb29rc1tWaWV3SG9vay5lbGVtZW50SUQoaG9vay5lbCldXG4gIH1cblxuICBhcHBseVBlbmRpbmdVcGRhdGVzKCl7XG4gICAgdGhpcy5wZW5kaW5nRGlmZnMuZm9yRWFjaCgoe2RpZmYsIGV2ZW50c30pID0+IHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cykpXG4gICAgdGhpcy5wZW5kaW5nRGlmZnMgPSBbXVxuICB9XG5cbiAgb25DaGFubmVsKGV2ZW50LCBjYil7XG4gICAgdGhpcy5saXZlU29ja2V0Lm9uQ2hhbm5lbCh0aGlzLmNoYW5uZWwsIGV2ZW50LCByZXNwID0+IHtcbiAgICAgIGlmKHRoaXMuaXNKb2luUGVuZGluZygpKXtcbiAgICAgICAgdGhpcy5yb290LnBlbmRpbmdKb2luT3BzLnB1c2goW3RoaXMsICgpID0+IGNiKHJlc3ApXSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXF1ZXN0RE9NVXBkYXRlKCgpID0+IGNiKHJlc3ApKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBiaW5kQ2hhbm5lbCgpe1xuICAgIC8vIFRoZSBkaWZmIGV2ZW50IHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoZSByZWd1bGFyIHVwZGF0ZSBvcGVyYXRpb25zLlxuICAgIC8vIEFsbCBvdGhlciBvcGVyYXRpb25zIGFyZSBxdWV1ZWQgdG8gYmUgYXBwbGllZCBvbmx5IGFmdGVyIGpvaW4uXG4gICAgdGhpcy5saXZlU29ja2V0Lm9uQ2hhbm5lbCh0aGlzLmNoYW5uZWwsIFwiZGlmZlwiLCAocmF3RGlmZikgPT4ge1xuICAgICAgdGhpcy5saXZlU29ja2V0LnJlcXVlc3RET01VcGRhdGUoKCkgPT4ge1xuICAgICAgICB0aGlzLmFwcGx5RGlmZihcInVwZGF0ZVwiLCByYXdEaWZmLCAoe2RpZmYsIGV2ZW50c30pID0+IHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cykpXG4gICAgICB9KVxuICAgIH0pXG4gICAgdGhpcy5vbkNoYW5uZWwoXCJyZWRpcmVjdFwiLCAoe3RvLCBmbGFzaH0pID0+IHRoaXMub25SZWRpcmVjdCh7dG8sIGZsYXNofSkpXG4gICAgdGhpcy5vbkNoYW5uZWwoXCJsaXZlX3BhdGNoXCIsIChyZWRpcikgPT4gdGhpcy5vbkxpdmVQYXRjaChyZWRpcikpXG4gICAgdGhpcy5vbkNoYW5uZWwoXCJsaXZlX3JlZGlyZWN0XCIsIChyZWRpcikgPT4gdGhpcy5vbkxpdmVSZWRpcmVjdChyZWRpcikpXG4gICAgdGhpcy5jaGFubmVsLm9uRXJyb3IocmVhc29uID0+IHRoaXMub25FcnJvcihyZWFzb24pKVxuICAgIHRoaXMuY2hhbm5lbC5vbkNsb3NlKHJlYXNvbiA9PiB0aGlzLm9uQ2xvc2UocmVhc29uKSlcbiAgfVxuXG4gIGRlc3Ryb3lBbGxDaGlsZHJlbigpe1xuICAgIGZvcihsZXQgaWQgaW4gdGhpcy5yb290LmNoaWxkcmVuW3RoaXMuaWRdKXtcbiAgICAgIHRoaXMuZ2V0Q2hpbGRCeUlkKGlkKS5kZXN0cm95KClcbiAgICB9XG4gIH1cblxuICBvbkxpdmVSZWRpcmVjdChyZWRpcil7XG4gICAgbGV0IHt0bywga2luZCwgZmxhc2h9ID0gcmVkaXJcbiAgICBsZXQgdXJsID0gdGhpcy5leHBhbmRVUkwodG8pXG4gICAgdGhpcy5saXZlU29ja2V0Lmhpc3RvcnlSZWRpcmVjdCh1cmwsIGtpbmQsIGZsYXNoKVxuICB9XG5cbiAgb25MaXZlUGF0Y2gocmVkaXIpe1xuICAgIGxldCB7dG8sIGtpbmR9ID0gcmVkaXJcbiAgICB0aGlzLmhyZWYgPSB0aGlzLmV4cGFuZFVSTCh0bylcbiAgICB0aGlzLmxpdmVTb2NrZXQuaGlzdG9yeVBhdGNoKHRvLCBraW5kKVxuICB9XG5cbiAgZXhwYW5kVVJMKHRvKXtcbiAgICByZXR1cm4gdG8uc3RhcnRzV2l0aChcIi9cIikgPyBgJHt3aW5kb3cubG9jYXRpb24ucHJvdG9jb2x9Ly8ke3dpbmRvdy5sb2NhdGlvbi5ob3N0fSR7dG99YCA6IHRvXG4gIH1cblxuICBvblJlZGlyZWN0KHt0bywgZmxhc2h9KXsgdGhpcy5saXZlU29ja2V0LnJlZGlyZWN0KHRvLCBmbGFzaCkgfVxuXG4gIGlzRGVzdHJveWVkKCl7IHJldHVybiB0aGlzLmRlc3Ryb3llZCB9XG5cbiAgam9pbihjYWxsYmFjayl7XG4gICAgaWYodGhpcy5pc01haW4oKSl7XG4gICAgICB0aGlzLnN0b3BDYWxsYmFjayA9IHRoaXMubGl2ZVNvY2tldC53aXRoUGFnZUxvYWRpbmcoe3RvOiB0aGlzLmhyZWYsIGtpbmQ6IFwiaW5pdGlhbFwifSlcbiAgICB9XG4gICAgdGhpcy5qb2luQ2FsbGJhY2sgPSAob25Eb25lKSA9PiB7XG4gICAgICBvbkRvbmUgPSBvbkRvbmUgfHwgZnVuY3Rpb24oKXt9XG4gICAgICBjYWxsYmFjayA/IGNhbGxiYWNrKHRoaXMuam9pbkNvdW50LCBvbkRvbmUpIDogb25Eb25lKClcbiAgICB9XG4gICAgdGhpcy5saXZlU29ja2V0LndyYXBQdXNoKHRoaXMsIHt0aW1lb3V0OiBmYWxzZX0sICgpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmNoYW5uZWwuam9pbigpXG4gICAgICAgIC5yZWNlaXZlKFwib2tcIiwgZGF0YSA9PiB7XG4gICAgICAgICAgaWYoIXRoaXMuaXNEZXN0cm95ZWQoKSl7XG4gICAgICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB0aGlzLm9uSm9pbihkYXRhKSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5yZWNlaXZlKFwiZXJyb3JcIiwgcmVzcCA9PiAhdGhpcy5pc0Rlc3Ryb3llZCgpICYmIHRoaXMub25Kb2luRXJyb3IocmVzcCkpXG4gICAgICAgIC5yZWNlaXZlKFwidGltZW91dFwiLCAoKSA9PiAhdGhpcy5pc0Rlc3Ryb3llZCgpICYmIHRoaXMub25Kb2luRXJyb3Ioe3JlYXNvbjogXCJ0aW1lb3V0XCJ9KSlcbiAgICB9KVxuICB9XG5cbiAgb25Kb2luRXJyb3IocmVzcCl7XG4gICAgaWYocmVzcC5yZWFzb24gPT09IFwidW5hdXRob3JpemVkXCIgfHwgcmVzcC5yZWFzb24gPT09IFwic3RhbGVcIil7XG4gICAgICB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtcInVuYXV0aG9yaXplZCBsaXZlX3JlZGlyZWN0LiBGYWxsaW5nIGJhY2sgdG8gcGFnZSByZXF1ZXN0XCIsIHJlc3BdKVxuICAgICAgcmV0dXJuIHRoaXMub25SZWRpcmVjdCh7dG86IHRoaXMuaHJlZn0pXG4gICAgfVxuICAgIGlmKHJlc3AucmVkaXJlY3QgfHwgcmVzcC5saXZlX3JlZGlyZWN0KXtcbiAgICAgIHRoaXMuam9pblBlbmRpbmcgPSBmYWxzZVxuICAgICAgdGhpcy5jaGFubmVsLmxlYXZlKClcbiAgICB9XG4gICAgaWYocmVzcC5yZWRpcmVjdCl7IHJldHVybiB0aGlzLm9uUmVkaXJlY3QocmVzcC5yZWRpcmVjdCkgfVxuICAgIGlmKHJlc3AubGl2ZV9yZWRpcmVjdCl7IHJldHVybiB0aGlzLm9uTGl2ZVJlZGlyZWN0KHJlc3AubGl2ZV9yZWRpcmVjdCkgfVxuICAgIHRoaXMubG9nKFwiZXJyb3JcIiwgKCkgPT4gW1widW5hYmxlIHRvIGpvaW5cIiwgcmVzcF0pXG4gICAgcmV0dXJuIHRoaXMubGl2ZVNvY2tldC5yZWxvYWRXaXRoSml0dGVyKHRoaXMpXG4gIH1cblxuICBvbkNsb3NlKHJlYXNvbil7XG4gICAgaWYodGhpcy5pc0Rlc3Ryb3llZCgpKXsgcmV0dXJuIH1cbiAgICBpZigodGhpcy5pc0pvaW5QZW5kaW5nKCkgJiYgZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlICE9PSBcImhpZGRlblwiKSB8fFxuICAgICAgKHRoaXMubGl2ZVNvY2tldC5oYXNQZW5kaW5nTGluaygpICYmIHJlYXNvbiAhPT0gXCJsZWF2ZVwiKSl7XG5cbiAgICAgIHJldHVybiB0aGlzLmxpdmVTb2NrZXQucmVsb2FkV2l0aEppdHRlcih0aGlzKVxuICAgIH1cbiAgICB0aGlzLmRlc3Ryb3lBbGxDaGlsZHJlbigpXG4gICAgdGhpcy5saXZlU29ja2V0LmRyb3BBY3RpdmVFbGVtZW50KHRoaXMpXG4gICAgLy8gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBjYW4gYmUgbnVsbCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMVxuICAgIGlmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpeyBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmJsdXIoKSB9XG4gICAgaWYodGhpcy5saXZlU29ja2V0LmlzVW5sb2FkZWQoKSl7XG4gICAgICB0aGlzLnNob3dMb2FkZXIoQkVGT1JFX1VOTE9BRF9MT0FERVJfVElNRU9VVClcbiAgICB9XG4gIH1cblxuICBvbkVycm9yKHJlYXNvbil7XG4gICAgdGhpcy5vbkNsb3NlKHJlYXNvbilcbiAgICB0aGlzLmxvZyhcImVycm9yXCIsICgpID0+IFtcInZpZXcgY3Jhc2hlZFwiLCByZWFzb25dKVxuICAgIGlmKCF0aGlzLmxpdmVTb2NrZXQuaXNVbmxvYWRlZCgpKXsgdGhpcy5kaXNwbGF5RXJyb3IoKSB9XG4gIH1cblxuICBkaXNwbGF5RXJyb3IoKXtcbiAgICBpZih0aGlzLmlzTWFpbigpKXsgRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBcInBoeDpwYWdlLWxvYWRpbmctc3RhcnRcIiwge3RvOiB0aGlzLmhyZWYsIGtpbmQ6IFwiZXJyb3JcIn0pIH1cbiAgICB0aGlzLnNob3dMb2FkZXIoKVxuICAgIHRoaXMuc2V0Q29udGFpbmVyQ2xhc3NlcyhQSFhfRElTQ09OTkVDVEVEX0NMQVNTLCBQSFhfRVJST1JfQ0xBU1MpXG4gIH1cblxuICBwdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgZXZlbnQsIHBheWxvYWQsIG9uUmVwbHkgPSBmdW5jdGlvbiAoKXsgfSl7XG4gICAgaWYoIXRoaXMuaXNDb25uZWN0ZWQoKSl7IHJldHVybiB9XG5cbiAgICBsZXQgW3JlZiwgW2VsXSwgb3B0c10gPSByZWZHZW5lcmF0b3IgPyByZWZHZW5lcmF0b3IoKSA6IFtudWxsLCBbXSwge31dXG4gICAgbGV0IG9uTG9hZGluZ0RvbmUgPSBmdW5jdGlvbigpeyB9XG4gICAgaWYob3B0cy5wYWdlX2xvYWRpbmcgfHwgKGVsICYmIChlbC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9QQUdFX0xPQURJTkcpKSAhPT0gbnVsbCkpKXtcbiAgICAgIG9uTG9hZGluZ0RvbmUgPSB0aGlzLmxpdmVTb2NrZXQud2l0aFBhZ2VMb2FkaW5nKHtraW5kOiBcImVsZW1lbnRcIiwgdGFyZ2V0OiBlbH0pXG4gICAgfVxuXG4gICAgaWYodHlwZW9mIChwYXlsb2FkLmNpZCkgIT09IFwibnVtYmVyXCIpeyBkZWxldGUgcGF5bG9hZC5jaWQgfVxuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmxpdmVTb2NrZXQud3JhcFB1c2godGhpcywge3RpbWVvdXQ6IHRydWV9LCAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNoYW5uZWwucHVzaChldmVudCwgcGF5bG9hZCwgUFVTSF9USU1FT1VUKS5yZWNlaXZlKFwib2tcIiwgcmVzcCA9PiB7XG4gICAgICAgICAgaWYocmVmICE9PSBudWxsKXsgdGhpcy51bmRvUmVmcyhyZWYpIH1cbiAgICAgICAgICBsZXQgZmluaXNoID0gKGhvb2tSZXBseSkgPT4ge1xuICAgICAgICAgICAgaWYocmVzcC5yZWRpcmVjdCl7IHRoaXMub25SZWRpcmVjdChyZXNwLnJlZGlyZWN0KSB9XG4gICAgICAgICAgICBpZihyZXNwLmxpdmVfcGF0Y2gpeyB0aGlzLm9uTGl2ZVBhdGNoKHJlc3AubGl2ZV9wYXRjaCkgfVxuICAgICAgICAgICAgaWYocmVzcC5saXZlX3JlZGlyZWN0KXsgdGhpcy5vbkxpdmVSZWRpcmVjdChyZXNwLmxpdmVfcmVkaXJlY3QpIH1cbiAgICAgICAgICAgIG9uTG9hZGluZ0RvbmUoKVxuICAgICAgICAgICAgb25SZXBseShyZXNwLCBob29rUmVwbHkpXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKHJlc3AuZGlmZil7XG4gICAgICAgICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBob29rUmVwbHkgPSB0aGlzLmFwcGx5RGlmZihcInVwZGF0ZVwiLCByZXNwLmRpZmYsICh7ZGlmZiwgZXZlbnRzfSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKGRpZmYsIGV2ZW50cylcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgZmluaXNoKGhvb2tSZXBseSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbmlzaChudWxsKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgdW5kb1JlZnMocmVmKXtcbiAgICBET00uYWxsKGRvY3VtZW50LCBgWyR7UEhYX1JFRl9TUkN9PVwiJHt0aGlzLmlkfVwiXVske1BIWF9SRUZ9PVwiJHtyZWZ9XCJdYCwgZWwgPT4ge1xuICAgICAgbGV0IGRpc2FibGVkVmFsID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRClcbiAgICAgIC8vIHJlbW92ZSByZWZzXG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX1JFRilcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShQSFhfUkVGX1NSQylcbiAgICAgIC8vIHJlc3RvcmUgaW5wdXRzXG4gICAgICBpZihlbC5nZXRBdHRyaWJ1dGUoUEhYX1JFQURPTkxZKSAhPT0gbnVsbCl7XG4gICAgICAgIGVsLnJlYWRPbmx5ID0gZmFsc2VcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9SRUFET05MWSlcbiAgICAgIH1cbiAgICAgIGlmKGRpc2FibGVkVmFsICE9PSBudWxsKXtcbiAgICAgICAgZWwuZGlzYWJsZWQgPSBkaXNhYmxlZFZhbCA9PT0gXCJ0cnVlXCIgPyB0cnVlIDogZmFsc2VcbiAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKFBIWF9ESVNBQkxFRClcbiAgICAgIH1cbiAgICAgIC8vIHJlbW92ZSBjbGFzc2VzXG4gICAgICBQSFhfRVZFTlRfQ0xBU1NFUy5mb3JFYWNoKGNsYXNzTmFtZSA9PiBET00ucmVtb3ZlQ2xhc3MoZWwsIGNsYXNzTmFtZSkpXG4gICAgICAvLyByZXN0b3JlIGRpc2FibGVzXG4gICAgICBsZXQgZGlzYWJsZVJlc3RvcmUgPSBlbC5nZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFKVxuICAgICAgaWYoZGlzYWJsZVJlc3RvcmUgIT09IG51bGwpe1xuICAgICAgICBlbC5pbm5lclRleHQgPSBkaXNhYmxlUmVzdG9yZVxuICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFKVxuICAgICAgfVxuICAgICAgbGV0IHRvRWwgPSBET00ucHJpdmF0ZShlbCwgUEhYX1JFRilcbiAgICAgIGlmKHRvRWwpe1xuICAgICAgICBsZXQgaG9vayA9IHRoaXMudHJpZ2dlckJlZm9yZVVwZGF0ZUhvb2soZWwsIHRvRWwpXG4gICAgICAgIERPTVBhdGNoLnBhdGNoRWwoZWwsIHRvRWwsIHRoaXMubGl2ZVNvY2tldC5nZXRBY3RpdmVFbGVtZW50KCkpXG4gICAgICAgIGlmKGhvb2speyBob29rLl9fdXBkYXRlZCgpIH1cbiAgICAgICAgRE9NLmRlbGV0ZVByaXZhdGUoZWwsIFBIWF9SRUYpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHB1dFJlZihlbGVtZW50cywgZXZlbnQsIG9wdHMgPSB7fSl7XG4gICAgbGV0IG5ld1JlZiA9IHRoaXMucmVmKytcbiAgICBsZXQgZGlzYWJsZVdpdGggPSB0aGlzLmJpbmRpbmcoUEhYX0RJU0FCTEVfV0lUSClcbiAgICBpZihvcHRzLmxvYWRpbmcpeyBlbGVtZW50cyA9IGVsZW1lbnRzLmNvbmNhdChET00uYWxsKGRvY3VtZW50LCBvcHRzLmxvYWRpbmcpKX1cblxuICAgIGVsZW1lbnRzLmZvckVhY2goZWwgPT4ge1xuICAgICAgZWwuY2xhc3NMaXN0LmFkZChgcGh4LSR7ZXZlbnR9LWxvYWRpbmdgKVxuICAgICAgZWwuc2V0QXR0cmlidXRlKFBIWF9SRUYsIG5ld1JlZilcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShQSFhfUkVGX1NSQywgdGhpcy5lbC5pZClcbiAgICAgIGxldCBkaXNhYmxlVGV4dCA9IGVsLmdldEF0dHJpYnV0ZShkaXNhYmxlV2l0aClcbiAgICAgIGlmKGRpc2FibGVUZXh0ICE9PSBudWxsKXtcbiAgICAgICAgaWYoIWVsLmdldEF0dHJpYnV0ZShQSFhfRElTQUJMRV9XSVRIX1JFU1RPUkUpKXtcbiAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoUEhYX0RJU0FCTEVfV0lUSF9SRVNUT1JFLCBlbC5pbm5lclRleHQpXG4gICAgICAgIH1cbiAgICAgICAgaWYoZGlzYWJsZVRleHQgIT09IFwiXCIpeyBlbC5pbm5lclRleHQgPSBkaXNhYmxlVGV4dCB9XG4gICAgICAgIGVsLnNldEF0dHJpYnV0ZShcImRpc2FibGVkXCIsIFwiXCIpXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gW25ld1JlZiwgZWxlbWVudHMsIG9wdHNdXG4gIH1cblxuICBjb21wb25lbnRJRChlbCl7XG4gICAgbGV0IGNpZCA9IGVsLmdldEF0dHJpYnV0ZSAmJiBlbC5nZXRBdHRyaWJ1dGUoUEhYX0NPTVBPTkVOVClcbiAgICByZXR1cm4gY2lkID8gcGFyc2VJbnQoY2lkKSA6IG51bGxcbiAgfVxuXG4gIHRhcmdldENvbXBvbmVudElEKHRhcmdldCwgdGFyZ2V0Q3R4LCBvcHRzID0ge30pe1xuICAgIGlmKGlzQ2lkKHRhcmdldEN0eCkpeyByZXR1cm4gdGFyZ2V0Q3R4IH1cblxuICAgIGxldCBjaWRPclNlbGVjdG9yID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJ0YXJnZXRcIikpXG4gICAgaWYoaXNDaWQoY2lkT3JTZWxlY3Rvcikpe1xuICAgICAgcmV0dXJuIHBhcnNlSW50KGNpZE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIGlmKHRhcmdldEN0eCAmJiAoY2lkT3JTZWxlY3RvciAhPT0gbnVsbCB8fCBvcHRzLnRhcmdldCkpe1xuICAgICAgcmV0dXJuIHRoaXMuY2xvc2VzdENvbXBvbmVudElEKHRhcmdldEN0eClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBjbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KXtcbiAgICBpZihpc0NpZCh0YXJnZXRDdHgpKXtcbiAgICAgIHJldHVybiB0YXJnZXRDdHhcbiAgICB9IGVsc2UgaWYodGFyZ2V0Q3R4KXtcbiAgICAgIHJldHVybiBtYXliZSh0YXJnZXRDdHguY2xvc2VzdChgWyR7UEhYX0NPTVBPTkVOVH1dYCksIGVsID0+IHRoaXMub3duc0VsZW1lbnQoZWwpICYmIHRoaXMuY29tcG9uZW50SUQoZWwpKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbFxuICAgIH1cbiAgfVxuXG4gIHB1c2hIb29rRXZlbnQodGFyZ2V0Q3R4LCBldmVudCwgcGF5bG9hZCwgb25SZXBseSl7XG4gICAgaWYoIXRoaXMuaXNDb25uZWN0ZWQoKSl7XG4gICAgICB0aGlzLmxvZyhcImhvb2tcIiwgKCkgPT4gW1widW5hYmxlIHRvIHB1c2ggaG9vayBldmVudC4gTGl2ZVZpZXcgbm90IGNvbm5lY3RlZFwiLCBldmVudCwgcGF5bG9hZF0pXG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgbGV0IFtyZWYsIGVscywgb3B0c10gPSB0aGlzLnB1dFJlZihbXSwgXCJob29rXCIpXG4gICAgdGhpcy5wdXNoV2l0aFJlcGx5KCgpID0+IFtyZWYsIGVscywgb3B0c10sIFwiZXZlbnRcIiwge1xuICAgICAgdHlwZTogXCJob29rXCIsXG4gICAgICBldmVudDogZXZlbnQsXG4gICAgICB2YWx1ZTogcGF5bG9hZCxcbiAgICAgIGNpZDogdGhpcy5jbG9zZXN0Q29tcG9uZW50SUQodGFyZ2V0Q3R4KVxuICAgIH0sIChyZXNwLCByZXBseSkgPT4gb25SZXBseShyZXBseSwgcmVmKSlcblxuICAgIHJldHVybiByZWZcbiAgfVxuXG4gIGV4dHJhY3RNZXRhKGVsLCBtZXRhLCB2YWx1ZSl7XG4gICAgbGV0IHByZWZpeCA9IHRoaXMuYmluZGluZyhcInZhbHVlLVwiKVxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCBlbC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKXtcbiAgICAgIGlmKCFtZXRhKXsgbWV0YSA9IHt9IH1cbiAgICAgIGxldCBuYW1lID0gZWwuYXR0cmlidXRlc1tpXS5uYW1lXG4gICAgICBpZihuYW1lLnN0YXJ0c1dpdGgocHJlZml4KSl7IG1ldGFbbmFtZS5yZXBsYWNlKHByZWZpeCwgXCJcIildID0gZWwuZ2V0QXR0cmlidXRlKG5hbWUpIH1cbiAgICB9XG4gICAgaWYoZWwudmFsdWUgIT09IHVuZGVmaW5lZCl7XG4gICAgICBpZighbWV0YSl7IG1ldGEgPSB7fSB9XG4gICAgICBtZXRhLnZhbHVlID0gZWwudmFsdWVcblxuICAgICAgaWYoZWwudGFnTmFtZSA9PT0gXCJJTlBVVFwiICYmIENIRUNLQUJMRV9JTlBVVFMuaW5kZXhPZihlbC50eXBlKSA+PSAwICYmICFlbC5jaGVja2VkKXtcbiAgICAgICAgZGVsZXRlIG1ldGEudmFsdWVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYodmFsdWUpe1xuICAgICAgaWYoIW1ldGEpeyBtZXRhID0ge30gfVxuICAgICAgZm9yKGxldCBrZXkgaW4gdmFsdWUpeyBtZXRhW2tleV0gPSB2YWx1ZVtrZXldIH1cbiAgICB9XG4gICAgcmV0dXJuIG1ldGFcbiAgfVxuXG4gIHB1c2hFdmVudCh0eXBlLCBlbCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgbWV0YSwgb3B0cyA9IHt9KXtcbiAgICB0aGlzLnB1c2hXaXRoUmVwbHkoKCkgPT4gdGhpcy5wdXRSZWYoW2VsXSwgdHlwZSwgb3B0cyksIFwiZXZlbnRcIiwge1xuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgIHZhbHVlOiB0aGlzLmV4dHJhY3RNZXRhKGVsLCBtZXRhLCBvcHRzLnZhbHVlKSxcbiAgICAgIGNpZDogdGhpcy50YXJnZXRDb21wb25lbnRJRChlbCwgdGFyZ2V0Q3R4LCBvcHRzKVxuICAgIH0pXG4gIH1cblxuICBwdXNoRmlsZVByb2dyZXNzKGZpbGVFbCwgZW50cnlSZWYsIHByb2dyZXNzLCBvblJlcGx5ID0gZnVuY3Rpb24gKCl7IH0pe1xuICAgIHRoaXMubGl2ZVNvY2tldC53aXRoaW5Pd25lcnMoZmlsZUVsLmZvcm0sICh2aWV3LCB0YXJnZXRDdHgpID0+IHtcbiAgICAgIHZpZXcucHVzaFdpdGhSZXBseShudWxsLCBcInByb2dyZXNzXCIsIHtcbiAgICAgICAgZXZlbnQ6IGZpbGVFbC5nZXRBdHRyaWJ1dGUodmlldy5iaW5kaW5nKFBIWF9QUk9HUkVTUykpLFxuICAgICAgICByZWY6IGZpbGVFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpLFxuICAgICAgICBlbnRyeV9yZWY6IGVudHJ5UmVmLFxuICAgICAgICBwcm9ncmVzczogcHJvZ3Jlc3MsXG4gICAgICAgIGNpZDogdmlldy50YXJnZXRDb21wb25lbnRJRChmaWxlRWwuZm9ybSwgdGFyZ2V0Q3R4KVxuICAgICAgfSwgb25SZXBseSlcbiAgICB9KVxuICB9XG5cbiAgcHVzaElucHV0KGlucHV0RWwsIHRhcmdldEN0eCwgZm9yY2VDaWQsIHBoeEV2ZW50LCBvcHRzLCBjYWxsYmFjayl7XG4gICAgbGV0IHVwbG9hZHNcbiAgICBsZXQgY2lkID0gaXNDaWQoZm9yY2VDaWQpID8gZm9yY2VDaWQgOiB0aGlzLnRhcmdldENvbXBvbmVudElEKGlucHV0RWwuZm9ybSwgdGFyZ2V0Q3R4KVxuICAgIGxldCByZWZHZW5lcmF0b3IgPSAoKSA9PiB0aGlzLnB1dFJlZihbaW5wdXRFbCwgaW5wdXRFbC5mb3JtXSwgXCJjaGFuZ2VcIiwgb3B0cylcbiAgICBsZXQgZm9ybURhdGEgPSBzZXJpYWxpemVGb3JtKGlucHV0RWwuZm9ybSwge190YXJnZXQ6IG9wdHMuX3RhcmdldH0pXG4gICAgaWYoRE9NLmlzVXBsb2FkSW5wdXQoaW5wdXRFbCkgJiYgaW5wdXRFbC5maWxlcyAmJiBpbnB1dEVsLmZpbGVzLmxlbmd0aCA+IDApe1xuICAgICAgTGl2ZVVwbG9hZGVyLnRyYWNrRmlsZXMoaW5wdXRFbCwgQXJyYXkuZnJvbShpbnB1dEVsLmZpbGVzKSlcbiAgICB9XG4gICAgdXBsb2FkcyA9IExpdmVVcGxvYWRlci5zZXJpYWxpemVVcGxvYWRzKGlucHV0RWwpXG4gICAgbGV0IGV2ZW50ID0ge1xuICAgICAgdHlwZTogXCJmb3JtXCIsXG4gICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICB2YWx1ZTogZm9ybURhdGEsXG4gICAgICB1cGxvYWRzOiB1cGxvYWRzLFxuICAgICAgY2lkOiBjaWRcbiAgICB9XG4gICAgdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgXCJldmVudFwiLCBldmVudCwgcmVzcCA9PiB7XG4gICAgICBET00uc2hvd0Vycm9yKGlucHV0RWwsIHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9GRUVEQkFDS19GT1IpKVxuICAgICAgaWYoRE9NLmlzVXBsb2FkSW5wdXQoaW5wdXRFbCkgJiYgaW5wdXRFbC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXBoeC1hdXRvLXVwbG9hZFwiKSAhPT0gbnVsbCl7XG4gICAgICAgIGlmKExpdmVVcGxvYWRlci5maWxlc0F3YWl0aW5nUHJlZmxpZ2h0KGlucHV0RWwpLmxlbmd0aCA+IDApe1xuICAgICAgICAgIGxldCBbcmVmLCBfZWxzXSA9IHJlZkdlbmVyYXRvcigpXG4gICAgICAgICAgdGhpcy51cGxvYWRGaWxlcyhpbnB1dEVsLmZvcm0sIHRhcmdldEN0eCwgcmVmLCBjaWQsIChfdXBsb2FkcykgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2socmVzcClcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlckF3YWl0aW5nU3VibWl0KGlucHV0RWwuZm9ybSlcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjayAmJiBjYWxsYmFjayhyZXNwKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICB0cmlnZ2VyQXdhaXRpbmdTdWJtaXQoZm9ybUVsKXtcbiAgICBsZXQgYXdhaXRpbmdTdWJtaXQgPSB0aGlzLmdldFNjaGVkdWxlZFN1Ym1pdChmb3JtRWwpXG4gICAgaWYoYXdhaXRpbmdTdWJtaXQpe1xuICAgICAgbGV0IFtfZWwsIF9yZWYsIF9vcHRzLCBjYWxsYmFja10gPSBhd2FpdGluZ1N1Ym1pdFxuICAgICAgdGhpcy5jYW5jZWxTdWJtaXQoZm9ybUVsKVxuICAgICAgY2FsbGJhY2soKVxuICAgIH1cbiAgfVxuXG4gIGdldFNjaGVkdWxlZFN1Ym1pdChmb3JtRWwpe1xuICAgIHJldHVybiB0aGlzLmZvcm1TdWJtaXRzLmZpbmQoKFtlbCwgX3JlZiwgX29wdHMsIF9jYWxsYmFja10pID0+IGVsLmlzU2FtZU5vZGUoZm9ybUVsKSlcbiAgfVxuXG4gIHNjaGVkdWxlU3VibWl0KGZvcm1FbCwgcmVmLCBvcHRzLCBjYWxsYmFjayl7XG4gICAgaWYodGhpcy5nZXRTY2hlZHVsZWRTdWJtaXQoZm9ybUVsKSl7IHJldHVybiB0cnVlIH1cbiAgICB0aGlzLmZvcm1TdWJtaXRzLnB1c2goW2Zvcm1FbCwgcmVmLCBvcHRzLCBjYWxsYmFja10pXG4gIH1cblxuICBjYW5jZWxTdWJtaXQoZm9ybUVsKXtcbiAgICB0aGlzLmZvcm1TdWJtaXRzID0gdGhpcy5mb3JtU3VibWl0cy5maWx0ZXIoKFtlbCwgcmVmLCBfY2FsbGJhY2tdKSA9PiB7XG4gICAgICBpZihlbC5pc1NhbWVOb2RlKGZvcm1FbCkpe1xuICAgICAgICB0aGlzLnVuZG9SZWZzKHJlZilcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwdXNoRm9ybVN1Ym1pdChmb3JtRWwsIHRhcmdldEN0eCwgcGh4RXZlbnQsIG9wdHMsIG9uUmVwbHkpe1xuICAgIGxldCBmaWx0ZXJJZ25vcmVkID0gZWwgPT4ge1xuICAgICAgbGV0IHVzZXJJZ25vcmVkID0gY2xvc2VzdFBoeEJpbmRpbmcoZWwsIGAke3RoaXMuYmluZGluZyhQSFhfVVBEQVRFKX09aWdub3JlYCwgZWwuZm9ybSlcbiAgICAgIHJldHVybiAhKHVzZXJJZ25vcmVkIHx8IGNsb3Nlc3RQaHhCaW5kaW5nKGVsLCBcImRhdGEtcGh4LXVwZGF0ZT1pZ25vcmVcIiwgZWwuZm9ybSkpXG4gICAgfVxuICAgIGxldCBmaWx0ZXJEaXNhYmxlcyA9IGVsID0+IHtcbiAgICAgIHJldHVybiBlbC5oYXNBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9ESVNBQkxFX1dJVEgpKVxuICAgIH1cbiAgICBsZXQgZmlsdGVyQnV0dG9uID0gZWwgPT4gZWwudGFnTmFtZSA9PSBcIkJVVFRPTlwiXG5cbiAgICBsZXQgZmlsdGVySW5wdXQgPSBlbCA9PiBbXCJJTlBVVFwiLCBcIlRFWFRBUkVBXCIsIFwiU0VMRUNUXCJdLmluY2x1ZGVzKGVsLnRhZ05hbWUpXG5cbiAgICBsZXQgcmVmR2VuZXJhdG9yID0gKCkgPT4ge1xuICAgICAgbGV0IGZvcm1FbGVtZW50cyA9IEFycmF5LmZyb20oZm9ybUVsLmVsZW1lbnRzKVxuICAgICAgbGV0IGRpc2FibGVzID0gZm9ybUVsZW1lbnRzLmZpbHRlcihmaWx0ZXJEaXNhYmxlcylcbiAgICAgIGxldCBidXR0b25zID0gZm9ybUVsZW1lbnRzLmZpbHRlcihmaWx0ZXJCdXR0b24pLmZpbHRlcihmaWx0ZXJJZ25vcmVkKVxuICAgICAgbGV0IGlucHV0cyA9IGZvcm1FbGVtZW50cy5maWx0ZXIoZmlsdGVySW5wdXQpLmZpbHRlcihmaWx0ZXJJZ25vcmVkKVxuXG4gICAgICBidXR0b25zLmZvckVhY2goYnV0dG9uID0+IHtcbiAgICAgICAgYnV0dG9uLnNldEF0dHJpYnV0ZShQSFhfRElTQUJMRUQsIGJ1dHRvbi5kaXNhYmxlZClcbiAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZVxuICAgICAgfSlcbiAgICAgIGlucHV0cy5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFBIWF9SRUFET05MWSwgaW5wdXQucmVhZE9ubHkpXG4gICAgICAgIGlucHV0LnJlYWRPbmx5ID0gdHJ1ZVxuICAgICAgICBpZihpbnB1dC5maWxlcyl7XG4gICAgICAgICAgaW5wdXQuc2V0QXR0cmlidXRlKFBIWF9ESVNBQkxFRCwgaW5wdXQuZGlzYWJsZWQpXG4gICAgICAgICAgaW5wdXQuZGlzYWJsZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBmb3JtRWwuc2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfUEFHRV9MT0FESU5HKSwgXCJcIilcbiAgICAgIHJldHVybiB0aGlzLnB1dFJlZihbZm9ybUVsXS5jb25jYXQoZGlzYWJsZXMpLmNvbmNhdChidXR0b25zKS5jb25jYXQoaW5wdXRzKSwgXCJzdWJtaXRcIiwgb3B0cylcbiAgICB9XG5cbiAgICBsZXQgY2lkID0gdGhpcy50YXJnZXRDb21wb25lbnRJRChmb3JtRWwsIHRhcmdldEN0eClcbiAgICBpZihMaXZlVXBsb2FkZXIuaGFzVXBsb2Fkc0luUHJvZ3Jlc3MoZm9ybUVsKSl7XG4gICAgICBsZXQgW3JlZiwgX2Vsc10gPSByZWZHZW5lcmF0b3IoKVxuICAgICAgbGV0IHB1c2ggPSAoKSA9PiB0aGlzLnB1c2hGb3JtU3VibWl0KGZvcm1FbCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgb3B0cywgb25SZXBseSlcbiAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlU3VibWl0KGZvcm1FbCwgcmVmLCBvcHRzLCBwdXNoKVxuICAgIH0gZWxzZSBpZihMaXZlVXBsb2FkZXIuaW5wdXRzQXdhaXRpbmdQcmVmbGlnaHQoZm9ybUVsKS5sZW5ndGggPiAwKXtcbiAgICAgIGxldCBbcmVmLCBlbHNdID0gcmVmR2VuZXJhdG9yKClcbiAgICAgIGxldCBwcm94eVJlZkdlbiA9ICgpID0+IFtyZWYsIGVscywgb3B0c11cbiAgICAgIHRoaXMudXBsb2FkRmlsZXMoZm9ybUVsLCB0YXJnZXRDdHgsIHJlZiwgY2lkLCAoX3VwbG9hZHMpID0+IHtcbiAgICAgICAgbGV0IGZvcm1EYXRhID0gc2VyaWFsaXplRm9ybShmb3JtRWwsIHt9KVxuICAgICAgICB0aGlzLnB1c2hXaXRoUmVwbHkocHJveHlSZWZHZW4sIFwiZXZlbnRcIiwge1xuICAgICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICAgIGV2ZW50OiBwaHhFdmVudCxcbiAgICAgICAgICB2YWx1ZTogZm9ybURhdGEsXG4gICAgICAgICAgY2lkOiBjaWRcbiAgICAgICAgfSwgb25SZXBseSlcbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmb3JtRGF0YSA9IHNlcmlhbGl6ZUZvcm0oZm9ybUVsKVxuICAgICAgdGhpcy5wdXNoV2l0aFJlcGx5KHJlZkdlbmVyYXRvciwgXCJldmVudFwiLCB7XG4gICAgICAgIHR5cGU6IFwiZm9ybVwiLFxuICAgICAgICBldmVudDogcGh4RXZlbnQsXG4gICAgICAgIHZhbHVlOiBmb3JtRGF0YSxcbiAgICAgICAgY2lkOiBjaWRcbiAgICAgIH0sIG9uUmVwbHkpXG4gICAgfVxuICB9XG5cbiAgdXBsb2FkRmlsZXMoZm9ybUVsLCB0YXJnZXRDdHgsIHJlZiwgY2lkLCBvbkNvbXBsZXRlKXtcbiAgICBsZXQgam9pbkNvdW50QXRVcGxvYWQgPSB0aGlzLmpvaW5Db3VudFxuICAgIGxldCBpbnB1dEVscyA9IExpdmVVcGxvYWRlci5hY3RpdmVGaWxlSW5wdXRzKGZvcm1FbClcbiAgICBsZXQgbnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPSBpbnB1dEVscy5sZW5ndGhcblxuICAgIC8vIGdldCBlYWNoIGZpbGUgaW5wdXRcbiAgICBpbnB1dEVscy5mb3JFYWNoKGlucHV0RWwgPT4ge1xuICAgICAgbGV0IHVwbG9hZGVyID0gbmV3IExpdmVVcGxvYWRlcihpbnB1dEVsLCB0aGlzLCAoKSA9PiB7XG4gICAgICAgIG51bUZpbGVJbnB1dHNJblByb2dyZXNzLS1cbiAgICAgICAgaWYobnVtRmlsZUlucHV0c0luUHJvZ3Jlc3MgPT09IDApeyBvbkNvbXBsZXRlKCkgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMudXBsb2FkZXJzW2lucHV0RWxdID0gdXBsb2FkZXJcbiAgICAgIGxldCBlbnRyaWVzID0gdXBsb2FkZXIuZW50cmllcygpLm1hcChlbnRyeSA9PiBlbnRyeS50b1ByZWZsaWdodFBheWxvYWQoKSlcblxuICAgICAgbGV0IHBheWxvYWQgPSB7XG4gICAgICAgIHJlZjogaW5wdXRFbC5nZXRBdHRyaWJ1dGUoUEhYX1VQTE9BRF9SRUYpLFxuICAgICAgICBlbnRyaWVzOiBlbnRyaWVzLFxuICAgICAgICBjaWQ6IHRoaXMudGFyZ2V0Q29tcG9uZW50SUQoaW5wdXRFbC5mb3JtLCB0YXJnZXRDdHgpXG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nKFwidXBsb2FkXCIsICgpID0+IFtcInNlbmRpbmcgcHJlZmxpZ2h0IHJlcXVlc3RcIiwgcGF5bG9hZF0pXG5cbiAgICAgIHRoaXMucHVzaFdpdGhSZXBseShudWxsLCBcImFsbG93X3VwbG9hZFwiLCBwYXlsb2FkLCByZXNwID0+IHtcbiAgICAgICAgdGhpcy5sb2coXCJ1cGxvYWRcIiwgKCkgPT4gW1wiZ290IHByZWZsaWdodCByZXNwb25zZVwiLCByZXNwXSlcbiAgICAgICAgaWYocmVzcC5lcnJvcil7XG4gICAgICAgICAgdGhpcy51bmRvUmVmcyhyZWYpXG4gICAgICAgICAgbGV0IFtlbnRyeV9yZWYsIHJlYXNvbl0gPSByZXNwLmVycm9yXG4gICAgICAgICAgdGhpcy5sb2coXCJ1cGxvYWRcIiwgKCkgPT4gW2BlcnJvciBmb3IgZW50cnkgJHtlbnRyeV9yZWZ9YCwgcmVhc29uXSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsZXQgb25FcnJvciA9IChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGFubmVsLm9uRXJyb3IoKCkgPT4ge1xuICAgICAgICAgICAgICBpZih0aGlzLmpvaW5Db3VudCA9PT0gam9pbkNvdW50QXRVcGxvYWQpeyBjYWxsYmFjaygpIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICAgIHVwbG9hZGVyLmluaXRBZGFwdGVyVXBsb2FkKHJlc3AsIG9uRXJyb3IsIHRoaXMubGl2ZVNvY2tldClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgZGlzcGF0Y2hVcGxvYWRzKG5hbWUsIGZpbGVzT3JCbG9icyl7XG4gICAgbGV0IGlucHV0cyA9IERPTS5maW5kVXBsb2FkSW5wdXRzKHRoaXMuZWwpLmZpbHRlcihlbCA9PiBlbC5uYW1lID09PSBuYW1lKVxuICAgIGlmKGlucHV0cy5sZW5ndGggPT09IDApeyBsb2dFcnJvcihgbm8gbGl2ZSBmaWxlIGlucHV0cyBmb3VuZCBtYXRjaGluZyB0aGUgbmFtZSBcIiR7bmFtZX1cImApIH1cbiAgICBlbHNlIGlmKGlucHV0cy5sZW5ndGggPiAxKXsgbG9nRXJyb3IoYGR1cGxpY2F0ZSBsaXZlIGZpbGUgaW5wdXRzIGZvdW5kIG1hdGNoaW5nIHRoZSBuYW1lIFwiJHtuYW1lfVwiYCkgfVxuICAgIGVsc2UgeyBET00uZGlzcGF0Y2hFdmVudChpbnB1dHNbMF0sIFBIWF9UUkFDS19VUExPQURTLCB7ZmlsZXM6IGZpbGVzT3JCbG9ic30pIH1cbiAgfVxuXG4gIHB1c2hGb3JtUmVjb3ZlcnkoZm9ybSwgbmV3Q2lkLCBjYWxsYmFjayl7XG4gICAgdGhpcy5saXZlU29ja2V0LndpdGhpbk93bmVycyhmb3JtLCAodmlldywgdGFyZ2V0Q3R4KSA9PiB7XG4gICAgICBsZXQgaW5wdXQgPSBmb3JtLmVsZW1lbnRzWzBdXG4gICAgICBsZXQgcGh4RXZlbnQgPSBmb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0FVVE9fUkVDT1ZFUikpIHx8IGZvcm0uZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhcImNoYW5nZVwiKSlcblxuICAgICAgSlMuZXhlYyhcImNoYW5nZVwiLCBwaHhFdmVudCwgdmlldywgaW5wdXQsIFtcInB1c2hcIiwge190YXJnZXQ6IGlucHV0Lm5hbWUsIG5ld0NpZDogbmV3Q2lkLCBjYWxsYmFjazogY2FsbGJhY2t9XSlcbiAgICB9KVxuICB9XG5cbiAgcHVzaExpbmtQYXRjaChocmVmLCB0YXJnZXRFbCwgY2FsbGJhY2spe1xuICAgIGxldCBsaW5rUmVmID0gdGhpcy5saXZlU29ja2V0LnNldFBlbmRpbmdMaW5rKGhyZWYpXG4gICAgbGV0IHJlZkdlbiA9IHRhcmdldEVsID8gKCkgPT4gdGhpcy5wdXRSZWYoW3RhcmdldEVsXSwgXCJjbGlja1wiKSA6IG51bGxcbiAgICBsZXQgZmFsbGJhY2sgPSAoKSA9PiB0aGlzLmxpdmVTb2NrZXQucmVkaXJlY3Qod2luZG93LmxvY2F0aW9uLmhyZWYpXG5cbiAgICBsZXQgcHVzaCA9IHRoaXMucHVzaFdpdGhSZXBseShyZWZHZW4sIFwibGl2ZV9wYXRjaFwiLCB7dXJsOiBocmVmfSwgcmVzcCA9PiB7XG4gICAgICB0aGlzLmxpdmVTb2NrZXQucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGlmKHJlc3AubGlua19yZWRpcmVjdCl7XG4gICAgICAgICAgdGhpcy5saXZlU29ja2V0LnJlcGxhY2VNYWluKGhyZWYsIG51bGwsIGNhbGxiYWNrLCBsaW5rUmVmKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmKHRoaXMubGl2ZVNvY2tldC5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSl7XG4gICAgICAgICAgICB0aGlzLmhyZWYgPSBocmVmXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuYXBwbHlQZW5kaW5nVXBkYXRlcygpXG4gICAgICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2sobGlua1JlZilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgaWYocHVzaCl7XG4gICAgICBwdXNoLnJlY2VpdmUoXCJ0aW1lb3V0XCIsIGZhbGxiYWNrKVxuICAgIH0gZWxzZSB7XG4gICAgICBmYWxsYmFjaygpXG4gICAgfVxuICB9XG5cbiAgZm9ybXNGb3JSZWNvdmVyeShodG1sKXtcbiAgICBpZih0aGlzLmpvaW5Db3VudCA9PT0gMCl7IHJldHVybiBbXSB9XG5cbiAgICBsZXQgcGh4Q2hhbmdlID0gdGhpcy5iaW5kaW5nKFwiY2hhbmdlXCIpXG4gICAgbGV0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRlbXBsYXRlXCIpXG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbFxuXG4gICAgcmV0dXJuIChcbiAgICAgIERPTS5hbGwodGhpcy5lbCwgYGZvcm1bJHtwaHhDaGFuZ2V9XWApXG4gICAgICAgIC5maWx0ZXIoZm9ybSA9PiBmb3JtLmlkICYmIHRoaXMub3duc0VsZW1lbnQoZm9ybSkpXG4gICAgICAgIC5maWx0ZXIoZm9ybSA9PiBmb3JtLmVsZW1lbnRzLmxlbmd0aCA+IDApXG4gICAgICAgIC5maWx0ZXIoZm9ybSA9PiBmb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoUEhYX0FVVE9fUkVDT1ZFUikpICE9PSBcImlnbm9yZVwiKVxuICAgICAgICAubWFwKGZvcm0gPT4ge1xuICAgICAgICAgIGxldCBuZXdGb3JtID0gdGVtcGxhdGUuY29udGVudC5xdWVyeVNlbGVjdG9yKGBmb3JtW2lkPVwiJHtmb3JtLmlkfVwiXVske3BoeENoYW5nZX09XCIke2Zvcm0uZ2V0QXR0cmlidXRlKHBoeENoYW5nZSl9XCJdYClcbiAgICAgICAgICBpZihuZXdGb3JtKXtcbiAgICAgICAgICAgIHJldHVybiBbZm9ybSwgbmV3Rm9ybSwgdGhpcy50YXJnZXRDb21wb25lbnRJRChuZXdGb3JtKV1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtmb3JtLCBudWxsLCBudWxsXVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigoW2Zvcm0sIG5ld0Zvcm0sIG5ld0NpZF0pID0+IG5ld0Zvcm0pXG4gICAgKVxuICB9XG5cbiAgbWF5YmVQdXNoQ29tcG9uZW50c0Rlc3Ryb3llZChkZXN0cm95ZWRDSURzKXtcbiAgICBsZXQgd2lsbERlc3Ryb3lDSURzID0gZGVzdHJveWVkQ0lEcy5maWx0ZXIoY2lkID0+IHtcbiAgICAgIHJldHVybiBET00uZmluZENvbXBvbmVudE5vZGVMaXN0KHRoaXMuZWwsIGNpZCkubGVuZ3RoID09PSAwXG4gICAgfSlcbiAgICBpZih3aWxsRGVzdHJveUNJRHMubGVuZ3RoID4gMCl7XG4gICAgICB0aGlzLnBydW5pbmdDSURzLnB1c2goLi4ud2lsbERlc3Ryb3lDSURzKVxuXG4gICAgICB0aGlzLnB1c2hXaXRoUmVwbHkobnVsbCwgXCJjaWRzX3dpbGxfZGVzdHJveVwiLCB7Y2lkczogd2lsbERlc3Ryb3lDSURzfSwgKCkgPT4ge1xuICAgICAgICAvLyBUaGUgY2lkcyBhcmUgZWl0aGVyIGJhY2sgb24gdGhlIHBhZ2Ugb3IgdGhleSB3aWxsIGJlIGZ1bGx5IHJlbW92ZWQsXG4gICAgICAgIC8vIHNvIHdlIGNhbiByZW1vdmUgdGhlbSBmcm9tIHRoZSBwcnVuaW5nQ0lEcy5cbiAgICAgICAgdGhpcy5wcnVuaW5nQ0lEcyA9IHRoaXMucHJ1bmluZ0NJRHMuZmlsdGVyKGNpZCA9PiB3aWxsRGVzdHJveUNJRHMuaW5kZXhPZihjaWQpICE9PSAtMSlcblxuICAgICAgICAvLyBTZWUgaWYgYW55IG9mIHRoZSBjaWRzIHdlIHdhbnRlZCB0byBkZXN0cm95IHdlcmUgYWRkZWQgYmFjayxcbiAgICAgICAgLy8gaWYgdGhleSB3ZXJlIGFkZGVkIGJhY2ssIHdlIGRvbid0IGFjdHVhbGx5IGRlc3Ryb3kgdGhlbS5cbiAgICAgICAgbGV0IGNvbXBsZXRlbHlEZXN0cm95Q0lEcyA9IHdpbGxEZXN0cm95Q0lEcy5maWx0ZXIoY2lkID0+IHtcbiAgICAgICAgICByZXR1cm4gRE9NLmZpbmRDb21wb25lbnROb2RlTGlzdCh0aGlzLmVsLCBjaWQpLmxlbmd0aCA9PT0gMFxuICAgICAgICB9KVxuXG4gICAgICAgIGlmKGNvbXBsZXRlbHlEZXN0cm95Q0lEcy5sZW5ndGggPiAwKXtcbiAgICAgICAgICB0aGlzLnB1c2hXaXRoUmVwbHkobnVsbCwgXCJjaWRzX2Rlc3Ryb3llZFwiLCB7Y2lkczogY29tcGxldGVseURlc3Ryb3lDSURzfSwgKHJlc3ApID0+IHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZWQucHJ1bmVDSURzKHJlc3AuY2lkcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIG93bnNFbGVtZW50KGVsKXtcbiAgICByZXR1cm4gZWwuZ2V0QXR0cmlidXRlKFBIWF9QQVJFTlRfSUQpID09PSB0aGlzLmlkIHx8XG4gICAgICBtYXliZShlbC5jbG9zZXN0KFBIWF9WSUVXX1NFTEVDVE9SKSwgbm9kZSA9PiBub2RlLmlkKSA9PT0gdGhpcy5pZFxuICB9XG5cbiAgc3VibWl0Rm9ybShmb3JtLCB0YXJnZXRDdHgsIHBoeEV2ZW50LCBvcHRzID0ge30pe1xuICAgIERPTS5wdXRQcml2YXRlKGZvcm0sIFBIWF9IQVNfU1VCTUlUVEVELCB0cnVlKVxuICAgIGxldCBwaHhGZWVkYmFjayA9IHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKFBIWF9GRUVEQkFDS19GT1IpXG4gICAgbGV0IGlucHV0cyA9IEFycmF5LmZyb20oZm9ybS5lbGVtZW50cylcbiAgICB0aGlzLmxpdmVTb2NrZXQuYmx1ckFjdGl2ZUVsZW1lbnQodGhpcylcbiAgICB0aGlzLnB1c2hGb3JtU3VibWl0KGZvcm0sIHRhcmdldEN0eCwgcGh4RXZlbnQsIG9wdHMsICgpID0+IHtcbiAgICAgIGlucHV0cy5mb3JFYWNoKGlucHV0ID0+IERPTS5zaG93RXJyb3IoaW5wdXQsIHBoeEZlZWRiYWNrKSlcbiAgICAgIHRoaXMubGl2ZVNvY2tldC5yZXN0b3JlUHJldmlvdXNseUFjdGl2ZUZvY3VzKClcbiAgICB9KVxuICB9XG5cbiAgYmluZGluZyhraW5kKXsgcmV0dXJuIHRoaXMubGl2ZVNvY2tldC5iaW5kaW5nKGtpbmQpIH1cbn1cbiIsICIvKiogSW5pdGlhbGl6ZXMgdGhlIExpdmVTb2NrZXRcbiAqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuZFBvaW50IC0gVGhlIHN0cmluZyBXZWJTb2NrZXQgZW5kcG9pbnQsIGllLCBgXCJ3c3M6Ly9leGFtcGxlLmNvbS9saXZlXCJgLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBcIi9saXZlXCJgIChpbmhlcml0ZWQgaG9zdCAmIHByb3RvY29sKVxuICogQHBhcmFtIHtQaG9lbml4LlNvY2tldH0gc29ja2V0IC0gdGhlIHJlcXVpcmVkIFBob2VuaXggU29ja2V0IGNsYXNzIGltcG9ydGVkIGZyb20gXCJwaG9lbml4XCIuIEZvciBleGFtcGxlOlxuICpcbiAqICAgICBpbXBvcnQge1NvY2tldH0gZnJvbSBcInBob2VuaXhcIlxuICogICAgIGltcG9ydCB7TGl2ZVNvY2tldH0gZnJvbSBcInBob2VuaXhfbGl2ZV92aWV3XCJcbiAqICAgICBsZXQgbGl2ZVNvY2tldCA9IG5ldyBMaXZlU29ja2V0KFwiL2xpdmVcIiwgU29ja2V0LCB7Li4ufSlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHNdIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbi4gT3V0c2lkZSBvZiBrZXlzIGxpc3RlZCBiZWxvdywgYWxsXG4gKiBjb25maWd1cmF0aW9uIGlzIHBhc3NlZCBkaXJlY3RseSB0byB0aGUgUGhvZW5peCBTb2NrZXQgY29uc3RydWN0b3IuXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMuZGVmYXVsdHNdIC0gVGhlIG9wdGlvbmFsIGRlZmF1bHRzIHRvIHVzZSBmb3IgdmFyaW91cyBiaW5kaW5ncyxcbiAqIHN1Y2ggYXMgYHBoeC1kZWJvdW5jZWAuIFN1cHBvcnRzIHRoZSBmb2xsb3dpbmcga2V5czpcbiAqXG4gKiAgIC0gZGVib3VuY2UgLSB0aGUgbWlsbGlzZWNvbmQgcGh4LWRlYm91bmNlIHRpbWUuIERlZmF1bHRzIDMwMFxuICogICAtIHRocm90dGxlIC0gdGhlIG1pbGxpc2Vjb25kIHBoeC10aHJvdHRsZSB0aW1lLiBEZWZhdWx0cyAzMDBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy5wYXJhbXNdIC0gVGhlIG9wdGlvbmFsIGZ1bmN0aW9uIGZvciBwYXNzaW5nIGNvbm5lY3QgcGFyYW1zLlxuICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIHRoZSBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIExpdmVWaWV3LiBGb3IgZXhhbXBsZTpcbiAqXG4gKiAgICAgKGVsKSA9PiB7dmlldzogZWwuZ2V0QXR0cmlidXRlKFwiZGF0YS1teS12aWV3LW5hbWVcIiwgdG9rZW46IHdpbmRvdy5teVRva2VufVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy5iaW5kaW5nUHJlZml4XSAtIFRoZSBvcHRpb25hbCBwcmVmaXggdG8gdXNlIGZvciBhbGwgcGh4IERPTSBhbm5vdGF0aW9ucy5cbiAqIERlZmF1bHRzIHRvIFwicGh4LVwiLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLmhvb2tzXSAtIFRoZSBvcHRpb25hbCBvYmplY3QgZm9yIHJlZmVyZW5jaW5nIExpdmVWaWV3IGhvb2sgY2FsbGJhY2tzLlxuICogQHBhcmFtIHtPYmplY3R9IFtvcHRzLnVwbG9hZGVyc10gLSBUaGUgb3B0aW9uYWwgb2JqZWN0IGZvciByZWZlcmVuY2luZyBMaXZlVmlldyB1cGxvYWRlciBjYWxsYmFja3MuXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtvcHRzLmxvYWRlclRpbWVvdXRdIC0gVGhlIG9wdGlvbmFsIGRlbGF5IGluIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBhcHBseVxuICogbG9hZGluZyBzdGF0ZXMuXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtvcHRzLm1heFJlbG9hZHNdIC0gVGhlIG1heGltdW0gcmVsb2FkcyBiZWZvcmUgZW50ZXJpbmcgZmFpbHNhZmUgbW9kZS5cbiAqIEBwYXJhbSB7aW50ZWdlcn0gW29wdHMucmVsb2FkSml0dGVyTWluXSAtIFRoZSBtaW5pbXVtIHRpbWUgYmV0d2VlbiBub3JtYWwgcmVsb2FkIGF0dGVtcHRzLlxuICogQHBhcmFtIHtpbnRlZ2VyfSBbb3B0cy5yZWxvYWRKaXR0ZXJNYXhdIC0gVGhlIG1heGltdW0gdGltZSBiZXR3ZWVuIG5vcm1hbCByZWxvYWQgYXR0ZW1wdHMuXG4gKiBAcGFyYW0ge2ludGVnZXJ9IFtvcHRzLmZhaWxzYWZlSml0dGVyXSAtIFRoZSB0aW1lIGJldHdlZW4gcmVsb2FkIGF0dGVtcHRzIGluIGZhaWxzYWZlIG1vZGUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbb3B0cy52aWV3TG9nZ2VyXSAtIFRoZSBvcHRpb25hbCBmdW5jdGlvbiB0byBsb2cgZGVidWcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlOlxuICpcbiAqICAgICAodmlldywga2luZCwgbXNnLCBvYmopID0+IGNvbnNvbGUubG9nKGAke3ZpZXcuaWR9ICR7a2luZH06ICR7bXNnfSAtIGAsIG9iailcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMubWV0YWRhdGFdIC0gVGhlIG9wdGlvbmFsIG9iamVjdCBtYXBwaW5nIGV2ZW50IG5hbWVzIHRvIGZ1bmN0aW9ucyBmb3JcbiAqIHBvcHVsYXRpbmcgZXZlbnQgbWV0YWRhdGEuIEZvciBleGFtcGxlOlxuICpcbiAqICAgICBtZXRhZGF0YToge1xuICogICAgICAgY2xpY2s6IChlLCBlbCkgPT4ge1xuICogICAgICAgICByZXR1cm4ge1xuICogICAgICAgICAgIGN0cmxLZXk6IGUuY3RybEtleSxcbiAqICAgICAgICAgICBtZXRhS2V5OiBlLm1ldGFLZXksXG4gKiAgICAgICAgICAgZGV0YWlsOiBlLmRldGFpbCB8fCAxLFxuICogICAgICAgICB9XG4gKiAgICAgICB9LFxuICogICAgICAga2V5ZG93bjogKGUsIGVsKSA9PiB7XG4gKiAgICAgICAgIHJldHVybiB7XG4gKiAgICAgICAgICAga2V5OiBlLmtleSxcbiAqICAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gKiAgICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICogICAgICAgICAgIHNoaWZ0S2V5OiBlLnNoaWZ0S2V5XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH1cbiAqICAgICB9XG4gKiBAcGFyYW0ge09iamVjdH0gW29wdHMuc2Vzc2lvblN0b3JhZ2VdIC0gQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICogVXNlZnVsIHdoZW4gTGl2ZVZpZXcgd29uJ3QgaGF2ZSBhY2Nlc3MgdG8gYHNlc3Npb25TdG9yYWdlYC4gIEZvciBleGFtcGxlLCBUaGlzIGNvdWxkXG4gKiBoYXBwZW4gaWYgYSBzaXRlIGxvYWRzIGEgY3Jvc3MtZG9tYWluIExpdmVWaWV3IGluIGFuIGlmcmFtZS4gIEV4YW1wbGUgdXNhZ2U6XG4gKlxuICogICAgIGNsYXNzIEluTWVtb3J5U3RvcmFnZSB7XG4gKiAgICAgICBjb25zdHJ1Y3RvcigpIHsgdGhpcy5zdG9yYWdlID0ge30gfVxuICogICAgICAgZ2V0SXRlbShrZXlOYW1lKSB7IHJldHVybiB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gfVxuICogICAgICAgcmVtb3ZlSXRlbShrZXlOYW1lKSB7IGRlbGV0ZSB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gfVxuICogICAgICAgc2V0SXRlbShrZXlOYW1lLCBrZXlWYWx1ZSkgeyB0aGlzLnN0b3JhZ2Vba2V5TmFtZV0gPSBrZXlWYWx1ZSB9XG4gKiAgICAgfVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0cy5sb2NhbFN0b3JhZ2VdIC0gQW4gb3B0aW9uYWwgU3RvcmFnZSBjb21wYXRpYmxlIG9iamVjdFxuICogVXNlZnVsIGZvciB3aGVuIExpdmVWaWV3IHdvbid0IGhhdmUgYWNjZXNzIHRvIGBsb2NhbFN0b3JhZ2VgLlxuICogU2VlIGBvcHRzLnNlc3Npb25TdG9yYWdlYCBmb3IgZXhhbXBsZXMuXG4qL1xuXG5pbXBvcnQge1xuICBCSU5ESU5HX1BSRUZJWCxcbiAgQ09OU0VDVVRJVkVfUkVMT0FEUyxcbiAgREVGQVVMVFMsXG4gIEZBSUxTQUZFX0pJVFRFUixcbiAgTE9BREVSX1RJTUVPVVQsXG4gIE1BWF9SRUxPQURTLFxuICBQSFhfREVCT1VOQ0UsXG4gIFBIWF9EUk9QX1RBUkdFVCxcbiAgUEhYX0hBU19GT0NVU0VELFxuICBQSFhfS0VZLFxuICBQSFhfTElOS19TVEFURSxcbiAgUEhYX0xJVkVfTElOSyxcbiAgUEhYX0xWX0RFQlVHLFxuICBQSFhfTFZfTEFURU5DWV9TSU0sXG4gIFBIWF9MVl9QUk9GSUxFLFxuICBQSFhfTUFJTixcbiAgUEhYX1BBUkVOVF9JRCxcbiAgUEhYX1ZJRVdfU0VMRUNUT1IsXG4gIFBIWF9ST09UX0lELFxuICBQSFhfVEhST1RUTEUsXG4gIFBIWF9UUkFDS19VUExPQURTLFxuICBQSFhfU0VTU0lPTixcbiAgUkVMT0FEX0pJVFRFUl9NSU4sXG4gIFJFTE9BRF9KSVRURVJfTUFYLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIlxuXG5pbXBvcnQge1xuICBjbG9uZSxcbiAgY2xvc2VzdFBoeEJpbmRpbmcsXG4gIGNsb3N1cmUsXG4gIGRlYnVnLFxuICBpc09iamVjdCxcbiAgbWF5YmVcbn0gZnJvbSBcIi4vdXRpbHNcIlxuXG5pbXBvcnQgQnJvd3NlciBmcm9tIFwiLi9icm93c2VyXCJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tXCJcbmltcG9ydCBIb29rcyBmcm9tIFwiLi9ob29rc1wiXG5pbXBvcnQgTGl2ZVVwbG9hZGVyIGZyb20gXCIuL2xpdmVfdXBsb2FkZXJcIlxuaW1wb3J0IFZpZXcgZnJvbSBcIi4vdmlld1wiXG5pbXBvcnQgSlMgZnJvbSBcIi4vanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaXZlU29ja2V0IHtcbiAgY29uc3RydWN0b3IodXJsLCBwaHhTb2NrZXQsIG9wdHMgPSB7fSl7XG4gICAgdGhpcy51bmxvYWRlZCA9IGZhbHNlXG4gICAgaWYoIXBoeFNvY2tldCB8fCBwaHhTb2NrZXQuY29uc3RydWN0b3IubmFtZSA9PT0gXCJPYmplY3RcIil7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuICAgICAgYSBwaG9lbml4IFNvY2tldCBtdXN0IGJlIHByb3ZpZGVkIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIExpdmVTb2NrZXQgY29uc3RydWN0b3IuIEZvciBleGFtcGxlOlxuXG4gICAgICAgICAgaW1wb3J0IHtTb2NrZXR9IGZyb20gXCJwaG9lbml4XCJcbiAgICAgICAgICBpbXBvcnQge0xpdmVTb2NrZXR9IGZyb20gXCJwaG9lbml4X2xpdmVfdmlld1wiXG4gICAgICAgICAgbGV0IGxpdmVTb2NrZXQgPSBuZXcgTGl2ZVNvY2tldChcIi9saXZlXCIsIFNvY2tldCwgey4uLn0pXG4gICAgICBgKVxuICAgIH1cbiAgICB0aGlzLnNvY2tldCA9IG5ldyBwaHhTb2NrZXQodXJsLCBvcHRzKVxuICAgIHRoaXMuYmluZGluZ1ByZWZpeCA9IG9wdHMuYmluZGluZ1ByZWZpeCB8fCBCSU5ESU5HX1BSRUZJWFxuICAgIHRoaXMub3B0cyA9IG9wdHNcbiAgICB0aGlzLnBhcmFtcyA9IGNsb3N1cmUob3B0cy5wYXJhbXMgfHwge30pXG4gICAgdGhpcy52aWV3TG9nZ2VyID0gb3B0cy52aWV3TG9nZ2VyXG4gICAgdGhpcy5tZXRhZGF0YUNhbGxiYWNrcyA9IG9wdHMubWV0YWRhdGEgfHwge31cbiAgICB0aGlzLmRlZmF1bHRzID0gT2JqZWN0LmFzc2lnbihjbG9uZShERUZBVUxUUyksIG9wdHMuZGVmYXVsdHMgfHwge30pXG4gICAgdGhpcy5hY3RpdmVFbGVtZW50ID0gbnVsbFxuICAgIHRoaXMucHJldkFjdGl2ZSA9IG51bGxcbiAgICB0aGlzLnNpbGVuY2VkID0gZmFsc2VcbiAgICB0aGlzLm1haW4gPSBudWxsXG4gICAgdGhpcy5saW5rUmVmID0gMVxuICAgIHRoaXMuY2xpY2tSZWYgPSAxXG4gICAgdGhpcy5yb290cyA9IHt9XG4gICAgdGhpcy5ocmVmID0gd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICB0aGlzLnBlbmRpbmdMaW5rID0gbnVsbFxuICAgIHRoaXMuY3VycmVudExvY2F0aW9uID0gY2xvbmUod2luZG93LmxvY2F0aW9uKVxuICAgIHRoaXMuaG9va3MgPSBvcHRzLmhvb2tzIHx8IHt9XG4gICAgdGhpcy51cGxvYWRlcnMgPSBvcHRzLnVwbG9hZGVycyB8fCB7fVxuICAgIHRoaXMubG9hZGVyVGltZW91dCA9IG9wdHMubG9hZGVyVGltZW91dCB8fCBMT0FERVJfVElNRU9VVFxuICAgIHRoaXMubWF4UmVsb2FkcyA9IG9wdHMubWF4UmVsb2FkcyB8fCBNQVhfUkVMT0FEU1xuICAgIHRoaXMucmVsb2FkSml0dGVyTWluID0gb3B0cy5yZWxvYWRKaXR0ZXJNaW4gfHwgUkVMT0FEX0pJVFRFUl9NSU5cbiAgICB0aGlzLnJlbG9hZEppdHRlck1heCA9IG9wdHMucmVsb2FkSml0dGVyTWF4IHx8IFJFTE9BRF9KSVRURVJfTUFYXG4gICAgdGhpcy5mYWlsc2FmZUppdHRlciA9IG9wdHMuZmFpbHNhZmVKaXR0ZXIgfHwgRkFJTFNBRkVfSklUVEVSXG4gICAgdGhpcy5sb2NhbFN0b3JhZ2UgPSBvcHRzLmxvY2FsU3RvcmFnZSB8fCB3aW5kb3cubG9jYWxTdG9yYWdlXG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZSA9IG9wdHMuc2Vzc2lvblN0b3JhZ2UgfHwgd2luZG93LnNlc3Npb25TdG9yYWdlXG4gICAgdGhpcy5ib3VuZFRvcExldmVsRXZlbnRzID0gZmFsc2VcbiAgICB0aGlzLmRvbUNhbGxiYWNrcyA9IE9iamVjdC5hc3NpZ24oe29uTm9kZUFkZGVkOiBjbG9zdXJlKCksIG9uQmVmb3JlRWxVcGRhdGVkOiBjbG9zdXJlKCl9LCBvcHRzLmRvbSB8fCB7fSlcbiAgICB0aGlzLnRyYW5zaXRpb25zID0gbmV3IFRyYW5zaXRpb25TZXQoKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicGFnZWhpZGVcIiwgX2UgPT4ge1xuICAgICAgdGhpcy51bmxvYWRlZCA9IHRydWVcbiAgICB9KVxuICAgIHRoaXMuc29ja2V0Lm9uT3BlbigoKSA9PiB7XG4gICAgICBpZih0aGlzLmlzVW5sb2FkZWQoKSl7XG4gICAgICAgIC8vIHJlbG9hZCBwYWdlIGlmIGJlaW5nIHJlc3RvcmVkIGZyb20gYmFjay9mb3J3YXJkIGNhY2hlIGFuZCBicm93c2VyIGRvZXMgbm90IGVtaXQgXCJwYWdlc2hvd1wiXG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvLyBwdWJsaWNcblxuICBpc1Byb2ZpbGVFbmFibGVkKCl7IHJldHVybiB0aGlzLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oUEhYX0xWX1BST0ZJTEUpID09PSBcInRydWVcIiB9XG5cbiAgaXNEZWJ1Z0VuYWJsZWQoKXsgcmV0dXJuIHRoaXMuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShQSFhfTFZfREVCVUcpID09PSBcInRydWVcIiB9XG5cbiAgZW5hYmxlRGVidWcoKXsgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9ERUJVRywgXCJ0cnVlXCIpIH1cblxuICBlbmFibGVQcm9maWxpbmcoKXsgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9QUk9GSUxFLCBcInRydWVcIikgfVxuXG4gIGRpc2FibGVEZWJ1ZygpeyB0aGlzLnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oUEhYX0xWX0RFQlVHKSB9XG5cbiAgZGlzYWJsZVByb2ZpbGluZygpeyB0aGlzLnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oUEhYX0xWX1BST0ZJTEUpIH1cblxuICBlbmFibGVMYXRlbmN5U2ltKHVwcGVyQm91bmRNcyl7XG4gICAgdGhpcy5lbmFibGVEZWJ1ZygpXG4gICAgY29uc29sZS5sb2coXCJsYXRlbmN5IHNpbXVsYXRvciBlbmFibGVkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhpcyBicm93c2VyIHNlc3Npb24uIENhbGwgZGlzYWJsZUxhdGVuY3lTaW0oKSB0byBkaXNhYmxlXCIpXG4gICAgdGhpcy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSwgdXBwZXJCb3VuZE1zKVxuICB9XG5cbiAgZGlzYWJsZUxhdGVuY3lTaW0oKXsgdGhpcy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSkgfVxuXG4gIGdldExhdGVuY3lTaW0oKXtcbiAgICBsZXQgc3RyID0gdGhpcy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKFBIWF9MVl9MQVRFTkNZX1NJTSlcbiAgICByZXR1cm4gc3RyID8gcGFyc2VJbnQoc3RyKSA6IG51bGxcbiAgfVxuXG4gIGdldFNvY2tldCgpeyByZXR1cm4gdGhpcy5zb2NrZXQgfVxuXG4gIGNvbm5lY3QoKXtcbiAgICBsZXQgZG9Db25uZWN0ID0gKCkgPT4ge1xuICAgICAgaWYodGhpcy5qb2luUm9vdFZpZXdzKCkpe1xuICAgICAgICB0aGlzLmJpbmRUb3BMZXZlbEV2ZW50cygpXG4gICAgICAgIHRoaXMuc29ja2V0LmNvbm5lY3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBpZihbXCJjb21wbGV0ZVwiLCBcImxvYWRlZFwiLCBcImludGVyYWN0aXZlXCJdLmluZGV4T2YoZG9jdW1lbnQucmVhZHlTdGF0ZSkgPj0gMCl7XG4gICAgICBkb0Nvbm5lY3QoKVxuICAgIH0gZWxzZSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCAoKSA9PiBkb0Nvbm5lY3QoKSlcbiAgICB9XG4gIH1cblxuICBkaXNjb25uZWN0KGNhbGxiYWNrKXsgdGhpcy5zb2NrZXQuZGlzY29ubmVjdChjYWxsYmFjaykgfVxuXG4gIGV4ZWNKUyhlbCwgZW5jb2RlZEpTLCBldmVudFR5cGUgPSBudWxsKXtcbiAgICB0aGlzLm93bmVyKGVsLCB2aWV3ID0+IEpTLmV4ZWMoZXZlbnRUeXBlLCBlbmNvZGVkSlMsIHZpZXcsIGVsKSlcbiAgfVxuXG4gIC8vIHByaXZhdGVcblxuICB0cmlnZ2VyRE9NKGtpbmQsIGFyZ3MpeyB0aGlzLmRvbUNhbGxiYWNrc1traW5kXSguLi5hcmdzKSB9XG5cbiAgdGltZShuYW1lLCBmdW5jKXtcbiAgICBpZighdGhpcy5pc1Byb2ZpbGVFbmFibGVkKCkgfHwgIWNvbnNvbGUudGltZSl7IHJldHVybiBmdW5jKCkgfVxuICAgIGNvbnNvbGUudGltZShuYW1lKVxuICAgIGxldCByZXN1bHQgPSBmdW5jKClcbiAgICBjb25zb2xlLnRpbWVFbmQobmFtZSlcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBsb2codmlldywga2luZCwgbXNnQ2FsbGJhY2spe1xuICAgIGlmKHRoaXMudmlld0xvZ2dlcil7XG4gICAgICBsZXQgW21zZywgb2JqXSA9IG1zZ0NhbGxiYWNrKClcbiAgICAgIHRoaXMudmlld0xvZ2dlcih2aWV3LCBraW5kLCBtc2csIG9iailcbiAgICB9IGVsc2UgaWYodGhpcy5pc0RlYnVnRW5hYmxlZCgpKXtcbiAgICAgIGxldCBbbXNnLCBvYmpdID0gbXNnQ2FsbGJhY2soKVxuICAgICAgZGVidWcodmlldywga2luZCwgbXNnLCBvYmopXG4gICAgfVxuICB9XG5cbiAgcmVxdWVzdERPTVVwZGF0ZShjYWxsYmFjayl7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZnRlcihjYWxsYmFjaylcbiAgfVxuXG4gIHRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lID0gZnVuY3Rpb24oKXt9KXtcbiAgICB0aGlzLnRyYW5zaXRpb25zLmFkZFRyYW5zaXRpb24odGltZSwgb25TdGFydCwgb25Eb25lKVxuICB9XG5cbiAgb25DaGFubmVsKGNoYW5uZWwsIGV2ZW50LCBjYil7XG4gICAgY2hhbm5lbC5vbihldmVudCwgZGF0YSA9PiB7XG4gICAgICBsZXQgbGF0ZW5jeSA9IHRoaXMuZ2V0TGF0ZW5jeVNpbSgpXG4gICAgICBpZighbGF0ZW5jeSl7XG4gICAgICAgIGNiKGRhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgc2ltdWxhdGluZyAke2xhdGVuY3l9bXMgb2YgbGF0ZW5jeSBmcm9tIHNlcnZlciB0byBjbGllbnRgKVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGNiKGRhdGEpLCBsYXRlbmN5KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICB3cmFwUHVzaCh2aWV3LCBvcHRzLCBwdXNoKXtcbiAgICBsZXQgbGF0ZW5jeSA9IHRoaXMuZ2V0TGF0ZW5jeVNpbSgpXG4gICAgbGV0IG9sZEpvaW5Db3VudCA9IHZpZXcuam9pbkNvdW50XG4gICAgaWYoIWxhdGVuY3kpe1xuICAgICAgaWYob3B0cy50aW1lb3V0KXtcbiAgICAgICAgcmV0dXJuIHB1c2goKS5yZWNlaXZlKFwidGltZW91dFwiLCAoKSA9PiB7XG4gICAgICAgICAgaWYodmlldy5qb2luQ291bnQgPT09IG9sZEpvaW5Db3VudCAmJiAhdmlldy5pc0Rlc3Ryb3llZCgpKXtcbiAgICAgICAgICAgIHRoaXMucmVsb2FkV2l0aEppdHRlcih2aWV3LCAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9nKHZpZXcsIFwidGltZW91dFwiLCAoKSA9PiBbXCJyZWNlaXZlZCB0aW1lb3V0IHdoaWxlIGNvbW11bmljYXRpbmcgd2l0aCBzZXJ2ZXIuIEZhbGxpbmcgYmFjayB0byBoYXJkIHJlZnJlc2ggZm9yIHJlY292ZXJ5XCJdKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcHVzaCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYHNpbXVsYXRpbmcgJHtsYXRlbmN5fW1zIG9mIGxhdGVuY3kgZnJvbSBjbGllbnQgdG8gc2VydmVyYClcbiAgICBsZXQgZmFrZVB1c2ggPSB7XG4gICAgICByZWNlaXZlczogW10sXG4gICAgICByZWNlaXZlKGtpbmQsIGNiKXsgdGhpcy5yZWNlaXZlcy5wdXNoKFtraW5kLCBjYl0pIH1cbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZih2aWV3LmlzRGVzdHJveWVkKCkpeyByZXR1cm4gfVxuICAgICAgZmFrZVB1c2gucmVjZWl2ZXMucmVkdWNlKChhY2MsIFtraW5kLCBjYl0pID0+IGFjYy5yZWNlaXZlKGtpbmQsIGNiKSwgcHVzaCgpKVxuICAgIH0sIGxhdGVuY3kpXG4gICAgcmV0dXJuIGZha2VQdXNoXG4gIH1cblxuICByZWxvYWRXaXRoSml0dGVyKHZpZXcsIGxvZyl7XG4gICAgdmlldy5kZXN0cm95KClcbiAgICB0aGlzLmRpc2Nvbm5lY3QoKVxuICAgIGxldCBtaW5NcyA9IHRoaXMucmVsb2FkSml0dGVyTWluXG4gICAgbGV0IG1heE1zID0gdGhpcy5yZWxvYWRKaXR0ZXJNYXhcbiAgICBsZXQgYWZ0ZXJNcyA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXhNcyAtIG1pbk1zICsgMSkpICsgbWluTXNcbiAgICBsZXQgdHJpZXMgPSBCcm93c2VyLnVwZGF0ZUxvY2FsKHRoaXMubG9jYWxTdG9yYWdlLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUsIENPTlNFQ1VUSVZFX1JFTE9BRFMsIDAsIGNvdW50ID0+IGNvdW50ICsgMSlcbiAgICBsb2cgPyBsb2coKSA6IHRoaXMubG9nKHZpZXcsIFwiam9pblwiLCAoKSA9PiBbYGVuY291bnRlcmVkICR7dHJpZXN9IGNvbnNlY3V0aXZlIHJlbG9hZHNgXSlcbiAgICBpZih0cmllcyA+IHRoaXMubWF4UmVsb2Fkcyl7XG4gICAgICB0aGlzLmxvZyh2aWV3LCBcImpvaW5cIiwgKCkgPT4gW2BleGNlZWRlZCAke3RoaXMubWF4UmVsb2Fkc30gY29uc2VjdXRpdmUgcmVsb2Fkcy4gRW50ZXJpbmcgZmFpbHNhZmUgbW9kZWBdKVxuICAgICAgYWZ0ZXJNcyA9IHRoaXMuZmFpbHNhZmVKaXR0ZXJcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZih0aGlzLmhhc1BlbmRpbmdMaW5rKCkpe1xuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB0aGlzLnBlbmRpbmdMaW5rXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKClcbiAgICAgIH1cbiAgICB9LCBhZnRlck1zKVxuICB9XG5cbiAgZ2V0SG9va0NhbGxiYWNrcyhuYW1lKXtcbiAgICByZXR1cm4gbmFtZSAmJiBuYW1lLnN0YXJ0c1dpdGgoXCJQaG9lbml4LlwiKSA/IEhvb2tzW25hbWUuc3BsaXQoXCIuXCIpWzFdXSA6IHRoaXMuaG9va3NbbmFtZV1cbiAgfVxuXG4gIGlzVW5sb2FkZWQoKXsgcmV0dXJuIHRoaXMudW5sb2FkZWQgfVxuXG4gIGlzQ29ubmVjdGVkKCl7IHJldHVybiB0aGlzLnNvY2tldC5pc0Nvbm5lY3RlZCgpIH1cblxuICBnZXRCaW5kaW5nUHJlZml4KCl7IHJldHVybiB0aGlzLmJpbmRpbmdQcmVmaXggfVxuXG4gIGJpbmRpbmcoa2luZCl7IHJldHVybiBgJHt0aGlzLmdldEJpbmRpbmdQcmVmaXgoKX0ke2tpbmR9YCB9XG5cbiAgY2hhbm5lbCh0b3BpYywgcGFyYW1zKXsgcmV0dXJuIHRoaXMuc29ja2V0LmNoYW5uZWwodG9waWMsIHBhcmFtcykgfVxuXG4gIGpvaW5Sb290Vmlld3MoKXtcbiAgICBsZXQgcm9vdHNGb3VuZCA9IGZhbHNlXG4gICAgRE9NLmFsbChkb2N1bWVudCwgYCR7UEhYX1ZJRVdfU0VMRUNUT1J9Om5vdChbJHtQSFhfUEFSRU5UX0lEfV0pYCwgcm9vdEVsID0+IHtcbiAgICAgIGlmKCF0aGlzLmdldFJvb3RCeUlkKHJvb3RFbC5pZCkpe1xuICAgICAgICBsZXQgdmlldyA9IHRoaXMubmV3Um9vdFZpZXcocm9vdEVsKVxuICAgICAgICB2aWV3LnNldEhyZWYodGhpcy5nZXRIcmVmKCkpXG4gICAgICAgIHZpZXcuam9pbigpXG4gICAgICAgIGlmKHJvb3RFbC5nZXRBdHRyaWJ1dGUoUEhYX01BSU4pKXsgdGhpcy5tYWluID0gdmlldyB9XG4gICAgICB9XG4gICAgICByb290c0ZvdW5kID0gdHJ1ZVxuICAgIH0pXG4gICAgcmV0dXJuIHJvb3RzRm91bmRcbiAgfVxuXG4gIHJlZGlyZWN0KHRvLCBmbGFzaCl7XG4gICAgdGhpcy5kaXNjb25uZWN0KClcbiAgICBCcm93c2VyLnJlZGlyZWN0KHRvLCBmbGFzaClcbiAgfVxuXG4gIHJlcGxhY2VNYWluKGhyZWYsIGZsYXNoLCBjYWxsYmFjayA9IG51bGwsIGxpbmtSZWYgPSB0aGlzLnNldFBlbmRpbmdMaW5rKGhyZWYpKXtcbiAgICBsZXQgb2xkTWFpbkVsID0gdGhpcy5tYWluLmVsXG4gICAgbGV0IG5ld01haW5FbCA9IERPTS5jbG9uZU5vZGUob2xkTWFpbkVsLCBcIlwiKVxuICAgIHRoaXMubWFpbi5zaG93TG9hZGVyKHRoaXMubG9hZGVyVGltZW91dClcbiAgICB0aGlzLm1haW4uZGVzdHJveSgpXG5cbiAgICB0aGlzLm1haW4gPSB0aGlzLm5ld1Jvb3RWaWV3KG5ld01haW5FbCwgZmxhc2gpXG4gICAgdGhpcy5tYWluLnNldFJlZGlyZWN0KGhyZWYpXG4gICAgdGhpcy50cmFuc2l0aW9uUmVtb3ZlcygpXG4gICAgdGhpcy5tYWluLmpvaW4oKGpvaW5Db3VudCwgb25Eb25lKSA9PiB7XG4gICAgICBpZihqb2luQ291bnQgPT09IDEgJiYgdGhpcy5jb21taXRQZW5kaW5nTGluayhsaW5rUmVmKSl7XG4gICAgICAgIHRoaXMucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgICAgRE9NLmZpbmRQaHhTdGlja3koZG9jdW1lbnQpLmZvckVhY2goZWwgPT4gbmV3TWFpbkVsLmFwcGVuZENoaWxkKGVsKSlcbiAgICAgICAgICBvbGRNYWluRWwucmVwbGFjZVdpdGgobmV3TWFpbkVsKVxuICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrKClcbiAgICAgICAgICBvbkRvbmUoKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICB0cmFuc2l0aW9uUmVtb3ZlcyhlbGVtZW50cyl7XG4gICAgbGV0IHJlbW92ZUF0dHIgPSB0aGlzLmJpbmRpbmcoXCJyZW1vdmVcIilcbiAgICBlbGVtZW50cyA9IGVsZW1lbnRzIHx8IERPTS5hbGwoZG9jdW1lbnQsIGBbJHtyZW1vdmVBdHRyfV1gKVxuICAgIGVsZW1lbnRzLmZvckVhY2goZWwgPT4ge1xuICAgICAgaWYoZG9jdW1lbnQuYm9keS5jb250YWlucyhlbCkpeyAvLyBza2lwIGNoaWxkcmVuIGFscmVhZHkgcmVtb3ZlZFxuICAgICAgICB0aGlzLmV4ZWNKUyhlbCwgZWwuZ2V0QXR0cmlidXRlKHJlbW92ZUF0dHIpLCBcInJlbW92ZVwiKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBpc1BoeFZpZXcoZWwpeyByZXR1cm4gZWwuZ2V0QXR0cmlidXRlICYmIGVsLmdldEF0dHJpYnV0ZShQSFhfU0VTU0lPTikgIT09IG51bGwgfVxuXG4gIG5ld1Jvb3RWaWV3KGVsLCBmbGFzaCl7XG4gICAgbGV0IHZpZXcgPSBuZXcgVmlldyhlbCwgdGhpcywgbnVsbCwgZmxhc2gpXG4gICAgdGhpcy5yb290c1t2aWV3LmlkXSA9IHZpZXdcbiAgICByZXR1cm4gdmlld1xuICB9XG5cbiAgb3duZXIoY2hpbGRFbCwgY2FsbGJhY2spe1xuICAgIGxldCB2aWV3ID0gbWF5YmUoY2hpbGRFbC5jbG9zZXN0KFBIWF9WSUVXX1NFTEVDVE9SKSwgZWwgPT4gdGhpcy5nZXRWaWV3QnlFbChlbCkpIHx8IHRoaXMubWFpblxuICAgIGlmKHZpZXcpeyBjYWxsYmFjayh2aWV3KSB9XG4gIH1cblxuICB3aXRoaW5Pd25lcnMoY2hpbGRFbCwgY2FsbGJhY2spe1xuICAgIHRoaXMub3duZXIoY2hpbGRFbCwgdmlldyA9PiBjYWxsYmFjayh2aWV3LCBjaGlsZEVsKSlcbiAgfVxuXG4gIGdldFZpZXdCeUVsKGVsKXtcbiAgICBsZXQgcm9vdElkID0gZWwuZ2V0QXR0cmlidXRlKFBIWF9ST09UX0lEKVxuICAgIHJldHVybiBtYXliZSh0aGlzLmdldFJvb3RCeUlkKHJvb3RJZCksIHJvb3QgPT4gcm9vdC5nZXREZXNjZW5kZW50QnlFbChlbCkpXG4gIH1cblxuICBnZXRSb290QnlJZChpZCl7IHJldHVybiB0aGlzLnJvb3RzW2lkXSB9XG5cbiAgZGVzdHJveUFsbFZpZXdzKCl7XG4gICAgZm9yKGxldCBpZCBpbiB0aGlzLnJvb3RzKXtcbiAgICAgIHRoaXMucm9vdHNbaWRdLmRlc3Ryb3koKVxuICAgICAgZGVsZXRlIHRoaXMucm9vdHNbaWRdXG4gICAgfVxuICB9XG5cbiAgZGVzdHJveVZpZXdCeUVsKGVsKXtcbiAgICBsZXQgcm9vdCA9IHRoaXMuZ2V0Um9vdEJ5SWQoZWwuZ2V0QXR0cmlidXRlKFBIWF9ST09UX0lEKSlcbiAgICBpZihyb290ICYmIHJvb3QuaWQgPT09IGVsLmlkKXtcbiAgICAgIHJvb3QuZGVzdHJveSgpXG4gICAgICBkZWxldGUgdGhpcy5yb290c1tyb290LmlkXVxuICAgIH0gZWxzZSBpZihyb290KXtcbiAgICAgIHJvb3QuZGVzdHJveURlc2NlbmRlbnQoZWwuaWQpXG4gICAgfVxuICB9XG5cbiAgc2V0QWN0aXZlRWxlbWVudCh0YXJnZXQpe1xuICAgIGlmKHRoaXMuYWN0aXZlRWxlbWVudCA9PT0gdGFyZ2V0KXsgcmV0dXJuIH1cbiAgICB0aGlzLmFjdGl2ZUVsZW1lbnQgPSB0YXJnZXRcbiAgICBsZXQgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgaWYodGFyZ2V0ID09PSB0aGlzLmFjdGl2ZUVsZW1lbnQpeyB0aGlzLmFjdGl2ZUVsZW1lbnQgPSBudWxsIH1cbiAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzKVxuICAgICAgdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCB0aGlzKVxuICAgIH1cbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgY2FuY2VsKVxuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgY2FuY2VsKVxuICB9XG5cbiAgZ2V0QWN0aXZlRWxlbWVudCgpe1xuICAgIGlmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGRvY3VtZW50LmJvZHkpe1xuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlRWxlbWVudCB8fCBkb2N1bWVudC5hY3RpdmVFbGVtZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgY2FuIGJlIG51bGwgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTFcbiAgICAgIHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50IHx8IGRvY3VtZW50LmJvZHlcbiAgICB9XG4gIH1cblxuICBkcm9wQWN0aXZlRWxlbWVudCh2aWV3KXtcbiAgICBpZih0aGlzLnByZXZBY3RpdmUgJiYgdmlldy5vd25zRWxlbWVudCh0aGlzLnByZXZBY3RpdmUpKXtcbiAgICAgIHRoaXMucHJldkFjdGl2ZSA9IG51bGxcbiAgICB9XG4gIH1cblxuICByZXN0b3JlUHJldmlvdXNseUFjdGl2ZUZvY3VzKCl7XG4gICAgaWYodGhpcy5wcmV2QWN0aXZlICYmIHRoaXMucHJldkFjdGl2ZSAhPT0gZG9jdW1lbnQuYm9keSl7XG4gICAgICB0aGlzLnByZXZBY3RpdmUuZm9jdXMoKVxuICAgIH1cbiAgfVxuXG4gIGJsdXJBY3RpdmVFbGVtZW50KCl7XG4gICAgdGhpcy5wcmV2QWN0aXZlID0gdGhpcy5nZXRBY3RpdmVFbGVtZW50KClcbiAgICBpZih0aGlzLnByZXZBY3RpdmUgIT09IGRvY3VtZW50LmJvZHkpeyB0aGlzLnByZXZBY3RpdmUuYmx1cigpIH1cbiAgfVxuXG4gIGJpbmRUb3BMZXZlbEV2ZW50cygpe1xuICAgIGlmKHRoaXMuYm91bmRUb3BMZXZlbEV2ZW50cyl7IHJldHVybiB9XG5cbiAgICB0aGlzLmJvdW5kVG9wTGV2ZWxFdmVudHMgPSB0cnVlXG4gICAgLy8gZW50ZXIgZmFpbHNhZmUgcmVsb2FkIGlmIHNlcnZlciBoYXMgZ29uZSBhd2F5IGludGVudGlvbmFsbHksIHN1Y2ggYXMgXCJkaXNjb25uZWN0XCIgYnJvYWRjYXN0XG4gICAgdGhpcy5zb2NrZXQub25DbG9zZShldmVudCA9PiB7XG4gICAgICBpZihldmVudC5jb2RlID09PSAxMDAwICYmIHRoaXMubWFpbil7XG4gICAgICAgIHRoaXMucmVsb2FkV2l0aEppdHRlcih0aGlzLm1haW4pXG4gICAgICB9XG4gICAgfSlcbiAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoKXsgfSkgLy8gZW5zdXJlIGFsbCBjbGljayBldmVudHMgYnViYmxlIGZvciBtb2JpbGUgU2FmYXJpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwYWdlc2hvd1wiLCBlID0+IHtcbiAgICAgIGlmKGUucGVyc2lzdGVkKXsgLy8gcmVsb2FkIHBhZ2UgaWYgYmVpbmcgcmVzdG9yZWQgZnJvbSBiYWNrL2ZvcndhcmQgY2FjaGVcbiAgICAgICAgdGhpcy5nZXRTb2NrZXQoKS5kaXNjb25uZWN0KClcbiAgICAgICAgdGhpcy53aXRoUGFnZUxvYWRpbmcoe3RvOiB3aW5kb3cubG9jYXRpb24uaHJlZiwga2luZDogXCJyZWRpcmVjdFwifSlcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICB9XG4gICAgfSwgdHJ1ZSlcbiAgICB0aGlzLmJpbmROYXYoKVxuICAgIHRoaXMuYmluZENsaWNrcygpXG4gICAgdGhpcy5iaW5kRm9ybXMoKVxuICAgIHRoaXMuYmluZCh7a2V5dXA6IFwia2V5dXBcIiwga2V5ZG93bjogXCJrZXlkb3duXCJ9LCAoZSwgdHlwZSwgdmlldywgdGFyZ2V0RWwsIHBoeEV2ZW50LCBldmVudFRhcmdldCkgPT4ge1xuICAgICAgbGV0IG1hdGNoS2V5ID0gdGFyZ2V0RWwuZ2V0QXR0cmlidXRlKHRoaXMuYmluZGluZyhQSFhfS0VZKSlcbiAgICAgIGxldCBwcmVzc2VkS2V5ID0gZS5rZXkgJiYgZS5rZXkudG9Mb3dlckNhc2UoKSAvLyBjaHJvbWUgY2xpY2tlZCBhdXRvY29tcGxldGVzIHNlbmQgYSBrZXlkb3duIHdpdGhvdXQga2V5XG4gICAgICBpZihtYXRjaEtleSAmJiBtYXRjaEtleS50b0xvd2VyQ2FzZSgpICE9PSBwcmVzc2VkS2V5KXsgcmV0dXJuIH1cblxuICAgICAgbGV0IGRhdGEgPSB7a2V5OiBlLmtleSwgLi4udGhpcy5ldmVudE1ldGEodHlwZSwgZSwgdGFyZ2V0RWwpfVxuICAgICAgSlMuZXhlYyh0eXBlLCBwaHhFdmVudCwgdmlldywgdGFyZ2V0RWwsIFtcInB1c2hcIiwge2RhdGF9XSlcbiAgICB9KVxuICAgIHRoaXMuYmluZCh7Ymx1cjogXCJmb2N1c291dFwiLCBmb2N1czogXCJmb2N1c2luXCJ9LCAoZSwgdHlwZSwgdmlldywgdGFyZ2V0RWwsIHBoeEV2ZW50LCBldmVudFRhcmdldCkgPT4ge1xuICAgICAgaWYoIWV2ZW50VGFyZ2V0KXtcbiAgICAgICAgbGV0IGRhdGEgPSB7a2V5OiBlLmtleSwgLi4udGhpcy5ldmVudE1ldGEodHlwZSwgZSwgdGFyZ2V0RWwpfVxuICAgICAgICBKUy5leGVjKHR5cGUsIHBoeEV2ZW50LCB2aWV3LCB0YXJnZXRFbCwgW1wicHVzaFwiLCB7ZGF0YX1dKVxuICAgICAgfVxuICAgIH0pXG4gICAgdGhpcy5iaW5kKHtibHVyOiBcImJsdXJcIiwgZm9jdXM6IFwiZm9jdXNcIn0sIChlLCB0eXBlLCB2aWV3LCB0YXJnZXRFbCwgdGFyZ2V0Q3R4LCBwaHhFdmVudCwgcGh4VGFyZ2V0KSA9PiB7XG4gICAgICAvLyBibHVyIGFuZCBmb2N1cyBhcmUgdHJpZ2dlcmVkIG9uIGRvY3VtZW50IGFuZCB3aW5kb3cuIERpc2NhcmQgb25lIHRvIGF2b2lkIGR1cHNcbiAgICAgIGlmKHBoeFRhcmdldCA9PT0gXCJ3aW5kb3dcIil7XG4gICAgICAgIGxldCBkYXRhID0gdGhpcy5ldmVudE1ldGEodHlwZSwgZSwgdGFyZ2V0RWwpXG4gICAgICAgIEpTLmV4ZWModHlwZSwgcGh4RXZlbnQsIHZpZXcsIHRhcmdldEVsLCBbXCJwdXNoXCIsIHtkYXRhfV0pXG4gICAgICB9XG4gICAgfSlcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsIGUgPT4gZS5wcmV2ZW50RGVmYXVsdCgpKVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZHJvcFwiLCBlID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgbGV0IGRyb3BUYXJnZXRJZCA9IG1heWJlKGNsb3Nlc3RQaHhCaW5kaW5nKGUudGFyZ2V0LCB0aGlzLmJpbmRpbmcoUEhYX0RST1BfVEFSR0VUKSksIHRydWVUYXJnZXQgPT4ge1xuICAgICAgICByZXR1cm4gdHJ1ZVRhcmdldC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFBIWF9EUk9QX1RBUkdFVCkpXG4gICAgICB9KVxuICAgICAgbGV0IGRyb3BUYXJnZXQgPSBkcm9wVGFyZ2V0SWQgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZHJvcFRhcmdldElkKVxuICAgICAgbGV0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRhdGFUcmFuc2Zlci5maWxlcyB8fCBbXSlcbiAgICAgIGlmKCFkcm9wVGFyZ2V0IHx8IGRyb3BUYXJnZXQuZGlzYWJsZWQgfHwgZmlsZXMubGVuZ3RoID09PSAwIHx8ICEoZHJvcFRhcmdldC5maWxlcyBpbnN0YW5jZW9mIEZpbGVMaXN0KSl7IHJldHVybiB9XG5cbiAgICAgIExpdmVVcGxvYWRlci50cmFja0ZpbGVzKGRyb3BUYXJnZXQsIGZpbGVzKVxuICAgICAgZHJvcFRhcmdldC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIsIHtidWJibGVzOiB0cnVlfSkpXG4gICAgfSlcbiAgICB0aGlzLm9uKFBIWF9UUkFDS19VUExPQURTLCBlID0+IHtcbiAgICAgIGxldCB1cGxvYWRUYXJnZXQgPSBlLnRhcmdldFxuICAgICAgaWYoIURPTS5pc1VwbG9hZElucHV0KHVwbG9hZFRhcmdldCkpeyByZXR1cm4gfVxuICAgICAgbGV0IGZpbGVzID0gQXJyYXkuZnJvbShlLmRldGFpbC5maWxlcyB8fCBbXSkuZmlsdGVyKGYgPT4gZiBpbnN0YW5jZW9mIEZpbGUgfHwgZiBpbnN0YW5jZW9mIEJsb2IpXG4gICAgICBMaXZlVXBsb2FkZXIudHJhY2tGaWxlcyh1cGxvYWRUYXJnZXQsIGZpbGVzKVxuICAgICAgdXBsb2FkVGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIiwge2J1YmJsZXM6IHRydWV9KSlcbiAgICB9KVxuICB9XG5cbiAgZXZlbnRNZXRhKGV2ZW50TmFtZSwgZSwgdGFyZ2V0RWwpe1xuICAgIGxldCBjYWxsYmFjayA9IHRoaXMubWV0YWRhdGFDYWxsYmFja3NbZXZlbnROYW1lXVxuICAgIHJldHVybiBjYWxsYmFjayA/IGNhbGxiYWNrKGUsIHRhcmdldEVsKSA6IHt9XG4gIH1cblxuICBzZXRQZW5kaW5nTGluayhocmVmKXtcbiAgICB0aGlzLmxpbmtSZWYrK1xuICAgIHRoaXMucGVuZGluZ0xpbmsgPSBocmVmXG4gICAgcmV0dXJuIHRoaXMubGlua1JlZlxuICB9XG5cbiAgY29tbWl0UGVuZGluZ0xpbmsobGlua1JlZil7XG4gICAgaWYodGhpcy5saW5rUmVmICE9PSBsaW5rUmVmKXtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhyZWYgPSB0aGlzLnBlbmRpbmdMaW5rXG4gICAgICB0aGlzLnBlbmRpbmdMaW5rID0gbnVsbFxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cblxuICBnZXRIcmVmKCl7IHJldHVybiB0aGlzLmhyZWYgfVxuXG4gIGhhc1BlbmRpbmdMaW5rKCl7IHJldHVybiAhIXRoaXMucGVuZGluZ0xpbmsgfVxuXG4gIGJpbmQoZXZlbnRzLCBjYWxsYmFjayl7XG4gICAgZm9yKGxldCBldmVudCBpbiBldmVudHMpe1xuICAgICAgbGV0IGJyb3dzZXJFdmVudE5hbWUgPSBldmVudHNbZXZlbnRdXG5cbiAgICAgIHRoaXMub24oYnJvd3NlckV2ZW50TmFtZSwgZSA9PiB7XG4gICAgICAgIGxldCBiaW5kaW5nID0gdGhpcy5iaW5kaW5nKGV2ZW50KVxuICAgICAgICBsZXQgd2luZG93QmluZGluZyA9IHRoaXMuYmluZGluZyhgd2luZG93LSR7ZXZlbnR9YClcbiAgICAgICAgbGV0IHRhcmdldFBoeEV2ZW50ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlICYmIGUudGFyZ2V0LmdldEF0dHJpYnV0ZShiaW5kaW5nKVxuICAgICAgICBpZih0YXJnZXRQaHhFdmVudCl7XG4gICAgICAgICAgdGhpcy5kZWJvdW5jZShlLnRhcmdldCwgZSwgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsIHZpZXcgPT4ge1xuICAgICAgICAgICAgICBjYWxsYmFjayhlLCBldmVudCwgdmlldywgZS50YXJnZXQsIHRhcmdldFBoeEV2ZW50LCBudWxsKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIERPTS5hbGwoZG9jdW1lbnQsIGBbJHt3aW5kb3dCaW5kaW5nfV1gLCBlbCA9PiB7XG4gICAgICAgICAgICBsZXQgcGh4RXZlbnQgPSBlbC5nZXRBdHRyaWJ1dGUod2luZG93QmluZGluZylcbiAgICAgICAgICAgIHRoaXMuZGVib3VuY2UoZWwsIGUsICgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZWwsIHZpZXcgPT4ge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGUsIGV2ZW50LCB2aWV3LCBlbCwgcGh4RXZlbnQsIFwid2luZG93XCIpXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgYmluZENsaWNrcygpe1xuICAgIHRoaXMuYmluZENsaWNrKFwiY2xpY2tcIiwgXCJjbGlja1wiLCBmYWxzZSlcbiAgICB0aGlzLmJpbmRDbGljayhcIm1vdXNlZG93blwiLCBcImNhcHR1cmUtY2xpY2tcIiwgdHJ1ZSlcbiAgfVxuXG4gIGJpbmRDbGljayhldmVudE5hbWUsIGJpbmRpbmdOYW1lLCBjYXB0dXJlKXtcbiAgICBsZXQgY2xpY2sgPSB0aGlzLmJpbmRpbmcoYmluZGluZ05hbWUpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBlID0+IHtcbiAgICAgIGlmKCF0aGlzLmlzQ29ubmVjdGVkKCkpeyByZXR1cm4gfVxuICAgICAgdGhpcy5jbGlja1JlZisrXG4gICAgICBsZXQgY2xpY2tSZWZXYXMgPSB0aGlzLmNsaWNrUmVmXG4gICAgICBsZXQgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYoY2FwdHVyZSl7XG4gICAgICAgIHRhcmdldCA9IGUudGFyZ2V0Lm1hdGNoZXMoYFske2NsaWNrfV1gKSA/IGUudGFyZ2V0IDogZS50YXJnZXQucXVlcnlTZWxlY3RvcihgWyR7Y2xpY2t9XWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0YXJnZXQgPSBjbG9zZXN0UGh4QmluZGluZyhlLnRhcmdldCwgY2xpY2spXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hDbGlja0F3YXkoZSwgY2xpY2tSZWZXYXMpXG4gICAgICB9XG4gICAgICBsZXQgcGh4RXZlbnQgPSB0YXJnZXQgJiYgdGFyZ2V0LmdldEF0dHJpYnV0ZShjbGljaylcbiAgICAgIGlmKCFwaHhFdmVudCl7IHJldHVybiB9XG4gICAgICBpZih0YXJnZXQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIpeyBlLnByZXZlbnREZWZhdWx0KCkgfVxuXG4gICAgICB0aGlzLmRlYm91bmNlKHRhcmdldCwgZSwgKCkgPT4ge1xuICAgICAgICB0aGlzLndpdGhpbk93bmVycyh0YXJnZXQsIHZpZXcgPT4ge1xuICAgICAgICAgIEpTLmV4ZWMoXCJjbGlja1wiLCBwaHhFdmVudCwgdmlldywgdGFyZ2V0LCBbXCJwdXNoXCIsIHtkYXRhOiB0aGlzLmV2ZW50TWV0YShcImNsaWNrXCIsIGUsIHRhcmdldCl9XSlcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgfSwgY2FwdHVyZSlcbiAgfVxuXG4gIGRpc3BhdGNoQ2xpY2tBd2F5KGUsIGNsaWNrUmVmV2FzKXtcbiAgICBsZXQgcGh4Q2xpY2tBd2F5ID0gdGhpcy5iaW5kaW5nKFwiY2xpY2stYXdheVwiKVxuICAgIGxldCBwaHhDbGljayA9IHRoaXMuYmluZGluZyhcImNsaWNrXCIpXG4gICAgRE9NLmFsbChkb2N1bWVudCwgYFske3BoeENsaWNrQXdheX1dYCwgZWwgPT4ge1xuICAgICAgaWYoIShlbC5pc1NhbWVOb2RlKGUudGFyZ2V0KSB8fCBlbC5jb250YWlucyhlLnRhcmdldCkpKXtcbiAgICAgICAgdGhpcy53aXRoaW5Pd25lcnMoZS50YXJnZXQsIHZpZXcgPT4ge1xuICAgICAgICAgIGxldCBwaHhFdmVudCA9IGVsLmdldEF0dHJpYnV0ZShwaHhDbGlja0F3YXkpXG4gICAgICAgICAgaWYoSlMuaXNWaXNpYmxlKGVsKSl7XG4gICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQuY2xvc2VzdChgWyR7cGh4Q2xpY2t9XWApIHx8IGUudGFyZ2V0XG4gICAgICAgICAgICBKUy5leGVjKFwiY2xpY2tcIiwgcGh4RXZlbnQsIHZpZXcsIGVsLCBbXCJwdXNoXCIsIHtkYXRhOiB0aGlzLmV2ZW50TWV0YShcImNsaWNrXCIsIGUsIGUudGFyZ2V0KX1dKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgYmluZE5hdigpe1xuICAgIGlmKCFCcm93c2VyLmNhblB1c2hTdGF0ZSgpKXsgcmV0dXJuIH1cbiAgICBpZihoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uKXsgaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9IFwibWFudWFsXCIgfVxuICAgIGxldCBzY3JvbGxUaW1lciA9IG51bGxcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBfZSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoc2Nyb2xsVGltZXIpXG4gICAgICBzY3JvbGxUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBCcm93c2VyLnVwZGF0ZUN1cnJlbnRTdGF0ZShzdGF0ZSA9PiBPYmplY3QuYXNzaWduKHN0YXRlLCB7c2Nyb2xsOiB3aW5kb3cuc2Nyb2xsWX0pKVxuICAgICAgfSwgMTAwKVxuICAgIH0pXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBldmVudCA9PiB7XG4gICAgICBpZighdGhpcy5yZWdpc3Rlck5ld0xvY2F0aW9uKHdpbmRvdy5sb2NhdGlvbikpeyByZXR1cm4gfVxuICAgICAgbGV0IHt0eXBlLCBpZCwgcm9vdCwgc2Nyb2xsfSA9IGV2ZW50LnN0YXRlIHx8IHt9XG4gICAgICBsZXQgaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmXG5cbiAgICAgIHRoaXMucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGlmKHRoaXMubWFpbi5pc0Nvbm5lY3RlZCgpICYmICh0eXBlID09PSBcInBhdGNoXCIgJiYgaWQgPT09IHRoaXMubWFpbi5pZCkpe1xuICAgICAgICAgIHRoaXMubWFpbi5wdXNoTGlua1BhdGNoKGhyZWYsIG51bGwpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZXBsYWNlTWFpbihocmVmLCBudWxsLCAoKSA9PiB7XG4gICAgICAgICAgICBpZihyb290KXsgdGhpcy5yZXBsYWNlUm9vdEhpc3RvcnkoKSB9XG4gICAgICAgICAgICBpZih0eXBlb2Yoc2Nyb2xsKSA9PT0gXCJudW1iZXJcIil7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCBzY3JvbGwpXG4gICAgICAgICAgICAgIH0sIDApIC8vIHRoZSBib2R5IG5lZWRzIHRvIHJlbmRlciBiZWZvcmUgd2Ugc2Nyb2xsLlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSwgZmFsc2UpXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBlID0+IHtcbiAgICAgIGxldCB0YXJnZXQgPSBjbG9zZXN0UGh4QmluZGluZyhlLnRhcmdldCwgUEhYX0xJVkVfTElOSylcbiAgICAgIGxldCB0eXBlID0gdGFyZ2V0ICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoUEhYX0xJVkVfTElOSylcbiAgICAgIGxldCB3YW50c05ld1RhYiA9IGUubWV0YUtleSB8fCBlLmN0cmxLZXkgfHwgZS5idXR0b24gPT09IDFcbiAgICAgIGlmKCF0eXBlIHx8ICF0aGlzLmlzQ29ubmVjdGVkKCkgfHwgIXRoaXMubWFpbiB8fCB3YW50c05ld1RhYil7IHJldHVybiB9XG4gICAgICBsZXQgaHJlZiA9IHRhcmdldC5ocmVmXG4gICAgICBsZXQgbGlua1N0YXRlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShQSFhfTElOS19TVEFURSlcbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgaWYodGhpcy5wZW5kaW5nTGluayA9PT0gaHJlZil7IHJldHVybiB9XG5cbiAgICAgIHRoaXMucmVxdWVzdERPTVVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGlmKHR5cGUgPT09IFwicGF0Y2hcIil7XG4gICAgICAgICAgdGhpcy5wdXNoSGlzdG9yeVBhdGNoKGhyZWYsIGxpbmtTdGF0ZSwgdGFyZ2V0KVxuICAgICAgICB9IGVsc2UgaWYodHlwZSA9PT0gXCJyZWRpcmVjdFwiKXtcbiAgICAgICAgICB0aGlzLmhpc3RvcnlSZWRpcmVjdChocmVmLCBsaW5rU3RhdGUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCAke1BIWF9MSVZFX0xJTkt9IHRvIGJlIFwicGF0Y2hcIiBvciBcInJlZGlyZWN0XCIsIGdvdDogJHt0eXBlfWApXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSwgZmFsc2UpXG4gIH1cblxuICBkaXNwYXRjaEV2ZW50KGV2ZW50LCBwYXlsb2FkID0ge30pe1xuICAgIERPTS5kaXNwYXRjaEV2ZW50KHdpbmRvdywgYHBoeDoke2V2ZW50fWAsIHBheWxvYWQpXG4gIH1cblxuICBkaXNwYXRjaEV2ZW50cyhldmVudHMpe1xuICAgIGV2ZW50cy5mb3JFYWNoKChbZXZlbnQsIHBheWxvYWRdKSA9PiB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQsIHBheWxvYWQpKVxuICB9XG5cbiAgd2l0aFBhZ2VMb2FkaW5nKGluZm8sIGNhbGxiYWNrKXtcbiAgICBET00uZGlzcGF0Y2hFdmVudCh3aW5kb3csIFwicGh4OnBhZ2UtbG9hZGluZy1zdGFydFwiLCBpbmZvKVxuICAgIGxldCBkb25lID0gKCkgPT4gRE9NLmRpc3BhdGNoRXZlbnQod2luZG93LCBcInBoeDpwYWdlLWxvYWRpbmctc3RvcFwiLCBpbmZvKVxuICAgIHJldHVybiBjYWxsYmFjayA/IGNhbGxiYWNrKGRvbmUpIDogZG9uZVxuICB9XG5cbiAgcHVzaEhpc3RvcnlQYXRjaChocmVmLCBsaW5rU3RhdGUsIHRhcmdldEVsKXtcbiAgICB0aGlzLndpdGhQYWdlTG9hZGluZyh7dG86IGhyZWYsIGtpbmQ6IFwicGF0Y2hcIn0sIGRvbmUgPT4ge1xuICAgICAgdGhpcy5tYWluLnB1c2hMaW5rUGF0Y2goaHJlZiwgdGFyZ2V0RWwsIGxpbmtSZWYgPT4ge1xuICAgICAgICB0aGlzLmhpc3RvcnlQYXRjaChocmVmLCBsaW5rU3RhdGUsIGxpbmtSZWYpXG4gICAgICAgIGRvbmUoKVxuICAgICAgfSlcbiAgICB9KVxuICB9XG5cbiAgaGlzdG9yeVBhdGNoKGhyZWYsIGxpbmtTdGF0ZSwgbGlua1JlZiA9IHRoaXMuc2V0UGVuZGluZ0xpbmsoaHJlZikpe1xuICAgIGlmKCF0aGlzLmNvbW1pdFBlbmRpbmdMaW5rKGxpbmtSZWYpKXsgcmV0dXJuIH1cblxuICAgIEJyb3dzZXIucHVzaFN0YXRlKGxpbmtTdGF0ZSwge3R5cGU6IFwicGF0Y2hcIiwgaWQ6IHRoaXMubWFpbi5pZH0sIGhyZWYpXG4gICAgdGhpcy5yZWdpc3Rlck5ld0xvY2F0aW9uKHdpbmRvdy5sb2NhdGlvbilcbiAgfVxuXG4gIGhpc3RvcnlSZWRpcmVjdChocmVmLCBsaW5rU3RhdGUsIGZsYXNoKXtcbiAgICBsZXQgc2Nyb2xsID0gd2luZG93LnNjcm9sbFlcbiAgICB0aGlzLndpdGhQYWdlTG9hZGluZyh7dG86IGhyZWYsIGtpbmQ6IFwicmVkaXJlY3RcIn0sIGRvbmUgPT4ge1xuICAgICAgdGhpcy5yZXBsYWNlTWFpbihocmVmLCBmbGFzaCwgKCkgPT4ge1xuICAgICAgICBCcm93c2VyLnB1c2hTdGF0ZShsaW5rU3RhdGUsIHt0eXBlOiBcInJlZGlyZWN0XCIsIGlkOiB0aGlzLm1haW4uaWQsIHNjcm9sbDogc2Nyb2xsfSwgaHJlZilcbiAgICAgICAgdGhpcy5yZWdpc3Rlck5ld0xvY2F0aW9uKHdpbmRvdy5sb2NhdGlvbilcbiAgICAgICAgZG9uZSgpXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICByZXBsYWNlUm9vdEhpc3RvcnkoKXtcbiAgICBCcm93c2VyLnB1c2hTdGF0ZShcInJlcGxhY2VcIiwge3Jvb3Q6IHRydWUsIHR5cGU6IFwicGF0Y2hcIiwgaWQ6IHRoaXMubWFpbi5pZH0pXG4gIH1cblxuICByZWdpc3Rlck5ld0xvY2F0aW9uKG5ld0xvY2F0aW9uKXtcbiAgICBsZXQge3BhdGhuYW1lLCBzZWFyY2h9ID0gdGhpcy5jdXJyZW50TG9jYXRpb25cbiAgICBpZihwYXRobmFtZSArIHNlYXJjaCA9PT0gbmV3TG9jYXRpb24ucGF0aG5hbWUgKyBuZXdMb2NhdGlvbi5zZWFyY2gpe1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudExvY2F0aW9uID0gY2xvbmUobmV3TG9jYXRpb24pXG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIGJpbmRGb3Jtcygpe1xuICAgIGxldCBpdGVyYXRpb25zID0gMFxuICAgIHRoaXMub24oXCJzdWJtaXRcIiwgZSA9PiB7XG4gICAgICBsZXQgcGh4RXZlbnQgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUodGhpcy5iaW5kaW5nKFwic3VibWl0XCIpKVxuICAgICAgaWYoIXBoeEV2ZW50KXsgcmV0dXJuIH1cbiAgICAgIGUucHJldmVudERlZmF1bHQoKVxuICAgICAgZS50YXJnZXQuZGlzYWJsZWQgPSB0cnVlXG4gICAgICB0aGlzLndpdGhpbk93bmVycyhlLnRhcmdldCwgdmlldyA9PiB7XG4gICAgICAgIEpTLmV4ZWMoXCJzdWJtaXRcIiwgcGh4RXZlbnQsIHZpZXcsIGUudGFyZ2V0LCBbXCJwdXNoXCIsIHt9XSlcbiAgICAgIH0pXG4gICAgfSwgZmFsc2UpXG5cbiAgICBmb3IobGV0IHR5cGUgb2YgW1wiY2hhbmdlXCIsIFwiaW5wdXRcIl0pe1xuICAgICAgdGhpcy5vbih0eXBlLCBlID0+IHtcbiAgICAgICAgbGV0IGlucHV0ID0gZS50YXJnZXRcbiAgICAgICAgbGV0IHBoeEV2ZW50ID0gaW5wdXQuZm9ybSAmJiBpbnB1dC5mb3JtLmdldEF0dHJpYnV0ZSh0aGlzLmJpbmRpbmcoXCJjaGFuZ2VcIikpXG4gICAgICAgIGlmKCFwaHhFdmVudCl7IHJldHVybiB9XG4gICAgICAgIGlmKGlucHV0LnR5cGUgPT09IFwibnVtYmVyXCIgJiYgaW5wdXQudmFsaWRpdHkgJiYgaW5wdXQudmFsaWRpdHkuYmFkSW5wdXQpeyByZXR1cm4gfVxuICAgICAgICBsZXQgY3VycmVudEl0ZXJhdGlvbnMgPSBpdGVyYXRpb25zXG4gICAgICAgIGl0ZXJhdGlvbnMrK1xuICAgICAgICBsZXQge2F0OiBhdCwgdHlwZTogbGFzdFR5cGV9ID0gRE9NLnByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIikgfHwge31cbiAgICAgICAgLy8gZGV0ZWN0IGR1cCBiZWNhdXNlIHNvbWUgYnJvd3NlcnMgZGlzcGF0Y2ggYm90aCBcImlucHV0XCIgYW5kIFwiY2hhbmdlXCJcbiAgICAgICAgaWYoYXQgPT09IGN1cnJlbnRJdGVyYXRpb25zIC0gMSAmJiB0eXBlICE9PSBsYXN0VHlwZSl7IHJldHVybiB9XG5cbiAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFwicHJldi1pdGVyYXRpb25cIiwge2F0OiBjdXJyZW50SXRlcmF0aW9ucywgdHlwZTogdHlwZX0pXG5cbiAgICAgICAgdGhpcy5kZWJvdW5jZShpbnB1dCwgZSwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMud2l0aGluT3duZXJzKGlucHV0LmZvcm0sIHZpZXcgPT4ge1xuICAgICAgICAgICAgRE9NLnB1dFByaXZhdGUoaW5wdXQsIFBIWF9IQVNfRk9DVVNFRCwgdHJ1ZSlcbiAgICAgICAgICAgIGlmKCFET00uaXNUZXh0dWFsSW5wdXQoaW5wdXQpKXtcbiAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVFbGVtZW50KGlucHV0KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgSlMuZXhlYyhcImNoYW5nZVwiLCBwaHhFdmVudCwgdmlldywgaW5wdXQsIFtcInB1c2hcIiwge190YXJnZXQ6IGUudGFyZ2V0Lm5hbWV9XSlcbiAgICAgICAgICB9KVxuICAgICAgICB9KVxuICAgICAgfSwgZmFsc2UpXG4gICAgfVxuICB9XG5cbiAgZGVib3VuY2UoZWwsIGV2ZW50LCBjYWxsYmFjayl7XG4gICAgbGV0IHBoeERlYm91bmNlID0gdGhpcy5iaW5kaW5nKFBIWF9ERUJPVU5DRSlcbiAgICBsZXQgcGh4VGhyb3R0bGUgPSB0aGlzLmJpbmRpbmcoUEhYX1RIUk9UVExFKVxuICAgIGxldCBkZWZhdWx0RGVib3VuY2UgPSB0aGlzLmRlZmF1bHRzLmRlYm91bmNlLnRvU3RyaW5nKClcbiAgICBsZXQgZGVmYXVsdFRocm90dGxlID0gdGhpcy5kZWZhdWx0cy50aHJvdHRsZS50b1N0cmluZygpXG4gICAgRE9NLmRlYm91bmNlKGVsLCBldmVudCwgcGh4RGVib3VuY2UsIGRlZmF1bHREZWJvdW5jZSwgcGh4VGhyb3R0bGUsIGRlZmF1bHRUaHJvdHRsZSwgY2FsbGJhY2spXG4gIH1cblxuICBzaWxlbmNlRXZlbnRzKGNhbGxiYWNrKXtcbiAgICB0aGlzLnNpbGVuY2VkID0gdHJ1ZVxuICAgIGNhbGxiYWNrKClcbiAgICB0aGlzLnNpbGVuY2VkID0gZmFsc2VcbiAgfVxuXG4gIG9uKGV2ZW50LCBjYWxsYmFjayl7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGUgPT4ge1xuICAgICAgaWYoIXRoaXMuc2lsZW5jZWQpeyBjYWxsYmFjayhlKSB9XG4gICAgfSlcbiAgfVxufVxuXG5jbGFzcyBUcmFuc2l0aW9uU2V0IHtcbiAgY29uc3RydWN0b3IoKXtcbiAgICB0aGlzLnRyYW5zaXRpb25zID0gbmV3IFNldCgpXG4gICAgdGhpcy5wZW5kaW5nT3BzID0gW11cbiAgICB0aGlzLnJlc2V0KClcbiAgfVxuXG4gIHJlc2V0KCl7XG4gICAgdGhpcy50cmFuc2l0aW9ucy5mb3JFYWNoKHRpbWVyID0+IHtcbiAgICAgIGNhbmNlbFRpbWVvdXQodGltZXIpXG4gICAgICB0aGlzLnRyYW5zaXRpb25zLmRlbGV0ZSh0aW1lcilcbiAgICB9KVxuICAgIHRoaXMuZmx1c2hQZW5kaW5nT3BzKClcbiAgfVxuXG4gIGFmdGVyKGNhbGxiYWNrKXtcbiAgICBpZih0aGlzLnNpemUoKSA9PT0gMCl7XG4gICAgICBjYWxsYmFjaygpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHVzaFBlbmRpbmdPcChjYWxsYmFjaylcbiAgICB9XG4gIH1cblxuICBhZGRUcmFuc2l0aW9uKHRpbWUsIG9uU3RhcnQsIG9uRG9uZSl7XG4gICAgb25TdGFydCgpXG4gICAgbGV0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnRyYW5zaXRpb25zLmRlbGV0ZSh0aW1lcilcbiAgICAgIG9uRG9uZSgpXG4gICAgICBpZih0aGlzLnNpemUoKSA9PT0gMCl7IHRoaXMuZmx1c2hQZW5kaW5nT3BzKCkgfVxuICAgIH0sIHRpbWUpXG4gICAgdGhpcy50cmFuc2l0aW9ucy5hZGQodGltZXIpXG4gIH1cblxuICBwdXNoUGVuZGluZ09wKG9wKXsgdGhpcy5wZW5kaW5nT3BzLnB1c2gob3ApIH1cblxuICBzaXplKCl7IHJldHVybiB0aGlzLnRyYW5zaXRpb25zLnNpemUgfVxuXG4gIGZsdXNoUGVuZGluZ09wcygpe1xuICAgIHRoaXMucGVuZGluZ09wcy5mb3JFYWNoKG9wID0+IG9wKCkpXG4gICAgdGhpcy5wZW5kaW5nT3BzID0gW11cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQWFBLE9BQUUsU0FBVUEsU0FBUSxTQUFVO0FBRTdCO0FBRUEsWUFBSyxPQUFPLFdBQVcsWUFBWSxPQUFPLE9BQU8sWUFBWSxVQUFXO0FBU3ZFLGlCQUFPLFVBQVVBLFFBQU8sV0FDdkIsUUFBU0EsU0FBUSxJQUFLLElBQ3RCLFNBQVUsR0FBSTtBQUNiLGdCQUFLLENBQUMsRUFBRSxVQUFXO0FBQ2xCLG9CQUFNLElBQUksTUFBTywwQ0FBMkM7QUFBQSxZQUM3RDtBQUNBLG1CQUFPLFFBQVMsQ0FBRTtBQUFBLFVBQ25CO0FBQUEsUUFDRixPQUFPO0FBQ04sa0JBQVNBLE9BQU87QUFBQSxRQUNqQjtBQUFBLE1BR0QsR0FBSyxPQUFPLFdBQVcsY0FBYyxTQUFTLFNBQU0sU0FBVUMsU0FBUSxVQUFXO0FBTWpGO0FBRUEsWUFBSSxNQUFNLENBQUM7QUFFWCxZQUFJLFdBQVcsT0FBTztBQUV0QixZQUFJLFFBQVEsSUFBSTtBQUVo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QUEsWUFBa0I7QUFBQSxZQUFjO0FBQUEsWUFBVztBQUFBLFlBQWdCO0FBQUEsWUFBVztBQUFBLFlBQVk7QUFBQSxZQUFlO0FBQUEsWUFBTztBQUFBLFlBQUs7QUFBQSxZQUFLO0FBQUEsWUFBZTtBQUFBLFlBQUs7QUFBQSxZQUFPO0FBQUEsWUFBSztBQUFBLFlBQU07QUFBQSxZQUFVO0FBQUEsWUFBZTtBQUFBLFlBQXlCO0FBQUEsWUFBUTtBQUFBLFlBQUs7QUFBQSxZQUFRO0FBQUEsWUFBSztBQUFBLFlBQVk7QUFBQSxZQUFVO0FBQUEsWUFBZTtBQUFBLFlBQU07QUFBQSxZQUFTO0FBQUEsWUFBYztBQUFBLFlBQVU7QUFBQSxZQUFTO0FBQUEsWUFBVTtBQUFBLFlBQVM7QUFBQSxZQUFTO0FBQUEsWUFBUztBQUFBLFlBQVc7QUFBQSxZQUFVO0FBQUEsWUFBVztBQUFBLFlBQVk7QUFBQSxZQUFNO0FBQUEsWUFBa0I7QUFBQSxZQUFNO0FBQUEsWUFBTztBQUFBLFlBQVc7QUFBQSxZQUFjO0FBQUEsWUFBTTtBQUFBLFlBQU07QUFBQSxZQUFPO0FBQUEsWUFBUztBQUFBLFlBQVk7QUFBQSxZQUFVO0FBQUEsWUFBTTtBQUFBLFlBQVc7QUFBQSxZQUFXO0FBQUEsWUFBTztBQUFBLFlBQVU7QUFBQSxZQUFNO0FBQUEsWUFBVTtBQUFBLFlBQVM7QUFBQSxZQUFRO0FBQUEsWUFBWTtBQUFBLFlBQWM7QUFBQSxZQUFXO0FBQUEsWUFBWTtBQUFBLFlBQVE7QUFBQSxZQUFhO0FBQUEsWUFBZTtBQUFBLFlBQVM7QUFBQSxZQUFPO0FBQUEsWUFBa0I7QUFBQSxZQUFhO0FBQUEsWUFBMEI7QUFBQSxZQUFjO0FBQUEsWUFBUztBQUFBLFlBQWM7QUFBQSxZQUFTO0FBQUEsWUFBVztBQUFBLFlBQU87QUFBQSxZQUFVO0FBQUEsWUFBeUI7QUFBQSxZQUFPO0FBQUEsWUFBUTtBQUFBLFlBQU07QUFBQSxZQUFRO0FBQUEsWUFBWTtBQUFBLFlBQVM7QUFBQSxZQUFhO0FBQUEsVUFDNzdCO0FBQUEsUUFFRDtBQUVBLGVBQU8sS0FBSyxRQUFRLEVBQUUsUUFBUSxTQUFVLEdBQUc7QUFDMUMsaUJBQU8sR0FBRyxVQUFVLGlCQUFpQixTQUFTLEVBQUU7QUFBQSxRQUNqRCxDQUFDO0FBRUQsWUFBSSxjQUFjO0FBQUEsVUFFakI7QUFBQSxVQUFPO0FBQUEsVUFBUztBQUFBLFVBQVE7QUFBQSxVQUFPO0FBQUEsVUFBUTtBQUFBLFVBQVM7QUFBQSxVQUFTO0FBQUEsVUFBUTtBQUFBLFVBQVM7QUFBQSxVQUFXO0FBQUEsVUFBTztBQUFBLFVBQU87QUFBQSxVQUFRO0FBQUEsVUFBUztBQUFBLFVBQVM7QUFBQSxVQUFXO0FBQUEsVUFBVTtBQUFBLFVBQVE7QUFBQSxVQUFRO0FBQUEsVUFBUztBQUFBLFVBQVM7QUFBQSxVQUFPO0FBQUEsVUFBVTtBQUFBLFVBQU07QUFBQSxVQUFXO0FBQUEsVUFBYTtBQUFBLFVBQU87QUFBQSxVQUFRO0FBQUEsVUFBYTtBQUFBLFVBQVM7QUFBQSxVQUFRO0FBQUEsVUFBUztBQUFBLFVBQVE7QUFBQSxVQUFTO0FBQUEsVUFBVztBQUFBLFVBQU07QUFBQSxVQUFTO0FBQUEsVUFBUTtBQUFBLFVBQVU7QUFBQSxVQUFjO0FBQUEsVUFBYztBQUFBLFVBQVk7QUFBQSxVQUFTO0FBQUEsVUFBVztBQUFBLFVBQVE7QUFBQSxVQUFNO0FBQUEsVUFBUTtBQUFBLFVBQVU7QUFBQSxVQUFTO0FBQUEsVUFBUTtBQUFBLFVBQVU7QUFBQSxVQUFPO0FBQUEsVUFBUTtBQUFBLFVBQVU7QUFBQSxVQUFPO0FBQUEsVUFBWTtBQUFBLFVBRXpmO0FBQUEsVUFBa0I7QUFBQSxVQUFtQjtBQUFBLFVBQVU7QUFBQSxVQUFhO0FBQUEsVUFBUztBQUFBLFVBQWE7QUFBQSxVQUFhO0FBQUEsVUFBWTtBQUFBLFVBQWU7QUFBQSxVQUFXO0FBQUEsVUFBYTtBQUFBLFVBQWlCO0FBQUEsVUFBb0I7QUFBQSxVQUFVO0FBQUEsVUFBTztBQUFBLFVBQVc7QUFBQSxVQUFlO0FBQUEsVUFBYztBQUFBLFVBQVU7QUFBQSxVQUFlO0FBQUEsVUFBUTtBQUFBLFVBQWdCO0FBQUEsVUFBYTtBQUFBLFVBQVc7QUFBQSxVQUFnQjtBQUFBLFVBQWdCO0FBQUEsVUFBYztBQUFBLFVBQW1CO0FBQUEsVUFBUztBQUFBLFVBQWM7QUFBQSxVQUFVO0FBQUEsVUFBZ0I7QUFBQSxVQUFhO0FBQUEsVUFBZ0I7QUFBQSxVQUFZO0FBQUEsVUFBVTtBQUFBLFVBQVk7QUFBQSxVQUFjO0FBQUEsVUFBUTtBQUFBLFVBQWE7QUFBQSxVQUFpQjtBQUFBLFVBQWdCO0FBQUEsVUFBUTtBQUFBLFVBQVc7QUFBQSxVQUFXO0FBQUEsVUFBYTtBQUFBLFVBQWlCO0FBQUEsVUFBa0I7QUFBQSxVQUFtQjtBQUFBLFVBQWlCO0FBQUEsVUFBVztBQUFBLFVBQVE7QUFBQSxVQUFhO0FBQUEsVUFBZTtBQUFBLFVBQVc7QUFBQSxVQUFlO0FBQUEsVUFBYztBQUFBLFVBQVE7QUFBQSxVQUFjO0FBQUEsVUFBa0I7QUFBQSxVQUFjO0FBQUEsVUFBUTtBQUFBLFVBQWdCO0FBQUEsVUFBZTtBQUFBLFVBQVk7QUFBQSxVQUFpQjtBQUFBLFVBQWE7QUFBQSxVQUFXO0FBQUEsVUFBUztBQUFBLFVBQWM7QUFBQSxVQUFTO0FBQUEsVUFBUTtBQUFBLFVBQWM7QUFBQSxVQUFXO0FBQUEsVUFBYztBQUFBLFVBQWM7QUFBQSxVQUFTO0FBQUEsVUFBUTtBQUFBLFVBQWE7QUFBQSxVQUFrQjtBQUFBLFVBRXRoQztBQUFBLFVBQVc7QUFBQSxVQUFnQjtBQUFBLFVBQWU7QUFBQSxVQUFrQjtBQUFBLFVBQWE7QUFBQSxVQUFxQjtBQUFBLFVBQW1CO0FBQUEsVUFBUztBQUFBLFVBQWtCO0FBQUEsVUFBZ0I7QUFBQSxVQUU1SjtBQUFBLFVBQW1CO0FBQUEsVUFBZTtBQUFBLFVBQWlCO0FBQUEsVUFBaUI7QUFBQSxVQUFtQjtBQUFBLFVBRXZGO0FBQUEsVUFBUTtBQUFBLFVBQVc7QUFBQSxVQUFhO0FBQUEsVUFBYTtBQUFBLFVBQVc7QUFBQSxVQUFnQjtBQUFBLFVBQWtCO0FBQUEsVUFBYztBQUFBLFVBQVE7QUFBQSxVQUFVO0FBQUEs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aXNXaW5kb3ciLCAiZG9jdW1lbnQiLCAiZG9jIiwgInRvVHlwZSIsICJjbG9uZSIsICJhcnIiLCAic3VwcG9ydCIsICJjb250YWlucyIsICJoYXNPd24iLCAicHVzaCIsICJzbGljZSIsICJpbmRleE9mIiwgImkiLCAicnRyaW0iLCAicmh0bWwiLCAicnF1aWNrRXhwciIsICJTaXp6bGUiLCAiZm4iLCAibWF0Y2hlcyIsICJkb2NFbGVtIiwgIm5vZGUiLCAibm9kZU5hbWUiLCAic3RhcnQiLCAiZGlyIiwgImhhc2giLCAiaXNYTUwiLCAiZWxlbSIsICJzZWxmIiwgInZhbHVlIiwgImRlZmVycmVkIiwgInByb2Nlc3MiLCAiRGF0YSIsICJkYXRhIiwgImV4cGVjdFN5bmMiLCAibmFtZSIsICJlbmQiLCAiaW5kZXgiLCAibGVuZ3RoIiwgImoiLCAibWF4IiwgImxvY2F0aW9uIiwgInZhbCIsICJjb21wbGV0ZWQiLCAib2Zmc2V0IiwgInRvcCIsICJtZXRob2QiLCAidHlwZSIsICJfc2VsZiIsICJjbG9uZSIsICJsYW5nIiwgIlByaXNtIiwgIm9mZnNldCIsICJpIiwgImNvbnRlbnRUeXBlIiwgInJlZmVyZW5jZSIsICJrZXkiLCAiYXJyb3ciLCAicm91bmQiLCAicmFuZ2UiLCAiZm9ybWF0IiwgInN0YXJ0IiwgImVuZCIsICJ3aW5kb3ciLCAiZG9jdW1lbnQiLCAidG9wYmFyIiwgImltcG9ydF9qcXVlcnkiLCAiY3JlYXRlUG9wcGVyIiwgIm5hbWUiLCAic3R5bGUiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJnZXRDb21wdXRlZFN0eWxlIiwgIndpbmRvdyIsICJtaW4iLCAibWF4IiwgInRvUGFkZGluZ09iamVjdCIsICJwb3BwZXJPZmZzZXRzIiwgIm1pbiIsICJtYXgiLCAib2Zmc2V0IiwgImVmZmVjdCIsICJwb3BwZXIiLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJlZmZlY3QiLCAid2luZG93IiwgImhhc2giLCAiZ2V0Q29tcHV0ZWRTdHlsZSIsICJnZXRDb21wdXRlZFN0eWxlIiwgImNsaXBwaW5nUGFyZW50cyIsICJnZXRDb21wdXRlZFN0eWxlIiwgInJlZmVyZW5jZSIsICJwb3BwZXJPZmZzZXRzIiwgIm9mZnNldCIsICJwbGFjZW1lbnRzIiwgInBsYWNlbWVudCIsICJwbGFjZW1lbnRzIiwgInBsYWNlbWVudCIsICJfbG9vcCIsICJfaSIsICJjaGVja3MiLCAib2Zmc2V0IiwgInBvcHBlck9mZnNldHMiLCAib2Zmc2V0IiwgIm1pbiIsICJtYXgiLCAiZm4iLCAic2VsZiIsICJmbiIsICJtZXJnZWQiLCAiZGVmYXVsdE1vZGlmaWVycyIsICJjcmVhdGVQb3BwZXIiLCAicmVmZXJlbmNlIiwgInBvcHBlciIsICJvcHRpb25zIiwgImdldENvbXB1dGVkU3R5bGUiLCAiZm4iLCAic3RhdGUiLCAiZWZmZWN0IiwgIm5vb3BGbiIsICJjcmVhdGVQb3BwZXIiLCAiZGVmYXVsdE1vZGlmaWVycyIsICJjcmVhdGVQb3BwZXIiLCAiTUFYX1VJRCIsICJNSUxMSVNFQ09ORFNfTVVMVElQTElFUiIsICJUUkFOU0lUSU9OX0VORCIsICJ0b1R5cGUiLCAib2JqZWN0IiwgInVuZGVmaW5lZCIsICJPYmplY3QiLCAicHJvdG90eXBlIiwgInRvU3RyaW5nIiwgImNhbGwiLCAibWF0Y2giLCAidG9Mb3dlckNhc2UiLCAiZ2V0VUlEIiwgInByZWZpeCIsICJNYXRoIiwgImZsb29yIiwgInJhbmRvbSIsICJkb2N1bWVudCIsICJnZXRFbGVtZW50QnlJZCIsICJnZXRTZWxlY3RvciIsICJlbGVtZW50IiwgInNlbGVjdG9yIiwgImdldEF0dHJpYnV0ZSIsICJocmVmQXR0cmlidXRlIiwgImluY2x1ZGVzIiwgInN0YXJ0c1dpdGgiLCAic3BsaXQiLCAidHJpbSIsICJnZXRTZWxlY3RvckZyb21FbGVtZW50IiwgInF1ZXJ5U2VsZWN0b3IiLCAiZ2V0RWxlbWVudEZyb21TZWxlY3RvciIsICJnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCIsICJ0cmFuc2l0aW9uRHVyYXRpb24iLCAidHJhbnNpdGlvbkRlbGF5IiwgIndpbmRvdyIsICJnZXRDb21wdXRlZFN0eWxlIiwgImZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uIiwgIk51bWJlciIsICJwYXJzZUZsb2F0IiwgImZsb2F0VHJhbnNpdGlvbkRlbGF5IiwgInRyaWdnZXJUcmFuc2l0aW9uRW5kIiwgImRpc3BhdGNoRXZlbnQiLCAiRXZlbnQiLCAiaXNFbGVtZW50IiwgImpxdWVyeSIsICJub2RlVHlwZSIsICJnZXRFbGVtZW50IiwgImxlbmd0aCIsICJpc1Zpc2libGUiLCAiZ2V0Q2xpZW50UmVjdHMiLCAiZWxlbWVudElzVmlzaWJsZSIsICJnZXRQcm9wZXJ0eVZhbHVlIiwgImNsb3NlZERldGFpbHMiLCAiY2xvc2VzdCIsICJzdW1tYXJ5IiwgInBhcmVudE5vZGUiLCAiaXNEaXNhYmxlZCIsICJOb2RlIiwgIkVMRU1FTlRfTk9ERSIsICJjbGFzc0xpc3QiLCAiY29udGFpbnMiLCAiZGlzYWJsZWQiLCAiaGFzQXR0cmlidXRlIiwgImZpbmRTaGFkb3dSb290IiwgImRvY3VtZW50RWxlbWVudCIsICJhdHRhY2hTaGFkb3ciLCAiZ2V0Um9vdE5vZGUiLCAicm9vdCIsICJTaGFkb3dSb290IiwgIm5vb3AiLCAicmVmbG93IiwgIm9mZnNldEhlaWdodCIsICJnZXRqUXVlcnkiLCAialF1ZXJ5IiwgImJvZHkiLCAiRE9NQ29udGVudExvYWRlZENhbGxiYWNrcyIsICJvbkRPTUNvbnRlbnRMb2FkZWQiLCAiY2FsbGJhY2siLCAicmVhZHlTdGF0ZSIsICJhZGRFdmVudExpc3RlbmVyIiwgInB1c2giLCAiaXNSVEwiLCAiZGlyIiwgImRlZmluZUpRdWVyeVBsdWdpbiIsICJwbHVnaW4iLCAiJCIsICJuYW1lIiwgIk5BTUUiLCAiSlFVRVJZX05PX0NPTkZMSUNUIiwgImZuIiwgImpRdWVyeUludGVyZmFjZSIsICJDb25zdHJ1Y3RvciIsICJub0NvbmZsaWN0IiwgImV4ZWN1dGUiLCAiZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiIsICJ0cmFuc2l0aW9uRWxlbWVudCIsICJ3YWl0Rm9yVHJhbnNpdGlvbiIsICJkdXJhdGlvblBhZGRpbmciLCAiZW11bGF0ZWREdXJhdGlvbiIsICJjYWxsZWQiLCAiaGFuZGxlciIsICJ0YXJnZXQiLCAicmVtb3ZlRXZlbnRMaXN0ZW5lciIsICJzZXRUaW1lb3V0IiwgImdldE5leHRBY3RpdmVFbGVtZW50IiwgImxpc3QiLCAiYWN0aXZlRWxlbWVudCIsICJzaG91bGRHZXROZXh0IiwgImlzQ3ljbGVBbGxvd2VkIiwgImxpc3RMZW5ndGgiLCAiaW5kZXgiLCAiaW5kZXhPZiIsICJtYXgiLCAibWluIiwgIm5hbWVzcGFjZVJlZ2V4IiwgInN0cmlwTmFtZVJlZ2V4IiwgInN0cmlwVWlkUmVnZXgiLCAiZXZlbnRSZWdpc3RyeSIsICJ1aWRFdmVudCIsICJjdXN0b21FdmVudHMiLCAibW91c2VlbnRlciIsICJtb3VzZWxlYXZlIiwgIm5hdGl2ZUV2ZW50cyIsICJTZXQiLCAibWFrZUV2ZW50VWlkIiwgInVpZCIsICJnZXRFbGVtZW50RXZlbnRzIiwgImJvb3RzdHJhcEhhbmRsZXIiLCAiZXZlbnQiLCAiaHlkcmF0ZU9iaiIsICJkZWxlZ2F0ZVRhcmdldCIsICJvbmVPZmYiLCAiRXZlbnRIYW5kbGVyIiwgIm9mZiIsICJ0eXBlIiwgImFwcGx5IiwgImJvb3RzdHJhcERlbGVnYXRpb25IYW5kbGVyIiwgImRvbUVsZW1lbnRzIiwgInF1ZXJ5U2VsZWN0b3JBbGwiLCAiZG9tRWxlbWVudCIsICJmaW5kSGFuZGxlciIsICJldmVudHMiLCAiY2FsbGFibGUiLCAiZGVsZWdhdGlvblNlbGVjdG9yIiwgInZhbHVlcyIsICJmaW5kIiwgIm5vcm1hbGl6ZVBhcmFtZXRlcnMiLCAib3JpZ2luYWxUeXBlRXZlbnQiLCAiZGVsZWdhdGlvbkZ1bmN0aW9uIiwgImlzRGVsZWdhdGVkIiwgInR5cGVFdmVudCIsICJnZXRUeXBlRXZlbnQiLCAiaGFzIiwgImFkZEhhbmRsZXIiLCAid3JhcEZ1bmN0aW9uIiwgInJlbGF0ZWRUYXJnZXQiLCAiaGFuZGxlcnMiLCAicHJldmlvdXNGdW5jdGlvbiIsICJyZXBsYWNlIiwgInJlbW92ZUhhbmRsZXIiLCAiQm9vbGVhbiIsICJyZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMiLCAibmFtZXNwYWNlIiwgInN0b3JlRWxlbWVudEV2ZW50IiwgImhhbmRsZXJLZXkiLCAia2V5cyIsICJvbiIsICJvbmUiLCAiaW5OYW1lc3BhY2UiLCAiaXNOYW1lc3BhY2UiLCAiZWxlbWVudEV2ZW50IiwgInNsaWNlIiwgImtleUhhbmRsZXJzIiwgInRyaWdnZXIiLCAiYXJncyIsICJqUXVlcnlFdmVudCIsICJidWJibGVzIiwgIm5hdGl2ZURpc3BhdGNoIiwgImRlZmF1bHRQcmV2ZW50ZWQiLCAiaXNQcm9wYWdhdGlvblN0b3BwZWQiLCAiaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQiLCAiaXNEZWZhdWx0UHJldmVudGVkIiwgImV2dCIsICJjYW5jZWxhYmxlIiwgInByZXZlbnREZWZhdWx0IiwgIm9iaiIsICJtZXRhIiwgImtleSIsICJ2YWx1ZSIsICJlbnRyaWVzIiwgImRlZmluZVByb3BlcnR5IiwgImNvbmZpZ3VyYWJsZSIsICJnZXQiLCAiZWxlbWVudE1hcCIsICJNYXAiLCAic2V0IiwgImluc3RhbmNlIiwgImluc3RhbmNlTWFwIiwgInNpemUiLCAiY29uc29sZSIsICJlcnJvciIsICJBcnJheSIsICJmcm9tIiwgInJlbW92ZSIsICJkZWxldGUiLCAibm9ybWFsaXplRGF0YSIsICJKU09OIiwgInBhcnNlIiwgImRlY29kZVVSSUNvbXBvbmVudCIsICJub3JtYWxpemVEYXRhS2V5IiwgImNociIsICJNYW5pcHVsYXRvciIsICJzZXREYXRhQXR0cmlidXRlIiwgInNldEF0dHJpYnV0ZSIsICJyZW1vdmVEYXRhQXR0cmlidXRlIiwgInJlbW92ZUF0dHJpYnV0ZSIsICJnZXREYXRhQXR0cmlidXRlcyIsICJhdHRyaWJ1dGVzIiwgImJzS2V5cyIsICJkYXRhc2V0IiwgImZpbHRlciIsICJwdXJlS2V5IiwgImNoYXJBdCIsICJnZXREYXRhQXR0cmlidXRlIiwgIkNvbmZpZyIsICJEZWZhdWx0IiwgIkRlZmF1bHRUeXBlIiwgIkVycm9yIiwgIl9nZXRDb25maWciLCAiY29uZmlnIiwgIl9tZXJnZUNvbmZpZ09iaiIsICJfY29uZmlnQWZ0ZXJNZXJnZSIsICJfdHlwZUNoZWNrQ29uZmlnIiwgImpzb25Db25maWciLCAiY29uc3RydWN0b3IiLCAiY29uZmlnVHlwZXMiLCAicHJvcGVydHkiLCAiZXhwZWN0ZWRUeXBlcyIsICJ2YWx1ZVR5cGUiLCAiUmVnRXhwIiwgInRlc3QiLCAiVHlwZUVycm9yIiwgInRvVXBwZXJDYXNlIiwgIlZFUlNJT04iLCAiQmFzZUNvbXBvbmVudCIsICJfZWxlbWVudCIsICJfY29uZmlnIiwgIkRhdGEiLCAiREFUQV9LRVkiLCAiZGlzcG9zZSIsICJFVkVOVF9LRVkiLCAicHJvcGVydHlOYW1lIiwgImdldE93blByb3BlcnR5TmFtZXMiLCAiX3F1ZXVlQ2FsbGJhY2siLCAiaXNBbmltYXRlZCIsICJnZXRJbnN0YW5jZSIsICJnZXRPckNyZWF0ZUluc3RhbmNlIiwgImV2ZW50TmFtZSIsICJlbmFibGVEaXNtaXNzVHJpZ2dlciIsICJjb21wb25lbnQiLCAibWV0aG9kIiwgImNsaWNrRXZlbnQiLCAidGFnTmFtZSIsICJFVkVOVF9DTE9TRSIsICJFVkVOVF9DTE9TRUQiLCAiQ0xBU1NfTkFNRV9GQURFIiwgIkNMQVNTX05BTUVfU0hPVyIsICJBbGVydCIsICJjbG9zZSIsICJjbG9zZUV2ZW50IiwgIl9kZXN0cm95RWxlbWVudCIsICJlYWNoIiwgImRhdGEiLCAiREFUQV9BUElfS0VZIiwgIkNMQVNTX05BTUVfQUNUSVZFIiwgIlNFTEVDVE9SX0RBVEFfVE9HR0xFIiwgIkVWRU5UX0NMSUNLX0RBVEFfQVBJIiwgIkJ1dHRvbiIsICJ0b2dnbGUiLCAiYnV0dG9uIiwgIlNlbGVjdG9yRW5naW5lIiwgImNvbmNhdCIsICJFbGVtZW50IiwgImZpbmRPbmUiLCAiY2hpbGRyZW4iLCAiY2hpbGQiLCAibWF0Y2hlcyIsICJwYXJlbnRzIiwgImFuY2VzdG9yIiwgInByZXYiLCAicHJldmlvdXMiLCAicHJldmlvdXNFbGVtZW50U2libGluZyIsICJuZXh0IiwgIm5leHRFbGVtZW50U2libGluZyIsICJmb2N1c2FibGVDaGlsZHJlbiIsICJmb2N1c2FibGVzIiwgIm1hcCIsICJqb2luIiwgImVsIiwgIkVWRU5UX1RPVUNIU1RBUlQiLCAiRVZFTlRfVE9VQ0hNT1ZFIiwgIkVWRU5UX1RPVUNIRU5EIiwgIkVWRU5UX1BPSU5URVJET1dOIiwgIkVWRU5UX1BPSU5URVJVUCIsICJQT0lOVEVSX1RZUEVfVE9VQ0giLCAiUE9JTlRFUl9UWVBFX1BFTiIsICJDTEFTU19OQU1FX1BPSU5URVJfRVZFTlQiLCAiU1dJUEVfVEhSRVNIT0xEIiwgImVuZENhbGxiYWNrIiwgImxlZnRDYWxsYmFjayIsICJyaWdodENhbGxiYWNrIiwgIlN3aXBlIiwgImlzU3VwcG9ydGVkIiwgIl9kZWx0YVgiLCAiX3N1cHBvcnRQb2ludGVyRXZlbnRzIiwgIlBvaW50ZXJFdmVudCIsICJfaW5pdEV2ZW50cyIsICJfc3RhcnQiLCAidG91Y2hlcyIsICJjbGllbnRYIiwgIl9ldmVudElzUG9pbnRlclBlblRvdWNoIiwgIl9lbmQiLCAiX2hhbmRsZVN3aXBlIiwgIl9tb3ZlIiwgImFic0RlbHRhWCIsICJhYnMiLCAiZGlyZWN0aW9uIiwgImFkZCIsICJwb2ludGVyVHlwZSIsICJuYXZpZ2F0b3IiLCAibWF4VG91Y2hQb2ludHMiLCAiQVJST1dfTEVGVF9LRVkiLCAiQVJST1dfUklHSFRfS0VZIiwgIlRPVUNIRVZFTlRfQ09NUEFUX1dBSVQiLCAiT1JERVJfTkVYVCIsICJPUkRFUl9QUkVWIiwgIkRJUkVDVElPTl9MRUZUIiwgIkRJUkVDVElPTl9SSUdIVCIsICJFVkVOVF9TTElERSIsICJFVkVOVF9TTElEIiwgIkVWRU5UX0tFWURPV04iLCAiRVZFTlRfTU9VU0VFTlRFUiIsICJFVkVOVF9NT1VTRUxFQVZFIiwgIkVWRU5UX0RSQUdfU1RBUlQiLCAiRVZFTlRfTE9BRF9EQVRBX0FQSSIsICJDTEFTU19OQU1FX0NBUk9VU0VMIiwgIkNMQVNTX05BTUVfU0xJREUiLCAiQ0xBU1NfTkFNRV9FTkQiLCAiQ0xBU1NfTkFNRV9TVEFSVCIsICJDTEFTU19OQU1FX05FWFQiLCAiQ0xBU1NfTkFNRV9QUkVWIiwgIlNFTEVDVE9SX0FDVElWRSIsICJTRUxFQ1RPUl9JVEVNIiwgIlNFTEVDVE9SX0FDVElWRV9JVEVNIiwgIlNFTEVDVE9SX0lURU1fSU1HIiwgIlNFTEVDVE9SX0lORElDQVRPUlMiLCAiU0VMRUNUT1JfREFUQV9TTElERSIsICJTRUxFQ1RPUl9EQVRBX1JJREUiLCAiS0VZX1RPX0RJUkVDVElPTiIsICJpbnRlcnZhbCIsICJrZXlib2FyZCIsICJwYXVzZSIsICJyaWRlIiwgInRvdWNoIiwgIndyYXAiLCAiQ2Fyb3VzZWwiLCAiX2ludGVydmFsIiwgIl9hY3RpdmVFbGVtZW50IiwgIl9pc1NsaWRpbmciLCAidG91Y2hUaW1lb3V0IiwgIl9zd2lwZUhlbHBlciIsICJfaW5kaWNhdG9yc0VsZW1lbnQiLCAiX2FkZEV2ZW50TGlzdGVuZXJzIiwgImN5Y2xlIiwgIl9zbGlkZSIsICJuZXh0V2hlblZpc2libGUiLCAiaGlkZGVuIiwgIl9jbGVhckludGVydmFsIiwgIl91cGRhdGVJbnRlcnZhbCIsICJzZXRJbnRlcnZhbCIsICJfbWF5YmVFbmFibGVDeWNsZSIsICJ0byIsICJpdGVtcyIsICJfZ2V0SXRlbXMiLCAiYWN0aXZlSW5kZXgiLCAiX2dldEl0ZW1JbmRleCIsICJfZ2V0QWN0aXZlIiwgIm9yZGVyIiwgImRlZmF1bHRJbnRlcnZhbCIsICJfa2V5ZG93biIsICJfYWRkVG91Y2hFdmVudExpc3RlbmVycyIsICJpbWciLCAiZW5kQ2FsbEJhY2siLCAiY2xlYXJUaW1lb3V0IiwgInN3aXBlQ29uZmlnIiwgIl9kaXJlY3Rpb25Ub09yZGVyIiwgIl9zZXRBY3RpdmVJbmRpY2F0b3JFbGVtZW50IiwgImFjdGl2ZUluZGljYXRvciIsICJuZXdBY3RpdmVJbmRpY2F0b3IiLCAiZWxlbWVudEludGVydmFsIiwgInBhcnNlSW50IiwgImlzTmV4dCIsICJuZXh0RWxlbWVudCIsICJuZXh0RWxlbWVudEluZGV4IiwgInRyaWdnZXJFdmVudCIsICJfb3JkZXJUb0RpcmVjdGlvbiIsICJzbGlkZUV2ZW50IiwgImlzQ3ljbGluZyIsICJkaXJlY3Rpb25hbENsYXNzTmFtZSIsICJvcmRlckNsYXNzTmFtZSIsICJjb21wbGV0ZUNhbGxCYWNrIiwgIl9pc0FuaW1hdGVkIiwgImNsZWFySW50ZXJ2YWwiLCAiY2Fyb3VzZWwiLCAic2xpZGVJbmRleCIsICJjYXJvdXNlbHMiLCAiRVZFTlRfU0hPVyIsICJFVkVOVF9TSE9XTiIsICJFVkVOVF9ISURFIiwgIkVWRU5UX0hJRERFTiIsICJDTEFTU19OQU1FX0NPTExBUFNFIiwgIkNMQVNTX05BTUVfQ09MTEFQU0lORyIsICJDTEFTU19OQU1FX0NPTExBUFNFRCIsICJDTEFTU19OQU1FX0RFRVBFUl9DSElMRFJFTiIsICJDTEFTU19OQU1FX0hPUklaT05UQUwiLCAiV0lEVEgiLCAiSEVJR0hUIiwgIlNFTEVDVE9SX0FDVElWRVMiLCAicGFyZW50IiwgIkNvbGxhcHNlIiwgIl9pc1RyYW5zaXRpb25pbmciLCAiX3RyaWdnZXJBcnJheSIsICJ0b2dnbGVMaXN0IiwgImVsZW0iLCAiZmlsdGVyRWxlbWVudCIsICJmb3VuZEVsZW1lbnQiLCAiX2luaXRpYWxpemVDaGlsZHJlbiIsICJfYWRkQXJpYUFuZENvbGxhcHNlZENsYXNzIiwgIl9pc1Nob3duIiwgImhpZGUiLCAic2hvdyIsICJhY3RpdmVDaGlsZHJlbiIsICJfZ2V0Rmlyc3RMZXZlbENoaWxkcmVuIiwgInN0YXJ0RXZlbnQiLCAiYWN0aXZlSW5zdGFuY2UiLCAiZGltZW5zaW9uIiwgIl9nZXREaW1lbnNpb24iLCAic3R5bGUiLCAiY29tcGxldGUiLCAiY2FwaXRhbGl6ZWREaW1lbnNpb24iLCAic2Nyb2xsU2l6ZSIsICJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCAic2VsZWN0ZWQiLCAidHJpZ2dlckFycmF5IiwgImlzT3BlbiIsICJzZWxlY3RvckVsZW1lbnRzIiwgIkVTQ0FQRV9LRVkiLCAiVEFCX0tFWSIsICJBUlJPV19VUF9LRVkiLCAiQVJST1dfRE9XTl9LRVkiLCAiUklHSFRfTU9VU0VfQlVUVE9OIiwgIkVWRU5UX0tFWURPV05fREFUQV9BUEkiLCAiRVZFTlRfS0VZVVBfREFUQV9BUEkiLCAiQ0xBU1NfTkFNRV9EUk9QVVAiLCAiQ0xBU1NfTkFNRV9EUk9QRU5EIiwgIkNMQVNTX05BTUVfRFJPUFNUQVJUIiwgIkNMQVNTX05BTUVfRFJPUFVQX0NFTlRFUiIsICJDTEFTU19OQU1FX0RST1BET1dOX0NFTlRFUiIsICJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9TSE9XTiIsICJTRUxFQ1RPUl9NRU5VIiwgIlNFTEVDVE9SX05BVkJBUiIsICJTRUxFQ1RPUl9OQVZCQVJfTkFWIiwgIlNFTEVDVE9SX1ZJU0lCTEVfSVRFTVMiLCAiUExBQ0VNRU5UX1RPUCIsICJQTEFDRU1FTlRfVE9QRU5EIiwgIlBMQUNFTUVOVF9CT1RUT00iLCAiUExBQ0VNRU5UX0JPVFRPTUVORCIsICJQTEFDRU1FTlRfUklHSFQiLCAiUExBQ0VNRU5UX0xFRlQiLCAiUExBQ0VNRU5UX1RPUENFTlRFUiIsICJQTEFDRU1FTlRfQk9UVE9NQ0VOVEVSIiwgImF1dG9DbG9zZSIsICJib3VuZGFyeSIsICJkaXNwbGF5IiwgIm9mZnNldCIsICJwb3BwZXJDb25maWciLCAicmVmZXJlbmNlIiwgIkRyb3Bkb3duIiwgIl9wb3BwZXIiLCAiX3BhcmVudCIsICJfbWVudSIsICJfaW5OYXZiYXIiLCAiX2RldGVjdE5hdmJhciIsICJzaG93RXZlbnQiLCAiX2NyZWF0ZVBvcHBlciIsICJmb2N1cyIsICJfY29tcGxldGVIaWRlIiwgImRlc3Ryb3kiLCAidXBkYXRlIiwgImhpZGVFdmVudCIsICJQb3BwZXIiLCAicmVmZXJlbmNlRWxlbWVudCIsICJfZ2V0UG9wcGVyQ29uZmlnIiwgImNyZWF0ZVBvcHBlciIsICJfZ2V0UGxhY2VtZW50IiwgInBhcmVudERyb3Bkb3duIiwgImlzRW5kIiwgIl9nZXRPZmZzZXQiLCAicG9wcGVyRGF0YSIsICJkZWZhdWx0QnNQb3BwZXJDb25maWciLCAicGxhY2VtZW50IiwgIm1vZGlmaWVycyIsICJvcHRpb25zIiwgImVuYWJsZWQiLCAiX3NlbGVjdE1lbnVJdGVtIiwgImNsZWFyTWVudXMiLCAib3BlblRvZ2dsZXMiLCAiY29udGV4dCIsICJjb21wb3NlZFBhdGgiLCAiaXNNZW51VGFyZ2V0IiwgImRhdGFBcGlLZXlkb3duSGFuZGxlciIsICJpc0lucHV0IiwgImlzRXNjYXBlRXZlbnQiLCAiaXNVcE9yRG93bkV2ZW50IiwgImdldFRvZ2dsZUJ1dHRvbiIsICJzdG9wUHJvcGFnYXRpb24iLCAiU0VMRUNUT1JfRklYRURfQ09OVEVOVCIsICJTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCIsICJQUk9QRVJUWV9QQURESU5HIiwgIlBST1BFUlRZX01BUkdJTiIsICJTY3JvbGxCYXJIZWxwZXIiLCAiZ2V0V2lkdGgiLCAiZG9jdW1lbnRXaWR0aCIsICJjbGllbnRXaWR0aCIsICJpbm5lcldpZHRoIiwgIndpZHRoIiwgIl9kaXNhYmxlT3ZlckZsb3ciLCAiX3NldEVsZW1lbnRBdHRyaWJ1dGVzIiwgImNhbGN1bGF0ZWRWYWx1ZSIsICJyZXNldCIsICJfcmVzZXRFbGVtZW50QXR0cmlidXRlcyIsICJpc092ZXJmbG93aW5nIiwgIl9zYXZlSW5pdGlhbEF0dHJpYnV0ZSIsICJvdmVyZmxvdyIsICJzdHlsZVByb3BlcnR5IiwgInNjcm9sbGJhcldpZHRoIiwgIm1hbmlwdWxhdGlvbkNhbGxCYWNrIiwgInNldFByb3BlcnR5IiwgIl9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrIiwgImFjdHVhbFZhbHVlIiwgInJlbW92ZVByb3BlcnR5IiwgImNhbGxCYWNrIiwgInNlbCIsICJFVkVOVF9NT1VTRURPV04iLCAiY2xhc3NOYW1lIiwgImNsaWNrQ2FsbGJhY2siLCAicm9vdEVsZW1lbnQiLCAiQmFja2Ryb3AiLCAiX2lzQXBwZW5kZWQiLCAiX2FwcGVuZCIsICJfZ2V0RWxlbWVudCIsICJfZW11bGF0ZUFuaW1hdGlvbiIsICJiYWNrZHJvcCIsICJjcmVhdGVFbGVtZW50IiwgImFwcGVuZCIsICJFVkVOVF9GT0NVU0lOIiwgIkVWRU5UX0tFWURPV05fVEFCIiwgIlRBQl9OQVZfRk9SV0FSRCIsICJUQUJfTkFWX0JBQ0tXQVJEIiwgImF1dG9mb2N1cyIsICJ0cmFwRWxlbWVudCIsICJGb2N1c1RyYXAiLCAiX2lzQWN0aXZlIiwgIl9sYXN0VGFiTmF2RGlyZWN0aW9uIiwgImFjdGl2YXRlIiwgIl9oYW5kbGVGb2N1c2luIiwgIl9oYW5kbGVLZXlkb3duIiwgImRlYWN0aXZhdGUiLCAiZWxlbWVudHMiLCAic2hpZnRLZXkiLCAiRVZFTlRfSElERV9QUkVWRU5URUQiLCAiRVZFTlRfUkVTSVpFIiwgIkVWRU5UX0NMSUNLX0RJU01JU1MiLCAiRVZFTlRfTU9VU0VET1dOX0RJU01JU1MiLCAiRVZFTlRfS0VZRE9XTl9ESVNNSVNTIiwgIkNMQVNTX05BTUVfT1BFTiIsICJDTEFTU19OQU1FX1NUQVRJQyIsICJPUEVOX1NFTEVDVE9SIiwgIlNFTEVDVE9SX0RJQUxPRyIsICJTRUxFQ1RPUl9NT0RBTF9CT0RZIiwgIk1vZGFsIiwgIl9kaWFsb2ciLCAiX2JhY2tkcm9wIiwgIl9pbml0aWFsaXplQmFja0Ryb3AiLCAiX2ZvY3VzdHJhcCIsICJfaW5pdGlhbGl6ZUZvY3VzVHJhcCIsICJfc2Nyb2xsQmFyIiwgIl9hZGp1c3REaWFsb2ciLCAiX3Nob3dFbGVtZW50IiwgIl9oaWRlTW9kYWwiLCAiaHRtbEVsZW1lbnQiLCAiaGFuZGxlVXBkYXRlIiwgInNjcm9sbFRvcCIsICJtb2RhbEJvZHkiLCAidHJhbnNpdGlvbkNvbXBsZXRlIiwgIl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uIiwgImV2ZW50MiIsICJfcmVzZXRBZGp1c3RtZW50cyIsICJpc01vZGFsT3ZlcmZsb3dpbmciLCAic2Nyb2xsSGVpZ2h0IiwgImNsaWVudEhlaWdodCIsICJpbml0aWFsT3ZlcmZsb3dZIiwgIm92ZXJmbG93WSIsICJpc0JvZHlPdmVyZmxvd2luZyIsICJwYWRkaW5nTGVmdCIsICJwYWRkaW5nUmlnaHQiLCAiYWxyZWFkeU9wZW4iLCAiQ0xBU1NfTkFNRV9TSE9XSU5HIiwgIkNMQVNTX05BTUVfSElESU5HIiwgIkNMQVNTX05BTUVfQkFDS0RST1AiLCAic2Nyb2xsIiwgIk9mZmNhbnZhcyIsICJibHVyIiwgImNvbXBsZXRlQ2FsbGJhY2siLCAicG9zaXRpb24iLCAidXJpQXR0cmlidXRlcyIsICJBUklBX0FUVFJJQlVURV9QQVRURVJOIiwgIlNBRkVfVVJMX1BBVFRFUk4iLCAiREFUQV9VUkxfUEFUVEVSTiIsICJhbGxvd2VkQXR0cmlidXRlIiwgImF0dHJpYnV0ZSIsICJhbGxvd2VkQXR0cmlidXRlTGlzdCIsICJhdHRyaWJ1dGVOYW1lIiwgIm5vZGVOYW1lIiwgIm5vZGVWYWx1ZSIsICJhdHRyaWJ1dGVSZWdleCIsICJzb21lIiwgInJlZ2V4IiwgIkRlZmF1bHRBbGxvd2xpc3QiLCAiYSIsICJhcmVhIiwgImIiLCAiYnIiLCAiY29sIiwgImNvZGUiLCAiZGl2IiwgImVtIiwgImhyIiwgImgxIiwgImgyIiwgImgzIiwgImg0IiwgImg1IiwgImg2IiwgImkiLCAibGkiLCAib2wiLCAicCIsICJwcmUiLCAicyIsICJzbWFsbCIsICJzcGFuIiwgInN1YiIsICJzdXAiLCAic3Ryb25nIiwgInUiLCAidWwiLCAic2FuaXRpemVIdG1sIiwgInVuc2FmZUh0bWwiLCAiYWxsb3dMaXN0IiwgInNhbml0aXplRnVuY3Rpb24iLCAiZG9tUGFyc2VyIiwgIkRPTVBhcnNlciIsICJjcmVhdGVkRG9jdW1lbnQiLCAicGFyc2VGcm9tU3RyaW5nIiwgImVsZW1lbnROYW1lIiwgImF0dHJpYnV0ZUxpc3QiLCAiYWxsb3dlZEF0dHJpYnV0ZXMiLCAiaW5uZXJIVE1MIiwgImNvbnRlbnQiLCAiZXh0cmFDbGFzcyIsICJodG1sIiwgInNhbml0aXplIiwgInNhbml0aXplRm4iLCAidGVtcGxhdGUiLCAiRGVmYXVsdENvbnRlbnRUeXBlIiwgImVudHJ5IiwgIlRlbXBsYXRlRmFjdG9yeSIsICJnZXRDb250ZW50IiwgIl9yZXNvbHZlUG9zc2libGVGdW5jdGlvbiIsICJoYXNDb250ZW50IiwgImNoYW5nZUNvbnRlbnQiLCAiX2NoZWNrQ29udGVudCIsICJ0b0h0bWwiLCAidGVtcGxhdGVXcmFwcGVyIiwgIl9tYXliZVNhbml0aXplIiwgInRleHQiLCAiX3NldENvbnRlbnQiLCAiYXJnIiwgInRlbXBsYXRlRWxlbWVudCIsICJfcHV0RWxlbWVudEluVGVtcGxhdGUiLCAidGV4dENvbnRlbnQiLCAiRElTQUxMT1dFRF9BVFRSSUJVVEVTIiwgIkNMQVNTX05BTUVfTU9EQUwiLCAiU0VMRUNUT1JfVE9PTFRJUF9JTk5FUiIsICJTRUxFQ1RPUl9NT0RBTCIsICJFVkVOVF9NT0RBTF9ISURFIiwgIlRSSUdHRVJfSE9WRVIiLCAiVFJJR0dFUl9GT0NVUyIsICJUUklHR0VSX0NMSUNLIiwgIlRSSUdHRVJfTUFOVUFMIiwgIkVWRU5UX0lOU0VSVEVEIiwgIkVWRU5UX0NMSUNLIiwgIkVWRU5UX0ZPQ1VTT1VUIiwgIkF0dGFjaG1lbnRNYXAiLCAiQVVUTyIsICJUT1AiLCAiUklHSFQiLCAiQk9UVE9NIiwgIkxFRlQiLCAiYW5pbWF0aW9uIiwgImNvbnRhaW5lciIsICJjdXN0b21DbGFzcyIsICJkZWxheSIsICJmYWxsYmFja1BsYWNlbWVudHMiLCAidGl0bGUiLCAiVG9vbHRpcCIsICJfaXNFbmFibGVkIiwgIl90aW1lb3V0IiwgIl9pc0hvdmVyZWQiLCAiX2FjdGl2ZVRyaWdnZXIiLCAiX3RlbXBsYXRlRmFjdG9yeSIsICJfbmV3Q29udGVudCIsICJ0aXAiLCAiX3NldExpc3RlbmVycyIsICJfZml4VGl0bGUiLCAiZW5hYmxlIiwgImRpc2FibGUiLCAidG9nZ2xlRW5hYmxlZCIsICJjbGljayIsICJfbGVhdmUiLCAiX2VudGVyIiwgIl9oaWRlTW9kYWxIYW5kbGVyIiwgIl9kaXNwb3NlUG9wcGVyIiwgIl9pc1dpdGhDb250ZW50IiwgInNoYWRvd1Jvb3QiLCAiaXNJblRoZURvbSIsICJvd25lckRvY3VtZW50IiwgIl9nZXRUaXBFbGVtZW50IiwgIl9pc1dpdGhBY3RpdmVUcmlnZ2VyIiwgIl9nZXRUaXRsZSIsICJfY3JlYXRlVGlwRWxlbWVudCIsICJfZ2V0Q29udGVudEZvclRlbXBsYXRlIiwgIl9nZXRUZW1wbGF0ZUZhY3RvcnkiLCAidGlwSWQiLCAic2V0Q29udGVudCIsICJfaW5pdGlhbGl6ZU9uRGVsZWdhdGVkVGFyZ2V0IiwgIl9nZXREZWxlZ2F0ZUNvbmZpZyIsICJhdHRhY2htZW50IiwgInBoYXNlIiwgInN0YXRlIiwgInRyaWdnZXJzIiwgImV2ZW50SW4iLCAiZXZlbnRPdXQiLCAiX3NldFRpbWVvdXQiLCAidGltZW91dCIsICJkYXRhQXR0cmlidXRlcyIsICJkYXRhQXR0cmlidXRlIiwgIlNFTEVDVE9SX1RJVExFIiwgIlNFTEVDVE9SX0NPTlRFTlQiLCAiUG9wb3ZlciIsICJfZ2V0Q29udGVudCIsICJFVkVOVF9BQ1RJVkFURSIsICJDTEFTU19OQU1FX0RST1BET1dOX0lURU0iLCAiU0VMRUNUT1JfREFUQV9TUFkiLCAiU0VMRUNUT1JfVEFSR0VUX0xJTktTIiwgIlNFTEVDVE9SX05BVl9MSVNUX0dST1VQIiwgIlNFTEVDVE9SX05BVl9MSU5LUyIsICJTRUxFQ1RPUl9OQVZfSVRFTVMiLCAiU0VMRUNUT1JfTElTVF9JVEVNUyIsICJTRUxFQ1RPUl9MSU5LX0lURU1TIiwgIlNFTEVDVE9SX0RST1BET1dOIiwgIlNFTEVDVE9SX0RST1BET1dOX1RPR0dMRSIsICJyb290TWFyZ2luIiwgInNtb290aFNjcm9sbCIsICJ0aHJlc2hvbGQiLCAiU2Nyb2xsU3B5IiwgIl90YXJnZXRMaW5rcyIsICJfb2JzZXJ2YWJsZVNlY3Rpb25zIiwgIl9yb290RWxlbWVudCIsICJfYWN0aXZlVGFyZ2V0IiwgIl9vYnNlcnZlciIsICJfcHJldmlvdXNTY3JvbGxEYXRhIiwgInZpc2libGVFbnRyeVRvcCIsICJwYXJlbnRTY3JvbGxUb3AiLCAicmVmcmVzaCIsICJfaW5pdGlhbGl6ZVRhcmdldHNBbmRPYnNlcnZhYmxlcyIsICJfbWF5YmVFbmFibGVTbW9vdGhTY3JvbGwiLCAiZGlzY29ubmVjdCIsICJfZ2V0TmV3T2JzZXJ2ZXIiLCAic2VjdGlvbiIsICJvYnNlcnZlIiwgIm9ic2VydmFibGVTZWN0aW9uIiwgImhhc2giLCAiaGVpZ2h0IiwgIm9mZnNldFRvcCIsICJzY3JvbGxUbyIsICJ0b3AiLCAiYmVoYXZpb3IiLCAiSW50ZXJzZWN0aW9uT2JzZXJ2ZXIiLCAiX29ic2VydmVyQ2FsbGJhY2siLCAidGFyZ2V0RWxlbWVudCIsICJpZCIsICJfcHJvY2VzcyIsICJ1c2VyU2Nyb2xsc0Rvd24iLCAiaXNJbnRlcnNlY3RpbmciLCAiX2NsZWFyQWN0aXZlQ2xhc3MiLCAiZW50cnlJc0xvd2VyVGhhblByZXZpb3VzIiwgInRhcmdldExpbmtzIiwgImFuY2hvciIsICJfYWN0aXZhdGVQYXJlbnRzIiwgImxpc3RHcm91cCIsICJpdGVtIiwgImFjdGl2ZU5vZGVzIiwgIm5vZGUiLCAic3B5IiwgIkNMQVNTX0RST1BET1dOIiwgIlNFTEVDVE9SX0RST1BET1dOX01FTlUiLCAiTk9UX1NFTEVDVE9SX0RST1BET1dOX1RPR0dMRSIsICJTRUxFQ1RPUl9UQUJfUEFORUwiLCAiU0VMRUNUT1JfT1VURVIiLCAiU0VMRUNUT1JfSU5ORVIiLCAiU0VMRUNUT1JfSU5ORVJfRUxFTSIsICJTRUxFQ1RPUl9EQVRBX1RPR0dMRV9BQ1RJVkUiLCAiVGFiIiwgIl9zZXRJbml0aWFsQXR0cmlidXRlcyIsICJfZ2V0Q2hpbGRyZW4iLCAiaW5uZXJFbGVtIiwgIl9lbGVtSXNBY3RpdmUiLCAiYWN0aXZlIiwgIl9nZXRBY3RpdmVFbGVtIiwgIl9kZWFjdGl2YXRlIiwgIl9hY3RpdmF0ZSIsICJyZWxhdGVkRWxlbSIsICJfdG9nZ2xlRHJvcERvd24iLCAibmV4dEFjdGl2ZUVsZW1lbnQiLCAicHJldmVudFNjcm9sbCIsICJfc2V0QXR0cmlidXRlSWZOb3RFeGlzdHMiLCAiX3NldEluaXRpYWxBdHRyaWJ1dGVzT25DaGlsZCIsICJfZ2V0SW5uZXJFbGVtZW50IiwgImlzQWN0aXZlIiwgIm91dGVyRWxlbSIsICJfZ2V0T3V0ZXJFbGVtZW50IiwgIl9zZXRJbml0aWFsQXR0cmlidXRlc09uVGFyZ2V0UGFuZWwiLCAib3BlbiIsICJFVkVOVF9NT1VTRU9WRVIiLCAiRVZFTlRfTU9VU0VPVVQiLCAiQ0xBU1NfTkFNRV9ISURFIiwgImF1dG9oaWRlIiwgIlRvYXN0IiwgIl9oYXNNb3VzZUludGVyYWN0aW9uIiwgIl9oYXNLZXlib2FyZEludGVyYWN0aW9uIiwgIl9jbGVhclRpbWVvdXQiLCAiX21heWJlU2NoZWR1bGVIaWRlIiwgImlzU2hvd24iLCAiX29uSW50ZXJhY3Rpb24iLCAiaXNJbnRlcmFjdGluZyIsICIkIiwgImltcG9ydF9qcXVlcnkiLCAibWF4IiwgIiQiLCAiQ3VzdG9tRXZlbnQiLCAiY2xvc3VyZTIiLCAiZ2xvYmFsIiwgIm9mZnNldCIsICJnbG9iYWwiLCAibGl2ZVNvY2tldCIsICJjbG9zdXJlIiwgImhhc2giLCAiZGVib3VuY2UiLCAibm9vcCIsICIkIiwgInRvcGJhciJdCn0K