bundle.js 236 KB
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
var __extends = (this && this.__extends) || (function () {
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**This class is automatically generated by LayaAirIDE, please do not make any modifications. */
var TestScene_1 = require("./TestScene");
var ScaleButtonScript_1 = require("./uitl/ScaleButtonScript");
var RedDrawal_1 = require("./RedDrawal");
var NativeAd_1 = require("./sdk/NativeAd");
/*
* 游戏初始化配置;
*/
var GameConfig = /** @class */ (function () {
    function GameConfig() {
    }
    GameConfig.init = function () {
        var reg = Laya.ClassUtils.regClass;
        reg("TestScene.ts", TestScene_1.default);
        reg("uitl/ScaleButtonScript.ts", ScaleButtonScript_1.default);
        reg("RedDrawal.ts", RedDrawal_1.default);
        reg("sdk/NativeAd.ts", NativeAd_1.default);
    };
    GameConfig.width = 750;
    GameConfig.height = 1334;
    GameConfig.scaleMode = "fixedwidth";
    GameConfig.screenMode = "none";
    GameConfig.alignV = "top";
    GameConfig.alignH = "left";
    GameConfig.startScene = "TestScene.scene";
    GameConfig.sceneRoot = "";
    GameConfig.debug = false;
    GameConfig.stat = false;
    GameConfig.physicsDebug = false;
    GameConfig.exportSceneToJson = true;
    return GameConfig;
}());
exports.default = GameConfig;
GameConfig.init();

},{"./RedDrawal":3,"./TestScene":4,"./sdk/NativeAd":10,"./uitl/ScaleButtonScript":24}],2:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var GameConfig_1 = require("./GameConfig");
var AppSdk_1 = require("./sdk/AppSdk");
var Main = /** @class */ (function () {
    function Main() {
        this.checkLoad = 0;
        //根据IDE设置初始化引擎		
        if (window["Laya3D"])
            Laya3D.init(GameConfig_1.default.width, GameConfig_1.default.height);
        else
            Laya.init(GameConfig_1.default.width, GameConfig_1.default.height, Laya["WebGL"]);
        Laya["Physics"] && Laya["Physics"].enable();
        Laya["DebugPanel"] && Laya["DebugPanel"].enable();
        Laya.stage.scaleMode = GameConfig_1.default.scaleMode;
        Laya.stage.screenMode = GameConfig_1.default.screenMode;
        Laya.stage.alignV = GameConfig_1.default.alignV;
        Laya.stage.alignH = GameConfig_1.default.alignH;
        //兼容微信不支持加载scene后缀场景
        Laya.URL.exportSceneToJson = GameConfig_1.default.exportSceneToJson;
        //打开调试面板(通过IDE设置调试模式,或者url地址增加debug=true参数,均可打开调试面板)
        if (GameConfig_1.default.debug || Laya.Utils.getQueryString("debug") == "true")
            Laya.enableDebugPanel();
        if (GameConfig_1.default.physicsDebug && Laya["PhysicsDebugDraw"])
            Laya["PhysicsDebugDraw"].enable();
        if (GameConfig_1.default.stat)
            Laya.Stat.show();
        Laya.alertGlobalError = true;
        //激活资源版本控制,version.json由IDE发布功能自动生成,如果没有也不影响后续流程
        Laya.ResourceVersion.enable("version.json", Laya.Handler.create(this, this.onVersionLoaded), Laya.ResourceVersion.FILENAME_VERSION);
    }
    Main.prototype.onVersionLoaded = function () {
        //激活大小图映射,加载小图的时候,如果发现小图在大图合集里面,则优先加载大图合集,而不是小图
        Laya.AtlasInfoManager.enable("fileconfig.json", Laya.Handler.create(this, this.onConfigLoaded));
    };
    Main.prototype.onConfigLoaded = function () {
        this.initSdk();
        this.loadData();
    };
    /**初始化SDK */
    Main.prototype.initSdk = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        if (!AppSdk_1.default.I.isMyBridge) return [3 /*break*/, 2];
                        AppSdk_1.default.init();
                        return [4 /*yield*/, AppSdk_1.default.I.initSdk()];
                    case 1:
                        _a.sent();
                        this.toggleScene();
                        return [3 /*break*/, 3];
                    case 2:
                        Laya.timer.once(100, this, this.initSdk);
                        _a.label = 3;
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    Main.prototype.loadData = function () {
        // 处理游戏加载
        //加载完成
        this.toggleScene();
    };
    Main.prototype.toggleScene = function () {
        //加载IDE指定的场景
        this.checkLoad++;
        if (this.checkLoad < 2) {
            return;
        }
        AppSdk_1.default.I.hideSplash(); //隐藏加载页 可根据需求放到其他位置
        GameConfig_1.default.startScene && Laya.Scene.open(GameConfig_1.default.startScene);
    };
    return Main;
}());
//激活启动类
new Main();

},{"./GameConfig":1,"./sdk/AppSdk":8}],3:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var RedpacketModel_1 = require("./sdk/model/RedpacketModel");
var EventCenter_1 = require("./event/EventCenter");
var EventEnum_1 = require("./event/EventEnum");
/**
 * 主界面  金币金额
 */
var RedDrawal = /** @class */ (function (_super) {
    __extends(RedDrawal, _super);
    function RedDrawal() {
        var _this = _super.call(this) || this;
        _this.totalCoin = 110;
        return _this;
    }
    RedDrawal.prototype.onStart = function () {
        this.updateStar();
        // this.tiplab.visible = false;
    };
    RedDrawal.prototype.onEnable = function () {
        EventCenter_1.EventCenter.add(EventEnum_1.EventEnum.APP_SHOW, this, this.updateStar);
        EventCenter_1.EventCenter.add(EventEnum_1.EventEnum.UPDATE_COIN, this, this.updateStar);
    };
    RedDrawal.prototype.onDisable = function () {
        EventCenter_1.EventCenter.remove(EventEnum_1.EventEnum.APP_SHOW, this, this.updateStar);
        EventCenter_1.EventCenter.remove(EventEnum_1.EventEnum.UPDATE_COIN, this, this.updateStar);
    };
    RedDrawal.prototype.updateStar = function () {
        return __awaiter(this, void 0, void 0, function () {
            var coin, str, nextDrawal, leftCoin;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, RedpacketModel_1.default.I.getTotalCoin()];
                    case 1:
                        coin = _a.sent();
                        // let coin = 1000
                        this.totalCoin = coin;
                        this.coinlab.text = '' + coin;
                        str = '可提现';
                        return [4 /*yield*/, RedpacketModel_1.default.I.minWithDrawal()];
                    case 2:
                        nextDrawal = _a.sent();
                        if (this.totalCoin > 0) {
                            leftCoin = nextDrawal - this.totalCoin;
                            if (leftCoin > 0)
                                str = "\u8FD8\u5DEE" + (leftCoin / 10000).toFixed(3) + "\u91D1\u989D\u53EF\u63D0\u73B0";
                        }
                        this.tiplab.text = str;
                        this.tiplab.visible = Boolean(nextDrawal);
                        return [2 /*return*/];
                }
            });
        });
    };
    return RedDrawal;
}(Laya.Script));
exports.default = RedDrawal;

},{"./event/EventCenter":5,"./event/EventEnum":6,"./sdk/model/RedpacketModel":14}],4:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var layaMaxUI_1 = require("./ui/layaMaxUI");
var AdManager_1 = require("./sdk/AdManager");
var RedpacketModel_1 = require("./sdk/model/RedpacketModel");
var AppSdk_1 = require("./sdk/AppSdk");
var TeaSdk_1 = require("./sdk/TeaSdk");
var EventCenter_1 = require("./event/EventCenter");
var EventEnum_1 = require("./event/EventEnum");
var TestScene = /** @class */ (function (_super) {
    __extends(TestScene, _super);
    function TestScene() {
        var _this = _super.call(this) || this;
        //关闭多点触控,否则就无敌了
        Laya.MouseManager.multiTouchEnabled = false;
        console.log('---------------TestScene-------');
        _this.NativeAD.visible = false;
        return _this;
    }
    TestScene.prototype.onEnable = function () {
        this.btnServer.on(Laya.Event.CLICK, this, this.openServer);
        this.btnDrawal.on(Laya.Event.CLICK, this, this.openPersonal);
        this.btnDraw.on(Laya.Event.CLICK, this, this.onDraw);
        this.btnInvite.on(Laya.Event.CLICK, this, this.invitation);
        this.btnVibrate.on(Laya.Event.CLICK, this, this.onVibrate);
        this.btnPreloadAD.on(Laya.Event.CLICK, this, this.preloadAD);
        this.btnShowBanner.on(Laya.Event.CLICK, this, this.showBanner);
        this.btnShowFullAd.on(Laya.Event.CLICK, this, this.showFullAd);
        this.btnShowNativeAd.on(Laya.Event.CLICK, this, this.showNativeAd);
        this.btnShowInterAd.on(Laya.Event.CLICK, this, this.showInterAd);
        this.btnRewardAd.on(Laya.Event.CLICK, this, this.showRewardAd);
        this.btnRedpacket.on(Laya.Event.CLICK, this, this.openRedpacket);
    };
    /**预加载广告 */
    TestScene.prototype.preloadAD = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        console.log('---------------preloadAD-------');
                        return [4 /*yield*/, AdManager_1.default.I.init()];
                    case 1:
                        _a.sent();
                        return [2 /*return*/];
                }
            });
        });
    };
    /**显示全屏广告 */
    TestScene.prototype.showFullAd = function () {
        console.log('---------------showFullAd-------');
        AdManager_1.default.I.showFullAd();
        // var ret = MyBridge.mapToString({
        //     data: {
        //         "count": 2, "title": [{ "name": "nnn", "value": "nnnvalue", "default_show": 1 }
        //             , { "name": "mmm", "value": "mmmvalue\"aasdasd" }]
        //     }
        // });
        // console.log("-------web--------onClick----->>cocos JS-------MyBridge.mapToString------" + JSON.stringify(ret));
    };
    /**显示banner */
    TestScene.prototype.showBanner = function () {
        console.log('---------------showBanner-------');
        AdManager_1.default.I.showBanner();
    };
    /**信息流广告 */
    TestScene.prototype.showNativeAd = function () {
        console.log('---------------showNativeAd-------');
        this.NativeAD.visible = true;
    };
    /**插屏广告 */
    TestScene.prototype.showInterAd = function () {
        console.log('---------------showInterAd-------');
        AdManager_1.default.I.showInterAd();
    };
    /**激励视频广告 */
    TestScene.prototype.showRewardAd = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        console.log('---------------showRewardAd-------');
                        return [4 /*yield*/, AdManager_1.default.I.showRewardAd('videoType')];
                    case 1:
                        _a.sent();
                        return [2 /*return*/];
                }
            });
        });
    };
    /**意见反馈 */
    TestScene.prototype.openServer = function () {
        console.log('---------------openServer-------');
        AppSdk_1.default.I.feedback();
    };
    TestScene.prototype.openRedpacket = function () {
        return __awaiter(this, void 0, void 0, function () {
            var bol;
            var _this = this;
            return __generator(this, function (_a) {
                bol = RedpacketModel_1.default.I.checkRedpacket();
                console.log(bol + '红包获取结果:curRedpacket' + RedpacketModel_1.default.I.curRedpacket);
                if (bol) {
                    //**弹出红包的界面,  暂时处理成 直接看广告获取金币 */
                    AdManager_1.default.I.showRewardAd(TeaSdk_1.DotKey.reward_ad).then(function (res) { return __awaiter(_this, void 0, void 0, function () {
                        var coin;
                        return __generator(this, function (_a) {
                            switch (_a.label) {
                                case 0:
                                    console.log("加金币");
                                    return [4 /*yield*/, RedpacketModel_1.default.I.addCoin()];
                                case 1:
                                    coin = _a.sent();
                                    console.log("获取了钱", coin);
                                    RedpacketModel_1.default.I.getRepacket(); //计数
                                    /**更新基本显示 */
                                    EventCenter_1.EventCenter.emit(EventEnum_1.EventEnum.UPDATE_COIN);
                                    return [2 /*return*/];
                            }
                        });
                    }); }).catch(function (err) {
                        console.log("onVideo error");
                    });
                }
                return [2 /*return*/];
            });
        });
    };
    /**打开个人中心 */
    TestScene.prototype.openPersonal = function () {
        console.log('---------------openServer-------');
        AppSdk_1.default.I.personal();
    };
    /**邀请好友 */
    TestScene.prototype.invitation = function () {
        AppSdk_1.default.I.invitation();
    };
    //震动
    TestScene.prototype.onVibrate = function () {
        AppSdk_1.default.I.vibrate(0);
    };
    TestScene.prototype.getProps = function (data) {
        var booster;
        var rewardNum = data.num;
        var type = data.type;
        /**
         * 处理游戏中的道具显示
         */
        // switch (type) {
        //     case 4:
        //         booster = BoosterType.Remove;
        //         break;
        //     case 6:
        //         booster = BoosterType.Change;
        //         break;
        //     case 5:
        //         booster = BoosterType.Refresh;
        //         break;
        //     case 7:
        //         booster = BoosterType.RandRemove;
        //         break;
        //     case 3:
        //         booster = BoosterType.Star;
        //         break;
        // }
        // ViewManager.I.openPopwin(ReceivePropsPopwin, booster, rewardNum);
    };
    /**
     * 看广告获得红包
     */
    TestScene.prototype.watchADCoin = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, AdManager_1.default.I.showRewardAd('videoType')];
                    case 1:
                        _a.sent();
                        this.getCoin();
                        return [2 /*return*/];
                }
            });
        });
    };
    /**直接获得红包 */
    TestScene.prototype.getCoin = function () {
        //刷新总金币
        // AppManager.I.redpacket.getRepacket()
        // ViewManager.I.openPopwin(RedPacketReward, 2);
    };
    TestScene.prototype.onDraw = function () {
        AppSdk_1.default.I.openReward();
    };
    return TestScene;
}(layaMaxUI_1.ui.TestSceneUI));
exports.default = TestScene;

},{"./event/EventCenter":5,"./event/EventEnum":6,"./sdk/AdManager":7,"./sdk/AppSdk":8,"./sdk/TeaSdk":12,"./sdk/model/RedpacketModel":14,"./ui/layaMaxUI":19}],5:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/*
* name;
*/
var EventCenter = /** @class */ (function () {
    function EventCenter() {
    }
    Object.defineProperty(EventCenter, "I", {
        get: function () {
            window['ev'] = this._instance;
            return this._instance || (this._instance = new Laya.EventDispatcher);
        },
        enumerable: true,
        configurable: true
    });
    EventCenter.emit = function (event) {
        var args = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            args[_i - 1] = arguments[_i];
        }
        this.I.event(event.toString(), args);
    };
    EventCenter.add = function (type, caller, listener, args) {
        this.I.on(type.toString(), caller, listener, args);
    };
    EventCenter.remove = function (type, caller, listener) {
        this.I.off(type.toString(), caller, listener);
    };
    return EventCenter;
}());
exports.EventCenter = EventCenter;

},{}],6:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var EventEnum;
(function (EventEnum) {
    EventEnum[EventEnum["CHECK_REDPACKET"] = 'check_redpacket'] = "CHECK_REDPACKET";
    EventEnum[EventEnum["APP_SHOW"] = 'app.show'] = "APP_SHOW";
    EventEnum[EventEnum["APP_HIDE"] = 'app.hide'] = "APP_HIDE";
    EventEnum[EventEnum["UPDATE_COIN"] = 'update.coin'] = "UPDATE_COIN";
})(EventEnum = exports.EventEnum || (exports.EventEnum = {}));

},{}],7:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var TTAdSdk_1 = require("./TTAdSdk");
var TeaSdk_1 = require("./TeaSdk");
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var AdManager = /** @class */ (function () {
    function AdManager() {
    }
    AdManager.prototype.init = function () {
        this.preloadRewardAd();
        this.preloadBanner();
        this.preloadFullAd();
    };
    AdManager.prototype.preloadBanner = function () {
        TTAdSdk_1.default.I.loadBannerExpressAd(1);
    };
    AdManager.prototype.preloadRewardAd = function () {
        TTAdSdk_1.default.I.showRewardVideoAd(1);
    };
    AdManager.prototype.preloadFullAd = function () {
        TTAdSdk_1.default.I.loadFullScreenVideoAd(1);
    };
    AdManager.prototype.preloadNativeAdYLH = function () {
        TTAdSdk_1.default.I.loadNativeAdYLH(1, 1, 600, 300, 1);
    };
    AdManager.prototype.preloadInterAd = function () {
        TTAdSdk_1.default.I.showInteractionExpressAd(1);
    };
    AdManager.prototype.preloadNativeAd = function () {
        TTAdSdk_1.default.I.loadFullScreenVideoAd(1);
    };
    AdManager.prototype.closeAdverDialog = function () {
        if (!Laya.Browser.onAndroid) {
            return;
        }
        TTAdSdk_1.default.I.closeAdverDialog();
    };
    AdManager.prototype.closeAdBanner = function () {
        TTAdSdk_1.default.I.closeAdBanner();
    };
    AdManager.prototype.showRewardAd = function (point) {
        return __awaiter(this, void 0, void 0, function () {
            var ret, e_1;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, TTAdSdk_1.default.I.showRewardVideoAd(0, point)];
                    case 1:
                        ret = _a.sent();
                        // this.lastVideoTime = Laya.timer.currTimer;
                        // this.preloadRewardAd();
                        return [2 /*return*/, Promise.resolve(ret)];
                    case 2:
                        e_1 = _a.sent();
                        this.preloadRewardAd();
                        return [2 /*return*/, Promise.reject(e_1)];
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    AdManager.prototype.showFullAd = function () {
        return __awaiter(this, void 0, void 0, function () {
            var ret, e_2;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, TTAdSdk_1.default.I.loadFullScreenVideoAd()];
                    case 1:
                        ret = _a.sent();
                        TeaSdk_1.default.I.dot(TeaSdk_1.DotKey.fullScreen, { from: 'show' });
                        this.preloadFullAd();
                        return [2 /*return*/, Promise.resolve(ret)];
                    case 2:
                        e_2 = _a.sent();
                        this.preloadFullAd();
                        return [2 /*return*/, Promise.reject(e_2)];
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    AdManager.prototype.showInterAd = function () {
        return __awaiter(this, void 0, void 0, function () {
            var ret, e_3;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        _a.trys.push([0, 2, , 3]);
                        return [4 /*yield*/, TTAdSdk_1.default.I.showInteractionExpressAd()];
                    case 1:
                        ret = _a.sent();
                        this.preloadInterAd();
                        return [2 /*return*/, Promise.resolve(ret)];
                    case 2:
                        e_3 = _a.sent();
                        this.preloadInterAd();
                        return [2 /*return*/, Promise.reject(e_3)];
                    case 3: return [2 /*return*/];
                }
            });
        });
    };
    AdManager.prototype.checkVideoInCd = function () {
        return this.lastVideoTime && (Laya.timer.currTimer - this.lastVideoTime <= 30000);
    };
    AdManager.prototype.showBanner = function () {
        TTAdSdk_1.default.I.loadBannerExpressAd();
    };
    AdManager.prototype.showNativeAd = function (x, y, w, h, preload) {
        if (preload === void 0) { preload = 0; }
        TTAdSdk_1.default.I.loadNativeExpressAd(x, y, w, h, preload);
    };
    // 优量汇信息流广告
    AdManager.prototype.showNativeAdYLH = function (x, y, w, h, preload) {
        if (preload === void 0) { preload = 0; }
        return TTAdSdk_1.default.I.loadNativeAdYLH(x, y, w, h, preload);
    };
    AdManager.prototype.openLoadNativeAdEvent = function () {
        TTAdSdk_1.default.I.openLoadNativeAdEvent();
    };
    Object.defineProperty(AdManager, "I", {
        get: function () {
            return ObjectInstance_1.default.get(AdManager);
        },
        enumerable: true,
        configurable: true
    });
    return AdManager;
}());
exports.default = AdManager;

},{"../uitl/ObjectInstance":22,"./TTAdSdk":11,"./TeaSdk":12}],8:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var AdManager_1 = require("./AdManager");
var RedpacketModel_1 = require("./model/RedpacketModel");
var LuckDrawModel_1 = require("./LuckDrawModel");
var AppSdkData_1 = require("./sdkData/AppSdkData");
var LuckDrawData_1 = require("./sdkData/LuckDrawData");
var AppSdk = /** @class */ (function () {
    function AppSdk() {
    }
    AppSdk.init = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        AppSdk.I.getSystemInfo();
                        AppSdk.I.initGameConfig();
                        AdManager_1.default.I.init(); //预加载广告 
                        return [4 /*yield*/, ObjectInstance_1.default.get(RedpacketModel_1.default).init()];
                    case 1:
                        _a.sent();
                        LuckDrawModel_1.default.I.init();
                        return [2 /*return*/];
                }
            });
        });
    };
    AppSdk.prototype.initSdk = function () {
        var _this = this;
        return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, this.getUserInfo()];
                    case 1:
                        _a.sent();
                        resolve(1);
                        return [2 /*return*/];
                }
            });
        }); });
    };
    Object.defineProperty(AppSdk.prototype, "myBridge", {
        get: function () {
            if (typeof MyBridge !== 'undefined') {
                return MyBridge;
            }
            else {
                console.error(' no register myBridge!!!');
            }
        },
        enumerable: true,
        configurable: true
    });
    /**获取基本版本信息以及手机的配置 */
    AppSdk.prototype.getSystemInfo = function (key) {
        if (key === void 0) { key = 0; }
        var _a;
        var ret = this.myBridge.getSystemInfo(key);
        var _b = JSON.parse(ret), w = _b.w, h = _b.h, versionName = _b.versionName, channel = _b.channel, pangolin = _b.pangolin, adnet = _b.adnet, level = _b.level;
        _a = [w, h, versionName, channel, pangolin, adnet, level], this._width = _a[0], this._height = _a[1], this._version = _a[2], this._channel = _a[3], this.pangolinId = _a[4], this.adnetId = _a[5], this._level = _a[6];
    };
    AppSdk.prototype.getUserInfo = function () {
        var _this = this;
        return new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                console.log("-------------getUserInfo回调 前---------------");
                this.myBridge.getGameUserInfo(function (ret) {
                    console.log("-------------getUserInfo回调---------------", ret);
                    var res = JSON.parse(ret);
                    AppSdkData_1.AppSdkData.I.initData(res);
                    resolve(1);
                });
                return [2 /*return*/];
            });
        }); });
    };
    AppSdk.prototype.initGameConfig = function () {
        this._gameConfig = this.getGameConfig();
    };
    /**
     * 震动
     * @param key 0 短震动 1 长震动
     */
    AppSdk.prototype.vibrate = function (key) {
        if (key === void 0) { key = 0; }
        this.myBridge.openSystemFun(key);
    };
    /**隐藏启动屏 */
    AppSdk.prototype.hideSplash = function () {
        this.myBridge.hideSplash();
    };
    /**弹出提现 */
    AppSdk.prototype.withDrawal = function () {
        this.myBridge.withDrawal();
    };
    /**意见反馈 */
    AppSdk.prototype.feedback = function () {
        this.myBridge.feedback();
    };
    /**
     * key 默认0 ,签到 1
     */
    AppSdk.prototype.personal = function () {
        this.myBridge.personal();
    };
    /**邀请好友*/
    AppSdk.prototype.invitation = function () {
        this.myBridge.invitation();
    };
    /**邀请好友*/
    AppSdk.prototype.openReward = function () {
        this.myBridge.openReward();
    };
    /**签到*/
    AppSdk.prototype.openSignin = function () {
        this.myBridge.openSingin();
    };
    AppSdk.prototype.putData = function (key, value) {
        this.myBridge.putData(key, value);
    };
    /**
     * @param key  存数据的时候的唯一key
     * @return  存储的数据
     * */
    AppSdk.prototype.getData = function (key) {
        var ret = this.myBridge.getData(key);
        return JSON.parse(ret);
    };
    /**
     * 获取游戏配置
     */
    AppSdk.prototype.getGameConfig = function () {
        var result = this.myBridge.getGameConfig();
        console.log("获取游戏配置", JSON.stringify(result));
        LuckDrawData_1.LuckDrawData.I.initData(JSON.parse(result)['draw']); //转盘数据配置
        return JSON.parse(result);
    };
    /**
     * 要求发放金币
     * @param key 1红包
     */
    AppSdk.prototype.addGold = function (key) {
        if (key === void 0) { key = 1; }
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
                        return __generator(this, function (_a) {
                            switch (_a.label) {
                                case 0: return [4 /*yield*/, this.myBridge.addGold(key, function (res) {
                                        console.log("要求发放金币", JSON.stringify(res));
                                        res = JSON.parse(res);
                                        var code = res.code, data = res.data, msg = res.msg;
                                        if ('0' === code || !code) {
                                            resolve(data);
                                        }
                                        else {
                                            reject(msg);
                                        }
                                    })];
                                case 1:
                                    _a.sent();
                                    return [2 /*return*/];
                            }
                        });
                    }); })];
            });
        });
    };
    /**
     * 要求发放金币 可翻倍类型
     */
    AppSdk.prototype.rewardInfo = function () {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
                        return __generator(this, function (_a) {
                            this.myBridge.rewardInfo(function (res) {
                                res = JSON.parse(res);
                                var code = res.code, data = res.data, msg = res.msg;
                                if ('0' === code || !code) {
                                    resolve(data.coin);
                                }
                                else {
                                    reject(msg);
                                }
                            });
                            return [2 /*return*/];
                        });
                    }); })];
            });
        });
    };
    /**
     * 获取双倍金币
     * @param type 1原金币 2双倍金币
     */
    AppSdk.prototype.twofoldReward = function (type) {
        if (type === void 0) { type = 1; }
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
                        return __generator(this, function (_a) {
                            this.myBridge.twofoldReward(type, function (res) {
                                res = JSON.parse(res);
                                var code = res.code, data = res.data, msg = res.msg;
                                if ('0' === code || !code) {
                                    resolve(data.coin);
                                }
                                else {
                                    reject(msg);
                                }
                            });
                            return [2 /*return*/];
                        });
                    }); })];
            });
        });
    };
    /**获取总金币 */
    AppSdk.prototype.myCoin = function () {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
                        return __generator(this, function (_a) {
                            switch (_a.label) {
                                case 0: return [4 /*yield*/, this.myBridge.myCoin(function (res) {
                                        res = JSON.parse(res);
                                        var code = res.code, data = res.data, msg = res.msg;
                                        if ('0' === code || !code) {
                                            resolve(data['coin']);
                                        }
                                        else {
                                            reject(msg);
                                        }
                                    })];
                                case 1:
                                    _a.sent();
                                    return [2 /*return*/];
                            }
                        });
                    }); })];
            });
        });
    };
    /**获取当前提现的档位 */
    AppSdk.prototype.minWithDrawal = function () {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
                        return __generator(this, function (_a) {
                            switch (_a.label) {
                                case 0: return [4 /*yield*/, this.myBridge.minWithDrawal(function (res) {
                                        res = JSON.parse(res);
                                        var code = res.code, data = res.data, msg = res.msg;
                                        if ('0' === code || !code) {
                                            resolve(data['money']);
                                        }
                                        else {
                                            reject(msg);
                                        }
                                    })];
                                case 1:
                                    _a.sent();
                                    return [2 /*return*/];
                            }
                        });
                    }); })];
            });
        });
    };
    /**上报埋点 */
    AppSdk.prototype.appDotLog = function (key, value) {
        this.myBridge.appDotLog(key, value);
    };
    /**热云打点 */
    AppSdk.prototype.appDotTracKing = function (key) {
        this.myBridge.appDotTracKing(key);
    };
    AppSdk.prototype.setCallback = function (funName, pramas) {
        var _this = this;
        console.log('---------------setCallback---- this.myBridge---' + JSON.stringify(this.myBridge));
        return new Promise(function (resolve, reject) {
            _this.myBridge[funName](pramas, function (res) {
                var _a = JSON.parse(res), code = _a.code, data = _a.data;
                if ('0' === code) {
                    resolve(data);
                }
                else {
                    reject(0);
                }
            });
        });
    };
    AppSdk.prototype.closeAdverDialog = function () {
        this.myBridge.closeAdverDialog();
    };
    AppSdk.prototype.closeAdBanner = function () {
        this.myBridge.closeAdBanner();
    };
    /**激励视频 */
    AppSdk.prototype.showRewardVideoAd = function (value, JBCallback) {
        this.myBridge.showRewardVideoAd(value, JBCallback);
    };
    /** 全屏广告*/
    AppSdk.prototype.loadFullScreenVideoAd = function (data, JBCallback) {
        this.myBridge.loadFullScreenVideoAd(data, JBCallback);
    };
    /**信息流广告 */
    AppSdk.prototype.loadNativeExpressAd = function (data, JBCallback) {
        this.myBridge.loadNativeExpressAd(data, JBCallback);
    };
    /**信息流广告- 优量汇 */
    AppSdk.prototype.loadNativeAdYLH = function (data, JBCallback) {
        this.myBridge.loadNativeAd(data, JBCallback);
    };
    // 打开信息流-优量汇
    AppSdk.prototype.openLoadNativeAdEvent = function () {
        this.myBridge.openLoadNativeAdEvent();
    };
    /**banner */
    AppSdk.prototype.loadBannerExpressAd = function (data, JBCallback) {
        this.myBridge.loadBannerExpressAd(data, JBCallback);
    };
    /**插屏广告 */
    AppSdk.prototype.showInteractionExpressAd = function (data, JBCallback) {
        this.myBridge.showInteractionExpressAd(data, JBCallback);
    };
    Object.defineProperty(AppSdk.prototype, "level", {
        get: function () {
            return this._level;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(AppSdk.prototype, "width", {
        get: function () {
            return this._width;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(AppSdk.prototype, "height", {
        get: function () {
            return this._height;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(AppSdk.prototype, "version", {
        get: function () {
            return this._version;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(AppSdk.prototype, "channel", {
        get: function () {
            return this._channel;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(AppSdk.prototype, "bridge", {
        get: function () {
            return null;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(AppSdk.prototype, "gameConfig", {
        get: function () {
            return this._gameConfig;
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(AppSdk, "I", {
        get: function () {
            return ObjectInstance_1.default.get(AppSdk);
        },
        enumerable: true,
        configurable: true
    });
    return AppSdk;
}());
exports.default = AppSdk;
//     //这里是浏览器环境下, 接收web传过来的消息
window.onMyBridgeReady = function () {
    AppSdk.I.isMyBridge = true;
    console.log("onMyBridgeReady load finish, cost:" + (new Date().getTime()) + "ms");
    MyBridge.App.onResume = function () {
        var ret = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            ret[_i] = arguments[_i];
        }
        console.log('     laya onResume', ret);
    };
    MyBridge.App.onPause = function () {
        var ret = [];
        for (var _i = 0; _i < arguments.length; _i++) {
            ret[_i] = arguments[_i];
        }
        console.log('    laya onPause', ret);
    };
};

},{"../uitl/ObjectInstance":22,"./AdManager":7,"./LuckDrawModel":9,"./model/RedpacketModel":14,"./sdkData/AppSdkData":16,"./sdkData/LuckDrawData":18}],9:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AppSdk_1 = require("./AppSdk");
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var DateUtils_1 = require("../uitl/DateUtils");
/**转盘 获取转盘机会的 */
var LuckDrawModel = /** @class */ (function () {
    function LuckDrawModel() {
        this.propRemove = 0;
        this.propChange = 0;
    }
    LuckDrawModel.prototype.init = function () {
        return __awaiter(this, void 0, void 0, function () {
            var _a;
            return __generator(this, function (_b) {
                switch (_b.label) {
                    case 0:
                        _a = this;
                        return [4 /*yield*/, this.initData()];
                    case 1:
                        _a._data = _b.sent();
                        AppSdk_1.default.I.putData('luckDrawProp', JSON.stringify({ remove: 0, change: 0 }));
                        AppSdk_1.default.I.putData('LuckDrawToSign', JSON.stringify({ istoSignin: 0 }));
                        return [2 /*return*/];
                }
            });
        });
    };
    LuckDrawModel.prototype.initData = function () {
        return __awaiter(this, void 0, void 0, function () {
            var data, lastTime, last, today, list, index, item, luckDrawData;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        data = new LuckDrawData;
                        lastTime = Laya.LocalStorage.getItem('LuckDrawLastTime') || '0';
                        data.luckDrawLastTime = parseInt(lastTime);
                        last = DateUtils_1.default.timeDay(data.luckDrawLastTime);
                        today = DateUtils_1.default.today;
                        if (!(last != today)) return [3 /*break*/, 1];
                        lastTime = DateUtils_1.default.nowTime.toString();
                        Laya.LocalStorage.setItem('LuckDrawLastTime', lastTime);
                        data.luckDrawLastTime = parseInt(lastTime);
                        /**初始化数据
                         * 1 签到
                         * 2 视频
                         * 3 摇一摇
                         * 4 红包
                         */
                        data.list = [];
                        list = [];
                        for (index = 0; index < 4; index++) {
                            item = new LuckDrawVo;
                            item.type = index + 1;
                            item.num = 0;
                            item.isUse = 0;
                            item.useNum = 0;
                            list.push(item);
                        }
                        data.list = list;
                        return [3 /*break*/, 3];
                    case 1: return [4 /*yield*/, AppSdk_1.default.I.getData('LuckDrawData')];
                    case 2:
                        luckDrawData = _a.sent();
                        if (luckDrawData)
                            data.list = luckDrawData.list;
                        _a.label = 3;
                    case 3:
                        AppSdk_1.default.I.putData('LuckDrawData', JSON.stringify(data));
                        this._data = data;
                        return [2 /*return*/, data];
                }
            });
        });
    };
    Object.defineProperty(LuckDrawModel.prototype, "data", {
        get: function () {
            return this._data;
        },
        enumerable: true,
        configurable: true
    });
    LuckDrawModel.prototype.updateData = function (index, addNum) {
        if (addNum === void 0) { addNum = 1; }
        if (this.data) {
            this.data.list[index].num += addNum;
            AppSdk_1.default.I.putData('LuckDrawData', JSON.stringify(this.data));
        }
    };
    LuckDrawModel.prototype.getPropData = function () {
        return __awaiter(this, void 0, void 0, function () {
            var luckDrawProp;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, AppSdk_1.default.I.getData('luckDrawProp')];
                    case 1:
                        luckDrawProp = _a.sent();
                        console.log('    -------yyyyy laya luckDrawProp ' + JSON.stringify(luckDrawProp));
                        this.propRemove = Number(luckDrawProp.remove);
                        this.propChange = Number(luckDrawProp.change);
                        if (this.propRemove > 0) {
                            this.updateRemoveProp();
                        }
                        else {
                            this.updateChangeProp();
                        }
                        return [2 /*return*/, luckDrawProp];
                }
            });
        });
    };
    LuckDrawModel.prototype.updateRemoveProp = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                if (this.propRemove > 0) {
                    /* 处理获得第1个道具*/
                    this.propRemove = 0;
                    AppSdk_1.default.I.putData('luckDrawProp', JSON.stringify({ remove: 0, change: this.propChange }));
                }
                return [2 /*return*/];
            });
        });
    };
    LuckDrawModel.prototype.updateChangeProp = function () {
        if (this.propChange > 0) {
            /* 处理获得第2个道具*/
            this.propChange = 0;
            AppSdk_1.default.I.putData('luckDrawProp', JSON.stringify({ remove: this.propRemove, change: 0 }));
        }
    };
    Object.defineProperty(LuckDrawModel, "I", {
        get: function () {
            return ObjectInstance_1.default.get(LuckDrawModel);
        },
        enumerable: true,
        configurable: true
    });
    return LuckDrawModel;
}());
exports.default = LuckDrawModel;
var LuckDrawData = /** @class */ (function () {
    function LuckDrawData() {
    }
    return LuckDrawData;
}());
var LuckDrawVo = /** @class */ (function () {
    function LuckDrawVo() {
    }
    return LuckDrawVo;
}());

},{"../uitl/DateUtils":21,"../uitl/ObjectInstance":22,"./AppSdk":8}],10:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AdManager_1 = require("./AdManager");
var NativeAd = /** @class */ (function (_super) {
    __extends(NativeAd, _super);
    function NativeAd() {
        return _super !== null && _super.apply(this, arguments) || this;
    }
    NativeAd.prototype.onEnable = function () {
        var globalPoint = this.item.localToGlobal(Laya.Point.EMPTY, true);
        AdManager_1.default.I.showNativeAd(globalPoint.x, globalPoint.y, this.item.width, this.item.height);
    };
    NativeAd.prototype.onDisable = function () {
        AdManager_1.default.I.closeAdverDialog();
    };
    Object.defineProperty(NativeAd.prototype, "item", {
        get: function () {
            return this.owner;
        },
        enumerable: true,
        configurable: true
    });
    return NativeAd;
}(Laya.Script));
exports.default = NativeAd;

},{"./AdManager":7}],11:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AppSdk_1 = require("./AppSdk");
var TeaSdk_1 = require("./TeaSdk");
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var TTAdSdk = /** @class */ (function () {
    function TTAdSdk() {
    }
    /**
     *
     * @param preload  0 直接加载;1 预加载
     */
    TTAdSdk.prototype.showRewardVideoAd = function (preload, point) {
        if (preload === void 0) { preload = 0; }
        if (point === void 0) { point = TeaSdk_1.DotKey.proloading; }
        return __awaiter(this, void 0, void 0, function () {
            var data;
            return __generator(this, function (_a) {
                data = {
                    type: 1,
                    preloading: preload,
                };
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var isComplete = false;
                        AppSdk_1.default.I.showRewardVideoAd(data, function (ret) {
                            console.log("视频回调", JSON.stringify(ret));
                            var _a = JSON.parse(ret), code = _a.code, msg = _a.msg;
                            switch (code) {
                                case -1:
                                    reject('error');
                                    /**'暂无视频广告!每日0点重置'*/ ;
                                    break;
                                case 0:
                                    break;
                                case 100:
                                    break;
                                case 102:
                                    isComplete = true;
                                    break;
                                case 101:
                                    console.log("视频点了关闭");
                                    if (isComplete) {
                                        console.log("视频观看完闭并点了关闭");
                                        // TeaSdk.I.dot(DotKey.reward_ad, { from: point });
                                        resolve(1);
                                    }
                                    else {
                                        reject('unComplete');
                                    }
                                    break;
                                default:
                                    reject('加载失败');
                                    // TeaSdk.I.dot(DotKey.reward_ad_fail, { from: point, code: code });
                                    break;
                            }
                        });
                    })];
            });
        });
    };
    TTAdSdk.prototype.loadFullScreenVideoAd = function (preload) {
        if (preload === void 0) { preload = 0; }
        return __awaiter(this, void 0, void 0, function () {
            var data;
            return __generator(this, function (_a) {
                data = {
                    w: AppSdk_1.default.I.width,
                    h: AppSdk_1.default.I.width * 90 / 600,
                    preloading: preload,
                    type: 1
                };
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        AppSdk_1.default.I.loadFullScreenVideoAd(JSON.stringify(data), function (res) {
                            resolve(res);
                        });
                    })];
            });
        });
    };
    TTAdSdk.prototype.loadNativeExpressAd = function (x, y, width, height, preload) {
        if (preload === void 0) { preload = 0; }
        return __awaiter(this, void 0, void 0, function () {
            var scaleX, scaleY, data;
            return __generator(this, function (_a) {
                scaleX = AppSdk_1.default.I.width / Laya.stage.width;
                scaleY = AppSdk_1.default.I.height / Laya.stage.height;
                data = {
                    type: 1,
                    preloading: preload,
                    w: width * scaleX,
                    h: height * scaleY,
                    left: x * scaleX,
                    top: y * scaleY
                };
                AppSdk_1.default.I.loadNativeExpressAd(JSON.stringify(data), function (res) {
                    return Promise.resolve(res);
                });
                return [2 /*return*/];
            });
        });
    };
    TTAdSdk.prototype.loadNativeAdYLH = function (x, y, width, height, preload) {
        if (preload === void 0) { preload = 0; }
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var scaleX = AppSdk_1.default.I.width / Laya.stage.width;
                        var scaleY = AppSdk_1.default.I.height / Laya.stage.height;
                        var data = {
                            type: 1,
                            preloading: preload,
                            w: width * scaleX,
                            h: height * scaleY,
                            left: x * scaleX,
                            bottom: AppSdk_1.default.I.height - height * scaleY - y * scaleY,
                        };
                        // console.log(JSON.stringify(data))
                        // console.log(AppSdk.I.height, height, y, scaleY)
                        AppSdk_1.default.I.loadNativeAdYLH(JSON.stringify(data), function (res) {
                            resolve(JSON.parse(res));
                        });
                    })];
            });
        });
    };
    TTAdSdk.prototype.openLoadNativeAdEvent = function () {
        AppSdk_1.default.I.openLoadNativeAdEvent();
    };
    TTAdSdk.prototype.loadBannerExpressAd = function (preload) {
        if (preload === void 0) { preload = 0; }
        return __awaiter(this, void 0, void 0, function () {
            var data;
            return __generator(this, function (_a) {
                data = {
                    w: AppSdk_1.default.I.width,
                    h: AppSdk_1.default.I.width * 90 / 600,
                    preloading: preload,
                    type: 1
                };
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        AppSdk_1.default.I.loadBannerExpressAd(JSON.stringify(data), function (res) {
                            resolve(res);
                        });
                    })];
            });
        });
    };
    TTAdSdk.prototype.closeAdverDialog = function () {
        AppSdk_1.default.I.closeAdverDialog();
    };
    TTAdSdk.prototype.closeAdBanner = function () {
        AppSdk_1.default.I.closeAdBanner();
    };
    TTAdSdk.prototype.showInteractionExpressAd = function (preload) {
        if (preload === void 0) { preload = 0; }
        return __awaiter(this, void 0, void 0, function () {
            var data;
            return __generator(this, function (_a) {
                data = {
                    w: AppSdk_1.default.I.width * 0.8,
                    h: AppSdk_1.default.I.height,
                    preloading: preload,
                };
                return [2 /*return*/, new Promise(function (resolve, reject) {
                        var isComplete = false;
                        AppSdk_1.default.I.showInteractionExpressAd(JSON.stringify(data), function (res) {
                            resolve(res);
                        });
                    })];
            });
        });
    };
    Object.defineProperty(TTAdSdk, "I", {
        get: function () {
            return ObjectInstance_1.default.get(TTAdSdk);
        },
        enumerable: true,
        configurable: true
    });
    return TTAdSdk;
}());
exports.default = TTAdSdk;

},{"../uitl/ObjectInstance":22,"./AppSdk":8,"./TeaSdk":12}],12:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectInstance_1 = require("../uitl/ObjectInstance");
var AppSdk_1 = require("./AppSdk");
/**
 * 上报埋点⽇志
 * 具体的打点需要跟运营联系
 */
var TeaSdk = /** @class */ (function () {
    function TeaSdk() {
    }
    TeaSdk.prototype.dot = function (key, value) {
        if (!Laya.Browser.onAndroid) {
            return;
        }
        if (!value) {
            value = '';
        }
        else if (typeof (value) == 'object') {
            value = JSON.stringify(value);
        }
        AppSdk_1.default.I.appDotLog(key, value);
    };
    Object.defineProperty(TeaSdk, "I", {
        get: function () {
            return ObjectInstance_1.default.get(TeaSdk);
        },
        enumerable: true,
        configurable: true
    });
    return TeaSdk;
}());
exports.default = TeaSdk;
var DotKey;
(function (DotKey) {
    DotKey["proloading"] = "proloading";
    DotKey["reward_ad"] = "reward_ad";
    DotKey["reward_ad_fail"] = "ad_fail";
    DotKey["fullScreen"] = "fullScreen";
})(DotKey = exports.DotKey || (exports.DotKey = {}));

},{"../uitl/ObjectInstance":22,"./AppSdk":8}],13:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ArrayUtils_1 = require("../../uitl/ArrayUtils");
/*
* name;
*/
var BaseModel = /** @class */ (function () {
    function BaseModel() {
        this._data = {};
        this.updateArr = [];
        this.keyUpdateArr = {};
    }
    BaseModel.prototype.update = function (data) {
        return __awaiter(this, void 0, void 0, function () {
            var _loop_1, this_1, key;
            var _this = this;
            return __generator(this, function (_a) {
                this._data = __assign({}, this._data, data);
                this.updateArr.forEach(function (func) {
                    func(_this._data);
                });
                _loop_1 = function (key) {
                    var value = data[key];
                    if (value != null) {
                        var arr = this_1.keyUpdateArr[key];
                        arr && arr.forEach(function (func) {
                            func(value);
                        });
                    }
                };
                this_1 = this;
                for (key in this.keyUpdateArr) {
                    _loop_1(key);
                }
                return [2 /*return*/];
            });
        });
    };
    BaseModel.prototype.waitFor = function (key) {
        var _this = this;
        return new Promise(function (resolve) {
            var value;
            value = _this._data[key];
            if (value) {
                resolve(value);
                return;
            }
            var cb = function (data) {
                if (data) {
                    resolve(data);
                    _this.offUpdate(cb, key);
                }
            };
            _this.onUpdate(cb, key, true);
        });
    };
    BaseModel.prototype.onUpdate = function (func, key, run) {
        if (run === void 0) { run = true; }
        if (key) {
            var value = this._data[key];
            run && value != null && func(value);
            var arr = this.keyUpdateArr[key];
            !arr && (this.keyUpdateArr[key] = arr = []);
            arr.push(func);
        }
        else {
            run && func(this._data);
            this.updateArr.push(func);
        }
    };
    BaseModel.prototype.offUpdate = function (func, key) {
        if (key) {
            ArrayUtils_1.default.removeFromArr(this.keyUpdateArr[key], func);
        }
        else {
            ArrayUtils_1.default.removeFromArr(this.updateArr, func);
        }
    };
    BaseModel.prototype.clearGame = function () {
        this._data = {};
    };
    return BaseModel;
}());
exports.default = BaseModel;

},{"../../uitl/ArrayUtils":20}],14:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var BaseModel_1 = require("./BaseModel");
var AdManager_1 = require("../../sdk/AdManager");
var GoldConfigData_1 = require("../../sdk/sdkData/GoldConfigData");
var AddGoldData_1 = require("../../sdk/sdkData/AddGoldData");
var DateUtils_1 = require("../../uitl/DateUtils");
var Util_1 = require("../../uitl/Util");
var ObjectInstance_1 = require("../../uitl/ObjectInstance");
var AppSdk_1 = require("../AppSdk");
var RedpacketModel = /** @class */ (function (_super) {
    __extends(RedpacketModel, _super);
    function RedpacketModel() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this.MAX = 20;
        /**当天领取红包的最大次数 */
        _this.DAY_MAX_CNT = 50;
        _this.curRedpacket = 0;
        _this.confLen = 0;
        return _this;
    }
    /**初始化红包配置 */
    RedpacketModel.prototype.init = function () {
        return __awaiter(this, void 0, void 0, function () {
            var arr, cash;
            var _this = this;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, GoldConfigData_1.GoldConfigData.I.getGoldConfig()];
                    case 1:
                        arr = _a.sent();
                        cash = 0;
                        this.conf = {};
                        arr.forEach(function (confData) {
                            _this.conf[confData.id] = confData;
                        });
                        this.update(this.initData());
                        this.confLen = this.conf.length;
                        return [2 /*return*/];
                }
            });
        });
    };
    RedpacketModel.prototype.initData = function () {
        var data = new RedpacketData;
        var lastTime = Util_1.default.I.getItem(Util_1.DataKey.lastTime) || '0';
        data.lastTime = parseInt(lastTime);
        var last = DateUtils_1.default.timeDay(data.lastTime);
        var today = DateUtils_1.default.today;
        if (last != today) {
            data.todayCnt = 0;
            lastTime = DateUtils_1.default.nowTime.toString();
            Util_1.default.I.setItem(Util_1.DataKey.lastTime, lastTime);
            Util_1.default.I.setItem(Util_1.DataKey.todayCnt, 0);
        }
        else {
            var todayCnt = Util_1.default.I.getItem(Util_1.DataKey.todayCnt) || '0';
            data.todayCnt = parseInt(todayCnt);
        }
        data.lastTime = parseInt(lastTime);
        var dataCnt = Util_1.default.I.getItem(Util_1.DataKey.dataCNT) || '0';
        data.cnt = parseInt(dataCnt);
        data.list = [];
        return data;
    };
    RedpacketModel.prototype.checkRedpacket = function () {
        return __awaiter(this, void 0, void 0, function () {
            var cnt, data, ran2, cash;
            return __generator(this, function (_a) {
                if (this.data.todayCnt >= this.DAY_MAX_CNT)
                    return [2 /*return*/, false];
                if (AdManager_1.default.I.checkVideoInCd())
                    return [2 /*return*/, false];
                /**红包获取后没有看广告领取,再次获得红包的机会,不会获取红包, 自己也可以处理成 对应的红包提醒或不需要这里的判断 */
                if (this.curRedpacket) {
                    return [2 /*return*/, false];
                }
                if (undefined === this.data.cnt)
                    this.data.cnt = 0;
                cnt = this.data.cnt;
                if (cnt >= this.confLen)
                    cnt = this.confLen - 1;
                data = this.conf[cnt + 1];
                ran2 = Math.random();
                if (data && ran2 < data.per) {
                    cash = 0.000001;
                    this.curRedpacket = cash;
                    console.log("看视频领红包");
                    // //**弹出红包的界面,  暂时处理成 直接看广告获取金币 */
                    // await AdManager.I.showRewardAd(DotKey.reward_ad)
                    // console.log("加金币")
                    // let coin = await this.addCoin(); // 看完广告获取钱(此时已经加到账户了,暂未提供提前知道获取多少钱的方法)
                    // console.log("获取了钱", coin)
                    // this.getRepacket()
                    // /**更新基本显示 */
                    // EventCenter.emit(EventEnum.UPDATE_COIN);
                    /*** */
                    return [2 /*return*/, true];
                }
                return [2 /*return*/, false];
            });
        });
    };
    RedpacketModel.prototype.getRepacket = function () {
        if (!this.curRedpacket)
            return;
        this.data.cnt += 1;
        this.data.list.push(this.curRedpacket);
        this.data.lastTime = (new Date).getTime();
        this.data.todayCnt += 1;
        this.curRedpacket = 0;
        Util_1.default.I.setItem(Util_1.DataKey.dataCNT, this.data.cnt);
        Util_1.default.I.setItem(Util_1.DataKey.todayCnt, this.data.todayCnt);
        this.update(this.data);
    };
    /** */
    RedpacketModel.prototype.getCurRedpacket = function () {
        return __awaiter(this, void 0, void 0, function () {
            return __generator(this, function (_a) {
                return [2 /*return*/, this.curRedpacket];
            });
        });
    };
    Object.defineProperty(RedpacketModel.prototype, "data", {
        get: function () {
            return this._data;
        },
        enumerable: true,
        configurable: true
    });
    /**获取总共的金币数 */
    RedpacketModel.prototype.getTotalCoin = function () {
        return __awaiter(this, void 0, void 0, function () {
            var totalCoin;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, AppSdk_1.default.I.myCoin()];
                    case 1:
                        totalCoin = _a.sent();
                        return [2 /*return*/, totalCoin];
                }
            });
        });
    };
    /**获取本次奖励的金币数 */
    RedpacketModel.prototype.addCoin = function () {
        return __awaiter(this, void 0, void 0, function () {
            var coinData;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, AddGoldData_1.default.addCoin()];
                    case 1:
                        coinData = _a.sent();
                        return [2 /*return*/, coinData];
                }
            });
        });
    };
    /**获取最低提档 */
    RedpacketModel.prototype.minWithDrawal = function () {
        return __awaiter(this, void 0, void 0, function () {
            var minCoin;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, AppSdk_1.default.I.minWithDrawal()];
                    case 1:
                        minCoin = _a.sent();
                        return [2 /*return*/, minCoin];
                }
            });
        });
    };
    Object.defineProperty(RedpacketModel, "I", {
        get: function () {
            return ObjectInstance_1.default.get(RedpacketModel);
        },
        enumerable: true,
        configurable: true
    });
    return RedpacketModel;
}(BaseModel_1.default));
exports.default = RedpacketModel;
var RedpacketData = /** @class */ (function () {
    function RedpacketData() {
    }
    return RedpacketData;
}());
var RedpacketConfigData = /** @class */ (function () {
    function RedpacketConfigData() {
    }
    return RedpacketConfigData;
}());

},{"../../sdk/AdManager":7,"../../sdk/sdkData/AddGoldData":15,"../../sdk/sdkData/GoldConfigData":17,"../../uitl/DateUtils":21,"../../uitl/ObjectInstance":22,"../../uitl/Util":25,"../AppSdk":8,"./BaseModel":13}],15:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var AppSdk_1 = require("../AppSdk");
var AddGoldData = /** @class */ (function () {
    function AddGoldData() {
    }
    AddGoldData.initData = function (data) {
        if (!parseInt(data.code)) {
            AddGoldData.coin = data.data.coin;
            AddGoldData.mycoin = data.data.mycoin;
        }
    };
    AddGoldData.addCoin = function () {
        return __awaiter(this, void 0, void 0, function () {
            var result;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, AppSdk_1.default.I.addGold()];
                    case 1:
                        result = _a.sent();
                        return [2 /*return*/, [parseInt(result.coin), parseInt(result.mycoin)]];
                }
            });
        });
    };
    AddGoldData.coin = '0';
    AddGoldData.mycoin = '0';
    return AddGoldData;
}());
exports.default = AddGoldData;

},{"../AppSdk":8}],16:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectInstance_1 = require("../../uitl/ObjectInstance");
// sdk返回的用户信息
var AppSdkData = /** @class */ (function () {
    function AppSdkData() {
        this.isnew = 0;
    }
    AppSdkData.prototype.initData = function (data) {
        var _a;
        var d = data.data;
        var isnew = d.isnew, uid = d.uid, openid = d.openid, nickname = d.nickname, headimgurl = d.headimgurl;
        _a = [isnew, uid, openid, nickname, headimgurl], this.isnew = _a[0], this.uid = _a[1], this.openid = _a[2], this.nickname = _a[3], this.headimgurl = _a[4];
    };
    Object.defineProperty(AppSdkData, "I", {
        get: function () {
            return ObjectInstance_1.default.get(AppSdkData);
        },
        enumerable: true,
        configurable: true
    });
    return AppSdkData;
}());
exports.AppSdkData = AppSdkData;

},{"../../uitl/ObjectInstance":22}],17:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Util_1 = require("../../uitl/Util");
var AppSdk_1 = require("../AppSdk");
var GoldConfigData = /** @class */ (function () {
    function GoldConfigData() {
        this.coin_config = '';
        this.code = -3;
    }
    Object.defineProperty(GoldConfigData, "I", {
        get: function () {
            if (!this.instance)
                this.instance = new GoldConfigData();
            return this.instance;
        },
        enumerable: true,
        configurable: true
    });
    GoldConfigData.prototype.initData = function (data) {
        this.code = data.code;
        if (!data.code) {
            data = data.data;
            for (var key in data) {
                if (data.hasOwnProperty(key)) {
                    var ele = data[key];
                    this[key] = ele;
                }
            }
        }
    };
    GoldConfigData.prototype.getGoldConfig = function () {
        return __awaiter(this, void 0, void 0, function () {
            var _this = this;
            return __generator(this, function (_a) {
                return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
                        var result, configJson;
                        return __generator(this, function (_a) {
                            switch (_a.label) {
                                case 0:
                                    result = AppSdk_1.default.I.gameConfig;
                                    if (!result) return [3 /*break*/, 2];
                                    return [4 /*yield*/, this.loadGoldCfg(result['coin_config'][0])];
                                case 1:
                                    configJson = _a.sent();
                                    resolve(configJson);
                                    _a.label = 2;
                                case 2: return [2 /*return*/];
                            }
                        });
                    }); })];
            });
        });
    };
    GoldConfigData.prototype.loadGoldCfg = function (res) {
        return __awaiter(this, void 0, void 0, function () {
            var configJson;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, Util_1.default.I.load(res)];
                    case 1:
                        configJson = _a.sent();
                        return [2 /*return*/, configJson];
                }
            });
        });
    };
    GoldConfigData.instance = null;
    return GoldConfigData;
}());
exports.GoldConfigData = GoldConfigData;

},{"../../uitl/Util":25,"../AppSdk":8}],18:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectInstance_1 = require("../../uitl/ObjectInstance");
var Util_1 = require("../../uitl/Util");
var LuckDrawData = /** @class */ (function () {
    function LuckDrawData() {
    }
    Object.defineProperty(LuckDrawData, "I", {
        get: function () {
            return ObjectInstance_1.default.get(LuckDrawData);
        },
        enumerable: true,
        configurable: true
    });
    LuckDrawData.prototype.initData = function (data) {
        return __awaiter(this, void 0, void 0, function () {
            var _a, red_turntable_times, red_turntable_config, shake_turntable_config, shake_turntable_times;
            return __generator(this, function (_b) {
                red_turntable_times = data.red_turntable_times, red_turntable_config = data.red_turntable_config, shake_turntable_config = data.shake_turntable_config, shake_turntable_times = data.shake_turntable_times;
                _a = [red_turntable_times, red_turntable_config,
                    shake_turntable_config, shake_turntable_times], this.red_turntable_times = _a[0], this.red_turntable_config = _a[1], this.shake_turntable_config = _a[2], this.shake_turntable_times = _a[3];
                return [2 /*return*/];
            });
        });
    };
    LuckDrawData.prototype.loadGoldCfg = function (res) {
        return __awaiter(this, void 0, void 0, function () {
            var configJson;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0: return [4 /*yield*/, Util_1.default.I.load(res)];
                    case 1:
                        configJson = _a.sent();
                        return [2 /*return*/, configJson];
                }
            });
        });
    };
    return LuckDrawData;
}());
exports.LuckDrawData = LuckDrawData;

},{"../../uitl/ObjectInstance":22,"../../uitl/Util":25}],19:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Scene = Laya.Scene;
var REG = Laya.ClassUtils.regClass;
var ui;
(function (ui) {
    var TestSceneUI = /** @class */ (function (_super) {
        __extends(TestSceneUI, _super);
        function TestSceneUI() {
            return _super.call(this) || this;
        }
        TestSceneUI.prototype.createChildren = function () {
            _super.prototype.createChildren.call(this);
            this.loadScene("TestScene");
        };
        return TestSceneUI;
    }(Scene));
    ui.TestSceneUI = TestSceneUI;
    REG("ui.TestSceneUI", TestSceneUI);
})(ui = exports.ui || (exports.ui = {}));

},{}],20:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ArrayUtils = /** @class */ (function () {
    function ArrayUtils() {
    }
    /**
     * 移除元素
     */
    ArrayUtils.removeFromArr = function (arr, obj) {
        var index = arr.indexOf(obj);
        arr.splice(index, 1);
    };
    ArrayUtils.randomFromArr = function (arr) {
        var index = Math.floor(Math.random() * arr.length);
        return arr[index];
    };
    /**
     * 数组随机排序
     */
    ArrayUtils.shuffle = function (arr) {
        return arr.sort(function () {
            return Math.random() - 0.5;
        });
    };
    ArrayUtils.indexOf = function (arr, callback, ctx) {
        for (var i = 0; i < arr.length; i++) {
            if (callback.call(ctx, this[i], i))
                return i;
        }
        return -1;
    };
    ArrayUtils.each = function (arr, callback, context) {
        if (typeof callback !== 'function')
            throw new TypeError();
        for (var i = 0, len = arr.length; i < len; i++) {
            if (callback.call(context, arr[i], i, arr))
                break;
        }
    };
    ArrayUtils.queue = function (arr) {
        return __awaiter(this, void 0, void 0, function () {
            var res, _i, arr_1, promise;
            return __generator(this, function (_a) {
                switch (_a.label) {
                    case 0:
                        res = null;
                        _i = 0, arr_1 = arr;
                        _a.label = 1;
                    case 1:
                        if (!(_i < arr_1.length)) return [3 /*break*/, 4];
                        promise = arr_1[_i];
                        return [4 /*yield*/, promise(res)];
                    case 2:
                        res = _a.sent();
                        _a.label = 3;
                    case 3:
                        _i++;
                        return [3 /*break*/, 1];
                    case 4: return [4 /*yield*/, res];
                    case 5: return [2 /*return*/, _a.sent()];
                }
            });
        });
    };
    ArrayUtils.getRandomArray = function (arr, count) {
        var shuffled = arr.slice(0);
        var len = arr.length;
        var min = len - count, temp, index;
        while (len-- > min) {
            index = Math.floor((len + 1) * Math.random());
            temp = shuffled[index];
            shuffled[index] = shuffled[len];
            shuffled[len] = temp;
        }
        return shuffled.slice(min);
    };
    return ArrayUtils;
}());
exports.default = ArrayUtils;

},{}],21:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
 * 日期工具类
 */
var DateUtils = /** @class */ (function () {
    function DateUtils() {
    }
    Object.defineProperty(DateUtils, "now", {
        get: function () {
            return Math.floor(this.nowTime / 1000);
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DateUtils, "nowTime", {
        get: function () {
            return new Date().getTime();
        },
        enumerable: true,
        configurable: true
    });
    Object.defineProperty(DateUtils, "today", {
        get: function () {
            var time = new Date(this.nowTime);
            var year = time.getFullYear();
            var month = time.getMonth() + 1;
            var date = time.getDate();
            return year + "-" + this.add(month) + "-" + this.add(date);
        },
        enumerable: true,
        configurable: true
    });
    DateUtils.timeDay = function (timeNum) {
        var time = new Date(timeNum);
        var year = time.getFullYear();
        var month = time.getMonth() + 1;
        var date = time.getDate();
        return year + "-" + this.add(month) + "-" + this.add(date);
    };
    /**
     * 根据秒数格式化字符串
     * @param second 秒数
     * @param type 1:00:00:00   2:yyyy-mm-dd h:m:s    3:00:00   4:xx天前,xx小时前,xx分钟前
     * @return
     */
    DateUtils.getFormatBySecond = function (second, type) {
        if (type === void 0) { type = 1; }
        var str = "";
        switch (type) {
            case 0:
                str = this.getFormatBySecond0(second);
                break;
            case 1:
                str = this.getFormatBySecond1(second);
                break;
            case 2:
                str = this.getFormatBySecond2(second);
                break;
            case 3:
                str = this.getFormatBySecond3(second);
                break;
            case 4:
                str = this.getFormatBySecond4(second);
                break;
            case 5:
                str = this.getFormatBySecond5(second);
                break;
        }
        return str;
    };
    // 0: 00:00
    DateUtils.getFormatBySecond0 = function (t) {
        if (t === void 0) { t = 0; }
        var minst = Math.floor(t / 60);
        var secondt = Math.floor(t % 60);
        var mins;
        var sens;
        if (minst == 0) {
            mins = "00";
        }
        else if (minst < 10) {
            mins = "0" + minst;
        }
        else {
            mins = "" + minst;
        }
        if (secondt == 0) {
            sens = "00";
        }
        else if (secondt < 10) {
            sens = "0" + secondt;
        }
        else {
            sens = "" + secondt;
        }
        return mins + ":" + sens;
    };
    //1: 00:00:00
    DateUtils.getFormatBySecond1 = function (t) {
        if (t === void 0) { t = 0; }
        var hourst = Math.floor(t / 3600);
        var hours;
        var day = '';
        if (hourst == 0) {
            hours = "00";
        }
        else {
            if (hourst < 10)
                hours = "0" + hourst;
            else {
                var h = hourst % 24;
                if (hourst >= 24) {
                    hours = h < 10 ? "0" + h : '' + h;
                    day = Math.floor(hourst / 24) + 'd ';
                }
                else
                    hours = h < 10 ? "0" + h : '' + h;
            }
        }
        var minst = Math.floor((t - hourst * 3600) / 60);
        var secondt = Math.floor((t - hourst * 3600) % 60);
        var mins;
        var sens;
        if (minst == 0) {
            mins = "00";
        }
        else if (minst < 10) {
            mins = "0" + minst;
        }
        else {
            mins = "" + minst;
        }
        if (secondt == 0) {
            sens = "00";
        }
        else if (secondt < 10) {
            sens = "0" + secondt;
        }
        else {
            sens = "" + secondt;
        }
        return day + hours + ":" + mins + ":" + sens;
    };
    //3: 00:00
    DateUtils.getFormatBySecond3 = function (t) {
        if (t === void 0) { t = 0; }
        var hourst = Math.floor(t / 3600);
        var minst = Math.floor((t - hourst * 3600) / 60);
        var secondt = Math.floor((t - hourst * 3600) % 60);
        var mins;
        var sens;
        if (minst == 0) {
            mins = "00";
        }
        else if (minst < 10) {
            mins = "0" + minst;
        }
        else {
            mins = "" + minst;
        }
        if (secondt == 0) {
            sens = "00";
        }
        else if (secondt < 10) {
            sens = "0" + secondt;
        }
        else {
            sens = "" + secondt;
        }
        return mins + ":" + sens;
    };
    //2:yyyy-mm-dd h:m:s
    DateUtils.getFormatBySecond2 = function (time) {
        var date = new Date(time);
        var year = date.getFullYear();
        var month = date.getMonth() + 1; //返回的月份从0-11;
        var day = date.getDate();
        var hours = date.getHours();
        var minute = date.getMinutes();
        var second = date.getSeconds();
        return year + "-" + month + "-" + day + " " + hours + ":" + minute + ":" + second;
    };
    //4:xx天前,xx小时前,xx分钟前
    DateUtils.getFormatBySecond4 = function (time) {
        var t = Math.floor(time / 3600);
        if (t > 0) {
            if (t > 24) {
                return Math.floor(t / 24) + "天前";
            }
            else {
                return t + "小时前";
            }
        }
        else {
            return Math.floor(time / 60) + "分钟前";
        }
    };
    DateUtils.getFormatBySecond5 = function (time) {
        // 每个时间单位所对应的秒数
        var oneDay = 3600 * 24;
        var oneHourst = 3600;
        var oneMinst = 60;
        var days = Math.floor(time / oneDay);
        var hourst = Math.floor(time % oneDay / oneHourst);
        var minst = Math.floor((time - hourst * oneHourst) / oneMinst); //Math.floor(time % oneDay % oneHourst / oneMinst);
        var secondt = Math.floor((time - hourst * oneHourst) % oneMinst); //time;
        var dayss = "";
        var hourss = "";
        var minss = "";
        var secss = "";
        if (time > 0) {
            //天
            if (days == 0) {
                dayss = "";
                //小时
                if (hourst == 0) {
                    hourss = "";
                    //分
                    if (minst == 0) {
                        minss = "";
                        if (secondt == 0) {
                            secss = "";
                        }
                        else if (secondt < 10) {
                            secss = "0" + secondt + "秒";
                        }
                        else {
                            secss = "" + secondt + "秒";
                        }
                        return secss;
                    }
                    else {
                        minss = "" + minst + "分钟";
                        if (secondt == 0) {
                            secss = "";
                        }
                        else if (secondt < 10) {
                            secss = "0" + secondt + "秒";
                        }
                        else {
                            secss = "" + secondt + "秒";
                        }
                    }
                    return minss + secss;
                }
                else {
                    hourss = hourst + "小时";
                    if (minst == 0) {
                        minss = "";
                        if (secondt == 0) {
                            secss = "";
                        }
                        else if (secondt < 10) {
                            secss = "0" + secondt + "秒";
                        }
                        else {
                            secss = "" + secondt + "秒";
                        }
                        return hourss + secss;
                    }
                    else if (minst < 10) {
                        minss = "0" + minst + "分钟";
                    }
                    else {
                        minss = "" + minst + "分钟";
                    }
                    return hourss + minss;
                }
            }
            else {
                dayss = days + "天";
                if (hourst == 0) {
                    hourss = "";
                }
                else {
                    if (hourst < 10)
                        hourss = "0" + hourst + "小时";
                    else
                        hourss = "" + hourst + "小时";
                    ;
                }
                return dayss + hourss;
            }
        }
        return "";
    };
    DateUtils.add = function (num) {
        return num < 10 ? '0' + num : num;
    };
    return DateUtils;
}());
exports.default = DateUtils;

},{}],22:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectPool_1 = require("./ObjectPool");
/*
* name;
*/
var ObjectInstance = /** @class */ (function () {
    function ObjectInstance() {
    }
    ObjectInstance.get = function (cls) {
        var idx = this.clzs.indexOf(cls);
        return (idx >= 0 && this.objects[idx]) || this.create(cls);
    };
    ObjectInstance.create = function (cls) {
        var obj = ObjectPool_1.default.pop(cls);
        this.objects.push(obj);
        this.clzs.push(cls);
        return obj;
    };
    ObjectInstance.clzs = [];
    ObjectInstance.objects = [];
    return ObjectInstance;
}());
exports.default = ObjectInstance;

},{"./ObjectPool":23}],23:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ObjectPool = /** @class */ (function () {
    function ObjectPool() {
    }
    ObjectPool.pop = function (cls) {
        var idx = this.clsArr.indexOf(cls);
        if (idx < 0) {
            idx = this.clsArr.length;
            this.clsArr.push(cls);
        }
        var key = 'poolKey' + idx;
        var item = Laya.Pool.getItemByClass(key, cls);
        item.poolKey = key;
        return item;
    };
    ObjectPool.push = function (item) {
        Laya.Pool.recover(item.poolKey, item);
    };
    ObjectPool.clsArr = [];
    return ObjectPool;
}());
exports.default = ObjectPool;

},{}],24:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var ScaleButtonScript = /** @class */ (function () {
    function ScaleButtonScript() {
        this.delayTime = 0;
        this.minScale = 0;
    }
    Object.defineProperty(ScaleButtonScript.prototype, "owner", {
        /**
         *设置owner函数,可以直接获取到添加附加脚本的组件实例
         **/
        set: function (value) {
            this.monkeyBox = value;
            //自定义的脚本会有时序问题,所以在此添加一个延时
            this.monkeyBox.frameOnce(2, this, this.onLoaded);
        },
        enumerable: true,
        configurable: true
    });
    ScaleButtonScript.prototype.onLoaded = function () {
        /* 设置按钮为单态按钮
         ** 取值:
         ** 1:单态。图片不做切割,按钮的皮肤状态只有一种。
         ** 2:两态。图片将以竖直方向被等比切割为2部分,从上向下,依次为弹起状态皮肤、按下和经过及选中状态皮肤。
         ** 3:三态。图片将以竖直方向被等比切割为2部分,从上向下,依次为弹起状态皮肤、经过状态皮肤、按下和选中状态皮肤
         */
        //添加鼠标按下事件侦听。按时时缩小按钮。
        this.monkeyBox.on(Laya.Event.MOUSE_DOWN, this, this.scaleSmall);
        //添加鼠标抬起事件侦听。抬起时还原按钮。
        this.monkeyBox.on(Laya.Event.MOUSE_UP, this, this.scaleBig);
        //添加鼠标离开事件侦听。离开时还原按钮。
        this.monkeyBox.on(Laya.Event.MOUSE_OUT, this, this.scaleBig);
    };
    ScaleButtonScript.prototype.scaleSmall = function () {
        //缩小至0.8的缓动效果
        Laya.Tween.to(this.monkeyBox, { scaleX: 0.8, scaleY: 0.8 }, 2);
    };
    ScaleButtonScript.prototype.scaleBig = function () {
        //变大还原的缓动效果
        Laya.Tween.to(this.monkeyBox, { scaleX: 1, scaleY: 1 }, 2);
    };
    return ScaleButtonScript;
}());
exports.default = ScaleButtonScript;

},{}],25:[function(require,module,exports){
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Util = /** @class */ (function () {
    function Util() {
    }
    Util.prototype.load = function (res, onProgress) {
        var _this = this;
        return new Promise(function (suc, fail) {
            Laya.loader.load(res, Laya.Handler.create(_this, suc), onProgress);
        });
    };
    Util.prototype.setItem = function (key, value) {
        Laya.LocalStorage.setItem(key, value.toString());
    };
    Util.prototype.getItem = function (key) {
        return Laya.LocalStorage.getItem(key);
    };
    Object.defineProperty(Util, "I", {
        get: function () {
            return this._instance || (this._instance = new Util);
        },
        enumerable: true,
        configurable: true
    });
    return Util;
}());
exports.default = Util;
var DataKey;
(function (DataKey) {
    DataKey["cur_red_day_limit"] = "cur_red_day_limit";
    DataKey["cur_shake_day_limit"] = "cur_shake_day_limit";
    DataKey["shakeLastTime"] = "shakeLastTime";
    DataKey["dataCNT"] = "dataCNT";
    DataKey["todayCnt"] = "todayCnt";
    DataKey["lastTime"] = "lastTime";
})(DataKey = exports.DataKey || (exports.DataKey = {}));

},{}]},{},[2])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL0FwcGxpY2F0aW9ucy9MYXlhQWlySURFLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvYXBwL25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJzcmMvR2FtZUNvbmZpZy50cyIsInNyYy9NYWluLnRzIiwic3JjL1JlZERyYXdhbC50cyIsInNyYy9UZXN0U2NlbmUudHMiLCJzcmMvZXZlbnQvRXZlbnRDZW50ZXIudHMiLCJzcmMvZXZlbnQvRXZlbnRFbnVtLnRzIiwic3JjL3Nkay9BZE1hbmFnZXIudHMiLCJzcmMvc2RrL0FwcFNkay50cyIsInNyYy9zZGsvTHVja0RyYXdNb2RlbC50cyIsInNyYy9zZGsvTmF0aXZlQWQudHMiLCJzcmMvc2RrL1RUQWRTZGsudHMiLCJzcmMvc2RrL1RlYVNkay50cyIsInNyYy9zZGsvbW9kZWwvQmFzZU1vZGVsLnRzIiwic3JjL3Nkay9tb2RlbC9SZWRwYWNrZXRNb2RlbC50cyIsInNyYy9zZGsvc2RrRGF0YS9BZGRHb2xkRGF0YS50cyIsInNyYy9zZGsvc2RrRGF0YS9BcHBTZGtEYXRhLnRzIiwic3JjL3Nkay9zZGtEYXRhL0dvbGRDb25maWdEYXRhLnRzIiwic3JjL3Nkay9zZGtEYXRhL0x1Y2tEcmF3RGF0YS50cyIsInNyYy91aS9sYXlhTWF4VUkudHMiLCJzcmMvdWl0bC9BcnJheVV0aWxzLnRzIiwic3JjL3VpdGwvRGF0ZVV0aWxzLnRzIiwic3JjL3VpdGwvT2JqZWN0SW5zdGFuY2UudHMiLCJzcmMvdWl0bC9PYmplY3RQb29sLnRzIiwic3JjL3VpdGwvU2NhbGVCdXR0b25TY3JpcHQudHMiLCJzcmMvdWl0bC9VdGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ1ZBLGdHQUFnRztBQUNoRyx5Q0FBbUM7QUFDbkMsOERBQXdEO0FBQ3hELHlDQUFtQztBQUNuQywyQ0FBcUM7QUFDckM7O0VBRUU7QUFDRjtJQWFJO0lBQWMsQ0FBQztJQUNSLGVBQUksR0FBWDtRQUNJLElBQUksR0FBRyxHQUFhLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQzdDLEdBQUcsQ0FBQyxjQUFjLEVBQUMsbUJBQVMsQ0FBQyxDQUFDO1FBQzlCLEdBQUcsQ0FBQywyQkFBMkIsRUFBQywyQkFBaUIsQ0FBQyxDQUFDO1FBQ25ELEdBQUcsQ0FBQyxjQUFjLEVBQUMsbUJBQVMsQ0FBQyxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxpQkFBaUIsRUFBQyxrQkFBUSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQW5CTSxnQkFBSyxHQUFRLEdBQUcsQ0FBQztJQUNqQixpQkFBTSxHQUFRLElBQUksQ0FBQztJQUNuQixvQkFBUyxHQUFRLFlBQVksQ0FBQztJQUM5QixxQkFBVSxHQUFRLE1BQU0sQ0FBQztJQUN6QixpQkFBTSxHQUFRLEtBQUssQ0FBQztJQUNwQixpQkFBTSxHQUFRLE1BQU0sQ0FBQztJQUNyQixxQkFBVSxHQUFLLGlCQUFpQixDQUFDO0lBQ2pDLG9CQUFTLEdBQVEsRUFBRSxDQUFDO0lBQ3BCLGdCQUFLLEdBQVMsS0FBSyxDQUFDO0lBQ3BCLGVBQUksR0FBUyxLQUFLLENBQUM7SUFDbkIsdUJBQVksR0FBUyxLQUFLLENBQUM7SUFDM0IsNEJBQWlCLEdBQVMsSUFBSSxDQUFDO0lBUzFDLGlCQUFDO0NBckJELEFBcUJDLElBQUE7a0JBckJvQixVQUFVO0FBc0IvQixVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7Ozs7O0FDOUJsQiwyQ0FBc0M7QUFHdEMsdUNBQWtDO0FBQ2xDO0lBQ0M7UUFtRFEsY0FBUyxHQUFXLENBQUMsQ0FBQztRQWxEN0IsZ0JBQWdCO1FBQ2hCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQztZQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0JBQVUsQ0FBQyxLQUFLLEVBQUUsb0JBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7WUFDbEUsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBVSxDQUFDLEtBQUssRUFBRSxvQkFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsb0JBQVUsQ0FBQyxTQUFTLENBQUM7UUFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsb0JBQVUsQ0FBQyxVQUFVLENBQUM7UUFDOUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsb0JBQVUsQ0FBQyxNQUFNLENBQUM7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsb0JBQVUsQ0FBQyxNQUFNLENBQUM7UUFDdEMsb0JBQW9CO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEdBQUcsb0JBQVUsQ0FBQyxpQkFBaUIsQ0FBQztRQUUxRCxvREFBb0Q7UUFDcEQsSUFBSSxvQkFBVSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNO1lBQUUsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDOUYsSUFBSSxvQkFBVSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMzRixJQUFJLG9CQUFVLENBQUMsSUFBSTtZQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUU3QixnREFBZ0Q7UUFDaEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3JJLENBQUM7SUFFRCw4QkFBZSxHQUFmO1FBQ0MsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7SUFFRCw2QkFBYyxHQUFkO1FBQ0MsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2YsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxZQUFZO0lBQ0Usc0JBQU8sR0FBckI7Ozs7OzZCQUNLLGdCQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsRUFBbkIsd0JBQW1CO3dCQUN0QixnQkFBTSxDQUFDLElBQUksRUFBRSxDQUFBO3dCQUNiLHFCQUFNLGdCQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFBOzt3QkFBeEIsU0FBd0IsQ0FBQzt3QkFDekIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOzs7d0JBRW5CLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzs7Ozs7S0FFMUM7SUFFTyx1QkFBUSxHQUFoQjtRQUNDLFNBQVM7UUFFVCxNQUFNO1FBQ04sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFHTywwQkFBVyxHQUFuQjtRQUNDLFlBQVk7UUFDWixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRTtZQUN2QixPQUFNO1NBQ047UUFDRCxnQkFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFBLG1CQUFtQjtRQUN6QyxvQkFBVSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFDRixXQUFDO0FBQUQsQ0E5REEsQUE4REMsSUFBQTtBQUNELE9BQU87QUFDUCxJQUFJLElBQUksRUFBRSxDQUFDOzs7OztBQ3BFWCw2REFBd0Q7QUFDeEQsbURBQWtEO0FBQ2xELCtDQUE4QztBQUM5Qzs7R0FFRztBQUNIO0lBQXVDLDZCQUFXO0lBUTlDO1FBQUEsWUFBZ0IsaUJBQU8sU0FBRztRQUZsQixlQUFTLEdBQVcsR0FBRyxDQUFDOztJQUVQLENBQUM7SUFDMUIsMkJBQU8sR0FBUDtRQUNJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQiwrQkFBK0I7SUFDbkMsQ0FBQztJQUNELDRCQUFRLEdBQVI7UUFDSSx5QkFBVyxDQUFDLEdBQUcsQ0FBQyxxQkFBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzNELHlCQUFXLENBQUMsR0FBRyxDQUFDLHFCQUFTLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELDZCQUFTLEdBQVQ7UUFDSSx5QkFBVyxDQUFDLE1BQU0sQ0FBQyxxQkFBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzlELHlCQUFXLENBQUMsTUFBTSxDQUFDLHFCQUFTLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVLLDhCQUFVLEdBQWhCOzs7Ozs0QkFDZSxxQkFBTSx3QkFBYyxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBQTs7d0JBQTVDLElBQUksR0FBRyxTQUFxQzt3QkFDaEQsa0JBQWtCO3dCQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzt3QkFDdEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQzt3QkFDMUIsR0FBRyxHQUFHLEtBQUssQ0FBQzt3QkFFQyxxQkFBTSx3QkFBYyxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBQTs7d0JBQW5ELFVBQVUsR0FBRyxTQUFzQzt3QkFDdkQsSUFBSSxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRTs0QkFDaEIsUUFBUSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDOzRCQUMzQyxJQUFJLFFBQVEsR0FBRyxDQUFDO2dDQUNaLEdBQUcsR0FBRyxpQkFBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLG1DQUFPLENBQUM7eUJBQ3ZEO3dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQzt3QkFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDOzs7OztLQUM3QztJQUNMLGdCQUFDO0FBQUQsQ0F2Q0EsQUF1Q0MsQ0F2Q3NDLElBQUksQ0FBQyxNQUFNLEdBdUNqRDs7Ozs7O0FDN0NELDRDQUFvQztBQUNwQyw2Q0FBd0M7QUFDeEMsNkRBQXdEO0FBQ3hELHVDQUFrQztBQUNsQyx1Q0FBc0M7QUFDdEMsbURBQWtEO0FBQ2xELCtDQUE4QztBQUU5QztJQUF1Qyw2QkFBYztJQUNqRDtRQUFBLFlBQ0ksaUJBQU8sU0FNVjtRQUxHLGVBQWU7UUFDZixJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLGlDQUFpQyxDQUFDLENBQUE7UUFDOUMsS0FBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDOztJQUVsQyxDQUFDO0lBRUQsNEJBQVEsR0FBUjtRQUNJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxjQUFj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QUksQ0FBQyxDQUFDO1FBQ3pELENBQUM7OztPQUFBO0lBQ0wsV0FBQztBQUFELENBakJBLEFBaUJDLElBQUE7O0FBRUQsSUFBWSxPQU9YO0FBUEQsV0FBWSxPQUFPO0lBQ2Ysa0RBQXVDLENBQUE7SUFDdkMsc0RBQTJDLENBQUE7SUFDM0MsMENBQStCLENBQUE7SUFDL0IsOEJBQW1CLENBQUE7SUFDbkIsZ0NBQXFCLENBQUE7SUFDckIsZ0NBQXFCLENBQUE7QUFDekIsQ0FBQyxFQVBXLE9BQU8sR0FBUCxlQUFPLEtBQVAsZUFBTyxRQU9sQiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fZXh0ZW5kcyA9ICh0aGlzICYmIHRoaXMuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcclxuICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG4gICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxuICAgIH07XHJcbn0pKCk7XHJcbihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIvKipUaGlzIGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IExheWFBaXJJREUsIHBsZWFzZSBkbyBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucy4gKi9cclxuaW1wb3J0IFRlc3RTY2VuZSBmcm9tIFwiLi9UZXN0U2NlbmVcIlxuaW1wb3J0IFNjYWxlQnV0dG9uU2NyaXB0IGZyb20gXCIuL3VpdGwvU2NhbGVCdXR0b25TY3JpcHRcIlxuaW1wb3J0IFJlZERyYXdhbCBmcm9tIFwiLi9SZWREcmF3YWxcIlxuaW1wb3J0IE5hdGl2ZUFkIGZyb20gXCIuL3Nkay9OYXRpdmVBZFwiXHJcbi8qXHJcbiog5ri45oiP5Yid5aeL5YyW6YWN572uO1xyXG4qL1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYW1lQ29uZmlne1xyXG4gICAgc3RhdGljIHdpZHRoOm51bWJlcj03NTA7XHJcbiAgICBzdGF0aWMgaGVpZ2h0Om51bWJlcj0xMzM0O1xyXG4gICAgc3RhdGljIHNjYWxlTW9kZTpzdHJpbmc9XCJmaXhlZHdpZHRoXCI7XHJcbiAgICBzdGF0aWMgc2NyZWVuTW9kZTpzdHJpbmc9XCJub25lXCI7XHJcbiAgICBzdGF0aWMgYWxpZ25WOnN0cmluZz1cInRvcFwiO1xyXG4gICAgc3RhdGljIGFsaWduSDpzdHJpbmc9XCJsZWZ0XCI7XHJcbiAgICBzdGF0aWMgc3RhcnRTY2VuZTphbnk9XCJUZXN0U2NlbmUuc2NlbmVcIjtcclxuICAgIHN0YXRpYyBzY2VuZVJvb3Q6c3RyaW5nPVwiXCI7XHJcbiAgICBzdGF0aWMgZGVidWc6Ym9vbGVhbj1mYWxzZTtcclxuICAgIHN0YXRpYyBzdGF0OmJvb2xlYW49ZmFsc2U7XHJcbiAgICBzdGF0aWMgcGh5c2ljc0RlYnVnOmJvb2xlYW49ZmFsc2U7XHJcbiAgICBzdGF0aWMgZXhwb3J0U2NlbmVUb0pzb246Ym9vbGVhbj10cnVlO1xyXG4gICAgY29uc3RydWN0b3IoKXt9XHJcbiAgICBzdGF0aWMgaW5pdCgpe1xyXG4gICAgICAgIHZhciByZWc6IEZ1bmN0aW9uID0gTGF5YS5DbGFzc1V0aWxzLnJlZ0NsYXNzO1xyXG4gICAgICAgIHJlZyhcIlRlc3RTY2VuZS50c1wiLFRlc3RTY2VuZSk7XG4gICAgICAgIHJlZyhcInVpdGwvU2NhbGVCdXR0b25TY3JpcHQudHNcIixTY2FsZUJ1dHRvblNjcmlwdCk7XG4gICAgICAgIHJlZyhcIlJlZERyYXdhbC50c1wiLFJlZERyYXdhbCk7XG4gICAgICAgIHJlZyhcInNkay9OYXRpdmVBZC50c1wiLE5hdGl2ZUFkKTtcclxuICAgIH1cclxufVxyXG5HYW1lQ29uZmlnLmluaXQoKTsiLCJpbXBvcnQgR2FtZUNvbmZpZyBmcm9tIFwiLi9HYW1lQ29uZmlnXCI7XHJcbmltcG9ydCBBZE1hbmFnZXIgZnJvbSBcIi4vc2RrL0FkTWFuYWdlclwiO1xyXG5pbXBvcnQgUmVkcGFja2V0TW9kZWwgZnJvbSBcIi4vc2RrL21vZGVsL1JlZHBhY2tldE1vZGVsXCI7XHJcbmltcG9ydCBBcHBTZGsgZnJvbSBcIi4vc2RrL0FwcFNka1wiO1xyXG5jbGFzcyBNYWluIHtcclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdC8v5qC55o2uSURF6K6+572u5Yid5aeL5YyW5byV5pOOXHRcdFxyXG5cdFx0aWYgKHdpbmRvd1tcIkxheWEzRFwiXSkgTGF5YTNELmluaXQoR2FtZUNvbmZpZy53aWR0aCwgR2FtZUNvbmZpZy5oZWlnaHQpO1xyXG5cdFx0ZWxzZSBMYXlhLmluaXQoR2FtZUNvbmZpZy53aWR0aCwgR2FtZUNvbmZpZy5oZWlnaHQsIExheWFbXCJXZWJHTFwiXSk7XHJcblx0XHRMYXlhW1wiUGh5c2ljc1wiXSAmJiBMYXlhW1wiUGh5c2ljc1wiXS5lbmFibGUoKTtcclxuXHRcdExheWFbXCJEZWJ1Z1BhbmVsXCJdICYmIExheWFbXCJEZWJ1Z1BhbmVsXCJdLmVuYWJsZSgpO1xyXG5cdFx0TGF5YS5zdGFnZS5zY2FsZU1vZGUgPSBHYW1lQ29uZmlnLnNjYWxlTW9kZTtcclxuXHRcdExheWEuc3RhZ2Uuc2NyZWVuTW9kZSA9IEdhbWVDb25maWcuc2NyZWVuTW9kZTtcclxuXHRcdExheWEuc3RhZ2UuYWxpZ25WID0gR2FtZUNvbmZpZy5hbGlnblY7XHJcblx0XHRMYXlhLnN0YWdlLmFsaWduSCA9IEdhbWVDb25maWcuYWxpZ25IO1xyXG5cdFx0Ly/lhbzlrrnlvq7kv6HkuI3mlK/mjIHliqDovb1zY2VuZeWQjue8gOWcuuaZr1xyXG5cdFx0TGF5YS5VUkwuZXhwb3J0U2NlbmVUb0pzb24gPSBHYW1lQ29uZmlnLmV4cG9ydFNjZW5lVG9Kc29uO1xyXG5cclxuXHRcdC8v5omT5byA6LCD6K+V6Z2i5p2/77yI6YCa6L+HSURF6K6+572u6LCD6K+V5qih5byP77yM5oiW6ICFdXJs5Zyw5Z2A5aKe5YqgZGVidWc9dHJ1ZeWPguaVsO+8jOWdh+WPr+aJk+W8gOiwg+ivlemdouadv++8iVxyXG5cdFx0aWYgKEdhbWVDb25maWcuZGVidWcgfHwgTGF5YS5VdGlscy5nZXRRdWVyeVN0cmluZyhcImRlYnVnXCIpID09IFwidHJ1ZVwiKSBMYXlhLmVuYWJsZURlYnVnUGFuZWwoKTtcclxuXHRcdGlmIChHYW1lQ29uZmlnLnBoeXNpY3NEZWJ1ZyAmJiBMYXlhW1wiUGh5c2ljc0RlYnVnRHJhd1wiXSkgTGF5YVtcIlBoeXNpY3NEZWJ1Z0RyYXdcIl0uZW5hYmxlKCk7XHJcblx0XHRpZiAoR2FtZUNvbmZpZy5zdGF0KSBMYXlhLlN0YXQuc2hvdygpO1xyXG5cdFx0TGF5YS5hbGVydEdsb2JhbEVycm9yID0gdHJ1ZTtcclxuXHJcblx0XHQvL+a/gOa0u+i1hOa6kOeJiOacrOaOp+WItu+8jHZlcnNpb24uanNvbueUsUlEReWPkeW4g+WKn+iDveiHquWKqOeUn+aIkO+8jOWmguaenOayoeacieS5n+S4jeW9seWTjeWQjue7rea1geeoi1xyXG5cdFx0TGF5YS5SZXNvdXJjZVZlcnNpb24uZW5hYmxlKFwidmVyc2lvbi5qc29uXCIsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vblZlcnNpb25Mb2FkZWQpLCBMYXlhLlJlc291cmNlVmVyc2lvbi5GSUxFTkFNRV9WRVJTSU9OKTtcclxuXHR9XHJcblxyXG5cdG9uVmVyc2lvbkxvYWRlZCgpOiB2b2lkIHtcclxuXHRcdC8v5r+A5rS75aSn5bCP5Zu+5pig5bCE77yM5Yqg6L295bCP5Zu+55qE5pe25YCZ77yM5aaC5p6c5Y+R546w5bCP5Zu+5Zyo5aSn5Zu+5ZCI6ZuG6YeM6Z2i77yM5YiZ5LyY5YWI5Yqg6L295aSn5Zu+5ZCI6ZuG77yM6ICM5LiN5piv5bCP5Zu+XHJcblx0XHRMYXlhLkF0bGFzSW5mb01hbmFnZXIuZW5hYmxlKFwiZmlsZWNvbmZpZy5qc29uXCIsIExheWEuSGFuZGxlci5jcmVhdGUodGhpcywgdGhpcy5vbkNvbmZpZ0xvYWRlZCkpO1xyXG5cdH1cclxuXHJcblx0b25Db25maWdMb2FkZWQoKTogdm9pZCB7XHJcblx0XHR0aGlzLmluaXRTZGsoKTtcclxuXHRcdHRoaXMubG9hZERhdGEoKTtcclxuXHR9XHJcblxyXG5cdC8qKuWIneWni+WMllNESyAqL1xyXG5cdHByaXZhdGUgYXN5bmMgaW5pdFNkaygpIHtcclxuXHRcdGlmIChBcHBTZGsuSS5pc015QnJpZGdlKSB7XHJcblx0XHRcdEFwcFNkay5pbml0KClcclxuXHRcdFx0YXdhaXQgQXBwU2RrLkkuaW5pdFNkaygpO1xyXG5cdFx0XHR0aGlzLnRvZ2dsZVNjZW5lKCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHRMYXlhLnRpbWVyLm9uY2UoMTAwLCB0aGlzLCB0aGlzLmluaXRTZGspO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBsb2FkRGF0YSgpIHtcclxuXHRcdC8vIOWkhOeQhua4uOaIj+WKoOi9vVxyXG5cclxuXHRcdC8v5Yqg6L295a6M5oiQXHJcblx0XHR0aGlzLnRvZ2dsZVNjZW5lKCk7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNoZWNrTG9hZDogbnVtYmVyID0gMDtcclxuXHRwcml2YXRlIHRvZ2dsZVNjZW5lKCkge1xyXG5cdFx0Ly/liqDovb1JREXmjIflrprnmoTlnLrmma9cclxuXHRcdHRoaXMuY2hlY2tMb2FkKys7XHJcblx0XHRpZiAodGhpcy5jaGVja0xvYWQgPCAyKSB7XHJcblx0XHRcdHJldHVyblxyXG5cdFx0fVxyXG5cdFx0QXBwU2RrLkkuaGlkZVNwbGFzaCgpOy8v6ZqQ6JeP5Yqg6L296aG1IOWPr+agueaNrumcgOaxguaUvuWIsOWFtuS7luS9jee9rlxyXG5cdFx0R2FtZUNvbmZpZy5zdGFydFNjZW5lICYmIExheWEuU2NlbmUub3BlbihHYW1lQ29uZmlnLnN0YXJ0U2NlbmUpO1xyXG5cdH1cclxufVxyXG4vL+a/gOa0u+WQr+WKqOexu1xyXG5uZXcgTWFpbigpO1xyXG4iLCJpbXBvcnQgUmVkcGFja2V0TW9kZWwgZnJvbSBcIi4vc2RrL21vZGVsL1JlZHBhY2tldE1vZGVsXCI7XG5pbXBvcnQgeyBFdmVudENlbnRlciB9IGZyb20gXCIuL2V2ZW50L0V2ZW50Q2VudGVyXCI7XG5pbXBvcnQgeyBFdmVudEVudW0gfSBmcm9tIFwiLi9ldmVudC9FdmVudEVudW1cIjtcbi8qKlxuICog5Li755WM6Z2iICDph5HluIHph5Hpop1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkRHJhd2FsIGV4dGVuZHMgTGF5YS5TY3JpcHQge1xuICAgIC8qKiBAcHJvcCB7bmFtZTpjb2lubGFiLCB0aXBzOlwi6YeR5biBXCIsIHR5cGU6Tm9kZX0qL1xuICAgIGNvaW5sYWI6IExheWEuTGFiZWw7XG4gICAgLyoqIEBwcm9wIHtuYW1lOnRpcGxhYiwgdGlwczpcIuaPkOekulwiLCB0eXBlOk5vZGV9Ki9cbiAgICB0aXBsYWI6IExheWEuTGFiZWw7XG5cbiAgICBwcml2YXRlIHRvdGFsQ29pbjogbnVtYmVyID0gMTEwO1xuXG4gICAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cbiAgICBvblN0YXJ0KCkge1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXIoKTtcbiAgICAgICAgLy8gdGhpcy50aXBsYWIudmlzaWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICBvbkVuYWJsZSgpIHtcbiAgICAgICAgRXZlbnRDZW50ZXIuYWRkKEV2ZW50RW51bS5BUFBfU0hPVywgdGhpcywgdGhpcy51cGRhdGVTdGFyKTtcbiAgICAgICAgRXZlbnRDZW50ZXIuYWRkKEV2ZW50RW51bS5VUERBVEVfQ09JTiwgdGhpcywgdGhpcy51cGRhdGVTdGFyKTtcbiAgICB9XG5cbiAgICBvbkRpc2FibGUoKSB7XG4gICAgICAgIEV2ZW50Q2VudGVyLnJlbW92ZShFdmVudEVudW0uQVBQX1NIT1csIHRoaXMsIHRoaXMudXBkYXRlU3Rhcik7XG4gICAgICAgIEV2ZW50Q2VudGVyLnJlbW92ZShFdmVudEVudW0uVVBEQVRFX0NPSU4sIHRoaXMsIHRoaXMudXBkYXRlU3Rhcik7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlU3RhcigpIHtcbiAgICAgICAgbGV0IGNvaW4gPSBhd2FpdCBSZWRwYWNrZXRNb2RlbC5JLmdldFRvdGFsQ29pbigpO1xuICAgICAgICAvLyBsZXQgY29pbiA9IDEwMDBcbiAgICAgICAgdGhpcy50b3RhbENvaW4gPSBjb2luO1xuICAgICAgICB0aGlzLmNvaW5sYWIudGV4dCA9ICcnICsgY29pbjtcbiAgICAgICAgbGV0IHN0ciA9ICflj6/mj5DnjrAnO1xuICAgICAgICAvKirmm7TmlrDkuIvkuIvkuIDmrKHmj5DnjrDnmoTpop3luqYgKi9cbiAgICAgICAgbGV0IG5leHREcmF3YWwgPSBhd2FpdCBSZWRwYWNrZXRNb2RlbC5JLm1pbldpdGhEcmF3YWwoKTtcbiAgICAgICAgaWYgKHRoaXMudG90YWxDb2luID4gMCkge1xuICAgICAgICAgICAgbGV0IGxlZnRDb2luID0gbmV4dERyYXdhbCAtIHRoaXMudG90YWxDb2luO1xuICAgICAgICAgICAgaWYgKGxlZnRDb2luID4gMClcbiAgICAgICAgICAgICAgICBzdHIgPSBg6L+Y5beuJHsobGVmdENvaW4gLyAxMDAwMCkudG9GaXhlZCgzKX3ph5Hpop3lj6/mj5DnjrBgO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGlwbGFiLnRleHQgPSBzdHI7XG4gICAgICAgIHRoaXMudGlwbGFiLnZpc2libGUgPSBCb29sZWFuKG5leHREcmF3YWwpO1xuICAgIH1cbn0iLCJpbXBvcnQgeyB1aSB9IGZyb20gXCIuL3VpL2xheWFNYXhVSVwiO1xuaW1wb3J0IEFkTWFuYWdlciBmcm9tIFwiLi9zZGsvQWRNYW5hZ2VyXCI7XG5pbXBvcnQgUmVkcGFja2V0TW9kZWwgZnJvbSBcIi4vc2RrL21vZGVsL1JlZHBhY2tldE1vZGVsXCI7XG5pbXBvcnQgQXBwU2RrIGZyb20gXCIuL3Nkay9BcHBTZGtcIjtcbmltcG9ydCB7IERvdEtleSB9IGZyb20gXCIuL3Nkay9UZWFTZGtcIjtcbmltcG9ydCB7IEV2ZW50Q2VudGVyIH0gZnJvbSBcIi4vZXZlbnQvRXZlbnRDZW50ZXJcIjtcbmltcG9ydCB7IEV2ZW50RW51bSB9IGZyb20gXCIuL2V2ZW50L0V2ZW50RW51bVwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUZXN0U2NlbmUgZXh0ZW5kcyB1aS5UZXN0U2NlbmVVSSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8v5YWz6Zet5aSa54K56Kem5o6n77yM5ZCm5YiZ5bCx5peg5pWM5LqGXG4gICAgICAgIExheWEuTW91c2VNYW5hZ2VyLm11bHRpVG91Y2hFbmFibGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1UZXN0U2NlbmUtLS0tLS0tJylcbiAgICAgICAgdGhpcy5OYXRpdmVBRC52aXNpYmxlID0gZmFsc2U7XG5cbiAgICB9XG5cbiAgICBvbkVuYWJsZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idG5TZXJ2ZXIub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5vcGVuU2VydmVyKTtcbiAgICAgICAgdGhpcy5idG5EcmF3YWwub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5vcGVuUGVyc29uYWwpO1xuICAgICAgICB0aGlzLmJ0bkRyYXcub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5vbkRyYXcpO1xuICAgICAgICB0aGlzLmJ0bkludml0ZS5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLmludml0YXRpb24pO1xuICAgICAgICB0aGlzLmJ0blZpYnJhdGUub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5vblZpYnJhdGUpO1xuICAgICAgICB0aGlzLmJ0blByZWxvYWRBRC5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnByZWxvYWRBRCk7XG4gICAgICAgIHRoaXMuYnRuU2hvd0Jhbm5lci5vbihMYXlhLkV2ZW50LkNMSUNLLCB0aGlzLCB0aGlzLnNob3dCYW5uZXIpO1xuICAgICAgICB0aGlzLmJ0blNob3dGdWxsQWQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5zaG93RnVsbEFkKTtcbiAgICAgICAgdGhpcy5idG5TaG93TmF0aXZlQWQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5zaG93TmF0aXZlQWQpO1xuICAgICAgICB0aGlzLmJ0blNob3dJbnRlckFkLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuc2hvd0ludGVyQWQpO1xuICAgICAgICB0aGlzLmJ0blJld2FyZEFkLm9uKExheWEuRXZlbnQuQ0xJQ0ssIHRoaXMsIHRoaXMuc2hvd1Jld2FyZEFkKTtcbiAgICAgICAgdGhpcy5idG5SZWRwYWNrZXQub24oTGF5YS5FdmVudC5DTElDSywgdGhpcywgdGhpcy5vcGVuUmVkcGFja2V0KTtcblxuICAgIH1cblxuICAgIC8qKumihOWKoOi9veW5v+WRiiAqL1xuICAgIGFzeW5jIHByZWxvYWRBRCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXByZWxvYWRBRC0tLS0tLS0nKVxuICAgICAgICBhd2FpdCBBZE1hbmFnZXIuSS5pbml0KCk7XG4gICAgICAgIC8vIE15QnJpZGdlLnRlc3RSZXR1cm4oZnVuY3Rpb24gKC4uLmFycmF5KSB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcIi0tLS0tLS13ZWItLS0tLS0tLW9uQ2xpY2stLS0tLT4+Y29jb3MgSlMtLS0tLS0tTXlCcmlkZ2UudGVzdFJldHVybi0tLS0tLVwiICsgSlNPTi5zdHJpbmdpZnkoYXJyYXkpKTtcblxuICAgICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICAvKirmmL7npLrlhajlsY/lub/lkYogKi9cbiAgICBzaG93RnVsbEFkKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tc2hvd0Z1bGxBZC0tLS0tLS0nKVxuICAgICAgICBBZE1hbmFnZXIuSS5zaG93RnVsbEFkKCk7XG4gICAgICAgIC8vIHZhciByZXQgPSBNeUJyaWRnZS5tYXBUb1N0cmluZyh7XG4gICAgICAgIC8vICAgICBkYXRhOiB7XG4gICAgICAgIC8vICAgICAgICAgXCJjb3VudFwiOiAyLCBcInRpdGxlXCI6IFt7IFwibmFtZVwiOiBcIm5ublwiLCBcInZhbHVlXCI6IFwibm5udmFsdWVcIiwgXCJkZWZhdWx0X3Nob3dcIjogMSB9XG4gICAgICAgIC8vICAgICAgICAgICAgICwgeyBcIm5hbWVcIjogXCJtbW1cIiwgXCJ2YWx1ZVwiOiBcIm1tbXZhbHVlXFxcImFhc2Rhc2RcIiB9XVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9KTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS13ZWItLS0tLS0tLW9uQ2xpY2stLS0tLT4+Y29jb3MgSlMtLS0tLS0tTXlCcmlkZ2UubWFwVG9TdHJpbmctLS0tLS1cIiArIEpTT04uc3RyaW5naWZ5KHJldCkpO1xuICAgIH1cbiAgICAvKirmmL7npLpiYW5uZXIgKi9cbiAgICBzaG93QmFubmVyKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tc2hvd0Jhbm5lci0tLS0tLS0nKVxuICAgICAgICBBZE1hbmFnZXIuSS5zaG93QmFubmVyKCk7XG4gICAgfVxuXG4gICAgLyoq5L+h5oGv5rWB5bm/5ZGKICovXG4gICAgc2hvd05hdGl2ZUFkKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tc2hvd05hdGl2ZUFkLS0tLS0tLScpXG4gICAgICAgIHRoaXMuTmF0aXZlQUQudmlzaWJsZSA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoq5o+S5bGP5bm/5ZGKICovXG4gICAgc2hvd0ludGVyQWQoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS1zaG93SW50ZXJBZC0tLS0tLS0nKVxuXG4gICAgICAgIEFkTWFuYWdlci5JLnNob3dJbnRlckFkKCk7XG4gICAgfVxuICAgIC8qKua/gOWKseinhumikeW5v+WRiiAqL1xuICAgIGFzeW5jIHNob3dSZXdhcmRBZCgpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNob3dSZXdhcmRBZC0tLS0tLS0nKVxuICAgICAgICBhd2FpdCBBZE1hbmFnZXIuSS5zaG93UmV3YXJkQWQoJ3ZpZGVvVHlwZScpO1xuICAgICAgICAvKirmiJDlip/lkI7miafooYzlr7nlupTnmoTlpZblirEgKi9cbiAgICB9XG4gICAgLyoq5oSP6KeB5Y+N6aaIICovXG4gICAgb3BlblNlcnZlcigpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLW9wZW5TZXJ2ZXItLS0tLS0tJylcbiAgICAgICAgQXBwU2RrLkkuZmVlZGJhY2soKTtcbiAgICB9XG5cblxuICAgIGFzeW5jIG9wZW5SZWRwYWNrZXQoKSB7XG4gICAgICAgIGxldCBib2wgPSBSZWRwYWNrZXRNb2RlbC5JLmNoZWNrUmVkcGFja2V0KCk7XG4gICAgICAgIGNvbnNvbGUubG9nKGJvbCArICfnuqLljIXojrflj5bnu5PmnpzvvJpjdXJSZWRwYWNrZXQnICsgUmVkcGFja2V0TW9kZWwuSS5jdXJSZWRwYWNrZXQpXG4gICAgICAgIGlmIChib2wpIHtcbiAgICAgICAgICAgIC8vKirlvLnlh7rnuqLljIXnmoTnlYzpnaIsICDmmoLml7blpITnkIbmiJAg55u05o6l55yL5bm/5ZGK6I635Y+W6YeR5biBICovXG4gICAgICAgICAgICBBZE1hbmFnZXIuSS5zaG93UmV3YXJkQWQoRG90S2V5LnJld2FyZF9hZCkudGhlbihhc3luYyAocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLliqDph5HluIFcIilcbiAgICAgICAgICAgICAgICBsZXQgY29pbiA9IGF3YWl0IFJlZHBhY2tldE1vZGVsLkkuYWRkQ29pbigpOyAvLyDnnIvlrozlub/lkYrojrflj5bpkrHvvIjmraTml7blt7Lnu4/liqDliLDotKbmiLfkuobvvIzmmoLmnKrmj5Dkvpvmj5DliY3nn6XpgZPojrflj5blpJrlsJHpkrHnmoTmlrnms5XvvIlcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuiOt+WPluS6humSsVwiLCBjb2luKVxuICAgICAgICAgICAgICAgIFJlZHBhY2tldE1vZGVsLkkuZ2V0UmVwYWNrZXQoKTsvL+iuoeaVsFxuICAgICAgICAgICAgICAgIC8qKuabtOaWsOWfuuacrOaYvuekuiAqL1xuICAgICAgICAgICAgICAgIEV2ZW50Q2VudGVyLmVtaXQoRXZlbnRFbnVtLlVQREFURV9DT0lOKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvblZpZGVvIGVycm9yXCIpXG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIH1cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ+e6ouWMheiOt+WPlue7k+aenO+8micgKyBKU09OLnN0cmluZ2lmeShkYXRhKSlcbiAgICAgICAgLy8gVmlld01hbmFnZXIuSS5vcGVuUG9wd2luKFJlZHBhY2tldFBvcHdpbiwgMCk7XG4gICAgfVxuXG4gICAgLyoq5omT5byA5Liq5Lq65Lit5b+DICovXG4gICAgb3BlblBlcnNvbmFsKCkge1xuICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tb3BlblNlcnZlci0tLS0tLS0nKVxuICAgICAgICBBcHBTZGsuSS5wZXJzb25hbCgpO1xuICAgIH1cbiAgICAvKirpgoDor7flpb3lj4sgKi9cbiAgICBpbnZpdGF0aW9uKCkge1xuICAgICAgICBBcHBTZGsuSS5pbnZpdGF0aW9uKCk7XG4gICAgfVxuICAgIC8v6ZyH5YqoXG4gICAgcHJpdmF0ZSBvblZpYnJhdGUoKSB7XG4gICAgICAgIEFwcFNkay5JLnZpYnJhdGUoMClcbiAgICB9XG5cblxuICAgIGdldFByb3BzKGRhdGEpIHtcbiAgICAgICAgbGV0IGJvb3N0ZXI7XG4gICAgICAgIGxldCByZXdhcmROdW0gPSBkYXRhLm51bTtcbiAgICAgICAgbGV0IHR5cGUgPSBkYXRhLnR5cGU7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiDlpITnkIbmuLjmiI/kuK3nmoTpgZPlhbfmmL7npLpcbiAgICAgICAgICovXG4gICAgICAgIC8vIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAvLyAgICAgY2FzZSA0OlxuICAgICAgICAvLyAgICAgICAgIGJvb3N0ZXIgPSBCb29zdGVyVHlwZS5SZW1vdmU7XG4gICAgICAgIC8vICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICBjYXNlIDY6XG4gICAgICAgIC8vICAgICAgICAgYm9vc3RlciA9IEJvb3N0ZXJUeXBlLkNoYW5nZTtcbiAgICAgICAgLy8gICAgICAgICBicmVhaztcbiAgICAgICAgLy8gICAgIGNhc2UgNTpcbiAgICAgICAgLy8gICAgICAgICBib29zdGVyID0gQm9vc3RlclR5cGUuUmVmcmVzaDtcbiAgICAgICAgLy8gICAgICAgICBicmVhaztcbiAgICAgICAgLy8gICAgIGNhc2UgNzpcbiAgICAgICAgLy8gICAgICAgICBib29zdGVyID0gQm9vc3RlclR5cGUuUmFuZFJlbW92ZTtcbiAgICAgICAgLy8gICAgICAgICBicmVhaztcbiAgICAgICAgLy8gICAgIGNhc2UgMzpcbiAgICAgICAgLy8gICAgICAgICBib29zdGVyID0gQm9vc3RlclR5cGUuU3RhcjtcbiAgICAgICAgLy8gICAgICAgICBicmVhaztcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBWaWV3TWFuYWdlci5JLm9wZW5Qb3B3aW4oUmVjZWl2ZVByb3BzUG9wd2luLCBib29zdGVyLCByZXdhcmROdW0pO1xuXG4gICAgfVxuICAgIC8qKlxuICAgICAqIOeci+W5v+WRiuiOt+W+l+e6ouWMhVxuICAgICAqL1xuICAgIGFzeW5jIHdhdGNoQURDb2luKCkge1xuICAgICAgICBhd2FpdCBBZE1hbmFnZXIuSS5zaG93UmV3YXJkQWQoJ3ZpZGVvVHlwZScpO1xuICAgICAgICB0aGlzLmdldENvaW4oKTtcbiAgICB9XG4gICAgLyoq55u05o6l6I635b6X57qi5YyFICovXG4gICAgZ2V0Q29pbigpIHtcbiAgICAgICAgLy9cYuWIt+aWsOaAu+mHkeW4gVxuICAgICAgICAvLyBBcHBNYW5hZ2VyLkkucmVkcGFja2V0LmdldFJlcGFja2V0KClcbiAgICAgICAgLy8gVmlld01hbmFnZXIuSS5vcGVuUG9wd2luKFJlZFBhY2tldFJld2FyZCwgMik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkRyYXcoKSB7XG4gICAgICAgIEFwcFNkay5JLm9wZW5SZXdhcmQoKVxuICAgIH1cbn0iLCJpbXBvcnQgeyBFdmVudEVudW0gfSBmcm9tIFwiLi9FdmVudEVudW1cIjtcblxuLypcbiogbmFtZTtcbiovXG5leHBvcnQgY2xhc3MgRXZlbnRDZW50ZXIge1xuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogTGF5YS5FdmVudERpc3BhdGNoZXI7XG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0IEkoKTogTGF5YS5FdmVudERpc3BhdGNoZXIge1xuICAgICAgICB3aW5kb3dbJ2V2J10gPSB0aGlzLl9pbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlIHx8ICh0aGlzLl9pbnN0YW5jZSA9IG5ldyBMYXlhLkV2ZW50RGlzcGF0Y2hlcik7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBlbWl0KGV2ZW50OiBFdmVudEVudW0sIC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5JLmV2ZW50KGV2ZW50LnRvU3RyaW5nKCksIGFyZ3MpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgYWRkKHR5cGU6IEV2ZW50RW51bSwgY2FsbGVyOiBhbnksIGxpc3RlbmVyOiBGdW5jdGlvbiwgYXJncz86IEFycmF5PGFueT4pIHtcbiAgICAgICAgdGhpcy5JLm9uKHR5cGUudG9TdHJpbmcoKSwgY2FsbGVyLCBsaXN0ZW5lciwgYXJncyk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW1vdmUodHlwZTogRXZlbnRFbnVtLCBjYWxsZXI6IGFueSwgbGlzdGVuZXI6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMuSS5vZmYodHlwZS50b1N0cmluZygpLCBjYWxsZXIsIGxpc3RlbmVyKTtcbiAgICB9XG59IiwiZXhwb3J0IGVudW0gRXZlbnRFbnVtIHtcblxuXHRDSEVDS19SRURQQUNLRVQgPSA8YW55PidjaGVja19yZWRwYWNrZXQnLFxuXHRBUFBfU0hPVyA9IDxhbnk+J2FwcC5zaG93Jyxcblx0QVBQX0hJREUgPSA8YW55PidhcHAuaGlkZScsXG5cblxuXHRVUERBVEVfQ09JTiA9IDxhbnk+J3VwZGF0ZS5jb2luJyxcblxufSIsImltcG9ydCBUVEFkU2RrIGZyb20gXCIuL1RUQWRTZGtcIjtcclxuaW1wb3J0IHsgQXBwU2RrRGF0YSB9IGZyb20gXCIuL3Nka0RhdGEvQXBwU2RrRGF0YVwiO1xyXG5pbXBvcnQgVGVhU2RrLCB7IERvdEtleSB9IGZyb20gXCIuL1RlYVNka1wiO1xyXG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFkTWFuYWdlciB7XHJcbiAgICBwcml2YXRlIGxhc3RWaWRlb1RpbWU6IG51bWJlcjtcclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIHRoaXMucHJlbG9hZFJld2FyZEFkKCk7XHJcbiAgICAgICAgdGhpcy5wcmVsb2FkQmFubmVyKCk7XHJcbiAgICAgICAgdGhpcy5wcmVsb2FkRnVsbEFkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJlbG9hZEJhbm5lcigpIHtcclxuICAgICAgICBUVEFkU2RrLkkubG9hZEJhbm5lckV4cHJlc3NBZCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBwcmVsb2FkUmV3YXJkQWQoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLnNob3dSZXdhcmRWaWRlb0FkKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZWxvYWRGdWxsQWQoKSB7XHJcbiAgICAgICAgVFRBZFNkay5JLmxvYWRGdWxsU2NyZWVuVmlkZW9BZCgxKTtcclxuICAgIH1cclxuICAgIHByZWxvYWROYXRpdmVBZFlMSCgpIHtcclxuICAgICAgICBUVEFkU2RrLkkubG9hZE5hdGl2ZUFkWUxIKDEsIDEsIDYwMCwgMzAwLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBwcmVsb2FkSW50ZXJBZCgpIHtcclxuICAgICAgICBUVEFkU2RrLkkuc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHByZWxvYWROYXRpdmVBZCgpIHtcclxuICAgICAgICBUVEFkU2RrLkkubG9hZEZ1bGxTY3JlZW5WaWRlb0FkKDEpO1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlQWR2ZXJEaWFsb2coKSB7XHJcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25BbmRyb2lkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgVFRBZFNkay5JLmNsb3NlQWR2ZXJEaWFsb2coKVxyXG4gICAgfVxyXG4gICAgY2xvc2VBZEJhbm5lcigpIHtcclxuICAgICAgICBUVEFkU2RrLkkuY2xvc2VBZEJhbm5lcigpXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd1Jld2FyZEFkKHBvaW50OiBEb3RLZXkgfCBzdHJpbmcpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgVFRBZFNkay5JLnNob3dSZXdhcmRWaWRlb0FkKDAsIHBvaW50KTtcclxuICAgICAgICAgICAgLy8gdGhpcy5sYXN0VmlkZW9UaW1lID0gTGF5YS50aW1lci5jdXJyVGltZXI7XHJcbiAgICAgICAgICAgIC8vIHRoaXMucHJlbG9hZFJld2FyZEFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZFJld2FyZEFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcclxuICAgICAgICAgICAgLy8gLy8g5Yqg6L295r+A5Yqx6KeG6aKR5aSx6LSl6LCD55So5YWo5bGP6KeG6aKR5bm26L+U5Zue5oiQ5Yqf77yBXHJcbiAgICAgICAgICAgIC8vIHRoaXMuc2hvd0Z1bGxBZCgpLnRoZW4ocmVzID0+IHtcclxuICAgICAgICAgICAgLy8gICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzKTtcclxuICAgICAgICAgICAgLy8gfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgLy8gICAgIHRoaXMucHJlbG9hZFJld2FyZEFkKCk7XHJcbiAgICAgICAgICAgIC8vICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgICAgIC8vIH0pXHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgYXN5bmMgc2hvd0Z1bGxBZCgpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsZXQgcmV0ID0gYXdhaXQgVFRBZFNkay5JLmxvYWRGdWxsU2NyZWVuVmlkZW9BZCgpO1xyXG5cclxuICAgICAgICAgICAgVGVhU2RrLkkuZG90KERvdEtleS5mdWxsU2NyZWVuLCB7IGZyb206ICdzaG93JyB9KTtcclxuICAgICAgICAgICAgdGhpcy5wcmVsb2FkRnVsbEFkKCk7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEZ1bGxBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dJbnRlckFkKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCByZXQgPSBhd2FpdCBUVEFkU2RrLkkuc2hvd0ludGVyYWN0aW9uRXhwcmVzc0FkKCk7XHJcbiAgICAgICAgICAgIHRoaXMucHJlbG9hZEludGVyQWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5wcmVsb2FkSW50ZXJBZCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBjaGVja1ZpZGVvSW5DZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5sYXN0VmlkZW9UaW1lICYmIChMYXlhLnRpbWVyLmN1cnJUaW1lciAtIHRoaXMubGFzdFZpZGVvVGltZSA8PSAzMDAwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd0Jhbm5lcigpIHtcclxuICAgICAgICBUVEFkU2RrLkkubG9hZEJhbm5lckV4cHJlc3NBZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dOYXRpdmVBZCh4LCB5LCB3LCBoLCBwcmVsb2FkID0gMCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5sb2FkTmF0aXZlRXhwcmVzc0FkKHgsIHksIHcsIGgsIHByZWxvYWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIOS8mOmHj+axh+S/oeaBr+a1geW5v+WRilxyXG4gICAgc2hvd05hdGl2ZUFkWUxIKHgsIHksIHcsIGgsIHByZWxvYWQgPSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIFRUQWRTZGsuSS5sb2FkTmF0aXZlQWRZTEgoeCwgeSwgdywgaCwgcHJlbG9hZCk7XHJcbiAgICB9XHJcblxyXG4gICAgb3BlbkxvYWROYXRpdmVBZEV2ZW50KCkge1xyXG4gICAgICAgIFRUQWRTZGsuSS5vcGVuTG9hZE5hdGl2ZUFkRXZlbnQoKVxyXG4gICAgfVxyXG5cclxuXHJcbiAgICBzdGF0aWMgZ2V0IEkoKTogQWRNYW5hZ2VyIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0SW5zdGFuY2UuZ2V0KEFkTWFuYWdlcik7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcbmltcG9ydCBBZE1hbmFnZXIgZnJvbSBcIi4vQWRNYW5hZ2VyXCI7XG5pbXBvcnQgUmVkcGFja2V0TW9kZWwgZnJvbSBcIi4vbW9kZWwvUmVkcGFja2V0TW9kZWxcIjtcbmltcG9ydCBMdWNrRHJhd01vZGVsIGZyb20gXCIuL0x1Y2tEcmF3TW9kZWxcIjtcbmltcG9ydCB7IEFwcFNka0RhdGEgfSBmcm9tIFwiLi9zZGtEYXRhL0FwcFNka0RhdGFcIjtcbmltcG9ydCB7IEx1Y2tEcmF3RGF0YSB9IGZyb20gXCIuL3Nka0RhdGEvTHVja0RyYXdEYXRhXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwcFNkayB7XG4gICAgcHJpdmF0ZSBfd2lkdGg6IG51bWJlcjtcbiAgICBwcml2YXRlIF9oZWlnaHQ6IG51bWJlcjtcbiAgICBwcml2YXRlIF9jaGFubmVsOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBfdmVyc2lvbjogc3RyaW5nO1xuICAgIHByaXZhdGUgX2xldmVsOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBfZ2FtZUNvbmZpZzogbnVtYmVyO1xuXG4gICAgcHVibGljIHBhbmdvbGluSWQ6IHN0cmluZztcbiAgICBwdWJsaWMgYWRuZXRJZDogc3RyaW5nO1xuICAgIHB1YmxpYyB1aWQ6IG51bWJlclxuICAgIHB1YmxpYyBpc015QnJpZGdlOiBib29sZWFuXG4gICAgcHVibGljIGlzSGlkZTogYm9vbGVhblxuXG4gICAgc3RhdGljIGFzeW5jIGluaXQoKSB7XG4gICAgICAgIEFwcFNkay5JLmdldFN5c3RlbUluZm8oKVxuICAgICAgICBBcHBTZGsuSS5pbml0R2FtZUNvbmZpZygpO1xuICAgICAgICBBZE1hbmFnZXIuSS5pbml0KCk7Ly/pooTliqDovb3lub/lkYogXG4gICAgICAgIGF3YWl0IE9iamVjdEluc3RhbmNlLmdldChSZWRwYWNrZXRNb2RlbCkuaW5pdCgpO1xuICAgICAgICBMdWNrRHJhd01vZGVsLkkuaW5pdCgpO1xuICAgIH1cblxuICAgIGluaXRTZGsoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdldFVzZXJJbmZvKCk7XG4gICAgICAgICAgICByZXNvbHZlKDEpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgbXlCcmlkZ2UoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgTXlCcmlkZ2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gTXlCcmlkZ2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCcgbm8gcmVnaXN0ZXIgbXlCcmlkZ2UhISEnKVxuICAgICAgICB9XG4gICAgfVxuXG5cblxuICAgIC8qKuiOt+WPluWfuuacrOeJiOacrOS/oeaBr+S7peWPiuaJi+acuueahOmFjee9riAqL1xuICAgIGdldFN5c3RlbUluZm8oa2V5OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIGxldCByZXQgPSB0aGlzLm15QnJpZGdlLmdldFN5c3RlbUluZm8oa2V5KTtcbiAgICAgICAgbGV0IHsgdywgaCwgdmVyc2lvbk5hbWUsIGNoYW5uZWwsIHBhbmdvbGluLCBhZG5ldCwgbGV2ZWwgfSA9IEpTT04ucGFyc2UocmV0KTtcbiAgICAgICAgW3RoaXMuX3dpZHRoLCB0aGlzLl9oZWlnaHQsIHRoaXMuX3ZlcnNpb24sXG4gICAgICAgIHRoaXMuX2NoYW5uZWwsIHRoaXMucGFuZ29saW5JZCxcbiAgICAgICAgdGhpcy5hZG5ldElkLCB0aGlzLl9sZXZlbF0gPSBbdywgaCwgdmVyc2lvbk5hbWUsIGNoYW5uZWwsIHBhbmdvbGluLCBhZG5ldCwgbGV2ZWxdO1xuXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRVc2VySW5mbygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tLS0tLWdldFVzZXJJbmZv5Zue6LCDIOWJjS0tLS0tLS0tLS0tLS0tLVwiKVxuICAgICAgICAgICAgdGhpcy5teUJyaWRnZS5nZXRHYW1lVXNlckluZm8oKHJldCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tLS0tLWdldFVzZXJJbmZv5Zue6LCDLS0tLS0tLS0tLS0tLS0tXCIsIHJldClcbiAgICAgICAgICAgICAgICBsZXQgcmVzID0gSlNPTi5wYXJzZShyZXQpO1xuICAgICAgICAgICAgICAgIEFwcFNka0RhdGEuSS5pbml0RGF0YShyZXMpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoMSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIGluaXRHYW1lQ29uZmlnKCkge1xuICAgICAgICB0aGlzLl9nYW1lQ29uZmlnID0gdGhpcy5nZXRHYW1lQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog6ZyH5YqoXG4gICAgICogQHBhcmFtIGtleSAwIOefremch+WKqCAxIOmVv+mch+WKqFxuICAgICAqL1xuICAgIHZpYnJhdGUoa2V5OiBudW1iZXIgPSAwKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uub3BlblN5c3RlbUZ1bihrZXkpO1xuICAgIH1cblxuICAgIC8qKumakOiXj+WQr+WKqOWxjyAqL1xuICAgIGhpZGVTcGxhc2goKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuaGlkZVNwbGFzaCgpO1xuICAgIH1cblxuICAgIC8qKuW8ueWHuuaPkOeOsCAqL1xuICAgIHdpdGhEcmF3YWwoKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uud2l0aERyYXdhbCgpO1xuICAgIH1cbiAgICAvKirmhI/op4Hlj43ppoggKi9cbiAgICBmZWVkYmFjaygpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5mZWVkYmFjaygpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBrZXkg6buY6K6kMCDvvIznrb7liLAgMVxuICAgICAqL1xuICAgIHBlcnNvbmFsKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLnBlcnNvbmFsKCk7XG4gICAgfVxuICAgIC8qKumCgOivt+WlveWPiyovXG4gICAgaW52aXRhdGlvbigpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5pbnZpdGF0aW9uKCk7XG4gICAgfVxuXG4gICAgLyoq6YKA6K+35aW95Y+LKi9cbiAgICBvcGVuUmV3YXJkKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLm9wZW5SZXdhcmQoKTtcbiAgICB9XG4gICAgLyoq562+5YiwKi9cbiAgICBvcGVuU2lnbmluKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLm9wZW5TaW5naW4oKTtcbiAgICB9XG5cbiAgICBwdXREYXRhKGtleTogU3RyaW5nLCB2YWx1ZTogU3RyaW5nKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UucHV0RGF0YShrZXksIHZhbHVlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIGtleSAg5a2Y5pWw5o2u55qE5pe25YCZ55qE5ZSv5LiAa2V5XG4gICAgICogQHJldHVybiAg5a2Y5YKo55qE5pWw5o2uXG4gICAgICogKi9cbiAgICBnZXREYXRhKGtleTogU3RyaW5nKSB7XG4gICAgICAgIGxldCByZXQgPSB0aGlzLm15QnJpZGdlLmdldERhdGEoa2V5KTtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmV0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDojrflj5bmuLjmiI/phY3nva5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0R2FtZUNvbmZpZygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMubXlCcmlkZ2UuZ2V0R2FtZUNvbmZpZygpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuiOt+WPlua4uOaIj+mFjee9rlwiLEpTT04uc3RyaW5naWZ5KHJlc3VsdCkpXG4gICAgICAgIEx1Y2tEcmF3RGF0YS5JLmluaXREYXRhKEpTT04ucGFyc2UocmVzdWx0KVsnZHJhdyddKTsvL+i9rOebmOaVsOaNrumFjee9rlxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiDopoHmsYLlj5HmlL7ph5HluIFcbiAgICAgKiBAcGFyYW0ga2V5IDHnuqLljIVcbiAgICAgKi9cbiAgICBhc3luYyBhZGRHb2xkKGtleSA9IDEpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5teUJyaWRnZS5hZGRHb2xkKGtleSwgcmVzID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIuimgeaxguWPkeaUvumHkeW4gVwiLEpTT04uc3RyaW5naWZ5KHJlcykpXG4gICAgICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShyZXMpXG4gICAgICAgICAgICAgICAgY29uc3QgeyBjb2RlLCBkYXRhLCBtc2cgfSA9IHJlcztcbiAgICAgICAgICAgICAgICBpZiAoJzAnID09PSBjb2RlIHx8ICFjb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QobXNnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICB9XG4gICAgLyoqXG4gICAgICog6KaB5rGC5Y+R5pS+6YeR5biBIOWPr+e/u+WAjeexu+Wei1xuICAgICAqL1xuICAgIGFzeW5jIHJld2FyZEluZm8oKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMubXlCcmlkZ2UucmV3YXJkSW5mbyhyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHJlcyA9IEpTT04ucGFyc2UocmVzKVxuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29kZSwgZGF0YSwgbXNnIH0gPSByZXM7XG4gICAgICAgICAgICAgICAgaWYgKCcwJyA9PT0gY29kZSB8fCAhY29kZSkge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEuY29pbik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIOiOt+WPluWPjOWAjemHkeW4gVxuICAgICAqIEBwYXJhbSB0eXBlIDHljp/ph5HluIEgMuWPjOWAjemHkeW4gVxuICAgICAqL1xuICAgIGFzeW5jIHR3b2ZvbGRSZXdhcmQodHlwZTogbnVtYmVyID0gMSkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm15QnJpZGdlLnR3b2ZvbGRSZXdhcmQodHlwZSwgcmVzID0+IHtcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNvZGUsIGRhdGEsIG1zZyB9ID0gcmVzO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUgfHwgIWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhLmNvaW4pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKuiOt+WPluaAu+mHkeW4gSAqL1xuICAgIGFzeW5jIG15Q29pbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5teUJyaWRnZS5teUNvaW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNvZGUsIGRhdGEsIG1zZyB9ID0gcmVzO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUgfHwgIWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhWydjb2luJ10pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG1zZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgfVxuXG5cbiAgICAvKirojrflj5blvZPliY3mj5DnjrDnmoTmoaPkvY0gKi9cbiAgICBhc3luYyBtaW5XaXRoRHJhd2FsKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm15QnJpZGdlLm1pbldpdGhEcmF3YWwocmVzID0+IHtcbiAgICAgICAgICAgICAgICByZXMgPSBKU09OLnBhcnNlKHJlcylcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNvZGUsIGRhdGEsIG1zZyB9ID0gcmVzO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUgfHwgIWNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhWydtb25leSddKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChtc2cpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8qKuS4iuaKpeWfi+eCuSAqL1xuICAgIGFwcERvdExvZyhrZXk6IHN0cmluZywgdmFsdWU/KSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UuYXBwRG90TG9nKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICAvKirng63kupHmiZPngrkgKi9cbiAgICBhcHBEb3RUcmFjS2luZyhrZXk6IHN0cmluZykge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmFwcERvdFRyYWNLaW5nKGtleSk7XG4gICAgfVxuXG4gICAgc2V0Q2FsbGJhY2soZnVuTmFtZTogc3RyaW5nLCBwcmFtYXM/OiBhbnkpIHtcbiAgICAgICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLXNldENhbGxiYWNrLS0tLSB0aGlzLm15QnJpZGdlLS0tJyArIEpTT04uc3RyaW5naWZ5KHRoaXMubXlCcmlkZ2UpKVxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5teUJyaWRnZVtmdW5OYW1lXShwcmFtYXMsIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHsgY29kZSwgZGF0YSB9ID0gSlNPTi5wYXJzZShyZXMpO1xuICAgICAgICAgICAgICAgIGlmICgnMCcgPT09IGNvZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBjbG9zZUFkdmVyRGlhbG9nKCkge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmNsb3NlQWR2ZXJEaWFsb2coKTtcbiAgICB9XG4gICAgY2xvc2VBZEJhbm5lcigpIHtcbiAgICAgICAgdGhpcy5teUJyaWRnZS5jbG9zZUFkQmFubmVyKCk7XG4gICAgfVxuICAgIC8qKua/gOWKseinhumikSAqL1xuICAgIHNob3dSZXdhcmRWaWRlb0FkKHZhbHVlOiBJVmlkZW8sIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uuc2hvd1Jld2FyZFZpZGVvQWQodmFsdWUsIEpCQ2FsbGJhY2spXG4gICAgfVxuICAgIC8qKiDlhajlsY/lub/lkYoqL1xuICAgIGxvYWRGdWxsU2NyZWVuVmlkZW9BZChkYXRhOiBhbnksIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UubG9hZEZ1bGxTY3JlZW5WaWRlb0FkKGRhdGEsIEpCQ2FsbGJhY2spXG4gICAgfVxuICAgIC8qKuS/oeaBr+a1geW5v+WRiiAqL1xuICAgIGxvYWROYXRpdmVFeHByZXNzQWQoZGF0YTogYW55LCBKQkNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmxvYWROYXRpdmVFeHByZXNzQWQoZGF0YSwgSkJDYWxsYmFjaylcbiAgICB9XG4gICAgLyoq5L+h5oGv5rWB5bm/5ZGKLSDkvJjph4/msYcgKi9cbiAgICBsb2FkTmF0aXZlQWRZTEgoZGF0YTogYW55LCBKQkNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm15QnJpZGdlLmxvYWROYXRpdmVBZChkYXRhLCBKQkNhbGxiYWNrKVxuICAgIH1cbiAgICAvLyDmiZPlvIDkv6Hmga/mtYEt5LyY6YeP5rGHXG4gICAgb3BlbkxvYWROYXRpdmVBZEV2ZW50KCl7XG4gICAgICAgIHRoaXMubXlCcmlkZ2Uub3BlbkxvYWROYXRpdmVBZEV2ZW50KClcbiAgICB9XG4gICAgLyoqYmFubmVyICovXG4gICAgbG9hZEJhbm5lckV4cHJlc3NBZChkYXRhOiBhbnksIEpCQ2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlCcmlkZ2UubG9hZEJhbm5lckV4cHJlc3NBZChkYXRhLCBKQkNhbGxiYWNrKVxuICAgIH1cbiAgICAvKirmj5LlsY/lub/lkYogKi9cbiAgICBzaG93SW50ZXJhY3Rpb25FeHByZXNzQWQoZGF0YTogYW55LCBKQkNhbGxiYWNrOiBGdW5jdGlvbikge1xuICAgICAgICB0aGlzLm15QnJpZGdlLnNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZChkYXRhLCBKQkNhbGxiYWNrKVxuICAgIH1cblxuICAgIGdldCBsZXZlbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xldmVsO1xuICAgIH1cbiAgICBnZXQgd2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aWR0aDtcbiAgICB9XG5cbiAgICBnZXQgaGVpZ2h0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0O1xuICAgIH1cblxuICAgIGdldCB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgICB9XG5cbiAgICBnZXQgY2hhbm5lbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoYW5uZWw7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldCBicmlkZ2UoKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGdldCBnYW1lQ29uZmlnKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2FtZUNvbmZpZztcblxuICAgIH1cbiAgICBzdGF0aWMgZ2V0IEkoKTogQXBwU2RrIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChBcHBTZGspO1xuICAgIH1cblxuICAgIFxufVxuLy8gICAgIC8v6L+Z6YeM5piv5rWP6KeI5Zmo546v5aKD5LiL77yMIOaOpeaUtndlYuS8oOi/h+adpeeahOa2iOaBr1xud2luZG93Lm9uTXlCcmlkZ2VSZWFkeSA9ICgpID0+IHtcbiAgICBBcHBTZGsuSS5pc015QnJpZGdlID0gdHJ1ZTtcbiAgICBjb25zb2xlLmxvZyhcIm9uTXlCcmlkZ2VSZWFkeSBsb2FkIGZpbmlzaCwgY29zdDpcIiArIChuZXcgRGF0ZSgpLmdldFRpbWUoKSkgKyBcIm1zXCIpO1xuICAgIE15QnJpZGdlLkFwcC5vblJlc3VtZSA9ICguLi5yZXQpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJyAgICAgbGF5YSBvblJlc3VtZScsIHJldClcbiAgICB9XG4gICAgTXlCcmlkZ2UuQXBwLm9uUGF1c2UgPSAoLi4ucmV0KSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcgICAgbGF5YSBvblBhdXNlJywgcmV0KVxuICAgIH1cbn1cblxuaW50ZXJmYWNlIElWaWRlbyB7XG4gICAgcHJlbG9hZGluZzogbnVtYmVyLFxuICAgIHR5cGU6IG51bWJlcixcbn0iLCJcbmltcG9ydCBBcHBTZGsgZnJvbSBcIi4vQXBwU2RrXCI7XG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcbmltcG9ydCBEYXRlVXRpbHMgZnJvbSBcIi4uL3VpdGwvRGF0ZVV0aWxzXCI7XG5cbi8qKui9rOebmCDojrflj5bovaznm5jmnLrkvJrnmoQgKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEx1Y2tEcmF3TW9kZWwge1xuICAgIHByaXZhdGUgX2RhdGE6IEx1Y2tEcmF3RGF0YTtcblxuICAgIHByaXZhdGUgcHJvcFJlbW92ZTogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIHByb3BDaGFuZ2U6IG51bWJlciA9IDA7XG4gICAgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IGF3YWl0IHRoaXMuaW5pdERhdGEoKTtcbiAgICAgICAgQXBwU2RrLkkucHV0RGF0YSgnbHVja0RyYXdQcm9wJywgSlNPTi5zdHJpbmdpZnkoeyByZW1vdmU6IDAsIGNoYW5nZTogMCB9KSlcbiAgICAgICAgQXBwU2RrLkkucHV0RGF0YSgnTHVja0RyYXdUb1NpZ24nLCBKU09OLnN0cmluZ2lmeSh7IGlzdG9TaWduaW46IDAgfSkpXG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdERhdGEoKSB7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IEx1Y2tEcmF3RGF0YTtcbiAgICAgICAgbGV0IGxhc3RUaW1lID0gTGF5YS5Mb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnTHVja0RyYXdMYXN0VGltZScpIHx8ICcwJztcbiAgICAgICAgZGF0YS5sdWNrRHJhd0xhc3RUaW1lID0gcGFyc2VJbnQobGFzdFRpbWUpO1xuICAgICAgICBsZXQgbGFzdCA9IERhdGVVdGlscy50aW1lRGF5KGRhdGEubHVja0RyYXdMYXN0VGltZSk7XG4gICAgICAgIGxldCB0b2RheSA9IERhdGVVdGlscy50b2RheTtcbiAgICAgICAgaWYgKGxhc3QgIT0gdG9kYXkpIHtcbiAgICAgICAgICAgIGxhc3RUaW1lID0gRGF0ZVV0aWxzLm5vd1RpbWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oJ0x1Y2tEcmF3TGFzdFRpbWUnLCBsYXN0VGltZSk7XG4gICAgICAgICAgICBkYXRhLmx1Y2tEcmF3TGFzdFRpbWUgPSBwYXJzZUludChsYXN0VGltZSk7XG4gICAgICAgICAgICAvKirliJ3lp4vljJbmlbDmja5cbiAgICAgICAgICAgICAqIDEg562+5YiwXG4gICAgICAgICAgICAgKiAyIOinhumikVxuICAgICAgICAgICAgICogMyDmkYfkuIDmkYdcbiAgICAgICAgICAgICAqIDQg57qi5YyFXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGRhdGEubGlzdCA9IFtdO1xuICAgICAgICAgICAgbGV0IGxpc3QgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCA0OyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBuZXcgTHVja0RyYXdWbztcbiAgICAgICAgICAgICAgICBpdGVtLnR5cGUgPSBpbmRleCArIDE7XG4gICAgICAgICAgICAgICAgaXRlbS5udW0gPSAwO1xuICAgICAgICAgICAgICAgIGl0ZW0uaXNVc2UgPSAwO1xuICAgICAgICAgICAgICAgIGl0ZW0udXNlTnVtID0gMDtcbiAgICAgICAgICAgICAgICBsaXN0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhLmxpc3QgPSBsaXN0O1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbHVja0RyYXdEYXRhOiBhbnkgPSBhd2FpdCBBcHBTZGsuSS5nZXREYXRhKCdMdWNrRHJhd0RhdGEnKTtcbiAgICAgICAgICAgIGlmIChsdWNrRHJhd0RhdGEpXG4gICAgICAgICAgICAgICAgZGF0YS5saXN0ID0gbHVja0RyYXdEYXRhLmxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgQXBwU2RrLkkucHV0RGF0YSgnTHVja0RyYXdEYXRhJywgSlNPTi5zdHJpbmdpZnkoZGF0YSkpXG4gICAgICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgZ2V0IGRhdGEoKTogTHVja0RyYXdEYXRhIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGE7XG4gICAgfVxuXG4gICAgdXBkYXRlRGF0YShpbmRleDogbnVtYmVyLCBhZGROdW06IG51bWJlciA9IDEpIHtcbiAgICAgICAgaWYodGhpcy5kYXRhKXtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5saXN0W2luZGV4XS5udW0gKz0gYWRkTnVtO1xuICAgICAgICAgICAgQXBwU2RrLkkucHV0RGF0YSgnTHVja0RyYXdEYXRhJywgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhKSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGdldFByb3BEYXRhKCkge1xuICAgICAgICBsZXQgbHVja0RyYXdQcm9wOiBhbnkgPSBhd2FpdCBBcHBTZGsuSS5nZXREYXRhKCdsdWNrRHJhd1Byb3AnKTtcbiAgICAgICAgY29uc29sZS5sb2coJyAgICAtLS0tLS0teXl5eXkgbGF5YSBsdWNrRHJhd1Byb3AgJyArIEpTT04uc3RyaW5naWZ5KGx1Y2tEcmF3UHJvcCkpXG4gICAgICAgIHRoaXMucHJvcFJlbW92ZSA9IE51bWJlcihsdWNrRHJhd1Byb3AucmVtb3ZlKTtcbiAgICAgICAgdGhpcy5wcm9wQ2hhbmdlID0gTnVtYmVyKGx1Y2tEcmF3UHJvcC5jaGFuZ2UpO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3BSZW1vdmUgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlbW92ZVByb3AoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ2hhbmdlUHJvcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsdWNrRHJhd1Byb3A7XG4gICAgfVxuXG4gICAgYXN5bmMgdXBkYXRlUmVtb3ZlUHJvcCgpIHtcbiAgICAgICAgaWYgKHRoaXMucHJvcFJlbW92ZSA+IDApIHtcbiAgICAgICAgICAgIC8qIOWkhOeQhuiOt+W+l+esrDHkuKrpgZPlhbcqL1xuICAgICAgICAgICAgdGhpcy5wcm9wUmVtb3ZlID0gMDtcbiAgICAgICAgICAgIEFwcFNkay5JLnB1dERhdGEoJ2x1Y2tEcmF3UHJvcCcsIEpTT04uc3RyaW5naWZ5KHsgcmVtb3ZlOiAwLCBjaGFuZ2U6IHRoaXMucHJvcENoYW5nZSB9KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVDaGFuZ2VQcm9wKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9wQ2hhbmdlID4gMCkge1xuICAgICAgICAgICAgLyog5aSE55CG6I635b6X56ysMuS4qumBk+WFtyovXG4gICAgICAgICAgICB0aGlzLnByb3BDaGFuZ2UgPSAwO1xuICAgICAgICAgICAgQXBwU2RrLkkucHV0RGF0YSgnbHVja0RyYXdQcm9wJywgSlNPTi5zdHJpbmdpZnkoeyByZW1vdmU6IHRoaXMucHJvcFJlbW92ZSwgY2hhbmdlOiAwIH0pKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgSSgpOiBMdWNrRHJhd01vZGVsIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChMdWNrRHJhd01vZGVsKSBhcyBMdWNrRHJhd01vZGVsO1xuICAgIH1cbn1cblxuY2xhc3MgTHVja0RyYXdEYXRhIHtcbiAgICBsaXN0OiBMdWNrRHJhd1ZvW107XG4gICAgbHVja0RyYXdMYXN0VGltZTogbnVtYmVyO1xufVxuXG5jbGFzcyBMdWNrRHJhd1ZvIHtcbiAgICB0eXBlOiBudW1iZXI7XG4gICAgbnVtOiBudW1iZXI7XG4gICAgaXNVc2U6IG51bWJlcjtcbiAgICB1c2VOdW06IG51bWJlcjtcbn0iLCJpbXBvcnQgQWRNYW5hZ2VyIGZyb20gXCIuL0FkTWFuYWdlclwiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOYXRpdmVBZCBleHRlbmRzIExheWEuU2NyaXB0IHtcbiAgICBvbkVuYWJsZSgpOiB2b2lkIHtcbiAgICAgICAgbGV0IGdsb2JhbFBvaW50ID0gdGhpcy5pdGVtLmxvY2FsVG9HbG9iYWwoTGF5YS5Qb2ludC5FTVBUWSwgdHJ1ZSk7XG4gICAgICAgIEFkTWFuYWdlci5JLnNob3dOYXRpdmVBZChnbG9iYWxQb2ludC54LCBnbG9iYWxQb2ludC55LCB0aGlzLml0ZW0ud2lkdGgsIHRoaXMuaXRlbS5oZWlnaHQpO1xuICAgIH1cblxuICAgIG9uRGlzYWJsZSgpOiB2b2lkIHtcbiAgICAgICAgQWRNYW5hZ2VyLkkuY2xvc2VBZHZlckRpYWxvZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IGl0ZW0oKTogTGF5YS5WaWV3IHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3duZXIgYXMgYW55O1xuICAgIH1cbn0iLCJpbXBvcnQgQXBwU2RrIGZyb20gXCIuL0FwcFNka1wiO1xyXG5pbXBvcnQgVGVhU2RrLCB7IERvdEtleSB9IGZyb20gXCIuL1RlYVNka1wiO1xyXG5pbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRUQWRTZGsge1xyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBwcmVsb2FkICAwIOebtOaOpeWKoOi9ve+8mzEg6aKE5Yqg6L29XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHNob3dSZXdhcmRWaWRlb0FkKHByZWxvYWQ6IG51bWJlciA9IDAsIHBvaW50OiBzdHJpbmcgPSBEb3RLZXkucHJvbG9hZGluZykge1xyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgdHlwZTogMSxcclxuICAgICAgICAgICAgcHJlbG9hZGluZzogcHJlbG9hZCxcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgbGV0IGlzQ29tcGxldGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgQXBwU2RrLkkuc2hvd1Jld2FyZFZpZGVvQWQoZGF0YSwgcmV0ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6KeG6aKR5Zue6LCDXCIsIEpTT04uc3RyaW5naWZ5KHJldCkpXHJcbiAgICAgICAgICAgICAgICBsZXQgeyBjb2RlLCBtc2cgfSA9IEpTT04ucGFyc2UocmV0KTtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgLTE6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCgnZXJyb3InKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAvKion5pqC5peg6KeG6aKR5bm/5ZGK77yB5q+P5pelMOeCuemHjee9ricqLztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxMDI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGxldGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIDEwMTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCLop4bpopHngrnkuoblhbPpl61cIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGxldGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwi6KeG6aKR6KeC55yL5a6M6Zet5bm254K55LqG5YWz6ZetXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUZWFTZGsuSS5kb3QoRG90S2V5LnJld2FyZF9hZCwgeyBmcm9tOiBwb2ludCB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ3VuQ29tcGxldGUnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoJ+WKoOi9veWksei0pScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZWFTZGsuSS5kb3QoRG90S2V5LnJld2FyZF9hZF9mYWlsLCB7IGZyb206IHBvaW50LCBjb2RlOiBjb2RlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRGdWxsU2NyZWVuVmlkZW9BZChwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIHc6IEFwcFNkay5JLndpZHRoLFxyXG4gICAgICAgICAgICBoOiBBcHBTZGsuSS53aWR0aCAqIDkwIC8gNjAwLFxyXG4gICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxyXG4gICAgICAgICAgICB0eXBlOiAxXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIEFwcFNkay5JLmxvYWRGdWxsU2NyZWVuVmlkZW9BZChKU09OLnN0cmluZ2lmeShkYXRhKSwgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZE5hdGl2ZUV4cHJlc3NBZCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IHNjYWxlWCA9IEFwcFNkay5JLndpZHRoIC8gTGF5YS5zdGFnZS53aWR0aDtcclxuICAgICAgICBsZXQgc2NhbGVZID0gQXBwU2RrLkkuaGVpZ2h0IC8gTGF5YS5zdGFnZS5oZWlnaHQ7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIHR5cGU6IDEsXHJcbiAgICAgICAgICAgIHByZWxvYWRpbmc6IHByZWxvYWQsXHJcbiAgICAgICAgICAgIHc6IHdpZHRoICogc2NhbGVYLFxyXG4gICAgICAgICAgICBoOiBoZWlnaHQgKiBzY2FsZVksXHJcbiAgICAgICAgICAgIGxlZnQ6IHggKiBzY2FsZVgsXHJcbiAgICAgICAgICAgIHRvcDogeSAqIHNjYWxlWVxyXG4gICAgICAgIH1cclxuICAgICAgICBBcHBTZGsuSS5sb2FkTmF0aXZlRXhwcmVzc0FkKEpTT04uc3RyaW5naWZ5KGRhdGEpLCByZXMgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlcylcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWROYXRpdmVBZFlMSCh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgbGV0IHNjYWxlWCA9IEFwcFNkay5JLndpZHRoIC8gTGF5YS5zdGFnZS53aWR0aDtcclxuICAgICAgICAgICAgbGV0IHNjYWxlWSA9IEFwcFNkay5JLmhlaWdodCAvIExheWEuc3RhZ2UuaGVpZ2h0O1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIHR5cGU6IDEsXHJcbiAgICAgICAgICAgICAgICBwcmVsb2FkaW5nOiBwcmVsb2FkLFxyXG4gICAgICAgICAgICAgICAgdzogd2lkdGggKiBzY2FsZVgsXHJcbiAgICAgICAgICAgICAgICBoOiBoZWlnaHQgKiBzY2FsZVksXHJcbiAgICAgICAgICAgICAgICBsZWZ0OiB4ICogc2NhbGVYLFxyXG4gICAgICAgICAgICAgICAgYm90dG9tOiBBcHBTZGsuSS5oZWlnaHQgLSBoZWlnaHQgKiBzY2FsZVkgLSB5ICogc2NhbGVZLFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGRhdGEpKVxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhBcHBTZGsuSS5oZWlnaHQsIGhlaWdodCwgeSwgc2NhbGVZKVxyXG4gICAgICAgICAgICBBcHBTZGsuSS5sb2FkTmF0aXZlQWRZTEgoSlNPTi5zdHJpbmdpZnkoZGF0YSksIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXNvbHZlKEpTT04ucGFyc2UocmVzKSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Mb2FkTmF0aXZlQWRFdmVudCgpIHtcclxuICAgICAgICBBcHBTZGsuSS5vcGVuTG9hZE5hdGl2ZUFkRXZlbnQoKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRCYW5uZXJFeHByZXNzQWQocHJlbG9hZDogbnVtYmVyID0gMCkge1xyXG4gICAgICAgIGxldCBkYXRhID0ge1xyXG4gICAgICAgICAgICB3OiBBcHBTZGsuSS53aWR0aCxcclxuICAgICAgICAgICAgaDogQXBwU2RrLkkud2lkdGggKiA5MCAvIDYwMCxcclxuICAgICAgICAgICAgcHJlbG9hZGluZzogcHJlbG9hZCxcclxuICAgICAgICAgICAgdHlwZTogMVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICBBcHBTZGsuSS5sb2FkQmFubmVyRXhwcmVzc0FkKEpTT04uc3RyaW5naWZ5KGRhdGEpLCByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShyZXMpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZUFkdmVyRGlhbG9nKCkge1xyXG4gICAgICAgIEFwcFNkay5JLmNsb3NlQWR2ZXJEaWFsb2coKTtcclxuICAgIH1cclxuICAgIGNsb3NlQWRCYW5uZXIoKSB7XHJcbiAgICAgICAgQXBwU2RrLkkuY2xvc2VBZEJhbm5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZChwcmVsb2FkOiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgIHc6IEFwcFNkay5JLndpZHRoICogMC44LFxyXG4gICAgICAgICAgICBoOiBBcHBTZGsuSS5oZWlnaHQsXHJcbiAgICAgICAgICAgIHByZWxvYWRpbmc6IHByZWxvYWQsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBpc0NvbXBsZXRlID0gZmFsc2U7XHJcbiAgICAgICAgICAgIEFwcFNkay5JLnNob3dJbnRlcmFjdGlvbkV4cHJlc3NBZChKU09OLnN0cmluZ2lmeShkYXRhKSwgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBJKCk6IFRUQWRTZGsge1xyXG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoVFRBZFNkaykgYXMgVFRBZFNkaztcclxuICAgIH1cclxufSIsImltcG9ydCBPYmplY3RJbnN0YW5jZSBmcm9tIFwiLi4vdWl0bC9PYmplY3RJbnN0YW5jZVwiO1xyXG5pbXBvcnQgQXBwU2RrIGZyb20gXCIuL0FwcFNka1wiO1xyXG4vKipcclxuICog5LiK5oql5Z+L54K54r2H5b+XXHJcbiAqIOWFt+S9k+eahOaJk+eCuemcgOimgei3n+i/kOiQpeiBlOezu1xyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGVhU2RrIHtcclxuICAgIGRvdChrZXk6IHN0cmluZywgdmFsdWU/KSB7XHJcbiAgICAgICAgaWYgKCFMYXlhLkJyb3dzZXIub25BbmRyb2lkKSB7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gJyc7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgKHZhbHVlKSA9PSAnb2JqZWN0Jykge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgQXBwU2RrLkkuYXBwRG90TG9nKGtleSwgdmFsdWUpXHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldCBJKCk6IFRlYVNkayB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChUZWFTZGspIGFzIFRlYVNkaztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGVudW0gRG90S2V5IHtcclxuICAgIHByb2xvYWRpbmcgPSAncHJvbG9hZGluZycsICAgICAgICAgICAgICAgICAgLy/pooTliqDovb1cclxuICAgIHJld2FyZF9hZCA9ICdyZXdhcmRfYWQnLFx0XHQgICAgICAgICAgICAvL+inhumikeaJk+eCuVxyXG4gICAgcmV3YXJkX2FkX2ZhaWwgPSAnYWRfZmFpbCcsICAgICAgICAgICAgICAgICAvL+inhumikeWKoOi9veWksei0pVxyXG4gICAgZnVsbFNjcmVlbiA9ICdmdWxsU2NyZWVuJywgICAgICAgICAgICAgICAgICAvL+WFqOWxj+inhumikVxyXG4gICAgXHJcbn1cclxuIiwiaW1wb3J0IEFycmF5VXRpbHMgZnJvbSBcIi4uLy4uL3VpdGwvQXJyYXlVdGlsc1wiO1xuXG4vKlxuKiBuYW1lO1xuKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhc2VNb2RlbCB7XG4gICAgcHJvdGVjdGVkIF9kYXRhOiBhbnkgPSB7fTtcbiAgICBwcml2YXRlIHVwZGF0ZUFycjogQXJyYXk8RnVuY3Rpb24+ID0gW107XG4gICAgcHJpdmF0ZSBrZXlVcGRhdGVBcnI6IGFueSA9IHt9O1xuXG4gICAgcHVibGljIGFzeW5jIHVwZGF0ZShkYXRhOiBhbnkpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RhdGEsXG4gICAgICAgICAgICAuLi5kYXRhXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVBcnIuZm9yRWFjaChmdW5jID0+IHtcbiAgICAgICAgICAgIGZ1bmModGhpcy5fZGF0YSk7XG4gICAgICAgIH0pXG4gICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLmtleVVwZGF0ZUFycikge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gZGF0YVtrZXldO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgYXJyID0gdGhpcy5rZXlVcGRhdGVBcnJba2V5XTtcbiAgICAgICAgICAgICAgICBhcnIgJiYgYXJyLmZvckVhY2goZnVuYyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmModmFsdWUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgd2FpdEZvcihrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX2RhdGFba2V5XTtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBjYiA9IGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2ZmVXBkYXRlKGNiLCBrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25VcGRhdGUoY2IsIGtleSwgdHJ1ZSk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHVibGljIG9uVXBkYXRlKGZ1bmM6IEZ1bmN0aW9uLCBrZXk/OiBzdHJpbmcsIHJ1bjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5fZGF0YVtrZXldO1xuICAgICAgICAgICAgcnVuICYmIHZhbHVlICE9IG51bGwgJiYgZnVuYyh2YWx1ZSk7XG4gICAgICAgICAgICBsZXQgYXJyID0gdGhpcy5rZXlVcGRhdGVBcnJba2V5XTtcbiAgICAgICAgICAgICFhcnIgJiYgKHRoaXMua2V5VXBkYXRlQXJyW2tleV0gPSBhcnIgPSBbXSk7XG4gICAgICAgICAgICBhcnIucHVzaChmdW5jKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJ1biAmJiBmdW5jKHRoaXMuX2RhdGEpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBcnIucHVzaChmdW5jKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBvZmZVcGRhdGUoZnVuYzogRnVuY3Rpb24sIGtleT86IHN0cmluZykge1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBBcnJheVV0aWxzLnJlbW92ZUZyb21BcnIodGhpcy5rZXlVcGRhdGVBcnJba2V5XSwgZnVuYyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBBcnJheVV0aWxzLnJlbW92ZUZyb21BcnIodGhpcy51cGRhdGVBcnIsIGZ1bmMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFyR2FtZSgpIHtcbiAgICAgICAgdGhpcy5fZGF0YSA9IHt9O1xuICAgIH1cbn0iLCJpbXBvcnQgQmFzZU1vZGVsIGZyb20gXCIuL0Jhc2VNb2RlbFwiO1xuaW1wb3J0IEFkTWFuYWdlciBmcm9tIFwiLi4vLi4vc2RrL0FkTWFuYWdlclwiO1xuaW1wb3J0IFRlYVNkaywgeyBEb3RLZXkgfSBmcm9tIFwiLi4vLi4vc2RrL1RlYVNka1wiO1xuaW1wb3J0IHsgR29sZENvbmZpZ0RhdGEgfSBmcm9tIFwiLi4vLi4vc2RrL3Nka0RhdGEvR29sZENvbmZpZ0RhdGFcIjtcbmltcG9ydCBBZGRHb2xkRGF0YSBmcm9tIFwiLi4vLi4vc2RrL3Nka0RhdGEvQWRkR29sZERhdGFcIjtcbmltcG9ydCBEYXRlVXRpbHMgZnJvbSBcIi4uLy4uL3VpdGwvRGF0ZVV0aWxzXCI7XG5pbXBvcnQgVXRpbCwgeyBEYXRhS2V5IH0gZnJvbSBcIi4uLy4uL3VpdGwvVXRpbFwiO1xuaW1wb3J0IE9iamVjdEluc3RhbmNlIGZyb20gXCIuLi8uLi91aXRsL09iamVjdEluc3RhbmNlXCI7XG5pbXBvcnQgeyBFdmVudENlbnRlciB9IGZyb20gXCIuLi8uLi9ldmVudC9FdmVudENlbnRlclwiO1xuaW1wb3J0IHsgRXZlbnRFbnVtIH0gZnJvbSBcIi4uLy4uL2V2ZW50L0V2ZW50RW51bVwiO1xuaW1wb3J0IEFwcFNkayBmcm9tIFwiLi4vQXBwU2RrXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZHBhY2tldE1vZGVsIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgICBwcml2YXRlIE1BWCA9IDIwO1xuICAgIC8qKuW9k+WkqemihuWPlue6ouWMheeahOacgOWkp+asoeaVsCAqL1xuICAgIHByaXZhdGUgREFZX01BWF9DTlQgPSA1MDtcbiAgICBwcml2YXRlIGNvbmY6IGFueTtcbiAgICBwdWJsaWMgY3VyUmVkcGFja2V0OiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBjb25mTGVuOiBudW1iZXIgPSAwO1xuXG4gICAgLyoq5Yid5aeL5YyW57qi5YyF6YWN572uICovXG4gICAgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCLliJ3lp4vljJbnuqLljIXphY3nva5pbml0XCIpXG4gICAgICAgIGxldCBhcnIgPSBhd2FpdCBHb2xkQ29uZmlnRGF0YS5JLmdldEdvbGRDb25maWcoKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLVJlZHBhY2tldE1vZGVsLS0tLS0tLScrSlNPTi5zdHJpbmdpZnkoYXJyKSlcbiAgICAgICAgbGV0IGNhc2ggPSAwO1xuICAgICAgICB0aGlzLmNvbmYgPSB7fTtcbiAgICAgICAgYXJyLmZvckVhY2goY29uZkRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb25mW2NvbmZEYXRhLmlkXSA9IGNvbmZEYXRhO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLmluaXREYXRhKCkpO1xuICAgICAgICB0aGlzLmNvbmZMZW4gPSB0aGlzLmNvbmYubGVuZ3RoO1xuXG4gICAgfVxuXG4gICAgaW5pdERhdGEoKSB7XG4gICAgICAgIGxldCBkYXRhID0gbmV3IFJlZHBhY2tldERhdGE7XG4gICAgICAgIGxldCBsYXN0VGltZSA9IFV0aWwuSS5nZXRJdGVtKERhdGFLZXkubGFzdFRpbWUpIHx8ICcwJztcbiAgICAgICAgZGF0YS5sYXN0VGltZSA9IHBhcnNlSW50KGxhc3RUaW1lKTtcblxuICAgICAgICBsZXQgbGFzdCA9IERhdGVVdGlscy50aW1lRGF5KGRhdGEubGFzdFRpbWUpO1xuICAgICAgICBsZXQgdG9kYXkgPSBEYXRlVXRpbHMudG9kYXk7XG4gICAgICAgIGlmIChsYXN0ICE9IHRvZGF5KSB7XG4gICAgICAgICAgICBkYXRhLnRvZGF5Q250ID0gMDtcbiAgICAgICAgICAgIGxhc3RUaW1lID0gRGF0ZVV0aWxzLm5vd1RpbWUudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIFV0aWwuSS5zZXRJdGVtKERhdGFLZXkubGFzdFRpbWUsIGxhc3RUaW1lKVxuICAgICAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS50b2RheUNudCwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgdG9kYXlDbnQgPSBVdGlsLkkuZ2V0SXRlbShEYXRhS2V5LnRvZGF5Q250KSB8fCAnMCc7XG4gICAgICAgICAgICBkYXRhLnRvZGF5Q250ID0gcGFyc2VJbnQodG9kYXlDbnQpO1xuICAgICAgICB9XG4gICAgICAgIGRhdGEubGFzdFRpbWUgPSBwYXJzZUludChsYXN0VGltZSk7XG4gICAgICAgIGxldCBkYXRhQ250ID0gVXRpbC5JLmdldEl0ZW0oRGF0YUtleS5kYXRhQ05UKSB8fCAnMCc7XG4gICAgICAgIGRhdGEuY250ID0gcGFyc2VJbnQoZGF0YUNudCk7XG4gICAgICAgIGRhdGEubGlzdCA9IFtdO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBhc3luYyBjaGVja1JlZHBhY2tldCgpIHtcblxuICAgICAgICBpZiAodGhpcy5kYXRhLnRvZGF5Q250ID49IHRoaXMuREFZX01BWF9DTlQpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKEFkTWFuYWdlci5JLmNoZWNrVmlkZW9JbkNkKCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgLyoq57qi5YyF6I635Y+W5ZCO5rKh5pyJ55yL5bm/5ZGK6aKG5Y+W77yM5YaN5qyh6I635b6X57qi5YyF55qE5py65Lya77yM5LiN5Lya6I635Y+W57qi5YyF77yMIOiHquW3seS5n+WPr+S7peWkhOeQhuaIkCDlr7nlupTnmoTnuqLljIXmj5DphpLmiJbkuI3pnIDopoHov5nph4znmoTliKTmlq0gKi9cbiAgICAgICAgaWYgKHRoaXMuY3VyUmVkcGFja2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gdGhpcy5kYXRhLmNudCkgdGhpcy5kYXRhLmNudCA9IDA7XG4gICAgICAgIGxldCBjbnQgPSB0aGlzLmRhdGEuY250O1xuICAgICAgICBpZiAoY250ID49IHRoaXMuY29uZkxlbikgY250ID0gdGhpcy5jb25mTGVuIC0gMTtcbiAgICAgICAgbGV0IGRhdGEgPSB0aGlzLmNvbmZbY250ICsgMV07XG4gICAgICAgIGxldCByYW4yID0gTWF0aC5yYW5kb20oKTtcblxuICAgICAgICBpZiAoZGF0YSAmJiByYW4yIDwgZGF0YS5wZXIpIHtcbiAgICAgICAgICAgIGxldCBjYXNoID0gMC4wMDAwMDE7XG4gICAgICAgICAgICB0aGlzLmN1clJlZHBhY2tldCA9IGNhc2g7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIueci+inhumikemihue6ouWMhVwiKVxuICAgICAgICAgICAgLy8gLy8qKuW8ueWHuue6ouWMheeahOeVjOmdoiwgIOaaguaXtuWkhOeQhuaIkCDnm7TmjqXnnIvlub/lkYrojrflj5bph5HluIEgKi9cbiAgICAgICAgICAgIC8vIGF3YWl0IEFkTWFuYWdlci5JLnNob3dSZXdhcmRBZChEb3RLZXkucmV3YXJkX2FkKVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCLliqDph5HluIFcIilcbiAgICAgICAgICAgIC8vIGxldCBjb2luID0gYXdhaXQgdGhpcy5hZGRDb2luKCk7IC8vIOeci+WujOW5v+WRiuiOt+WPlumSse+8iOatpOaXtuW3sue7j+WKoOWIsOi0puaIt+S6hu+8jOaaguacquaPkOS+m+aPkOWJjeefpemBk+iOt+WPluWkmuWwkemSseeahOaWueazle+8iVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCLojrflj5bkuobpkrFcIiwgY29pbilcbiAgICAgICAgICAgIC8vIHRoaXMuZ2V0UmVwYWNrZXQoKVxuICAgICAgICAgICAgLy8gLyoq5pu05paw5Z+65pys5pi+56S6ICovXG4gICAgICAgICAgICAvLyBFdmVudENlbnRlci5lbWl0KEV2ZW50RW51bS5VUERBVEVfQ09JTik7XG5cbiAgICAgICAgICAgIC8qKiogKi9cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXRSZXBhY2tldCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmN1clJlZHBhY2tldCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmRhdGEuY250ICs9IDE7XG4gICAgICAgIHRoaXMuZGF0YS5saXN0LnB1c2godGhpcy5jdXJSZWRwYWNrZXQpO1xuICAgICAgICB0aGlzLmRhdGEubGFzdFRpbWUgPSAobmV3IERhdGUpLmdldFRpbWUoKTtcbiAgICAgICAgdGhpcy5kYXRhLnRvZGF5Q250ICs9IDE7XG4gICAgICAgXG4gICAgICAgIHRoaXMuY3VyUmVkcGFja2V0ID0gMDtcbiAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS5kYXRhQ05ULCB0aGlzLmRhdGEuY250KTtcbiAgICAgICAgVXRpbC5JLnNldEl0ZW0oRGF0YUtleS50b2RheUNudCwgdGhpcy5kYXRhLnRvZGF5Q250KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZSh0aGlzLmRhdGEpO1xuICAgIH1cblxuICAgIC8qKiAqL1xuICAgIGFzeW5jIGdldEN1clJlZHBhY2tldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3VyUmVkcGFja2V0O1xuICAgIH1cblxuICAgIGdldCBkYXRhKCk6IFJlZHBhY2tldERhdGEge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICB9XG4gICAgLyoq6I635Y+W5oC75YWx55qE6YeR5biB5pWwICovXG4gICAgYXN5bmMgZ2V0VG90YWxDb2luKCkge1xuICAgICAgICBsZXQgdG90YWxDb2luID0gYXdhaXQgQXBwU2RrLkkubXlDb2luKCk7XG4gICAgICAgIHJldHVybiB0b3RhbENvaW47XG4gICAgfVxuICAgIC8qKuiOt+WPluacrOasoeWlluWKseeahOmHkeW4geaVsCAqL1xuICAgIGFzeW5jIGFkZENvaW4oKSB7XG4gICAgICAgIGxldCBjb2luRGF0YSA9IGF3YWl0IEFkZEdvbGREYXRhLmFkZENvaW4oKTtcbiAgICAgICAgcmV0dXJuIGNvaW5EYXRhO1xuICAgIH1cblxuICAgIC8qKuiOt+WPluacgOS9juaPkOahoyAqL1xuICAgIGFzeW5jICBtaW5XaXRoRHJhd2FsKCkge1xuICAgICAgICBsZXQgbWluQ29pbiA9IGF3YWl0IEFwcFNkay5JLm1pbldpdGhEcmF3YWwoKTtcbiAgICAgICAgcmV0dXJuIG1pbkNvaW47XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgSSgpOiBSZWRwYWNrZXRNb2RlbCB7XG4gICAgICAgIHJldHVybiBPYmplY3RJbnN0YW5jZS5nZXQoUmVkcGFja2V0TW9kZWwpIGFzIFJlZHBhY2tldE1vZGVsO1xuICAgIH1cbn1cblxuY2xhc3MgUmVkcGFja2V0RGF0YSB7XG4gICAgY250OiBudW1iZXI7XG4gICAgbGlzdDogQXJyYXk8bnVtYmVyPjtcbiAgICBsYXN0VGltZTogbnVtYmVyO1xuICAgIHRvZGF5Q250OiBudW1iZXI7XG59XG5cbmNsYXNzIFJlZHBhY2tldENvbmZpZ0RhdGEge1xuICAgIGlkOiBudW1iZXI7XG4gICAgcGVyOiBudW1iZXI7XG4gICAgY2FzaDogbnVtYmVyO1xufSIsImltcG9ydCBBcHBTZGsgZnJvbSBcIi4uL0FwcFNka1wiO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBZGRHb2xkRGF0YSB7XG4gICAgc3RhdGljIGNvaW46IHN0cmluZyA9ICcwJztcbiAgICBzdGF0aWMgbXljb2luOiBzdHJpbmcgPSAnMCc7XG4gICAgc3RhdGljIGluaXREYXRhKGRhdGE6IGFueSkge1xuICAgICAgICBpZiAoIXBhcnNlSW50KGRhdGEuY29kZSkpIHtcbiAgICAgICAgICAgIEFkZEdvbGREYXRhLmNvaW4gPSBkYXRhLmRhdGEuY29pbjtcbiAgICAgICAgICAgIEFkZEdvbGREYXRhLm15Y29pbiA9IGRhdGEuZGF0YS5teWNvaW47XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jICBhZGRDb2luKCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgQXBwU2RrLkkuYWRkR29sZCgpO1xuICAgICAgICByZXR1cm4gW3BhcnNlSW50KHJlc3VsdC5jb2luKSwgcGFyc2VJbnQocmVzdWx0Lm15Y29pbildO1xuICAgIH1cbn0iLCJpbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uLy4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcblxuLy8gc2Rr6L+U5Zue55qE55So5oi35L+h5oGvXG5leHBvcnQgY2xhc3MgQXBwU2RrRGF0YSBpbXBsZW1lbnRzIElBcHBTZGtEYXRhIHtcbiAgICBpc25ldzogbnVtYmVyID0gMDtcbiAgICB1aWQ6IG51bWJlcjtcbiAgICBvcGVuaWQ6IHN0cmluZztcbiAgICBuaWNrbmFtZTogc3RyaW5nO1xuICAgIGhlYWRpbWd1cmw6IHN0cmluZztcbiAgICBpbml0RGF0YShkYXRhOiBhbnkpIHtcbiAgICAgICAgbGV0IGQgPWRhdGEuZGF0YTtcbiAgICAgICAgY29uc3QgeyBpc25ldywgdWlkLCBvcGVuaWQsIG5pY2tuYW1lLCBoZWFkaW1ndXJsIH0gPSBkO1xuICAgICAgICBbdGhpcy5pc25ldywgdGhpcy51aWQsIHRoaXMub3BlbmlkLCB0aGlzLm5pY2tuYW1lLCB0aGlzLmhlYWRpbWd1cmxdID0gW2lzbmV3LCB1aWQsIG9wZW5pZCwgbmlja25hbWUsIGhlYWRpbWd1cmxdO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgSSgpOiBBcHBTZGtEYXRhIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChBcHBTZGtEYXRhKSBhcyBBcHBTZGtEYXRhO1xuICAgIH1cbn1cblxuXG5cbmludGVyZmFjZSBJQXBwU2RrRGF0YSB7XG4gICAgaXNuZXc6IG51bWJlcjtcbiAgICB1aWQ6IG51bWJlcjtcbiAgICBvcGVuaWQ6IHN0cmluZztcbiAgICBuaWNrbmFtZTogc3RyaW5nO1xuICAgIGhlYWRpbWd1cmw6IHN0cmluZztcbn0iLCJpbXBvcnQgVXRpbCBmcm9tIFwiLi4vLi4vdWl0bC9VdGlsXCI7XHJcbmltcG9ydCBBcHBTZGsgZnJvbSBcIi4uL0FwcFNka1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEdvbGRDb25maWdEYXRhIHtcclxuICAgIGFkOiBPYmplY3Q7XHJcbiAgICBhZG5ldDogc3RyaW5nO1xyXG4gICAgYXBwX25hbWU6IHN0cmluZztcclxuICAgIGNvaW5fY29uZmlnOiBzdHJpbmcgPSAnJztcclxuICAgIGdhbWVVcmw6IHN0cmluZztcclxuICAgIGt1YWlfYXBwX25hbWU6IHN0cmluZztcclxuICAgIHBhbmdvbGluOiBzdHJpbmc7XHJcbiAgICB0VHVyYm9BZ2VudDogc3RyaW5nO1xyXG4gICAgdGVhQWdlbnQ6IG51bWJlcjtcclxuICAgIHRyYWNraW5nOiBzdHJpbmc7XHJcbiAgICB0dEFwcExvZzogc3RyaW5nO1xyXG4gICAgdW1pZDogc3RyaW5nO1xyXG4gICAgZ2FtZUNvbmZpZzogYW55O1xyXG5cclxuICAgIGNvZGU6IG51bWJlciA9IC0zO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEdvbGRDb25maWdEYXRhID0gbnVsbDtcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJKCk6IEdvbGRDb25maWdEYXRhIHtcclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpXHJcbiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgR29sZENvbmZpZ0RhdGEoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZTtcclxuICAgIH1cclxuICAgIGluaXREYXRhKGRhdGEpIHtcclxuICAgICAgICB0aGlzLmNvZGUgPSBkYXRhLmNvZGU7XHJcbiAgICAgICAgaWYgKCFkYXRhLmNvZGUpIHtcclxuICAgICAgICAgICAgZGF0YSA9IGRhdGEuZGF0YTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRhdGFba2V5XTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBlbGU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2V0R29sZENvbmZpZygpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55Pihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBBcHBTZGsuSS5nYW1lQ29uZmlnO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnSnNvbiA9IGF3YWl0IHRoaXMubG9hZEdvbGRDZmcocmVzdWx0Wydjb2luX2NvbmZpZyddWzBdKTtcclxuICAgICAgICAgICAgICAgIHJlc29sdmUoY29uZmlnSnNvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkR29sZENmZyhyZXM6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBjb25maWdKc29uID0gYXdhaXQgVXRpbC5JLmxvYWQocmVzKTtcclxuICAgICAgICByZXR1cm4gY29uZmlnSnNvbjtcclxuICAgIH1cclxufVxyXG4iLCJpbXBvcnQgT2JqZWN0SW5zdGFuY2UgZnJvbSBcIi4uLy4uL3VpdGwvT2JqZWN0SW5zdGFuY2VcIjtcbmltcG9ydCBVdGlsIGZyb20gXCIuLi8uLi91aXRsL1V0aWxcIjtcblxuXG5leHBvcnQgY2xhc3MgTHVja0RyYXdEYXRhIGltcGxlbWVudHMgSVR1cm5DZmcge1xuICAgIHJlZF90dXJudGFibGVfdGltZXM6IG51bWJlcjtcbiAgICByZWRfdHVybnRhYmxlX2NvbmZpZzogSVR1cm5DZWxsQ2ZnO1xuICAgIHNoYWtlX3R1cm50YWJsZV9jb25maWc6IElUdXJuQ2VsbENmZztcbiAgICBzaGFrZV90dXJudGFibGVfdGltZXM6IG51bWJlcjtcbiAgICBzdGF0aWMgZ2V0IEkoKTogTHVja0RyYXdEYXRhIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdEluc3RhbmNlLmdldChMdWNrRHJhd0RhdGEpIGFzIEx1Y2tEcmF3RGF0YTtcbiAgICB9XG4gICAgYXN5bmMgaW5pdERhdGEoZGF0YTogSVR1cm5DZmcpIHtcbiAgICAgICAgY29uc3QgeyByZWRfdHVybnRhYmxlX3RpbWVzLCByZWRfdHVybnRhYmxlX2NvbmZpZyxcbiAgICAgICAgICAgIHNoYWtlX3R1cm50YWJsZV9jb25maWcsIHNoYWtlX3R1cm50YWJsZV90aW1lcyB9ID0gZGF0YTtcblxuICAgICAgICBbdGhpcy5yZWRfdHVybnRhYmxlX3RpbWVzLCB0aGlzLnJlZF90dXJudGFibGVfY29uZmlnLCB0aGlzLnNoYWtlX3R1cm50YWJsZV9jb25maWcsIHRoaXMuc2hha2VfdHVybnRhYmxlX3RpbWVzXSA9IFtyZWRfdHVybnRhYmxlX3RpbWVzLCByZWRfdHVybnRhYmxlX2NvbmZpZyxcbiAgICAgICAgICAgIHNoYWtlX3R1cm50YWJsZV9jb25maWcsIHNoYWtlX3R1cm50YWJsZV90aW1lc107XG4gICAgfVxuXG5cbiAgICBhc3luYyBsb2FkR29sZENmZyhyZXM6IHN0cmluZykge1xuICAgICAgICBsZXQgY29uZmlnSnNvbiA9IGF3YWl0IFV0aWwuSS5sb2FkKHJlcyk7XG4gICAgICAgIHJldHVybiBjb25maWdKc29uO1xuICAgIH1cbn1cbmludGVyZmFjZSBJVHVybkNmZyB7XG4gICAgcmVkX3R1cm50YWJsZV90aW1lczogbnVtYmVyO1xuICAgIHJlZF90dXJudGFibGVfY29uZmlnOiBJVHVybkNlbGxDZmc7XG4gICAgc2hha2VfdHVybnRhYmxlX2NvbmZpZzogSVR1cm5DZWxsQ2ZnO1xuICAgIHNoYWtlX3R1cm50YWJsZV90aW1lczogbnVtYmVyO1xufVxuXG5cbmludGVyZmFjZSBJVHVybkNlbGxDZmcge1xuICAgIGRheV9saW1pdDogbnVtYmVyO1xuICAgIHJlcXVpcmVtZW50OiBudW1iZXI7XG4gICAgdGl0bGU6IHN0cmluZ1xufVxuXG4iLCIvKipUaGlzIGNsYXNzIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IExheWFBaXJJREUsIHBsZWFzZSBkbyBub3QgbWFrZSBhbnkgbW9kaWZpY2F0aW9ucy4gKi9cbmltcG9ydCBWaWV3PUxheWEuVmlldztcclxuaW1wb3J0IERpYWxvZz1MYXlhLkRpYWxvZztcclxuaW1wb3J0IFNjZW5lPUxheWEuU2NlbmU7XG52YXIgUkVHOiBGdW5jdGlvbiA9IExheWEuQ2xhc3NVdGlscy5yZWdDbGFzcztcbmV4cG9ydCBtb2R1bGUgdWkge1xyXG4gICAgZXhwb3J0IGNsYXNzIFRlc3RTY2VuZVVJIGV4dGVuZHMgU2NlbmUge1xyXG5cdFx0cHVibGljIGJ0bkludml0ZTpMYXlhLlNwcml0ZTtcblx0XHRwdWJsaWMgYnRuU2VydmVyOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5WaWJyYXRlOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5EcmF3YWw6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blByZWxvYWRBRDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd0Jhbm5lcjpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd0Z1bGxBZDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuU2hvd05hdGl2ZUFkOkxheWEuQnV0dG9uO1xuXHRcdHB1YmxpYyBidG5TaG93SW50ZXJBZDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgYnRuUmV3YXJkQWQ6TGF5YS5CdXR0b247XG5cdFx0cHVibGljIGJ0blJlZHBhY2tldDpMYXlhLkJ1dHRvbjtcblx0XHRwdWJsaWMgTmF0aXZlQUQ6Vmlldztcblx0XHRwdWJsaWMgYnRuRHJhdzpMYXlhLkJ1dHRvbjtcbiAgICAgICAgY29uc3RydWN0b3IoKXsgc3VwZXIoKX1cclxuICAgICAgICBjcmVhdGVDaGlsZHJlbigpOnZvaWQge1xyXG4gICAgICAgICAgICBzdXBlci5jcmVhdGVDaGlsZHJlbigpO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRTY2VuZShcIlRlc3RTY2VuZVwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBSRUcoXCJ1aS5UZXN0U2NlbmVVSVwiLFRlc3RTY2VuZVVJKTtcclxufVxyIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXJyYXlVdGlscyB7XG4gICAgLyoqXG4gICAgICog56e76Zmk5YWD57SgXG4gICAgICovXG4gICAgc3RhdGljIHJlbW92ZUZyb21BcnIoYXJyOiBBcnJheTxhbnk+LCBvYmo6IGFueSkge1xuICAgICAgICBsZXQgaW5kZXggPSBhcnIuaW5kZXhPZihvYmopO1xuICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmFuZG9tRnJvbUFycihhcnI6IEFycmF5PGFueT4pIHtcbiAgICAgICAgbGV0IGluZGV4ID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXJyLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBhcnJbaW5kZXhdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIOaVsOe7hOmaj+acuuaOkuW6j1xuICAgICAqL1xuICAgIHN0YXRpYyBzaHVmZmxlKGFycjogQXJyYXk8YW55Pikge1xuICAgICAgICByZXR1cm4gYXJyLnNvcnQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCkgLSAwLjU7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBpbmRleE9mKGFyciwgY2FsbGJhY2ssIGN0eD8pIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjYWxsYmFjay5jYWxsKGN0eCwgdGhpc1tpXSwgaSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHN0YXRpYyBlYWNoKGFyciwgY2FsbGJhY2ssIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYXJyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2FsbGJhY2suY2FsbChjb250ZXh0LCBhcnJbaV0sIGksIGFycikpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgYXN5bmMgcXVldWUoYXJyKSB7XG4gICAgICAgIGxldCByZXMgPSBudWxsO1xuICAgICAgICBmb3IgKGxldCBwcm9taXNlIG9mIGFycikge1xuICAgICAgICAgICAgcmVzID0gYXdhaXQgcHJvbWlzZShyZXMpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcztcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0UmFuZG9tQXJyYXkoYXJyLCBjb3VudCkge1xuICAgICAgICBsZXQgc2h1ZmZsZWQgPSBhcnIuc2xpY2UoMCk7XG4gICAgICAgIGxldCBsZW4gPSBhcnIubGVuZ3RoO1xuICAgICAgICBsZXQgbWluID0gbGVuIC0gY291bnQsIHRlbXAsIGluZGV4O1xuICAgICAgICB3aGlsZSAobGVuLS0gPiBtaW4pIHtcbiAgICAgICAgICAgIGluZGV4ID0gTWF0aC5mbG9vcigobGVuICsgMSkgKiBNYXRoLnJhbmRvbSgpKTtcbiAgICAgICAgICAgIHRlbXAgPSBzaHVmZmxlZFtpbmRleF07XG4gICAgICAgICAgICBzaHVmZmxlZFtpbmRleF0gPSBzaHVmZmxlZFtsZW5dO1xuICAgICAgICAgICAgc2h1ZmZsZWRbbGVuXSA9IHRlbXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNodWZmbGVkLnNsaWNlKG1pbik7XG4gICAgfVxufSIsIi8qKlxuICog5pel5pyf5bel5YW357G7XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERhdGVVdGlscyB7XG4gICAgc3RhdGljIGdldCBub3coKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5ub3dUaW1lIC8gMTAwMCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldCBub3dUaW1lKCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0IHRvZGF5KCk6IHN0cmluZyB7XG4gICAgICAgIGxldCB0aW1lID0gbmV3IERhdGUodGhpcy5ub3dUaW1lKTtcbiAgICAgICAgbGV0IHllYXIgPSB0aW1lLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIGxldCBtb250aCA9IHRpbWUuZ2V0TW9udGgoKSArIDE7XG4gICAgICAgIGxldCBkYXRlID0gdGltZS5nZXREYXRlKCk7XG4gICAgICAgIHJldHVybiBgJHt5ZWFyfS0ke3RoaXMuYWRkKG1vbnRoKX0tJHt0aGlzLmFkZChkYXRlKX1gO1xuICAgIH1cblxuICAgIHN0YXRpYyB0aW1lRGF5KHRpbWVOdW06IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGxldCB0aW1lID0gbmV3IERhdGUodGltZU51bSk7XG4gICAgICAgIGxldCB5ZWFyID0gdGltZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICBsZXQgbW9udGggPSB0aW1lLmdldE1vbnRoKCkgKyAxO1xuICAgICAgICBsZXQgZGF0ZSA9IHRpbWUuZ2V0RGF0ZSgpO1xuICAgICAgICByZXR1cm4gYCR7eWVhcn0tJHt0aGlzLmFkZChtb250aCl9LSR7dGhpcy5hZGQoZGF0ZSl9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDmoLnmja7np5LmlbDmoLzlvI/ljJblrZfnrKbkuLJcbiAgICAgKiBAcGFyYW0gc2Vjb25kIOenkuaVsFxuICAgICAqIEBwYXJhbSB0eXBlIDE6MDA6MDA6MDAgICAyOnl5eXktbW0tZGQgaDptOnMgICAgMzowMDowMCAgIDQ6eHjlpKnliY3vvIx4eOWwj+aXtuWJje+8jHh45YiG6ZKf5YmNXG4gICAgICogQHJldHVyblxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZChzZWNvbmQ6IG51bWJlciwgdHlwZTogbnVtYmVyID0gMSk6IHN0cmluZyB7XG4gICAgICAgIHZhciBzdHI6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQwKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDEoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kMihzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgIHN0ciA9IHRoaXMuZ2V0Rm9ybWF0QnlTZWNvbmQzKHNlY29uZCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgc3RyID0gdGhpcy5nZXRGb3JtYXRCeVNlY29uZDQoc2Vjb25kKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICBzdHIgPSB0aGlzLmdldEZvcm1hdEJ5U2Vjb25kNShzZWNvbmQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuXG4gICAgLy8gMDogMDA6MDBcbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtYXRCeVNlY29uZDAodDogbnVtYmVyID0gMCk6IHN0cmluZyB7XG4gICAgICAgIHZhciBtaW5zdDogbnVtYmVyID0gTWF0aC5mbG9vcih0IC8gNjApO1xuICAgICAgICB2YXIgc2Vjb25kdDogbnVtYmVyID0gTWF0aC5mbG9vcih0ICUgNjApO1xuICAgICAgICB2YXIgbWluczogc3RyaW5nO1xuICAgICAgICB2YXIgc2Vuczogc3RyaW5nO1xuICAgICAgICBpZiAobWluc3QgPT0gMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChtaW5zdCA8IDEwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwXCIgKyBtaW5zdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIlwiICsgbWluc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNlY29uZHQgPT0gMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMDBcIjtcbiAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjBcIiArIHNlY29uZHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZW5zID0gXCJcIiArIHNlY29uZHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbnMgKyBcIjpcIiArIHNlbnM7XG4gICAgfVxuXG4gICAgLy8xOiAwMDowMDowMFxuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kMSh0OiBudW1iZXIgPSAwKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGhvdXJzdDogbnVtYmVyID0gTWF0aC5mbG9vcih0IC8gMzYwMCk7XG4gICAgICAgIGxldCBob3Vyczogc3RyaW5nO1xuICAgICAgICBsZXQgZGF5ID0gJyc7XG4gICAgICAgIGlmIChob3Vyc3QgPT0gMCkge1xuICAgICAgICAgICAgaG91cnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaG91cnN0IDwgMTApXG4gICAgICAgICAgICAgICAgaG91cnMgPSBcIjBcIiArIGhvdXJzdDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBoID0gaG91cnN0ICUgMjQ7XG4gICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA+PSAyNCkge1xuICAgICAgICAgICAgICAgICAgICBob3VycyA9IGggPCAxMCA/IFwiMFwiICsgaCA6ICcnICsgaDtcbiAgICAgICAgICAgICAgICAgICAgZGF5ID0gTWF0aC5mbG9vcihob3Vyc3QgLyAyNCkgKyAnZCAnO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICBob3VycyA9IGggPCAxMCA/IFwiMFwiICsgaCA6ICcnICsgaDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluc3Q6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAvIDYwKTtcbiAgICAgICAgbGV0IHNlY29uZHQ6IG51bWJlciA9IE1hdGguZmxvb3IoKHQgLSBob3Vyc3QgKiAzNjAwKSAlIDYwKTtcbiAgICAgICAgbGV0IG1pbnM6IHN0cmluZztcbiAgICAgICAgbGV0IHNlbnM6IHN0cmluZztcbiAgICAgICAgaWYgKG1pbnN0ID09IDApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobWluc3QgPCAxMCkge1xuICAgICAgICAgICAgbWlucyA9IFwiMFwiICsgbWluc3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtaW5zID0gXCJcIiArIG1pbnN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChzZWNvbmR0ID09IDApIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIjAwXCI7XG4gICAgICAgIH0gZWxzZSBpZiAoc2Vjb25kdCA8IDEwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwXCIgKyBzZWNvbmR0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VucyA9IFwiXCIgKyBzZWNvbmR0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXkgKyBob3VycyArIFwiOlwiICsgbWlucyArIFwiOlwiICsgc2VucztcbiAgICB9XG5cbiAgICAvLzM6IDAwOjAwXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQzKHQ6IG51bWJlciA9IDApOiBzdHJpbmcge1xuICAgICAgICB2YXIgaG91cnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHQgLyAzNjAwKTtcbiAgICAgICAgdmFyIG1pbnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0IC0gaG91cnN0ICogMzYwMCkgLyA2MCk7XG4gICAgICAgIHZhciBzZWNvbmR0OiBudW1iZXIgPSBNYXRoLmZsb29yKCh0IC0gaG91cnN0ICogMzYwMCkgJSA2MCk7XG4gICAgICAgIHZhciBtaW5zOiBzdHJpbmc7XG4gICAgICAgIHZhciBzZW5zOiBzdHJpbmc7XG4gICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICBtaW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKG1pbnN0IDwgMTApIHtcbiAgICAgICAgICAgIG1pbnMgPSBcIjBcIiArIG1pbnN0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWlucyA9IFwiXCIgKyBtaW5zdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICBzZW5zID0gXCIwMFwiO1xuICAgICAgICB9IGVsc2UgaWYgKHNlY29uZHQgPCAxMCkge1xuICAgICAgICAgICAgc2VucyA9IFwiMFwiICsgc2Vjb25kdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNlbnMgPSBcIlwiICsgc2Vjb25kdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWlucyArIFwiOlwiICsgc2VucztcbiAgICB9XG5cbiAgICAvLzI6eXl5eS1tbS1kZCBoOm06c1xuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kMih0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgZGF0ZTogRGF0ZSA9IG5ldyBEYXRlKHRpbWUpO1xuICAgICAgICB2YXIgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICB2YXIgbW9udGg6IG51bWJlciA9IGRhdGUuZ2V0TW9udGgoKSArIDE7IFx0Ly/ov5Tlm57nmoTmnIjku73ku44wLTEx77ybXG4gICAgICAgIHZhciBkYXk6IG51bWJlciA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICB2YXIgaG91cnM6IG51bWJlciA9IGRhdGUuZ2V0SG91cnMoKTtcbiAgICAgICAgdmFyIG1pbnV0ZTogbnVtYmVyID0gZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgIHZhciBzZWNvbmQ6IG51bWJlciA9IGRhdGUuZ2V0U2Vjb25kcygpO1xuICAgICAgICByZXR1cm4geWVhciArIFwiLVwiICsgbW9udGggKyBcIi1cIiArIGRheSArIFwiIFwiICsgaG91cnMgKyBcIjpcIiArIG1pbnV0ZSArIFwiOlwiICsgc2Vjb25kO1xuXG4gICAgfVxuXG4gICAgLy80Onh45aSp5YmN77yMeHjlsI/ml7bliY3vvIx4eOWIhumSn+WJjVxuICAgIHByaXZhdGUgc3RhdGljIGdldEZvcm1hdEJ5U2Vjb25kNCh0aW1lOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICB2YXIgdCA9IE1hdGguZmxvb3IodGltZSAvIDM2MDApO1xuICAgICAgICBpZiAodCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0ID4gMjQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0IC8gMjQpICsgXCLlpKnliY1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0ICsgXCLlsI/ml7bliY1cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRpbWUgLyA2MCkgKyBcIuWIhumSn+WJjVwiO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0QnlTZWNvbmQ1KHRpbWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIC8vIOavj+S4quaXtumXtOWNleS9jeaJgOWvueW6lOeahOenkuaVsFxuICAgICAgICB2YXIgb25lRGF5OiBudW1iZXIgPSAzNjAwICogMjQ7XG4gICAgICAgIHZhciBvbmVIb3Vyc3Q6IG51bWJlciA9IDM2MDA7XG4gICAgICAgIHZhciBvbmVNaW5zdDogbnVtYmVyID0gNjA7XG5cbiAgICAgICAgdmFyIGRheXMgPSBNYXRoLmZsb29yKHRpbWUgLyBvbmVEYXkpO1xuICAgICAgICB2YXIgaG91cnN0OiBudW1iZXIgPSBNYXRoLmZsb29yKHRpbWUgJSBvbmVEYXkgLyBvbmVIb3Vyc3QpXG4gICAgICAgIHZhciBtaW5zdDogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAtIGhvdXJzdCAqIG9uZUhvdXJzdCkgLyBvbmVNaW5zdCkgIC8vTWF0aC5mbG9vcih0aW1lICUgb25lRGF5ICUgb25lSG91cnN0IC8gb25lTWluc3QpO1xuICAgICAgICB2YXIgc2Vjb25kdDogbnVtYmVyID0gTWF0aC5mbG9vcigodGltZSAtIGhvdXJzdCAqIG9uZUhvdXJzdCkgJSBvbmVNaW5zdCkgLy90aW1lO1xuXG4gICAgICAgIHZhciBkYXlzczogc3RyaW5nID0gXCJcIjtcbiAgICAgICAgdmFyIGhvdXJzczogc3RyaW5nID0gXCJcIlxuICAgICAgICB2YXIgbWluc3M6IHN0cmluZyA9IFwiXCI7XG4gICAgICAgIHZhciBzZWNzczogc3RyaW5nID0gXCJcIlxuICAgICAgICBpZiAodGltZSA+IDApIHtcbiAgICAgICAgICAgIC8v5aSpXG4gICAgICAgICAgICBpZiAoZGF5cyA9PSAwKSB7XG4gICAgICAgICAgICAgICAgZGF5c3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgIC8v5bCP5pe2XG4gICAgICAgICAgICAgICAgaWYgKGhvdXJzdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIC8v5YiGXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2Vjc3M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWluc3MgKyBzZWNzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IGhvdXJzdCArIFwi5bCP5pe2XCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtaW5zdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vjb25kdCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmR0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNzcyA9IFwiMFwiICsgc2Vjb25kdCArIFwi56eSXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3NzID0gXCJcIiArIHNlY29uZHQgKyBcIuenklwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG91cnNzICsgc2Vjc3NcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1pbnN0IDwgMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnNzID0gXCIwXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5zcyA9IFwiXCIgKyBtaW5zdCArIFwi5YiG6ZKfXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG91cnNzICsgbWluc3M7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkYXlzcyA9IGRheXMgKyBcIuWkqVwiO1xuICAgICAgICAgICAgICAgIGlmIChob3Vyc3QgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBob3Vyc3MgPSBcIlwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChob3Vyc3QgPCAxMClcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzcyA9IFwiMFwiICsgaG91cnN0ICsgXCLlsI/ml7ZcIjtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgaG91cnNzID0gXCJcIiArIGhvdXJzdCArIFwi5bCP5pe2XCI7XG4gICAgICAgICAgICAgICAgICAgIDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRheXNzICsgaG91cnNzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGFkZChudW0pIHtcbiAgICAgICAgcmV0dXJuIG51bSA8IDEwID8gJzAnICsgbnVtIDogbnVtO1xuICAgIH1cblxuXG59XG4iLCJpbXBvcnQgT2JqZWN0UG9vbCBmcm9tIFwiLi9PYmplY3RQb29sXCI7XG5cbi8qXG4qIG5hbWU7XG4qL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JqZWN0SW5zdGFuY2Uge1xuICAgIHByaXZhdGUgc3RhdGljIGNsenMgPSBbXTtcbiAgICBwcml2YXRlIHN0YXRpYyBvYmplY3RzID0gW107XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldChjbHM6IGFueSkge1xuICAgICAgICBsZXQgaWR4ID0gdGhpcy5jbHpzLmluZGV4T2YoY2xzKTtcbiAgICAgICAgcmV0dXJuIChpZHggPj0gMCAmJiB0aGlzLm9iamVjdHNbaWR4XSkgfHwgdGhpcy5jcmVhdGUoY2xzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjcmVhdGUoY2xzOiBhbnkpIHtcbiAgICAgICAgdmFyIG9iaiA9IE9iamVjdFBvb2wucG9wKGNscyk7XG4gICAgICAgIHRoaXMub2JqZWN0cy5wdXNoKG9iaik7XG4gICAgICAgIHRoaXMuY2x6cy5wdXNoKGNscyk7XG4gICAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgT2JqZWN0UG9vbCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgY2xzQXJyID0gW107XG5cbiAgICBzdGF0aWMgcG9wKGNsczogYW55KSB7XG4gICAgICAgIGxldCBpZHggPSB0aGlzLmNsc0Fyci5pbmRleE9mKGNscyk7XG4gICAgICAgIGlmIChpZHggPCAwKSB7XG4gICAgICAgICAgICBpZHggPSB0aGlzLmNsc0Fyci5sZW5ndGg7XG4gICAgICAgICAgICB0aGlzLmNsc0Fyci5wdXNoKGNscyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGtleSA9ICdwb29sS2V5JyArIGlkeDtcbiAgICAgICAgbGV0IGl0ZW0gPSBMYXlhLlBvb2wuZ2V0SXRlbUJ5Q2xhc3Moa2V5LCBjbHMpO1xuICAgICAgICBpdGVtLnBvb2xLZXkgPSBrZXk7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgIH1cblxuICAgIHN0YXRpYyBwdXNoKGl0ZW0pIHtcbiAgICAgICAgTGF5YS5Qb29sLnJlY292ZXIoaXRlbS5wb29sS2V5LCBpdGVtKTtcbiAgICB9XG59IiwiZXhwb3J0IGRlZmF1bHQgIGNsYXNzIFNjYWxlQnV0dG9uU2NyaXB0IHtcbiBcbiAgICBwdWJsaWMgZGVsYXlUaW1lOiBudW1iZXIgPSAwO1xuICAgIHB1YmxpYyBtaW5TY2FsZTogbnVtYmVyID0gMDtcbiAgICBwcml2YXRlIG1vbmtleUJveDogTGF5YS5JbWFnZTtcblxuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICrorr7nva5vd25lcuWHveaVsO+8jOWPr+S7peebtOaOpeiOt+WPluWIsOa3u+WKoOmZhOWKoOiEmuacrOeahOe7hOS7tuWunuS+iyBcbiAgICAgKiovXG4gICAgcHVibGljIHNldCBvd25lcih2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMubW9ua2V5Qm94ID0gdmFsdWU7XG4gICAgICAgIC8v6Ieq5a6a5LmJ55qE6ISa5pys5Lya5pyJ5pe25bqP6Zeu6aKY77yM5omA5Lul5Zyo5q2k5re75Yqg5LiA5Liq5bu25pe2XG4gICAgICAgIHRoaXMubW9ua2V5Qm94LmZyYW1lT25jZSgyLCB0aGlzLCB0aGlzLm9uTG9hZGVkKTtcbiAgICAgICAgXG4gICAgfVxuXG4gICAgb25Mb2FkZWQoKTogdm9pZCB7XG4gICAgICAgLyog6K6+572u5oyJ6ZKu5Li65Y2V5oCB5oyJ6ZKuXG4gICAgICAgICoqIOWPluWAvO+8mlxuICAgICAgICAqKiAx77ya5Y2V5oCB44CC5Zu+54mH5LiN5YGa5YiH5Ymy77yM5oyJ6ZKu55qE55qu6IKk54q25oCB5Y+q5pyJ5LiA56eN44CCXG4gICAgICAgICoqIDLvvJrkuKTmgIHjgILlm77niYflsIbku6Xnq5bnm7TmlrnlkJHooqvnrYnmr5TliIflibLkuLoy6YOo5YiG77yM5LuO5LiK5ZCR5LiL77yM5L6d5qyh5Li65by56LW354q25oCB55qu6IKk44CB5oyJ5LiL5ZKM57uP6L+H5Y+K6YCJ5Lit54q25oCB55qu6IKk44CCXG4gICAgICAgICoqIDPvvJrkuInmgIHjgILlm77niYflsIbku6Xnq5bnm7TmlrnlkJHooqvnrYnmr5TliIflibLkuLoy6YOo5YiG77yM5LuO5LiK5ZCR5LiL77yM5L6d5qyh5Li65by56LW354q25oCB55qu6IKk44CB57uP6L+H54q25oCB55qu6IKk44CB5oyJ5LiL5ZKM6YCJ5Lit54q25oCB55qu6IKkXG4gICAgICAgICovXG4gICAgICAgIC8v5re75Yqg6byg5qCH5oyJ5LiL5LqL5Lu25L6m5ZCs44CC5oyJ5pe25pe257yp5bCP5oyJ6ZKu44CCXG4gICAgICAgIHRoaXMubW9ua2V5Qm94Lm9uKExheWEuRXZlbnQuTU9VU0VfRE9XTiwgdGhpcywgdGhpcy5zY2FsZVNtYWxsKTtcbiAgICAgICAgLy/mt7vliqDpvKDmoIfmiqzotbfkuovku7bkvqblkKzjgILmiqzotbfml7bov5jljp/mjInpkq7jgIJcbiAgICAgICAgdGhpcy5tb25rZXlCb3gub24oTGF5YS5FdmVudC5NT1VTRV9VUCwgdGhpcywgdGhpcy5zY2FsZUJpZyk7XG4gICAgICAgIC8v5re75Yqg6byg5qCH56a75byA5LqL5Lu25L6m5ZCs44CC56a75byA5pe26L+Y5Y6f5oyJ6ZKu44CCXG4gICAgICAgIHRoaXMubW9ua2V5Qm94Lm9uKExheWEuRXZlbnQuTU9VU0VfT1VULCB0aGlzLCB0aGlzLnNjYWxlQmlnKTtcbiAgICB9XG4gICAgXG4gICAgXG4gICAgcHJpdmF0ZSBzY2FsZVNtYWxsKCk6dm9pZHtcbiAgICAgICAgLy/nvKnlsI/oh7MwLjjnmoTnvJPliqjmlYjmnpxcbiAgICAgICAgTGF5YS5Ud2Vlbi50byh0aGlzLm1vbmtleUJveCwge3NjYWxlWDowLjgsIHNjYWxlWTogMC44fSwgMik7XG4gICAgfVxuICAgIHByaXZhdGUgc2NhbGVCaWcoKTp2b2lke1xuICAgICAgICAvL+WPmOWkp+i/mOWOn+eahOe8k+WKqOaViOaenFxuICAgICAgICBMYXlhLlR3ZWVuLnRvKHRoaXMubW9ua2V5Qm94LCB7c2NhbGVYOjEsIHNjYWxlWToxfSwgMik7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgIGNsYXNzIFV0aWwge1xuICAgIHB1YmxpYyBsb2FkKHJlcywgb25Qcm9ncmVzcz86IExheWEuSGFuZGxlcik6IFByb21pc2U8YW55PiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoc3VjLCBmYWlsKSA9PiB7XG4gICAgICAgICAgICBMYXlhLmxvYWRlci5sb2FkKHJlcywgTGF5YS5IYW5kbGVyLmNyZWF0ZSh0aGlzLCBzdWMpLCBvblByb2dyZXNzKTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gICAgICAgIExheWEuTG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCB2YWx1ZS50b1N0cmluZygpKVxuICAgIH1cbiAgICBnZXRJdGVtKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBMYXlhLkxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgfVxuICAgIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogVXRpbDtcbiAgICBwdWJsaWMgc3RhdGljIGdldCBJKCk6IFV0aWwge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IFV0aWwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGVudW0gRGF0YUtleSB7XG4gICAgY3VyX3JlZF9kYXlfbGltaXQgPSAnY3VyX3JlZF9kYXlfbGltaXQnLFxuICAgIGN1cl9zaGFrZV9kYXlfbGltaXQgPSAnY3VyX3NoYWtlX2RheV9saW1pdCcsXG4gICAgc2hha2VMYXN0VGltZSA9ICdzaGFrZUxhc3RUaW1lJyxcbiAgICBkYXRhQ05UID0gJ2RhdGFDTlQnLFxuICAgIHRvZGF5Q250ID0gJ3RvZGF5Q250JyxcbiAgICBsYXN0VGltZSA9ICdsYXN0VGltZScsXG59Il19