From 33bf238931c5915a6dd13ed0d85f0d6451004867 Mon Sep 17 00:00:00 2001 From: Not Committed Yet Date: Fri, 31 Jan 2025 18:00:00 +0000 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20update=20the=20RUM=20agent?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/check.yml | 4 +- .npmrc | 2 +- Pipfile.lock | 178 +- .../vendored/apm-rum/elastic-apm-rum.umd.js | 1462 +++++++++------ .../apm-rum/elastic-apm-rum.umd.min.js | 2 +- .../apm-rum/elastic-apm-rum.umd.min.js.map | 2 +- bun.lock | 1646 +++++++++++++++++ dprint.json | 2 +- package.json | 20 +- pip-constraints.txt | 2 +- pip-dev-requirements.txt | 2 +- pip-requirements.txt | 2 +- pnpm-lock.yaml | 388 ++-- setup.py | 4 +- 14 files changed, 2884 insertions(+), 832 deletions(-) create mode 100644 bun.lock diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 4ec7a19dc..cb6257bd1 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -97,7 +97,7 @@ jobs: run: pip install -r pip-requirements.txt - name: Install mypy + stuff required for checking the tests and setup.py run: | - pip install -c pip-constraints.txt dulwich html5lib mypy numpy pytest pytest-is-running time-machine trove-classifiers + pip install -c pip-constraints.txt dulwich html5lib mypy numpy pytest pytest-is-running time-machine trove-classifiers zopflipy zstd grep "^types-" pip-constraints.txt | xargs pip install - name: Run mypy run: mypy @@ -148,7 +148,7 @@ jobs: - name: Install requirements run: pip install -r pip-requirements.txt - name: Install Pylint + stuff required for checking the tests and setup.py - run: pip install -c pip-constraints.txt html5lib pylint pylint-pytest pytest setuptools time-machine trove-classifiers + run: pip install -c pip-constraints.txt html5lib pylint pylint-pytest pytest setuptools time-machine trove-classifiers zopflipy zstd - name: Run Pylint run: pylint -r y -d fixme . env: diff --git a/.npmrc b/.npmrc index 242170367..5527a07c0 100644 --- a/.npmrc +++ b/.npmrc @@ -1,7 +1,7 @@ hoist = false auto-install-peers = false -node-version = 18.20.5 +node-version = 18.20.6 engine-strict = true @jsr:registry = https://npm.jsr.io diff --git a/Pipfile.lock b/Pipfile.lock index 501d4276c..2e6899500 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1714,98 +1714,98 @@ }, "rapidfuzz": { "hashes": [ - "sha256:0b488b244931d0291412917e6e46ee9f6a14376625e150056fe7c4426ef28225", - "sha256:1315cd2a351144572e31fe3df68340d4b83ddec0af8b2e207cd32930c6acd037", - "sha256:1bac4873f6186f5233b0084b266bfb459e997f4c21fc9f029918f44a9eccd304", - "sha256:1cb1965a28b0fa64abdee130c788a0bc0bb3cf9ef7e3a70bf055c086c14a3d7e", - "sha256:22033677982b9c4c49676f215b794b0404073f8974f98739cb7234e4a9ade9ad", - "sha256:231c8b2efbd7f8d2ecd1ae900363ba168b8870644bb8f2b5aa96e4a7573bde19", - "sha256:25398d9ac7294e99876a3027ffc52c6bebeb2d702b1895af6ae9c541ee676702", - "sha256:2c87319b0ab9d269ab84f6453601fd49b35d9e4a601bbaef43743f26fabf496c", - "sha256:3048c6ed29d693fba7d2a7caf165f5e0bb2b9743a0989012a98a47b975355cca", - "sha256:339607394941801e6e3f6c1ecd413a36e18454e7136ed1161388de674f47f9d9", - "sha256:3794df87313dfb56fafd679b962e0613c88a293fd9bd5dd5c2793d66bf06a101", - "sha256:3857e335f97058c4b46fa39ca831290b70de554a5c5af0323d2f163b19c5f2a6", - "sha256:3871fa7dfcef00bad3c7e8ae8d8fd58089bad6fb21f608d2bf42832267ca9663", - "sha256:3f28952da055dbfe75828891cd3c9abf0984edc8640573c18b48c14c68ca5e06", - "sha256:42f4dd264ada7a9aa0805ea0da776dc063533917773cf2df5217f14eb4429eae", - "sha256:4416ca69af933d4a8ad30910149d3db6d084781d5c5fdedb713205389f535385", - "sha256:4469307f464ae3089acf3210b8fc279110d26d10f79e576f385a98f4429f7d97", - "sha256:4513dd01cee11e354c31b75f652d4d466c9440b6859f84e600bdebfccb17735a", - "sha256:45b15b8a118856ac9caac6877f70f38b8a0d310475d50bc814698659eabc1cdb", - "sha256:494eef2c68305ab75139034ea25328a04a548d297712d9cf887bf27c158c388b", - "sha256:4d0d26c7172bdb64f86ee0765c5b26ea1dc45c52389175888ec073b9b28f4305", - "sha256:4f9f12c2d0aa52b86206d2059916153876a9b1cf9dfb3cf2f344913167f1c3d4", - "sha256:51f24cb39e64256221e6952f22545b8ce21cacd59c0d3e367225da8fc4b868d8", - "sha256:54e7f442fb9cca81e9df32333fb075ef729052bcabe05b0afc0441f462299114", - "sha256:5a167344c1d6db06915fb0225592afdc24d8bafaaf02de07d4788ddd37f4bc2f", - "sha256:5b659e1e2ea2784a9a397075a7fc395bfa4fe66424042161c4bcaf6e4f637b38", - "sha256:5bb636b0150daa6d3331b738f7c0f8b25eadc47f04a40e5c23c4bfb4c4e20ae3", - "sha256:5e8ea35f2419c7d56b3e75fbde2698766daedb374f20eea28ac9b1f668ef4f74", - "sha256:5e8f93bc736020351a6f8e71666e1f486bb8bd5ce8112c443a30c77bfde0eb68", - "sha256:62171b270ecc4071be1c1f99960317db261d4c8c83c169e7f8ad119211fe7397", - "sha256:6668321f90aa02a5a789d4e16058f2e4f2692c5230252425c3532a8a62bc3424", - "sha256:6ad02bab756751c90fa27f3069d7b12146613061341459abf55f8190d899649f", - "sha256:6b01c1ddbb054283797967ddc5433d5c108d680e8fa2684cf368be05407b07e4", - "sha256:714a7ba31ba46b64d30fccfe95f8013ea41a2e6237ba11a805a27cdd3bce2573", - "sha256:76a4a11ba8f678c9e5876a7d465ab86def047a4fcc043617578368755d63a1bc", - "sha256:7864e80a0d4e23eb6194254a81ee1216abdc53f9dc85b7f4d56668eced022eb8", - "sha256:82497f244aac10b20710448645f347d862364cc4f7d8b9ba14bd66b5ce4dec18", - "sha256:84819390a36d6166cec706b9d8f0941f115f700b7faecab5a7e22fc367408bc3", - "sha256:8724a978f8af7059c5323d523870bf272a097478e1471295511cf58b2642ff83", - "sha256:8b63cb1f2eb371ef20fb155e95efd96e060147bdd4ab9fc400c97325dfee9fe1", - "sha256:8c7af25bda96ac799378ac8aba54a8ece732835c7b74cfc201b688a87ed11152", - "sha256:8dd501de6f7a8f83557d20613b58734d1cb5f0be78d794cde64fe43cfc63f5f2", - "sha256:8ed59044aea9eb6c663112170f2399b040d5d7b162828b141f2673e822093fa8", - "sha256:906f1f2a1b91c06599b3dd1be207449c5d4fc7bd1e1fa2f6aef161ea6223f165", - "sha256:92ebb7c12f682b5906ed98429f48a3dd80dd0f9721de30c97a01473d1a346576", - "sha256:99aebef8268f2bc0b445b5640fd3312e080bd17efd3fbae4486b20ac00466308", - "sha256:9a1b3ebc62d4bcdfdeba110944a25ab40916d5383c5e57e7c4a8dc0b6c17211a", - "sha256:9a52eea839e4bdc72c5e60a444d26004da00bb5bc6301e99b3dde18212e41465", - "sha256:9c6d7fea39cb33e71de86397d38bf7ff1a6273e40367f31d05761662ffda49e4", - "sha256:a53ca4d3f52f00b393fab9b5913c5bafb9afc27d030c8a1db1283da6917a860f", - "sha256:a7743cca45b4684c54407e8638f6d07b910d8d811347b9d42ff21262c7c23245", - "sha256:aaf391fb6715866bc14681c76dc0308f46877f7c06f61d62cc993b79fc3c4a2a", - "sha256:ab9eab33ee3213f7751dc07a1a61b8d9a3d748ca4458fffddd9defa6f0493c16", - "sha256:b04f29735bad9f06bb731c214f27253bd8bedb248ef9b8a1b4c5bde65b838454", - "sha256:b1472986fd9c5d318399a01a0881f4a0bf4950264131bb8e2deba9df6d8c362b", - "sha256:b1d67d67f89e4e013a5295e7523bc34a7a96f2dba5dd812c7c8cb65d113cbf28", - "sha256:b1f7efdd7b7adb32102c2fa481ad6f11923e2deb191f651274be559d56fc913b", - "sha256:b2669eafee38c5884a6e7cc9769d25c19428549dcdf57de8541cf9e82822e7db", - "sha256:ba26d87fe7fcb56c4a53b549a9e0e9143f6b0df56d35fe6ad800c902447acd5b", - "sha256:be15496e7244361ff0efcd86e52559bacda9cd975eccf19426a0025f9547c792", - "sha256:c36539ed2c0173b053dafb221458812e178cfa3224ade0960599bec194637048", - "sha256:c408f09649cbff8da76f8d3ad878b64ba7f7abdad1471efb293d2c075e80c822", - "sha256:cd340bbd025302276b5aa221dccfe43040c7babfc32f107c36ad783f2ffd8775", - "sha256:d0edecc3f90c2653298d380f6ea73b536944b767520c2179ec5d40b9145e47aa", - "sha256:d2a0f7e17f33e7890257367a1662b05fecaf56625f7dbb6446227aaa2b86448b", - "sha256:d71da0012face6f45432a11bc59af19e62fac5a41f8ce489e80c0add8153c3d1", - "sha256:d895998fec712544c13cfe833890e0226585cf0391dd3948412441d5d68a2b8c", - "sha256:d95f9e9f3777b96241d8a00d6377cc9c716981d828b5091082d0fe3a2924b43e", - "sha256:d9727b85511b912571a76ce53c7640ba2c44c364e71cef6d7359b5412739c570", - "sha256:d98a46cf07c0c875d27e8a7ed50f304d83063e49b9ab63f21c19c154b4c0d08d", - "sha256:d994cf27e2f874069884d9bddf0864f9b90ad201fcc9cb2f5b82bacc17c8d5f2", - "sha256:dc0e0d41ad8a056a9886bac91ff9d9978e54a244deb61c2972cc76b66752de9c", - "sha256:dfaefe08af2a928e72344c800dcbaf6508e86a4ed481e28355e8d4b6a6a5230e", - "sha256:e60814edd0c9b511b5f377d48b9782b88cfe8be07a98f99973669299c8bb318a", - "sha256:eb8a54543d16ab1b69e2c5ed96cabbff16db044a50eddfc028000138ca9ddf33", - "sha256:eb97c53112b593f89a90b4f6218635a9d1eea1d7f9521a3b7d24864228bbc0aa", - "sha256:ebadd5b8624d8ad503e505a99b8eb26fe3ea9f8e9c2234e805a27b269e585842", - "sha256:ec8d7d8567e14af34a7911c98f5ac74a3d4a743cd848643341fc92b12b3784ff", - "sha256:ed78c8e94f57b44292c1a0350f580e18d3a3c5c0800e253f1583580c1b417ad2", - "sha256:eea8d9e20632d68f653455265b18c35f90965e26f30d4d92f831899d6682149b", - "sha256:ef8937dae823b889c0273dfa0f0f6c46a3658ac0d851349c464d1b00e7ff4252", - "sha256:f06e3c4c0a8badfc4910b9fd15beb1ad8f3b8fafa8ea82c023e5e607b66a78e4", - "sha256:f0821b9bdf18c5b7d51722b906b233a39b17f602501a966cfbd9b285f8ab83cd", - "sha256:f0ba13557fec9d5ffc0a22826754a7457cc77f1b25145be10b7bb1d143ce84c6", - "sha256:f382fec4a7891d66fb7163c90754454030bb9200a13f82ee7860b6359f3f2fa8", - "sha256:fe7aaf5a54821d340d21412f7f6e6272a9b17a0cbafc1d68f77f2fc11009dcd5", - "sha256:ff38378346b7018f42cbc1f6d1d3778e36e16d8595f79a312b31e7c25c50bd08", - "sha256:ffa1bb0e26297b0f22881b219ffc82a33a3c84ce6174a9d69406239b14575bd5" + "sha256:00ceb8ff3c44ab0d6014106c71709c85dee9feedd6890eff77c814aa3798952b", + "sha256:018506a53c3b20dcbda8c93d4484b9eb1764c93d5ea16be103cf6b0d8b11d860", + "sha256:04283c6f3e79f13a784f844cd5b1df4f518ad0f70c789aea733d106c26e1b4fb", + "sha256:046fc67f3885d94693a2151dd913aaf08b10931639cbb953dfeef3151cb1027c", + "sha256:0666ab4c52e500af7ba5cc17389f5d15c0cdad06412c80312088519fdc25686d", + "sha256:0acbd27543b158cb915fde03877383816a9e83257832818f1e803bac9b394900", + "sha256:0b31ab59e1a0df5afc21f3109b6cfd77b34040dbf54f1bad3989f885cfae1e60", + "sha256:0d03ad14a26a477be221fddc002954ae68a9e2402b9d85433f2d0a6af01aa2bb", + "sha256:12802e5c4d8ae104fb6efeeb436098325ce0dca33b461c46e8df015c84fbef26", + "sha256:129d536740ab0048c1a06ccff73c683f282a2347c68069affae8dbc423a37c50", + "sha256:165bcdecbfed9978962da1d3ec9c191b2ff9f1ccc2668fbaf0613a975b9aa326", + "sha256:187cdb402e223264eebed2fe671e367e636a499a7a9c82090b8d4b75aa416c2a", + "sha256:1ae41361de05762c1eaa3955e5355de7c4c6f30d1ef1ea23d29bf738a35809ab", + "sha256:1b67e390261ffe98ec86c771b89425a78b60ccb610c3b5874660216fcdbded4b", + "sha256:2477da227e266f9c712f11393182c69a99d3c8007ea27f68c5afc3faf401cc43", + "sha256:27b4d440fa50b50c515a91a01ee17e8ede719dca06eef4c0cccf1a111a4cfad3", + "sha256:2cf27e8e4bf7bf9d92ef04f3d2b769e91c3f30ba99208c29f5b41e77271a2614", + "sha256:2d7d9e6a04d8344b0198c96394c28874086888d0a2b2f605f30d1b27b9377b7d", + "sha256:2d844c0587d969ce36fbf4b7cbf0860380ffeafc9ac5e17a7cbe8abf528d07bb", + "sha256:325c9c71b737fcd32e2a4e634c430c07dd3d374cfe134eded3fe46e4c6f9bf5d", + "sha256:346a2d8f17224e99f9ef988606c83d809d5917d17ad00207237e0965e54f9730", + "sha256:34dcbf5a7daecebc242f72e2500665f0bde9dd11b779246c6d64d106a7d57c99", + "sha256:3a860d103bbb25c69c2e995fdf4fac8cb9f77fb69ec0a00469d7fd87ff148f46", + "sha256:3c5ec360694ac14bfaeb6aea95737cf1a6cf805b5fe8ea7fd28814706c7fa838", + "sha256:3ecf0e6de84c0bc2c0f48bc03ba23cef2c5f1245db7b26bc860c11c6fd7a097c", + "sha256:3fe8da12ea77271097b303fa7624cfaf5afd90261002314e3b0047d36f4afd8d", + "sha256:42149e6d13bd6d06437d2a954dae2184dadbbdec0fdb82dafe92860d99f80519", + "sha256:43bb17056c5d1332f517b888c4e57846c4b5f936ed304917eeb5c9ac85d940d4", + "sha256:4a4422e4f73a579755ab60abccb3ff148b5c224b3c7454a13ca217dfbad54da6", + "sha256:4c26cd1b9969ea70dbf0dbda3d2b54ab4b2e683d0fd0f17282169a19563efeb1", + "sha256:4dc2ebad4adb29d84a661f6a42494df48ad2b72993ff43fad2b9794804f91e45", + "sha256:5620001fd4d6644a2f56880388179cc8f3767670f0670160fcb97c3b46c828af", + "sha256:5942dc4460e5030c5f9e1d4c9383de2f3564a2503fe25e13e89021bcbfea2f44", + "sha256:69f2520296f1ae1165b724a3aad28c56fd0ac7dd2e4cff101a5d986e840f02d4", + "sha256:6a98bbca18b4a37adddf2d8201856441c26e9c981d8895491b5bc857b5f780eb", + "sha256:6b5e176524653ac46f1802bdd273a4b44a5f8d0054ed5013a8e8a4b72f254599", + "sha256:6d9afad7b16d01c9e8929b6a205a18163c7e61b6cd9bcf9c81be77d5afc1067a", + "sha256:6f463c6f1c42ec90e45d12a6379e18eddd5cdf74138804d8215619b6f4d31cea", + "sha256:6f7e92fc7d2a7f02e1e01fe4f539324dfab80f27cb70a30dd63a95445566946b", + "sha256:760ac95d788f2964b73da01e0bdffbe1bf2ad8273d0437565ce9092ae6ad1fbc", + "sha256:773ab37fccf6e0513891f8eb4393961ddd1053c6eb7e62eaa876e94668fc6d31", + "sha256:7fa7b81fb52902d5f78dac42b3d6c835a6633b01ddf9b202a3ca8443be4b2d6a", + "sha256:80ff9283c54d7d29b2d954181e137deee89bec62f4a54675d8b6dbb6b15d3e03", + "sha256:82260b20bc7a76556cecb0c063c87dad19246a570425d38f8107b8404ca3ac97", + "sha256:834f6113d538af358f39296604a1953e55f8eeffc20cb4caf82250edbb8bf679", + "sha256:8389d98b9f54cb4f8a95f1fa34bf0ceee639e919807bb931ca479c7a5f2930bf", + "sha256:83dccfd5a754f2a0e8555b23dde31f0f7920601bfa807aa76829391ea81e7c67", + "sha256:841e0c2a5fbe8fc8b9b1a56e924c871899932c0ece7fbd970aa1c32bfd12d4bf", + "sha256:8499c7d963ddea8adb6cffac2861ee39a1053e22ca8a5ee9de1197f8dc0275a5", + "sha256:8dc1937198e7ff67e217e60bfa339f05da268d91bb15fec710452d11fe2fdf60", + "sha256:920733a28c3af47870835d59ca9879579f66238f10de91d2b4b3f809d1ebfc5b", + "sha256:930756639643e3aa02d3136b6fec74e5b9370a24f8796e1065cd8a857a6a6c50", + "sha256:97c885a7a480b21164f57a706418c9bbc9a496ec6da087e554424358cadde445", + "sha256:97f824c15bc6933a31d6e3cbfa90188ba0e5043cf2b6dd342c2b90ee8b3fd47c", + "sha256:9c78582f50e75e6c2bc38c791ed291cb89cf26a3148c47860c1a04d6e5379c8e", + "sha256:a66520180d3426b9dc2f8d312f38e19bc1fc5601f374bae5c916f53fa3534a7d", + "sha256:a718f740553aad5f4daef790191511da9c6eae893ee1fc2677627e4b624ae2db", + "sha256:a93c95dce8917bf428064c64024de43ffd34ec5949dd4425780c72bd41f9d969", + "sha256:a940aa71a7f37d7f0daac186066bf6668d4d3b7e7ef464cb50bc7ba89eae1f51", + "sha256:a973b3f5cabf931029a3ae4a0f72e3222e53d412ea85fc37ddc49e1774f00fbf", + "sha256:af4585e5812632c357fee5ab781c29f00cd06bea58f8882ff244cc4906ba6c9e", + "sha256:b1d4fbff980cb6baef4ee675963c081f7b5d6580a105d6a4962b20f1f880e1fb", + "sha256:b4d2d39b2e76c17f92edd6d384dc21fa020871c73251cdfa017149358937a41d", + "sha256:b572b634740e047c53743ed27a1bb3b4f93cf4abbac258cd7af377b2c4a9ba5b", + "sha256:b79286738a43e8df8420c4b30a92712dec6247430b130f8e015c3a78b6d61ac2", + "sha256:b7cba636c32a6fc3a402d1cb2c70c6c9f8e6319380aaf15559db09d868a23e56", + "sha256:b85817a57cf8db32dd5d2d66ccfba656d299b09eaf86234295f89f91be1a0db2", + "sha256:b894fa2b30cd6498a29e5c470cb01c6ea898540b7e048a0342775a5000531334", + "sha256:b8b61c558574fbc093d85940c3264c08c2b857b8916f8e8f222e7b86b0bb7d12", + "sha256:bb424ae7240f2d2f7d8dda66a61ebf603f74d92f109452c63b0dbf400204a437", + "sha256:bd47dfb1bca9673a48b923b3d988b7668ee8efd0562027f58b0f2b7abf27144c", + "sha256:bef5c91d5db776523530073cda5b2a276283258d2f86764be4a008c83caf7acd", + "sha256:bf56ea4edd69005786e6c80a9049d95003aeb5798803e7a2906194e7a3cb6472", + "sha256:c5857dda85165b986c26a474b22907db6b93932c99397c818bcdec96340a76d5", + "sha256:c6e4ed63e204daa863a802eec09feea5448617981ba5d150f843ad8e3ae071a4", + "sha256:cbdf145c7e4ebf2e81c794ed7a582c4acad19e886d5ad6676086369bd6760753", + "sha256:d60d1db1b7e470e71ae096b6456e20ec56b52bde6198e2dbbc5e6769fa6797dc", + "sha256:d6899b41bf6c30282179f77096c1939f1454836440a8ab05b48ebf7026a3b590", + "sha256:dbb7ea2fd786e6d66f225ef6eef1728832314f47e82fee877cb2a793ebda9579", + "sha256:dc3c39e0317e7f68ba01bac056e210dd13c7a0abf823e7b6a5fe7e451ddfc496", + "sha256:df7880e012228722dec1be02b9ef3898ed023388b8a24d6fa8213d7581932510", + "sha256:e1061311d07e7cdcffa92c9b50c2ab4192907e70ca01b2e8e1c0b6b4495faa37", + "sha256:e31be53d7f4905a6a038296d8b773a79da9ee9f0cd19af9490c5c5a22e37d2e5", + "sha256:ec9eaf73501c9a7de2c6938cb3050392e2ee0c5ca3921482acf01476b85a7226", + "sha256:f1187aeae9c89e838d2a0a2b954b4052e4897e5f62e5794ef42527bf039d469e", + "sha256:f6235b57ae3faa3f85cb3f90c9fee49b21bd671b76e90fc99e8ca2bdf0b5e4a3", + "sha256:fbe7580b5fb2db8ebd53819171ff671124237a55ada3f64d20fc9a149d133960", + "sha256:fd37e53f0ed239d0cec27b250cec958982a8ba252ce64aa5e6052de3a82fa8db" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==3.11.0" + "version": "==3.12.1" }, "redis": { "extras": [ diff --git a/an_website/vendored/apm-rum/elastic-apm-rum.umd.js b/an_website/vendored/apm-rum/elastic-apm-rum.umd.js index 801cdb776..f8de7f3fe 100644 --- a/an_website/vendored/apm-rum/elastic-apm-rum.umd.js +++ b/an_website/vendored/apm-rum/elastic-apm-rum.umd.js @@ -20,7 +20,7 @@ return /******/ (function() { // webpackBootstrap "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "bootstrap": function() { return /* binding */ bootstrap; } +/* harmony export */ bootstrap: function() { return /* binding */ bootstrap; } /* harmony export */ }); /* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./common/utils */ "../rum-core/dist/es/common/utils.js"); /* harmony import */ var _common_patching__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./common/patching */ "../rum-core/dist/es/common/patching/index.js"); @@ -129,11 +129,11 @@ var ApmServer = function () { } }; - this.queue = new _queue__WEBPACK_IMPORTED_MODULE_1__.default(onFlush, { + this.queue = new _queue__WEBPACK_IMPORTED_MODULE_1__["default"](onFlush, { queueLimit: queueLimit, flushInterval: flushInterval }); - this.throttleEvents = (0,_throttle__WEBPACK_IMPORTED_MODULE_2__.default)(this.queue.add.bind(this.queue), function () { + this.throttleEvents = (0,_throttle__WEBPACK_IMPORTED_MODULE_2__["default"])(this.queue.add.bind(this.queue), function () { return _this._loggingService.warn('Dropped events due to throttling!'); }, { limit: limit, @@ -333,13 +333,13 @@ var ApmServer = function () { return errors.map(function (error) { var _NDJSON$stringify; - return _ndjson__WEBPACK_IMPORTED_MODULE_10__.default.stringify((_NDJSON$stringify = {}, _NDJSON$stringify[key] = compress ? (0,_compress__WEBPACK_IMPORTED_MODULE_4__.compressError)(error) : error, _NDJSON$stringify)); + return _ndjson__WEBPACK_IMPORTED_MODULE_10__["default"].stringify((_NDJSON$stringify = {}, _NDJSON$stringify[key] = compress ? (0,_compress__WEBPACK_IMPORTED_MODULE_4__.compressError)(error) : error, _NDJSON$stringify)); }); }; _proto.ndjsonMetricsets = function ndjsonMetricsets(metricsets) { return metricsets.map(function (metricset) { - return _ndjson__WEBPACK_IMPORTED_MODULE_10__.default.stringify({ + return _ndjson__WEBPACK_IMPORTED_MODULE_10__["default"].stringify({ metricset: metricset }); }).join(''); @@ -358,7 +358,7 @@ var ApmServer = function () { if (!compress) { if (tr.spans) { spans = tr.spans.map(function (span) { - return _ndjson__WEBPACK_IMPORTED_MODULE_10__.default.stringify({ + return _ndjson__WEBPACK_IMPORTED_MODULE_10__["default"].stringify({ span: span }); }).join(''); @@ -371,7 +371,7 @@ var ApmServer = function () { } } - return _ndjson__WEBPACK_IMPORTED_MODULE_10__.default.stringify((_NDJSON$stringify2 = {}, _NDJSON$stringify2[key] = compress ? (0,_compress__WEBPACK_IMPORTED_MODULE_4__.compressTransaction)(tr) : tr, _NDJSON$stringify2)) + spans + breakdowns; + return _ndjson__WEBPACK_IMPORTED_MODULE_10__["default"].stringify((_NDJSON$stringify2 = {}, _NDJSON$stringify2[key] = compress ? (0,_compress__WEBPACK_IMPORTED_MODULE_4__.compressTransaction)(tr) : tr, _NDJSON$stringify2)) + spans + breakdowns; }); }; @@ -416,7 +416,7 @@ var ApmServer = function () { var ndjson = []; var metadata = this.createMetaData(); var metadataKey = compress ? 'm' : 'metadata'; - ndjson.push(_ndjson__WEBPACK_IMPORTED_MODULE_10__.default.stringify((_NDJSON$stringify3 = {}, _NDJSON$stringify3[metadataKey] = compress ? (0,_compress__WEBPACK_IMPORTED_MODULE_4__.compressMetadata)(metadata) : metadata, _NDJSON$stringify3))); + ndjson.push(_ndjson__WEBPACK_IMPORTED_MODULE_10__["default"].stringify((_NDJSON$stringify3 = {}, _NDJSON$stringify3[metadataKey] = compress ? (0,_compress__WEBPACK_IMPORTED_MODULE_4__.compressMetadata)(metadata) : metadata, _NDJSON$stringify3))); ndjson = ndjson.concat(this.ndjsonErrors(filteredPayload[_constants__WEBPACK_IMPORTED_MODULE_3__.ERRORS], compress), this.ndjsonTransactions(filteredPayload[_constants__WEBPACK_IMPORTED_MODULE_3__.TRANSACTIONS], compress)); var ndjsonPayload = ndjson.join(''); @@ -456,14 +456,14 @@ var ApmServer = function () { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "compressMetadata": function() { return /* binding */ compressMetadata; }, -/* harmony export */ "compressTransaction": function() { return /* binding */ compressTransaction; }, -/* harmony export */ "compressError": function() { return /* binding */ compressError; }, -/* harmony export */ "compressMetricsets": function() { return /* binding */ compressMetricsets; }, -/* harmony export */ "compressPayload": function() { return /* binding */ compressPayload; } +/* harmony export */ compressError: function() { return /* binding */ compressError; }, +/* harmony export */ compressMetadata: function() { return /* binding */ compressMetadata; }, +/* harmony export */ compressMetricsets: function() { return /* binding */ compressMetricsets; }, +/* harmony export */ compressPayload: function() { return /* binding */ compressPayload; }, +/* harmony export */ compressTransaction: function() { return /* binding */ compressTransaction; } /* harmony export */ }); /* harmony import */ var _polyfills__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./polyfills */ "../rum-core/dist/es/common/polyfills.js"); -/* harmony import */ var _performance_monitoring_capture_navigation__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../performance-monitoring/capture-navigation */ "../rum-core/dist/es/performance-monitoring/capture-navigation.js"); +/* harmony import */ var _performance_monitoring_navigation_marks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../performance-monitoring/navigation/marks */ "../rum-core/dist/es/performance-monitoring/navigation/marks.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "../rum-core/dist/es/common/utils.js"); @@ -587,8 +587,8 @@ function compressNavigationTimingMarks(ntMarks) { } var compressed = {}; - _performance_monitoring_capture_navigation__WEBPACK_IMPORTED_MODULE_0__.COMPRESSED_NAV_TIMING_MARKS.forEach(function (mark, index) { - var mapping = _performance_monitoring_capture_navigation__WEBPACK_IMPORTED_MODULE_0__.NAVIGATION_TIMING_MARKS[index]; + _performance_monitoring_navigation_marks__WEBPACK_IMPORTED_MODULE_0__.COMPRESSED_NAV_TIMING_MARKS.forEach(function (mark, index) { + var mapping = _performance_monitoring_navigation_marks__WEBPACK_IMPORTED_MODULE_0__.NAVIGATION_TIMING_MARKS[index]; compressed[mark] = ntMarks[mapping]; }); return compressed; @@ -679,6 +679,7 @@ function compressTransaction(transaction) { }); var tr = { id: transaction.id, + pid: transaction.parent_id, tid: transaction.trace_id, n: transaction.name, t: transaction.type, @@ -751,34 +752,16 @@ function compressMetricsets(breakdowns) { return breakdowns.map(function (_ref) { var span = _ref.span, samples = _ref.samples; - var isSpan = span != null; - - if (isSpan) { - return { - y: { - t: span.type - }, - sa: { - ysc: { - v: samples['span.self_time.count'].value - }, - yss: { - v: samples['span.self_time.sum.us'].value - } - } - }; - } - return { + y: { + t: span.type + }, sa: { - xdc: { - v: samples['transaction.duration.count'].value + ysc: { + v: samples['span.self_time.count'].value }, - xds: { - v: samples['transaction.duration.sum.us'].value - }, - xbc: { - v: samples['transaction.breakdown.count'].value + yss: { + v: samples['span.self_time.sum.us'].value } } }; @@ -903,6 +886,7 @@ var Config = function () { pageLoadTraceId: '', pageLoadSpanId: '', pageLoadSampled: false, + pageLoadParentId: '', pageLoadTransactionName: '', propagateTracestate: false, transactionSampleRate: 1.0, @@ -914,7 +898,7 @@ var Config = function () { apmRequest: null, sendCredentials: false }; - this.events = new _event_handler__WEBPACK_IMPORTED_MODULE_1__.default(); + this.events = new _event_handler__WEBPACK_IMPORTED_MODULE_1__["default"](); this.filters = []; this.version = ''; } @@ -1024,7 +1008,7 @@ var Config = function () { properties.transactionSampleRate = Math.round(transactionSampleRate * 10000) / 10000; } - (0,_utils__WEBPACK_IMPORTED_MODULE_0__.merge)(this.config, properties); + this.config = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.merge)(this.config, properties); this.events.send(_constants__WEBPACK_IMPORTED_MODULE_2__.CONFIG_CHANGE, [this.config]); }; @@ -1126,61 +1110,64 @@ var Config = function () { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "SCHEDULE": function() { return /* binding */ SCHEDULE; }, -/* harmony export */ "INVOKE": function() { return /* binding */ INVOKE; }, -/* harmony export */ "ADD_EVENT_LISTENER_STR": function() { return /* binding */ ADD_EVENT_LISTENER_STR; }, -/* harmony export */ "REMOVE_EVENT_LISTENER_STR": function() { return /* binding */ REMOVE_EVENT_LISTENER_STR; }, -/* harmony export */ "RESOURCE_INITIATOR_TYPES": function() { return /* binding */ RESOURCE_INITIATOR_TYPES; }, -/* harmony export */ "REUSABILITY_THRESHOLD": function() { return /* binding */ REUSABILITY_THRESHOLD; }, -/* harmony export */ "MAX_SPAN_DURATION": function() { return /* binding */ MAX_SPAN_DURATION; }, -/* harmony export */ "PAGE_LOAD_DELAY": function() { return /* binding */ PAGE_LOAD_DELAY; }, -/* harmony export */ "PAGE_LOAD": function() { return /* binding */ PAGE_LOAD; }, -/* harmony export */ "ROUTE_CHANGE": function() { return /* binding */ ROUTE_CHANGE; }, -/* harmony export */ "NAME_UNKNOWN": function() { return /* binding */ NAME_UNKNOWN; }, -/* harmony export */ "TYPE_CUSTOM": function() { return /* binding */ TYPE_CUSTOM; }, -/* harmony export */ "USER_TIMING_THRESHOLD": function() { return /* binding */ USER_TIMING_THRESHOLD; }, -/* harmony export */ "TRANSACTION_START": function() { return /* binding */ TRANSACTION_START; }, -/* harmony export */ "TRANSACTION_END": function() { return /* binding */ TRANSACTION_END; }, -/* harmony export */ "CONFIG_CHANGE": function() { return /* binding */ CONFIG_CHANGE; }, -/* harmony export */ "QUEUE_FLUSH": function() { return /* binding */ QUEUE_FLUSH; }, -/* harmony export */ "QUEUE_ADD_TRANSACTION": function() { return /* binding */ QUEUE_ADD_TRANSACTION; }, -/* harmony export */ "XMLHTTPREQUEST": function() { return /* binding */ XMLHTTPREQUEST; }, -/* harmony export */ "FETCH": function() { return /* binding */ FETCH; }, -/* harmony export */ "HISTORY": function() { return /* binding */ HISTORY; }, -/* harmony export */ "EVENT_TARGET": function() { return /* binding */ EVENT_TARGET; }, -/* harmony export */ "CLICK": function() { return /* binding */ CLICK; }, -/* harmony export */ "ERROR": function() { return /* binding */ ERROR; }, -/* harmony export */ "BEFORE_EVENT": function() { return /* binding */ BEFORE_EVENT; }, -/* harmony export */ "AFTER_EVENT": function() { return /* binding */ AFTER_EVENT; }, -/* harmony export */ "LOCAL_CONFIG_KEY": function() { return /* binding */ LOCAL_CONFIG_KEY; }, -/* harmony export */ "HTTP_REQUEST_TYPE": function() { return /* binding */ HTTP_REQUEST_TYPE; }, -/* harmony export */ "LONG_TASK": function() { return /* binding */ LONG_TASK; }, -/* harmony export */ "PAINT": function() { return /* binding */ PAINT; }, -/* harmony export */ "MEASURE": function() { return /* binding */ MEASURE; }, -/* harmony export */ "NAVIGATION": function() { return /* binding */ NAVIGATION; }, -/* harmony export */ "RESOURCE": function() { return /* binding */ RESOURCE; }, -/* harmony export */ "FIRST_CONTENTFUL_PAINT": function() { return /* binding */ FIRST_CONTENTFUL_PAINT; }, -/* harmony export */ "LARGEST_CONTENTFUL_PAINT": function() { return /* binding */ LARGEST_CONTENTFUL_PAINT; }, -/* harmony export */ "KEYWORD_LIMIT": function() { return /* binding */ KEYWORD_LIMIT; }, -/* harmony export */ "TEMPORARY_TYPE": function() { return /* binding */ TEMPORARY_TYPE; }, -/* harmony export */ "USER_INTERACTION": function() { return /* binding */ USER_INTERACTION; }, -/* harmony export */ "TRANSACTION_TYPE_ORDER": function() { return /* binding */ TRANSACTION_TYPE_ORDER; }, -/* harmony export */ "ERRORS": function() { return /* binding */ ERRORS; }, -/* harmony export */ "TRANSACTIONS": function() { return /* binding */ TRANSACTIONS; }, -/* harmony export */ "CONFIG_SERVICE": function() { return /* binding */ CONFIG_SERVICE; }, -/* harmony export */ "LOGGING_SERVICE": function() { return /* binding */ LOGGING_SERVICE; }, -/* harmony export */ "TRANSACTION_SERVICE": function() { return /* binding */ TRANSACTION_SERVICE; }, -/* harmony export */ "APM_SERVER": function() { return /* binding */ APM_SERVER; }, -/* harmony export */ "PERFORMANCE_MONITORING": function() { return /* binding */ PERFORMANCE_MONITORING; }, -/* harmony export */ "ERROR_LOGGING": function() { return /* binding */ ERROR_LOGGING; }, -/* harmony export */ "TRUNCATED_TYPE": function() { return /* binding */ TRUNCATED_TYPE; }, -/* harmony export */ "FIRST_INPUT": function() { return /* binding */ FIRST_INPUT; }, -/* harmony export */ "LAYOUT_SHIFT": function() { return /* binding */ LAYOUT_SHIFT; }, -/* harmony export */ "OUTCOME_SUCCESS": function() { return /* binding */ OUTCOME_SUCCESS; }, -/* harmony export */ "OUTCOME_FAILURE": function() { return /* binding */ OUTCOME_FAILURE; }, -/* harmony export */ "OUTCOME_UNKNOWN": function() { return /* binding */ OUTCOME_UNKNOWN; }, -/* harmony export */ "SESSION_TIMEOUT": function() { return /* binding */ SESSION_TIMEOUT; }, -/* harmony export */ "HTTP_REQUEST_TIMEOUT": function() { return /* binding */ HTTP_REQUEST_TIMEOUT; } +/* harmony export */ ADD_EVENT_LISTENER_STR: function() { return /* binding */ ADD_EVENT_LISTENER_STR; }, +/* harmony export */ AFTER_EVENT: function() { return /* binding */ AFTER_EVENT; }, +/* harmony export */ APM_SERVER: function() { return /* binding */ APM_SERVER; }, +/* harmony export */ BEFORE_EVENT: function() { return /* binding */ BEFORE_EVENT; }, +/* harmony export */ CLICK: function() { return /* binding */ CLICK; }, +/* harmony export */ CONFIG_CHANGE: function() { return /* binding */ CONFIG_CHANGE; }, +/* harmony export */ CONFIG_SERVICE: function() { return /* binding */ CONFIG_SERVICE; }, +/* harmony export */ ERROR: function() { return /* binding */ ERROR; }, +/* harmony export */ ERRORS: function() { return /* binding */ ERRORS; }, +/* harmony export */ ERROR_LOGGING: function() { return /* binding */ ERROR_LOGGING; }, +/* harmony export */ EVENT: function() { return /* binding */ EVENT; }, +/* harmony export */ EVENT_TARGET: function() { return /* binding */ EVENT_TARGET; }, +/* harmony export */ FETCH: function() { return /* binding */ FETCH; }, +/* harmony export */ FIRST_CONTENTFUL_PAINT: function() { return /* binding */ FIRST_CONTENTFUL_PAINT; }, +/* harmony export */ FIRST_INPUT: function() { return /* binding */ FIRST_INPUT; }, +/* harmony export */ HISTORY: function() { return /* binding */ HISTORY; }, +/* harmony export */ HTTP_REQUEST_TIMEOUT: function() { return /* binding */ HTTP_REQUEST_TIMEOUT; }, +/* harmony export */ HTTP_REQUEST_TYPE: function() { return /* binding */ HTTP_REQUEST_TYPE; }, +/* harmony export */ INVOKE: function() { return /* binding */ INVOKE; }, +/* harmony export */ KEYWORD_LIMIT: function() { return /* binding */ KEYWORD_LIMIT; }, +/* harmony export */ LARGEST_CONTENTFUL_PAINT: function() { return /* binding */ LARGEST_CONTENTFUL_PAINT; }, +/* harmony export */ LAYOUT_SHIFT: function() { return /* binding */ LAYOUT_SHIFT; }, +/* harmony export */ LOCAL_CONFIG_KEY: function() { return /* binding */ LOCAL_CONFIG_KEY; }, +/* harmony export */ LOGGING_SERVICE: function() { return /* binding */ LOGGING_SERVICE; }, +/* harmony export */ LONG_TASK: function() { return /* binding */ LONG_TASK; }, +/* harmony export */ MAX_SPAN_DURATION: function() { return /* binding */ MAX_SPAN_DURATION; }, +/* harmony export */ MEASURE: function() { return /* binding */ MEASURE; }, +/* harmony export */ NAME_UNKNOWN: function() { return /* binding */ NAME_UNKNOWN; }, +/* harmony export */ NAVIGATION: function() { return /* binding */ NAVIGATION; }, +/* harmony export */ OUTCOME_FAILURE: function() { return /* binding */ OUTCOME_FAILURE; }, +/* harmony export */ OUTCOME_SUCCESS: function() { return /* binding */ OUTCOME_SUCCESS; }, +/* harmony export */ OUTCOME_UNKNOWN: function() { return /* binding */ OUTCOME_UNKNOWN; }, +/* harmony export */ PAGE_EXIT: function() { return /* binding */ PAGE_EXIT; }, +/* harmony export */ PAGE_LOAD: function() { return /* binding */ PAGE_LOAD; }, +/* harmony export */ PAGE_LOAD_DELAY: function() { return /* binding */ PAGE_LOAD_DELAY; }, +/* harmony export */ PAINT: function() { return /* binding */ PAINT; }, +/* harmony export */ PERFORMANCE_MONITORING: function() { return /* binding */ PERFORMANCE_MONITORING; }, +/* harmony export */ QUEUE_ADD_TRANSACTION: function() { return /* binding */ QUEUE_ADD_TRANSACTION; }, +/* harmony export */ QUEUE_FLUSH: function() { return /* binding */ QUEUE_FLUSH; }, +/* harmony export */ REMOVE_EVENT_LISTENER_STR: function() { return /* binding */ REMOVE_EVENT_LISTENER_STR; }, +/* harmony export */ RESOURCE: function() { return /* binding */ RESOURCE; }, +/* harmony export */ RESOURCE_INITIATOR_TYPES: function() { return /* binding */ RESOURCE_INITIATOR_TYPES; }, +/* harmony export */ REUSABILITY_THRESHOLD: function() { return /* binding */ REUSABILITY_THRESHOLD; }, +/* harmony export */ ROUTE_CHANGE: function() { return /* binding */ ROUTE_CHANGE; }, +/* harmony export */ SCHEDULE: function() { return /* binding */ SCHEDULE; }, +/* harmony export */ SESSION_TIMEOUT: function() { return /* binding */ SESSION_TIMEOUT; }, +/* harmony export */ TEMPORARY_TYPE: function() { return /* binding */ TEMPORARY_TYPE; }, +/* harmony export */ TRANSACTIONS: function() { return /* binding */ TRANSACTIONS; }, +/* harmony export */ TRANSACTION_END: function() { return /* binding */ TRANSACTION_END; }, +/* harmony export */ TRANSACTION_IGNORE: function() { return /* binding */ TRANSACTION_IGNORE; }, +/* harmony export */ TRANSACTION_SERVICE: function() { return /* binding */ TRANSACTION_SERVICE; }, +/* harmony export */ TRANSACTION_START: function() { return /* binding */ TRANSACTION_START; }, +/* harmony export */ TRANSACTION_TYPE_ORDER: function() { return /* binding */ TRANSACTION_TYPE_ORDER; }, +/* harmony export */ TRUNCATED_TYPE: function() { return /* binding */ TRUNCATED_TYPE; }, +/* harmony export */ TYPE_CUSTOM: function() { return /* binding */ TYPE_CUSTOM; }, +/* harmony export */ USER_INTERACTION: function() { return /* binding */ USER_INTERACTION; }, +/* harmony export */ USER_TIMING_THRESHOLD: function() { return /* binding */ USER_TIMING_THRESHOLD; }, +/* harmony export */ XMLHTTPREQUEST: function() { return /* binding */ XMLHTTPREQUEST; } /* harmony export */ }); var SCHEDULE = 'schedule'; var INVOKE = 'invoke'; @@ -1197,6 +1184,7 @@ var USER_INTERACTION = 'user-interaction'; var HTTP_REQUEST_TYPE = 'http-request'; var TEMPORARY_TYPE = 'temporary'; var NAME_UNKNOWN = 'Unknown'; +var PAGE_EXIT = 'page-exit'; var TRANSACTION_TYPE_ORDER = [PAGE_LOAD, ROUTE_CHANGE, USER_INTERACTION, HTTP_REQUEST_TYPE, TYPE_CUSTOM, TEMPORARY_TYPE]; var OUTCOME_SUCCESS = 'success'; var OUTCOME_FAILURE = 'failure'; @@ -1207,6 +1195,7 @@ var TRANSACTION_END = 'transaction:end'; var CONFIG_CHANGE = 'config:change'; var QUEUE_FLUSH = 'queue:flush'; var QUEUE_ADD_TRANSACTION = 'queue:add_transaction'; +var TRANSACTION_IGNORE = 'transaction:ignore'; var XMLHTTPREQUEST = 'xmlhttprequest'; var FETCH = 'fetch'; var HISTORY = 'history'; @@ -1225,6 +1214,7 @@ var FIRST_CONTENTFUL_PAINT = 'first-contentful-paint'; var LARGEST_CONTENTFUL_PAINT = 'largest-contentful-paint'; var FIRST_INPUT = 'first-input'; var LAYOUT_SHIFT = 'layout-shift'; +var EVENT = 'event'; var ERRORS = 'errors'; var TRANSACTIONS = 'transactions'; var CONFIG_SERVICE = 'ConfigService'; @@ -1250,9 +1240,9 @@ var HTTP_REQUEST_TIMEOUT = 10000; "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "getPageContext": function() { return /* binding */ getPageContext; }, -/* harmony export */ "addSpanContext": function() { return /* binding */ addSpanContext; }, -/* harmony export */ "addTransactionContext": function() { return /* binding */ addTransactionContext; } +/* harmony export */ addSpanContext: function() { return /* binding */ addSpanContext; }, +/* harmony export */ addTransactionContext: function() { return /* binding */ addTransactionContext; }, +/* harmony export */ getPageContext: function() { return /* binding */ getPageContext; } /* harmony export */ }); /* harmony import */ var _url__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./url */ "../rum-core/dist/es/common/url.js"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ "../rum-core/dist/es/common/constants.js"); @@ -1424,7 +1414,13 @@ function addTransactionContext(transaction, _temp) { var pageContext = getPageContext(); var responseContext = {}; - if (transaction.type === _constants__WEBPACK_IMPORTED_MODULE_2__.PAGE_LOAD && (0,_utils__WEBPACK_IMPORTED_MODULE_0__.isPerfTimelineSupported)()) { + if (transaction.type === _constants__WEBPACK_IMPORTED_MODULE_2__.PAGE_EXIT) { + transaction.ensureContext(); + + if (transaction.context.page && transaction.context.page.url) { + pageContext.page.url = transaction.context.page.url; + } + } else if (transaction.type === _constants__WEBPACK_IMPORTED_MODULE_2__.PAGE_LOAD && (0,_utils__WEBPACK_IMPORTED_MODULE_0__.isPerfTimelineSupported)()) { var entries = _utils__WEBPACK_IMPORTED_MODULE_0__.PERF.getEntriesByType(_constants__WEBPACK_IMPORTED_MODULE_2__.NAVIGATION); if (entries && entries.length > 0) { @@ -1512,10 +1508,10 @@ var EventHandler = function () { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "BYTE_LIMIT": function() { return /* binding */ BYTE_LIMIT; }, -/* harmony export */ "shouldUseFetchWithKeepAlive": function() { return /* binding */ shouldUseFetchWithKeepAlive; }, -/* harmony export */ "sendFetchRequest": function() { return /* binding */ sendFetchRequest; }, -/* harmony export */ "isFetchSupported": function() { return /* binding */ isFetchSupported; } +/* harmony export */ BYTE_LIMIT: function() { return /* binding */ BYTE_LIMIT; }, +/* harmony export */ isFetchSupported: function() { return /* binding */ isFetchSupported; }, +/* harmony export */ sendFetchRequest: function() { return /* binding */ sendFetchRequest; }, +/* harmony export */ shouldUseFetchWithKeepAlive: function() { return /* binding */ shouldUseFetchWithKeepAlive; } /* harmony export */ }); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ "../rum-core/dist/es/common/constants.js"); /* harmony import */ var _response_status__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./response-status */ "../rum-core/dist/es/common/http/response-status.js"); @@ -1623,7 +1619,7 @@ function calculateSize(payload) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "isResponseSuccessful": function() { return /* binding */ isResponseSuccessful; } +/* harmony export */ isResponseSuccessful: function() { return /* binding */ isResponseSuccessful; } /* harmony export */ }); function isResponseSuccessful(status) { if (status === 0 || status > 399 && status < 600) { @@ -1644,7 +1640,7 @@ function isResponseSuccessful(status) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "sendXHR": function() { return /* binding */ sendXHR; } +/* harmony export */ sendXHR: function() { return /* binding */ sendXHR; } /* harmony export */ }); /* harmony import */ var _patching_patch_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../patching/patch-utils */ "../rum-core/dist/es/common/patching/patch-utils.js"); /* harmony import */ var _response_status__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./response-status */ "../rum-core/dist/es/common/http/response-status.js"); @@ -1736,7 +1732,7 @@ function sendXHR(method, url, _ref) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "getInstrumentationFlags": function() { return /* binding */ getInstrumentationFlags; } +/* harmony export */ getInstrumentationFlags: function() { return /* binding */ getInstrumentationFlags; } /* harmony export */ }); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ "../rum-core/dist/es/common/constants.js"); @@ -1862,10 +1858,11 @@ var NDJSON = function () { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "observePageClicks": function() { return /* binding */ observePageClicks; } +/* harmony export */ observePageClicks: function() { return /* binding */ observePageClicks; } /* harmony export */ }); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ "../rum-core/dist/es/common/constants.js"); +var INTERACTIVE_SELECTOR = 'a[data-transaction-name], button[data-transaction-name]'; function observePageClicks(transactionService) { var clickHandler = function clickHandler(event) { if (event.target instanceof Element) { @@ -1902,20 +1899,7 @@ function getTransactionMetadata(target) { transactionName: null, context: null }; - var tagName = target.tagName.toLowerCase(); - var transactionName = tagName; - - if (!!target.dataset.transactionName) { - transactionName = target.dataset.transactionName; - } else { - var name = target.getAttribute('name'); - - if (!!name) { - transactionName = tagName + "[\"" + name + "\"]"; - } - } - - metadata.transactionName = transactionName; + metadata.transactionName = buildTransactionName(target); var classes = target.getAttribute('class'); if (classes) { @@ -1929,6 +1913,35 @@ function getTransactionMetadata(target) { return metadata; } +function buildTransactionName(target) { + var dtName = findCustomTransactionName(target); + + if (dtName) { + return dtName; + } + + var tagName = target.tagName.toLowerCase(); + var name = target.getAttribute('name'); + + if (!!name) { + return tagName + "[\"" + name + "\"]"; + } + + return tagName; +} + +function findCustomTransactionName(target) { + var trCustomNameAttribute = 'data-transaction-name'; + var fallbackName = target.getAttribute(trCustomNameAttribute); + + if (target.closest) { + var element = target.closest(INTERACTIVE_SELECTOR); + return element ? element.getAttribute(trCustomNameAttribute) : fallbackName; + } + + return fallbackName; +} + /***/ }), /***/ "../rum-core/dist/es/common/observers/page-visibility.js": @@ -1940,11 +1953,13 @@ function getTransactionMetadata(target) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "observePageVisibility": function() { return /* binding */ observePageVisibility; } +/* harmony export */ observePageVisibility: function() { return /* binding */ observePageVisibility; } /* harmony export */ }); -/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants */ "../rum-core/dist/es/common/constants.js"); +/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ "../rum-core/dist/es/common/constants.js"); /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../state */ "../rum-core/dist/es/state.js"); -/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ "../rum-core/dist/es/common/utils.js"); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ "../rum-core/dist/es/common/utils.js"); +/* harmony import */ var _performance_monitoring_metrics_inp_report__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../performance-monitoring/metrics/inp/report */ "../rum-core/dist/es/performance-monitoring/metrics/inp/report.js"); + @@ -1973,18 +1988,37 @@ function observePageVisibility(configService, transactionService) { } function onPageHidden(configService, transactionService) { + var inpTr = (0,_performance_monitoring_metrics_inp_report__WEBPACK_IMPORTED_MODULE_1__.reportInp)(transactionService); + + if (inpTr) { + var unobserve = configService.observeEvent(_constants__WEBPACK_IMPORTED_MODULE_2__.QUEUE_ADD_TRANSACTION, function () { + endManagedTransaction(configService, transactionService); + unobserve(); + }); + } else { + endManagedTransaction(configService, transactionService); + } +} + +function endManagedTransaction(configService, transactionService) { var tr = transactionService.getCurrentTransaction(); if (tr) { - var unobserve = configService.observeEvent(_constants__WEBPACK_IMPORTED_MODULE_1__.QUEUE_ADD_TRANSACTION, function () { - configService.dispatchEvent(_constants__WEBPACK_IMPORTED_MODULE_1__.QUEUE_FLUSH); - _state__WEBPACK_IMPORTED_MODULE_0__.state.lastHiddenStart = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.now)(); - unobserve(); + var unobserveDiscard = configService.observeEvent(_constants__WEBPACK_IMPORTED_MODULE_2__.TRANSACTION_IGNORE, function () { + _state__WEBPACK_IMPORTED_MODULE_0__.state.lastHiddenStart = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.now)(); + unobserveDiscard(); + unobserveQueueAdd(); + }); + var unobserveQueueAdd = configService.observeEvent(_constants__WEBPACK_IMPORTED_MODULE_2__.QUEUE_ADD_TRANSACTION, function () { + configService.dispatchEvent(_constants__WEBPACK_IMPORTED_MODULE_2__.QUEUE_FLUSH); + _state__WEBPACK_IMPORTED_MODULE_0__.state.lastHiddenStart = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.now)(); + unobserveQueueAdd(); + unobserveDiscard(); }); tr.end(); } else { - configService.dispatchEvent(_constants__WEBPACK_IMPORTED_MODULE_1__.QUEUE_FLUSH); - _state__WEBPACK_IMPORTED_MODULE_0__.state.lastHiddenStart = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.now)(); + configService.dispatchEvent(_constants__WEBPACK_IMPORTED_MODULE_2__.QUEUE_FLUSH); + _state__WEBPACK_IMPORTED_MODULE_0__.state.lastHiddenStart = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.now)(); } } @@ -1999,7 +2033,7 @@ function onPageHidden(configService, transactionService) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "patchFetch": function() { return /* binding */ patchFetch; } +/* harmony export */ patchFetch: function() { return /* binding */ patchFetch; } /* harmony export */ }); /* harmony import */ var _polyfills__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../polyfills */ "../rum-core/dist/es/common/polyfills.js"); /* harmony import */ var _patch_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./patch-utils */ "../rum-core/dist/es/common/patching/patch-utils.js"); @@ -2058,10 +2092,16 @@ function patchFetch(callback) { var fetchSelf = this; var args = arguments; var request, url; + var isURL = input instanceof URL; - if (typeof input === 'string') { + if (typeof input === 'string' || isURL) { request = new Request(input, init); - url = input; + + if (isURL) { + url = request.url; + } else { + url = input; + } } else if (input) { request = input; url = request.url; @@ -2134,7 +2174,7 @@ function isAbortError(error) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "patchHistory": function() { return /* binding */ patchHistory; } +/* harmony export */ patchHistory: function() { return /* binding */ patchHistory; } /* harmony export */ }); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ "../rum-core/dist/es/common/constants.js"); @@ -2172,8 +2212,8 @@ function patchHistory(callback) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "patchAll": function() { return /* binding */ patchAll; }, -/* harmony export */ "patchEventHandler": function() { return /* binding */ patchEventHandler; } +/* harmony export */ patchAll: function() { return /* binding */ patchAll; }, +/* harmony export */ patchEventHandler: function() { return /* binding */ patchEventHandler; } /* harmony export */ }); /* harmony import */ var _xhr_patch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./xhr-patch */ "../rum-core/dist/es/common/patching/xhr-patch.js"); /* harmony import */ var _fetch_patch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fetch-patch */ "../rum-core/dist/es/common/patching/fetch-patch.js"); @@ -2185,7 +2225,7 @@ __webpack_require__.r(__webpack_exports__); -var patchEventHandler = new _event_handler__WEBPACK_IMPORTED_MODULE_0__.default(); +var patchEventHandler = new _event_handler__WEBPACK_IMPORTED_MODULE_0__["default"](); var alreadyPatched = false; function patchAll() { @@ -2218,13 +2258,13 @@ function patchAll() { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "globalState": function() { return /* binding */ globalState; }, -/* harmony export */ "apmSymbol": function() { return /* binding */ apmSymbol; }, -/* harmony export */ "patchMethod": function() { return /* binding */ patchMethod; }, -/* harmony export */ "XHR_IGNORE": function() { return /* binding */ XHR_IGNORE; }, -/* harmony export */ "XHR_SYNC": function() { return /* binding */ XHR_SYNC; }, -/* harmony export */ "XHR_URL": function() { return /* binding */ XHR_URL; }, -/* harmony export */ "XHR_METHOD": function() { return /* binding */ XHR_METHOD; } +/* harmony export */ XHR_IGNORE: function() { return /* binding */ XHR_IGNORE; }, +/* harmony export */ XHR_METHOD: function() { return /* binding */ XHR_METHOD; }, +/* harmony export */ XHR_SYNC: function() { return /* binding */ XHR_SYNC; }, +/* harmony export */ XHR_URL: function() { return /* binding */ XHR_URL; }, +/* harmony export */ apmSymbol: function() { return /* binding */ apmSymbol; }, +/* harmony export */ globalState: function() { return /* binding */ globalState; }, +/* harmony export */ patchMethod: function() { return /* binding */ patchMethod; } /* harmony export */ }); var globalState = { fetchInProgress: false @@ -2296,7 +2336,7 @@ var XHR_METHOD = apmSymbol('xhrMethod'); "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "patchXMLHttpRequest": function() { return /* binding */ patchXMLHttpRequest; } +/* harmony export */ patchXMLHttpRequest: function() { return /* binding */ patchXMLHttpRequest; } /* harmony export */ }); /* harmony import */ var _patch_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./patch-utils */ "../rum-core/dist/es/common/patching/patch-utils.js"); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ "../rum-core/dist/es/common/constants.js"); @@ -2406,7 +2446,7 @@ function patchXMLHttpRequest(callback) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Promise": function() { return /* binding */ Promise; } +/* harmony export */ Promise: function() { return /* binding */ Promise; } /* harmony export */ }); /* harmony import */ var promise_polyfill__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! promise-polyfill */ "../../node_modules/promise-polyfill/src/index.js"); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "../rum-core/dist/es/common/utils.js"); @@ -2420,7 +2460,7 @@ if (_utils__WEBPACK_IMPORTED_MODULE_1__.isBrowser) { local = self; } -var Promise = 'Promise' in local ? local.Promise : promise_polyfill__WEBPACK_IMPORTED_MODULE_0__.default; +var Promise = 'Promise' in local ? local.Promise : promise_polyfill__WEBPACK_IMPORTED_MODULE_0__["default"]; /***/ }), @@ -2499,8 +2539,8 @@ var Queue = function () { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "serviceCreators": function() { return /* binding */ serviceCreators; }, -/* harmony export */ "ServiceFactory": function() { return /* binding */ ServiceFactory; } +/* harmony export */ ServiceFactory: function() { return /* binding */ ServiceFactory; }, +/* harmony export */ serviceCreators: function() { return /* binding */ serviceCreators; } /* harmony export */ }); /* harmony import */ var _apm_server__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./apm-server */ "../rum-core/dist/es/common/apm-server.js"); /* harmony import */ var _config_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./config-service */ "../rum-core/dist/es/common/config-service.js"); @@ -2515,9 +2555,9 @@ var _serviceCreators; var serviceCreators = (_serviceCreators = {}, _serviceCreators[_constants__WEBPACK_IMPORTED_MODULE_0__.CONFIG_SERVICE] = function () { - return new _config_service__WEBPACK_IMPORTED_MODULE_1__.default(); + return new _config_service__WEBPACK_IMPORTED_MODULE_1__["default"](); }, _serviceCreators[_constants__WEBPACK_IMPORTED_MODULE_0__.LOGGING_SERVICE] = function () { - return new _logging_service__WEBPACK_IMPORTED_MODULE_2__.default({ + return new _logging_service__WEBPACK_IMPORTED_MODULE_2__["default"]({ prefix: '[Elastic APM] ' }); }, _serviceCreators[_constants__WEBPACK_IMPORTED_MODULE_0__.APM_SERVER] = function (factory) { @@ -2525,7 +2565,7 @@ var serviceCreators = (_serviceCreators = {}, _serviceCreators[_constants__WEBPA configService = _factory$getService[0], loggingService = _factory$getService[1]; - return new _apm_server__WEBPACK_IMPORTED_MODULE_3__.default(configService, loggingService); + return new _apm_server__WEBPACK_IMPORTED_MODULE_3__["default"](configService, loggingService); }, _serviceCreators); var ServiceFactory = function () { @@ -2629,13 +2669,13 @@ function throttle(fn, onThrottle, opts) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "truncate": function() { return /* binding */ truncate; }, -/* harmony export */ "truncateModel": function() { return /* binding */ truncateModel; }, -/* harmony export */ "SPAN_MODEL": function() { return /* binding */ SPAN_MODEL; }, -/* harmony export */ "TRANSACTION_MODEL": function() { return /* binding */ TRANSACTION_MODEL; }, -/* harmony export */ "ERROR_MODEL": function() { return /* binding */ ERROR_MODEL; }, -/* harmony export */ "METADATA_MODEL": function() { return /* binding */ METADATA_MODEL; }, -/* harmony export */ "RESPONSE_MODEL": function() { return /* binding */ RESPONSE_MODEL; } +/* harmony export */ ERROR_MODEL: function() { return /* binding */ ERROR_MODEL; }, +/* harmony export */ METADATA_MODEL: function() { return /* binding */ METADATA_MODEL; }, +/* harmony export */ RESPONSE_MODEL: function() { return /* binding */ RESPONSE_MODEL; }, +/* harmony export */ SPAN_MODEL: function() { return /* binding */ SPAN_MODEL; }, +/* harmony export */ TRANSACTION_MODEL: function() { return /* binding */ TRANSACTION_MODEL; }, +/* harmony export */ truncate: function() { return /* binding */ truncate; }, +/* harmony export */ truncateModel: function() { return /* binding */ truncateModel; } /* harmony export */ }); /* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ "../rum-core/dist/es/common/constants.js"); @@ -2804,8 +2844,8 @@ function truncateModel(model, target, childTarget) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Url": function() { return /* binding */ Url; }, -/* harmony export */ "slugifyUrl": function() { return /* binding */ slugifyUrl; } +/* harmony export */ Url: function() { return /* binding */ Url; }, +/* harmony export */ slugifyUrl: function() { return /* binding */ slugifyUrl; } /* harmony export */ }); /* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "../rum-core/dist/es/common/utils.js"); @@ -3015,45 +3055,47 @@ function slugifyUrl(urlStr, depth) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "extend": function() { return /* binding */ extend; }, -/* harmony export */ "merge": function() { return /* binding */ merge; }, -/* harmony export */ "isUndefined": function() { return /* binding */ isUndefined; }, -/* harmony export */ "noop": function() { return /* binding */ noop; }, -/* harmony export */ "baseExtend": function() { return /* binding */ baseExtend; }, -/* harmony export */ "bytesToHex": function() { return /* binding */ bytesToHex; }, -/* harmony export */ "isCORSSupported": function() { return /* binding */ isCORSSupported; }, -/* harmony export */ "isObject": function() { return /* binding */ isObject; }, -/* harmony export */ "isFunction": function() { return /* binding */ isFunction; }, -/* harmony export */ "isPlatformSupported": function() { return /* binding */ isPlatformSupported; }, -/* harmony export */ "isDtHeaderValid": function() { return /* binding */ isDtHeaderValid; }, -/* harmony export */ "parseDtHeaderValue": function() { return /* binding */ parseDtHeaderValue; }, -/* harmony export */ "getServerTimingInfo": function() { return /* binding */ getServerTimingInfo; }, -/* harmony export */ "getDtHeaderValue": function() { return /* binding */ getDtHeaderValue; }, -/* harmony export */ "getTSHeaderValue": function() { return /* binding */ getTSHeaderValue; }, -/* harmony export */ "getCurrentScript": function() { return /* binding */ getCurrentScript; }, -/* harmony export */ "getElasticScript": function() { return /* binding */ getElasticScript; }, -/* harmony export */ "getTimeOrigin": function() { return /* binding */ getTimeOrigin; }, -/* harmony export */ "generateRandomId": function() { return /* binding */ generateRandomId; }, -/* harmony export */ "getEarliestSpan": function() { return /* binding */ getEarliestSpan; }, -/* harmony export */ "getLatestNonXHRSpan": function() { return /* binding */ getLatestNonXHRSpan; }, -/* harmony export */ "getLatestXHRSpan": function() { return /* binding */ getLatestXHRSpan; }, -/* harmony export */ "getDuration": function() { return /* binding */ getDuration; }, -/* harmony export */ "getTime": function() { return /* binding */ getTime; }, -/* harmony export */ "now": function() { return /* binding */ now; }, -/* harmony export */ "rng": function() { return /* binding */ rng; }, -/* harmony export */ "checkSameOrigin": function() { return /* binding */ checkSameOrigin; }, -/* harmony export */ "scheduleMacroTask": function() { return /* binding */ scheduleMacroTask; }, -/* harmony export */ "scheduleMicroTask": function() { return /* binding */ scheduleMicroTask; }, -/* harmony export */ "setLabel": function() { return /* binding */ setLabel; }, -/* harmony export */ "setRequestHeader": function() { return /* binding */ setRequestHeader; }, -/* harmony export */ "stripQueryStringFromUrl": function() { return /* binding */ stripQueryStringFromUrl; }, -/* harmony export */ "find": function() { return /* binding */ find; }, -/* harmony export */ "removeInvalidChars": function() { return /* binding */ removeInvalidChars; }, -/* harmony export */ "PERF": function() { return /* binding */ PERF; }, -/* harmony export */ "isPerfTimelineSupported": function() { return /* binding */ isPerfTimelineSupported; }, -/* harmony export */ "isBrowser": function() { return /* binding */ isBrowser; }, -/* harmony export */ "isPerfTypeSupported": function() { return /* binding */ isPerfTypeSupported; }, -/* harmony export */ "isBeaconInspectionEnabled": function() { return /* binding */ isBeaconInspectionEnabled; } +/* harmony export */ PERF: function() { return /* binding */ PERF; }, +/* harmony export */ baseExtend: function() { return /* binding */ baseExtend; }, +/* harmony export */ bytesToHex: function() { return /* binding */ bytesToHex; }, +/* harmony export */ checkSameOrigin: function() { return /* binding */ checkSameOrigin; }, +/* harmony export */ extend: function() { return /* binding */ extend; }, +/* harmony export */ find: function() { return /* binding */ find; }, +/* harmony export */ generateRandomId: function() { return /* binding */ generateRandomId; }, +/* harmony export */ getCurrentScript: function() { return /* binding */ getCurrentScript; }, +/* harmony export */ getDtHeaderValue: function() { return /* binding */ getDtHeaderValue; }, +/* harmony export */ getDuration: function() { return /* binding */ getDuration; }, +/* harmony export */ getEarliestSpan: function() { return /* binding */ getEarliestSpan; }, +/* harmony export */ getElasticScript: function() { return /* binding */ getElasticScript; }, +/* harmony export */ getLatestNonXHRSpan: function() { return /* binding */ getLatestNonXHRSpan; }, +/* harmony export */ getLatestXHRSpan: function() { return /* binding */ getLatestXHRSpan; }, +/* harmony export */ getServerTimingInfo: function() { return /* binding */ getServerTimingInfo; }, +/* harmony export */ getTSHeaderValue: function() { return /* binding */ getTSHeaderValue; }, +/* harmony export */ getTime: function() { return /* binding */ getTime; }, +/* harmony export */ getTimeOrigin: function() { return /* binding */ getTimeOrigin; }, +/* harmony export */ isBeaconInspectionEnabled: function() { return /* binding */ isBeaconInspectionEnabled; }, +/* harmony export */ isBrowser: function() { return /* binding */ isBrowser; }, +/* harmony export */ isCORSSupported: function() { return /* binding */ isCORSSupported; }, +/* harmony export */ isDtHeaderValid: function() { return /* binding */ isDtHeaderValid; }, +/* harmony export */ isFunction: function() { return /* binding */ isFunction; }, +/* harmony export */ isObject: function() { return /* binding */ isObject; }, +/* harmony export */ isPerfInteractionCountSupported: function() { return /* binding */ isPerfInteractionCountSupported; }, +/* harmony export */ isPerfTimelineSupported: function() { return /* binding */ isPerfTimelineSupported; }, +/* harmony export */ isPerfTypeSupported: function() { return /* binding */ isPerfTypeSupported; }, +/* harmony export */ isPlatformSupported: function() { return /* binding */ isPlatformSupported; }, +/* harmony export */ isRedirectInfoAvailable: function() { return /* binding */ isRedirectInfoAvailable; }, +/* harmony export */ isUndefined: function() { return /* binding */ isUndefined; }, +/* harmony export */ merge: function() { return /* binding */ merge; }, +/* harmony export */ noop: function() { return /* binding */ noop; }, +/* harmony export */ now: function() { return /* binding */ now; }, +/* harmony export */ parseDtHeaderValue: function() { return /* binding */ parseDtHeaderValue; }, +/* harmony export */ removeInvalidChars: function() { return /* binding */ removeInvalidChars; }, +/* harmony export */ rng: function() { return /* binding */ rng; }, +/* harmony export */ scheduleMacroTask: function() { return /* binding */ scheduleMacroTask; }, +/* harmony export */ scheduleMicroTask: function() { return /* binding */ scheduleMicroTask; }, +/* harmony export */ setLabel: function() { return /* binding */ setLabel; }, +/* harmony export */ setRequestHeader: function() { return /* binding */ setRequestHeader; }, +/* harmony export */ stripQueryStringFromUrl: function() { return /* binding */ stripQueryStringFromUrl; } /* harmony export */ }); /* harmony import */ var _polyfills__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./polyfills */ "../rum-core/dist/es/common/polyfills.js"); @@ -3280,12 +3322,12 @@ function getCurrentScript() { } } -function extend(dst) { - return baseExtend(dst, slice.call(arguments, 1), false); +function extend() { + return baseExtend(Object.create(null), slice.call(arguments), false); } -function merge(dst) { - return baseExtend(dst, slice.call(arguments, 1), true); +function merge() { + return baseExtend(Object.create(null), slice.call(arguments), true); } function isUndefined(obj) { @@ -3397,6 +3439,10 @@ function isPerfTypeSupported(type) { return typeof PerformanceObserver !== 'undefined' && PerformanceObserver.supportedEntryTypes && PerformanceObserver.supportedEntryTypes.indexOf(type) >= 0; } +function isPerfInteractionCountSupported() { + return 'interactionCount' in performance; +} + function isBeaconInspectionEnabled() { var flagName = '_elastic_inspect_beacon_'; @@ -3422,6 +3468,10 @@ function isBeaconInspectionEnabled() { return false; } +function isRedirectInfoAvailable(timing) { + return timing.redirectStart > 0; +} + /***/ }), @@ -3463,6 +3513,7 @@ function _objectWithoutPropertiesLoose(source, excluded) { var IGNORE_KEYS = ['stack', 'message']; +var PROMISE_REJECTION_PREFIX = 'Unhandled promise rejection: '; function getErrorProperties(error) { var propertyFound = false; @@ -3595,7 +3646,6 @@ var ErrorLogging = function () { }; _proto.logPromiseEvent = function logPromiseEvent(promiseRejectionEvent) { - var prefix = 'Unhandled promise rejection: '; var reason = promiseRejectionEvent.reason; if (reason == null) { @@ -3608,13 +3658,10 @@ var ErrorLogging = function () { var name = reason.name ? reason.name + ': ' : ''; errorEvent = { error: reason, - message: prefix + name + reason.message + message: PROMISE_REJECTION_PREFIX + name + reason.message }; } else { - reason = typeof reason === 'object' ? '' : typeof reason === 'function' ? '' : reason; - errorEvent = { - message: prefix + reason - }; + errorEvent = this._parseRejectReason(reason); } this.logErrorEvent(errorEvent); @@ -3632,6 +3679,29 @@ var ErrorLogging = function () { return this.logErrorEvent(errorEvent); }; + _proto._parseRejectReason = function _parseRejectReason(reason) { + var errorEvent = { + message: PROMISE_REJECTION_PREFIX + }; + + if (Array.isArray(reason)) { + errorEvent.message += ''; + } else if (typeof reason === 'object') { + try { + errorEvent.message += JSON.stringify(reason); + errorEvent.error = reason; + } catch (error) { + errorEvent.message += ''; + } + } else if (typeof reason === 'function') { + errorEvent.message += ''; + } else { + errorEvent.message += reason; + } + + return errorEvent; + }; + return ErrorLogging; }(); @@ -3648,7 +3718,7 @@ var ErrorLogging = function () { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "registerServices": function() { return /* binding */ registerServices; } +/* harmony export */ registerServices: function() { return /* binding */ registerServices; } /* harmony export */ }); /* harmony import */ var _error_logging__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./error-logging */ "../rum-core/dist/es/error-logging/error-logging.js"); /* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common/constants */ "../rum-core/dist/es/common/constants.js"); @@ -3664,7 +3734,7 @@ function registerServices() { configService = _serviceFactory$getSe[1], transactionService = _serviceFactory$getSe[2]; - return new _error_logging__WEBPACK_IMPORTED_MODULE_2__.default(apmServer, configService, transactionService); + return new _error_logging__WEBPACK_IMPORTED_MODULE_2__["default"](apmServer, configService, transactionService); }; } @@ -3681,8 +3751,8 @@ function registerServices() { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "createStackTraces": function() { return /* binding */ createStackTraces; }, -/* harmony export */ "filterInvalidFrames": function() { return /* binding */ filterInvalidFrames; } +/* harmony export */ createStackTraces: function() { return /* binding */ createStackTraces; }, +/* harmony export */ filterInvalidFrames: function() { return /* binding */ filterInvalidFrames; } /* harmony export */ }); function filePathToFileName(fileUrl) { var origin = window.location.origin || window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : ''); @@ -3831,43 +3901,45 @@ function filterInvalidFrames(frames) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "createServiceFactory": function() { return /* binding */ createServiceFactory; }, -/* harmony export */ "ServiceFactory": function() { return /* reexport safe */ _common_service_factory__WEBPACK_IMPORTED_MODULE_2__.ServiceFactory; }, -/* harmony export */ "patchAll": function() { return /* reexport safe */ _common_patching__WEBPACK_IMPORTED_MODULE_3__.patchAll; }, -/* harmony export */ "patchEventHandler": function() { return /* reexport safe */ _common_patching__WEBPACK_IMPORTED_MODULE_3__.patchEventHandler; }, -/* harmony export */ "isPlatformSupported": function() { return /* reexport safe */ _common_utils__WEBPACK_IMPORTED_MODULE_4__.isPlatformSupported; }, -/* harmony export */ "isBrowser": function() { return /* reexport safe */ _common_utils__WEBPACK_IMPORTED_MODULE_4__.isBrowser; }, -/* harmony export */ "getInstrumentationFlags": function() { return /* reexport safe */ _common_instrument__WEBPACK_IMPORTED_MODULE_5__.getInstrumentationFlags; }, -/* harmony export */ "createTracer": function() { return /* reexport safe */ _opentracing__WEBPACK_IMPORTED_MODULE_6__.createTracer; }, -/* harmony export */ "scheduleMicroTask": function() { return /* reexport safe */ _common_utils__WEBPACK_IMPORTED_MODULE_4__.scheduleMicroTask; }, -/* harmony export */ "scheduleMacroTask": function() { return /* reexport safe */ _common_utils__WEBPACK_IMPORTED_MODULE_4__.scheduleMacroTask; }, -/* harmony export */ "afterFrame": function() { return /* reexport safe */ _common_after_frame__WEBPACK_IMPORTED_MODULE_7__.default; }, -/* harmony export */ "ERROR": function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.ERROR; }, -/* harmony export */ "PAGE_LOAD_DELAY": function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.PAGE_LOAD_DELAY; }, -/* harmony export */ "PAGE_LOAD": function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.PAGE_LOAD; }, -/* harmony export */ "CONFIG_SERVICE": function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.CONFIG_SERVICE; }, -/* harmony export */ "LOGGING_SERVICE": function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.LOGGING_SERVICE; }, -/* harmony export */ "TRANSACTION_SERVICE": function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.TRANSACTION_SERVICE; }, -/* harmony export */ "APM_SERVER": function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.APM_SERVER; }, -/* harmony export */ "PERFORMANCE_MONITORING": function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.PERFORMANCE_MONITORING; }, -/* harmony export */ "ERROR_LOGGING": function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.ERROR_LOGGING; }, -/* harmony export */ "EVENT_TARGET": function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.EVENT_TARGET; }, -/* harmony export */ "CLICK": function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.CLICK; }, -/* harmony export */ "bootstrap": function() { return /* reexport safe */ _bootstrap__WEBPACK_IMPORTED_MODULE_9__.bootstrap; }, -/* harmony export */ "observePageVisibility": function() { return /* reexport safe */ _common_observers__WEBPACK_IMPORTED_MODULE_10__.observePageVisibility; }, -/* harmony export */ "observePageClicks": function() { return /* reexport safe */ _common_observers__WEBPACK_IMPORTED_MODULE_11__.observePageClicks; } +/* harmony export */ APM_SERVER: function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.APM_SERVER; }, +/* harmony export */ CLICK: function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.CLICK; }, +/* harmony export */ CONFIG_SERVICE: function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.CONFIG_SERVICE; }, +/* harmony export */ ERROR: function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.ERROR; }, +/* harmony export */ ERROR_LOGGING: function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.ERROR_LOGGING; }, +/* harmony export */ EVENT_TARGET: function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.EVENT_TARGET; }, +/* harmony export */ LOGGING_SERVICE: function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.LOGGING_SERVICE; }, +/* harmony export */ PAGE_LOAD: function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.PAGE_LOAD; }, +/* harmony export */ PAGE_LOAD_DELAY: function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.PAGE_LOAD_DELAY; }, +/* harmony export */ PERFORMANCE_MONITORING: function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.PERFORMANCE_MONITORING; }, +/* harmony export */ ServiceFactory: function() { return /* reexport safe */ _common_service_factory__WEBPACK_IMPORTED_MODULE_2__.ServiceFactory; }, +/* harmony export */ TRANSACTION_SERVICE: function() { return /* reexport safe */ _common_constants__WEBPACK_IMPORTED_MODULE_8__.TRANSACTION_SERVICE; }, +/* harmony export */ afterFrame: function() { return /* reexport safe */ _common_after_frame__WEBPACK_IMPORTED_MODULE_7__["default"]; }, +/* harmony export */ bootstrap: function() { return /* reexport safe */ _bootstrap__WEBPACK_IMPORTED_MODULE_10__.bootstrap; }, +/* harmony export */ createServiceFactory: function() { return /* binding */ createServiceFactory; }, +/* harmony export */ createTracer: function() { return /* reexport safe */ _opentracing__WEBPACK_IMPORTED_MODULE_6__.createTracer; }, +/* harmony export */ getInstrumentationFlags: function() { return /* reexport safe */ _common_instrument__WEBPACK_IMPORTED_MODULE_5__.getInstrumentationFlags; }, +/* harmony export */ isBrowser: function() { return /* reexport safe */ _common_utils__WEBPACK_IMPORTED_MODULE_4__.isBrowser; }, +/* harmony export */ isPlatformSupported: function() { return /* reexport safe */ _common_utils__WEBPACK_IMPORTED_MODULE_4__.isPlatformSupported; }, +/* harmony export */ observePageClicks: function() { return /* reexport safe */ _common_observers__WEBPACK_IMPORTED_MODULE_12__.observePageClicks; }, +/* harmony export */ observePageVisibility: function() { return /* reexport safe */ _common_observers__WEBPACK_IMPORTED_MODULE_11__.observePageVisibility; }, +/* harmony export */ observeUserInteractions: function() { return /* reexport safe */ _performance_monitoring__WEBPACK_IMPORTED_MODULE_9__.observeUserInteractions; }, +/* harmony export */ patchAll: function() { return /* reexport safe */ _common_patching__WEBPACK_IMPORTED_MODULE_3__.patchAll; }, +/* harmony export */ patchEventHandler: function() { return /* reexport safe */ _common_patching__WEBPACK_IMPORTED_MODULE_3__.patchEventHandler; }, +/* harmony export */ scheduleMacroTask: function() { return /* reexport safe */ _common_utils__WEBPACK_IMPORTED_MODULE_4__.scheduleMacroTask; }, +/* harmony export */ scheduleMicroTask: function() { return /* reexport safe */ _common_utils__WEBPACK_IMPORTED_MODULE_4__.scheduleMicroTask; } /* harmony export */ }); /* harmony import */ var _error_logging__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./error-logging */ "../rum-core/dist/es/error-logging/index.js"); /* harmony import */ var _performance_monitoring__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./performance-monitoring */ "../rum-core/dist/es/performance-monitoring/index.js"); +/* harmony import */ var _performance_monitoring__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./performance-monitoring */ "../rum-core/dist/es/performance-monitoring/metrics/inp/process.js"); /* harmony import */ var _common_service_factory__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./common/service-factory */ "../rum-core/dist/es/common/service-factory.js"); /* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./common/utils */ "../rum-core/dist/es/common/utils.js"); /* harmony import */ var _common_patching__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./common/patching */ "../rum-core/dist/es/common/patching/index.js"); -/* harmony import */ var _common_observers__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./common/observers */ "../rum-core/dist/es/common/observers/page-visibility.js"); -/* harmony import */ var _common_observers__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./common/observers */ "../rum-core/dist/es/common/observers/page-clicks.js"); +/* harmony import */ var _common_observers__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./common/observers */ "../rum-core/dist/es/common/observers/page-visibility.js"); +/* harmony import */ var _common_observers__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./common/observers */ "../rum-core/dist/es/common/observers/page-clicks.js"); /* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./common/constants */ "../rum-core/dist/es/common/constants.js"); /* harmony import */ var _common_instrument__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./common/instrument */ "../rum-core/dist/es/common/instrument.js"); /* harmony import */ var _common_after_frame__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./common/after-frame */ "../rum-core/dist/es/common/after-frame.js"); -/* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./bootstrap */ "../rum-core/dist/es/bootstrap.js"); +/* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./bootstrap */ "../rum-core/dist/es/bootstrap.js"); /* harmony import */ var _opentracing__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./opentracing */ "../rum-core/dist/es/opentracing/index.js"); @@ -3901,9 +3973,9 @@ function createServiceFactory() { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "Span": function() { return /* reexport safe */ _span__WEBPACK_IMPORTED_MODULE_2__.default; }, -/* harmony export */ "Tracer": function() { return /* reexport safe */ _tracer__WEBPACK_IMPORTED_MODULE_1__.default; }, -/* harmony export */ "createTracer": function() { return /* binding */ createTracer; } +/* harmony export */ Span: function() { return /* reexport safe */ _span__WEBPACK_IMPORTED_MODULE_2__["default"]; }, +/* harmony export */ Tracer: function() { return /* reexport safe */ _tracer__WEBPACK_IMPORTED_MODULE_1__["default"]; }, +/* harmony export */ createTracer: function() { return /* binding */ createTracer; } /* harmony export */ }); /* harmony import */ var _tracer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tracer */ "../rum-core/dist/es/opentracing/tracer.js"); /* harmony import */ var _span__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./span */ "../rum-core/dist/es/opentracing/span.js"); @@ -3917,7 +3989,7 @@ function createTracer(serviceFactory) { var transactionService = serviceFactory.getService(_common_constants__WEBPACK_IMPORTED_MODULE_0__.TRANSACTION_SERVICE); var errorLogging = serviceFactory.getService(_common_constants__WEBPACK_IMPORTED_MODULE_0__.ERROR_LOGGING); var loggingService = serviceFactory.getService(_common_constants__WEBPACK_IMPORTED_MODULE_0__.LOGGING_SERVICE); - return new _tracer__WEBPACK_IMPORTED_MODULE_1__.default(performanceMonitoring, transactionService, loggingService, errorLogging); + return new _tracer__WEBPACK_IMPORTED_MODULE_1__["default"](performanceMonitoring, transactionService, loggingService, errorLogging); } @@ -3964,7 +4036,7 @@ var Span = function (_otSpan) { _this = _otSpan.call(this) || this; _this.__tracer = tracer; _this.span = span; - _this.isTransaction = span instanceof _performance_monitoring_transaction__WEBPACK_IMPORTED_MODULE_1__.default; + _this.isTransaction = span instanceof _performance_monitoring_transaction__WEBPACK_IMPORTED_MODULE_1__["default"]; _this.spanContext = { id: span.id, traceId: span.traceId, @@ -4139,7 +4211,7 @@ var Tracer = function (_otTracer) { span._start = spanOptions.timestamp - (0,_common_utils__WEBPACK_IMPORTED_MODULE_4__.getTimeOrigin)(); } - var otSpan = new _span__WEBPACK_IMPORTED_MODULE_5__.default(this, span); + var otSpan = new _span__WEBPACK_IMPORTED_MODULE_5__["default"](this, span); if (options && options.tags) { otSpan.addTags(options.tags); @@ -4204,7 +4276,7 @@ var Tracer = function (_otTracer) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "captureBreakdown": function() { return /* binding */ captureBreakdown; } +/* harmony export */ captureBreakdown: function() { return /* binding */ captureBreakdown; } /* harmony export */ }); /* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common/utils */ "../rum-core/dist/es/common/utils.js"); /* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../common/constants */ "../rum-core/dist/es/common/constants.js"); @@ -4305,7 +4377,7 @@ function getSpanBreakdown(transactionDetails, _ref) { span: details, samples: { 'span.self_time.count': getValue(count), - 'span.self_time.sum.us': getValue(duration) + 'span.self_time.sum.us': getValue(duration * 1000) } }; } @@ -4316,7 +4388,6 @@ function captureBreakdown(transaction, timings) { } var breakdowns = []; - var trDuration = transaction.duration(); var name = transaction.name, type = transaction.type, sampled = transaction.sampled; @@ -4324,14 +4395,6 @@ function captureBreakdown(transaction, timings) { name: name, type: type }; - breakdowns.push({ - transaction: transactionDetails, - samples: { - 'transaction.duration.count': getValue(1), - 'transaction.duration.sum.us': getValue(trDuration), - 'transaction.breakdown.count': getValue(sampled ? 1 : 0) - } - }); if (!sampled) { return breakdowns; @@ -4381,305 +4444,269 @@ function captureBreakdown(transaction, timings) { /***/ }), -/***/ "../rum-core/dist/es/performance-monitoring/capture-navigation.js": -/*!************************************************************************!*\ - !*** ../rum-core/dist/es/performance-monitoring/capture-navigation.js ***! - \************************************************************************/ +/***/ "../rum-core/dist/es/performance-monitoring/index.js": +/*!***********************************************************!*\ + !*** ../rum-core/dist/es/performance-monitoring/index.js ***! + \***********************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "getPageLoadMarks": function() { return /* binding */ getPageLoadMarks; }, -/* harmony export */ "captureNavigation": function() { return /* binding */ captureNavigation; }, -/* harmony export */ "createNavigationTimingSpans": function() { return /* binding */ createNavigationTimingSpans; }, -/* harmony export */ "createResourceTimingSpans": function() { return /* binding */ createResourceTimingSpans; }, -/* harmony export */ "createUserTimingSpans": function() { return /* binding */ createUserTimingSpans; }, -/* harmony export */ "NAVIGATION_TIMING_MARKS": function() { return /* binding */ NAVIGATION_TIMING_MARKS; }, -/* harmony export */ "COMPRESSED_NAV_TIMING_MARKS": function() { return /* binding */ COMPRESSED_NAV_TIMING_MARKS; } +/* harmony export */ observeUserInteractions: function() { return /* reexport safe */ _metrics_inp_process__WEBPACK_IMPORTED_MODULE_4__.observeUserInteractions; }, +/* harmony export */ registerServices: function() { return /* binding */ registerServices; }, +/* harmony export */ reportInp: function() { return /* reexport safe */ _metrics_inp_report__WEBPACK_IMPORTED_MODULE_5__.reportInp; } /* harmony export */ }); -/* harmony import */ var _span__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./span */ "../rum-core/dist/es/performance-monitoring/span.js"); -/* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../common/constants */ "../rum-core/dist/es/common/constants.js"); -/* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../common/utils */ "../rum-core/dist/es/common/utils.js"); -/* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../state */ "../rum-core/dist/es/state.js"); - - - +/* harmony import */ var _performance_monitoring__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./performance-monitoring */ "../rum-core/dist/es/performance-monitoring/performance-monitoring.js"); +/* harmony import */ var _transaction_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./transaction-service */ "../rum-core/dist/es/performance-monitoring/transaction-service.js"); +/* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common/constants */ "../rum-core/dist/es/common/constants.js"); +/* harmony import */ var _common_service_factory__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../common/service-factory */ "../rum-core/dist/es/common/service-factory.js"); +/* harmony import */ var _metrics_inp_process__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./metrics/inp/process */ "../rum-core/dist/es/performance-monitoring/metrics/inp/process.js"); +/* harmony import */ var _metrics_inp_report__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./metrics/inp/report */ "../rum-core/dist/es/performance-monitoring/metrics/inp/report.js"); -var eventPairs = [['domainLookupStart', 'domainLookupEnd', 'Domain lookup'], ['connectStart', 'connectEnd', 'Making a connection to the server'], ['requestStart', 'responseEnd', 'Requesting and receiving the document'], ['domLoading', 'domInteractive', 'Parsing the document, executing sync. scripts'], ['domContentLoadedEventStart', 'domContentLoadedEventEnd', 'Fire "DOMContentLoaded" event'], ['loadEventStart', 'loadEventEnd', 'Fire "load" event']]; -function shouldCreateSpan(start, end, trStart, trEnd, baseTime) { - if (baseTime === void 0) { - baseTime = 0; - } - return typeof start === 'number' && typeof end === 'number' && start >= baseTime && end > start && start - baseTime >= trStart && end - baseTime <= trEnd && end - start < _common_constants__WEBPACK_IMPORTED_MODULE_0__.MAX_SPAN_DURATION && start - baseTime < _common_constants__WEBPACK_IMPORTED_MODULE_0__.MAX_SPAN_DURATION && end - baseTime < _common_constants__WEBPACK_IMPORTED_MODULE_0__.MAX_SPAN_DURATION; -} -function createNavigationTimingSpans(timings, baseTime, trStart, trEnd) { - var spans = []; - for (var i = 0; i < eventPairs.length; i++) { - var start = timings[eventPairs[i][0]]; - var end = timings[eventPairs[i][1]]; - if (!shouldCreateSpan(start, end, trStart, trEnd, baseTime)) { - continue; - } - var span = new _span__WEBPACK_IMPORTED_MODULE_1__.default(eventPairs[i][2], 'hard-navigation.browser-timing'); - var data = null; +function registerServices() { + _common_service_factory__WEBPACK_IMPORTED_MODULE_0__.serviceCreators[_common_constants__WEBPACK_IMPORTED_MODULE_1__.TRANSACTION_SERVICE] = function (serviceFactory) { + var _serviceFactory$getSe = serviceFactory.getService([_common_constants__WEBPACK_IMPORTED_MODULE_1__.LOGGING_SERVICE, _common_constants__WEBPACK_IMPORTED_MODULE_1__.CONFIG_SERVICE]), + loggingService = _serviceFactory$getSe[0], + configService = _serviceFactory$getSe[1]; - if (eventPairs[i][0] === 'requestStart') { - span.pageResponse = true; - data = { - url: location.origin - }; - } + return new _transaction_service__WEBPACK_IMPORTED_MODULE_2__["default"](loggingService, configService); + }; - span._start = start - baseTime; - span.end(end - baseTime, data); - spans.push(span); - } + _common_service_factory__WEBPACK_IMPORTED_MODULE_0__.serviceCreators[_common_constants__WEBPACK_IMPORTED_MODULE_1__.PERFORMANCE_MONITORING] = function (serviceFactory) { + var _serviceFactory$getSe2 = serviceFactory.getService([_common_constants__WEBPACK_IMPORTED_MODULE_1__.APM_SERVER, _common_constants__WEBPACK_IMPORTED_MODULE_1__.CONFIG_SERVICE, _common_constants__WEBPACK_IMPORTED_MODULE_1__.LOGGING_SERVICE, _common_constants__WEBPACK_IMPORTED_MODULE_1__.TRANSACTION_SERVICE]), + apmServer = _serviceFactory$getSe2[0], + configService = _serviceFactory$getSe2[1], + loggingService = _serviceFactory$getSe2[2], + transactionService = _serviceFactory$getSe2[3]; - return spans; + return new _performance_monitoring__WEBPACK_IMPORTED_MODULE_3__["default"](apmServer, configService, loggingService, transactionService); + }; } -function createResourceTimingSpan(resourceTimingEntry) { - var name = resourceTimingEntry.name, - initiatorType = resourceTimingEntry.initiatorType, - startTime = resourceTimingEntry.startTime, - responseEnd = resourceTimingEntry.responseEnd; - var kind = 'resource'; - if (initiatorType) { - kind += '.' + initiatorType; - } - var spanName = (0,_common_utils__WEBPACK_IMPORTED_MODULE_2__.stripQueryStringFromUrl)(name); - var span = new _span__WEBPACK_IMPORTED_MODULE_1__.default(spanName, kind); - span._start = startTime; - span.end(responseEnd, { - url: name, - entry: resourceTimingEntry - }); - return span; -} +/***/ }), -function isCapturedByPatching(resourceStartTime, requestPatchTime) { - return requestPatchTime != null && resourceStartTime > requestPatchTime; -} +/***/ "../rum-core/dist/es/performance-monitoring/metrics/inp/process.js": +/*!*************************************************************************!*\ + !*** ../rum-core/dist/es/performance-monitoring/metrics/inp/process.js ***! + \*************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { -function isIntakeAPIEndpoint(url) { - return /intake\/v\d+\/rum\/events/.test(url); -} +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ calculateInp: function() { return /* binding */ calculateInp; }, +/* harmony export */ inpState: function() { return /* binding */ inpState; }, +/* harmony export */ interactionCount: function() { return /* binding */ interactionCount; }, +/* harmony export */ observeUserInteractions: function() { return /* binding */ observeUserInteractions; }, +/* harmony export */ processUserInteractions: function() { return /* binding */ processUserInteractions; }, +/* harmony export */ restoreINPState: function() { return /* binding */ restoreINPState; } +/* harmony export */ }); +/* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../common/constants */ "../rum-core/dist/es/common/constants.js"); +/* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../common/utils */ "../rum-core/dist/es/common/utils.js"); +/* harmony import */ var _metrics__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../metrics */ "../rum-core/dist/es/performance-monitoring/metrics/metrics.js"); -function createResourceTimingSpans(entries, requestPatchTime, trStart, trEnd) { - var spans = []; - for (var i = 0; i < entries.length; i++) { - var _entries$i = entries[i], - initiatorType = _entries$i.initiatorType, - name = _entries$i.name, - startTime = _entries$i.startTime, - responseEnd = _entries$i.responseEnd; - if (_common_constants__WEBPACK_IMPORTED_MODULE_0__.RESOURCE_INITIATOR_TYPES.indexOf(initiatorType) === -1 || name == null) { - continue; - } +var INP_THRESHOLD = 40; +var MAX_INTERACTIONS_TO_CONSIDER = 10; +var inpState = { + minInteractionId: Infinity, + maxInteractionId: 0, + interactionCount: 0, + longestInteractions: [] +}; +function observeUserInteractions(recorder) { + if (recorder === void 0) { + recorder = new _metrics__WEBPACK_IMPORTED_MODULE_0__.PerfEntryRecorder(processUserInteractions); + } - if ((initiatorType === 'xmlhttprequest' || initiatorType === 'fetch') && (isIntakeAPIEndpoint(name) || isCapturedByPatching(startTime, requestPatchTime))) { - continue; - } + var isPerfCountSupported = (0,_common_utils__WEBPACK_IMPORTED_MODULE_1__.isPerfInteractionCountSupported)(); + var durationThreshold = isPerfCountSupported ? INP_THRESHOLD : 16; + recorder.start(_common_constants__WEBPACK_IMPORTED_MODULE_2__.EVENT, { + buffered: true, + durationThreshold: durationThreshold + }); - if (shouldCreateSpan(startTime, responseEnd, trStart, trEnd)) { - spans.push(createResourceTimingSpan(entries[i])); - } + if (!isPerfCountSupported) { + recorder.start(_common_constants__WEBPACK_IMPORTED_MODULE_2__.FIRST_INPUT); } - - return spans; } +function processUserInteractions(list) { + var entries = list.getEntries(); + entries.forEach(function (entry) { + if (!entry.interactionId) { + return; + } -function createUserTimingSpans(entries, trStart, trEnd) { - var userTimingSpans = []; + updateInteractionCount(entry); - for (var i = 0; i < entries.length; i++) { - var _entries$i2 = entries[i], - name = _entries$i2.name, - startTime = _entries$i2.startTime, - duration = _entries$i2.duration; - var end = startTime + duration; + if (entry.duration < INP_THRESHOLD) { + return; + } - if (duration <= _common_constants__WEBPACK_IMPORTED_MODULE_0__.USER_TIMING_THRESHOLD || !shouldCreateSpan(startTime, end, trStart, trEnd)) { - continue; + storeUserInteraction(entry); + }); +} +function calculateInp() { + if (inpState.longestInteractions.length === 0) { + if (interactionCount() > 0) { + return 0; } - var kind = 'app'; - var span = new _span__WEBPACK_IMPORTED_MODULE_1__.default(name, kind); - span._start = startTime; - span.end(end); - userTimingSpans.push(span); + return; } - return userTimingSpans; + var interactionIndex = Math.min(inpState.longestInteractions.length - 1, Math.floor(interactionCount() / 50)); + var inp = inpState.longestInteractions[interactionIndex].duration; + return inp; +} +function interactionCount() { + return performance.interactionCount || inpState.interactionCount; +} +function restoreINPState() { + inpState.minInteractionId = Infinity; + inpState.maxInteractionId = 0; + inpState.interactionCount = 0; + inpState.longestInteractions = []; } -var NAVIGATION_TIMING_MARKS = ['fetchStart', 'domainLookupStart', 'domainLookupEnd', 'connectStart', 'connectEnd', 'requestStart', 'responseStart', 'responseEnd', 'domLoading', 'domInteractive', 'domContentLoadedEventStart', 'domContentLoadedEventEnd', 'domComplete', 'loadEventStart', 'loadEventEnd']; -var COMPRESSED_NAV_TIMING_MARKS = ['fs', 'ls', 'le', 'cs', 'ce', 'qs', 'rs', 're', 'dl', 'di', 'ds', 'de', 'dc', 'es', 'ee']; +function storeUserInteraction(entry) { + var leastSlow = inpState.longestInteractions[inpState.longestInteractions.length - 1]; -function getNavigationTimingMarks(timing) { - var fetchStart = timing.fetchStart, - navigationStart = timing.navigationStart, - responseStart = timing.responseStart, - responseEnd = timing.responseEnd; + if (typeof leastSlow !== 'undefined' && entry.duration <= leastSlow.duration && entry.interactionId != leastSlow.id) { + return; + } - if (fetchStart >= navigationStart && responseStart >= fetchStart && responseEnd >= responseStart) { - var marks = {}; - NAVIGATION_TIMING_MARKS.forEach(function (timingKey) { - var m = timing[timingKey]; + var filteredInteraction = inpState.longestInteractions.filter(function (interaction) { + return interaction.id === entry.interactionId; + }); - if (m && m >= fetchStart) { - marks[timingKey] = parseInt(m - fetchStart); - } + if (filteredInteraction.length > 0) { + var foundInteraction = filteredInteraction[0]; + foundInteraction.duration = Math.max(foundInteraction.duration, entry.duration); + } else { + inpState.longestInteractions.push({ + id: entry.interactionId, + duration: entry.duration }); - return marks; } - return null; + inpState.longestInteractions.sort(function (a, b) { + return b.duration - a.duration; + }); + inpState.longestInteractions.splice(MAX_INTERACTIONS_TO_CONSIDER); } -function getPageLoadMarks(timing) { - var marks = getNavigationTimingMarks(timing); - - if (marks == null) { - return null; +function updateInteractionCount(entry) { + if ((0,_common_utils__WEBPACK_IMPORTED_MODULE_1__.isPerfInteractionCountSupported)()) { + return; } - return { - navigationTiming: marks, - agent: { - timeToFirstByte: marks.responseStart, - domInteractive: marks.domInteractive, - domComplete: marks.domComplete - } - }; + inpState.minInteractionId = Math.min(inpState.minInteractionId, entry.interactionId); + inpState.maxInteractionId = Math.max(inpState.maxInteractionId, entry.interactionId); + inpState.interactionCount = (inpState.maxInteractionId - inpState.minInteractionId) / 7 + 1; } -function captureNavigation(transaction) { - if (!transaction.captureTimings) { - return; - } +/***/ }), - var trEnd = transaction._end; +/***/ "../rum-core/dist/es/performance-monitoring/metrics/inp/report.js": +/*!************************************************************************!*\ + !*** ../rum-core/dist/es/performance-monitoring/metrics/inp/report.js ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - if (transaction.type === _common_constants__WEBPACK_IMPORTED_MODULE_0__.PAGE_LOAD) { - if (transaction.marks && transaction.marks.custom) { - var customMarks = transaction.marks.custom; - Object.keys(customMarks).forEach(function (key) { - customMarks[key] += transaction._start; - }); - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ reportInp: function() { return /* binding */ reportInp; } +/* harmony export */ }); +/* harmony import */ var _process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./process */ "../rum-core/dist/es/performance-monitoring/metrics/inp/process.js"); +/* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../common/utils */ "../rum-core/dist/es/common/utils.js"); +/* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../common/constants */ "../rum-core/dist/es/common/constants.js"); - var trStart = 0; - transaction._start = trStart; - var timings = _common_utils__WEBPACK_IMPORTED_MODULE_2__.PERF.timing; - createNavigationTimingSpans(timings, timings.fetchStart, trStart, trEnd).forEach(function (span) { - span.traceId = transaction.traceId; - span.sampled = transaction.sampled; - if (span.pageResponse && transaction.options.pageLoadSpanId) { - span.id = transaction.options.pageLoadSpanId; - } - transaction.spans.push(span); - }); - transaction.addMarks(getPageLoadMarks(timings)); - } +function reportInp(transactionService) { + var inp = (0,_process__WEBPACK_IMPORTED_MODULE_0__.calculateInp)(); - if ((0,_common_utils__WEBPACK_IMPORTED_MODULE_2__.isPerfTimelineSupported)()) { - var _trStart = transaction._start; - var resourceEntries = _common_utils__WEBPACK_IMPORTED_MODULE_2__.PERF.getEntriesByType(_common_constants__WEBPACK_IMPORTED_MODULE_0__.RESOURCE); - createResourceTimingSpans(resourceEntries, _state__WEBPACK_IMPORTED_MODULE_3__.state.bootstrapTime, _trStart, trEnd).forEach(function (span) { - return transaction.spans.push(span); + if (inp >= 0) { + var startTime = (0,_common_utils__WEBPACK_IMPORTED_MODULE_1__.now)(); + var inpTr = transactionService.startTransaction(_common_constants__WEBPACK_IMPORTED_MODULE_2__.PAGE_EXIT, _common_constants__WEBPACK_IMPORTED_MODULE_2__.PAGE_EXIT, { + startTime: startTime }); - var userEntries = _common_utils__WEBPACK_IMPORTED_MODULE_2__.PERF.getEntriesByType(_common_constants__WEBPACK_IMPORTED_MODULE_0__.MEASURE); - createUserTimingSpans(userEntries, _trStart, trEnd).forEach(function (span) { - return transaction.spans.push(span); + var navigations = performance.getEntriesByType('navigation'); + + if (navigations.length > 0) { + var hardNavigationUrl = navigations[0].name; + inpTr.addContext({ + page: { + url: hardNavigationUrl + } + }); + } + + inpTr.addLabels({ + inp_value: inp }); + var endTime = startTime + inp + 1; + inpTr.end(endTime); + (0,_process__WEBPACK_IMPORTED_MODULE_0__.restoreINPState)(); + return inpTr; } } - - /***/ }), -/***/ "../rum-core/dist/es/performance-monitoring/index.js": -/*!***********************************************************!*\ - !*** ../rum-core/dist/es/performance-monitoring/index.js ***! - \***********************************************************/ +/***/ "../rum-core/dist/es/performance-monitoring/metrics/metrics.js": +/*!*********************************************************************!*\ + !*** ../rum-core/dist/es/performance-monitoring/metrics/metrics.js ***! + \*********************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "registerServices": function() { return /* binding */ registerServices; } +/* harmony export */ PerfEntryRecorder: function() { return /* binding */ PerfEntryRecorder; }, +/* harmony export */ calculateCumulativeLayoutShift: function() { return /* binding */ calculateCumulativeLayoutShift; }, +/* harmony export */ calculateTotalBlockingTime: function() { return /* binding */ calculateTotalBlockingTime; }, +/* harmony export */ captureObserverEntries: function() { return /* binding */ captureObserverEntries; }, +/* harmony export */ createFirstInputDelaySpan: function() { return /* binding */ createFirstInputDelaySpan; }, +/* harmony export */ createLongTaskSpans: function() { return /* binding */ createLongTaskSpans; }, +/* harmony export */ createTotalBlockingTimeSpan: function() { return /* binding */ createTotalBlockingTimeSpan; }, +/* harmony export */ metrics: function() { return /* binding */ metrics; } /* harmony export */ }); -/* harmony import */ var _performance_monitoring__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./performance-monitoring */ "../rum-core/dist/es/performance-monitoring/performance-monitoring.js"); -/* harmony import */ var _transaction_service__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./transaction-service */ "../rum-core/dist/es/performance-monitoring/transaction-service.js"); -/* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common/constants */ "../rum-core/dist/es/common/constants.js"); -/* harmony import */ var _common_service_factory__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../common/service-factory */ "../rum-core/dist/es/common/service-factory.js"); - - - - +/* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../common/constants */ "../rum-core/dist/es/common/constants.js"); +/* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../common/utils */ "../rum-core/dist/es/common/utils.js"); +/* harmony import */ var _span__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../span */ "../rum-core/dist/es/performance-monitoring/span.js"); +function _extends() { + _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; -function registerServices() { - _common_service_factory__WEBPACK_IMPORTED_MODULE_0__.serviceCreators[_common_constants__WEBPACK_IMPORTED_MODULE_1__.TRANSACTION_SERVICE] = function (serviceFactory) { - var _serviceFactory$getSe = serviceFactory.getService([_common_constants__WEBPACK_IMPORTED_MODULE_1__.LOGGING_SERVICE, _common_constants__WEBPACK_IMPORTED_MODULE_1__.CONFIG_SERVICE]), - loggingService = _serviceFactory$getSe[0], - configService = _serviceFactory$getSe[1]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } - return new _transaction_service__WEBPACK_IMPORTED_MODULE_2__.default(loggingService, configService); + return target; }; - _common_service_factory__WEBPACK_IMPORTED_MODULE_0__.serviceCreators[_common_constants__WEBPACK_IMPORTED_MODULE_1__.PERFORMANCE_MONITORING] = function (serviceFactory) { - var _serviceFactory$getSe2 = serviceFactory.getService([_common_constants__WEBPACK_IMPORTED_MODULE_1__.APM_SERVER, _common_constants__WEBPACK_IMPORTED_MODULE_1__.CONFIG_SERVICE, _common_constants__WEBPACK_IMPORTED_MODULE_1__.LOGGING_SERVICE, _common_constants__WEBPACK_IMPORTED_MODULE_1__.TRANSACTION_SERVICE]), - apmServer = _serviceFactory$getSe2[0], - configService = _serviceFactory$getSe2[1], - loggingService = _serviceFactory$getSe2[2], - transactionService = _serviceFactory$getSe2[3]; - - return new _performance_monitoring__WEBPACK_IMPORTED_MODULE_3__.default(apmServer, configService, loggingService, transactionService); - }; + return _extends.apply(this, arguments); } -/***/ }), - -/***/ "../rum-core/dist/es/performance-monitoring/metrics.js": -/*!*************************************************************!*\ - !*** ../rum-core/dist/es/performance-monitoring/metrics.js ***! - \*************************************************************/ -/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "metrics": function() { return /* binding */ metrics; }, -/* harmony export */ "createLongTaskSpans": function() { return /* binding */ createLongTaskSpans; }, -/* harmony export */ "createFirstInputDelaySpan": function() { return /* binding */ createFirstInputDelaySpan; }, -/* harmony export */ "createTotalBlockingTimeSpan": function() { return /* binding */ createTotalBlockingTimeSpan; }, -/* harmony export */ "calculateTotalBlockingTime": function() { return /* binding */ calculateTotalBlockingTime; }, -/* harmony export */ "calculateCumulativeLayoutShift": function() { return /* binding */ calculateCumulativeLayoutShift; }, -/* harmony export */ "captureObserverEntries": function() { return /* binding */ captureObserverEntries; }, -/* harmony export */ "PerfEntryRecorder": function() { return /* binding */ PerfEntryRecorder; } -/* harmony export */ }); -/* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common/constants */ "../rum-core/dist/es/common/constants.js"); -/* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../common/utils */ "../rum-core/dist/es/common/utils.js"); -/* harmony import */ var _span__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./span */ "../rum-core/dist/es/performance-monitoring/span.js"); - - var metrics = { fid: 0, @@ -4711,7 +4738,7 @@ function createLongTaskSpans(longtasks, agg) { duration = _longtasks$i.duration, attribution = _longtasks$i.attribution; var end = startTime + duration; - var span = new _span__WEBPACK_IMPORTED_MODULE_0__.default("Longtask(" + name + ")", _common_constants__WEBPACK_IMPORTED_MODULE_1__.LONG_TASK, { + var span = new _span__WEBPACK_IMPORTED_MODULE_0__["default"]("Longtask(" + name + ")", _common_constants__WEBPACK_IMPORTED_MODULE_1__.LONG_TASK, { startTime: startTime }); agg.count++; @@ -4754,7 +4781,7 @@ function createFirstInputDelaySpan(fidEntries) { if (firstInput) { var startTime = firstInput.startTime, processingStart = firstInput.processingStart; - var span = new _span__WEBPACK_IMPORTED_MODULE_0__.default('First Input Delay', _common_constants__WEBPACK_IMPORTED_MODULE_1__.FIRST_INPUT, { + var span = new _span__WEBPACK_IMPORTED_MODULE_0__["default"]('First Input Delay', _common_constants__WEBPACK_IMPORTED_MODULE_1__.FIRST_INPUT, { startTime: startTime }); span.end(processingStart); @@ -4764,7 +4791,7 @@ function createFirstInputDelaySpan(fidEntries) { function createTotalBlockingTimeSpan(tbtObject) { var start = tbtObject.start, duration = tbtObject.duration; - var tbtSpan = new _span__WEBPACK_IMPORTED_MODULE_0__.default('Total Blocking Time', _common_constants__WEBPACK_IMPORTED_MODULE_1__.LONG_TASK, { + var tbtSpan = new _span__WEBPACK_IMPORTED_MODULE_0__["default"]('Total Blocking Time', _common_constants__WEBPACK_IMPORTED_MODULE_1__.LONG_TASK, { startTime: start }); tbtSpan.end(start + duration); @@ -4835,6 +4862,11 @@ function captureObserverEntries(list, _ref) { var timing = _common_utils__WEBPACK_IMPORTED_MODULE_2__.PERF.timing; var unloadDiff = timing.fetchStart - timing.navigationStart; + + if ((0,_common_utils__WEBPACK_IMPORTED_MODULE_2__.isRedirectInfoAvailable)(timing)) { + unloadDiff = 0; + } + var fcpEntry = list.getEntriesByName(_common_constants__WEBPACK_IMPORTED_MODULE_1__.FIRST_CONTENTFUL_PAINT)[0]; if (fcpEntry) { @@ -4870,12 +4902,21 @@ var PerfEntryRecorder = function () { var _proto = PerfEntryRecorder.prototype; - _proto.start = function start(type) { - try { - this.po.observe({ - type: type, + _proto.start = function start(type, options) { + if (options === void 0) { + options = { buffered: true - }); + }; + } + + try { + if (!(0,_common_utils__WEBPACK_IMPORTED_MODULE_2__.isPerfTypeSupported)(type)) { + return; + } + + this.po.observe(_extends({ + type: type + }, options)); } catch (_) {} }; @@ -4886,6 +4927,360 @@ var PerfEntryRecorder = function () { return PerfEntryRecorder; }(); +/***/ }), + +/***/ "../rum-core/dist/es/performance-monitoring/navigation/capture-navigation.js": +/*!***********************************************************************************!*\ + !*** ../rum-core/dist/es/performance-monitoring/navigation/capture-navigation.js ***! + \***********************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ captureNavigation: function() { return /* binding */ captureNavigation; }, +/* harmony export */ createNavigationTimingSpans: function() { return /* reexport safe */ _navigation_timing__WEBPACK_IMPORTED_MODULE_2__.createNavigationTimingSpans; }, +/* harmony export */ createResourceTimingSpans: function() { return /* reexport safe */ _resource_timing__WEBPACK_IMPORTED_MODULE_4__.createResourceTimingSpans; }, +/* harmony export */ createUserTimingSpans: function() { return /* reexport safe */ _user_timing__WEBPACK_IMPORTED_MODULE_6__.createUserTimingSpans; }, +/* harmony export */ getPageLoadMarks: function() { return /* reexport safe */ _marks__WEBPACK_IMPORTED_MODULE_3__.getPageLoadMarks; } +/* harmony export */ }); +/* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../common/utils */ "../rum-core/dist/es/common/utils.js"); +/* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../common/constants */ "../rum-core/dist/es/common/constants.js"); +/* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../state */ "../rum-core/dist/es/state.js"); +/* harmony import */ var _navigation_timing__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./navigation-timing */ "../rum-core/dist/es/performance-monitoring/navigation/navigation-timing.js"); +/* harmony import */ var _user_timing__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./user-timing */ "../rum-core/dist/es/performance-monitoring/navigation/user-timing.js"); +/* harmony import */ var _resource_timing__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./resource-timing */ "../rum-core/dist/es/performance-monitoring/navigation/resource-timing.js"); +/* harmony import */ var _marks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./marks */ "../rum-core/dist/es/performance-monitoring/navigation/marks.js"); + + + + + + + + +function captureNavigation(transaction) { + if (!transaction.captureTimings) { + if (transaction.type === _common_constants__WEBPACK_IMPORTED_MODULE_0__.PAGE_LOAD) { + transaction._start = 0; + } + + return; + } + + var trEnd = transaction._end; + + if (transaction.type === _common_constants__WEBPACK_IMPORTED_MODULE_0__.PAGE_LOAD) { + if (transaction.marks && transaction.marks.custom) { + var customMarks = transaction.marks.custom; + Object.keys(customMarks).forEach(function (key) { + customMarks[key] += transaction._start; + }); + } + + var trStart = 0; + transaction._start = trStart; + var timings = _common_utils__WEBPACK_IMPORTED_MODULE_1__.PERF.timing; + var baseTime = (0,_common_utils__WEBPACK_IMPORTED_MODULE_1__.isRedirectInfoAvailable)(timings) ? timings.redirectStart : timings.fetchStart; + (0,_navigation_timing__WEBPACK_IMPORTED_MODULE_2__.createNavigationTimingSpans)(timings, baseTime, trStart, trEnd).forEach(function (span) { + span.traceId = transaction.traceId; + span.sampled = transaction.sampled; + + if (span.pageResponse && transaction.options.pageLoadSpanId) { + span.id = transaction.options.pageLoadSpanId; + } + + transaction.spans.push(span); + }); + + if (transaction.options.pageLoadParentId) { + transaction.parentId = transaction.options.pageLoadParentId; + } + + transaction.addMarks((0,_marks__WEBPACK_IMPORTED_MODULE_3__.getPageLoadMarks)(timings)); + } + + if ((0,_common_utils__WEBPACK_IMPORTED_MODULE_1__.isPerfTimelineSupported)()) { + var _trStart = transaction._start; + var resourceEntries = _common_utils__WEBPACK_IMPORTED_MODULE_1__.PERF.getEntriesByType(_common_constants__WEBPACK_IMPORTED_MODULE_0__.RESOURCE); + (0,_resource_timing__WEBPACK_IMPORTED_MODULE_4__.createResourceTimingSpans)(resourceEntries, _state__WEBPACK_IMPORTED_MODULE_5__.state.bootstrapTime, _trStart, trEnd).forEach(function (span) { + return transaction.spans.push(span); + }); + var userEntries = _common_utils__WEBPACK_IMPORTED_MODULE_1__.PERF.getEntriesByType(_common_constants__WEBPACK_IMPORTED_MODULE_0__.MEASURE); + (0,_user_timing__WEBPACK_IMPORTED_MODULE_6__.createUserTimingSpans)(userEntries, _trStart, trEnd).forEach(function (span) { + return transaction.spans.push(span); + }); + } +} + + + +/***/ }), + +/***/ "../rum-core/dist/es/performance-monitoring/navigation/marks.js": +/*!**********************************************************************!*\ + !*** ../rum-core/dist/es/performance-monitoring/navigation/marks.js ***! + \**********************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ COMPRESSED_NAV_TIMING_MARKS: function() { return /* binding */ COMPRESSED_NAV_TIMING_MARKS; }, +/* harmony export */ NAVIGATION_TIMING_MARKS: function() { return /* binding */ NAVIGATION_TIMING_MARKS; }, +/* harmony export */ getPageLoadMarks: function() { return /* binding */ getPageLoadMarks; } +/* harmony export */ }); +/* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../common/utils */ "../rum-core/dist/es/common/utils.js"); + +var NAVIGATION_TIMING_MARKS = ['fetchStart', 'domainLookupStart', 'domainLookupEnd', 'connectStart', 'connectEnd', 'requestStart', 'responseStart', 'responseEnd', 'domLoading', 'domInteractive', 'domContentLoadedEventStart', 'domContentLoadedEventEnd', 'domComplete', 'loadEventStart', 'loadEventEnd']; +var COMPRESSED_NAV_TIMING_MARKS = ['fs', 'ls', 'le', 'cs', 'ce', 'qs', 'rs', 're', 'dl', 'di', 'ds', 'de', 'dc', 'es', 'ee']; + +function getPageLoadMarks(timing) { + var marks = getNavigationTimingMarks(timing); + + if (marks == null) { + return null; + } + + return { + navigationTiming: marks, + agent: { + timeToFirstByte: marks.responseStart, + domInteractive: marks.domInteractive, + domComplete: marks.domComplete + } + }; +} + +function getNavigationTimingMarks(timing) { + var redirectStart = timing.redirectStart, + fetchStart = timing.fetchStart, + navigationStart = timing.navigationStart, + responseStart = timing.responseStart, + responseEnd = timing.responseEnd; + + if (fetchStart >= navigationStart && responseStart >= fetchStart && responseEnd >= responseStart) { + var marks = {}; + NAVIGATION_TIMING_MARKS.forEach(function (timingKey) { + var m = timing[timingKey]; + + if (m && m >= fetchStart) { + if ((0,_common_utils__WEBPACK_IMPORTED_MODULE_0__.isRedirectInfoAvailable)(timing)) { + marks[timingKey] = parseInt(m - redirectStart); + } else { + marks[timingKey] = parseInt(m - fetchStart); + } + } + }); + return marks; + } + + return null; +} + + + +/***/ }), + +/***/ "../rum-core/dist/es/performance-monitoring/navigation/navigation-timing.js": +/*!**********************************************************************************!*\ + !*** ../rum-core/dist/es/performance-monitoring/navigation/navigation-timing.js ***! + \**********************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createNavigationTimingSpans: function() { return /* binding */ createNavigationTimingSpans; } +/* harmony export */ }); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "../rum-core/dist/es/performance-monitoring/navigation/utils.js"); +/* harmony import */ var _span__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../span */ "../rum-core/dist/es/performance-monitoring/span.js"); + + +var eventPairs = [['redirectStart', 'redirectEnd', 'Redirect'], ['domainLookupStart', 'domainLookupEnd', 'Domain lookup'], ['connectStart', 'connectEnd', 'Making a connection to the server'], ['requestStart', 'responseEnd', 'Requesting and receiving the document'], ['domLoading', 'domInteractive', 'Parsing the document, executing sync. scripts'], ['domContentLoadedEventStart', 'domContentLoadedEventEnd', 'Fire "DOMContentLoaded" event'], ['loadEventStart', 'loadEventEnd', 'Fire "load" event']]; + +function createNavigationTimingSpans(timings, baseTime, trStart, trEnd) { + var spans = []; + + for (var i = 0; i < eventPairs.length; i++) { + var start = timings[eventPairs[i][0]]; + var end = timings[eventPairs[i][1]]; + + if (!(0,_utils__WEBPACK_IMPORTED_MODULE_0__.shouldCreateSpan)(start, end, trStart, trEnd, baseTime)) { + continue; + } + + var span = new _span__WEBPACK_IMPORTED_MODULE_1__["default"](eventPairs[i][2], 'hard-navigation.browser-timing'); + var data = null; + + if (eventPairs[i][0] === 'requestStart') { + span.pageResponse = true; + data = { + url: location.origin + }; + } + + span._start = start - baseTime; + span.end(end - baseTime, data); + spans.push(span); + } + + return spans; +} + + + +/***/ }), + +/***/ "../rum-core/dist/es/performance-monitoring/navigation/resource-timing.js": +/*!********************************************************************************!*\ + !*** ../rum-core/dist/es/performance-monitoring/navigation/resource-timing.js ***! + \********************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createResourceTimingSpans: function() { return /* binding */ createResourceTimingSpans; } +/* harmony export */ }); +/* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../common/utils */ "../rum-core/dist/es/common/utils.js"); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "../rum-core/dist/es/performance-monitoring/navigation/utils.js"); +/* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../common/constants */ "../rum-core/dist/es/common/constants.js"); +/* harmony import */ var _span__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../span */ "../rum-core/dist/es/performance-monitoring/span.js"); + + + + + +function createResourceTimingSpan(resourceTimingEntry) { + var name = resourceTimingEntry.name, + initiatorType = resourceTimingEntry.initiatorType, + startTime = resourceTimingEntry.startTime, + responseEnd = resourceTimingEntry.responseEnd; + var kind = 'resource'; + + if (initiatorType) { + kind += '.' + initiatorType; + } + + var spanName = (0,_common_utils__WEBPACK_IMPORTED_MODULE_0__.stripQueryStringFromUrl)(name); + var span = new _span__WEBPACK_IMPORTED_MODULE_1__["default"](spanName, kind); + span._start = startTime; + span.end(responseEnd, { + url: name, + entry: resourceTimingEntry + }); + return span; +} + +function isCapturedByPatching(resourceStartTime, requestPatchTime) { + return requestPatchTime != null && resourceStartTime > requestPatchTime; +} + +function isIntakeAPIEndpoint(url) { + return /intake\/v\d+\/rum\/events/.test(url); +} + +function createResourceTimingSpans(entries, requestPatchTime, trStart, trEnd) { + var spans = []; + + for (var i = 0; i < entries.length; i++) { + var _entries$i = entries[i], + initiatorType = _entries$i.initiatorType, + name = _entries$i.name, + startTime = _entries$i.startTime, + responseEnd = _entries$i.responseEnd; + + if (_common_constants__WEBPACK_IMPORTED_MODULE_2__.RESOURCE_INITIATOR_TYPES.indexOf(initiatorType) === -1 || name == null) { + continue; + } + + if ((initiatorType === 'xmlhttprequest' || initiatorType === 'fetch') && (isIntakeAPIEndpoint(name) || isCapturedByPatching(startTime, requestPatchTime))) { + continue; + } + + if ((0,_utils__WEBPACK_IMPORTED_MODULE_3__.shouldCreateSpan)(startTime, responseEnd, trStart, trEnd)) { + spans.push(createResourceTimingSpan(entries[i])); + } + } + + return spans; +} + + + +/***/ }), + +/***/ "../rum-core/dist/es/performance-monitoring/navigation/user-timing.js": +/*!****************************************************************************!*\ + !*** ../rum-core/dist/es/performance-monitoring/navigation/user-timing.js ***! + \****************************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ createUserTimingSpans: function() { return /* binding */ createUserTimingSpans; } +/* harmony export */ }); +/* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../common/constants */ "../rum-core/dist/es/common/constants.js"); +/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "../rum-core/dist/es/performance-monitoring/navigation/utils.js"); +/* harmony import */ var _span__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../span */ "../rum-core/dist/es/performance-monitoring/span.js"); + + + + +function createUserTimingSpans(entries, trStart, trEnd) { + var userTimingSpans = []; + + for (var i = 0; i < entries.length; i++) { + var _entries$i = entries[i], + name = _entries$i.name, + startTime = _entries$i.startTime, + duration = _entries$i.duration; + var end = startTime + duration; + + if (duration <= _common_constants__WEBPACK_IMPORTED_MODULE_0__.USER_TIMING_THRESHOLD || !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.shouldCreateSpan)(startTime, end, trStart, trEnd)) { + continue; + } + + var kind = 'app'; + var span = new _span__WEBPACK_IMPORTED_MODULE_2__["default"](name, kind); + span._start = startTime; + span.end(end); + userTimingSpans.push(span); + } + + return userTimingSpans; +} + + + +/***/ }), + +/***/ "../rum-core/dist/es/performance-monitoring/navigation/utils.js": +/*!**********************************************************************!*\ + !*** ../rum-core/dist/es/performance-monitoring/navigation/utils.js ***! + \**********************************************************************/ +/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export */ __webpack_require__.d(__webpack_exports__, { +/* harmony export */ shouldCreateSpan: function() { return /* binding */ shouldCreateSpan; } +/* harmony export */ }); +/* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../common/constants */ "../rum-core/dist/es/common/constants.js"); + + +function shouldCreateSpan(start, end, trStart, trEnd, baseTime) { + if (baseTime === void 0) { + baseTime = 0; + } + + return typeof start === 'number' && typeof end === 'number' && start >= baseTime && end > start && start - baseTime >= trStart && end - baseTime <= trEnd && end - start < _common_constants__WEBPACK_IMPORTED_MODULE_0__.MAX_SPAN_DURATION && start - baseTime < _common_constants__WEBPACK_IMPORTED_MODULE_0__.MAX_SPAN_DURATION && end - baseTime < _common_constants__WEBPACK_IMPORTED_MODULE_0__.MAX_SPAN_DURATION; +} + + + /***/ }), /***/ "../rum-core/dist/es/performance-monitoring/performance-monitoring.js": @@ -4897,9 +5292,9 @@ var PerfEntryRecorder = function () { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "groupSmallContinuouslySimilarSpans": function() { return /* binding */ groupSmallContinuouslySimilarSpans; }, -/* harmony export */ "adjustTransaction": function() { return /* binding */ adjustTransaction; }, -/* harmony export */ "default": function() { return /* binding */ PerformanceMonitoring; } +/* harmony export */ adjustTransaction: function() { return /* binding */ adjustTransaction; }, +/* harmony export */ "default": function() { return /* binding */ PerformanceMonitoring; }, +/* harmony export */ groupSmallContinuouslySimilarSpans: function() { return /* binding */ groupSmallContinuouslySimilarSpans; } /* harmony export */ }); /* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../common/utils */ "../rum-core/dist/es/common/utils.js"); /* harmony import */ var _common_url__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../common/url */ "../rum-core/dist/es/common/url.js"); @@ -5227,6 +5622,7 @@ var PerformanceMonitoring = function () { }); var transactionData = { id: transaction.id, + parent_id: transaction.parentId, trace_id: transaction.traceId, session: transaction.session, name: transaction.name, @@ -5254,6 +5650,8 @@ var PerformanceMonitoring = function () { if (filtered) { return this.createTransactionDataModel(transaction); } + + this._configService.dispatchEvent(_common_constants__WEBPACK_IMPORTED_MODULE_0__.TRANSACTION_IGNORE); }; return PerformanceMonitoring; @@ -5334,7 +5732,7 @@ var SpanBase = function () { if (context.length === 0) return; this.ensureContext(); - _common_utils__WEBPACK_IMPORTED_MODULE_1__.merge.apply(void 0, [this.context].concat(context)); + this.context = _common_utils__WEBPACK_IMPORTED_MODULE_1__.merge.apply(void 0, [this.context].concat(context)); }; _proto.end = function end(endTime) { @@ -5425,7 +5823,7 @@ var Span = function (_SpanBase) { }; return Span; -}(_span_base__WEBPACK_IMPORTED_MODULE_1__.default); +}(_span_base__WEBPACK_IMPORTED_MODULE_1__["default"]); /* harmony default export */ __webpack_exports__["default"] = (Span); @@ -5441,9 +5839,9 @@ var Span = function (_SpanBase) { __webpack_require__.r(__webpack_exports__); /* harmony import */ var _common_polyfills__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../common/polyfills */ "../rum-core/dist/es/common/polyfills.js"); /* harmony import */ var _transaction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./transaction */ "../rum-core/dist/es/performance-monitoring/transaction.js"); -/* harmony import */ var _metrics__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./metrics */ "../rum-core/dist/es/performance-monitoring/metrics.js"); +/* harmony import */ var _metrics_metrics__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./metrics/metrics */ "../rum-core/dist/es/performance-monitoring/metrics/metrics.js"); /* harmony import */ var _common_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../common/utils */ "../rum-core/dist/es/common/utils.js"); -/* harmony import */ var _capture_navigation__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./capture-navigation */ "../rum-core/dist/es/performance-monitoring/capture-navigation.js"); +/* harmony import */ var _navigation_capture_navigation__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./navigation/capture-navigation */ "../rum-core/dist/es/performance-monitoring/navigation/capture-navigation.js"); /* harmony import */ var _common_constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../common/constants */ "../rum-core/dist/es/common/constants.js"); /* harmony import */ var _common_context__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../common/context */ "../rum-core/dist/es/common/context.js"); /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../state */ "../rum-core/dist/es/state.js"); @@ -5466,7 +5864,7 @@ var TransactionService = function () { this._logger = logger; this.currentTransaction = undefined; this.respIntervalId = undefined; - this.recorder = new _metrics__WEBPACK_IMPORTED_MODULE_0__.PerfEntryRecorder(function (list) { + this.recorder = new _metrics_metrics__WEBPACK_IMPORTED_MODULE_0__.PerfEntryRecorder(function (list) { var tr = _this.getCurrentTransaction(); if (tr && tr.captureTimings) { @@ -5474,7 +5872,7 @@ var TransactionService = function () { var isHardNavigation = tr.type === _common_constants__WEBPACK_IMPORTED_MODULE_1__.PAGE_LOAD; - var _captureObserverEntri = (0,_metrics__WEBPACK_IMPORTED_MODULE_0__.captureObserverEntries)(list, { + var _captureObserverEntri = (0,_metrics_metrics__WEBPACK_IMPORTED_MODULE_0__.captureObserverEntries)(list, { isHardNavigation: isHardNavigation, trStart: isHardNavigation ? 0 : tr._start }), @@ -5493,7 +5891,7 @@ var TransactionService = function () { var _proto = TransactionService.prototype; _proto.createCurrentTransaction = function createCurrentTransaction(name, type, options) { - var tr = new _transaction__WEBPACK_IMPORTED_MODULE_2__.default(name, type, options); + var tr = new _transaction__WEBPACK_IMPORTED_MODULE_2__["default"](name, type, options); this.currentTransaction = tr; return tr; }; @@ -5516,7 +5914,8 @@ var TransactionService = function () { pageLoadTraceId: config.pageLoadTraceId, pageLoadSampled: config.pageLoadSampled, pageLoadSpanId: config.pageLoadSpanId, - pageLoadTransactionName: config.pageLoadTransactionName + pageLoadTransactionName: config.pageLoadTransactionName, + pageLoadParentId: config.pageLoadParentId }, perfOptions); } @@ -5600,7 +5999,7 @@ var TransactionService = function () { fireOnstartHook = false; } } else { - tr = new _transaction__WEBPACK_IMPORTED_MODULE_2__.default(name, type, perfOptions); + tr = new _transaction__WEBPACK_IMPORTED_MODULE_2__["default"](name, type, perfOptions); } tr.onEnd = function () { @@ -5633,6 +6032,8 @@ var TransactionService = function () { _this3._logger.debug("transaction(" + tr.id + ", " + name + ", " + type + ") was discarded! The page was hidden during the transaction!"); } + _this3._config.dispatchEvent(_common_constants__WEBPACK_IMPORTED_MODULE_1__.TRANSACTION_IGNORE); + return; } @@ -5641,6 +6042,8 @@ var TransactionService = function () { _this3._logger.debug("transaction(" + tr.id + ", " + name + ", " + type + ") is ignored"); } + _this3._config.dispatchEvent(_common_constants__WEBPACK_IMPORTED_MODULE_1__.TRANSACTION_IGNORE); + return; } @@ -5652,13 +6055,13 @@ var TransactionService = function () { } if (tr.captureTimings) { - var cls = _metrics__WEBPACK_IMPORTED_MODULE_0__.metrics.cls, - fid = _metrics__WEBPACK_IMPORTED_MODULE_0__.metrics.fid, - tbt = _metrics__WEBPACK_IMPORTED_MODULE_0__.metrics.tbt, - longtask = _metrics__WEBPACK_IMPORTED_MODULE_0__.metrics.longtask; + var cls = _metrics_metrics__WEBPACK_IMPORTED_MODULE_0__.metrics.cls, + fid = _metrics_metrics__WEBPACK_IMPORTED_MODULE_0__.metrics.fid, + tbt = _metrics_metrics__WEBPACK_IMPORTED_MODULE_0__.metrics.tbt, + longtask = _metrics_metrics__WEBPACK_IMPORTED_MODULE_0__.metrics.longtask; if (tbt.duration > 0) { - tr.spans.push((0,_metrics__WEBPACK_IMPORTED_MODULE_0__.createTotalBlockingTimeSpan)(tbt)); + tr.spans.push((0,_metrics_metrics__WEBPACK_IMPORTED_MODULE_0__.createTotalBlockingTimeSpan)(tbt)); } tr.experience = {}; @@ -5691,7 +6094,7 @@ var TransactionService = function () { tr.name = (0,_common_url__WEBPACK_IMPORTED_MODULE_6__.slugifyUrl)(currentUrl); } - (0,_capture_navigation__WEBPACK_IMPORTED_MODULE_7__.captureNavigation)(tr); + (0,_navigation_capture_navigation__WEBPACK_IMPORTED_MODULE_7__.captureNavigation)(tr); _this3.adjustTransactionTime(tr); @@ -5767,7 +6170,7 @@ var TransactionService = function () { if (transaction.type === _common_constants__WEBPACK_IMPORTED_MODULE_1__.PAGE_LOAD) { var transactionEndWithoutDelay = transaction._end - _common_constants__WEBPACK_IMPORTED_MODULE_1__.PAGE_LOAD_DELAY; - var lcp = _metrics__WEBPACK_IMPORTED_MODULE_0__.metrics.lcp || 0; + var lcp = _metrics_metrics__WEBPACK_IMPORTED_MODULE_0__.metrics.lcp || 0; var latestXHRSpan = (0,_common_utils__WEBPACK_IMPORTED_MODULE_3__.getLatestXHRSpan)(spans) || {}; var latestXHRSpanEnd = latestXHRSpan._end || 0; transaction._end = Math.max(latestSpanEnd, latestXHRSpanEnd, lcp, transactionEndWithoutDelay); @@ -5941,7 +6344,7 @@ var Transaction = function (_SpanBase) { if (options) { this.options.reuseThreshold = options.reuseThreshold; - (0,_common_utils__WEBPACK_IMPORTED_MODULE_0__.extend)(this.options, options); + this.options = (0,_common_utils__WEBPACK_IMPORTED_MODULE_0__.extend)(this.options, options); } }; @@ -5966,7 +6369,7 @@ var Transaction = function (_SpanBase) { opts.parentId = this.id; } - var span = new _span__WEBPACK_IMPORTED_MODULE_2__.default(name, type, opts); + var span = new _span__WEBPACK_IMPORTED_MODULE_2__["default"](name, type, opts); this._activeSpans[span.id] = span; if (opts.blocking) { @@ -6045,7 +6448,7 @@ var Transaction = function (_SpanBase) { }; return Transaction; -}(_span_base__WEBPACK_IMPORTED_MODULE_4__.default); +}(_span_base__WEBPACK_IMPORTED_MODULE_4__["default"]); /* harmony default export */ __webpack_exports__["default"] = (Transaction); @@ -6060,8 +6463,8 @@ var Transaction = function (_SpanBase) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "__DEV__": function() { return /* binding */ __DEV__; }, -/* harmony export */ "state": function() { return /* binding */ state; } +/* harmony export */ __DEV__: function() { return /* binding */ __DEV__; }, +/* harmony export */ state: function() { return /* binding */ state; } /* harmony export */ }); var __DEV__ = "development" !== 'production'; @@ -6088,6 +6491,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _elastic_apm_rum_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @elastic/apm-rum-core */ "../rum-core/dist/es/common/instrument.js"); /* harmony import */ var _elastic_apm_rum_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @elastic/apm-rum-core */ "../rum-core/dist/es/common/observers/page-visibility.js"); /* harmony import */ var _elastic_apm_rum_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @elastic/apm-rum-core */ "../rum-core/dist/es/common/observers/page-clicks.js"); +/* harmony import */ var _elastic_apm_rum_core__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @elastic/apm-rum-core */ "../rum-core/dist/es/performance-monitoring/metrics/inp/process.js"); var ApmBase = function () { @@ -6119,7 +6523,7 @@ var ApmBase = function () { loggingService = _this$serviceFactory$[1], transactionService = _this$serviceFactory$[2]; - configService.setVersion('5.12.0'); + configService.setVersion('5.16.3'); this.config(config); var logLevel = configService.get('logLevel'); loggingService.setLevel(logLevel); @@ -6161,6 +6565,8 @@ var ApmBase = function () { if (flags[_elastic_apm_rum_core__WEBPACK_IMPORTED_MODULE_0__.EVENT_TARGET] && flags[_elastic_apm_rum_core__WEBPACK_IMPORTED_MODULE_0__.CLICK]) { (0,_elastic_apm_rum_core__WEBPACK_IMPORTED_MODULE_3__.observePageClicks)(transactionService); } + + (0,_elastic_apm_rum_core__WEBPACK_IMPORTED_MODULE_4__.observeUserInteractions)(); } else { this._disable = true; loggingService.warn('RUM agent is inactive'); @@ -6759,7 +7165,7 @@ var Reference = /** @class */ (function () { }; return Reference; }()); -exports.default = Reference; +exports["default"] = Reference; //# sourceMappingURL=reference.js.map /***/ }), @@ -6976,7 +7382,7 @@ var Span = /** @class */ (function () { return Span; }()); exports.Span = Span; -exports.default = Span; +exports["default"] = Span; //# sourceMappingURL=span.js.map /***/ }), @@ -7006,7 +7412,7 @@ var SpanContext = /** @class */ (function () { return SpanContext; }()); exports.SpanContext = SpanContext; -exports.default = SpanContext; +exports["default"] = SpanContext; //# sourceMappingURL=span_context.js.map /***/ }), @@ -7163,7 +7569,7 @@ var Tracer = /** @class */ (function () { return Tracer; }()); exports.Tracer = Tracer; -exports.default = Tracer; +exports["default"] = Tracer; //# sourceMappingURL=tracer.js.map /***/ }), @@ -7375,7 +7781,7 @@ Promise.prototype.then = function(onFulfilled, onRejected) { return prom; }; -Promise.prototype['finally'] = _finally__WEBPACK_IMPORTED_MODULE_0__.default; +Promise.prototype['finally'] = _finally__WEBPACK_IMPORTED_MODULE_0__["default"]; Promise.all = function(arr) { return new Promise(function(resolve, reject) { @@ -7661,10 +8067,10 @@ var __webpack_exports__ = {}; \**********************/ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "init": function() { return /* binding */ init; }, -/* harmony export */ "apmBase": function() { return /* binding */ apmBase; }, -/* harmony export */ "ApmBase": function() { return /* reexport safe */ _apm_base__WEBPACK_IMPORTED_MODULE_0__.default; }, -/* harmony export */ "apm": function() { return /* binding */ apmBase; } +/* harmony export */ ApmBase: function() { return /* reexport safe */ _apm_base__WEBPACK_IMPORTED_MODULE_0__["default"]; }, +/* harmony export */ apm: function() { return /* binding */ apmBase; }, +/* harmony export */ apmBase: function() { return /* binding */ apmBase; }, +/* harmony export */ init: function() { return /* binding */ init; } /* harmony export */ }); /* harmony import */ var _elastic_apm_rum_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @elastic/apm-rum-core */ "../rum-core/dist/es/common/utils.js"); /* harmony import */ var _elastic_apm_rum_core__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @elastic/apm-rum-core */ "../rum-core/dist/es/bootstrap.js"); @@ -7680,7 +8086,7 @@ function getApmBase() { var enabled = (0,_elastic_apm_rum_core__WEBPACK_IMPORTED_MODULE_2__.bootstrap)(); var serviceFactory = (0,_elastic_apm_rum_core__WEBPACK_IMPORTED_MODULE_3__.createServiceFactory)(); - var apmBase = new _apm_base__WEBPACK_IMPORTED_MODULE_0__.default(serviceFactory, !enabled); + var apmBase = new _apm_base__WEBPACK_IMPORTED_MODULE_0__["default"](serviceFactory, !enabled); if (_elastic_apm_rum_core__WEBPACK_IMPORTED_MODULE_1__.isBrowser) { window.elasticApm = apmBase; @@ -7698,4 +8104,4 @@ var init = apmBase.init.bind(apmBase); /******/ })() ; }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpYy1hcG0tcnVtLnVtZC5qcyIsInNvdXJjZXMiOlsid2VicGFjazovL1tuYW1lXS93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvYm9vdHN0cmFwLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9hZnRlci1mcmFtZS5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vYXBtLXNlcnZlci5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vY29tcHJlc3MuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL2NvbmZpZy1zZXJ2aWNlLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL2NvbnRleHQuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL2V2ZW50LWhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL2h0dHAvZmV0Y2guanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL2h0dHAvcmVzcG9uc2Utc3RhdHVzLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9odHRwL3hoci5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vaW5zdHJ1bWVudC5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vbG9nZ2luZy1zZXJ2aWNlLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9uZGpzb24uanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL29ic2VydmVycy9wYWdlLWNsaWNrcy5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vb2JzZXJ2ZXJzL3BhZ2UtdmlzaWJpbGl0eS5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vcGF0Y2hpbmcvZmV0Y2gtcGF0Y2guanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL3BhdGNoaW5nL2hpc3RvcnktcGF0Y2guanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL3BhdGNoaW5nL2luZGV4LmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9wYXRjaGluZy9wYXRjaC11dGlscy5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vcGF0Y2hpbmcveGhyLXBhdGNoLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9wb2x5ZmlsbHMuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL3F1ZXVlLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9zZXJ2aWNlLWZhY3RvcnkuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL3Rocm90dGxlLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi90cnVuY2F0ZS5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vdXJsLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi91dGlscy5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vcnVtLWNvcmUvZGlzdC9lcy9lcnJvci1sb2dnaW5nL2Vycm9yLWxvZ2dpbmcuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvZXJyb3ItbG9nZ2luZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vcnVtLWNvcmUvZGlzdC9lcy9lcnJvci1sb2dnaW5nL3N0YWNrLXRyYWNlLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL2luZGV4LmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL29wZW50cmFjaW5nL2luZGV4LmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL29wZW50cmFjaW5nL3NwYW4uanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvb3BlbnRyYWNpbmcvdHJhY2VyLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL3BlcmZvcm1hbmNlLW1vbml0b3JpbmcvYnJlYWtkb3duLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL3BlcmZvcm1hbmNlLW1vbml0b3JpbmcvY2FwdHVyZS1uYXZpZ2F0aW9uLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL3BlcmZvcm1hbmNlLW1vbml0b3JpbmcvaW5kZXguanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvcGVyZm9ybWFuY2UtbW9uaXRvcmluZy9tZXRyaWNzLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL3BlcmZvcm1hbmNlLW1vbml0b3JpbmcvcGVyZm9ybWFuY2UtbW9uaXRvcmluZy5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vcnVtLWNvcmUvZGlzdC9lcy9wZXJmb3JtYW5jZS1tb25pdG9yaW5nL3NwYW4tYmFzZS5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vcnVtLWNvcmUvZGlzdC9lcy9wZXJmb3JtYW5jZS1tb25pdG9yaW5nL3NwYW4uanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvcGVyZm9ybWFuY2UtbW9uaXRvcmluZy90cmFuc2FjdGlvbi1zZXJ2aWNlLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi9ydW0tY29yZS9kaXN0L2VzL3BlcmZvcm1hbmNlLW1vbml0b3JpbmcvdHJhbnNhY3Rpb24uanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uL3J1bS1jb3JlL2Rpc3QvZXMvc3RhdGUuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2FwbS1iYXNlLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi8uLi9ub2RlX21vZHVsZXMvZXJyb3Itc3RhY2stcGFyc2VyL2Vycm9yLXN0YWNrLXBhcnNlci5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW50cmFjaW5nL2xpYi9jb25zdGFudHMuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVudHJhY2luZy9saWIvZnVuY3Rpb25zLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbnRyYWNpbmcvbGliL25vb3AuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVudHJhY2luZy9saWIvcmVmZXJlbmNlLmpzIiwid2VicGFjazovL1tuYW1lXS8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbnRyYWNpbmcvbGliL3NwYW4uanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVudHJhY2luZy9saWIvc3Bhbl9jb250ZXh0LmpzIiwid2VicGFjazovL1tuYW1lXS8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbnRyYWNpbmcvbGliL3RyYWNlci5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vLi4vbm9kZV9tb2R1bGVzL3Byb21pc2UtcG9seWZpbGwvc3JjL2ZpbmFsbHkuanMiLCJ3ZWJwYWNrOi8vW25hbWVdLy4uLy4uL25vZGVfbW9kdWxlcy9wcm9taXNlLXBvbHlmaWxsL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vLi4vLi4vbm9kZV9tb2R1bGVzL3N0YWNrZnJhbWUvc3RhY2tmcmFtZS5qcyIsIndlYnBhY2s6Ly9bbmFtZV0vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vW25hbWVdL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL1tuYW1lXS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vW25hbWVdL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vW25hbWVdL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vW25hbWVdLy4vc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiB3ZWJwYWNrVW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbihyb290LCBmYWN0b3J5KSB7XG5cdGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jylcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcImVsYXN0aWMtYXBtLXJ1bVwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJlbGFzdGljLWFwbS1ydW1cIl0gPSBmYWN0b3J5KCk7XG59KShzZWxmLCBmdW5jdGlvbigpIHtcbnJldHVybiAiLCJpbXBvcnQgeyBpc1BsYXRmb3JtU3VwcG9ydGVkLCBpc0Jyb3dzZXIsIG5vdyB9IGZyb20gJy4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IHBhdGNoQWxsIH0gZnJvbSAnLi9jb21tb24vcGF0Y2hpbmcnO1xuaW1wb3J0IHsgc3RhdGUgfSBmcm9tICcuL3N0YXRlJztcbnZhciBlbmFibGVkID0gZmFsc2U7XG5leHBvcnQgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICBpZiAoaXNQbGF0Zm9ybVN1cHBvcnRlZCgpKSB7XG4gICAgcGF0Y2hBbGwoKTtcbiAgICBzdGF0ZS5ib290c3RyYXBUaW1lID0gbm93KCk7XG4gICAgZW5hYmxlZCA9IHRydWU7XG4gIH0gZWxzZSBpZiAoaXNCcm93c2VyKSB7XG4gICAgY29uc29sZS5sb2coJ1tFbGFzdGljIEFQTV0gcGxhdGZvcm0gaXMgbm90IHN1cHBvcnRlZCEnKTtcbiAgfVxuXG4gIHJldHVybiBlbmFibGVkO1xufSIsInZhciBSQUZfVElNRU9VVCA9IDEwMDtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFmdGVyRnJhbWUoY2FsbGJhY2spIHtcbiAgdmFyIGhhbmRsZXIgPSBmdW5jdGlvbiBoYW5kbGVyKCkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWYpO1xuICAgIHNldFRpbWVvdXQoY2FsbGJhY2spO1xuICB9O1xuXG4gIHZhciB0aW1lb3V0ID0gc2V0VGltZW91dChoYW5kbGVyLCBSQUZfVElNRU9VVCk7XG4gIHZhciByYWYgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaGFuZGxlcik7XG59IiwiaW1wb3J0IFF1ZXVlIGZyb20gJy4vcXVldWUnO1xuaW1wb3J0IHRocm90dGxlIGZyb20gJy4vdGhyb3R0bGUnO1xuaW1wb3J0IE5ESlNPTiBmcm9tICcuL25kanNvbic7XG5pbXBvcnQgeyB0cnVuY2F0ZU1vZGVsLCBNRVRBREFUQV9NT0RFTCB9IGZyb20gJy4vdHJ1bmNhdGUnO1xuaW1wb3J0IHsgRVJST1JTLCBIVFRQX1JFUVVFU1RfVElNRU9VVCwgUVVFVUVfRkxVU0gsIFRSQU5TQUNUSU9OUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IFByb21pc2UgfSBmcm9tICcuL3BvbHlmaWxscyc7XG5pbXBvcnQgeyBjb21wcmVzc01ldGFkYXRhLCBjb21wcmVzc1RyYW5zYWN0aW9uLCBjb21wcmVzc0Vycm9yLCBjb21wcmVzc1BheWxvYWQgfSBmcm9tICcuL2NvbXByZXNzJztcbmltcG9ydCB7IF9fREVWX18gfSBmcm9tICcuLi9zdGF0ZSc7XG5pbXBvcnQgeyBzZW5kRmV0Y2hSZXF1ZXN0LCBzaG91bGRVc2VGZXRjaFdpdGhLZWVwQWxpdmUgfSBmcm9tICcuL2h0dHAvZmV0Y2gnO1xuaW1wb3J0IHsgc2VuZFhIUiB9IGZyb20gJy4vaHR0cC94aHInO1xudmFyIFRIUk9UVExFX0lOVEVSVkFMID0gNjAwMDA7XG5cbnZhciBBcG1TZXJ2ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFwbVNlcnZlcihjb25maWdTZXJ2aWNlLCBsb2dnaW5nU2VydmljZSkge1xuICAgIHRoaXMuX2NvbmZpZ1NlcnZpY2UgPSBjb25maWdTZXJ2aWNlO1xuICAgIHRoaXMuX2xvZ2dpbmdTZXJ2aWNlID0gbG9nZ2luZ1NlcnZpY2U7XG4gICAgdGhpcy5xdWV1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnRocm90dGxlRXZlbnRzID0gbm9vcDtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBBcG1TZXJ2ZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5pbml0ID0gZnVuY3Rpb24gaW5pdCgpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdmFyIHF1ZXVlTGltaXQgPSB0aGlzLl9jb25maWdTZXJ2aWNlLmdldCgncXVldWVMaW1pdCcpO1xuXG4gICAgdmFyIGZsdXNoSW50ZXJ2YWwgPSB0aGlzLl9jb25maWdTZXJ2aWNlLmdldCgnZmx1c2hJbnRlcnZhbCcpO1xuXG4gICAgdmFyIGxpbWl0ID0gdGhpcy5fY29uZmlnU2VydmljZS5nZXQoJ2V2ZW50c0xpbWl0Jyk7XG5cbiAgICB2YXIgb25GbHVzaCA9IGZ1bmN0aW9uIG9uRmx1c2goZXZlbnRzKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IF90aGlzLnNlbmRFdmVudHMoZXZlbnRzKTtcblxuICAgICAgaWYgKHByb21pc2UpIHtcbiAgICAgICAgcHJvbWlzZS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgICAgX3RoaXMuX2xvZ2dpbmdTZXJ2aWNlLndhcm4oJ0ZhaWxlZCBzZW5kaW5nIGV2ZW50cyEnLCBfdGhpcy5fY29uc3RydWN0RXJyb3IocmVhc29uKSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnF1ZXVlID0gbmV3IFF1ZXVlKG9uRmx1c2gsIHtcbiAgICAgIHF1ZXVlTGltaXQ6IHF1ZXVlTGltaXQsXG4gICAgICBmbHVzaEludGVydmFsOiBmbHVzaEludGVydmFsXG4gICAgfSk7XG4gICAgdGhpcy50aHJvdHRsZUV2ZW50cyA9IHRocm90dGxlKHRoaXMucXVldWUuYWRkLmJpbmQodGhpcy5xdWV1ZSksIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5fbG9nZ2luZ1NlcnZpY2Uud2FybignRHJvcHBlZCBldmVudHMgZHVlIHRvIHRocm90dGxpbmchJyk7XG4gICAgfSwge1xuICAgICAgbGltaXQ6IGxpbWl0LFxuICAgICAgaW50ZXJ2YWw6IFRIUk9UVExFX0lOVEVSVkFMXG4gICAgfSk7XG5cbiAgICB0aGlzLl9jb25maWdTZXJ2aWNlLm9ic2VydmVFdmVudChRVUVVRV9GTFVTSCwgZnVuY3Rpb24gKCkge1xuICAgICAgX3RoaXMucXVldWUuZmx1c2goKTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8uX3Bvc3RKc29uID0gZnVuY3Rpb24gX3Bvc3RKc29uKGVuZFBvaW50LCBwYXlsb2FkKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICB2YXIgaGVhZGVycyA9IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC1uZGpzb24nXG4gICAgfTtcblxuICAgIHZhciBhcG1SZXF1ZXN0ID0gdGhpcy5fY29uZmlnU2VydmljZS5nZXQoJ2FwbVJlcXVlc3QnKTtcblxuICAgIHZhciBwYXJhbXMgPSB7XG4gICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgIGJlZm9yZVNlbmQ6IGFwbVJlcXVlc3RcbiAgICB9O1xuICAgIHJldHVybiBjb21wcmVzc1BheWxvYWQocGFyYW1zKS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIF90aGlzMi5fbG9nZ2luZ1NlcnZpY2UuZGVidWcoJ0NvbXByZXNzaW5nIHRoZSBwYXlsb2FkIHVzaW5nIENvbXByZXNzaW9uU3RyZWFtIEFQSSBmYWlsZWQnLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgIHJldHVybiBfdGhpczIuX21ha2VIdHRwUmVxdWVzdCgnUE9TVCcsIGVuZFBvaW50LCByZXN1bHQpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgIHZhciByZXNwb25zZVRleHQgPSBfcmVmLnJlc3BvbnNlVGV4dDtcbiAgICAgIHJldHVybiByZXNwb25zZVRleHQ7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLl9jb25zdHJ1Y3RFcnJvciA9IGZ1bmN0aW9uIF9jb25zdHJ1Y3RFcnJvcihyZWFzb24pIHtcbiAgICB2YXIgdXJsID0gcmVhc29uLnVybCxcbiAgICAgICAgc3RhdHVzID0gcmVhc29uLnN0YXR1cyxcbiAgICAgICAgcmVzcG9uc2VUZXh0ID0gcmVhc29uLnJlc3BvbnNlVGV4dDtcblxuICAgIGlmICh0eXBlb2Ygc3RhdHVzID09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gcmVhc29uO1xuICAgIH1cblxuICAgIHZhciBtZXNzYWdlID0gdXJsICsgJyBIVFRQIHN0YXR1czogJyArIHN0YXR1cztcblxuICAgIGlmIChfX0RFVl9fICYmIHJlc3BvbnNlVGV4dCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHNlcnZlckVycm9ycyA9IFtdO1xuICAgICAgICB2YXIgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dCk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9ycyAmJiByZXNwb25zZS5lcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3BvbnNlLmVycm9ycy5mb3JFYWNoKGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJFcnJvcnMucHVzaChlcnIubWVzc2FnZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbWVzc2FnZSArPSAnICcgKyBzZXJ2ZXJFcnJvcnMuam9pbignLCcpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dpbmdTZXJ2aWNlLmRlYnVnKCdFcnJvciBwYXJzaW5nIHJlc3BvbnNlIGZyb20gQVBNIHNlcnZlcicsIGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIH07XG5cbiAgX3Byb3RvLl9tYWtlSHR0cFJlcXVlc3QgPSBmdW5jdGlvbiBfbWFrZUh0dHBSZXF1ZXN0KG1ldGhvZCwgdXJsLCBfdGVtcCkge1xuICAgIHZhciBfcmVmMiA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgICBfcmVmMiR0aW1lb3V0ID0gX3JlZjIudGltZW91dCxcbiAgICAgICAgdGltZW91dCA9IF9yZWYyJHRpbWVvdXQgPT09IHZvaWQgMCA/IEhUVFBfUkVRVUVTVF9USU1FT1VUIDogX3JlZjIkdGltZW91dCxcbiAgICAgICAgcGF5bG9hZCA9IF9yZWYyLnBheWxvYWQsXG4gICAgICAgIGhlYWRlcnMgPSBfcmVmMi5oZWFkZXJzLFxuICAgICAgICBiZWZvcmVTZW5kID0gX3JlZjIuYmVmb3JlU2VuZDtcblxuICAgIHZhciBzZW5kQ3JlZGVudGlhbHMgPSB0aGlzLl9jb25maWdTZXJ2aWNlLmdldCgnc2VuZENyZWRlbnRpYWxzJyk7XG5cbiAgICBpZiAoIWJlZm9yZVNlbmQgJiYgc2hvdWxkVXNlRmV0Y2hXaXRoS2VlcEFsaXZlKG1ldGhvZCwgcGF5bG9hZCkpIHtcbiAgICAgIHJldHVybiBzZW5kRmV0Y2hSZXF1ZXN0KG1ldGhvZCwgdXJsLCB7XG4gICAgICAgIGtlZXBhbGl2ZTogdHJ1ZSxcbiAgICAgICAgdGltZW91dDogdGltZW91dCxcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgc2VuZENyZWRlbnRpYWxzOiBzZW5kQ3JlZGVudGlhbHNcbiAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIFR5cGVFcnJvcikge1xuICAgICAgICAgIHJldHVybiBzZW5kWEhSKG1ldGhvZCwgdXJsLCB7XG4gICAgICAgICAgICB0aW1lb3V0OiB0aW1lb3V0LFxuICAgICAgICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgICAgICBiZWZvcmVTZW5kOiBiZWZvcmVTZW5kLFxuICAgICAgICAgICAgc2VuZENyZWRlbnRpYWxzOiBzZW5kQ3JlZGVudGlhbHNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IHJlYXNvbjtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBzZW5kWEhSKG1ldGhvZCwgdXJsLCB7XG4gICAgICB0aW1lb3V0OiB0aW1lb3V0LFxuICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBiZWZvcmVTZW5kOiBiZWZvcmVTZW5kLFxuICAgICAgc2VuZENyZWRlbnRpYWxzOiBzZW5kQ3JlZGVudGlhbHNcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8uZmV0Y2hDb25maWcgPSBmdW5jdGlvbiBmZXRjaENvbmZpZyhzZXJ2aWNlTmFtZSwgZW52aXJvbm1lbnQpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHZhciBfdGhpcyRnZXRFbmRwb2ludHMgPSB0aGlzLmdldEVuZHBvaW50cygpLFxuICAgICAgICBjb25maWdFbmRwb2ludCA9IF90aGlzJGdldEVuZHBvaW50cy5jb25maWdFbmRwb2ludDtcblxuICAgIGlmICghc2VydmljZU5hbWUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnc2VydmljZU5hbWUgaXMgcmVxdWlyZWQgZm9yIGZldGNoaW5nIGNlbnRyYWwgY29uZmlnLicpO1xuICAgIH1cblxuICAgIGNvbmZpZ0VuZHBvaW50ICs9IFwiP3NlcnZpY2UubmFtZT1cIiArIHNlcnZpY2VOYW1lO1xuXG4gICAgaWYgKGVudmlyb25tZW50KSB7XG4gICAgICBjb25maWdFbmRwb2ludCArPSBcIiZzZXJ2aWNlLmVudmlyb25tZW50PVwiICsgZW52aXJvbm1lbnQ7XG4gICAgfVxuXG4gICAgdmFyIGxvY2FsQ29uZmlnID0gdGhpcy5fY29uZmlnU2VydmljZS5nZXRMb2NhbENvbmZpZygpO1xuXG4gICAgaWYgKGxvY2FsQ29uZmlnKSB7XG4gICAgICBjb25maWdFbmRwb2ludCArPSBcIiZpZm5vbmVtYXRjaD1cIiArIGxvY2FsQ29uZmlnLmV0YWc7XG4gICAgfVxuXG4gICAgdmFyIGFwbVJlcXVlc3QgPSB0aGlzLl9jb25maWdTZXJ2aWNlLmdldCgnYXBtUmVxdWVzdCcpO1xuXG4gICAgcmV0dXJuIHRoaXMuX21ha2VIdHRwUmVxdWVzdCgnR0VUJywgY29uZmlnRW5kcG9pbnQsIHtcbiAgICAgIHRpbWVvdXQ6IDUwMDAsXG4gICAgICBiZWZvcmVTZW5kOiBhcG1SZXF1ZXN0XG4gICAgfSkudGhlbihmdW5jdGlvbiAoeGhyKSB7XG4gICAgICB2YXIgc3RhdHVzID0geGhyLnN0YXR1cyxcbiAgICAgICAgICByZXNwb25zZVRleHQgPSB4aHIucmVzcG9uc2VUZXh0O1xuXG4gICAgICBpZiAoc3RhdHVzID09PSAzMDQpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsQ29uZmlnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlbW90ZUNvbmZpZyA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0KTtcbiAgICAgICAgdmFyIGV0YWcgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ2V0YWcnKTtcblxuICAgICAgICBpZiAoZXRhZykge1xuICAgICAgICAgIHJlbW90ZUNvbmZpZy5ldGFnID0gZXRhZy5yZXBsYWNlKC9bXCJdL2csICcnKTtcblxuICAgICAgICAgIF90aGlzMy5fY29uZmlnU2VydmljZS5zZXRMb2NhbENvbmZpZyhyZW1vdGVDb25maWcsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlbW90ZUNvbmZpZztcbiAgICAgIH1cbiAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICB2YXIgZXJyb3IgPSBfdGhpczMuX2NvbnN0cnVjdEVycm9yKHJlYXNvbik7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLmNyZWF0ZU1ldGFEYXRhID0gZnVuY3Rpb24gY3JlYXRlTWV0YURhdGEoKSB7XG4gICAgdmFyIGNmZyA9IHRoaXMuX2NvbmZpZ1NlcnZpY2U7XG4gICAgdmFyIG1ldGFkYXRhID0ge1xuICAgICAgc2VydmljZToge1xuICAgICAgICBuYW1lOiBjZmcuZ2V0KCdzZXJ2aWNlTmFtZScpLFxuICAgICAgICB2ZXJzaW9uOiBjZmcuZ2V0KCdzZXJ2aWNlVmVyc2lvbicpLFxuICAgICAgICBhZ2VudDoge1xuICAgICAgICAgIG5hbWU6ICdydW0tanMnLFxuICAgICAgICAgIHZlcnNpb246IGNmZy52ZXJzaW9uXG4gICAgICAgIH0sXG4gICAgICAgIGxhbmd1YWdlOiB7XG4gICAgICAgICAgbmFtZTogJ2phdmFzY3JpcHQnXG4gICAgICAgIH0sXG4gICAgICAgIGVudmlyb25tZW50OiBjZmcuZ2V0KCdlbnZpcm9ubWVudCcpXG4gICAgICB9LFxuICAgICAgbGFiZWxzOiBjZmcuZ2V0KCdjb250ZXh0LnRhZ3MnKVxuICAgIH07XG4gICAgcmV0dXJuIHRydW5jYXRlTW9kZWwoTUVUQURBVEFfTU9ERUwsIG1ldGFkYXRhKTtcbiAgfTtcblxuICBfcHJvdG8uYWRkRXJyb3IgPSBmdW5jdGlvbiBhZGRFcnJvcihlcnJvcikge1xuICAgIHZhciBfdGhpcyR0aHJvdHRsZUV2ZW50cztcblxuICAgIHRoaXMudGhyb3R0bGVFdmVudHMoKF90aGlzJHRocm90dGxlRXZlbnRzID0ge30sIF90aGlzJHRocm90dGxlRXZlbnRzW0VSUk9SU10gPSBlcnJvciwgX3RoaXMkdGhyb3R0bGVFdmVudHMpKTtcbiAgfTtcblxuICBfcHJvdG8uYWRkVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiBhZGRUcmFuc2FjdGlvbih0cmFuc2FjdGlvbikge1xuICAgIHZhciBfdGhpcyR0aHJvdHRsZUV2ZW50czI7XG5cbiAgICB0aGlzLnRocm90dGxlRXZlbnRzKChfdGhpcyR0aHJvdHRsZUV2ZW50czIgPSB7fSwgX3RoaXMkdGhyb3R0bGVFdmVudHMyW1RSQU5TQUNUSU9OU10gPSB0cmFuc2FjdGlvbiwgX3RoaXMkdGhyb3R0bGVFdmVudHMyKSk7XG4gIH07XG5cbiAgX3Byb3RvLm5kanNvbkVycm9ycyA9IGZ1bmN0aW9uIG5kanNvbkVycm9ycyhlcnJvcnMsIGNvbXByZXNzKSB7XG4gICAgdmFyIGtleSA9IGNvbXByZXNzID8gJ2UnIDogJ2Vycm9yJztcbiAgICByZXR1cm4gZXJyb3JzLm1hcChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIHZhciBfTkRKU09OJHN0cmluZ2lmeTtcblxuICAgICAgcmV0dXJuIE5ESlNPTi5zdHJpbmdpZnkoKF9OREpTT04kc3RyaW5naWZ5ID0ge30sIF9OREpTT04kc3RyaW5naWZ5W2tleV0gPSBjb21wcmVzcyA/IGNvbXByZXNzRXJyb3IoZXJyb3IpIDogZXJyb3IsIF9OREpTT04kc3RyaW5naWZ5KSk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLm5kanNvbk1ldHJpY3NldHMgPSBmdW5jdGlvbiBuZGpzb25NZXRyaWNzZXRzKG1ldHJpY3NldHMpIHtcbiAgICByZXR1cm4gbWV0cmljc2V0cy5tYXAoZnVuY3Rpb24gKG1ldHJpY3NldCkge1xuICAgICAgcmV0dXJuIE5ESlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBtZXRyaWNzZXQ6IG1ldHJpY3NldFxuICAgICAgfSk7XG4gICAgfSkuam9pbignJyk7XG4gIH07XG5cbiAgX3Byb3RvLm5kanNvblRyYW5zYWN0aW9ucyA9IGZ1bmN0aW9uIG5kanNvblRyYW5zYWN0aW9ucyh0cmFuc2FjdGlvbnMsIGNvbXByZXNzKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICB2YXIga2V5ID0gY29tcHJlc3MgPyAneCcgOiAndHJhbnNhY3Rpb24nO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbnMubWFwKGZ1bmN0aW9uICh0cikge1xuICAgICAgdmFyIF9OREpTT04kc3RyaW5naWZ5MjtcblxuICAgICAgdmFyIHNwYW5zID0gJycsXG4gICAgICAgICAgYnJlYWtkb3ducyA9ICcnO1xuXG4gICAgICBpZiAoIWNvbXByZXNzKSB7XG4gICAgICAgIGlmICh0ci5zcGFucykge1xuICAgICAgICAgIHNwYW5zID0gdHIuc3BhbnMubWFwKGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gTkRKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIHNwYW46IHNwYW5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pLmpvaW4oJycpO1xuICAgICAgICAgIGRlbGV0ZSB0ci5zcGFucztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0ci5icmVha2Rvd24pIHtcbiAgICAgICAgICBicmVha2Rvd25zID0gX3RoaXM0Lm5kanNvbk1ldHJpY3NldHModHIuYnJlYWtkb3duKTtcbiAgICAgICAgICBkZWxldGUgdHIuYnJlYWtkb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBOREpTT04uc3RyaW5naWZ5KChfTkRKU09OJHN0cmluZ2lmeTIgPSB7fSwgX05ESlNPTiRzdHJpbmdpZnkyW2tleV0gPSBjb21wcmVzcyA/IGNvbXByZXNzVHJhbnNhY3Rpb24odHIpIDogdHIsIF9OREpTT04kc3RyaW5naWZ5MikpICsgc3BhbnMgKyBicmVha2Rvd25zO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5zZW5kRXZlbnRzID0gZnVuY3Rpb24gc2VuZEV2ZW50cyhldmVudHMpIHtcbiAgICB2YXIgX3BheWxvYWQsIF9OREpTT04kc3RyaW5naWZ5MztcblxuICAgIGlmIChldmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIHRyYW5zYWN0aW9ucyA9IFtdO1xuICAgIHZhciBlcnJvcnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZXZlbnQgPSBldmVudHNbaV07XG5cbiAgICAgIGlmIChldmVudFtUUkFOU0FDVElPTlNdKSB7XG4gICAgICAgIHRyYW5zYWN0aW9ucy5wdXNoKGV2ZW50W1RSQU5TQUNUSU9OU10pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnRbRVJST1JTXSkge1xuICAgICAgICBlcnJvcnMucHVzaChldmVudFtFUlJPUlNdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHJhbnNhY3Rpb25zLmxlbmd0aCA9PT0gMCAmJiBlcnJvcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGNmZyA9IHRoaXMuX2NvbmZpZ1NlcnZpY2U7XG4gICAgdmFyIHBheWxvYWQgPSAoX3BheWxvYWQgPSB7fSwgX3BheWxvYWRbVFJBTlNBQ1RJT05TXSA9IHRyYW5zYWN0aW9ucywgX3BheWxvYWRbRVJST1JTXSA9IGVycm9ycywgX3BheWxvYWQpO1xuICAgIHZhciBmaWx0ZXJlZFBheWxvYWQgPSBjZmcuYXBwbHlGaWx0ZXJzKHBheWxvYWQpO1xuXG4gICAgaWYgKCFmaWx0ZXJlZFBheWxvYWQpIHtcbiAgICAgIHRoaXMuX2xvZ2dpbmdTZXJ2aWNlLndhcm4oJ0Ryb3BwZWQgcGF5bG9hZCBkdWUgdG8gZmlsdGVyaW5nIScpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGFwaVZlcnNpb24gPSBjZmcuZ2V0KCdhcGlWZXJzaW9uJyk7XG4gICAgdmFyIGNvbXByZXNzID0gYXBpVmVyc2lvbiA+IDI7XG4gICAgdmFyIG5kanNvbiA9IFtdO1xuICAgIHZhciBtZXRhZGF0YSA9IHRoaXMuY3JlYXRlTWV0YURhdGEoKTtcbiAgICB2YXIgbWV0YWRhdGFLZXkgPSBjb21wcmVzcyA/ICdtJyA6ICdtZXRhZGF0YSc7XG4gICAgbmRqc29uLnB1c2goTkRKU09OLnN0cmluZ2lmeSgoX05ESlNPTiRzdHJpbmdpZnkzID0ge30sIF9OREpTT04kc3RyaW5naWZ5M1ttZXRhZGF0YUtleV0gPSBjb21wcmVzcyA/IGNvbXByZXNzTWV0YWRhdGEobWV0YWRhdGEpIDogbWV0YWRhdGEsIF9OREpTT04kc3RyaW5naWZ5MykpKTtcbiAgICBuZGpzb24gPSBuZGpzb24uY29uY2F0KHRoaXMubmRqc29uRXJyb3JzKGZpbHRlcmVkUGF5bG9hZFtFUlJPUlNdLCBjb21wcmVzcyksIHRoaXMubmRqc29uVHJhbnNhY3Rpb25zKGZpbHRlcmVkUGF5bG9hZFtUUkFOU0FDVElPTlNdLCBjb21wcmVzcykpO1xuICAgIHZhciBuZGpzb25QYXlsb2FkID0gbmRqc29uLmpvaW4oJycpO1xuXG4gICAgdmFyIF90aGlzJGdldEVuZHBvaW50czIgPSB0aGlzLmdldEVuZHBvaW50cygpLFxuICAgICAgICBpbnRha2VFbmRwb2ludCA9IF90aGlzJGdldEVuZHBvaW50czIuaW50YWtlRW5kcG9pbnQ7XG5cbiAgICByZXR1cm4gdGhpcy5fcG9zdEpzb24oaW50YWtlRW5kcG9pbnQsIG5kanNvblBheWxvYWQpO1xuICB9O1xuXG4gIF9wcm90by5nZXRFbmRwb2ludHMgPSBmdW5jdGlvbiBnZXRFbmRwb2ludHMoKSB7XG4gICAgdmFyIHNlcnZlclVybCA9IHRoaXMuX2NvbmZpZ1NlcnZpY2UuZ2V0KCdzZXJ2ZXJVcmwnKTtcblxuICAgIHZhciBhcGlWZXJzaW9uID0gdGhpcy5fY29uZmlnU2VydmljZS5nZXQoJ2FwaVZlcnNpb24nKTtcblxuICAgIHZhciBzZXJ2ZXJVcmxQcmVmaXggPSB0aGlzLl9jb25maWdTZXJ2aWNlLmdldCgnc2VydmVyVXJsUHJlZml4JykgfHwgXCIvaW50YWtlL3ZcIiArIGFwaVZlcnNpb24gKyBcIi9ydW0vZXZlbnRzXCI7XG4gICAgdmFyIGludGFrZUVuZHBvaW50ID0gc2VydmVyVXJsICsgc2VydmVyVXJsUHJlZml4O1xuICAgIHZhciBjb25maWdFbmRwb2ludCA9IHNlcnZlclVybCArIFwiL2NvbmZpZy92MS9ydW0vYWdlbnRzXCI7XG4gICAgcmV0dXJuIHtcbiAgICAgIGludGFrZUVuZHBvaW50OiBpbnRha2VFbmRwb2ludCxcbiAgICAgIGNvbmZpZ0VuZHBvaW50OiBjb25maWdFbmRwb2ludFxuICAgIH07XG4gIH07XG5cbiAgcmV0dXJuIEFwbVNlcnZlcjtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgQXBtU2VydmVyOyIsImltcG9ydCB7IFByb21pc2UgfSBmcm9tICcuL3BvbHlmaWxscyc7XG5pbXBvcnQgeyBOQVZJR0FUSU9OX1RJTUlOR19NQVJLUywgQ09NUFJFU1NFRF9OQVZfVElNSU5HX01BUktTIH0gZnJvbSAnLi4vcGVyZm9ybWFuY2UtbW9uaXRvcmluZy9jYXB0dXJlLW5hdmlnYXRpb24nO1xuaW1wb3J0IHsgaXNCZWFjb25JbnNwZWN0aW9uRW5hYmxlZCB9IGZyb20gJy4vdXRpbHMnO1xuXG5mdW5jdGlvbiBjb21wcmVzc1N0YWNrRnJhbWVzKGZyYW1lcykge1xuICByZXR1cm4gZnJhbWVzLm1hcChmdW5jdGlvbiAoZnJhbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYXA6IGZyYW1lLmFic19wYXRoLFxuICAgICAgZjogZnJhbWUuZmlsZW5hbWUsXG4gICAgICBmbjogZnJhbWUuZnVuY3Rpb24sXG4gICAgICBsaTogZnJhbWUubGluZW5vLFxuICAgICAgY286IGZyYW1lLmNvbG5vXG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbXByZXNzUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgcmV0dXJuIHtcbiAgICB0czogcmVzcG9uc2UudHJhbnNmZXJfc2l6ZSxcbiAgICBlYnM6IHJlc3BvbnNlLmVuY29kZWRfYm9keV9zaXplLFxuICAgIGRiczogcmVzcG9uc2UuZGVjb2RlZF9ib2R5X3NpemVcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHJlc3NIVFRQKGh0dHApIHtcbiAgdmFyIGNvbXByZXNzZWQgPSB7fTtcbiAgdmFyIG1ldGhvZCA9IGh0dHAubWV0aG9kLFxuICAgICAgc3RhdHVzX2NvZGUgPSBodHRwLnN0YXR1c19jb2RlLFxuICAgICAgdXJsID0gaHR0cC51cmwsXG4gICAgICByZXNwb25zZSA9IGh0dHAucmVzcG9uc2U7XG4gIGNvbXByZXNzZWQudXJsID0gdXJsO1xuXG4gIGlmIChtZXRob2QpIHtcbiAgICBjb21wcmVzc2VkLm10ID0gbWV0aG9kO1xuICB9XG5cbiAgaWYgKHN0YXR1c19jb2RlKSB7XG4gICAgY29tcHJlc3NlZC5zYyA9IHN0YXR1c19jb2RlO1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlKSB7XG4gICAgY29tcHJlc3NlZC5yID0gY29tcHJlc3NSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICByZXR1cm4gY29tcHJlc3NlZDtcbn1cblxuZnVuY3Rpb24gY29tcHJlc3NDb250ZXh0KGNvbnRleHQpIHtcbiAgaWYgKCFjb250ZXh0KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgY29tcHJlc3NlZCA9IHt9O1xuICB2YXIgcGFnZSA9IGNvbnRleHQucGFnZSxcbiAgICAgIGh0dHAgPSBjb250ZXh0Lmh0dHAsXG4gICAgICByZXNwb25zZSA9IGNvbnRleHQucmVzcG9uc2UsXG4gICAgICBkZXN0aW5hdGlvbiA9IGNvbnRleHQuZGVzdGluYXRpb24sXG4gICAgICB1c2VyID0gY29udGV4dC51c2VyLFxuICAgICAgY3VzdG9tID0gY29udGV4dC5jdXN0b207XG5cbiAgaWYgKHBhZ2UpIHtcbiAgICBjb21wcmVzc2VkLnAgPSB7XG4gICAgICByZjogcGFnZS5yZWZlcmVyLFxuICAgICAgdXJsOiBwYWdlLnVybFxuICAgIH07XG4gIH1cblxuICBpZiAoaHR0cCkge1xuICAgIGNvbXByZXNzZWQuaCA9IGNvbXByZXNzSFRUUChodHRwKTtcbiAgfVxuXG4gIGlmIChyZXNwb25zZSkge1xuICAgIGNvbXByZXNzZWQuciA9IGNvbXByZXNzUmVzcG9uc2UocmVzcG9uc2UpO1xuICB9XG5cbiAgaWYgKGRlc3RpbmF0aW9uKSB7XG4gICAgdmFyIHNlcnZpY2UgPSBkZXN0aW5hdGlvbi5zZXJ2aWNlO1xuICAgIGNvbXByZXNzZWQuZHQgPSB7XG4gICAgICBzZToge1xuICAgICAgICBuOiBzZXJ2aWNlLm5hbWUsXG4gICAgICAgIHQ6IHNlcnZpY2UudHlwZSxcbiAgICAgICAgcmM6IHNlcnZpY2UucmVzb3VyY2VcbiAgICAgIH0sXG4gICAgICBhZDogZGVzdGluYXRpb24uYWRkcmVzcyxcbiAgICAgIHBvOiBkZXN0aW5hdGlvbi5wb3J0XG4gICAgfTtcbiAgfVxuXG4gIGlmICh1c2VyKSB7XG4gICAgY29tcHJlc3NlZC51ID0ge1xuICAgICAgaWQ6IHVzZXIuaWQsXG4gICAgICB1bjogdXNlci51c2VybmFtZSxcbiAgICAgIGVtOiB1c2VyLmVtYWlsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChjdXN0b20pIHtcbiAgICBjb21wcmVzc2VkLmN1ID0gY3VzdG9tO1xuICB9XG5cbiAgcmV0dXJuIGNvbXByZXNzZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbXByZXNzTWFya3MobWFya3MpIHtcbiAgaWYgKCFtYXJrcykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGNvbXByZXNzZWROdE1hcmtzID0gY29tcHJlc3NOYXZpZ2F0aW9uVGltaW5nTWFya3MobWFya3MubmF2aWdhdGlvblRpbWluZyk7XG4gIHZhciBjb21wcmVzc2VkID0ge1xuICAgIG50OiBjb21wcmVzc2VkTnRNYXJrcyxcbiAgICBhOiBjb21wcmVzc0FnZW50TWFya3MoY29tcHJlc3NlZE50TWFya3MsIG1hcmtzLmFnZW50KVxuICB9O1xuICByZXR1cm4gY29tcHJlc3NlZDtcbn1cblxuZnVuY3Rpb24gY29tcHJlc3NOYXZpZ2F0aW9uVGltaW5nTWFya3MobnRNYXJrcykge1xuICBpZiAoIW50TWFya3MpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBjb21wcmVzc2VkID0ge307XG4gIENPTVBSRVNTRURfTkFWX1RJTUlOR19NQVJLUy5mb3JFYWNoKGZ1bmN0aW9uIChtYXJrLCBpbmRleCkge1xuICAgIHZhciBtYXBwaW5nID0gTkFWSUdBVElPTl9USU1JTkdfTUFSS1NbaW5kZXhdO1xuICAgIGNvbXByZXNzZWRbbWFya10gPSBudE1hcmtzW21hcHBpbmddO1xuICB9KTtcbiAgcmV0dXJuIGNvbXByZXNzZWQ7XG59XG5cbmZ1bmN0aW9uIGNvbXByZXNzQWdlbnRNYXJrcyhjb21wcmVzc2VkTnRNYXJrcywgYWdlbnRNYXJrcykge1xuICB2YXIgY29tcHJlc3NlZCA9IHt9O1xuXG4gIGlmIChjb21wcmVzc2VkTnRNYXJrcykge1xuICAgIGNvbXByZXNzZWQgPSB7XG4gICAgICBmYjogY29tcHJlc3NlZE50TWFya3MucnMsXG4gICAgICBkaTogY29tcHJlc3NlZE50TWFya3MuZGksXG4gICAgICBkYzogY29tcHJlc3NlZE50TWFya3MuZGNcbiAgICB9O1xuICB9XG5cbiAgaWYgKGFnZW50TWFya3MpIHtcbiAgICB2YXIgZnAgPSBhZ2VudE1hcmtzLmZpcnN0Q29udGVudGZ1bFBhaW50O1xuICAgIHZhciBscCA9IGFnZW50TWFya3MubGFyZ2VzdENvbnRlbnRmdWxQYWludDtcblxuICAgIGlmIChmcCkge1xuICAgICAgY29tcHJlc3NlZC5mcCA9IGZwO1xuICAgIH1cblxuICAgIGlmIChscCkge1xuICAgICAgY29tcHJlc3NlZC5scCA9IGxwO1xuICAgIH1cbiAgfVxuXG4gIGlmIChPYmplY3Qua2V5cyhjb21wcmVzc2VkKS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBjb21wcmVzc2VkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHJlc3NNZXRhZGF0YShtZXRhZGF0YSkge1xuICB2YXIgc2VydmljZSA9IG1ldGFkYXRhLnNlcnZpY2UsXG4gICAgICBsYWJlbHMgPSBtZXRhZGF0YS5sYWJlbHM7XG4gIHZhciBhZ2VudCA9IHNlcnZpY2UuYWdlbnQsXG4gICAgICBsYW5ndWFnZSA9IHNlcnZpY2UubGFuZ3VhZ2U7XG4gIHJldHVybiB7XG4gICAgc2U6IHtcbiAgICAgIG46IHNlcnZpY2UubmFtZSxcbiAgICAgIHZlOiBzZXJ2aWNlLnZlcnNpb24sXG4gICAgICBhOiB7XG4gICAgICAgIG46IGFnZW50Lm5hbWUsXG4gICAgICAgIHZlOiBhZ2VudC52ZXJzaW9uXG4gICAgICB9LFxuICAgICAgbGE6IHtcbiAgICAgICAgbjogbGFuZ3VhZ2UubmFtZVxuICAgICAgfSxcbiAgICAgIGVuOiBzZXJ2aWNlLmVudmlyb25tZW50XG4gICAgfSxcbiAgICBsOiBsYWJlbHNcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wcmVzc1RyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gIHZhciBzcGFucyA9IHRyYW5zYWN0aW9uLnNwYW5zLm1hcChmdW5jdGlvbiAoc3Bhbikge1xuICAgIHZhciBzcGFuRGF0YSA9IHtcbiAgICAgIGlkOiBzcGFuLmlkLFxuICAgICAgbjogc3Bhbi5uYW1lLFxuICAgICAgdDogc3Bhbi50eXBlLFxuICAgICAgczogc3Bhbi5zdGFydCxcbiAgICAgIGQ6IHNwYW4uZHVyYXRpb24sXG4gICAgICBjOiBjb21wcmVzc0NvbnRleHQoc3Bhbi5jb250ZXh0KSxcbiAgICAgIG86IHNwYW4ub3V0Y29tZSxcbiAgICAgIHNyOiBzcGFuLnNhbXBsZV9yYXRlXG4gICAgfTtcblxuICAgIGlmIChzcGFuLnBhcmVudF9pZCAhPT0gdHJhbnNhY3Rpb24uaWQpIHtcbiAgICAgIHNwYW5EYXRhLnBpZCA9IHNwYW4ucGFyZW50X2lkO1xuICAgIH1cblxuICAgIGlmIChzcGFuLnN5bmMgPT09IHRydWUpIHtcbiAgICAgIHNwYW5EYXRhLnN5ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc3Bhbi5zdWJ0eXBlKSB7XG4gICAgICBzcGFuRGF0YS5zdSA9IHNwYW4uc3VidHlwZTtcbiAgICB9XG5cbiAgICBpZiAoc3Bhbi5hY3Rpb24pIHtcbiAgICAgIHNwYW5EYXRhLmFjID0gc3Bhbi5hY3Rpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIHNwYW5EYXRhO1xuICB9KTtcbiAgdmFyIHRyID0ge1xuICAgIGlkOiB0cmFuc2FjdGlvbi5pZCxcbiAgICB0aWQ6IHRyYW5zYWN0aW9uLnRyYWNlX2lkLFxuICAgIG46IHRyYW5zYWN0aW9uLm5hbWUsXG4gICAgdDogdHJhbnNhY3Rpb24udHlwZSxcbiAgICBkOiB0cmFuc2FjdGlvbi5kdXJhdGlvbixcbiAgICBjOiBjb21wcmVzc0NvbnRleHQodHJhbnNhY3Rpb24uY29udGV4dCksXG4gICAgazogY29tcHJlc3NNYXJrcyh0cmFuc2FjdGlvbi5tYXJrcyksXG4gICAgbWU6IGNvbXByZXNzTWV0cmljc2V0cyh0cmFuc2FjdGlvbi5icmVha2Rvd24pLFxuICAgIHk6IHNwYW5zLFxuICAgIHljOiB7XG4gICAgICBzZDogc3BhbnMubGVuZ3RoXG4gICAgfSxcbiAgICBzbTogdHJhbnNhY3Rpb24uc2FtcGxlZCxcbiAgICBzcjogdHJhbnNhY3Rpb24uc2FtcGxlX3JhdGUsXG4gICAgbzogdHJhbnNhY3Rpb24ub3V0Y29tZVxuICB9O1xuXG4gIGlmICh0cmFuc2FjdGlvbi5leHBlcmllbmNlKSB7XG4gICAgdmFyIF90cmFuc2FjdGlvbiRleHBlcmllbiA9IHRyYW5zYWN0aW9uLmV4cGVyaWVuY2UsXG4gICAgICAgIGNscyA9IF90cmFuc2FjdGlvbiRleHBlcmllbi5jbHMsXG4gICAgICAgIGZpZCA9IF90cmFuc2FjdGlvbiRleHBlcmllbi5maWQsXG4gICAgICAgIHRidCA9IF90cmFuc2FjdGlvbiRleHBlcmllbi50YnQsXG4gICAgICAgIGxvbmd0YXNrID0gX3RyYW5zYWN0aW9uJGV4cGVyaWVuLmxvbmd0YXNrO1xuICAgIHRyLmV4cCA9IHtcbiAgICAgIGNsczogY2xzLFxuICAgICAgZmlkOiBmaWQsXG4gICAgICB0YnQ6IHRidCxcbiAgICAgIGx0OiBsb25ndGFza1xuICAgIH07XG4gIH1cblxuICBpZiAodHJhbnNhY3Rpb24uc2Vzc2lvbikge1xuICAgIHZhciBfdHJhbnNhY3Rpb24kc2Vzc2lvbiA9IHRyYW5zYWN0aW9uLnNlc3Npb24sXG4gICAgICAgIGlkID0gX3RyYW5zYWN0aW9uJHNlc3Npb24uaWQsXG4gICAgICAgIHNlcXVlbmNlID0gX3RyYW5zYWN0aW9uJHNlc3Npb24uc2VxdWVuY2U7XG4gICAgdHIuc2VzID0ge1xuICAgICAgaWQ6IGlkLFxuICAgICAgc2VxOiBzZXF1ZW5jZVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdHI7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHJlc3NFcnJvcihlcnJvcikge1xuICB2YXIgZXhjZXB0aW9uID0gZXJyb3IuZXhjZXB0aW9uO1xuICB2YXIgY29tcHJlc3NlZCA9IHtcbiAgICBpZDogZXJyb3IuaWQsXG4gICAgY2w6IGVycm9yLmN1bHByaXQsXG4gICAgZXg6IHtcbiAgICAgIG1nOiBleGNlcHRpb24ubWVzc2FnZSxcbiAgICAgIHN0OiBjb21wcmVzc1N0YWNrRnJhbWVzKGV4Y2VwdGlvbi5zdGFja3RyYWNlKSxcbiAgICAgIHQ6IGVycm9yLnR5cGVcbiAgICB9LFxuICAgIGM6IGNvbXByZXNzQ29udGV4dChlcnJvci5jb250ZXh0KVxuICB9O1xuICB2YXIgdHJhbnNhY3Rpb24gPSBlcnJvci50cmFuc2FjdGlvbjtcblxuICBpZiAodHJhbnNhY3Rpb24pIHtcbiAgICBjb21wcmVzc2VkLnRpZCA9IGVycm9yLnRyYWNlX2lkO1xuICAgIGNvbXByZXNzZWQucGlkID0gZXJyb3IucGFyZW50X2lkO1xuICAgIGNvbXByZXNzZWQueGlkID0gZXJyb3IudHJhbnNhY3Rpb25faWQ7XG4gICAgY29tcHJlc3NlZC54ID0ge1xuICAgICAgdDogdHJhbnNhY3Rpb24udHlwZSxcbiAgICAgIHNtOiB0cmFuc2FjdGlvbi5zYW1wbGVkXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBjb21wcmVzc2VkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXByZXNzTWV0cmljc2V0cyhicmVha2Rvd25zKSB7XG4gIHJldHVybiBicmVha2Rvd25zLm1hcChmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBzcGFuID0gX3JlZi5zcGFuLFxuICAgICAgICBzYW1wbGVzID0gX3JlZi5zYW1wbGVzO1xuICAgIHZhciBpc1NwYW4gPSBzcGFuICE9IG51bGw7XG5cbiAgICBpZiAoaXNTcGFuKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB5OiB7XG4gICAgICAgICAgdDogc3Bhbi50eXBlXG4gICAgICAgIH0sXG4gICAgICAgIHNhOiB7XG4gICAgICAgICAgeXNjOiB7XG4gICAgICAgICAgICB2OiBzYW1wbGVzWydzcGFuLnNlbGZfdGltZS5jb3VudCddLnZhbHVlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB5c3M6IHtcbiAgICAgICAgICAgIHY6IHNhbXBsZXNbJ3NwYW4uc2VsZl90aW1lLnN1bS51cyddLnZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzYToge1xuICAgICAgICB4ZGM6IHtcbiAgICAgICAgICB2OiBzYW1wbGVzWyd0cmFuc2FjdGlvbi5kdXJhdGlvbi5jb3VudCddLnZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIHhkczoge1xuICAgICAgICAgIHY6IHNhbXBsZXNbJ3RyYW5zYWN0aW9uLmR1cmF0aW9uLnN1bS51cyddLnZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIHhiYzoge1xuICAgICAgICAgIHY6IHNhbXBsZXNbJ3RyYW5zYWN0aW9uLmJyZWFrZG93bi5jb3VudCddLnZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wcmVzc1BheWxvYWQocGFyYW1zLCB0eXBlKSB7XG4gIGlmICh0eXBlID09PSB2b2lkIDApIHtcbiAgICB0eXBlID0gJ2d6aXAnO1xuICB9XG5cbiAgdmFyIGlzQ29tcHJlc3Npb25TdHJlYW1TdXBwb3J0ZWQgPSB0eXBlb2YgQ29tcHJlc3Npb25TdHJlYW0gPT09ICdmdW5jdGlvbic7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgIGlmICghaXNDb21wcmVzc2lvblN0cmVhbVN1cHBvcnRlZCkge1xuICAgICAgcmV0dXJuIHJlc29sdmUocGFyYW1zKTtcbiAgICB9XG5cbiAgICBpZiAoaXNCZWFjb25JbnNwZWN0aW9uRW5hYmxlZCgpKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZShwYXJhbXMpO1xuICAgIH1cblxuICAgIHZhciBwYXlsb2FkID0gcGFyYW1zLnBheWxvYWQsXG4gICAgICAgIGhlYWRlcnMgPSBwYXJhbXMuaGVhZGVycyxcbiAgICAgICAgYmVmb3JlU2VuZCA9IHBhcmFtcy5iZWZvcmVTZW5kO1xuICAgIHZhciBwYXlsb2FkU3RyZWFtID0gbmV3IEJsb2IoW3BheWxvYWRdKS5zdHJlYW0oKTtcbiAgICB2YXIgY29tcHJlc3NlZFN0cmVhbSA9IHBheWxvYWRTdHJlYW0ucGlwZVRocm91Z2gobmV3IENvbXByZXNzaW9uU3RyZWFtKHR5cGUpKTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGNvbXByZXNzZWRTdHJlYW0pLmJsb2IoKS50aGVuKGZ1bmN0aW9uIChwYXlsb2FkKSB7XG4gICAgICBoZWFkZXJzWydDb250ZW50LUVuY29kaW5nJ10gPSB0eXBlO1xuICAgICAgcmV0dXJuIHJlc29sdmUoe1xuICAgICAgICBwYXlsb2FkOiBwYXlsb2FkLFxuICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICBiZWZvcmVTZW5kOiBiZWZvcmVTZW5kXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuaW1wb3J0IHsgZ2V0Q3VycmVudFNjcmlwdCwgc2V0TGFiZWwsIG1lcmdlLCBleHRlbmQsIGlzVW5kZWZpbmVkIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4vZXZlbnQtaGFuZGxlcic7XG5pbXBvcnQgeyBDT05GSUdfQ0hBTkdFLCBMT0NBTF9DT05GSUdfS0VZIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5mdW5jdGlvbiBnZXRDb25maWdGcm9tU2NyaXB0KCkge1xuICB2YXIgc2NyaXB0ID0gZ2V0Q3VycmVudFNjcmlwdCgpO1xuICB2YXIgY29uZmlnID0gZ2V0RGF0YUF0dHJpYnV0ZXNGcm9tTm9kZShzY3JpcHQpO1xuICByZXR1cm4gY29uZmlnO1xufVxuXG5mdW5jdGlvbiBnZXREYXRhQXR0cmlidXRlc0Zyb21Ob2RlKG5vZGUpIHtcbiAgaWYgKCFub2RlKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgdmFyIGRhdGFBdHRycyA9IHt9O1xuICB2YXIgZGF0YVJlZ2V4ID0gL15kYXRhLShbXFx3LV0rKSQvO1xuICB2YXIgYXR0cnMgPSBub2RlLmF0dHJpYnV0ZXM7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBhdHRyID0gYXR0cnNbaV07XG5cbiAgICBpZiAoZGF0YVJlZ2V4LnRlc3QoYXR0ci5ub2RlTmFtZSkpIHtcbiAgICAgIHZhciBrZXkgPSBhdHRyLm5vZGVOYW1lLm1hdGNoKGRhdGFSZWdleClbMV07XG4gICAgICB2YXIgY2FtZWxDYXNlZGtleSA9IGtleS5zcGxpdCgnLScpLm1hcChmdW5jdGlvbiAodmFsdWUsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBpbmRleCA+IDAgPyB2YWx1ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHZhbHVlLnN1YnN0cmluZygxKSA6IHZhbHVlO1xuICAgICAgfSkuam9pbignJyk7XG4gICAgICBkYXRhQXR0cnNbY2FtZWxDYXNlZGtleV0gPSBhdHRyLnZhbHVlIHx8IGF0dHIubm9kZVZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhQXR0cnM7XG59XG5cbnZhciBDb25maWcgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENvbmZpZygpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIHNlcnZpY2VOYW1lOiAnJyxcbiAgICAgIHNlcnZpY2VWZXJzaW9uOiAnJyxcbiAgICAgIGVudmlyb25tZW50OiAnJyxcbiAgICAgIHNlcnZlclVybDogJ2h0dHA6Ly9sb2NhbGhvc3Q6ODIwMCcsXG4gICAgICBzZXJ2ZXJVcmxQcmVmaXg6ICcnLFxuICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgaW5zdHJ1bWVudDogdHJ1ZSxcbiAgICAgIGRpc2FibGVJbnN0cnVtZW50YXRpb25zOiBbXSxcbiAgICAgIGxvZ0xldmVsOiAnd2FybicsXG4gICAgICBicmVha2Rvd25NZXRyaWNzOiBmYWxzZSxcbiAgICAgIGlnbm9yZVRyYW5zYWN0aW9uczogW10sXG4gICAgICBldmVudHNMaW1pdDogODAsXG4gICAgICBxdWV1ZUxpbWl0OiAtMSxcbiAgICAgIGZsdXNoSW50ZXJ2YWw6IDUwMCxcbiAgICAgIGRpc3RyaWJ1dGVkVHJhY2luZzogdHJ1ZSxcbiAgICAgIGRpc3RyaWJ1dGVkVHJhY2luZ09yaWdpbnM6IFtdLFxuICAgICAgZGlzdHJpYnV0ZWRUcmFjaW5nSGVhZGVyTmFtZTogJ3RyYWNlcGFyZW50JyxcbiAgICAgIHBhZ2VMb2FkVHJhY2VJZDogJycsXG4gICAgICBwYWdlTG9hZFNwYW5JZDogJycsXG4gICAgICBwYWdlTG9hZFNhbXBsZWQ6IGZhbHNlLFxuICAgICAgcGFnZUxvYWRUcmFuc2FjdGlvbk5hbWU6ICcnLFxuICAgICAgcHJvcGFnYXRlVHJhY2VzdGF0ZTogZmFsc2UsXG4gICAgICB0cmFuc2FjdGlvblNhbXBsZVJhdGU6IDEuMCxcbiAgICAgIGNlbnRyYWxDb25maWc6IGZhbHNlLFxuICAgICAgbW9uaXRvckxvbmd0YXNrczogdHJ1ZSxcbiAgICAgIGFwaVZlcnNpb246IDIsXG4gICAgICBjb250ZXh0OiB7fSxcbiAgICAgIHNlc3Npb246IGZhbHNlLFxuICAgICAgYXBtUmVxdWVzdDogbnVsbCxcbiAgICAgIHNlbmRDcmVkZW50aWFsczogZmFsc2VcbiAgICB9O1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuICAgIHRoaXMuZmlsdGVycyA9IFtdO1xuICAgIHRoaXMudmVyc2lvbiA9ICcnO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IENvbmZpZy5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmluaXQgPSBmdW5jdGlvbiBpbml0KCkge1xuICAgIHZhciBzY3JpcHREYXRhID0gZ2V0Q29uZmlnRnJvbVNjcmlwdCgpO1xuICAgIHRoaXMuc2V0Q29uZmlnKHNjcmlwdERhdGEpO1xuICB9O1xuXG4gIF9wcm90by5zZXRWZXJzaW9uID0gZnVuY3Rpb24gc2V0VmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgfTtcblxuICBfcHJvdG8uYWRkRmlsdGVyID0gZnVuY3Rpb24gYWRkRmlsdGVyKGNiKSB7XG4gICAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCB0byBtdXN0IGJlIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJzLnB1c2goY2IpO1xuICB9O1xuXG4gIF9wcm90by5hcHBseUZpbHRlcnMgPSBmdW5jdGlvbiBhcHBseUZpbHRlcnMoZGF0YSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkYXRhID0gdGhpcy5maWx0ZXJzW2ldKGRhdGEpO1xuXG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9O1xuXG4gIF9wcm90by5nZXQgPSBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIGtleS5zcGxpdCgnLicpLnJlZHVjZShmdW5jdGlvbiAob2JqLCBvYmpLZXkpIHtcbiAgICAgIHJldHVybiBvYmogJiYgb2JqW29iaktleV07XG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9O1xuXG4gIF9wcm90by5zZXRVc2VyQ29udGV4dCA9IGZ1bmN0aW9uIHNldFVzZXJDb250ZXh0KHVzZXJDb250ZXh0KSB7XG4gICAgaWYgKHVzZXJDb250ZXh0ID09PSB2b2lkIDApIHtcbiAgICAgIHVzZXJDb250ZXh0ID0ge307XG4gICAgfVxuXG4gICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICB2YXIgX3VzZXJDb250ZXh0ID0gdXNlckNvbnRleHQsXG4gICAgICAgIGlkID0gX3VzZXJDb250ZXh0LmlkLFxuICAgICAgICB1c2VybmFtZSA9IF91c2VyQ29udGV4dC51c2VybmFtZSxcbiAgICAgICAgZW1haWwgPSBfdXNlckNvbnRleHQuZW1haWw7XG5cbiAgICBpZiAodHlwZW9mIGlkID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb250ZXh0LmlkID0gaWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB1c2VybmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnRleHQudXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGVtYWlsID09PSAnc3RyaW5nJykge1xuICAgICAgY29udGV4dC5lbWFpbCA9IGVtYWlsO1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlnLmNvbnRleHQudXNlciA9IGV4dGVuZCh0aGlzLmNvbmZpZy5jb250ZXh0LnVzZXIgfHwge30sIGNvbnRleHQpO1xuICB9O1xuXG4gIF9wcm90by5zZXRDdXN0b21Db250ZXh0ID0gZnVuY3Rpb24gc2V0Q3VzdG9tQ29udGV4dChjdXN0b21Db250ZXh0KSB7XG4gICAgaWYgKGN1c3RvbUNvbnRleHQgPT09IHZvaWQgMCkge1xuICAgICAgY3VzdG9tQ29udGV4dCA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlnLmNvbnRleHQuY3VzdG9tID0gZXh0ZW5kKHRoaXMuY29uZmlnLmNvbnRleHQuY3VzdG9tIHx8IHt9LCBjdXN0b21Db250ZXh0KTtcbiAgfTtcblxuICBfcHJvdG8uYWRkTGFiZWxzID0gZnVuY3Rpb24gYWRkTGFiZWxzKHRhZ3MpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5jb250ZXh0LnRhZ3MpIHtcbiAgICAgIHRoaXMuY29uZmlnLmNvbnRleHQudGFncyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGFncyk7XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gc2V0TGFiZWwoaywgdGFnc1trXSwgX3RoaXMuY29uZmlnLmNvbnRleHQudGFncyk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLnNldENvbmZpZyA9IGZ1bmN0aW9uIHNldENvbmZpZyhwcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHByb3BlcnRpZXMgPT09IHZvaWQgMCkge1xuICAgICAgcHJvcGVydGllcyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcHJvcGVydGllcyA9IHByb3BlcnRpZXMsXG4gICAgICAgIHRyYW5zYWN0aW9uU2FtcGxlUmF0ZSA9IF9wcm9wZXJ0aWVzLnRyYW5zYWN0aW9uU2FtcGxlUmF0ZSxcbiAgICAgICAgc2VydmVyVXJsID0gX3Byb3BlcnRpZXMuc2VydmVyVXJsO1xuXG4gICAgaWYgKHNlcnZlclVybCkge1xuICAgICAgcHJvcGVydGllcy5zZXJ2ZXJVcmwgPSBzZXJ2ZXJVcmwucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1VuZGVmaW5lZCh0cmFuc2FjdGlvblNhbXBsZVJhdGUpKSB7XG4gICAgICBpZiAodHJhbnNhY3Rpb25TYW1wbGVSYXRlIDwgMC4wMDAxICYmIHRyYW5zYWN0aW9uU2FtcGxlUmF0ZSA+IDApIHtcbiAgICAgICAgdHJhbnNhY3Rpb25TYW1wbGVSYXRlID0gMC4wMDAxO1xuICAgICAgfVxuXG4gICAgICBwcm9wZXJ0aWVzLnRyYW5zYWN0aW9uU2FtcGxlUmF0ZSA9IE1hdGgucm91bmQodHJhbnNhY3Rpb25TYW1wbGVSYXRlICogMTAwMDApIC8gMTAwMDA7XG4gICAgfVxuXG4gICAgbWVyZ2UodGhpcy5jb25maWcsIHByb3BlcnRpZXMpO1xuICAgIHRoaXMuZXZlbnRzLnNlbmQoQ09ORklHX0NIQU5HRSwgW3RoaXMuY29uZmlnXSk7XG4gIH07XG5cbiAgX3Byb3RvLnZhbGlkYXRlID0gZnVuY3Rpb24gdmFsaWRhdGUocHJvcGVydGllcykge1xuICAgIGlmIChwcm9wZXJ0aWVzID09PSB2b2lkIDApIHtcbiAgICAgIHByb3BlcnRpZXMgPSB7fTtcbiAgICB9XG5cbiAgICB2YXIgcmVxdWlyZWRLZXlzID0gWydzZXJ2aWNlTmFtZScsICdzZXJ2ZXJVcmwnXTtcbiAgICB2YXIgYWxsS2V5cyA9IE9iamVjdC5rZXlzKHRoaXMuY29uZmlnKTtcbiAgICB2YXIgZXJyb3JzID0ge1xuICAgICAgbWlzc2luZzogW10sXG4gICAgICBpbnZhbGlkOiBbXSxcbiAgICAgIHVua25vd246IFtdXG4gICAgfTtcbiAgICBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGlmIChyZXF1aXJlZEtleXMuaW5kZXhPZihrZXkpICE9PSAtMSAmJiAhcHJvcGVydGllc1trZXldKSB7XG4gICAgICAgIGVycm9ycy5taXNzaW5nLnB1c2goa2V5KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFsbEtleXMuaW5kZXhPZihrZXkpID09PSAtMSkge1xuICAgICAgICBlcnJvcnMudW5rbm93bi5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAocHJvcGVydGllcy5zZXJ2aWNlTmFtZSAmJiAhL15bYS16QS1aMC05IF8tXSskLy50ZXN0KHByb3BlcnRpZXMuc2VydmljZU5hbWUpKSB7XG4gICAgICBlcnJvcnMuaW52YWxpZC5wdXNoKHtcbiAgICAgICAga2V5OiAnc2VydmljZU5hbWUnLFxuICAgICAgICB2YWx1ZTogcHJvcGVydGllcy5zZXJ2aWNlTmFtZSxcbiAgICAgICAgYWxsb3dlZDogJ2EteiwgQS1aLCAwLTksIF8sIC0sIDxzcGFjZT4nXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgc2FtcGxlUmF0ZSA9IHByb3BlcnRpZXMudHJhbnNhY3Rpb25TYW1wbGVSYXRlO1xuXG4gICAgaWYgKHR5cGVvZiBzYW1wbGVSYXRlICE9PSAndW5kZWZpbmVkJyAmJiAodHlwZW9mIHNhbXBsZVJhdGUgIT09ICdudW1iZXInIHx8IGlzTmFOKHNhbXBsZVJhdGUpIHx8IHNhbXBsZVJhdGUgPCAwIHx8IHNhbXBsZVJhdGUgPiAxKSkge1xuICAgICAgZXJyb3JzLmludmFsaWQucHVzaCh7XG4gICAgICAgIGtleTogJ3RyYW5zYWN0aW9uU2FtcGxlUmF0ZScsXG4gICAgICAgIHZhbHVlOiBzYW1wbGVSYXRlLFxuICAgICAgICBhbGxvd2VkOiAnTnVtYmVyIGJldHdlZW4gMCBhbmQgMSdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH07XG5cbiAgX3Byb3RvLmdldExvY2FsQ29uZmlnID0gZnVuY3Rpb24gZ2V0TG9jYWxDb25maWcoKSB7XG4gICAgdmFyIHN0b3JhZ2UgPSBzZXNzaW9uU3RvcmFnZTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5zZXNzaW9uKSB7XG4gICAgICBzdG9yYWdlID0gbG9jYWxTdG9yYWdlO1xuICAgIH1cblxuICAgIHZhciBjb25maWcgPSBzdG9yYWdlLmdldEl0ZW0oTE9DQUxfQ09ORklHX0tFWSk7XG5cbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShjb25maWcpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uc2V0TG9jYWxDb25maWcgPSBmdW5jdGlvbiBzZXRMb2NhbENvbmZpZyhjb25maWcsIG1lcmdlKSB7XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgaWYgKG1lcmdlKSB7XG4gICAgICAgIHZhciBwcmV2Q29uZmlnID0gdGhpcy5nZXRMb2NhbENvbmZpZygpO1xuICAgICAgICBjb25maWcgPSBfZXh0ZW5kcyh7fSwgcHJldkNvbmZpZywgY29uZmlnKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHN0b3JhZ2UgPSBzZXNzaW9uU3RvcmFnZTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLnNlc3Npb24pIHtcbiAgICAgICAgc3RvcmFnZSA9IGxvY2FsU3RvcmFnZTtcbiAgICAgIH1cblxuICAgICAgc3RvcmFnZS5zZXRJdGVtKExPQ0FMX0NPTkZJR19LRVksIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobmFtZSwgYXJncykge1xuICAgIHRoaXMuZXZlbnRzLnNlbmQobmFtZSwgYXJncyk7XG4gIH07XG5cbiAgX3Byb3RvLm9ic2VydmVFdmVudCA9IGZ1bmN0aW9uIG9ic2VydmVFdmVudChuYW1lLCBmbikge1xuICAgIHJldHVybiB0aGlzLmV2ZW50cy5vYnNlcnZlKG5hbWUsIGZuKTtcbiAgfTtcblxuICByZXR1cm4gQ29uZmlnO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBDb25maWc7IiwidmFyIFNDSEVEVUxFID0gJ3NjaGVkdWxlJztcbnZhciBJTlZPS0UgPSAnaW52b2tlJztcbnZhciBBRERfRVZFTlRfTElTVEVORVJfU1RSID0gJ2FkZEV2ZW50TGlzdGVuZXInO1xudmFyIFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFIgPSAncmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG52YXIgUkVTT1VSQ0VfSU5JVElBVE9SX1RZUEVTID0gWydsaW5rJywgJ2NzcycsICdzY3JpcHQnLCAnaW1nJywgJ3htbGh0dHByZXF1ZXN0JywgJ2ZldGNoJywgJ2JlYWNvbicsICdpZnJhbWUnXTtcbnZhciBSRVVTQUJJTElUWV9USFJFU0hPTEQgPSA1MDAwO1xudmFyIE1BWF9TUEFOX0RVUkFUSU9OID0gNSAqIDYwICogMTAwMDtcbnZhciBQQUdFX0xPQURfREVMQVkgPSAxMDAwO1xudmFyIFBBR0VfTE9BRCA9ICdwYWdlLWxvYWQnO1xudmFyIFJPVVRFX0NIQU5HRSA9ICdyb3V0ZS1jaGFuZ2UnO1xudmFyIFRZUEVfQ1VTVE9NID0gJ2N1c3RvbSc7XG52YXIgVVNFUl9JTlRFUkFDVElPTiA9ICd1c2VyLWludGVyYWN0aW9uJztcbnZhciBIVFRQX1JFUVVFU1RfVFlQRSA9ICdodHRwLXJlcXVlc3QnO1xudmFyIFRFTVBPUkFSWV9UWVBFID0gJ3RlbXBvcmFyeSc7XG52YXIgTkFNRV9VTktOT1dOID0gJ1Vua25vd24nO1xudmFyIFRSQU5TQUNUSU9OX1RZUEVfT1JERVIgPSBbUEFHRV9MT0FELCBST1VURV9DSEFOR0UsIFVTRVJfSU5URVJBQ1RJT04sIEhUVFBfUkVRVUVTVF9UWVBFLCBUWVBFX0NVU1RPTSwgVEVNUE9SQVJZX1RZUEVdO1xudmFyIE9VVENPTUVfU1VDQ0VTUyA9ICdzdWNjZXNzJztcbnZhciBPVVRDT01FX0ZBSUxVUkUgPSAnZmFpbHVyZSc7XG52YXIgT1VUQ09NRV9VTktOT1dOID0gJ3Vua25vd24nO1xudmFyIFVTRVJfVElNSU5HX1RIUkVTSE9MRCA9IDYwO1xudmFyIFRSQU5TQUNUSU9OX1NUQVJUID0gJ3RyYW5zYWN0aW9uOnN0YXJ0JztcbnZhciBUUkFOU0FDVElPTl9FTkQgPSAndHJhbnNhY3Rpb246ZW5kJztcbnZhciBDT05GSUdfQ0hBTkdFID0gJ2NvbmZpZzpjaGFuZ2UnO1xudmFyIFFVRVVFX0ZMVVNIID0gJ3F1ZXVlOmZsdXNoJztcbnZhciBRVUVVRV9BRERfVFJBTlNBQ1RJT04gPSAncXVldWU6YWRkX3RyYW5zYWN0aW9uJztcbnZhciBYTUxIVFRQUkVRVUVTVCA9ICd4bWxodHRwcmVxdWVzdCc7XG52YXIgRkVUQ0ggPSAnZmV0Y2gnO1xudmFyIEhJU1RPUlkgPSAnaGlzdG9yeSc7XG52YXIgRVZFTlRfVEFSR0VUID0gJ2V2ZW50dGFyZ2V0JztcbnZhciBDTElDSyA9ICdjbGljayc7XG52YXIgRVJST1IgPSAnZXJyb3InO1xudmFyIEJFRk9SRV9FVkVOVCA9ICc6YmVmb3JlJztcbnZhciBBRlRFUl9FVkVOVCA9ICc6YWZ0ZXInO1xudmFyIExPQ0FMX0NPTkZJR19LRVkgPSAnZWxhc3RpY19hcG1fY29uZmlnJztcbnZhciBMT05HX1RBU0sgPSAnbG9uZ3Rhc2snO1xudmFyIFBBSU5UID0gJ3BhaW50JztcbnZhciBNRUFTVVJFID0gJ21lYXN1cmUnO1xudmFyIE5BVklHQVRJT04gPSAnbmF2aWdhdGlvbic7XG52YXIgUkVTT1VSQ0UgPSAncmVzb3VyY2UnO1xudmFyIEZJUlNUX0NPTlRFTlRGVUxfUEFJTlQgPSAnZmlyc3QtY29udGVudGZ1bC1wYWludCc7XG52YXIgTEFSR0VTVF9DT05URU5URlVMX1BBSU5UID0gJ2xhcmdlc3QtY29udGVudGZ1bC1wYWludCc7XG52YXIgRklSU1RfSU5QVVQgPSAnZmlyc3QtaW5wdXQnO1xudmFyIExBWU9VVF9TSElGVCA9ICdsYXlvdXQtc2hpZnQnO1xudmFyIEVSUk9SUyA9ICdlcnJvcnMnO1xudmFyIFRSQU5TQUNUSU9OUyA9ICd0cmFuc2FjdGlvbnMnO1xudmFyIENPTkZJR19TRVJWSUNFID0gJ0NvbmZpZ1NlcnZpY2UnO1xudmFyIExPR0dJTkdfU0VSVklDRSA9ICdMb2dnaW5nU2VydmljZSc7XG52YXIgVFJBTlNBQ1RJT05fU0VSVklDRSA9ICdUcmFuc2FjdGlvblNlcnZpY2UnO1xudmFyIEFQTV9TRVJWRVIgPSAnQXBtU2VydmVyJztcbnZhciBQRVJGT1JNQU5DRV9NT05JVE9SSU5HID0gJ1BlcmZvcm1hbmNlTW9uaXRvcmluZyc7XG52YXIgRVJST1JfTE9HR0lORyA9ICdFcnJvckxvZ2dpbmcnO1xudmFyIFRSVU5DQVRFRF9UWVBFID0gJy50cnVuY2F0ZWQnO1xudmFyIEtFWVdPUkRfTElNSVQgPSAxMDI0O1xudmFyIFNFU1NJT05fVElNRU9VVCA9IDMwICogNjAwMDA7XG52YXIgSFRUUF9SRVFVRVNUX1RJTUVPVVQgPSAxMDAwMDtcbmV4cG9ydCB7IFNDSEVEVUxFLCBJTlZPS0UsIEFERF9FVkVOVF9MSVNURU5FUl9TVFIsIFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFIsIFJFU09VUkNFX0lOSVRJQVRPUl9UWVBFUywgUkVVU0FCSUxJVFlfVEhSRVNIT0xELCBNQVhfU1BBTl9EVVJBVElPTiwgUEFHRV9MT0FEX0RFTEFZLCBQQUdFX0xPQUQsIFJPVVRFX0NIQU5HRSwgTkFNRV9VTktOT1dOLCBUWVBFX0NVU1RPTSwgVVNFUl9USU1JTkdfVEhSRVNIT0xELCBUUkFOU0FDVElPTl9TVEFSVCwgVFJBTlNBQ1RJT05fRU5ELCBDT05GSUdfQ0hBTkdFLCBRVUVVRV9GTFVTSCwgUVVFVUVfQUREX1RSQU5TQUNUSU9OLCBYTUxIVFRQUkVRVUVTVCwgRkVUQ0gsIEhJU1RPUlksIEVWRU5UX1RBUkdFVCwgQ0xJQ0ssIEVSUk9SLCBCRUZPUkVfRVZFTlQsIEFGVEVSX0VWRU5ULCBMT0NBTF9DT05GSUdfS0VZLCBIVFRQX1JFUVVFU1RfVFlQRSwgTE9OR19UQVNLLCBQQUlOVCwgTUVBU1VSRSwgTkFWSUdBVElPTiwgUkVTT1VSQ0UsIEZJUlNUX0NPTlRFTlRGVUxfUEFJTlQsIExBUkdFU1RfQ09OVEVOVEZVTF9QQUlOVCwgS0VZV09SRF9MSU1JVCwgVEVNUE9SQVJZX1RZUEUsIFVTRVJfSU5URVJBQ1RJT04sIFRSQU5TQUNUSU9OX1RZUEVfT1JERVIsIEVSUk9SUywgVFJBTlNBQ1RJT05TLCBDT05GSUdfU0VSVklDRSwgTE9HR0lOR19TRVJWSUNFLCBUUkFOU0FDVElPTl9TRVJWSUNFLCBBUE1fU0VSVkVSLCBQRVJGT1JNQU5DRV9NT05JVE9SSU5HLCBFUlJPUl9MT0dHSU5HLCBUUlVOQ0FURURfVFlQRSwgRklSU1RfSU5QVVQsIExBWU9VVF9TSElGVCwgT1VUQ09NRV9TVUNDRVNTLCBPVVRDT01FX0ZBSUxVUkUsIE9VVENPTUVfVU5LTk9XTiwgU0VTU0lPTl9USU1FT1VULCBIVFRQX1JFUVVFU1RfVElNRU9VVCB9OyIsInZhciBfZXhjbHVkZWQgPSBbXCJ0YWdzXCJdO1xuXG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShzb3VyY2UsIGV4Y2x1ZGVkKSB7IGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9OyB2YXIgdGFyZ2V0ID0ge307IHZhciBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTsgdmFyIGtleSwgaTsgZm9yIChpID0gMDsgaSA8IHNvdXJjZUtleXMubGVuZ3RoOyBpKyspIHsga2V5ID0gc291cmNlS2V5c1tpXTsgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IFVybCB9IGZyb20gJy4vdXJsJztcbmltcG9ydCB7IFBBR0VfTE9BRCwgTkFWSUdBVElPTiB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IGdldFNlcnZlclRpbWluZ0luZm8sIFBFUkYsIGlzUGVyZlRpbWVsaW5lU3VwcG9ydGVkIH0gZnJvbSAnLi91dGlscyc7XG52YXIgTEVGVF9TUVVBUkVfQlJBQ0tFVCA9IDkxO1xudmFyIFJJR0hUX1NRVUFSRV9CUkFDS0VUID0gOTM7XG52YXIgRVhURVJOQUwgPSAnZXh0ZXJuYWwnO1xudmFyIFJFU09VUkNFID0gJ3Jlc291cmNlJztcbnZhciBIQVJEX05BVklHQVRJT04gPSAnaGFyZC1uYXZpZ2F0aW9uJztcblxuZnVuY3Rpb24gZ2V0UG9ydE51bWJlcihwb3J0LCBwcm90b2NvbCkge1xuICBpZiAocG9ydCA9PT0gJycpIHtcbiAgICBwb3J0ID0gcHJvdG9jb2wgPT09ICdodHRwOicgPyAnODAnIDogcHJvdG9jb2wgPT09ICdodHRwczonID8gJzQ0MycgOiAnJztcbiAgfVxuXG4gIHJldHVybiBwb3J0O1xufVxuXG5mdW5jdGlvbiBnZXRSZXNwb25zZUNvbnRleHQocGVyZlRpbWluZ0VudHJ5KSB7XG4gIHZhciB0cmFuc2ZlclNpemUgPSBwZXJmVGltaW5nRW50cnkudHJhbnNmZXJTaXplLFxuICAgICAgZW5jb2RlZEJvZHlTaXplID0gcGVyZlRpbWluZ0VudHJ5LmVuY29kZWRCb2R5U2l6ZSxcbiAgICAgIGRlY29kZWRCb2R5U2l6ZSA9IHBlcmZUaW1pbmdFbnRyeS5kZWNvZGVkQm9keVNpemUsXG4gICAgICBzZXJ2ZXJUaW1pbmcgPSBwZXJmVGltaW5nRW50cnkuc2VydmVyVGltaW5nO1xuICB2YXIgcmVzcENvbnRleHQgPSB7XG4gICAgdHJhbnNmZXJfc2l6ZTogdHJhbnNmZXJTaXplLFxuICAgIGVuY29kZWRfYm9keV9zaXplOiBlbmNvZGVkQm9keVNpemUsXG4gICAgZGVjb2RlZF9ib2R5X3NpemU6IGRlY29kZWRCb2R5U2l6ZVxuICB9O1xuICB2YXIgc2VydmVyVGltaW5nU3RyID0gZ2V0U2VydmVyVGltaW5nSW5mbyhzZXJ2ZXJUaW1pbmcpO1xuXG4gIGlmIChzZXJ2ZXJUaW1pbmdTdHIpIHtcbiAgICByZXNwQ29udGV4dC5oZWFkZXJzID0ge1xuICAgICAgJ3NlcnZlci10aW1pbmcnOiBzZXJ2ZXJUaW1pbmdTdHJcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHJlc3BDb250ZXh0O1xufVxuXG5mdW5jdGlvbiBnZXREZXN0aW5hdGlvbihwYXJzZWRVcmwpIHtcbiAgdmFyIHBvcnQgPSBwYXJzZWRVcmwucG9ydCxcbiAgICAgIHByb3RvY29sID0gcGFyc2VkVXJsLnByb3RvY29sLFxuICAgICAgaG9zdG5hbWUgPSBwYXJzZWRVcmwuaG9zdG5hbWU7XG4gIHZhciBwb3J0TnVtYmVyID0gZ2V0UG9ydE51bWJlcihwb3J0LCBwcm90b2NvbCk7XG4gIHZhciBpcHY2SG9zdG5hbWUgPSBob3N0bmFtZS5jaGFyQ29kZUF0KDApID09PSBMRUZUX1NRVUFSRV9CUkFDS0VUICYmIGhvc3RuYW1lLmNoYXJDb2RlQXQoaG9zdG5hbWUubGVuZ3RoIC0gMSkgPT09IFJJR0hUX1NRVUFSRV9CUkFDS0VUO1xuICB2YXIgYWRkcmVzcyA9IGhvc3RuYW1lO1xuXG4gIGlmIChpcHY2SG9zdG5hbWUpIHtcbiAgICBhZGRyZXNzID0gaG9zdG5hbWUuc2xpY2UoMSwgLTEpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzZXJ2aWNlOiB7XG4gICAgICByZXNvdXJjZTogaG9zdG5hbWUgKyAnOicgKyBwb3J0TnVtYmVyLFxuICAgICAgbmFtZTogJycsXG4gICAgICB0eXBlOiAnJ1xuICAgIH0sXG4gICAgYWRkcmVzczogYWRkcmVzcyxcbiAgICBwb3J0OiBOdW1iZXIocG9ydE51bWJlcilcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0UmVzb3VyY2VDb250ZXh0KGRhdGEpIHtcbiAgdmFyIGVudHJ5ID0gZGF0YS5lbnRyeSxcbiAgICAgIHVybCA9IGRhdGEudXJsO1xuICB2YXIgcGFyc2VkVXJsID0gbmV3IFVybCh1cmwpO1xuICB2YXIgZGVzdGluYXRpb24gPSBnZXREZXN0aW5hdGlvbihwYXJzZWRVcmwpO1xuICByZXR1cm4ge1xuICAgIGh0dHA6IHtcbiAgICAgIHVybDogdXJsLFxuICAgICAgcmVzcG9uc2U6IGdldFJlc3BvbnNlQ29udGV4dChlbnRyeSlcbiAgICB9LFxuICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvblxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRFeHRlcm5hbENvbnRleHQoZGF0YSkge1xuICB2YXIgdXJsID0gZGF0YS51cmwsXG4gICAgICBtZXRob2QgPSBkYXRhLm1ldGhvZCxcbiAgICAgIHRhcmdldCA9IGRhdGEudGFyZ2V0LFxuICAgICAgcmVzcG9uc2UgPSBkYXRhLnJlc3BvbnNlO1xuICB2YXIgcGFyc2VkVXJsID0gbmV3IFVybCh1cmwpO1xuICB2YXIgZGVzdGluYXRpb24gPSBnZXREZXN0aW5hdGlvbihwYXJzZWRVcmwpO1xuICB2YXIgY29udGV4dCA9IHtcbiAgICBodHRwOiB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogcGFyc2VkVXJsLmhyZWZcbiAgICB9LFxuICAgIGRlc3RpbmF0aW9uOiBkZXN0aW5hdGlvblxuICB9O1xuICB2YXIgc3RhdHVzQ29kZTtcblxuICBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQuc3RhdHVzICE9PSAndW5kZWZpbmVkJykge1xuICAgIHN0YXR1c0NvZGUgPSB0YXJnZXQuc3RhdHVzO1xuICB9IGVsc2UgaWYgKHJlc3BvbnNlKSB7XG4gICAgc3RhdHVzQ29kZSA9IHJlc3BvbnNlLnN0YXR1cztcbiAgfVxuXG4gIGNvbnRleHQuaHR0cC5zdGF0dXNfY29kZSA9IHN0YXR1c0NvZGU7XG4gIHJldHVybiBjb250ZXh0O1xufVxuXG5mdW5jdGlvbiBnZXROYXZpZ2F0aW9uQ29udGV4dChkYXRhKSB7XG4gIHZhciB1cmwgPSBkYXRhLnVybDtcbiAgdmFyIHBhcnNlZFVybCA9IG5ldyBVcmwodXJsKTtcbiAgdmFyIGRlc3RpbmF0aW9uID0gZ2V0RGVzdGluYXRpb24ocGFyc2VkVXJsKTtcbiAgcmV0dXJuIHtcbiAgICBkZXN0aW5hdGlvbjogZGVzdGluYXRpb25cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2VDb250ZXh0KCkge1xuICByZXR1cm4ge1xuICAgIHBhZ2U6IHtcbiAgICAgIHJlZmVyZXI6IGRvY3VtZW50LnJlZmVycmVyLFxuICAgICAgdXJsOiBsb2NhdGlvbi5ocmVmXG4gICAgfVxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGFkZFNwYW5Db250ZXh0KHNwYW4sIGRhdGEpIHtcbiAgaWYgKCFkYXRhKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHR5cGUgPSBzcGFuLnR5cGU7XG4gIHZhciBjb250ZXh0O1xuXG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgRVhURVJOQUw6XG4gICAgICBjb250ZXh0ID0gZ2V0RXh0ZXJuYWxDb250ZXh0KGRhdGEpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIFJFU09VUkNFOlxuICAgICAgY29udGV4dCA9IGdldFJlc291cmNlQ29udGV4dChkYXRhKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBIQVJEX05BVklHQVRJT046XG4gICAgICBjb250ZXh0ID0gZ2V0TmF2aWdhdGlvbkNvbnRleHQoZGF0YSk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHNwYW4uYWRkQ29udGV4dChjb250ZXh0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhZGRUcmFuc2FjdGlvbkNvbnRleHQodHJhbnNhY3Rpb24sIF90ZW1wKSB7XG4gIHZhciBfcmVmID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXAsXG4gICAgICB0YWdzID0gX3JlZi50YWdzLFxuICAgICAgY29uZmlnQ29udGV4dCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF9yZWYsIF9leGNsdWRlZCk7XG5cbiAgdmFyIHBhZ2VDb250ZXh0ID0gZ2V0UGFnZUNvbnRleHQoKTtcbiAgdmFyIHJlc3BvbnNlQ29udGV4dCA9IHt9O1xuXG4gIGlmICh0cmFuc2FjdGlvbi50eXBlID09PSBQQUdFX0xPQUQgJiYgaXNQZXJmVGltZWxpbmVTdXBwb3J0ZWQoKSkge1xuICAgIHZhciBlbnRyaWVzID0gUEVSRi5nZXRFbnRyaWVzQnlUeXBlKE5BVklHQVRJT04pO1xuXG4gICAgaWYgKGVudHJpZXMgJiYgZW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXNwb25zZUNvbnRleHQgPSB7XG4gICAgICAgIHJlc3BvbnNlOiBnZXRSZXNwb25zZUNvbnRleHQoZW50cmllc1swXSlcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgdHJhbnNhY3Rpb24uYWRkQ29udGV4dChwYWdlQ29udGV4dCwgcmVzcG9uc2VDb250ZXh0LCBjb25maWdDb250ZXh0KTtcbn0iLCJpbXBvcnQgeyBCRUZPUkVfRVZFTlQsIEFGVEVSX0VWRU5UIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG52YXIgRXZlbnRIYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBFdmVudEhhbmRsZXIoKSB7XG4gICAgdGhpcy5vYnNlcnZlcnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBFdmVudEhhbmRsZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5vYnNlcnZlID0gZnVuY3Rpb24gb2JzZXJ2ZShuYW1lLCBmbikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoIXRoaXMub2JzZXJ2ZXJzW25hbWVdKSB7XG4gICAgICAgIHRoaXMub2JzZXJ2ZXJzW25hbWVdID0gW107XG4gICAgICB9XG5cbiAgICAgIHRoaXMub2JzZXJ2ZXJzW25hbWVdLnB1c2goZm4pO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gX3RoaXMub2JzZXJ2ZXJzW25hbWVdLmluZGV4T2YoZm4pO1xuXG4gICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgX3RoaXMub2JzZXJ2ZXJzW25hbWVdLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5zZW5kT25seSA9IGZ1bmN0aW9uIHNlbmRPbmx5KG5hbWUsIGFyZ3MpIHtcbiAgICB2YXIgb2JzID0gdGhpcy5vYnNlcnZlcnNbbmFtZV07XG5cbiAgICBpZiAob2JzKSB7XG4gICAgICBvYnMuZm9yRWFjaChmdW5jdGlvbiAoZm4pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmbi5hcHBseSh1bmRlZmluZWQsIGFyZ3MpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yLCBlcnJvci5zdGFjayk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uc2VuZCA9IGZ1bmN0aW9uIHNlbmQobmFtZSwgYXJncykge1xuICAgIHRoaXMuc2VuZE9ubHkobmFtZSArIEJFRk9SRV9FVkVOVCwgYXJncyk7XG4gICAgdGhpcy5zZW5kT25seShuYW1lLCBhcmdzKTtcbiAgICB0aGlzLnNlbmRPbmx5KG5hbWUgKyBBRlRFUl9FVkVOVCwgYXJncyk7XG4gIH07XG5cbiAgcmV0dXJuIEV2ZW50SGFuZGxlcjtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgRXZlbnRIYW5kbGVyOyIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmltcG9ydCB7IEhUVFBfUkVRVUVTVF9USU1FT1VUIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IGlzUmVzcG9uc2VTdWNjZXNzZnVsIH0gZnJvbSAnLi9yZXNwb25zZS1zdGF0dXMnO1xuZXhwb3J0IHZhciBCWVRFX0xJTUlUID0gNjAgKiAxMDAwO1xuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZFVzZUZldGNoV2l0aEtlZXBBbGl2ZShtZXRob2QsIHBheWxvYWQpIHtcbiAgaWYgKCFpc0ZldGNoU3VwcG9ydGVkKCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgaXNLZWVwQWxpdmVTdXBwb3J0ZWQgPSAoJ2tlZXBhbGl2ZScgaW4gbmV3IFJlcXVlc3QoJycpKTtcblxuICBpZiAoIWlzS2VlcEFsaXZlU3VwcG9ydGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyIHNpemUgPSBjYWxjdWxhdGVTaXplKHBheWxvYWQpO1xuICByZXR1cm4gbWV0aG9kID09PSAnUE9TVCcgJiYgc2l6ZSA8IEJZVEVfTElNSVQ7XG59XG5leHBvcnQgZnVuY3Rpb24gc2VuZEZldGNoUmVxdWVzdChtZXRob2QsIHVybCwgX3JlZikge1xuICB2YXIgX3JlZiRrZWVwYWxpdmUgPSBfcmVmLmtlZXBhbGl2ZSxcbiAgICAgIGtlZXBhbGl2ZSA9IF9yZWYka2VlcGFsaXZlID09PSB2b2lkIDAgPyBmYWxzZSA6IF9yZWYka2VlcGFsaXZlLFxuICAgICAgX3JlZiR0aW1lb3V0ID0gX3JlZi50aW1lb3V0LFxuICAgICAgdGltZW91dCA9IF9yZWYkdGltZW91dCA9PT0gdm9pZCAwID8gSFRUUF9SRVFVRVNUX1RJTUVPVVQgOiBfcmVmJHRpbWVvdXQsXG4gICAgICBwYXlsb2FkID0gX3JlZi5wYXlsb2FkLFxuICAgICAgaGVhZGVycyA9IF9yZWYuaGVhZGVycyxcbiAgICAgIHNlbmRDcmVkZW50aWFscyA9IF9yZWYuc2VuZENyZWRlbnRpYWxzO1xuICB2YXIgdGltZW91dENvbmZpZyA9IHt9O1xuXG4gIGlmICh0eXBlb2YgQWJvcnRDb250cm9sbGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGltZW91dENvbmZpZy5zaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbDtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgfSwgdGltZW91dCk7XG4gIH1cblxuICB2YXIgZmV0Y2hSZXNwb25zZTtcbiAgcmV0dXJuIHdpbmRvdy5mZXRjaCh1cmwsIF9leHRlbmRzKHtcbiAgICBib2R5OiBwYXlsb2FkLFxuICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgbWV0aG9kOiBtZXRob2QsXG4gICAga2VlcGFsaXZlOiBrZWVwYWxpdmUsXG4gICAgY3JlZGVudGlhbHM6IHNlbmRDcmVkZW50aWFscyA/ICdpbmNsdWRlJyA6ICdvbWl0J1xuICB9LCB0aW1lb3V0Q29uZmlnKSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICBmZXRjaFJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgcmV0dXJuIGZldGNoUmVzcG9uc2UudGV4dCgpO1xuICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZVRleHQpIHtcbiAgICB2YXIgYm9keVJlc3BvbnNlID0ge1xuICAgICAgdXJsOiB1cmwsXG4gICAgICBzdGF0dXM6IGZldGNoUmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgcmVzcG9uc2VUZXh0OiByZXNwb25zZVRleHRcbiAgICB9O1xuXG4gICAgaWYgKCFpc1Jlc3BvbnNlU3VjY2Vzc2Z1bChmZXRjaFJlc3BvbnNlLnN0YXR1cykpIHtcbiAgICAgIHRocm93IGJvZHlSZXNwb25zZTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm9keVJlc3BvbnNlO1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0ZldGNoU3VwcG9ydGVkKCkge1xuICByZXR1cm4gdHlwZW9mIHdpbmRvdy5mZXRjaCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygd2luZG93LlJlcXVlc3QgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVNpemUocGF5bG9hZCkge1xuICBpZiAoIXBheWxvYWQpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGlmIChwYXlsb2FkIGluc3RhbmNlb2YgQmxvYikge1xuICAgIHJldHVybiBwYXlsb2FkLnNpemU7XG4gIH1cblxuICByZXR1cm4gbmV3IEJsb2IoW3BheWxvYWRdKS5zaXplO1xufSIsImV4cG9ydCBmdW5jdGlvbiBpc1Jlc3BvbnNlU3VjY2Vzc2Z1bChzdGF0dXMpIHtcbiAgaWYgKHN0YXR1cyA9PT0gMCB8fCBzdGF0dXMgPiAzOTkgJiYgc3RhdHVzIDwgNjAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59IiwiaW1wb3J0IHsgWEhSX0lHTk9SRSB9IGZyb20gJy4uL3BhdGNoaW5nL3BhdGNoLXV0aWxzJztcbmltcG9ydCB7IGlzUmVzcG9uc2VTdWNjZXNzZnVsIH0gZnJvbSAnLi9yZXNwb25zZS1zdGF0dXMnO1xuaW1wb3J0IHsgUHJvbWlzZSB9IGZyb20gJy4uL3BvbHlmaWxscyc7XG5leHBvcnQgZnVuY3Rpb24gc2VuZFhIUihtZXRob2QsIHVybCwgX3JlZikge1xuICB2YXIgX3JlZiR0aW1lb3V0ID0gX3JlZi50aW1lb3V0LFxuICAgICAgdGltZW91dCA9IF9yZWYkdGltZW91dCA9PT0gdm9pZCAwID8gSFRUUF9SRVFVRVNUX1RJTUVPVVQgOiBfcmVmJHRpbWVvdXQsXG4gICAgICBwYXlsb2FkID0gX3JlZi5wYXlsb2FkLFxuICAgICAgaGVhZGVycyA9IF9yZWYuaGVhZGVycyxcbiAgICAgIGJlZm9yZVNlbmQgPSBfcmVmLmJlZm9yZVNlbmQsXG4gICAgICBzZW5kQ3JlZGVudGlhbHMgPSBfcmVmLnNlbmRDcmVkZW50aWFscztcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICB2YXIgeGhyID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhocltYSFJfSUdOT1JFXSA9IHRydWU7XG4gICAgeGhyLm9wZW4obWV0aG9kLCB1cmwsIHRydWUpO1xuICAgIHhoci50aW1lb3V0ID0gdGltZW91dDtcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gc2VuZENyZWRlbnRpYWxzO1xuXG4gICAgaWYgKGhlYWRlcnMpIHtcbiAgICAgIGZvciAodmFyIGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIsIGhlYWRlcnNbaGVhZGVyXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKHhoci5yZWFkeVN0YXRlID09PSA0KSB7XG4gICAgICAgIHZhciBzdGF0dXMgPSB4aHIuc3RhdHVzLFxuICAgICAgICAgICAgcmVzcG9uc2VUZXh0ID0geGhyLnJlc3BvbnNlVGV4dDtcblxuICAgICAgICBpZiAoaXNSZXNwb25zZVN1Y2Nlc3NmdWwoc3RhdHVzKSkge1xuICAgICAgICAgIHJlc29sdmUoeGhyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZWplY3Qoe1xuICAgICAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcbiAgICAgICAgICAgIHJlc3BvbnNlVGV4dDogcmVzcG9uc2VUZXh0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgeGhyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgc3RhdHVzID0geGhyLnN0YXR1cyxcbiAgICAgICAgICByZXNwb25zZVRleHQgPSB4aHIucmVzcG9uc2VUZXh0O1xuICAgICAgcmVqZWN0KHtcbiAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICByZXNwb25zZVRleHQ6IHJlc3BvbnNlVGV4dFxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHZhciBjYW5TZW5kID0gdHJ1ZTtcblxuICAgIGlmICh0eXBlb2YgYmVmb3JlU2VuZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FuU2VuZCA9IGJlZm9yZVNlbmQoe1xuICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICAgIHhocjogeGhyXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoY2FuU2VuZCkge1xuICAgICAgeGhyLnNlbmQocGF5bG9hZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlamVjdCh7XG4gICAgICAgIHVybDogdXJsLFxuICAgICAgICBzdGF0dXM6IDAsXG4gICAgICAgIHJlc3BvbnNlVGV4dDogJ1JlcXVlc3QgcmVqZWN0ZWQgYnkgdXNlciBjb25maWd1cmF0aW9uLidcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59IiwiaW1wb3J0IHsgWE1MSFRUUFJFUVVFU1QsIEZFVENILCBISVNUT1JZLCBQQUdFX0xPQUQsIEVSUk9SLCBFVkVOVF9UQVJHRVQsIENMSUNLIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluc3RydW1lbnRhdGlvbkZsYWdzKGluc3RydW1lbnQsIGRpc2FibGVkSW5zdHJ1bWVudGF0aW9ucykge1xuICB2YXIgX2ZsYWdzO1xuXG4gIHZhciBmbGFncyA9IChfZmxhZ3MgPSB7fSwgX2ZsYWdzW1hNTEhUVFBSRVFVRVNUXSA9IGZhbHNlLCBfZmxhZ3NbRkVUQ0hdID0gZmFsc2UsIF9mbGFnc1tISVNUT1JZXSA9IGZhbHNlLCBfZmxhZ3NbUEFHRV9MT0FEXSA9IGZhbHNlLCBfZmxhZ3NbRVJST1JdID0gZmFsc2UsIF9mbGFnc1tFVkVOVF9UQVJHRVRdID0gZmFsc2UsIF9mbGFnc1tDTElDS10gPSBmYWxzZSwgX2ZsYWdzKTtcblxuICBpZiAoIWluc3RydW1lbnQpIHtcbiAgICByZXR1cm4gZmxhZ3M7XG4gIH1cblxuICBPYmplY3Qua2V5cyhmbGFncykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKGRpc2FibGVkSW5zdHJ1bWVudGF0aW9ucy5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICBmbGFnc1trZXldID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gZmxhZ3M7XG59IiwiaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4vdXRpbHMnO1xuXG52YXIgTG9nZ2luZ1NlcnZpY2UgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIExvZ2dpbmdTZXJ2aWNlKHNwZWMpIHtcbiAgICBpZiAoc3BlYyA9PT0gdm9pZCAwKSB7XG4gICAgICBzcGVjID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5sZXZlbHMgPSBbJ3RyYWNlJywgJ2RlYnVnJywgJ2luZm8nLCAnd2FybicsICdlcnJvciddO1xuICAgIHRoaXMubGV2ZWwgPSBzcGVjLmxldmVsIHx8ICd3YXJuJztcbiAgICB0aGlzLnByZWZpeCA9IHNwZWMucHJlZml4IHx8ICcnO1xuICAgIHRoaXMucmVzZXRMb2dNZXRob2RzKCk7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gTG9nZ2luZ1NlcnZpY2UucHJvdG90eXBlO1xuXG4gIF9wcm90by5zaG91bGRMb2cgPSBmdW5jdGlvbiBzaG91bGRMb2cobGV2ZWwpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbHMuaW5kZXhPZihsZXZlbCkgPj0gdGhpcy5sZXZlbHMuaW5kZXhPZih0aGlzLmxldmVsKTtcbiAgfTtcblxuICBfcHJvdG8uc2V0TGV2ZWwgPSBmdW5jdGlvbiBzZXRMZXZlbChsZXZlbCkge1xuICAgIGlmIChsZXZlbCA9PT0gdGhpcy5sZXZlbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubGV2ZWwgPSBsZXZlbDtcbiAgICB0aGlzLnJlc2V0TG9nTWV0aG9kcygpO1xuICB9O1xuXG4gIF9wcm90by5yZXNldExvZ01ldGhvZHMgPSBmdW5jdGlvbiByZXNldExvZ01ldGhvZHMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMubGV2ZWxzLmZvckVhY2goZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgICBfdGhpc1tsZXZlbF0gPSBfdGhpcy5zaG91bGRMb2cobGV2ZWwpID8gbG9nIDogbm9vcDtcblxuICAgICAgZnVuY3Rpb24gbG9nKCkge1xuICAgICAgICB2YXIgbm9ybWFsaXplZExldmVsID0gbGV2ZWw7XG5cbiAgICAgICAgaWYgKGxldmVsID09PSAndHJhY2UnIHx8IGxldmVsID09PSAnZGVidWcnKSB7XG4gICAgICAgICAgbm9ybWFsaXplZExldmVsID0gJ2luZm8nO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgIGFyZ3NbMF0gPSB0aGlzLnByZWZpeCArIGFyZ3NbMF07XG5cbiAgICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgICB2YXIgcmVhbE1ldGhvZCA9IGNvbnNvbGVbbm9ybWFsaXplZExldmVsXSB8fCBjb25zb2xlLmxvZztcblxuICAgICAgICAgIGlmICh0eXBlb2YgcmVhbE1ldGhvZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmVhbE1ldGhvZC5hcHBseShjb25zb2xlLCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gTG9nZ2luZ1NlcnZpY2U7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IExvZ2dpbmdTZXJ2aWNlOyIsInZhciBOREpTT04gPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIE5ESlNPTigpIHt9XG5cbiAgTkRKU09OLnN0cmluZ2lmeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeShvYmplY3QpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqZWN0KSArICdcXG4nO1xuICB9O1xuXG4gIHJldHVybiBOREpTT047XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IE5ESlNPTjsiLCJpbXBvcnQgeyBVU0VSX0lOVEVSQUNUSU9OIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmV4cG9ydCBmdW5jdGlvbiBvYnNlcnZlUGFnZUNsaWNrcyh0cmFuc2FjdGlvblNlcnZpY2UpIHtcbiAgdmFyIGNsaWNrSGFuZGxlciA9IGZ1bmN0aW9uIGNsaWNrSGFuZGxlcihldmVudCkge1xuICAgIGlmIChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICBjcmVhdGVVc2VySW50ZXJhY3Rpb25UcmFuc2FjdGlvbih0cmFuc2FjdGlvblNlcnZpY2UsIGV2ZW50LnRhcmdldCk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBldmVudE5hbWUgPSAnY2xpY2snO1xuICB2YXIgdXNlQ2FwdHVyZSA9IHRydWU7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgY2xpY2tIYW5kbGVyLCB1c2VDYXB0dXJlKTtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGNsaWNrSGFuZGxlciwgdXNlQ2FwdHVyZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVVzZXJJbnRlcmFjdGlvblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uU2VydmljZSwgdGFyZ2V0KSB7XG4gIHZhciBfZ2V0VHJhbnNhY3Rpb25NZXRhZGEgPSBnZXRUcmFuc2FjdGlvbk1ldGFkYXRhKHRhcmdldCksXG4gICAgICB0cmFuc2FjdGlvbk5hbWUgPSBfZ2V0VHJhbnNhY3Rpb25NZXRhZGEudHJhbnNhY3Rpb25OYW1lLFxuICAgICAgY29udGV4dCA9IF9nZXRUcmFuc2FjdGlvbk1ldGFkYS5jb250ZXh0O1xuXG4gIHZhciB0ciA9IHRyYW5zYWN0aW9uU2VydmljZS5zdGFydFRyYW5zYWN0aW9uKFwiQ2xpY2sgLSBcIiArIHRyYW5zYWN0aW9uTmFtZSwgVVNFUl9JTlRFUkFDVElPTiwge1xuICAgIG1hbmFnZWQ6IHRydWUsXG4gICAgY2FuUmV1c2U6IHRydWUsXG4gICAgcmV1c2VUaHJlc2hvbGQ6IDMwMFxuICB9KTtcblxuICBpZiAodHIgJiYgY29udGV4dCkge1xuICAgIHRyLmFkZENvbnRleHQoY29udGV4dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb25NZXRhZGF0YSh0YXJnZXQpIHtcbiAgdmFyIG1ldGFkYXRhID0ge1xuICAgIHRyYW5zYWN0aW9uTmFtZTogbnVsbCxcbiAgICBjb250ZXh0OiBudWxsXG4gIH07XG4gIHZhciB0YWdOYW1lID0gdGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgdmFyIHRyYW5zYWN0aW9uTmFtZSA9IHRhZ05hbWU7XG5cbiAgaWYgKCEhdGFyZ2V0LmRhdGFzZXQudHJhbnNhY3Rpb25OYW1lKSB7XG4gICAgdHJhbnNhY3Rpb25OYW1lID0gdGFyZ2V0LmRhdGFzZXQudHJhbnNhY3Rpb25OYW1lO1xuICB9IGVsc2Uge1xuICAgIHZhciBuYW1lID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgaWYgKCEhbmFtZSkge1xuICAgICAgdHJhbnNhY3Rpb25OYW1lID0gdGFnTmFtZSArIFwiW1xcXCJcIiArIG5hbWUgKyBcIlxcXCJdXCI7XG4gICAgfVxuICB9XG5cbiAgbWV0YWRhdGEudHJhbnNhY3Rpb25OYW1lID0gdHJhbnNhY3Rpb25OYW1lO1xuICB2YXIgY2xhc3NlcyA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJyk7XG5cbiAgaWYgKGNsYXNzZXMpIHtcbiAgICBtZXRhZGF0YS5jb250ZXh0ID0ge1xuICAgICAgY3VzdG9tOiB7XG4gICAgICAgIGNsYXNzZXM6IGNsYXNzZXNcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG1ldGFkYXRhO1xufSIsImltcG9ydCB7IFFVRVVFX0FERF9UUkFOU0FDVElPTiwgUVVFVUVfRkxVU0ggfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgc3RhdGUgfSBmcm9tICcuLi8uLi9zdGF0ZSc7XG5pbXBvcnQgeyBub3cgfSBmcm9tICcuLi91dGlscyc7XG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZVBhZ2VWaXNpYmlsaXR5KGNvbmZpZ1NlcnZpY2UsIHRyYW5zYWN0aW9uU2VydmljZSkge1xuICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAnaGlkZGVuJykge1xuICAgIHN0YXRlLmxhc3RIaWRkZW5TdGFydCA9IDA7XG4gIH1cblxuICB2YXIgdmlzaWJpbGl0eUNoYW5nZUhhbmRsZXIgPSBmdW5jdGlvbiB2aXNpYmlsaXR5Q2hhbmdlSGFuZGxlcigpIHtcbiAgICBpZiAoZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAnaGlkZGVuJykge1xuICAgICAgb25QYWdlSGlkZGVuKGNvbmZpZ1NlcnZpY2UsIHRyYW5zYWN0aW9uU2VydmljZSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBwYWdlSGlkZUhhbmRsZXIgPSBmdW5jdGlvbiBwYWdlSGlkZUhhbmRsZXIoKSB7XG4gICAgcmV0dXJuIG9uUGFnZUhpZGRlbihjb25maWdTZXJ2aWNlLCB0cmFuc2FjdGlvblNlcnZpY2UpO1xuICB9O1xuXG4gIHZhciB1c2VDYXB0dXJlID0gdHJ1ZTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlSGFuZGxlciwgdXNlQ2FwdHVyZSk7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsIHBhZ2VIaWRlSGFuZGxlciwgdXNlQ2FwdHVyZSk7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB2aXNpYmlsaXR5Q2hhbmdlSGFuZGxlciwgdXNlQ2FwdHVyZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJywgcGFnZUhpZGVIYW5kbGVyLCB1c2VDYXB0dXJlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gb25QYWdlSGlkZGVuKGNvbmZpZ1NlcnZpY2UsIHRyYW5zYWN0aW9uU2VydmljZSkge1xuICB2YXIgdHIgPSB0cmFuc2FjdGlvblNlcnZpY2UuZ2V0Q3VycmVudFRyYW5zYWN0aW9uKCk7XG5cbiAgaWYgKHRyKSB7XG4gICAgdmFyIHVub2JzZXJ2ZSA9IGNvbmZpZ1NlcnZpY2Uub2JzZXJ2ZUV2ZW50KFFVRVVFX0FERF9UUkFOU0FDVElPTiwgZnVuY3Rpb24gKCkge1xuICAgICAgY29uZmlnU2VydmljZS5kaXNwYXRjaEV2ZW50KFFVRVVFX0ZMVVNIKTtcbiAgICAgIHN0YXRlLmxhc3RIaWRkZW5TdGFydCA9IG5vdygpO1xuICAgICAgdW5vYnNlcnZlKCk7XG4gICAgfSk7XG4gICAgdHIuZW5kKCk7XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnU2VydmljZS5kaXNwYXRjaEV2ZW50KFFVRVVFX0ZMVVNIKTtcbiAgICBzdGF0ZS5sYXN0SGlkZGVuU3RhcnQgPSBub3coKTtcbiAgfVxufSIsImltcG9ydCB7IFByb21pc2UgfSBmcm9tICcuLi9wb2x5ZmlsbHMnO1xuaW1wb3J0IHsgZ2xvYmFsU3RhdGUgfSBmcm9tICcuL3BhdGNoLXV0aWxzJztcbmltcG9ydCB7IFNDSEVEVUxFLCBJTlZPS0UsIEZFVENIIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IHNjaGVkdWxlTWljcm9UYXNrIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgaXNGZXRjaFN1cHBvcnRlZCB9IGZyb20gJy4uL2h0dHAvZmV0Y2gnO1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoRmV0Y2goY2FsbGJhY2spIHtcbiAgaWYgKCFpc0ZldGNoU3VwcG9ydGVkKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZVRhc2sodGFzaykge1xuICAgIHRhc2suc3RhdGUgPSBTQ0hFRFVMRTtcbiAgICBjYWxsYmFjayhTQ0hFRFVMRSwgdGFzayk7XG4gIH1cblxuICBmdW5jdGlvbiBpbnZva2VUYXNrKHRhc2spIHtcbiAgICB0YXNrLnN0YXRlID0gSU5WT0tFO1xuICAgIGNhbGxiYWNrKElOVk9LRSwgdGFzayk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVSZXNwb25zZUVycm9yKHRhc2ssIGVycm9yKSB7XG4gICAgdGFzay5kYXRhLmFib3J0ZWQgPSBpc0Fib3J0RXJyb3IoZXJyb3IpO1xuICAgIHRhc2suZGF0YS5lcnJvciA9IGVycm9yO1xuICAgIGludm9rZVRhc2sodGFzayk7XG4gIH1cblxuICBmdW5jdGlvbiByZWFkU3RyZWFtKHN0cmVhbSwgdGFzaykge1xuICAgIHZhciByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG5cbiAgICB2YXIgcmVhZCA9IGZ1bmN0aW9uIHJlYWQoKSB7XG4gICAgICByZWFkZXIucmVhZCgpLnRoZW4oZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIGRvbmUgPSBfcmVmLmRvbmU7XG5cbiAgICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgICBpbnZva2VUYXNrKHRhc2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlYWQoKTtcbiAgICAgICAgfVxuICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZVJlc3BvbnNlRXJyb3IodGFzaywgZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJlYWQoKTtcbiAgfVxuXG4gIHZhciBuYXRpdmVGZXRjaCA9IHdpbmRvdy5mZXRjaDtcblxuICB3aW5kb3cuZmV0Y2ggPSBmdW5jdGlvbiAoaW5wdXQsIGluaXQpIHtcbiAgICB2YXIgZmV0Y2hTZWxmID0gdGhpcztcbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgcmVxdWVzdCwgdXJsO1xuXG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJlcXVlc3QgPSBuZXcgUmVxdWVzdChpbnB1dCwgaW5pdCk7XG4gICAgICB1cmwgPSBpbnB1dDtcbiAgICB9IGVsc2UgaWYgKGlucHV0KSB7XG4gICAgICByZXF1ZXN0ID0gaW5wdXQ7XG4gICAgICB1cmwgPSByZXF1ZXN0LnVybDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5hdGl2ZUZldGNoLmFwcGx5KGZldGNoU2VsZiwgYXJncyk7XG4gICAgfVxuXG4gICAgdmFyIHRhc2sgPSB7XG4gICAgICBzb3VyY2U6IEZFVENILFxuICAgICAgc3RhdGU6ICcnLFxuICAgICAgdHlwZTogJ21hY3JvVGFzaycsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIHRhcmdldDogcmVxdWVzdCxcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgIGFib3J0ZWQ6IGZhbHNlXG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgZ2xvYmFsU3RhdGUuZmV0Y2hJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgIHNjaGVkdWxlVGFzayh0YXNrKTtcbiAgICAgIHZhciBwcm9taXNlO1xuXG4gICAgICB0cnkge1xuICAgICAgICBwcm9taXNlID0gbmF0aXZlRmV0Y2guYXBwbHkoZmV0Y2hTZWxmLCBbcmVxdWVzdF0pO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgdGFzay5kYXRhLmVycm9yID0gZXJyb3I7XG4gICAgICAgIGludm9rZVRhc2sodGFzayk7XG4gICAgICAgIGdsb2JhbFN0YXRlLmZldGNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgdmFyIGNsb25lZFJlc3BvbnNlID0gcmVzcG9uc2UuY2xvbmUgPyByZXNwb25zZS5jbG9uZSgpIDoge307XG4gICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgICBzY2hlZHVsZU1pY3JvVGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdGFzay5kYXRhLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgICAgICAgdmFyIGJvZHkgPSBjbG9uZWRSZXNwb25zZS5ib2R5O1xuXG4gICAgICAgICAgaWYgKGJvZHkpIHtcbiAgICAgICAgICAgIHJlYWRTdHJlYW0oYm9keSwgdGFzayk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGludm9rZVRhc2sodGFzayk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICBzY2hlZHVsZU1pY3JvVGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaGFuZGxlUmVzcG9uc2VFcnJvcih0YXNrLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBnbG9iYWxTdGF0ZS5mZXRjaEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNBYm9ydEVycm9yKGVycm9yKSB7XG4gIHJldHVybiBlcnJvciAmJiBlcnJvci5uYW1lID09PSAnQWJvcnRFcnJvcic7XG59IiwiaW1wb3J0IHsgSU5WT0tFLCBISVNUT1JZIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXRjaEhpc3RvcnkoY2FsbGJhY2spIHtcbiAgaWYgKCF3aW5kb3cuaGlzdG9yeSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBuYXRpdmVQdXNoU3RhdGUgPSBoaXN0b3J5LnB1c2hTdGF0ZTtcblxuICBpZiAodHlwZW9mIG5hdGl2ZVB1c2hTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGhpc3RvcnkucHVzaFN0YXRlID0gZnVuY3Rpb24gKHN0YXRlLCB0aXRsZSwgdXJsKSB7XG4gICAgICB2YXIgdGFzayA9IHtcbiAgICAgICAgc291cmNlOiBISVNUT1JZLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgc3RhdGU6IHN0YXRlLFxuICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICB1cmw6IHVybFxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgY2FsbGJhY2soSU5WT0tFLCB0YXNrKTtcbiAgICAgIG5hdGl2ZVB1c2hTdGF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cbn0iLCJpbXBvcnQgeyBwYXRjaFhNTEh0dHBSZXF1ZXN0IH0gZnJvbSAnLi94aHItcGF0Y2gnO1xuaW1wb3J0IHsgcGF0Y2hGZXRjaCB9IGZyb20gJy4vZmV0Y2gtcGF0Y2gnO1xuaW1wb3J0IHsgcGF0Y2hIaXN0b3J5IH0gZnJvbSAnLi9oaXN0b3J5LXBhdGNoJztcbmltcG9ydCBFdmVudEhhbmRsZXIgZnJvbSAnLi4vZXZlbnQtaGFuZGxlcic7XG5pbXBvcnQgeyBISVNUT1JZLCBGRVRDSCwgWE1MSFRUUFJFUVVFU1QgfSBmcm9tICcuLi9jb25zdGFudHMnO1xudmFyIHBhdGNoRXZlbnRIYW5kbGVyID0gbmV3IEV2ZW50SGFuZGxlcigpO1xudmFyIGFscmVhZHlQYXRjaGVkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIHBhdGNoQWxsKCkge1xuICBpZiAoIWFscmVhZHlQYXRjaGVkKSB7XG4gICAgYWxyZWFkeVBhdGNoZWQgPSB0cnVlO1xuICAgIHBhdGNoWE1MSHR0cFJlcXVlc3QoZnVuY3Rpb24gKGV2ZW50LCB0YXNrKSB7XG4gICAgICBwYXRjaEV2ZW50SGFuZGxlci5zZW5kKFhNTEhUVFBSRVFVRVNULCBbZXZlbnQsIHRhc2tdKTtcbiAgICB9KTtcbiAgICBwYXRjaEZldGNoKGZ1bmN0aW9uIChldmVudCwgdGFzaykge1xuICAgICAgcGF0Y2hFdmVudEhhbmRsZXIuc2VuZChGRVRDSCwgW2V2ZW50LCB0YXNrXSk7XG4gICAgfSk7XG4gICAgcGF0Y2hIaXN0b3J5KGZ1bmN0aW9uIChldmVudCwgdGFzaykge1xuICAgICAgcGF0Y2hFdmVudEhhbmRsZXIuc2VuZChISVNUT1JZLCBbZXZlbnQsIHRhc2tdKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBwYXRjaEV2ZW50SGFuZGxlcjtcbn1cblxuZXhwb3J0IHsgcGF0Y2hBbGwsIHBhdGNoRXZlbnRIYW5kbGVyIH07IiwiZXhwb3J0IHZhciBnbG9iYWxTdGF0ZSA9IHtcbiAgZmV0Y2hJblByb2dyZXNzOiBmYWxzZVxufTtcbmV4cG9ydCBmdW5jdGlvbiBhcG1TeW1ib2wobmFtZSkge1xuICByZXR1cm4gJ19fYXBtX3N5bWJvbF9fJyArIG5hbWU7XG59XG5cbmZ1bmN0aW9uIGlzUHJvcGVydHlXcml0YWJsZShwcm9wZXJ0eURlc2MpIHtcbiAgaWYgKCFwcm9wZXJ0eURlc2MpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChwcm9wZXJ0eURlc2Mud3JpdGFibGUgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuICEodHlwZW9mIHByb3BlcnR5RGVzYy5nZXQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHByb3BlcnR5RGVzYy5zZXQgPT09ICd1bmRlZmluZWQnKTtcbn1cblxuZnVuY3Rpb24gYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHBhdGNoZWQsIG9yaWdpbmFsKSB7XG4gIHBhdGNoZWRbYXBtU3ltYm9sKCdPcmlnaW5hbERlbGVnYXRlJyldID0gb3JpZ2luYWw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaE1ldGhvZCh0YXJnZXQsIG5hbWUsIHBhdGNoRm4pIHtcbiAgdmFyIHByb3RvID0gdGFyZ2V0O1xuXG4gIHdoaWxlIChwcm90byAmJiAhcHJvdG8uaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90byk7XG4gIH1cblxuICBpZiAoIXByb3RvICYmIHRhcmdldFtuYW1lXSkge1xuICAgIHByb3RvID0gdGFyZ2V0O1xuICB9XG5cbiAgdmFyIGRlbGVnYXRlTmFtZSA9IGFwbVN5bWJvbChuYW1lKTtcbiAgdmFyIGRlbGVnYXRlO1xuXG4gIGlmIChwcm90byAmJiAhKGRlbGVnYXRlID0gcHJvdG9bZGVsZWdhdGVOYW1lXSkpIHtcbiAgICBkZWxlZ2F0ZSA9IHByb3RvW2RlbGVnYXRlTmFtZV0gPSBwcm90b1tuYW1lXTtcbiAgICB2YXIgZGVzYyA9IHByb3RvICYmIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG8sIG5hbWUpO1xuXG4gICAgaWYgKGlzUHJvcGVydHlXcml0YWJsZShkZXNjKSkge1xuICAgICAgdmFyIHBhdGNoRGVsZWdhdGUgPSBwYXRjaEZuKGRlbGVnYXRlLCBkZWxlZ2F0ZU5hbWUsIG5hbWUpO1xuXG4gICAgICBwcm90b1tuYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHBhdGNoRGVsZWdhdGUodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG5cbiAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tuYW1lXSwgZGVsZWdhdGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkZWxlZ2F0ZTtcbn1cbmV4cG9ydCB2YXIgWEhSX0lHTk9SRSA9IGFwbVN5bWJvbCgneGhySWdub3JlJyk7XG5leHBvcnQgdmFyIFhIUl9TWU5DID0gYXBtU3ltYm9sKCd4aHJTeW5jJyk7XG5leHBvcnQgdmFyIFhIUl9VUkwgPSBhcG1TeW1ib2woJ3hoclVSTCcpO1xuZXhwb3J0IHZhciBYSFJfTUVUSE9EID0gYXBtU3ltYm9sKCd4aHJNZXRob2QnKTsiLCJpbXBvcnQgeyBwYXRjaE1ldGhvZCwgWEhSX1NZTkMsIFhIUl9VUkwsIFhIUl9NRVRIT0QsIFhIUl9JR05PUkUgfSBmcm9tICcuL3BhdGNoLXV0aWxzJztcbmltcG9ydCB7IFNDSEVEVUxFLCBJTlZPS0UsIFhNTEhUVFBSRVFVRVNULCBBRERfRVZFTlRfTElTVEVORVJfU1RSIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFhNTEh0dHBSZXF1ZXN0KGNhbGxiYWNrKSB7XG4gIHZhciBYTUxIdHRwUmVxdWVzdFByb3RvdHlwZSA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZTtcblxuICBpZiAoIVhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlIHx8ICFYTUxIdHRwUmVxdWVzdFByb3RvdHlwZVtBRERfRVZFTlRfTElTVEVORVJfU1RSXSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBSRUFEWV9TVEFURV9DSEFOR0UgPSAncmVhZHlzdGF0ZWNoYW5nZSc7XG4gIHZhciBMT0FEID0gJ2xvYWQnO1xuICB2YXIgRVJST1IgPSAnZXJyb3InO1xuICB2YXIgVElNRU9VVCA9ICd0aW1lb3V0JztcbiAgdmFyIEFCT1JUID0gJ2Fib3J0JztcblxuICBmdW5jdGlvbiBpbnZva2VUYXNrKHRhc2ssIHN0YXR1cykge1xuICAgIGlmICh0YXNrLnN0YXRlICE9PSBJTlZPS0UpIHtcbiAgICAgIHRhc2suc3RhdGUgPSBJTlZPS0U7XG4gICAgICB0YXNrLmRhdGEuc3RhdHVzID0gc3RhdHVzO1xuICAgICAgY2FsbGJhY2soSU5WT0tFLCB0YXNrKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZVRhc2sodGFzaykge1xuICAgIGlmICh0YXNrLnN0YXRlID09PSBTQ0hFRFVMRSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRhc2suc3RhdGUgPSBTQ0hFRFVMRTtcbiAgICBjYWxsYmFjayhTQ0hFRFVMRSwgdGFzayk7XG4gICAgdmFyIHRhcmdldCA9IHRhc2suZGF0YS50YXJnZXQ7XG5cbiAgICBmdW5jdGlvbiBhZGRMaXN0ZW5lcihuYW1lKSB7XG4gICAgICB0YXJnZXRbQUREX0VWRU5UX0xJU1RFTkVSX1NUUl0obmFtZSwgZnVuY3Rpb24gKF9yZWYpIHtcbiAgICAgICAgdmFyIHR5cGUgPSBfcmVmLnR5cGU7XG5cbiAgICAgICAgaWYgKHR5cGUgPT09IFJFQURZX1NUQVRFX0NIQU5HRSkge1xuICAgICAgICAgIGlmICh0YXJnZXQucmVhZHlTdGF0ZSA9PT0gNCAmJiB0YXJnZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgICBpbnZva2VUYXNrKHRhc2ssICdzdWNjZXNzJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBzdGF0dXMgPSB0eXBlID09PSBMT0FEID8gJ3N1Y2Nlc3MnIDogdHlwZTtcbiAgICAgICAgICBpbnZva2VUYXNrKHRhc2ssIHN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGFkZExpc3RlbmVyKFJFQURZX1NUQVRFX0NIQU5HRSk7XG4gICAgYWRkTGlzdGVuZXIoTE9BRCk7XG4gICAgYWRkTGlzdGVuZXIoVElNRU9VVCk7XG4gICAgYWRkTGlzdGVuZXIoRVJST1IpO1xuICAgIGFkZExpc3RlbmVyKEFCT1JUKTtcbiAgfVxuXG4gIHZhciBvcGVuTmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdvcGVuJywgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuICAgICAgaWYgKCFzZWxmW1hIUl9JR05PUkVdKSB7XG4gICAgICAgIHNlbGZbWEhSX01FVEhPRF0gPSBhcmdzWzBdO1xuICAgICAgICBzZWxmW1hIUl9VUkxdID0gYXJnc1sxXTtcbiAgICAgICAgc2VsZltYSFJfU1lOQ10gPSBhcmdzWzJdID09PSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG9wZW5OYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgfTtcbiAgfSk7XG4gIHZhciBzZW5kTmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdzZW5kJywgZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykge1xuICAgICAgaWYgKHNlbGZbWEhSX0lHTk9SRV0pIHtcbiAgICAgICAgcmV0dXJuIHNlbmROYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7XG4gICAgICB9XG5cbiAgICAgIHZhciB0YXNrID0ge1xuICAgICAgICBzb3VyY2U6IFhNTEhUVFBSRVFVRVNULFxuICAgICAgICBzdGF0ZTogJycsXG4gICAgICAgIHR5cGU6ICdtYWNyb1Rhc2snLFxuICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgdGFyZ2V0OiBzZWxmLFxuICAgICAgICAgIG1ldGhvZDogc2VsZltYSFJfTUVUSE9EXSxcbiAgICAgICAgICBzeW5jOiBzZWxmW1hIUl9TWU5DXSxcbiAgICAgICAgICB1cmw6IHNlbGZbWEhSX1VSTF0sXG4gICAgICAgICAgc3RhdHVzOiAnJ1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0cnkge1xuICAgICAgICBzY2hlZHVsZVRhc2sodGFzayk7XG4gICAgICAgIHJldHVybiBzZW5kTmF0aXZlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpbnZva2VUYXNrKHRhc2ssIEVSUk9SKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9O1xuICB9KTtcbn0iLCJpbXBvcnQgUHJvbWlzZVBvbGx5ZmlsbCBmcm9tICdwcm9taXNlLXBvbHlmaWxsJztcbmltcG9ydCB7IGlzQnJvd3NlciB9IGZyb20gJy4vdXRpbHMnO1xudmFyIGxvY2FsID0ge307XG5cbmlmIChpc0Jyb3dzZXIpIHtcbiAgbG9jYWwgPSB3aW5kb3c7XG59IGVsc2UgaWYgKHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJykge1xuICBsb2NhbCA9IHNlbGY7XG59XG5cbnZhciBQcm9taXNlID0gJ1Byb21pc2UnIGluIGxvY2FsID8gbG9jYWwuUHJvbWlzZSA6IFByb21pc2VQb2xseWZpbGw7XG5leHBvcnQgeyBQcm9taXNlIH07IiwidmFyIFF1ZXVlID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBRdWV1ZShvbkZsdXNoLCBvcHRzKSB7XG4gICAgaWYgKG9wdHMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0cyA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMub25GbHVzaCA9IG9uRmx1c2g7XG4gICAgdGhpcy5pdGVtcyA9IFtdO1xuICAgIHRoaXMucXVldWVMaW1pdCA9IG9wdHMucXVldWVMaW1pdCB8fCAtMTtcbiAgICB0aGlzLmZsdXNoSW50ZXJ2YWwgPSBvcHRzLmZsdXNoSW50ZXJ2YWwgfHwgMDtcbiAgICB0aGlzLnRpbWVvdXRJZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBRdWV1ZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9zZXRUaW1lciA9IGZ1bmN0aW9uIF9zZXRUaW1lcigpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy50aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5mbHVzaCgpO1xuICAgIH0sIHRoaXMuZmx1c2hJbnRlcnZhbCk7XG4gIH07XG5cbiAgX3Byb3RvLl9jbGVhciA9IGZ1bmN0aW9uIF9jbGVhcigpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMudGltZW91dElkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKTtcbiAgICAgIHRoaXMudGltZW91dElkID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgfTtcblxuICBfcHJvdG8uZmx1c2ggPSBmdW5jdGlvbiBmbHVzaCgpIHtcbiAgICB0aGlzLm9uRmx1c2godGhpcy5pdGVtcyk7XG5cbiAgICB0aGlzLl9jbGVhcigpO1xuICB9O1xuXG4gIF9wcm90by5hZGQgPSBmdW5jdGlvbiBhZGQoaXRlbSkge1xuICAgIHRoaXMuaXRlbXMucHVzaChpdGVtKTtcblxuICAgIGlmICh0aGlzLnF1ZXVlTGltaXQgIT09IC0xICYmIHRoaXMuaXRlbXMubGVuZ3RoID49IHRoaXMucXVldWVMaW1pdCkge1xuICAgICAgdGhpcy5mbHVzaCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMudGltZW91dElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aGlzLl9zZXRUaW1lcigpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUXVldWU7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFF1ZXVlOyIsInZhciBfc2VydmljZUNyZWF0b3JzO1xuXG5pbXBvcnQgQXBtU2VydmVyIGZyb20gJy4vYXBtLXNlcnZlcic7XG5pbXBvcnQgQ29uZmlnU2VydmljZSBmcm9tICcuL2NvbmZpZy1zZXJ2aWNlJztcbmltcG9ydCBMb2dnaW5nU2VydmljZSBmcm9tICcuL2xvZ2dpbmctc2VydmljZSc7XG5pbXBvcnQgeyBDT05GSUdfQ0hBTkdFLCBDT05GSUdfU0VSVklDRSwgTE9HR0lOR19TRVJWSUNFLCBBUE1fU0VSVkVSIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgX19ERVZfXyB9IGZyb20gJy4uL3N0YXRlJztcbnZhciBzZXJ2aWNlQ3JlYXRvcnMgPSAoX3NlcnZpY2VDcmVhdG9ycyA9IHt9LCBfc2VydmljZUNyZWF0b3JzW0NPTkZJR19TRVJWSUNFXSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIG5ldyBDb25maWdTZXJ2aWNlKCk7XG59LCBfc2VydmljZUNyZWF0b3JzW0xPR0dJTkdfU0VSVklDRV0gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgTG9nZ2luZ1NlcnZpY2Uoe1xuICAgIHByZWZpeDogJ1tFbGFzdGljIEFQTV0gJ1xuICB9KTtcbn0sIF9zZXJ2aWNlQ3JlYXRvcnNbQVBNX1NFUlZFUl0gPSBmdW5jdGlvbiAoZmFjdG9yeSkge1xuICB2YXIgX2ZhY3RvcnkkZ2V0U2VydmljZSA9IGZhY3RvcnkuZ2V0U2VydmljZShbQ09ORklHX1NFUlZJQ0UsIExPR0dJTkdfU0VSVklDRV0pLFxuICAgICAgY29uZmlnU2VydmljZSA9IF9mYWN0b3J5JGdldFNlcnZpY2VbMF0sXG4gICAgICBsb2dnaW5nU2VydmljZSA9IF9mYWN0b3J5JGdldFNlcnZpY2VbMV07XG5cbiAgcmV0dXJuIG5ldyBBcG1TZXJ2ZXIoY29uZmlnU2VydmljZSwgbG9nZ2luZ1NlcnZpY2UpO1xufSwgX3NlcnZpY2VDcmVhdG9ycyk7XG5cbnZhciBTZXJ2aWNlRmFjdG9yeSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gU2VydmljZUZhY3RvcnkoKSB7XG4gICAgdGhpcy5pbnN0YW5jZXMgPSB7fTtcbiAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gU2VydmljZUZhY3RvcnkucHJvdG90eXBlO1xuXG4gIF9wcm90by5pbml0ID0gZnVuY3Rpb24gaW5pdCgpIHtcbiAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgIHZhciBjb25maWdTZXJ2aWNlID0gdGhpcy5nZXRTZXJ2aWNlKENPTkZJR19TRVJWSUNFKTtcbiAgICBjb25maWdTZXJ2aWNlLmluaXQoKTtcblxuICAgIHZhciBfdGhpcyRnZXRTZXJ2aWNlID0gdGhpcy5nZXRTZXJ2aWNlKFtMT0dHSU5HX1NFUlZJQ0UsIEFQTV9TRVJWRVJdKSxcbiAgICAgICAgbG9nZ2luZ1NlcnZpY2UgPSBfdGhpcyRnZXRTZXJ2aWNlWzBdLFxuICAgICAgICBhcG1TZXJ2ZXIgPSBfdGhpcyRnZXRTZXJ2aWNlWzFdO1xuXG4gICAgY29uZmlnU2VydmljZS5ldmVudHMub2JzZXJ2ZShDT05GSUdfQ0hBTkdFLCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbG9nTGV2ZWwgPSBjb25maWdTZXJ2aWNlLmdldCgnbG9nTGV2ZWwnKTtcbiAgICAgIGxvZ2dpbmdTZXJ2aWNlLnNldExldmVsKGxvZ0xldmVsKTtcbiAgICB9KTtcbiAgICBhcG1TZXJ2ZXIuaW5pdCgpO1xuICB9O1xuXG4gIF9wcm90by5nZXRTZXJ2aWNlID0gZnVuY3Rpb24gZ2V0U2VydmljZShuYW1lKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGlmICghdGhpcy5pbnN0YW5jZXNbbmFtZV0pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzZXJ2aWNlQ3JlYXRvcnNbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aGlzLmluc3RhbmNlc1tuYW1lXSA9IHNlcnZpY2VDcmVhdG9yc1tuYW1lXSh0aGlzKTtcbiAgICAgICAgfSBlbHNlIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0Nhbm5vdCBnZXQgc2VydmljZSwgTm8gY3JlYXRvciBmb3I6ICcgKyBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZXNbbmFtZV07XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG5hbWUpKSB7XG4gICAgICByZXR1cm4gbmFtZS5tYXAoZnVuY3Rpb24gKG4pIHtcbiAgICAgICAgcmV0dXJuIF90aGlzLmdldFNlcnZpY2Uobik7XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFNlcnZpY2VGYWN0b3J5O1xufSgpO1xuXG5leHBvcnQgeyBzZXJ2aWNlQ3JlYXRvcnMsIFNlcnZpY2VGYWN0b3J5IH07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gdGhyb3R0bGUoZm4sIG9uVGhyb3R0bGUsIG9wdHMpIHtcbiAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICB2YXIgbGltaXQgPSBvcHRzLmxpbWl0O1xuICB2YXIgaW50ZXJ2YWwgPSBvcHRzLmludGVydmFsO1xuICB2YXIgY291bnRlciA9IDA7XG4gIHZhciB0aW1lb3V0SWQ7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgY291bnRlcisrO1xuXG4gICAgaWYgKHR5cGVvZiB0aW1lb3V0SWQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY291bnRlciA9IDA7XG4gICAgICAgIHRpbWVvdXRJZCA9IHVuZGVmaW5lZDtcbiAgICAgIH0sIGludGVydmFsKTtcbiAgICB9XG5cbiAgICBpZiAoY291bnRlciA+IGxpbWl0ICYmIHR5cGVvZiBvblRocm90dGxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gb25UaHJvdHRsZS5hcHBseShjb250ZXh0LCBhcmd1bWVudHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZm4uYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICB9XG4gIH07XG59IiwiaW1wb3J0IHsgS0VZV09SRF9MSU1JVCB9IGZyb20gJy4vY29uc3RhbnRzJztcbnZhciBNRVRBREFUQV9NT0RFTCA9IHtcbiAgc2VydmljZToge1xuICAgIG5hbWU6IFtLRVlXT1JEX0xJTUlULCB0cnVlXSxcbiAgICB2ZXJzaW9uOiB0cnVlLFxuICAgIGFnZW50OiB7XG4gICAgICB2ZXJzaW9uOiBbS0VZV09SRF9MSU1JVCwgdHJ1ZV1cbiAgICB9LFxuICAgIGVudmlyb25tZW50OiB0cnVlXG4gIH0sXG4gIGxhYmVsczoge1xuICAgICcqJzogdHJ1ZVxuICB9XG59O1xudmFyIFJFU1BPTlNFX01PREVMID0ge1xuICAnKic6IHRydWUsXG4gIGhlYWRlcnM6IHtcbiAgICAnKic6IHRydWVcbiAgfVxufTtcbnZhciBERVNUSU5BVElPTl9NT0RFTCA9IHtcbiAgYWRkcmVzczogW0tFWVdPUkRfTElNSVRdLFxuICBzZXJ2aWNlOiB7XG4gICAgJyonOiBbS0VZV09SRF9MSU1JVCwgdHJ1ZV1cbiAgfVxufTtcbnZhciBDT05URVhUX01PREVMID0ge1xuICB1c2VyOiB7XG4gICAgaWQ6IHRydWUsXG4gICAgZW1haWw6IHRydWUsXG4gICAgdXNlcm5hbWU6IHRydWVcbiAgfSxcbiAgdGFnczoge1xuICAgICcqJzogdHJ1ZVxuICB9LFxuICBodHRwOiB7XG4gICAgcmVzcG9uc2U6IFJFU1BPTlNFX01PREVMXG4gIH0sXG4gIGRlc3RpbmF0aW9uOiBERVNUSU5BVElPTl9NT0RFTCxcbiAgcmVzcG9uc2U6IFJFU1BPTlNFX01PREVMXG59O1xudmFyIFNQQU5fTU9ERUwgPSB7XG4gIG5hbWU6IFtLRVlXT1JEX0xJTUlULCB0cnVlXSxcbiAgdHlwZTogW0tFWVdPUkRfTElNSVQsIHRydWVdLFxuICBpZDogW0tFWVdPUkRfTElNSVQsIHRydWVdLFxuICB0cmFjZV9pZDogW0tFWVdPUkRfTElNSVQsIHRydWVdLFxuICBwYXJlbnRfaWQ6IFtLRVlXT1JEX0xJTUlULCB0cnVlXSxcbiAgdHJhbnNhY3Rpb25faWQ6IFtLRVlXT1JEX0xJTUlULCB0cnVlXSxcbiAgc3VidHlwZTogdHJ1ZSxcbiAgYWN0aW9uOiB0cnVlLFxuICBjb250ZXh0OiBDT05URVhUX01PREVMXG59O1xudmFyIFRSQU5TQUNUSU9OX01PREVMID0ge1xuICBuYW1lOiB0cnVlLFxuICBwYXJlbnRfaWQ6IHRydWUsXG4gIHR5cGU6IFtLRVlXT1JEX0xJTUlULCB0cnVlXSxcbiAgaWQ6IFtLRVlXT1JEX0xJTUlULCB0cnVlXSxcbiAgdHJhY2VfaWQ6IFtLRVlXT1JEX0xJTUlULCB0cnVlXSxcbiAgc3Bhbl9jb3VudDoge1xuICAgIHN0YXJ0ZWQ6IFtLRVlXT1JEX0xJTUlULCB0cnVlXVxuICB9LFxuICBjb250ZXh0OiBDT05URVhUX01PREVMXG59O1xudmFyIEVSUk9SX01PREVMID0ge1xuICBpZDogW0tFWVdPUkRfTElNSVQsIHRydWVdLFxuICB0cmFjZV9pZDogdHJ1ZSxcbiAgdHJhbnNhY3Rpb25faWQ6IHRydWUsXG4gIHBhcmVudF9pZDogdHJ1ZSxcbiAgY3VscHJpdDogdHJ1ZSxcbiAgZXhjZXB0aW9uOiB7XG4gICAgdHlwZTogdHJ1ZVxuICB9LFxuICB0cmFuc2FjdGlvbjoge1xuICAgIHR5cGU6IHRydWVcbiAgfSxcbiAgY29udGV4dDogQ09OVEVYVF9NT0RFTFxufTtcblxuZnVuY3Rpb24gdHJ1bmNhdGUodmFsdWUsIGxpbWl0LCByZXF1aXJlZCwgcGxhY2Vob2xkZXIpIHtcbiAgaWYgKGxpbWl0ID09PSB2b2lkIDApIHtcbiAgICBsaW1pdCA9IEtFWVdPUkRfTElNSVQ7XG4gIH1cblxuICBpZiAocmVxdWlyZWQgPT09IHZvaWQgMCkge1xuICAgIHJlcXVpcmVkID0gZmFsc2U7XG4gIH1cblxuICBpZiAocGxhY2Vob2xkZXIgPT09IHZvaWQgMCkge1xuICAgIHBsYWNlaG9sZGVyID0gJ04vQSc7XG4gIH1cblxuICBpZiAocmVxdWlyZWQgJiYgaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICB2YWx1ZSA9IHBsYWNlaG9sZGVyO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdmFsdWUuc3Vic3RyaW5nKDAsIGxpbWl0KTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVZhbHVlKHRhcmdldCwga2V5LCBjdXJyTW9kZWwpIHtcbiAgdmFyIHZhbHVlID0gdHJ1bmNhdGUodGFyZ2V0W2tleV0sIGN1cnJNb2RlbFswXSwgY3Vyck1vZGVsWzFdKTtcblxuICBpZiAoaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICBkZWxldGUgdGFyZ2V0W2tleV07XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGFyZ2V0W2tleV0gPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdHJ1bmNhdGVNb2RlbChtb2RlbCwgdGFyZ2V0LCBjaGlsZFRhcmdldCkge1xuICBpZiAobW9kZWwgPT09IHZvaWQgMCkge1xuICAgIG1vZGVsID0ge307XG4gIH1cblxuICBpZiAoY2hpbGRUYXJnZXQgPT09IHZvaWQgMCkge1xuICAgIGNoaWxkVGFyZ2V0ID0gdGFyZ2V0O1xuICB9XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhtb2RlbCk7XG4gIHZhciBlbXB0eUFyciA9IFtdO1xuXG4gIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKGkpIHtcbiAgICB2YXIgY3VycktleSA9IGtleXNbaV07XG4gICAgdmFyIGN1cnJNb2RlbCA9IG1vZGVsW2N1cnJLZXldID09PSB0cnVlID8gZW1wdHlBcnIgOiBtb2RlbFtjdXJyS2V5XTtcblxuICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyTW9kZWwpKSB7XG4gICAgICB0cnVuY2F0ZU1vZGVsKGN1cnJNb2RlbCwgdGFyZ2V0LCBjaGlsZFRhcmdldFtjdXJyS2V5XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChjdXJyS2V5ID09PSAnKicpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoY2hpbGRUYXJnZXQpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICAgIHJldHVybiByZXBsYWNlVmFsdWUoY2hpbGRUYXJnZXQsIGtleSwgY3Vyck1vZGVsKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXBsYWNlVmFsdWUoY2hpbGRUYXJnZXQsIGN1cnJLZXksIGN1cnJNb2RlbCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIF9sb29wKGkpO1xuICB9XG5cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZXhwb3J0IHsgdHJ1bmNhdGUsIHRydW5jYXRlTW9kZWwsIFNQQU5fTU9ERUwsIFRSQU5TQUNUSU9OX01PREVMLCBFUlJPUl9NT0RFTCwgTUVUQURBVEFfTU9ERUwsIFJFU1BPTlNFX01PREVMIH07IiwiaW1wb3J0IHsgaXNCcm93c2VyIH0gZnJvbSAnLi91dGlscyc7XG5cbmZ1bmN0aW9uIGlzRGVmYXVsdFBvcnQocG9ydCwgcHJvdG9jb2wpIHtcbiAgc3dpdGNoIChwcm90b2NvbCkge1xuICAgIGNhc2UgJ2h0dHA6JzpcbiAgICAgIHJldHVybiBwb3J0ID09PSAnODAnO1xuXG4gICAgY2FzZSAnaHR0cHM6JzpcbiAgICAgIHJldHVybiBwb3J0ID09PSAnNDQzJztcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG52YXIgUlVMRVMgPSBbWycjJywgJ2hhc2gnXSwgWyc/JywgJ3F1ZXJ5J10sIFsnLycsICdwYXRoJ10sIFsnQCcsICdhdXRoJywgMV0sIFtOYU4sICdob3N0JywgdW5kZWZpbmVkLCAxXV07XG52YXIgUFJPVE9DT0xfUkVHRVggPSAvXihbYS16XVthLXowLTkuKy1dKjopPyhcXC9cXC8pPyhbXFxTXFxzXSopL2k7XG5leHBvcnQgdmFyIFVybCA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gVXJsKHVybCkge1xuICAgIHZhciBfdGhpcyRleHRyYWN0UHJvdG9jb2wgPSB0aGlzLmV4dHJhY3RQcm90b2NvbCh1cmwgfHwgJycpLFxuICAgICAgICBwcm90b2NvbCA9IF90aGlzJGV4dHJhY3RQcm90b2NvbC5wcm90b2NvbCxcbiAgICAgICAgYWRkcmVzcyA9IF90aGlzJGV4dHJhY3RQcm90b2NvbC5hZGRyZXNzLFxuICAgICAgICBzbGFzaGVzID0gX3RoaXMkZXh0cmFjdFByb3RvY29sLnNsYXNoZXM7XG5cbiAgICB2YXIgcmVsYXRpdmUgPSAhcHJvdG9jb2wgJiYgIXNsYXNoZXM7XG4gICAgdmFyIGxvY2F0aW9uID0gdGhpcy5nZXRMb2NhdGlvbigpO1xuICAgIHZhciBpbnN0cnVjdGlvbnMgPSBSVUxFUy5zbGljZSgpO1xuICAgIGFkZHJlc3MgPSBhZGRyZXNzLnJlcGxhY2UoJ1xcXFwnLCAnLycpO1xuXG4gICAgaWYgKCFzbGFzaGVzKSB7XG4gICAgICBpbnN0cnVjdGlvbnNbMl0gPSBbTmFOLCAncGF0aCddO1xuICAgIH1cblxuICAgIHZhciBpbmRleDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5zdHJ1Y3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbnNbaV07XG4gICAgICB2YXIgcGFyc2UgPSBpbnN0cnVjdGlvblswXTtcbiAgICAgIHZhciBrZXkgPSBpbnN0cnVjdGlvblsxXTtcblxuICAgICAgaWYgKHR5cGVvZiBwYXJzZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgaW5kZXggPSBhZGRyZXNzLmluZGV4T2YocGFyc2UpO1xuXG4gICAgICAgIGlmICh+aW5kZXgpIHtcbiAgICAgICAgICB2YXIgaW5zdExlbmd0aCA9IGluc3RydWN0aW9uWzJdO1xuXG4gICAgICAgICAgaWYgKGluc3RMZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBuZXdJbmRleCA9IGFkZHJlc3MubGFzdEluZGV4T2YocGFyc2UpO1xuICAgICAgICAgICAgaW5kZXggPSBNYXRoLm1heChpbmRleCwgbmV3SW5kZXgpO1xuICAgICAgICAgICAgdGhpc1trZXldID0gYWRkcmVzcy5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5zbGljZShpbmRleCArIGluc3RMZW5ndGgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzW2tleV0gPSBhZGRyZXNzLnNsaWNlKGluZGV4KTtcbiAgICAgICAgICAgIGFkZHJlc3MgPSBhZGRyZXNzLnNsaWNlKDAsIGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXNba2V5XSA9IGFkZHJlc3M7XG4gICAgICAgIGFkZHJlc3MgPSAnJztcbiAgICAgIH1cblxuICAgICAgdGhpc1trZXldID0gdGhpc1trZXldIHx8IChyZWxhdGl2ZSAmJiBpbnN0cnVjdGlvblszXSA/IGxvY2F0aW9uW2tleV0gfHwgJycgOiAnJyk7XG4gICAgICBpZiAoaW5zdHJ1Y3Rpb25bM10pIHRoaXNba2V5XSA9IHRoaXNba2V5XS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cblxuICAgIGlmIChyZWxhdGl2ZSAmJiB0aGlzLnBhdGguY2hhckF0KDApICE9PSAnLycpIHtcbiAgICAgIHRoaXMucGF0aCA9ICcvJyArIHRoaXMucGF0aDtcbiAgICB9XG5cbiAgICB0aGlzLnJlbGF0aXZlID0gcmVsYXRpdmU7XG4gICAgdGhpcy5wcm90b2NvbCA9IHByb3RvY29sIHx8IGxvY2F0aW9uLnByb3RvY29sO1xuICAgIHRoaXMuaG9zdG5hbWUgPSB0aGlzLmhvc3Q7XG4gICAgdGhpcy5wb3J0ID0gJyc7XG5cbiAgICBpZiAoLzpcXGQrJC8udGVzdCh0aGlzLmhvc3QpKSB7XG4gICAgICB2YXIgdmFsdWUgPSB0aGlzLmhvc3Quc3BsaXQoJzonKTtcbiAgICAgIHZhciBwb3J0ID0gdmFsdWUucG9wKCk7XG4gICAgICB2YXIgaG9zdG5hbWUgPSB2YWx1ZS5qb2luKCc6Jyk7XG5cbiAgICAgIGlmIChpc0RlZmF1bHRQb3J0KHBvcnQsIHRoaXMucHJvdG9jb2wpKSB7XG4gICAgICAgIHRoaXMuaG9zdCA9IGhvc3RuYW1lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5ob3N0bmFtZSA9IGhvc3RuYW1lO1xuICAgIH1cblxuICAgIHRoaXMub3JpZ2luID0gdGhpcy5wcm90b2NvbCAmJiB0aGlzLmhvc3QgJiYgdGhpcy5wcm90b2NvbCAhPT0gJ2ZpbGU6JyA/IHRoaXMucHJvdG9jb2wgKyAnLy8nICsgdGhpcy5ob3N0IDogJ251bGwnO1xuICAgIHRoaXMuaHJlZiA9IHRoaXMudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBVcmwucHJvdG90eXBlO1xuXG4gIF9wcm90by50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnByb3RvY29sO1xuICAgIHJlc3VsdCArPSAnLy8nO1xuXG4gICAgaWYgKHRoaXMuYXV0aCkge1xuICAgICAgdmFyIFJFREFDVEVEID0gJ1tSRURBQ1RFRF0nO1xuICAgICAgdmFyIHVzZXJwYXNzID0gdGhpcy5hdXRoLnNwbGl0KCc6Jyk7XG4gICAgICB2YXIgdXNlcm5hbWUgPSB1c2VycGFzc1swXSA/IFJFREFDVEVEIDogJyc7XG4gICAgICB2YXIgcGFzc3dvcmQgPSB1c2VycGFzc1sxXSA/ICc6JyArIFJFREFDVEVEIDogJyc7XG4gICAgICByZXN1bHQgKz0gdXNlcm5hbWUgKyBwYXNzd29yZCArICdAJztcbiAgICB9XG5cbiAgICByZXN1bHQgKz0gdGhpcy5ob3N0O1xuICAgIHJlc3VsdCArPSB0aGlzLnBhdGg7XG4gICAgcmVzdWx0ICs9IHRoaXMucXVlcnk7XG4gICAgcmVzdWx0ICs9IHRoaXMuaGFzaDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIF9wcm90by5nZXRMb2NhdGlvbiA9IGZ1bmN0aW9uIGdldExvY2F0aW9uKCkge1xuICAgIHZhciBnbG9iYWxWYXIgPSB7fTtcblxuICAgIGlmIChpc0Jyb3dzZXIpIHtcbiAgICAgIGdsb2JhbFZhciA9IHdpbmRvdztcbiAgICB9XG5cbiAgICByZXR1cm4gZ2xvYmFsVmFyLmxvY2F0aW9uO1xuICB9O1xuXG4gIF9wcm90by5leHRyYWN0UHJvdG9jb2wgPSBmdW5jdGlvbiBleHRyYWN0UHJvdG9jb2wodXJsKSB7XG4gICAgdmFyIG1hdGNoID0gUFJPVE9DT0xfUkVHRVguZXhlYyh1cmwpO1xuICAgIHJldHVybiB7XG4gICAgICBwcm90b2NvbDogbWF0Y2hbMV0gPyBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpIDogJycsXG4gICAgICBzbGFzaGVzOiAhIW1hdGNoWzJdLFxuICAgICAgYWRkcmVzczogbWF0Y2hbM11cbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBVcmw7XG59KCk7XG5leHBvcnQgZnVuY3Rpb24gc2x1Z2lmeVVybCh1cmxTdHIsIGRlcHRoKSB7XG4gIGlmIChkZXB0aCA9PT0gdm9pZCAwKSB7XG4gICAgZGVwdGggPSAyO1xuICB9XG5cbiAgdmFyIHBhcnNlZFVybCA9IG5ldyBVcmwodXJsU3RyKTtcbiAgdmFyIHF1ZXJ5ID0gcGFyc2VkVXJsLnF1ZXJ5LFxuICAgICAgcGF0aCA9IHBhcnNlZFVybC5wYXRoO1xuICB2YXIgcGF0aFBhcnRzID0gcGF0aC5zdWJzdHJpbmcoMSkuc3BsaXQoJy8nKTtcbiAgdmFyIHJlZGFjdFN0cmluZyA9ICc6aWQnO1xuICB2YXIgd2lsZGNhcmQgPSAnKic7XG4gIHZhciBzcGVjaWFsQ2hhcnNSZWdleCA9IC9cXFd8Xy9nO1xuICB2YXIgZGlnaXRzUmVnZXggPSAvWzAtOV0vZztcbiAgdmFyIGxvd2VyQ2FzZVJlZ2V4ID0gL1thLXpdL2c7XG4gIHZhciB1cHBlckNhc2VSZWdleCA9IC9bQS1aXS9nO1xuICB2YXIgcmVkYWN0ZWRQYXJ0cyA9IFtdO1xuICB2YXIgcmVkYWN0ZWRCZWZvcmUgPSBmYWxzZTtcblxuICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgcGF0aFBhcnRzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgIHZhciBwYXJ0ID0gcGF0aFBhcnRzW2luZGV4XTtcblxuICAgIGlmIChyZWRhY3RlZEJlZm9yZSB8fCBpbmRleCA+IGRlcHRoIC0gMSkge1xuICAgICAgaWYgKHBhcnQpIHtcbiAgICAgICAgcmVkYWN0ZWRQYXJ0cy5wdXNoKHdpbGRjYXJkKTtcbiAgICAgIH1cblxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgdmFyIG51bWJlck9mU3BlY2lhbENoYXJzID0gKHBhcnQubWF0Y2goc3BlY2lhbENoYXJzUmVnZXgpIHx8IFtdKS5sZW5ndGg7XG5cbiAgICBpZiAobnVtYmVyT2ZTcGVjaWFsQ2hhcnMgPj0gMikge1xuICAgICAgcmVkYWN0ZWRQYXJ0cy5wdXNoKHJlZGFjdFN0cmluZyk7XG4gICAgICByZWRhY3RlZEJlZm9yZSA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbnVtYmVyT2ZEaWdpdHMgPSAocGFydC5tYXRjaChkaWdpdHNSZWdleCkgfHwgW10pLmxlbmd0aDtcblxuICAgIGlmIChudW1iZXJPZkRpZ2l0cyA+IDMgfHwgcGFydC5sZW5ndGggPiAzICYmIG51bWJlck9mRGlnaXRzIC8gcGFydC5sZW5ndGggPj0gMC4zKSB7XG4gICAgICByZWRhY3RlZFBhcnRzLnB1c2gocmVkYWN0U3RyaW5nKTtcbiAgICAgIHJlZGFjdGVkQmVmb3JlID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBudW1iZXJvZlVwcGVyQ2FzZSA9IChwYXJ0Lm1hdGNoKHVwcGVyQ2FzZVJlZ2V4KSB8fCBbXSkubGVuZ3RoO1xuICAgIHZhciBudW1iZXJvZkxvd2VyQ2FzZSA9IChwYXJ0Lm1hdGNoKGxvd2VyQ2FzZVJlZ2V4KSB8fCBbXSkubGVuZ3RoO1xuICAgIHZhciBsb3dlckNhc2VSYXRlID0gbnVtYmVyb2ZMb3dlckNhc2UgLyBwYXJ0Lmxlbmd0aDtcbiAgICB2YXIgdXBwZXJDYXNlUmF0ZSA9IG51bWJlcm9mVXBwZXJDYXNlIC8gcGFydC5sZW5ndGg7XG5cbiAgICBpZiAocGFydC5sZW5ndGggPiA1ICYmICh1cHBlckNhc2VSYXRlID4gMC4zICYmIHVwcGVyQ2FzZVJhdGUgPCAwLjYgfHwgbG93ZXJDYXNlUmF0ZSA+IDAuMyAmJiBsb3dlckNhc2VSYXRlIDwgMC42KSkge1xuICAgICAgcmVkYWN0ZWRQYXJ0cy5wdXNoKHJlZGFjdFN0cmluZyk7XG4gICAgICByZWRhY3RlZEJlZm9yZSA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBwYXJ0ICYmIHJlZGFjdGVkUGFydHMucHVzaChwYXJ0KTtcbiAgfVxuXG4gIHZhciByZWRhY3RlZCA9ICcvJyArIChyZWRhY3RlZFBhcnRzLmxlbmd0aCA+PSAyID8gcmVkYWN0ZWRQYXJ0cy5qb2luKCcvJykgOiByZWRhY3RlZFBhcnRzLmpvaW4oJycpKSArIChxdWVyeSA/ICc/e3F1ZXJ5fScgOiAnJyk7XG4gIHJldHVybiByZWRhY3RlZDtcbn0iLCJpbXBvcnQgeyBQcm9taXNlIH0gZnJvbSAnLi9wb2x5ZmlsbHMnO1xudmFyIHNsaWNlID0gW10uc2xpY2U7XG52YXIgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7XG52YXIgUEVSRiA9IGlzQnJvd3NlciAmJiB0eXBlb2YgcGVyZm9ybWFuY2UgIT09ICd1bmRlZmluZWQnID8gcGVyZm9ybWFuY2UgOiB7fTtcblxuZnVuY3Rpb24gaXNDT1JTU3VwcG9ydGVkKCkge1xuICB2YXIgeGhyID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuICByZXR1cm4gJ3dpdGhDcmVkZW50aWFscycgaW4geGhyO1xufVxuXG52YXIgYnl0ZVRvSGV4ID0gW107XG5cbmZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyArK2kpIHtcbiAgYnl0ZVRvSGV4W2ldID0gKGkgKyAweDEwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigxKTtcbn1cblxuZnVuY3Rpb24gYnl0ZXNUb0hleChidWZmZXIpIHtcbiAgdmFyIGhleE9jdGV0cyA9IFtdO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBidWZmZXIubGVuZ3RoOyBfaSsrKSB7XG4gICAgaGV4T2N0ZXRzLnB1c2goYnl0ZVRvSGV4W2J1ZmZlcltfaV1dKTtcbiAgfVxuXG4gIHJldHVybiBoZXhPY3RldHMuam9pbignJyk7XG59XG5cbnZhciBkZXN0aW5hdGlvbiA9IG5ldyBVaW50OEFycmF5KDE2KTtcblxuZnVuY3Rpb24gcm5nKCkge1xuICBpZiAodHlwZW9mIGNyeXB0byAhPSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoZGVzdGluYXRpb24pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBtc0NyeXB0byAhPSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGRlc3RpbmF0aW9uKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0aW5hdGlvbjtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVSYW5kb21JZChsZW5ndGgpIHtcbiAgdmFyIGlkID0gYnl0ZXNUb0hleChybmcoKSk7XG4gIHJldHVybiBpZC5zdWJzdHIoMCwgbGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24gZ2V0RHRIZWFkZXJWYWx1ZShzcGFuKSB7XG4gIHZhciBkdFZlcnNpb24gPSAnMDAnO1xuICB2YXIgZHRVblNhbXBsZWRGbGFncyA9ICcwMCc7XG4gIHZhciBkdFNhbXBsZWRGbGFncyA9ICcwMSc7XG5cbiAgaWYgKHNwYW4gJiYgc3Bhbi50cmFjZUlkICYmIHNwYW4uaWQgJiYgc3Bhbi5wYXJlbnRJZCkge1xuICAgIHZhciBmbGFncyA9IHNwYW4uc2FtcGxlZCA/IGR0U2FtcGxlZEZsYWdzIDogZHRVblNhbXBsZWRGbGFncztcbiAgICB2YXIgaWQgPSBzcGFuLnNhbXBsZWQgPyBzcGFuLmlkIDogc3Bhbi5wYXJlbnRJZDtcbiAgICByZXR1cm4gZHRWZXJzaW9uICsgJy0nICsgc3Bhbi50cmFjZUlkICsgJy0nICsgaWQgKyAnLScgKyBmbGFncztcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZUR0SGVhZGVyVmFsdWUodmFsdWUpIHtcbiAgdmFyIHBhcnNlZCA9IC9eKFtcXGRhLWZdezJ9KS0oW1xcZGEtZl17MzJ9KS0oW1xcZGEtZl17MTZ9KS0oW1xcZGEtZl17Mn0pJC8uZXhlYyh2YWx1ZSk7XG5cbiAgaWYgKHBhcnNlZCkge1xuICAgIHZhciBmbGFncyA9IHBhcnNlZFs0XTtcbiAgICB2YXIgc2FtcGxlZCA9IGZsYWdzICE9PSAnMDAnO1xuICAgIHJldHVybiB7XG4gICAgICB0cmFjZUlkOiBwYXJzZWRbMl0sXG4gICAgICBpZDogcGFyc2VkWzNdLFxuICAgICAgc2FtcGxlZDogc2FtcGxlZFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNEdEhlYWRlclZhbGlkKGhlYWRlcikge1xuICByZXR1cm4gL15bXFxkYS1mXXsyfS1bXFxkYS1mXXszMn0tW1xcZGEtZl17MTZ9LVtcXGRhLWZdezJ9JC8udGVzdChoZWFkZXIpICYmIGhlYWRlci5zbGljZSgzLCAzNSkgIT09ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgJiYgaGVhZGVyLnNsaWNlKDM2LCA1MikgIT09ICcwMDAwMDAwMDAwMDAwMDAwJztcbn1cblxuZnVuY3Rpb24gZ2V0VFNIZWFkZXJWYWx1ZShfcmVmKSB7XG4gIHZhciBzYW1wbGVSYXRlID0gX3JlZi5zYW1wbGVSYXRlO1xuXG4gIGlmICh0eXBlb2Ygc2FtcGxlUmF0ZSAhPT0gJ251bWJlcicgfHwgU3RyaW5nKHNhbXBsZVJhdGUpLmxlbmd0aCA+IDI1Nikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBOQU1FU1BBQ0UgPSAnZXMnO1xuICB2YXIgU0VQQVJBVE9SID0gJz0nO1xuICByZXR1cm4gXCJcIiArIE5BTUVTUEFDRSArIFNFUEFSQVRPUiArIFwiczpcIiArIHNhbXBsZVJhdGU7XG59XG5cbmZ1bmN0aW9uIHNldFJlcXVlc3RIZWFkZXIodGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICBpZiAodHlwZW9mIHRhcmdldC5zZXRSZXF1ZXN0SGVhZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGFyZ2V0LnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWUpO1xuICB9IGVsc2UgaWYgKHRhcmdldC5oZWFkZXJzICYmIHR5cGVvZiB0YXJnZXQuaGVhZGVycy5hcHBlbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0YXJnZXQuaGVhZGVycy5hcHBlbmQobmFtZSwgdmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRhcmdldFtuYW1lXSA9IHZhbHVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNoZWNrU2FtZU9yaWdpbihzb3VyY2UsIHRhcmdldCkge1xuICB2YXIgaXNTYW1lID0gZmFsc2U7XG5cbiAgaWYgKHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgaXNTYW1lID0gc291cmNlID09PSB0YXJnZXQ7XG4gIH0gZWxzZSBpZiAodGFyZ2V0ICYmIHR5cGVvZiB0YXJnZXQudGVzdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlzU2FtZSA9IHRhcmdldC50ZXN0KHNvdXJjZSk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0YXJnZXQpKSB7XG4gICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24gKHQpIHtcbiAgICAgIGlmICghaXNTYW1lKSB7XG4gICAgICAgIGlzU2FtZSA9IGNoZWNrU2FtZU9yaWdpbihzb3VyY2UsIHQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGlzU2FtZTtcbn1cblxuZnVuY3Rpb24gaXNQbGF0Zm9ybVN1cHBvcnRlZCgpIHtcbiAgcmV0dXJuIGlzQnJvd3NlciAmJiB0eXBlb2YgU2V0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBKU09OLnN0cmluZ2lmeSA9PT0gJ2Z1bmN0aW9uJyAmJiBQRVJGICYmIHR5cGVvZiBQRVJGLm5vdyA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0NPUlNTdXBwb3J0ZWQoKTtcbn1cblxuZnVuY3Rpb24gc2V0TGFiZWwoa2V5LCB2YWx1ZSwgb2JqKSB7XG4gIGlmICghb2JqIHx8ICFrZXkpIHJldHVybjtcbiAgdmFyIHNrZXkgPSByZW1vdmVJbnZhbGlkQ2hhcnMoa2V5KTtcbiAgdmFyIHZhbHVlVHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuICBpZiAodmFsdWUgIT0gdW5kZWZpbmVkICYmIHZhbHVlVHlwZSAhPT0gJ2Jvb2xlYW4nICYmIHZhbHVlVHlwZSAhPT0gJ251bWJlcicpIHtcbiAgICB2YWx1ZSA9IFN0cmluZyh2YWx1ZSk7XG4gIH1cblxuICBvYmpbc2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iajtcbn1cblxuZnVuY3Rpb24gZ2V0U2VydmVyVGltaW5nSW5mbyhzZXJ2ZXJUaW1pbmdFbnRyaWVzKSB7XG4gIGlmIChzZXJ2ZXJUaW1pbmdFbnRyaWVzID09PSB2b2lkIDApIHtcbiAgICBzZXJ2ZXJUaW1pbmdFbnRyaWVzID0gW107XG4gIH1cblxuICB2YXIgc2VydmVyVGltaW5nSW5mbyA9IFtdO1xuICB2YXIgZW50cnlTZXBhcmF0b3IgPSAnLCAnO1xuICB2YXIgdmFsdWVTZXBhcmF0b3IgPSAnOyc7XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgc2VydmVyVGltaW5nRW50cmllcy5sZW5ndGg7IF9pMisrKSB7XG4gICAgdmFyIF9zZXJ2ZXJUaW1pbmdFbnRyaWVzJCA9IHNlcnZlclRpbWluZ0VudHJpZXNbX2kyXSxcbiAgICAgICAgbmFtZSA9IF9zZXJ2ZXJUaW1pbmdFbnRyaWVzJC5uYW1lLFxuICAgICAgICBkdXJhdGlvbiA9IF9zZXJ2ZXJUaW1pbmdFbnRyaWVzJC5kdXJhdGlvbixcbiAgICAgICAgZGVzY3JpcHRpb24gPSBfc2VydmVyVGltaW5nRW50cmllcyQuZGVzY3JpcHRpb247XG4gICAgdmFyIHRpbWluZ1ZhbHVlID0gbmFtZTtcblxuICAgIGlmIChkZXNjcmlwdGlvbikge1xuICAgICAgdGltaW5nVmFsdWUgKz0gdmFsdWVTZXBhcmF0b3IgKyAnZGVzYz0nICsgZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgaWYgKGR1cmF0aW9uKSB7XG4gICAgICB0aW1pbmdWYWx1ZSArPSB2YWx1ZVNlcGFyYXRvciArICdkdXI9JyArIGR1cmF0aW9uO1xuICAgIH1cblxuICAgIHNlcnZlclRpbWluZ0luZm8ucHVzaCh0aW1pbmdWYWx1ZSk7XG4gIH1cblxuICByZXR1cm4gc2VydmVyVGltaW5nSW5mby5qb2luKGVudHJ5U2VwYXJhdG9yKTtcbn1cblxuZnVuY3Rpb24gZ2V0VGltZU9yaWdpbigpIHtcbiAgcmV0dXJuIFBFUkYudGltaW5nLmZldGNoU3RhcnQ7XG59XG5cbmZ1bmN0aW9uIHN0cmlwUXVlcnlTdHJpbmdGcm9tVXJsKHVybCkge1xuICByZXR1cm4gdXJsICYmIHVybC5zcGxpdCgnPycpWzBdO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jztcbn1cblxuZnVuY3Rpb24gaXNGdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBiYXNlRXh0ZW5kKGRzdCwgb2JqcywgZGVlcCkge1xuICBmb3IgKHZhciBpID0gMCwgaWkgPSBvYmpzLmxlbmd0aDsgaSA8IGlpOyArK2kpIHtcbiAgICB2YXIgb2JqID0gb2Jqc1tpXTtcbiAgICBpZiAoIWlzT2JqZWN0KG9iaikgJiYgIWlzRnVuY3Rpb24ob2JqKSkgY29udGludWU7XG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuXG4gICAgZm9yICh2YXIgaiA9IDAsIGpqID0ga2V5cy5sZW5ndGg7IGogPCBqajsgaisrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tqXTtcbiAgICAgIHZhciBzcmMgPSBvYmpba2V5XTtcblxuICAgICAgaWYgKGRlZXAgJiYgaXNPYmplY3Qoc3JjKSkge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGRzdFtrZXldKSkgZHN0W2tleV0gPSBBcnJheS5pc0FycmF5KHNyYykgPyBbXSA6IHt9O1xuICAgICAgICBiYXNlRXh0ZW5kKGRzdFtrZXldLCBbc3JjXSwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHN0W2tleV0gPSBzcmM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRzdDtcbn1cblxuZnVuY3Rpb24gZ2V0RWxhc3RpY1NjcmlwdCgpIHtcbiAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB2YXIgc2NyaXB0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTtcblxuICAgIGZvciAodmFyIGkgPSAwLCBsID0gc2NyaXB0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIHZhciBzYyA9IHNjcmlwdHNbaV07XG5cbiAgICAgIGlmIChzYy5zcmMuaW5kZXhPZignZWxhc3RpYycpID4gMCkge1xuICAgICAgICByZXR1cm4gc2M7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRTY3JpcHQoKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIGN1cnJlbnRTY3JpcHQgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0O1xuXG4gICAgaWYgKCFjdXJyZW50U2NyaXB0KSB7XG4gICAgICByZXR1cm4gZ2V0RWxhc3RpY1NjcmlwdCgpO1xuICAgIH1cblxuICAgIHJldHVybiBjdXJyZW50U2NyaXB0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkc3QpIHtcbiAgcmV0dXJuIGJhc2VFeHRlbmQoZHN0LCBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSksIGZhbHNlKTtcbn1cblxuZnVuY3Rpb24gbWVyZ2UoZHN0KSB7XG4gIHJldHVybiBiYXNlRXh0ZW5kKGRzdCwgc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJztcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmZ1bmN0aW9uIGZpbmQoYXJyYXksIHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICBpZiAoYXJyYXkgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FycmF5IGlzIG51bGwgb3Igbm90IGRlZmluZWQnKTtcbiAgfVxuXG4gIHZhciBvID0gT2JqZWN0KGFycmF5KTtcbiAgdmFyIGxlbiA9IG8ubGVuZ3RoID4+PiAwO1xuXG4gIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGsgPSAwO1xuXG4gIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgdmFyIGtWYWx1ZSA9IG9ba107XG5cbiAgICBpZiAocHJlZGljYXRlLmNhbGwodGhpc0FyZywga1ZhbHVlLCBrLCBvKSkge1xuICAgICAgcmV0dXJuIGtWYWx1ZTtcbiAgICB9XG5cbiAgICBrKys7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZW1vdmVJbnZhbGlkQ2hhcnMoa2V5KSB7XG4gIHJldHVybiBrZXkucmVwbGFjZSgvWy4qXCJdL2csICdfJyk7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdFNwYW4oc3BhbnMsIHR5cGVGaWx0ZXIpIHtcbiAgdmFyIGxhdGVzdFNwYW4gPSBudWxsO1xuXG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IHNwYW5zLmxlbmd0aDsgX2kzKyspIHtcbiAgICB2YXIgc3BhbiA9IHNwYW5zW19pM107XG5cbiAgICBpZiAodHlwZUZpbHRlciAmJiB0eXBlRmlsdGVyKHNwYW4udHlwZSkgJiYgKCFsYXRlc3RTcGFuIHx8IGxhdGVzdFNwYW4uX2VuZCA8IHNwYW4uX2VuZCkpIHtcbiAgICAgIGxhdGVzdFNwYW4gPSBzcGFuO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsYXRlc3RTcGFuO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3ROb25YSFJTcGFuKHNwYW5zKSB7XG4gIHJldHVybiBnZXRMYXRlc3RTcGFuKHNwYW5zLCBmdW5jdGlvbiAodHlwZSkge1xuICAgIHJldHVybiBTdHJpbmcodHlwZSkuaW5kZXhPZignZXh0ZXJuYWwnKSA9PT0gLTE7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3RYSFJTcGFuKHNwYW5zKSB7XG4gIHJldHVybiBnZXRMYXRlc3RTcGFuKHNwYW5zLCBmdW5jdGlvbiAodHlwZSkge1xuICAgIHJldHVybiBTdHJpbmcodHlwZSkuaW5kZXhPZignZXh0ZXJuYWwnKSAhPT0gLTE7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRFYXJsaWVzdFNwYW4oc3BhbnMpIHtcbiAgdmFyIGVhcmxpZXN0U3BhbiA9IHNwYW5zWzBdO1xuXG4gIGZvciAodmFyIF9pNCA9IDE7IF9pNCA8IHNwYW5zLmxlbmd0aDsgX2k0KyspIHtcbiAgICB2YXIgc3BhbiA9IHNwYW5zW19pNF07XG5cbiAgICBpZiAoZWFybGllc3RTcGFuLl9zdGFydCA+IHNwYW4uX3N0YXJ0KSB7XG4gICAgICBlYXJsaWVzdFNwYW4gPSBzcGFuO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlYXJsaWVzdFNwYW47XG59XG5cbmZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIFBFUkYubm93KCk7XG59XG5cbmZ1bmN0aW9uIGdldFRpbWUodGltZSkge1xuICByZXR1cm4gdHlwZW9mIHRpbWUgPT09ICdudW1iZXInICYmIHRpbWUgPj0gMCA/IHRpbWUgOiBub3coKTtcbn1cblxuZnVuY3Rpb24gZ2V0RHVyYXRpb24oc3RhcnQsIGVuZCkge1xuICBpZiAoaXNVbmRlZmluZWQoZW5kKSB8fCBpc1VuZGVmaW5lZChzdGFydCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBwYXJzZUludChlbmQgLSBzdGFydCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlTWFjcm9UYXNrKGNhbGxiYWNrKSB7XG4gIHNldFRpbWVvdXQoY2FsbGJhY2ssIDApO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZU1pY3JvVGFzayhjYWxsYmFjaykge1xuICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gaXNQZXJmVGltZWxpbmVTdXBwb3J0ZWQoKSB7XG4gIHJldHVybiB0eXBlb2YgUEVSRi5nZXRFbnRyaWVzQnlUeXBlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc1BlcmZUeXBlU3VwcG9ydGVkKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiBQZXJmb3JtYW5jZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiBQZXJmb3JtYW5jZU9ic2VydmVyLnN1cHBvcnRlZEVudHJ5VHlwZXMgJiYgUGVyZm9ybWFuY2VPYnNlcnZlci5zdXBwb3J0ZWRFbnRyeVR5cGVzLmluZGV4T2YodHlwZSkgPj0gMDtcbn1cblxuZnVuY3Rpb24gaXNCZWFjb25JbnNwZWN0aW9uRW5hYmxlZCgpIHtcbiAgdmFyIGZsYWdOYW1lID0gJ19lbGFzdGljX2luc3BlY3RfYmVhY29uXyc7XG5cbiAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZmxhZ05hbWUpICE9IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghd2luZG93LlVSTCB8fCAhd2luZG93LlVSTFNlYXJjaFBhcmFtcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgdmFyIHBhcnNlZFVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIHZhciBpc0ZsYWdTZXQgPSBwYXJzZWRVcmwuc2VhcmNoUGFyYW1zLmhhcyhmbGFnTmFtZSk7XG5cbiAgICBpZiAoaXNGbGFnU2V0KSB7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGZsYWdOYW1lLCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNGbGFnU2V0O1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IHsgZXh0ZW5kLCBtZXJnZSwgaXNVbmRlZmluZWQsIG5vb3AsIGJhc2VFeHRlbmQsIGJ5dGVzVG9IZXgsIGlzQ09SU1N1cHBvcnRlZCwgaXNPYmplY3QsIGlzRnVuY3Rpb24sIGlzUGxhdGZvcm1TdXBwb3J0ZWQsIGlzRHRIZWFkZXJWYWxpZCwgcGFyc2VEdEhlYWRlclZhbHVlLCBnZXRTZXJ2ZXJUaW1pbmdJbmZvLCBnZXREdEhlYWRlclZhbHVlLCBnZXRUU0hlYWRlclZhbHVlLCBnZXRDdXJyZW50U2NyaXB0LCBnZXRFbGFzdGljU2NyaXB0LCBnZXRUaW1lT3JpZ2luLCBnZW5lcmF0ZVJhbmRvbUlkLCBnZXRFYXJsaWVzdFNwYW4sIGdldExhdGVzdE5vblhIUlNwYW4sIGdldExhdGVzdFhIUlNwYW4sIGdldER1cmF0aW9uLCBnZXRUaW1lLCBub3csIHJuZywgY2hlY2tTYW1lT3JpZ2luLCBzY2hlZHVsZU1hY3JvVGFzaywgc2NoZWR1bGVNaWNyb1Rhc2ssIHNldExhYmVsLCBzZXRSZXF1ZXN0SGVhZGVyLCBzdHJpcFF1ZXJ5U3RyaW5nRnJvbVVybCwgZmluZCwgcmVtb3ZlSW52YWxpZENoYXJzLCBQRVJGLCBpc1BlcmZUaW1lbGluZVN1cHBvcnRlZCwgaXNCcm93c2VyLCBpc1BlcmZUeXBlU3VwcG9ydGVkLCBpc0JlYWNvbkluc3BlY3Rpb25FbmFibGVkIH07IiwidmFyIF9leGNsdWRlZCA9IFtcInRhZ3NcIl07XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IHsgY3JlYXRlU3RhY2tUcmFjZXMsIGZpbHRlckludmFsaWRGcmFtZXMgfSBmcm9tICcuL3N0YWNrLXRyYWNlJztcbmltcG9ydCB7IGdlbmVyYXRlUmFuZG9tSWQsIG1lcmdlLCBleHRlbmQgfSBmcm9tICcuLi9jb21tb24vdXRpbHMnO1xuaW1wb3J0IHsgZ2V0UGFnZUNvbnRleHQgfSBmcm9tICcuLi9jb21tb24vY29udGV4dCc7XG5pbXBvcnQgeyB0cnVuY2F0ZU1vZGVsLCBFUlJPUl9NT0RFTCB9IGZyb20gJy4uL2NvbW1vbi90cnVuY2F0ZSc7XG5pbXBvcnQgc3RhY2tQYXJzZXIgZnJvbSAnZXJyb3Itc3RhY2stcGFyc2VyJztcbnZhciBJR05PUkVfS0VZUyA9IFsnc3RhY2snLCAnbWVzc2FnZSddO1xuXG5mdW5jdGlvbiBnZXRFcnJvclByb3BlcnRpZXMoZXJyb3IpIHtcbiAgdmFyIHByb3BlcnR5Rm91bmQgPSBmYWxzZTtcbiAgdmFyIHByb3BlcnRpZXMgPSB7fTtcbiAgT2JqZWN0LmtleXMoZXJyb3IpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChJR05PUkVfS0VZUy5pbmRleE9mKGtleSkgPj0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB2YWwgPSBlcnJvcltrZXldO1xuXG4gICAgaWYgKHZhbCA9PSBudWxsIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmICh0eXBlb2YgdmFsLnRvSVNPU3RyaW5nICE9PSAnZnVuY3Rpb24nKSByZXR1cm47XG4gICAgICB2YWwgPSB2YWwudG9JU09TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBwcm9wZXJ0aWVzW2tleV0gPSB2YWw7XG4gICAgcHJvcGVydHlGb3VuZCA9IHRydWU7XG4gIH0pO1xuXG4gIGlmIChwcm9wZXJ0eUZvdW5kKSB7XG4gICAgcmV0dXJuIHByb3BlcnRpZXM7XG4gIH1cbn1cblxudmFyIEVycm9yTG9nZ2luZyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRXJyb3JMb2dnaW5nKGFwbVNlcnZlciwgY29uZmlnU2VydmljZSwgdHJhbnNhY3Rpb25TZXJ2aWNlKSB7XG4gICAgdGhpcy5fYXBtU2VydmVyID0gYXBtU2VydmVyO1xuICAgIHRoaXMuX2NvbmZpZ1NlcnZpY2UgPSBjb25maWdTZXJ2aWNlO1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uU2VydmljZSA9IHRyYW5zYWN0aW9uU2VydmljZTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBFcnJvckxvZ2dpbmcucHJvdG90eXBlO1xuXG4gIF9wcm90by5jcmVhdGVFcnJvckRhdGFNb2RlbCA9IGZ1bmN0aW9uIGNyZWF0ZUVycm9yRGF0YU1vZGVsKGVycm9yRXZlbnQpIHtcbiAgICB2YXIgZnJhbWVzID0gY3JlYXRlU3RhY2tUcmFjZXMoc3RhY2tQYXJzZXIsIGVycm9yRXZlbnQpO1xuICAgIHZhciBmaWx0ZXJlZEZyYW1lcyA9IGZpbHRlckludmFsaWRGcmFtZXMoZnJhbWVzKTtcbiAgICB2YXIgY3VscHJpdCA9ICcoaW5saW5lIHNjcmlwdCknO1xuICAgIHZhciBsYXN0RnJhbWUgPSBmaWx0ZXJlZEZyYW1lc1tmaWx0ZXJlZEZyYW1lcy5sZW5ndGggLSAxXTtcblxuICAgIGlmIChsYXN0RnJhbWUgJiYgbGFzdEZyYW1lLmZpbGVuYW1lKSB7XG4gICAgICBjdWxwcml0ID0gbGFzdEZyYW1lLmZpbGVuYW1lO1xuICAgIH1cblxuICAgIHZhciBtZXNzYWdlID0gZXJyb3JFdmVudC5tZXNzYWdlLFxuICAgICAgICBlcnJvciA9IGVycm9yRXZlbnQuZXJyb3I7XG4gICAgdmFyIGVycm9yTWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdmFyIGVycm9yVHlwZSA9ICcnO1xuICAgIHZhciBlcnJvckNvbnRleHQgPSB7fTtcblxuICAgIGlmIChlcnJvciAmJiB0eXBlb2YgZXJyb3IgPT09ICdvYmplY3QnKSB7XG4gICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UgfHwgZXJyb3IubWVzc2FnZTtcbiAgICAgIGVycm9yVHlwZSA9IGVycm9yLm5hbWU7XG4gICAgICB2YXIgY3VzdG9tUHJvcGVydGllcyA9IGdldEVycm9yUHJvcGVydGllcyhlcnJvcik7XG5cbiAgICAgIGlmIChjdXN0b21Qcm9wZXJ0aWVzKSB7XG4gICAgICAgIGVycm9yQ29udGV4dC5jdXN0b20gPSBjdXN0b21Qcm9wZXJ0aWVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZXJyb3JUeXBlKSB7XG4gICAgICBpZiAoZXJyb3JNZXNzYWdlICYmIGVycm9yTWVzc2FnZS5pbmRleE9mKCc6JykgPiAtMSkge1xuICAgICAgICBlcnJvclR5cGUgPSBlcnJvck1lc3NhZ2Uuc3BsaXQoJzonKVswXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgY3VycmVudFRyYW5zYWN0aW9uID0gdGhpcy5fdHJhbnNhY3Rpb25TZXJ2aWNlLmdldEN1cnJlbnRUcmFuc2FjdGlvbigpO1xuXG4gICAgdmFyIHRyYW5zYWN0aW9uQ29udGV4dCA9IGN1cnJlbnRUcmFuc2FjdGlvbiA/IGN1cnJlbnRUcmFuc2FjdGlvbi5jb250ZXh0IDoge307XG5cbiAgICB2YXIgX3RoaXMkX2NvbmZpZ1NlcnZpY2UkID0gdGhpcy5fY29uZmlnU2VydmljZS5nZXQoJ2NvbnRleHQnKSxcbiAgICAgICAgdGFncyA9IF90aGlzJF9jb25maWdTZXJ2aWNlJC50YWdzLFxuICAgICAgICBjb25maWdDb250ZXh0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2UoX3RoaXMkX2NvbmZpZ1NlcnZpY2UkLCBfZXhjbHVkZWQpO1xuXG4gICAgdmFyIHBhZ2VDb250ZXh0ID0gZ2V0UGFnZUNvbnRleHQoKTtcbiAgICB2YXIgY29udGV4dCA9IG1lcmdlKHt9LCBwYWdlQ29udGV4dCwgdHJhbnNhY3Rpb25Db250ZXh0LCBjb25maWdDb250ZXh0LCBlcnJvckNvbnRleHQpO1xuICAgIHZhciBlcnJvck9iamVjdCA9IHtcbiAgICAgIGlkOiBnZW5lcmF0ZVJhbmRvbUlkKCksXG4gICAgICBjdWxwcml0OiBjdWxwcml0LFxuICAgICAgZXhjZXB0aW9uOiB7XG4gICAgICAgIG1lc3NhZ2U6IGVycm9yTWVzc2FnZSxcbiAgICAgICAgc3RhY2t0cmFjZTogZmlsdGVyZWRGcmFtZXMsXG4gICAgICAgIHR5cGU6IGVycm9yVHlwZVxuICAgICAgfSxcbiAgICAgIGNvbnRleHQ6IGNvbnRleHRcbiAgICB9O1xuXG4gICAgaWYgKGN1cnJlbnRUcmFuc2FjdGlvbikge1xuICAgICAgZXJyb3JPYmplY3QgPSBleHRlbmQoZXJyb3JPYmplY3QsIHtcbiAgICAgICAgdHJhY2VfaWQ6IGN1cnJlbnRUcmFuc2FjdGlvbi50cmFjZUlkLFxuICAgICAgICBwYXJlbnRfaWQ6IGN1cnJlbnRUcmFuc2FjdGlvbi5pZCxcbiAgICAgICAgdHJhbnNhY3Rpb25faWQ6IGN1cnJlbnRUcmFuc2FjdGlvbi5pZCxcbiAgICAgICAgdHJhbnNhY3Rpb246IHtcbiAgICAgICAgICB0eXBlOiBjdXJyZW50VHJhbnNhY3Rpb24udHlwZSxcbiAgICAgICAgICBzYW1wbGVkOiBjdXJyZW50VHJhbnNhY3Rpb24uc2FtcGxlZFxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1bmNhdGVNb2RlbChFUlJPUl9NT0RFTCwgZXJyb3JPYmplY3QpO1xuICB9O1xuXG4gIF9wcm90by5sb2dFcnJvckV2ZW50ID0gZnVuY3Rpb24gbG9nRXJyb3JFdmVudChlcnJvckV2ZW50KSB7XG4gICAgaWYgKHR5cGVvZiBlcnJvckV2ZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBlcnJvck9iamVjdCA9IHRoaXMuY3JlYXRlRXJyb3JEYXRhTW9kZWwoZXJyb3JFdmVudCk7XG5cbiAgICBpZiAodHlwZW9mIGVycm9yT2JqZWN0LmV4Y2VwdGlvbi5tZXNzYWdlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2FwbVNlcnZlci5hZGRFcnJvcihlcnJvck9iamVjdCk7XG4gIH07XG5cbiAgX3Byb3RvLnJlZ2lzdGVyTGlzdGVuZXJzID0gZnVuY3Rpb24gcmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uIChlcnJvckV2ZW50KSB7XG4gICAgICByZXR1cm4gX3RoaXMubG9nRXJyb3JFdmVudChlcnJvckV2ZW50KTtcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndW5oYW5kbGVkcmVqZWN0aW9uJywgZnVuY3Rpb24gKHByb21pc2VSZWplY3Rpb25FdmVudCkge1xuICAgICAgcmV0dXJuIF90aGlzLmxvZ1Byb21pc2VFdmVudChwcm9taXNlUmVqZWN0aW9uRXZlbnQpO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5sb2dQcm9taXNlRXZlbnQgPSBmdW5jdGlvbiBsb2dQcm9taXNlRXZlbnQocHJvbWlzZVJlamVjdGlvbkV2ZW50KSB7XG4gICAgdmFyIHByZWZpeCA9ICdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb246ICc7XG4gICAgdmFyIHJlYXNvbiA9IHByb21pc2VSZWplY3Rpb25FdmVudC5yZWFzb247XG5cbiAgICBpZiAocmVhc29uID09IG51bGwpIHtcbiAgICAgIHJlYXNvbiA9ICc8bm8gcmVhc29uIHNwZWNpZmllZD4nO1xuICAgIH1cblxuICAgIHZhciBlcnJvckV2ZW50O1xuXG4gICAgaWYgKHR5cGVvZiByZWFzb24ubWVzc2FnZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBuYW1lID0gcmVhc29uLm5hbWUgPyByZWFzb24ubmFtZSArICc6ICcgOiAnJztcbiAgICAgIGVycm9yRXZlbnQgPSB7XG4gICAgICAgIGVycm9yOiByZWFzb24sXG4gICAgICAgIG1lc3NhZ2U6IHByZWZpeCArIG5hbWUgKyByZWFzb24ubWVzc2FnZVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVhc29uID0gdHlwZW9mIHJlYXNvbiA9PT0gJ29iamVjdCcgPyAnPG9iamVjdD4nIDogdHlwZW9mIHJlYXNvbiA9PT0gJ2Z1bmN0aW9uJyA/ICc8ZnVuY3Rpb24+JyA6IHJlYXNvbjtcbiAgICAgIGVycm9yRXZlbnQgPSB7XG4gICAgICAgIG1lc3NhZ2U6IHByZWZpeCArIHJlYXNvblxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZ0Vycm9yRXZlbnQoZXJyb3JFdmVudCk7XG4gIH07XG5cbiAgX3Byb3RvLmxvZ0Vycm9yID0gZnVuY3Rpb24gbG9nRXJyb3IobWVzc2FnZU9yRXJyb3IpIHtcbiAgICB2YXIgZXJyb3JFdmVudCA9IHt9O1xuXG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlT3JFcnJvciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVycm9yRXZlbnQubWVzc2FnZSA9IG1lc3NhZ2VPckVycm9yO1xuICAgIH0gZWxzZSB7XG4gICAgICBlcnJvckV2ZW50LmVycm9yID0gbWVzc2FnZU9yRXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubG9nRXJyb3JFdmVudChlcnJvckV2ZW50KTtcbiAgfTtcblxuICByZXR1cm4gRXJyb3JMb2dnaW5nO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBFcnJvckxvZ2dpbmc7IiwiaW1wb3J0IEVycm9yTG9nZ2luZyBmcm9tICcuL2Vycm9yLWxvZ2dpbmcnO1xuaW1wb3J0IHsgQ09ORklHX1NFUlZJQ0UsIFRSQU5TQUNUSU9OX1NFUlZJQ0UsIEVSUk9SX0xPR0dJTkcsIEFQTV9TRVJWRVIgfSBmcm9tICcuLi9jb21tb24vY29uc3RhbnRzJztcbmltcG9ydCB7IHNlcnZpY2VDcmVhdG9ycyB9IGZyb20gJy4uL2NvbW1vbi9zZXJ2aWNlLWZhY3RvcnknO1xuXG5mdW5jdGlvbiByZWdpc3RlclNlcnZpY2VzKCkge1xuICBzZXJ2aWNlQ3JlYXRvcnNbRVJST1JfTE9HR0lOR10gPSBmdW5jdGlvbiAoc2VydmljZUZhY3RvcnkpIHtcbiAgICB2YXIgX3NlcnZpY2VGYWN0b3J5JGdldFNlID0gc2VydmljZUZhY3RvcnkuZ2V0U2VydmljZShbQVBNX1NFUlZFUiwgQ09ORklHX1NFUlZJQ0UsIFRSQU5TQUNUSU9OX1NFUlZJQ0VdKSxcbiAgICAgICAgYXBtU2VydmVyID0gX3NlcnZpY2VGYWN0b3J5JGdldFNlWzBdLFxuICAgICAgICBjb25maWdTZXJ2aWNlID0gX3NlcnZpY2VGYWN0b3J5JGdldFNlWzFdLFxuICAgICAgICB0cmFuc2FjdGlvblNlcnZpY2UgPSBfc2VydmljZUZhY3RvcnkkZ2V0U2VbMl07XG5cbiAgICByZXR1cm4gbmV3IEVycm9yTG9nZ2luZyhhcG1TZXJ2ZXIsIGNvbmZpZ1NlcnZpY2UsIHRyYW5zYWN0aW9uU2VydmljZSk7XG4gIH07XG59XG5cbmV4cG9ydCB7IHJlZ2lzdGVyU2VydmljZXMgfTsiLCJmdW5jdGlvbiBmaWxlUGF0aFRvRmlsZU5hbWUoZmlsZVVybCkge1xuICB2YXIgb3JpZ2luID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbiB8fCB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyAnLy8nICsgd2luZG93LmxvY2F0aW9uLmhvc3RuYW1lICsgKHdpbmRvdy5sb2NhdGlvbi5wb3J0ID8gJzonICsgd2luZG93LmxvY2F0aW9uLnBvcnQgOiAnJyk7XG5cbiAgaWYgKGZpbGVVcmwuaW5kZXhPZihvcmlnaW4pID4gLTEpIHtcbiAgICBmaWxlVXJsID0gZmlsZVVybC5yZXBsYWNlKG9yaWdpbiArICcvJywgJycpO1xuICB9XG5cbiAgcmV0dXJuIGZpbGVVcmw7XG59XG5cbmZ1bmN0aW9uIGNsZWFuRmlsZVBhdGgoZmlsZVBhdGgpIHtcbiAgaWYgKGZpbGVQYXRoID09PSB2b2lkIDApIHtcbiAgICBmaWxlUGF0aCA9ICcnO1xuICB9XG5cbiAgaWYgKGZpbGVQYXRoID09PSAnPGFub255bW91cz4nKSB7XG4gICAgZmlsZVBhdGggPSAnJztcbiAgfVxuXG4gIHJldHVybiBmaWxlUGF0aDtcbn1cblxuZnVuY3Rpb24gaXNGaWxlSW5saW5lKGZpbGVVcmwpIHtcbiAgaWYgKGZpbGVVcmwpIHtcbiAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZihmaWxlVXJsKSA9PT0gMDtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RhY2tGcmFtZXMoc3RhY2tGcmFtZXMpIHtcbiAgcmV0dXJuIHN0YWNrRnJhbWVzLm1hcChmdW5jdGlvbiAoZnJhbWUpIHtcbiAgICBpZiAoZnJhbWUuZnVuY3Rpb25OYW1lKSB7XG4gICAgICBmcmFtZS5mdW5jdGlvbk5hbWUgPSBub3JtYWxpemVGdW5jdGlvbk5hbWUoZnJhbWUuZnVuY3Rpb25OYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJhbWU7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVGdW5jdGlvbk5hbWUoZm5OYW1lKSB7XG4gIHZhciBwYXJ0cyA9IGZuTmFtZS5zcGxpdCgnLycpO1xuXG4gIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7XG4gICAgZm5OYW1lID0gWydPYmplY3QnLCBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXV0uam9pbignLicpO1xuICB9IGVsc2Uge1xuICAgIGZuTmFtZSA9IHBhcnRzWzBdO1xuICB9XG5cbiAgZm5OYW1lID0gZm5OYW1lLnJlcGxhY2UoLy48JC9naSwgJy48YW5vbnltb3VzPicpO1xuICBmbk5hbWUgPSBmbk5hbWUucmVwbGFjZSgvXkFub255bW91cyBmdW5jdGlvbiQvLCAnPGFub255bW91cz4nKTtcbiAgcGFydHMgPSBmbk5hbWUuc3BsaXQoJy4nKTtcblxuICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgIGZuTmFtZSA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICB9IGVsc2Uge1xuICAgIGZuTmFtZSA9IHBhcnRzWzBdO1xuICB9XG5cbiAgcmV0dXJuIGZuTmFtZTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZFN0YWNrVHJhY2Uoc3RhY2tUcmFjZXMpIHtcbiAgaWYgKHN0YWNrVHJhY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzdGFja1RyYWNlcy5sZW5ndGggPT09IDEpIHtcbiAgICB2YXIgc3RhY2tUcmFjZSA9IHN0YWNrVHJhY2VzWzBdO1xuICAgIHJldHVybiAnbGluZU51bWJlcicgaW4gc3RhY2tUcmFjZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RhY2tUcmFjZXMoc3RhY2tQYXJzZXIsIGVycm9yRXZlbnQpIHtcbiAgdmFyIGVycm9yID0gZXJyb3JFdmVudC5lcnJvcixcbiAgICAgIGZpbGVuYW1lID0gZXJyb3JFdmVudC5maWxlbmFtZSxcbiAgICAgIGxpbmVubyA9IGVycm9yRXZlbnQubGluZW5vLFxuICAgICAgY29sbm8gPSBlcnJvckV2ZW50LmNvbG5vO1xuICB2YXIgc3RhY2tUcmFjZXMgPSBbXTtcblxuICBpZiAoZXJyb3IpIHtcbiAgICB0cnkge1xuICAgICAgc3RhY2tUcmFjZXMgPSBzdGFja1BhcnNlci5wYXJzZShlcnJvcik7XG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuXG4gIGlmICghaXNWYWxpZFN0YWNrVHJhY2Uoc3RhY2tUcmFjZXMpKSB7XG4gICAgc3RhY2tUcmFjZXMgPSBbe1xuICAgICAgZmlsZU5hbWU6IGZpbGVuYW1lLFxuICAgICAgbGluZU51bWJlcjogbGluZW5vLFxuICAgICAgY29sdW1uTnVtYmVyOiBjb2xub1xuICAgIH1dO1xuICB9XG5cbiAgdmFyIG5vcm1hbGl6ZWRTdGFja1RyYWNlcyA9IG5vcm1hbGl6ZVN0YWNrRnJhbWVzKHN0YWNrVHJhY2VzKTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWRTdGFja1RyYWNlcy5tYXAoZnVuY3Rpb24gKHN0YWNrKSB7XG4gICAgdmFyIGZpbGVOYW1lID0gc3RhY2suZmlsZU5hbWUsXG4gICAgICAgIGxpbmVOdW1iZXIgPSBzdGFjay5saW5lTnVtYmVyLFxuICAgICAgICBjb2x1bW5OdW1iZXIgPSBzdGFjay5jb2x1bW5OdW1iZXIsXG4gICAgICAgIF9zdGFjayRmdW5jdGlvbk5hbWUgPSBzdGFjay5mdW5jdGlvbk5hbWUsXG4gICAgICAgIGZ1bmN0aW9uTmFtZSA9IF9zdGFjayRmdW5jdGlvbk5hbWUgPT09IHZvaWQgMCA/ICc8YW5vbnltb3VzPicgOiBfc3RhY2skZnVuY3Rpb25OYW1lO1xuXG4gICAgaWYgKCFmaWxlTmFtZSAmJiAhbGluZU51bWJlcikge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGlmICghY29sdW1uTnVtYmVyICYmICFsaW5lTnVtYmVyKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgdmFyIGZpbGVQYXRoID0gY2xlYW5GaWxlUGF0aChmaWxlTmFtZSk7XG4gICAgdmFyIGNsZWFuZWRGaWxlTmFtZSA9IGZpbGVQYXRoVG9GaWxlTmFtZShmaWxlUGF0aCk7XG5cbiAgICBpZiAoaXNGaWxlSW5saW5lKGZpbGVQYXRoKSkge1xuICAgICAgY2xlYW5lZEZpbGVOYW1lID0gJyhpbmxpbmUgc2NyaXB0KSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFic19wYXRoOiBmaWxlTmFtZSxcbiAgICAgIGZpbGVuYW1lOiBjbGVhbmVkRmlsZU5hbWUsXG4gICAgICBmdW5jdGlvbjogZnVuY3Rpb25OYW1lLFxuICAgICAgbGluZW5vOiBsaW5lTnVtYmVyLFxuICAgICAgY29sbm86IGNvbHVtbk51bWJlclxuICAgIH07XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckludmFsaWRGcmFtZXMoZnJhbWVzKSB7XG4gIHJldHVybiBmcmFtZXMuZmlsdGVyKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIGZpbGVuYW1lID0gX3JlZi5maWxlbmFtZSxcbiAgICAgICAgbGluZW5vID0gX3JlZi5saW5lbm87XG4gICAgcmV0dXJuIHR5cGVvZiBmaWxlbmFtZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGxpbmVubyAhPT0gJ3VuZGVmaW5lZCc7XG4gIH0pO1xufSIsImltcG9ydCB7IHJlZ2lzdGVyU2VydmljZXMgYXMgcmVnaXN0ZXJFcnJvclNlcnZpY2VzIH0gZnJvbSAnLi9lcnJvci1sb2dnaW5nJztcbmltcG9ydCB7IHJlZ2lzdGVyU2VydmljZXMgYXMgcmVnaXN0ZXJQZXJmU2VydmljZXMgfSBmcm9tICcuL3BlcmZvcm1hbmNlLW1vbml0b3JpbmcnO1xuaW1wb3J0IHsgU2VydmljZUZhY3RvcnkgfSBmcm9tICcuL2NvbW1vbi9zZXJ2aWNlLWZhY3RvcnknO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybVN1cHBvcnRlZCwgc2NoZWR1bGVNaWNyb1Rhc2ssIHNjaGVkdWxlTWFjcm9UYXNrLCBpc0Jyb3dzZXIgfSBmcm9tICcuL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBwYXRjaEFsbCwgcGF0Y2hFdmVudEhhbmRsZXIgfSBmcm9tICcuL2NvbW1vbi9wYXRjaGluZyc7XG5pbXBvcnQgeyBvYnNlcnZlUGFnZVZpc2liaWxpdHksIG9ic2VydmVQYWdlQ2xpY2tzIH0gZnJvbSAnLi9jb21tb24vb2JzZXJ2ZXJzJztcbmltcG9ydCB7IFBBR0VfTE9BRF9ERUxBWSwgUEFHRV9MT0FELCBFUlJPUiwgQ09ORklHX1NFUlZJQ0UsIExPR0dJTkdfU0VSVklDRSwgVFJBTlNBQ1RJT05fU0VSVklDRSwgQVBNX1NFUlZFUiwgUEVSRk9STUFOQ0VfTU9OSVRPUklORywgRVJST1JfTE9HR0lORywgRVZFTlRfVEFSR0VULCBDTElDSyB9IGZyb20gJy4vY29tbW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRJbnN0cnVtZW50YXRpb25GbGFncyB9IGZyb20gJy4vY29tbW9uL2luc3RydW1lbnQnO1xuaW1wb3J0IGFmdGVyRnJhbWUgZnJvbSAnLi9jb21tb24vYWZ0ZXItZnJhbWUnO1xuaW1wb3J0IHsgYm9vdHN0cmFwIH0gZnJvbSAnLi9ib290c3RyYXAnO1xuaW1wb3J0IHsgY3JlYXRlVHJhY2VyIH0gZnJvbSAnLi9vcGVudHJhY2luZyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVNlcnZpY2VGYWN0b3J5KCkge1xuICByZWdpc3RlclBlcmZTZXJ2aWNlcygpO1xuICByZWdpc3RlckVycm9yU2VydmljZXMoKTtcbiAgdmFyIHNlcnZpY2VGYWN0b3J5ID0gbmV3IFNlcnZpY2VGYWN0b3J5KCk7XG4gIHJldHVybiBzZXJ2aWNlRmFjdG9yeTtcbn1cblxuZXhwb3J0IHsgY3JlYXRlU2VydmljZUZhY3RvcnksIFNlcnZpY2VGYWN0b3J5LCBwYXRjaEFsbCwgcGF0Y2hFdmVudEhhbmRsZXIsIGlzUGxhdGZvcm1TdXBwb3J0ZWQsIGlzQnJvd3NlciwgZ2V0SW5zdHJ1bWVudGF0aW9uRmxhZ3MsIGNyZWF0ZVRyYWNlciwgc2NoZWR1bGVNaWNyb1Rhc2ssIHNjaGVkdWxlTWFjcm9UYXNrLCBhZnRlckZyYW1lLCBFUlJPUiwgUEFHRV9MT0FEX0RFTEFZLCBQQUdFX0xPQUQsIENPTkZJR19TRVJWSUNFLCBMT0dHSU5HX1NFUlZJQ0UsIFRSQU5TQUNUSU9OX1NFUlZJQ0UsIEFQTV9TRVJWRVIsIFBFUkZPUk1BTkNFX01PTklUT1JJTkcsIEVSUk9SX0xPR0dJTkcsIEVWRU5UX1RBUkdFVCwgQ0xJQ0ssIGJvb3RzdHJhcCwgb2JzZXJ2ZVBhZ2VWaXNpYmlsaXR5LCBvYnNlcnZlUGFnZUNsaWNrcyB9OyIsImltcG9ydCBUcmFjZXIgZnJvbSAnLi90cmFjZXInO1xuaW1wb3J0IFNwYW4gZnJvbSAnLi9zcGFuJztcbmltcG9ydCB7IFRSQU5TQUNUSU9OX1NFUlZJQ0UsIExPR0dJTkdfU0VSVklDRSwgUEVSRk9STUFOQ0VfTU9OSVRPUklORywgRVJST1JfTE9HR0lORyB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuXG5mdW5jdGlvbiBjcmVhdGVUcmFjZXIoc2VydmljZUZhY3RvcnkpIHtcbiAgdmFyIHBlcmZvcm1hbmNlTW9uaXRvcmluZyA9IHNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoUEVSRk9STUFOQ0VfTU9OSVRPUklORyk7XG4gIHZhciB0cmFuc2FjdGlvblNlcnZpY2UgPSBzZXJ2aWNlRmFjdG9yeS5nZXRTZXJ2aWNlKFRSQU5TQUNUSU9OX1NFUlZJQ0UpO1xuICB2YXIgZXJyb3JMb2dnaW5nID0gc2VydmljZUZhY3RvcnkuZ2V0U2VydmljZShFUlJPUl9MT0dHSU5HKTtcbiAgdmFyIGxvZ2dpbmdTZXJ2aWNlID0gc2VydmljZUZhY3RvcnkuZ2V0U2VydmljZShMT0dHSU5HX1NFUlZJQ0UpO1xuICByZXR1cm4gbmV3IFRyYWNlcihwZXJmb3JtYW5jZU1vbml0b3JpbmcsIHRyYW5zYWN0aW9uU2VydmljZSwgbG9nZ2luZ1NlcnZpY2UsIGVycm9yTG9nZ2luZyk7XG59XG5cbmV4cG9ydCB7IFNwYW4sIFRyYWNlciwgY3JlYXRlVHJhY2VyIH07IiwiZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmltcG9ydCB7IFNwYW4gYXMgb3RTcGFuIH0gZnJvbSAnb3BlbnRyYWNpbmcvbGliL3NwYW4nO1xuaW1wb3J0IHsgZXh0ZW5kLCBnZXRUaW1lT3JpZ2luIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCBUcmFuc2FjdGlvbiBmcm9tICcuLi9wZXJmb3JtYW5jZS1tb25pdG9yaW5nL3RyYW5zYWN0aW9uJztcblxudmFyIFNwYW4gPSBmdW5jdGlvbiAoX290U3Bhbikge1xuICBfaW5oZXJpdHNMb29zZShTcGFuLCBfb3RTcGFuKTtcblxuICBmdW5jdGlvbiBTcGFuKHRyYWNlciwgc3Bhbikge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX290U3Bhbi5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgX3RoaXMuX190cmFjZXIgPSB0cmFjZXI7XG4gICAgX3RoaXMuc3BhbiA9IHNwYW47XG4gICAgX3RoaXMuaXNUcmFuc2FjdGlvbiA9IHNwYW4gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbjtcbiAgICBfdGhpcy5zcGFuQ29udGV4dCA9IHtcbiAgICAgIGlkOiBzcGFuLmlkLFxuICAgICAgdHJhY2VJZDogc3Bhbi50cmFjZUlkLFxuICAgICAgc2FtcGxlZDogc3Bhbi5zYW1wbGVkXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gU3Bhbi5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9jb250ZXh0ID0gZnVuY3Rpb24gX2NvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3BhbkNvbnRleHQ7XG4gIH07XG5cbiAgX3Byb3RvLl90cmFjZXIgPSBmdW5jdGlvbiBfdHJhY2VyKCkge1xuICAgIHJldHVybiB0aGlzLl9fdHJhY2VyO1xuICB9O1xuXG4gIF9wcm90by5fc2V0T3BlcmF0aW9uTmFtZSA9IGZ1bmN0aW9uIF9zZXRPcGVyYXRpb25OYW1lKG5hbWUpIHtcbiAgICB0aGlzLnNwYW4ubmFtZSA9IG5hbWU7XG4gIH07XG5cbiAgX3Byb3RvLl9hZGRUYWdzID0gZnVuY3Rpb24gX2FkZFRhZ3Moa2V5VmFsdWVQYWlycykge1xuICAgIHZhciB0YWdzID0gZXh0ZW5kKHt9LCBrZXlWYWx1ZVBhaXJzKTtcblxuICAgIGlmICh0YWdzLnR5cGUpIHtcbiAgICAgIHRoaXMuc3Bhbi50eXBlID0gdGFncy50eXBlO1xuICAgICAgZGVsZXRlIHRhZ3MudHlwZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1RyYW5zYWN0aW9uKSB7XG4gICAgICB2YXIgdXNlcklkID0gdGFnc1sndXNlci5pZCddO1xuICAgICAgdmFyIHVzZXJuYW1lID0gdGFnc1sndXNlci51c2VybmFtZSddO1xuICAgICAgdmFyIGVtYWlsID0gdGFnc1sndXNlci5lbWFpbCddO1xuXG4gICAgICBpZiAodXNlcklkIHx8IHVzZXJuYW1lIHx8IGVtYWlsKSB7XG4gICAgICAgIHRoaXMuc3Bhbi5hZGRDb250ZXh0KHtcbiAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgICAgZW1haWw6IGVtYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGVsZXRlIHRhZ3NbJ3VzZXIuaWQnXTtcbiAgICAgICAgZGVsZXRlIHRhZ3NbJ3VzZXIudXNlcm5hbWUnXTtcbiAgICAgICAgZGVsZXRlIHRhZ3NbJ3VzZXIuZW1haWwnXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNwYW4uYWRkTGFiZWxzKHRhZ3MpO1xuICB9O1xuXG4gIF9wcm90by5fbG9nID0gZnVuY3Rpb24gX2xvZyhsb2csIHRpbWVzdGFtcCkge1xuICAgIGlmIChsb2cuZXZlbnQgPT09ICdlcnJvcicpIHtcbiAgICAgIGlmIChsb2dbJ2Vycm9yLm9iamVjdCddKSB7XG4gICAgICAgIHRoaXMuX190cmFjZXIuZXJyb3JMb2dnaW5nLmxvZ0Vycm9yKGxvZ1snZXJyb3Iub2JqZWN0J10pO1xuICAgICAgfSBlbHNlIGlmIChsb2cubWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9fdHJhY2VyLmVycm9yTG9nZ2luZy5sb2dFcnJvcihsb2cubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5fZmluaXNoID0gZnVuY3Rpb24gX2ZpbmlzaChmaW5pc2hUaW1lKSB7XG4gICAgdGhpcy5zcGFuLmVuZCgpO1xuXG4gICAgaWYgKGZpbmlzaFRpbWUpIHtcbiAgICAgIHRoaXMuc3Bhbi5fZW5kID0gZmluaXNoVGltZSAtIGdldFRpbWVPcmlnaW4oKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFNwYW47XG59KG90U3Bhbik7XG5cbmV4cG9ydCBkZWZhdWx0IFNwYW47IiwiZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmltcG9ydCB7IFRyYWNlciBhcyBvdFRyYWNlciB9IGZyb20gJ29wZW50cmFjaW5nL2xpYi90cmFjZXInO1xuaW1wb3J0IHsgUkVGRVJFTkNFX0NISUxEX09GLCBGT1JNQVRfVEVYVF9NQVAsIEZPUk1BVF9IVFRQX0hFQURFUlMsIEZPUk1BVF9CSU5BUlkgfSBmcm9tICdvcGVudHJhY2luZy9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IFNwYW4gYXMgTm9vcFNwYW4gfSBmcm9tICdvcGVudHJhY2luZy9saWIvc3Bhbic7XG5pbXBvcnQgeyBnZXRUaW1lT3JpZ2luLCBmaW5kIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IF9fREVWX18gfSBmcm9tICcuLi9zdGF0ZSc7XG5pbXBvcnQgU3BhbiBmcm9tICcuL3NwYW4nO1xuXG52YXIgVHJhY2VyID0gZnVuY3Rpb24gKF9vdFRyYWNlcikge1xuICBfaW5oZXJpdHNMb29zZShUcmFjZXIsIF9vdFRyYWNlcik7XG5cbiAgZnVuY3Rpb24gVHJhY2VyKHBlcmZvcm1hbmNlTW9uaXRvcmluZywgdHJhbnNhY3Rpb25TZXJ2aWNlLCBsb2dnaW5nU2VydmljZSwgZXJyb3JMb2dnaW5nKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfb3RUcmFjZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLnBlcmZvcm1hbmNlTW9uaXRvcmluZyA9IHBlcmZvcm1hbmNlTW9uaXRvcmluZztcbiAgICBfdGhpcy50cmFuc2FjdGlvblNlcnZpY2UgPSB0cmFuc2FjdGlvblNlcnZpY2U7XG4gICAgX3RoaXMubG9nZ2luZ1NlcnZpY2UgPSBsb2dnaW5nU2VydmljZTtcbiAgICBfdGhpcy5lcnJvckxvZ2dpbmcgPSBlcnJvckxvZ2dpbmc7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFRyYWNlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9zdGFydFNwYW4gPSBmdW5jdGlvbiBfc3RhcnRTcGFuKG5hbWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgc3Bhbk9wdGlvbnMgPSB7XG4gICAgICBtYW5hZ2VkOiB0cnVlXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBzcGFuT3B0aW9ucy50aW1lc3RhbXAgPSBvcHRpb25zLnN0YXJ0VGltZTtcblxuICAgICAgaWYgKG9wdGlvbnMuY2hpbGRPZikge1xuICAgICAgICBzcGFuT3B0aW9ucy5wYXJlbnRJZCA9IG9wdGlvbnMuY2hpbGRPZi5pZDtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5yZWZlcmVuY2VzICYmIG9wdGlvbnMucmVmZXJlbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnJlZmVyZW5jZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmRlYnVnKCdFbGFzdGljIEFQTSBPcGVuVHJhY2luZzogVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHJlZmVyZW5jZXMsIG9ubHkgdGhlIGZpcnN0IGNoaWxkT2YgcmVmZXJlbmNlIHdpbGwgYmUgcmVjb3JkZWQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoaWxkUmVmID0gZmluZChvcHRpb25zLnJlZmVyZW5jZXMsIGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICByZXR1cm4gcmVmLnR5cGUoKSA9PT0gUkVGRVJFTkNFX0NISUxEX09GO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2hpbGRSZWYpIHtcbiAgICAgICAgICBzcGFuT3B0aW9ucy5wYXJlbnRJZCA9IGNoaWxkUmVmLnJlZmVyZW5jZWRDb250ZXh0KCkuaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3BhbjtcbiAgICB2YXIgY3VycmVudFRyYW5zYWN0aW9uID0gdGhpcy50cmFuc2FjdGlvblNlcnZpY2UuZ2V0Q3VycmVudFRyYW5zYWN0aW9uKCk7XG5cbiAgICBpZiAoY3VycmVudFRyYW5zYWN0aW9uKSB7XG4gICAgICBzcGFuID0gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uuc3RhcnRTcGFuKG5hbWUsIHVuZGVmaW5lZCwgc3Bhbk9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGFuID0gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uuc3RhcnRUcmFuc2FjdGlvbihuYW1lLCB1bmRlZmluZWQsIHNwYW5PcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoIXNwYW4pIHtcbiAgICAgIHJldHVybiBuZXcgTm9vcFNwYW4oKTtcbiAgICB9XG5cbiAgICBpZiAoc3Bhbk9wdGlvbnMudGltZXN0YW1wKSB7XG4gICAgICBzcGFuLl9zdGFydCA9IHNwYW5PcHRpb25zLnRpbWVzdGFtcCAtIGdldFRpbWVPcmlnaW4oKTtcbiAgICB9XG5cbiAgICB2YXIgb3RTcGFuID0gbmV3IFNwYW4odGhpcywgc3Bhbik7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRhZ3MpIHtcbiAgICAgIG90U3Bhbi5hZGRUYWdzKG9wdGlvbnMudGFncyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG90U3BhbjtcbiAgfTtcblxuICBfcHJvdG8uX2luamVjdCA9IGZ1bmN0aW9uIF9pbmplY3Qoc3BhbkNvbnRleHQsIGZvcm1hdCwgY2Fycmllcikge1xuICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICBjYXNlIEZPUk1BVF9URVhUX01BUDpcbiAgICAgIGNhc2UgRk9STUFUX0hUVFBfSEVBREVSUzpcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZU1vbml0b3JpbmcuaW5qZWN0RHRIZWFkZXIoc3BhbkNvbnRleHQsIGNhcnJpZXIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGT1JNQVRfQklOQVJZOlxuICAgICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UuZGVidWcoJ0VsYXN0aWMgQVBNIE9wZW5UcmFjaW5nOiBiaW5hcnkgY2FycmllciBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uX2V4dHJhY3QgPSBmdW5jdGlvbiBfZXh0cmFjdChmb3JtYXQsIGNhcnJpZXIpIHtcbiAgICB2YXIgY3R4O1xuXG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgRk9STUFUX1RFWFRfTUFQOlxuICAgICAgY2FzZSBGT1JNQVRfSFRUUF9IRUFERVJTOlxuICAgICAgICBjdHggPSB0aGlzLnBlcmZvcm1hbmNlTW9uaXRvcmluZy5leHRyYWN0RHRIZWFkZXIoY2Fycmllcik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZPUk1BVF9CSU5BUlk6XG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgdGhpcy5sb2dnaW5nU2VydmljZS5kZWJ1ZygnRWxhc3RpYyBBUE0gT3BlblRyYWNpbmc6IGJpbmFyeSBjYXJyaWVyIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKCFjdHgpIHtcbiAgICAgIGN0eCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN0eDtcbiAgfTtcblxuICByZXR1cm4gVHJhY2VyO1xufShvdFRyYWNlcik7XG5cbmV4cG9ydCBkZWZhdWx0IFRyYWNlcjsiLCJpbXBvcnQgeyBnZXREdXJhdGlvbiwgUEVSRiB9IGZyb20gJy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBQQUdFX0xPQUQsIFRSVU5DQVRFRF9UWVBFIH0gZnJvbSAnLi4vY29tbW9uL2NvbnN0YW50cyc7XG52YXIgcGFnZUxvYWRCcmVha2Rvd25zID0gW1snZG9tYWluTG9va3VwU3RhcnQnLCAnZG9tYWluTG9va3VwRW5kJywgJ0ROUyddLCBbJ2Nvbm5lY3RTdGFydCcsICdjb25uZWN0RW5kJywgJ1RDUCddLCBbJ3JlcXVlc3RTdGFydCcsICdyZXNwb25zZVN0YXJ0JywgJ1JlcXVlc3QnXSwgWydyZXNwb25zZVN0YXJ0JywgJ3Jlc3BvbnNlRW5kJywgJ1Jlc3BvbnNlJ10sIFsnZG9tTG9hZGluZycsICdkb21Db21wbGV0ZScsICdQcm9jZXNzaW5nJ10sIFsnbG9hZEV2ZW50U3RhcnQnLCAnbG9hZEV2ZW50RW5kJywgJ0xvYWQnXV07XG5cbmZ1bmN0aW9uIGdldFZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVNlbGZUaW1lKHRyYW5zYWN0aW9uKSB7XG4gIHZhciBzcGFucyA9IHRyYW5zYWN0aW9uLnNwYW5zLFxuICAgICAgX3N0YXJ0ID0gdHJhbnNhY3Rpb24uX3N0YXJ0LFxuICAgICAgX2VuZCA9IHRyYW5zYWN0aW9uLl9lbmQ7XG5cbiAgaWYgKHNwYW5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cmFuc2FjdGlvbi5kdXJhdGlvbigpO1xuICB9XG5cbiAgc3BhbnMuc29ydChmdW5jdGlvbiAoc3BhbjEsIHNwYW4yKSB7XG4gICAgcmV0dXJuIHNwYW4xLl9zdGFydCAtIHNwYW4yLl9zdGFydDtcbiAgfSk7XG4gIHZhciBzcGFuID0gc3BhbnNbMF07XG4gIHZhciBzcGFuRW5kID0gc3Bhbi5fZW5kO1xuICB2YXIgc3BhblN0YXJ0ID0gc3Bhbi5fc3RhcnQ7XG4gIHZhciBsYXN0Q29udGludW91c0VuZCA9IHNwYW5FbmQ7XG4gIHZhciBzZWxmVGltZSA9IHNwYW5TdGFydCAtIF9zdGFydDtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgc3BhbiA9IHNwYW5zW2ldO1xuICAgIHNwYW5TdGFydCA9IHNwYW4uX3N0YXJ0O1xuICAgIHNwYW5FbmQgPSBzcGFuLl9lbmQ7XG5cbiAgICBpZiAoc3BhblN0YXJ0ID4gbGFzdENvbnRpbnVvdXNFbmQpIHtcbiAgICAgIHNlbGZUaW1lICs9IHNwYW5TdGFydCAtIGxhc3RDb250aW51b3VzRW5kO1xuICAgICAgbGFzdENvbnRpbnVvdXNFbmQgPSBzcGFuRW5kO1xuICAgIH0gZWxzZSBpZiAoc3BhbkVuZCA+IGxhc3RDb250aW51b3VzRW5kKSB7XG4gICAgICBsYXN0Q29udGludW91c0VuZCA9IHNwYW5FbmQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxhc3RDb250aW51b3VzRW5kIDwgX2VuZCkge1xuICAgIHNlbGZUaW1lICs9IF9lbmQgLSBsYXN0Q29udGludW91c0VuZDtcbiAgfVxuXG4gIHJldHVybiBzZWxmVGltZTtcbn1cblxuZnVuY3Rpb24gZ3JvdXBTcGFucyh0cmFuc2FjdGlvbikge1xuICB2YXIgc3Bhbk1hcCA9IHt9O1xuICB2YXIgdHJhbnNhY3Rpb25TZWxmVGltZSA9IGNhbGN1bGF0ZVNlbGZUaW1lKHRyYW5zYWN0aW9uKTtcbiAgc3Bhbk1hcFsnYXBwJ10gPSB7XG4gICAgY291bnQ6IDEsXG4gICAgZHVyYXRpb246IHRyYW5zYWN0aW9uU2VsZlRpbWVcbiAgfTtcbiAgdmFyIHNwYW5zID0gdHJhbnNhY3Rpb24uc3BhbnM7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzcGFuID0gc3BhbnNbaV07XG4gICAgdmFyIGR1cmF0aW9uID0gc3Bhbi5kdXJhdGlvbigpO1xuXG4gICAgaWYgKGR1cmF0aW9uID09PSAwIHx8IGR1cmF0aW9uID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciB0eXBlID0gc3Bhbi50eXBlLFxuICAgICAgICBzdWJ0eXBlID0gc3Bhbi5zdWJ0eXBlO1xuICAgIHZhciBrZXkgPSB0eXBlLnJlcGxhY2UoVFJVTkNBVEVEX1RZUEUsICcnKTtcblxuICAgIGlmIChzdWJ0eXBlKSB7XG4gICAgICBrZXkgKz0gJy4nICsgc3VidHlwZTtcbiAgICB9XG5cbiAgICBpZiAoIXNwYW5NYXBba2V5XSkge1xuICAgICAgc3Bhbk1hcFtrZXldID0ge1xuICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgY291bnQ6IDBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgc3Bhbk1hcFtrZXldLmNvdW50Kys7XG4gICAgc3Bhbk1hcFtrZXldLmR1cmF0aW9uICs9IGR1cmF0aW9uO1xuICB9XG5cbiAgcmV0dXJuIHNwYW5NYXA7XG59XG5cbmZ1bmN0aW9uIGdldFNwYW5CcmVha2Rvd24odHJhbnNhY3Rpb25EZXRhaWxzLCBfcmVmKSB7XG4gIHZhciBkZXRhaWxzID0gX3JlZi5kZXRhaWxzLFxuICAgICAgX3JlZiRjb3VudCA9IF9yZWYuY291bnQsXG4gICAgICBjb3VudCA9IF9yZWYkY291bnQgPT09IHZvaWQgMCA/IDEgOiBfcmVmJGNvdW50LFxuICAgICAgZHVyYXRpb24gPSBfcmVmLmR1cmF0aW9uO1xuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbkRldGFpbHMsXG4gICAgc3BhbjogZGV0YWlscyxcbiAgICBzYW1wbGVzOiB7XG4gICAgICAnc3Bhbi5zZWxmX3RpbWUuY291bnQnOiBnZXRWYWx1ZShjb3VudCksXG4gICAgICAnc3Bhbi5zZWxmX3RpbWUuc3VtLnVzJzogZ2V0VmFsdWUoZHVyYXRpb24pXG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FwdHVyZUJyZWFrZG93bih0cmFuc2FjdGlvbiwgdGltaW5ncykge1xuICBpZiAodGltaW5ncyA9PT0gdm9pZCAwKSB7XG4gICAgdGltaW5ncyA9IFBFUkYudGltaW5nO1xuICB9XG5cbiAgdmFyIGJyZWFrZG93bnMgPSBbXTtcbiAgdmFyIHRyRHVyYXRpb24gPSB0cmFuc2FjdGlvbi5kdXJhdGlvbigpO1xuICB2YXIgbmFtZSA9IHRyYW5zYWN0aW9uLm5hbWUsXG4gICAgICB0eXBlID0gdHJhbnNhY3Rpb24udHlwZSxcbiAgICAgIHNhbXBsZWQgPSB0cmFuc2FjdGlvbi5zYW1wbGVkO1xuICB2YXIgdHJhbnNhY3Rpb25EZXRhaWxzID0ge1xuICAgIG5hbWU6IG5hbWUsXG4gICAgdHlwZTogdHlwZVxuICB9O1xuICBicmVha2Rvd25zLnB1c2goe1xuICAgIHRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbkRldGFpbHMsXG4gICAgc2FtcGxlczoge1xuICAgICAgJ3RyYW5zYWN0aW9uLmR1cmF0aW9uLmNvdW50JzogZ2V0VmFsdWUoMSksXG4gICAgICAndHJhbnNhY3Rpb24uZHVyYXRpb24uc3VtLnVzJzogZ2V0VmFsdWUodHJEdXJhdGlvbiksXG4gICAgICAndHJhbnNhY3Rpb24uYnJlYWtkb3duLmNvdW50JzogZ2V0VmFsdWUoc2FtcGxlZCA/IDEgOiAwKVxuICAgIH1cbiAgfSk7XG5cbiAgaWYgKCFzYW1wbGVkKSB7XG4gICAgcmV0dXJuIGJyZWFrZG93bnM7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gUEFHRV9MT0FEICYmIHRpbWluZ3MpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VMb2FkQnJlYWtkb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGN1cnJlbnQgPSBwYWdlTG9hZEJyZWFrZG93bnNbaV07XG4gICAgICB2YXIgc3RhcnQgPSB0aW1pbmdzW2N1cnJlbnRbMF1dO1xuICAgICAgdmFyIGVuZCA9IHRpbWluZ3NbY3VycmVudFsxXV07XG4gICAgICB2YXIgZHVyYXRpb24gPSBnZXREdXJhdGlvbihzdGFydCwgZW5kKTtcblxuICAgICAgaWYgKGR1cmF0aW9uID09PSAwIHx8IGR1cmF0aW9uID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrZG93bnMucHVzaChnZXRTcGFuQnJlYWtkb3duKHRyYW5zYWN0aW9uRGV0YWlscywge1xuICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgdHlwZTogY3VycmVudFsyXVxuICAgICAgICB9LFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25cbiAgICAgIH0pKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNwYW5NYXAgPSBncm91cFNwYW5zKHRyYW5zYWN0aW9uKTtcbiAgICBPYmplY3Qua2V5cyhzcGFuTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBfa2V5JHNwbGl0ID0ga2V5LnNwbGl0KCcuJyksXG4gICAgICAgICAgdHlwZSA9IF9rZXkkc3BsaXRbMF0sXG4gICAgICAgICAgc3VidHlwZSA9IF9rZXkkc3BsaXRbMV07XG5cbiAgICAgIHZhciBfc3Bhbk1hcCRrZXkgPSBzcGFuTWFwW2tleV0sXG4gICAgICAgICAgZHVyYXRpb24gPSBfc3Bhbk1hcCRrZXkuZHVyYXRpb24sXG4gICAgICAgICAgY291bnQgPSBfc3Bhbk1hcCRrZXkuY291bnQ7XG4gICAgICBicmVha2Rvd25zLnB1c2goZ2V0U3BhbkJyZWFrZG93bih0cmFuc2FjdGlvbkRldGFpbHMsIHtcbiAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgc3VidHlwZTogc3VidHlwZVxuICAgICAgICB9LFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgIGNvdW50OiBjb3VudFxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGJyZWFrZG93bnM7XG59IiwiaW1wb3J0IFNwYW4gZnJvbSAnLi9zcGFuJztcbmltcG9ydCB7IFJFU09VUkNFX0lOSVRJQVRPUl9UWVBFUywgTUFYX1NQQU5fRFVSQVRJT04sIFVTRVJfVElNSU5HX1RIUkVTSE9MRCwgUEFHRV9MT0FELCBSRVNPVVJDRSwgTUVBU1VSRSB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgc3RyaXBRdWVyeVN0cmluZ0Zyb21VcmwsIFBFUkYsIGlzUGVyZlRpbWVsaW5lU3VwcG9ydGVkIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IHN0YXRlIH0gZnJvbSAnLi4vc3RhdGUnO1xudmFyIGV2ZW50UGFpcnMgPSBbWydkb21haW5Mb29rdXBTdGFydCcsICdkb21haW5Mb29rdXBFbmQnLCAnRG9tYWluIGxvb2t1cCddLCBbJ2Nvbm5lY3RTdGFydCcsICdjb25uZWN0RW5kJywgJ01ha2luZyBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciddLCBbJ3JlcXVlc3RTdGFydCcsICdyZXNwb25zZUVuZCcsICdSZXF1ZXN0aW5nIGFuZCByZWNlaXZpbmcgdGhlIGRvY3VtZW50J10sIFsnZG9tTG9hZGluZycsICdkb21JbnRlcmFjdGl2ZScsICdQYXJzaW5nIHRoZSBkb2N1bWVudCwgZXhlY3V0aW5nIHN5bmMuIHNjcmlwdHMnXSwgWydkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCcsICdkb21Db250ZW50TG9hZGVkRXZlbnRFbmQnLCAnRmlyZSBcIkRPTUNvbnRlbnRMb2FkZWRcIiBldmVudCddLCBbJ2xvYWRFdmVudFN0YXJ0JywgJ2xvYWRFdmVudEVuZCcsICdGaXJlIFwibG9hZFwiIGV2ZW50J11dO1xuXG5mdW5jdGlvbiBzaG91bGRDcmVhdGVTcGFuKHN0YXJ0LCBlbmQsIHRyU3RhcnQsIHRyRW5kLCBiYXNlVGltZSkge1xuICBpZiAoYmFzZVRpbWUgPT09IHZvaWQgMCkge1xuICAgIGJhc2VUaW1lID0gMDtcbiAgfVxuXG4gIHJldHVybiB0eXBlb2Ygc3RhcnQgPT09ICdudW1iZXInICYmIHR5cGVvZiBlbmQgPT09ICdudW1iZXInICYmIHN0YXJ0ID49IGJhc2VUaW1lICYmIGVuZCA+IHN0YXJ0ICYmIHN0YXJ0IC0gYmFzZVRpbWUgPj0gdHJTdGFydCAmJiBlbmQgLSBiYXNlVGltZSA8PSB0ckVuZCAmJiBlbmQgLSBzdGFydCA8IE1BWF9TUEFOX0RVUkFUSU9OICYmIHN0YXJ0IC0gYmFzZVRpbWUgPCBNQVhfU1BBTl9EVVJBVElPTiAmJiBlbmQgLSBiYXNlVGltZSA8IE1BWF9TUEFOX0RVUkFUSU9OO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOYXZpZ2F0aW9uVGltaW5nU3BhbnModGltaW5ncywgYmFzZVRpbWUsIHRyU3RhcnQsIHRyRW5kKSB7XG4gIHZhciBzcGFucyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnRQYWlycy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzdGFydCA9IHRpbWluZ3NbZXZlbnRQYWlyc1tpXVswXV07XG4gICAgdmFyIGVuZCA9IHRpbWluZ3NbZXZlbnRQYWlyc1tpXVsxXV07XG5cbiAgICBpZiAoIXNob3VsZENyZWF0ZVNwYW4oc3RhcnQsIGVuZCwgdHJTdGFydCwgdHJFbmQsIGJhc2VUaW1lKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIHNwYW4gPSBuZXcgU3BhbihldmVudFBhaXJzW2ldWzJdLCAnaGFyZC1uYXZpZ2F0aW9uLmJyb3dzZXItdGltaW5nJyk7XG4gICAgdmFyIGRhdGEgPSBudWxsO1xuXG4gICAgaWYgKGV2ZW50UGFpcnNbaV1bMF0gPT09ICdyZXF1ZXN0U3RhcnQnKSB7XG4gICAgICBzcGFuLnBhZ2VSZXNwb25zZSA9IHRydWU7XG4gICAgICBkYXRhID0ge1xuICAgICAgICB1cmw6IGxvY2F0aW9uLm9yaWdpblxuICAgICAgfTtcbiAgICB9XG5cbiAgICBzcGFuLl9zdGFydCA9IHN0YXJ0IC0gYmFzZVRpbWU7XG4gICAgc3Bhbi5lbmQoZW5kIC0gYmFzZVRpbWUsIGRhdGEpO1xuICAgIHNwYW5zLnB1c2goc3Bhbik7XG4gIH1cblxuICByZXR1cm4gc3BhbnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlc291cmNlVGltaW5nU3BhbihyZXNvdXJjZVRpbWluZ0VudHJ5KSB7XG4gIHZhciBuYW1lID0gcmVzb3VyY2VUaW1pbmdFbnRyeS5uYW1lLFxuICAgICAgaW5pdGlhdG9yVHlwZSA9IHJlc291cmNlVGltaW5nRW50cnkuaW5pdGlhdG9yVHlwZSxcbiAgICAgIHN0YXJ0VGltZSA9IHJlc291cmNlVGltaW5nRW50cnkuc3RhcnRUaW1lLFxuICAgICAgcmVzcG9uc2VFbmQgPSByZXNvdXJjZVRpbWluZ0VudHJ5LnJlc3BvbnNlRW5kO1xuICB2YXIga2luZCA9ICdyZXNvdXJjZSc7XG5cbiAgaWYgKGluaXRpYXRvclR5cGUpIHtcbiAgICBraW5kICs9ICcuJyArIGluaXRpYXRvclR5cGU7XG4gIH1cblxuICB2YXIgc3Bhbk5hbWUgPSBzdHJpcFF1ZXJ5U3RyaW5nRnJvbVVybChuYW1lKTtcbiAgdmFyIHNwYW4gPSBuZXcgU3BhbihzcGFuTmFtZSwga2luZCk7XG4gIHNwYW4uX3N0YXJ0ID0gc3RhcnRUaW1lO1xuICBzcGFuLmVuZChyZXNwb25zZUVuZCwge1xuICAgIHVybDogbmFtZSxcbiAgICBlbnRyeTogcmVzb3VyY2VUaW1pbmdFbnRyeVxuICB9KTtcbiAgcmV0dXJuIHNwYW47XG59XG5cbmZ1bmN0aW9uIGlzQ2FwdHVyZWRCeVBhdGNoaW5nKHJlc291cmNlU3RhcnRUaW1lLCByZXF1ZXN0UGF0Y2hUaW1lKSB7XG4gIHJldHVybiByZXF1ZXN0UGF0Y2hUaW1lICE9IG51bGwgJiYgcmVzb3VyY2VTdGFydFRpbWUgPiByZXF1ZXN0UGF0Y2hUaW1lO1xufVxuXG5mdW5jdGlvbiBpc0ludGFrZUFQSUVuZHBvaW50KHVybCkge1xuICByZXR1cm4gL2ludGFrZVxcL3ZcXGQrXFwvcnVtXFwvZXZlbnRzLy50ZXN0KHVybCk7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVJlc291cmNlVGltaW5nU3BhbnMoZW50cmllcywgcmVxdWVzdFBhdGNoVGltZSwgdHJTdGFydCwgdHJFbmQpIHtcbiAgdmFyIHNwYW5zID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9lbnRyaWVzJGkgPSBlbnRyaWVzW2ldLFxuICAgICAgICBpbml0aWF0b3JUeXBlID0gX2VudHJpZXMkaS5pbml0aWF0b3JUeXBlLFxuICAgICAgICBuYW1lID0gX2VudHJpZXMkaS5uYW1lLFxuICAgICAgICBzdGFydFRpbWUgPSBfZW50cmllcyRpLnN0YXJ0VGltZSxcbiAgICAgICAgcmVzcG9uc2VFbmQgPSBfZW50cmllcyRpLnJlc3BvbnNlRW5kO1xuXG4gICAgaWYgKFJFU09VUkNFX0lOSVRJQVRPUl9UWVBFUy5pbmRleE9mKGluaXRpYXRvclR5cGUpID09PSAtMSB8fCBuYW1lID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICgoaW5pdGlhdG9yVHlwZSA9PT0gJ3htbGh0dHByZXF1ZXN0JyB8fCBpbml0aWF0b3JUeXBlID09PSAnZmV0Y2gnKSAmJiAoaXNJbnRha2VBUElFbmRwb2ludChuYW1lKSB8fCBpc0NhcHR1cmVkQnlQYXRjaGluZyhzdGFydFRpbWUsIHJlcXVlc3RQYXRjaFRpbWUpKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHNob3VsZENyZWF0ZVNwYW4oc3RhcnRUaW1lLCByZXNwb25zZUVuZCwgdHJTdGFydCwgdHJFbmQpKSB7XG4gICAgICBzcGFucy5wdXNoKGNyZWF0ZVJlc291cmNlVGltaW5nU3BhbihlbnRyaWVzW2ldKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHNwYW5zO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVVc2VyVGltaW5nU3BhbnMoZW50cmllcywgdHJTdGFydCwgdHJFbmQpIHtcbiAgdmFyIHVzZXJUaW1pbmdTcGFucyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfZW50cmllcyRpMiA9IGVudHJpZXNbaV0sXG4gICAgICAgIG5hbWUgPSBfZW50cmllcyRpMi5uYW1lLFxuICAgICAgICBzdGFydFRpbWUgPSBfZW50cmllcyRpMi5zdGFydFRpbWUsXG4gICAgICAgIGR1cmF0aW9uID0gX2VudHJpZXMkaTIuZHVyYXRpb247XG4gICAgdmFyIGVuZCA9IHN0YXJ0VGltZSArIGR1cmF0aW9uO1xuXG4gICAgaWYgKGR1cmF0aW9uIDw9IFVTRVJfVElNSU5HX1RIUkVTSE9MRCB8fCAhc2hvdWxkQ3JlYXRlU3BhbihzdGFydFRpbWUsIGVuZCwgdHJTdGFydCwgdHJFbmQpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIga2luZCA9ICdhcHAnO1xuICAgIHZhciBzcGFuID0gbmV3IFNwYW4obmFtZSwga2luZCk7XG4gICAgc3Bhbi5fc3RhcnQgPSBzdGFydFRpbWU7XG4gICAgc3Bhbi5lbmQoZW5kKTtcbiAgICB1c2VyVGltaW5nU3BhbnMucHVzaChzcGFuKTtcbiAgfVxuXG4gIHJldHVybiB1c2VyVGltaW5nU3BhbnM7XG59XG5cbnZhciBOQVZJR0FUSU9OX1RJTUlOR19NQVJLUyA9IFsnZmV0Y2hTdGFydCcsICdkb21haW5Mb29rdXBTdGFydCcsICdkb21haW5Mb29rdXBFbmQnLCAnY29ubmVjdFN0YXJ0JywgJ2Nvbm5lY3RFbmQnLCAncmVxdWVzdFN0YXJ0JywgJ3Jlc3BvbnNlU3RhcnQnLCAncmVzcG9uc2VFbmQnLCAnZG9tTG9hZGluZycsICdkb21JbnRlcmFjdGl2ZScsICdkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCcsICdkb21Db250ZW50TG9hZGVkRXZlbnRFbmQnLCAnZG9tQ29tcGxldGUnLCAnbG9hZEV2ZW50U3RhcnQnLCAnbG9hZEV2ZW50RW5kJ107XG52YXIgQ09NUFJFU1NFRF9OQVZfVElNSU5HX01BUktTID0gWydmcycsICdscycsICdsZScsICdjcycsICdjZScsICdxcycsICdycycsICdyZScsICdkbCcsICdkaScsICdkcycsICdkZScsICdkYycsICdlcycsICdlZSddO1xuXG5mdW5jdGlvbiBnZXROYXZpZ2F0aW9uVGltaW5nTWFya3ModGltaW5nKSB7XG4gIHZhciBmZXRjaFN0YXJ0ID0gdGltaW5nLmZldGNoU3RhcnQsXG4gICAgICBuYXZpZ2F0aW9uU3RhcnQgPSB0aW1pbmcubmF2aWdhdGlvblN0YXJ0LFxuICAgICAgcmVzcG9uc2VTdGFydCA9IHRpbWluZy5yZXNwb25zZVN0YXJ0LFxuICAgICAgcmVzcG9uc2VFbmQgPSB0aW1pbmcucmVzcG9uc2VFbmQ7XG5cbiAgaWYgKGZldGNoU3RhcnQgPj0gbmF2aWdhdGlvblN0YXJ0ICYmIHJlc3BvbnNlU3RhcnQgPj0gZmV0Y2hTdGFydCAmJiByZXNwb25zZUVuZCA+PSByZXNwb25zZVN0YXJ0KSB7XG4gICAgdmFyIG1hcmtzID0ge307XG4gICAgTkFWSUdBVElPTl9USU1JTkdfTUFSS1MuZm9yRWFjaChmdW5jdGlvbiAodGltaW5nS2V5KSB7XG4gICAgICB2YXIgbSA9IHRpbWluZ1t0aW1pbmdLZXldO1xuXG4gICAgICBpZiAobSAmJiBtID49IGZldGNoU3RhcnQpIHtcbiAgICAgICAgbWFya3NbdGltaW5nS2V5XSA9IHBhcnNlSW50KG0gLSBmZXRjaFN0YXJ0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbWFya3M7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0UGFnZUxvYWRNYXJrcyh0aW1pbmcpIHtcbiAgdmFyIG1hcmtzID0gZ2V0TmF2aWdhdGlvblRpbWluZ01hcmtzKHRpbWluZyk7XG5cbiAgaWYgKG1hcmtzID09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmF2aWdhdGlvblRpbWluZzogbWFya3MsXG4gICAgYWdlbnQ6IHtcbiAgICAgIHRpbWVUb0ZpcnN0Qnl0ZTogbWFya3MucmVzcG9uc2VTdGFydCxcbiAgICAgIGRvbUludGVyYWN0aXZlOiBtYXJrcy5kb21JbnRlcmFjdGl2ZSxcbiAgICAgIGRvbUNvbXBsZXRlOiBtYXJrcy5kb21Db21wbGV0ZVxuICAgIH1cbiAgfTtcbn1cblxuZnVuY3Rpb24gY2FwdHVyZU5hdmlnYXRpb24odHJhbnNhY3Rpb24pIHtcbiAgaWYgKCF0cmFuc2FjdGlvbi5jYXB0dXJlVGltaW5ncykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0ckVuZCA9IHRyYW5zYWN0aW9uLl9lbmQ7XG5cbiAgaWYgKHRyYW5zYWN0aW9uLnR5cGUgPT09IFBBR0VfTE9BRCkge1xuICAgIGlmICh0cmFuc2FjdGlvbi5tYXJrcyAmJiB0cmFuc2FjdGlvbi5tYXJrcy5jdXN0b20pIHtcbiAgICAgIHZhciBjdXN0b21NYXJrcyA9IHRyYW5zYWN0aW9uLm1hcmtzLmN1c3RvbTtcbiAgICAgIE9iamVjdC5rZXlzKGN1c3RvbU1hcmtzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgY3VzdG9tTWFya3Nba2V5XSArPSB0cmFuc2FjdGlvbi5fc3RhcnQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB2YXIgdHJTdGFydCA9IDA7XG4gICAgdHJhbnNhY3Rpb24uX3N0YXJ0ID0gdHJTdGFydDtcbiAgICB2YXIgdGltaW5ncyA9IFBFUkYudGltaW5nO1xuICAgIGNyZWF0ZU5hdmlnYXRpb25UaW1pbmdTcGFucyh0aW1pbmdzLCB0aW1pbmdzLmZldGNoU3RhcnQsIHRyU3RhcnQsIHRyRW5kKS5mb3JFYWNoKGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICBzcGFuLnRyYWNlSWQgPSB0cmFuc2FjdGlvbi50cmFjZUlkO1xuICAgICAgc3Bhbi5zYW1wbGVkID0gdHJhbnNhY3Rpb24uc2FtcGxlZDtcblxuICAgICAgaWYgKHNwYW4ucGFnZVJlc3BvbnNlICYmIHRyYW5zYWN0aW9uLm9wdGlvbnMucGFnZUxvYWRTcGFuSWQpIHtcbiAgICAgICAgc3Bhbi5pZCA9IHRyYW5zYWN0aW9uLm9wdGlvbnMucGFnZUxvYWRTcGFuSWQ7XG4gICAgICB9XG5cbiAgICAgIHRyYW5zYWN0aW9uLnNwYW5zLnB1c2goc3Bhbik7XG4gICAgfSk7XG4gICAgdHJhbnNhY3Rpb24uYWRkTWFya3MoZ2V0UGFnZUxvYWRNYXJrcyh0aW1pbmdzKSk7XG4gIH1cblxuICBpZiAoaXNQZXJmVGltZWxpbmVTdXBwb3J0ZWQoKSkge1xuICAgIHZhciBfdHJTdGFydCA9IHRyYW5zYWN0aW9uLl9zdGFydDtcbiAgICB2YXIgcmVzb3VyY2VFbnRyaWVzID0gUEVSRi5nZXRFbnRyaWVzQnlUeXBlKFJFU09VUkNFKTtcbiAgICBjcmVhdGVSZXNvdXJjZVRpbWluZ1NwYW5zKHJlc291cmNlRW50cmllcywgc3RhdGUuYm9vdHN0cmFwVGltZSwgX3RyU3RhcnQsIHRyRW5kKS5mb3JFYWNoKGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICByZXR1cm4gdHJhbnNhY3Rpb24uc3BhbnMucHVzaChzcGFuKTtcbiAgICB9KTtcbiAgICB2YXIgdXNlckVudHJpZXMgPSBQRVJGLmdldEVudHJpZXNCeVR5cGUoTUVBU1VSRSk7XG4gICAgY3JlYXRlVXNlclRpbWluZ1NwYW5zKHVzZXJFbnRyaWVzLCBfdHJTdGFydCwgdHJFbmQpLmZvckVhY2goZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgIHJldHVybiB0cmFuc2FjdGlvbi5zcGFucy5wdXNoKHNwYW4pO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IGdldFBhZ2VMb2FkTWFya3MsIGNhcHR1cmVOYXZpZ2F0aW9uLCBjcmVhdGVOYXZpZ2F0aW9uVGltaW5nU3BhbnMsIGNyZWF0ZVJlc291cmNlVGltaW5nU3BhbnMsIGNyZWF0ZVVzZXJUaW1pbmdTcGFucywgTkFWSUdBVElPTl9USU1JTkdfTUFSS1MsIENPTVBSRVNTRURfTkFWX1RJTUlOR19NQVJLUyB9OyIsImltcG9ydCBQZXJmb3JtYW5jZU1vbml0b3JpbmcgZnJvbSAnLi9wZXJmb3JtYW5jZS1tb25pdG9yaW5nJztcbmltcG9ydCBUcmFuc2FjdGlvblNlcnZpY2UgZnJvbSAnLi90cmFuc2FjdGlvbi1zZXJ2aWNlJztcbmltcG9ydCB7IEFQTV9TRVJWRVIsIENPTkZJR19TRVJWSUNFLCBMT0dHSU5HX1NFUlZJQ0UsIFRSQU5TQUNUSU9OX1NFUlZJQ0UsIFBFUkZPUk1BTkNFX01PTklUT1JJTkcgfSBmcm9tICcuLi9jb21tb24vY29uc3RhbnRzJztcbmltcG9ydCB7IHNlcnZpY2VDcmVhdG9ycyB9IGZyb20gJy4uL2NvbW1vbi9zZXJ2aWNlLWZhY3RvcnknO1xuXG5mdW5jdGlvbiByZWdpc3RlclNlcnZpY2VzKCkge1xuICBzZXJ2aWNlQ3JlYXRvcnNbVFJBTlNBQ1RJT05fU0VSVklDRV0gPSBmdW5jdGlvbiAoc2VydmljZUZhY3RvcnkpIHtcbiAgICB2YXIgX3NlcnZpY2VGYWN0b3J5JGdldFNlID0gc2VydmljZUZhY3RvcnkuZ2V0U2VydmljZShbTE9HR0lOR19TRVJWSUNFLCBDT05GSUdfU0VSVklDRV0pLFxuICAgICAgICBsb2dnaW5nU2VydmljZSA9IF9zZXJ2aWNlRmFjdG9yeSRnZXRTZVswXSxcbiAgICAgICAgY29uZmlnU2VydmljZSA9IF9zZXJ2aWNlRmFjdG9yeSRnZXRTZVsxXTtcblxuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25TZXJ2aWNlKGxvZ2dpbmdTZXJ2aWNlLCBjb25maWdTZXJ2aWNlKTtcbiAgfTtcblxuICBzZXJ2aWNlQ3JlYXRvcnNbUEVSRk9STUFOQ0VfTU9OSVRPUklOR10gPSBmdW5jdGlvbiAoc2VydmljZUZhY3RvcnkpIHtcbiAgICB2YXIgX3NlcnZpY2VGYWN0b3J5JGdldFNlMiA9IHNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoW0FQTV9TRVJWRVIsIENPTkZJR19TRVJWSUNFLCBMT0dHSU5HX1NFUlZJQ0UsIFRSQU5TQUNUSU9OX1NFUlZJQ0VdKSxcbiAgICAgICAgYXBtU2VydmVyID0gX3NlcnZpY2VGYWN0b3J5JGdldFNlMlswXSxcbiAgICAgICAgY29uZmlnU2VydmljZSA9IF9zZXJ2aWNlRmFjdG9yeSRnZXRTZTJbMV0sXG4gICAgICAgIGxvZ2dpbmdTZXJ2aWNlID0gX3NlcnZpY2VGYWN0b3J5JGdldFNlMlsyXSxcbiAgICAgICAgdHJhbnNhY3Rpb25TZXJ2aWNlID0gX3NlcnZpY2VGYWN0b3J5JGdldFNlMlszXTtcblxuICAgIHJldHVybiBuZXcgUGVyZm9ybWFuY2VNb25pdG9yaW5nKGFwbVNlcnZlciwgY29uZmlnU2VydmljZSwgbG9nZ2luZ1NlcnZpY2UsIHRyYW5zYWN0aW9uU2VydmljZSk7XG4gIH07XG59XG5cbmV4cG9ydCB7IHJlZ2lzdGVyU2VydmljZXMgfTsiLCJpbXBvcnQgeyBMT05HX1RBU0ssIExBUkdFU1RfQ09OVEVOVEZVTF9QQUlOVCwgRklSU1RfQ09OVEVOVEZVTF9QQUlOVCwgRklSU1RfSU5QVVQsIExBWU9VVF9TSElGVCB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgbm9vcCwgUEVSRiB9IGZyb20gJy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgU3BhbiBmcm9tICcuL3NwYW4nO1xuZXhwb3J0IHZhciBtZXRyaWNzID0ge1xuICBmaWQ6IDAsXG4gIGZjcDogMCxcbiAgdGJ0OiB7XG4gICAgc3RhcnQ6IEluZmluaXR5LFxuICAgIGR1cmF0aW9uOiAwXG4gIH0sXG4gIGNsczoge1xuICAgIHNjb3JlOiAwLFxuICAgIGZpcnN0RW50cnlUaW1lOiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgcHJldkVudHJ5VGltZTogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFxuICAgIGN1cnJlbnRTZXNzaW9uU2NvcmU6IDBcbiAgfSxcbiAgbG9uZ3Rhc2s6IHtcbiAgICBjb3VudDogMCxcbiAgICBkdXJhdGlvbjogMCxcbiAgICBtYXg6IDBcbiAgfVxufTtcbnZhciBMT05HX1RBU0tfVEhSRVNIT0xEID0gNTA7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9uZ1Rhc2tTcGFucyhsb25ndGFza3MsIGFnZykge1xuICB2YXIgc3BhbnMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmd0YXNrcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfbG9uZ3Rhc2tzJGkgPSBsb25ndGFza3NbaV0sXG4gICAgICAgIG5hbWUgPSBfbG9uZ3Rhc2tzJGkubmFtZSxcbiAgICAgICAgc3RhcnRUaW1lID0gX2xvbmd0YXNrcyRpLnN0YXJ0VGltZSxcbiAgICAgICAgZHVyYXRpb24gPSBfbG9uZ3Rhc2tzJGkuZHVyYXRpb24sXG4gICAgICAgIGF0dHJpYnV0aW9uID0gX2xvbmd0YXNrcyRpLmF0dHJpYnV0aW9uO1xuICAgIHZhciBlbmQgPSBzdGFydFRpbWUgKyBkdXJhdGlvbjtcbiAgICB2YXIgc3BhbiA9IG5ldyBTcGFuKFwiTG9uZ3Rhc2soXCIgKyBuYW1lICsgXCIpXCIsIExPTkdfVEFTSywge1xuICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWVcbiAgICB9KTtcbiAgICBhZ2cuY291bnQrKztcbiAgICBhZ2cuZHVyYXRpb24gKz0gZHVyYXRpb247XG4gICAgYWdnLm1heCA9IE1hdGgubWF4KGR1cmF0aW9uLCBhZ2cubWF4KTtcblxuICAgIGlmIChhdHRyaWJ1dGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0aW9uJCA9IGF0dHJpYnV0aW9uWzBdLFxuICAgICAgICAgIF9uYW1lID0gX2F0dHJpYnV0aW9uJC5uYW1lLFxuICAgICAgICAgIGNvbnRhaW5lclR5cGUgPSBfYXR0cmlidXRpb24kLmNvbnRhaW5lclR5cGUsXG4gICAgICAgICAgY29udGFpbmVyTmFtZSA9IF9hdHRyaWJ1dGlvbiQuY29udGFpbmVyTmFtZSxcbiAgICAgICAgICBjb250YWluZXJJZCA9IF9hdHRyaWJ1dGlvbiQuY29udGFpbmVySWQ7XG4gICAgICB2YXIgY3VzdG9tQ29udGV4dCA9IHtcbiAgICAgICAgYXR0cmlidXRpb246IF9uYW1lLFxuICAgICAgICB0eXBlOiBjb250YWluZXJUeXBlXG4gICAgICB9O1xuXG4gICAgICBpZiAoY29udGFpbmVyTmFtZSkge1xuICAgICAgICBjdXN0b21Db250ZXh0Lm5hbWUgPSBjb250YWluZXJOYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29udGFpbmVySWQpIHtcbiAgICAgICAgY3VzdG9tQ29udGV4dC5pZCA9IGNvbnRhaW5lcklkO1xuICAgICAgfVxuXG4gICAgICBzcGFuLmFkZENvbnRleHQoe1xuICAgICAgICBjdXN0b206IGN1c3RvbUNvbnRleHRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNwYW4uZW5kKGVuZCk7XG4gICAgc3BhbnMucHVzaChzcGFuKTtcbiAgfVxuXG4gIHJldHVybiBzcGFucztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGaXJzdElucHV0RGVsYXlTcGFuKGZpZEVudHJpZXMpIHtcbiAgdmFyIGZpcnN0SW5wdXQgPSBmaWRFbnRyaWVzWzBdO1xuXG4gIGlmIChmaXJzdElucHV0KSB7XG4gICAgdmFyIHN0YXJ0VGltZSA9IGZpcnN0SW5wdXQuc3RhcnRUaW1lLFxuICAgICAgICBwcm9jZXNzaW5nU3RhcnQgPSBmaXJzdElucHV0LnByb2Nlc3NpbmdTdGFydDtcbiAgICB2YXIgc3BhbiA9IG5ldyBTcGFuKCdGaXJzdCBJbnB1dCBEZWxheScsIEZJUlNUX0lOUFVULCB7XG4gICAgICBzdGFydFRpbWU6IHN0YXJ0VGltZVxuICAgIH0pO1xuICAgIHNwYW4uZW5kKHByb2Nlc3NpbmdTdGFydCk7XG4gICAgcmV0dXJuIHNwYW47XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUb3RhbEJsb2NraW5nVGltZVNwYW4odGJ0T2JqZWN0KSB7XG4gIHZhciBzdGFydCA9IHRidE9iamVjdC5zdGFydCxcbiAgICAgIGR1cmF0aW9uID0gdGJ0T2JqZWN0LmR1cmF0aW9uO1xuICB2YXIgdGJ0U3BhbiA9IG5ldyBTcGFuKCdUb3RhbCBCbG9ja2luZyBUaW1lJywgTE9OR19UQVNLLCB7XG4gICAgc3RhcnRUaW1lOiBzdGFydFxuICB9KTtcbiAgdGJ0U3Bhbi5lbmQoc3RhcnQgKyBkdXJhdGlvbik7XG4gIHJldHVybiB0YnRTcGFuO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVRvdGFsQmxvY2tpbmdUaW1lKGxvbmd0YXNrRW50cmllcykge1xuICBsb25ndGFza0VudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICB2YXIgbmFtZSA9IGVudHJ5Lm5hbWUsXG4gICAgICAgIHN0YXJ0VGltZSA9IGVudHJ5LnN0YXJ0VGltZSxcbiAgICAgICAgZHVyYXRpb24gPSBlbnRyeS5kdXJhdGlvbjtcblxuICAgIGlmIChzdGFydFRpbWUgPCBtZXRyaWNzLmZjcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChuYW1lICE9PSAnc2VsZicgJiYgbmFtZS5pbmRleE9mKCdzYW1lLW9yaWdpbicpID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1ldHJpY3MudGJ0LnN0YXJ0ID0gTWF0aC5taW4obWV0cmljcy50YnQuc3RhcnQsIHN0YXJ0VGltZSk7XG4gICAgdmFyIGJsb2NraW5nVGltZSA9IGR1cmF0aW9uIC0gTE9OR19UQVNLX1RIUkVTSE9MRDtcblxuICAgIGlmIChibG9ja2luZ1RpbWUgPiAwKSB7XG4gICAgICBtZXRyaWNzLnRidC5kdXJhdGlvbiArPSBibG9ja2luZ1RpbWU7XG4gICAgfVxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDdW11bGF0aXZlTGF5b3V0U2hpZnQoY2xzRW50cmllcykge1xuICBjbHNFbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgaWYgKCFlbnRyeS5oYWRSZWNlbnRJbnB1dCAmJiBlbnRyeS52YWx1ZSkge1xuICAgICAgdmFyIHNob3VsZENyZWF0ZU5ld1Nlc3Npb24gPSBlbnRyeS5zdGFydFRpbWUgLSBtZXRyaWNzLmNscy5maXJzdEVudHJ5VGltZSA+IDUwMDAgfHwgZW50cnkuc3RhcnRUaW1lIC0gbWV0cmljcy5jbHMucHJldkVudHJ5VGltZSA+IDEwMDA7XG5cbiAgICAgIGlmIChzaG91bGRDcmVhdGVOZXdTZXNzaW9uKSB7XG4gICAgICAgIG1ldHJpY3MuY2xzLmZpcnN0RW50cnlUaW1lID0gZW50cnkuc3RhcnRUaW1lO1xuICAgICAgICBtZXRyaWNzLmNscy5jdXJyZW50U2Vzc2lvblNjb3JlID0gMDtcbiAgICAgIH1cblxuICAgICAgbWV0cmljcy5jbHMucHJldkVudHJ5VGltZSA9IGVudHJ5LnN0YXJ0VGltZTtcbiAgICAgIG1ldHJpY3MuY2xzLmN1cnJlbnRTZXNzaW9uU2NvcmUgKz0gZW50cnkudmFsdWU7XG4gICAgICBtZXRyaWNzLmNscy5zY29yZSA9IE1hdGgubWF4KG1ldHJpY3MuY2xzLnNjb3JlLCBtZXRyaWNzLmNscy5jdXJyZW50U2Vzc2lvblNjb3JlKTtcbiAgICB9XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVPYnNlcnZlckVudHJpZXMobGlzdCwgX3JlZikge1xuICB2YXIgaXNIYXJkTmF2aWdhdGlvbiA9IF9yZWYuaXNIYXJkTmF2aWdhdGlvbixcbiAgICAgIHRyU3RhcnQgPSBfcmVmLnRyU3RhcnQ7XG4gIHZhciBsb25ndGFza0VudHJpZXMgPSBsaXN0LmdldEVudHJpZXNCeVR5cGUoTE9OR19UQVNLKS5maWx0ZXIoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgcmV0dXJuIGVudHJ5LnN0YXJ0VGltZSA+PSB0clN0YXJ0O1xuICB9KTtcbiAgdmFyIGxvbmdUYXNrU3BhbnMgPSBjcmVhdGVMb25nVGFza1NwYW5zKGxvbmd0YXNrRW50cmllcywgbWV0cmljcy5sb25ndGFzayk7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgc3BhbnM6IGxvbmdUYXNrU3BhbnMsXG4gICAgbWFya3M6IHt9XG4gIH07XG5cbiAgaWYgKCFpc0hhcmROYXZpZ2F0aW9uKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHZhciBsY3BFbnRyaWVzID0gbGlzdC5nZXRFbnRyaWVzQnlUeXBlKExBUkdFU1RfQ09OVEVOVEZVTF9QQUlOVCk7XG4gIHZhciBsYXN0TGNwRW50cnkgPSBsY3BFbnRyaWVzW2xjcEVudHJpZXMubGVuZ3RoIC0gMV07XG5cbiAgaWYgKGxhc3RMY3BFbnRyeSkge1xuICAgIHZhciBsY3AgPSBwYXJzZUludChsYXN0TGNwRW50cnkuc3RhcnRUaW1lKTtcbiAgICBtZXRyaWNzLmxjcCA9IGxjcDtcbiAgICByZXN1bHQubWFya3MubGFyZ2VzdENvbnRlbnRmdWxQYWludCA9IGxjcDtcbiAgfVxuXG4gIHZhciB0aW1pbmcgPSBQRVJGLnRpbWluZztcbiAgdmFyIHVubG9hZERpZmYgPSB0aW1pbmcuZmV0Y2hTdGFydCAtIHRpbWluZy5uYXZpZ2F0aW9uU3RhcnQ7XG4gIHZhciBmY3BFbnRyeSA9IGxpc3QuZ2V0RW50cmllc0J5TmFtZShGSVJTVF9DT05URU5URlVMX1BBSU5UKVswXTtcblxuICBpZiAoZmNwRW50cnkpIHtcbiAgICB2YXIgZmNwID0gcGFyc2VJbnQodW5sb2FkRGlmZiA+PSAwID8gZmNwRW50cnkuc3RhcnRUaW1lIC0gdW5sb2FkRGlmZiA6IGZjcEVudHJ5LnN0YXJ0VGltZSk7XG4gICAgbWV0cmljcy5mY3AgPSBmY3A7XG4gICAgcmVzdWx0Lm1hcmtzLmZpcnN0Q29udGVudGZ1bFBhaW50ID0gZmNwO1xuICB9XG5cbiAgdmFyIGZpZEVudHJpZXMgPSBsaXN0LmdldEVudHJpZXNCeVR5cGUoRklSU1RfSU5QVVQpO1xuICB2YXIgZmlkU3BhbiA9IGNyZWF0ZUZpcnN0SW5wdXREZWxheVNwYW4oZmlkRW50cmllcyk7XG5cbiAgaWYgKGZpZFNwYW4pIHtcbiAgICBtZXRyaWNzLmZpZCA9IGZpZFNwYW4uZHVyYXRpb24oKTtcbiAgICByZXN1bHQuc3BhbnMucHVzaChmaWRTcGFuKTtcbiAgfVxuXG4gIGNhbGN1bGF0ZVRvdGFsQmxvY2tpbmdUaW1lKGxvbmd0YXNrRW50cmllcyk7XG4gIHZhciBjbHNFbnRyaWVzID0gbGlzdC5nZXRFbnRyaWVzQnlUeXBlKExBWU9VVF9TSElGVCk7XG4gIGNhbGN1bGF0ZUN1bXVsYXRpdmVMYXlvdXRTaGlmdChjbHNFbnRyaWVzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCB2YXIgUGVyZkVudHJ5UmVjb3JkZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBlcmZFbnRyeVJlY29yZGVyKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5wbyA9IHtcbiAgICAgIG9ic2VydmU6IG5vb3AsXG4gICAgICBkaXNjb25uZWN0OiBub29wXG4gICAgfTtcblxuICAgIGlmICh3aW5kb3cuUGVyZm9ybWFuY2VPYnNlcnZlcikge1xuICAgICAgdGhpcy5wbyA9IG5ldyBQZXJmb3JtYW5jZU9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICB2YXIgX3Byb3RvID0gUGVyZkVudHJ5UmVjb3JkZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5zdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KHR5cGUpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5wby5vYnNlcnZlKHtcbiAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgYnVmZmVyZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKF8pIHt9XG4gIH07XG5cbiAgX3Byb3RvLnN0b3AgPSBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHRoaXMucG8uZGlzY29ubmVjdCgpO1xuICB9O1xuXG4gIHJldHVybiBQZXJmRW50cnlSZWNvcmRlcjtcbn0oKTsiLCJpbXBvcnQgeyBjaGVja1NhbWVPcmlnaW4sIGlzRHRIZWFkZXJWYWxpZCwgcGFyc2VEdEhlYWRlclZhbHVlLCBnZXREdEhlYWRlclZhbHVlLCBnZXRUU0hlYWRlclZhbHVlLCBzdHJpcFF1ZXJ5U3RyaW5nRnJvbVVybCwgc2V0UmVxdWVzdEhlYWRlciB9IGZyb20gJy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBVcmwgfSBmcm9tICcuLi9jb21tb24vdXJsJztcbmltcG9ydCB7IHBhdGNoRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vY29tbW9uL3BhdGNoaW5nJztcbmltcG9ydCB7IGdsb2JhbFN0YXRlIH0gZnJvbSAnLi4vY29tbW9uL3BhdGNoaW5nL3BhdGNoLXV0aWxzJztcbmltcG9ydCB7IFNDSEVEVUxFLCBJTlZPS0UsIFRSQU5TQUNUSU9OX0VORCwgQUZURVJfRVZFTlQsIEZFVENILCBISVNUT1JZLCBYTUxIVFRQUkVRVUVTVCwgSFRUUF9SRVFVRVNUX1RZUEUsIE9VVENPTUVfRkFJTFVSRSwgT1VUQ09NRV9TVUNDRVNTLCBPVVRDT01FX1VOS05PV04sIFFVRVVFX0FERF9UUkFOU0FDVElPTiB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgdHJ1bmNhdGVNb2RlbCwgU1BBTl9NT0RFTCwgVFJBTlNBQ1RJT05fTU9ERUwgfSBmcm9tICcuLi9jb21tb24vdHJ1bmNhdGUnO1xuaW1wb3J0IHsgX19ERVZfXyB9IGZyb20gJy4uL3N0YXRlJztcbnZhciBTSU1JTEFSX1NQQU5fVE9fVFJBTlNBQ1RJT05fUkFUSU8gPSAwLjA1O1xudmFyIFRSQU5TQUNUSU9OX0RVUkFUSU9OX1RIUkVTSE9MRCA9IDYwMDAwO1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwU21hbGxDb250aW51b3VzbHlTaW1pbGFyU3BhbnMob3JpZ2luYWxTcGFucywgdHJhbnNEdXJhdGlvbiwgdGhyZXNob2xkKSB7XG4gIG9yaWdpbmFsU3BhbnMuc29ydChmdW5jdGlvbiAoc3BhbkEsIHNwYW5CKSB7XG4gICAgcmV0dXJuIHNwYW5BLl9zdGFydCAtIHNwYW5CLl9zdGFydDtcbiAgfSk7XG4gIHZhciBzcGFucyA9IFtdO1xuICB2YXIgbGFzdENvdW50ID0gMTtcbiAgb3JpZ2luYWxTcGFucy5mb3JFYWNoKGZ1bmN0aW9uIChzcGFuLCBpbmRleCkge1xuICAgIGlmIChzcGFucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHNwYW5zLnB1c2goc3Bhbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsYXN0U3BhbiA9IHNwYW5zW3NwYW5zLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIGlzQ29udGludW91c2x5U2ltaWxhciA9IGxhc3RTcGFuLnR5cGUgPT09IHNwYW4udHlwZSAmJiBsYXN0U3Bhbi5zdWJ0eXBlID09PSBzcGFuLnN1YnR5cGUgJiYgbGFzdFNwYW4uYWN0aW9uID09PSBzcGFuLmFjdGlvbiAmJiBsYXN0U3Bhbi5uYW1lID09PSBzcGFuLm5hbWUgJiYgc3Bhbi5kdXJhdGlvbigpIC8gdHJhbnNEdXJhdGlvbiA8IHRocmVzaG9sZCAmJiAoc3Bhbi5fc3RhcnQgLSBsYXN0U3Bhbi5fZW5kKSAvIHRyYW5zRHVyYXRpb24gPCB0aHJlc2hvbGQ7XG4gICAgICB2YXIgaXNMYXN0U3BhbiA9IG9yaWdpbmFsU3BhbnMubGVuZ3RoID09PSBpbmRleCArIDE7XG5cbiAgICAgIGlmIChpc0NvbnRpbnVvdXNseVNpbWlsYXIpIHtcbiAgICAgICAgbGFzdENvdW50Kys7XG4gICAgICAgIGxhc3RTcGFuLl9lbmQgPSBzcGFuLl9lbmQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXN0Q291bnQgPiAxICYmICghaXNDb250aW51b3VzbHlTaW1pbGFyIHx8IGlzTGFzdFNwYW4pKSB7XG4gICAgICAgIGxhc3RTcGFuLm5hbWUgPSBsYXN0Q291bnQgKyAneCAnICsgbGFzdFNwYW4ubmFtZTtcbiAgICAgICAgbGFzdENvdW50ID0gMTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0NvbnRpbnVvdXNseVNpbWlsYXIpIHtcbiAgICAgICAgc3BhbnMucHVzaChzcGFuKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3BhbnM7XG59XG5leHBvcnQgZnVuY3Rpb24gYWRqdXN0VHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgaWYgKHRyYW5zYWN0aW9uLnNhbXBsZWQpIHtcbiAgICB2YXIgZmlsdGVyZFNwYW5zID0gdHJhbnNhY3Rpb24uc3BhbnMuZmlsdGVyKGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICByZXR1cm4gc3Bhbi5kdXJhdGlvbigpID4gMCAmJiBzcGFuLl9zdGFydCA+PSB0cmFuc2FjdGlvbi5fc3RhcnQgJiYgc3Bhbi5fZW5kIDw9IHRyYW5zYWN0aW9uLl9lbmQ7XG4gICAgfSk7XG5cbiAgICBpZiAodHJhbnNhY3Rpb24uaXNNYW5hZ2VkKCkpIHtcbiAgICAgIHZhciBkdXJhdGlvbiA9IHRyYW5zYWN0aW9uLmR1cmF0aW9uKCk7XG4gICAgICB2YXIgc2ltaWxhclNwYW5zID0gZ3JvdXBTbWFsbENvbnRpbnVvdXNseVNpbWlsYXJTcGFucyhmaWx0ZXJkU3BhbnMsIGR1cmF0aW9uLCBTSU1JTEFSX1NQQU5fVE9fVFJBTlNBQ1RJT05fUkFUSU8pO1xuICAgICAgdHJhbnNhY3Rpb24uc3BhbnMgPSBzaW1pbGFyU3BhbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyYW5zYWN0aW9uLnNwYW5zID0gZmlsdGVyZFNwYW5zO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0cmFuc2FjdGlvbi5yZXNldEZpZWxkcygpO1xuICB9XG5cbiAgcmV0dXJuIHRyYW5zYWN0aW9uO1xufVxuXG52YXIgUGVyZm9ybWFuY2VNb25pdG9yaW5nID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQZXJmb3JtYW5jZU1vbml0b3JpbmcoYXBtU2VydmVyLCBjb25maWdTZXJ2aWNlLCBsb2dnaW5nU2VydmljZSwgdHJhbnNhY3Rpb25TZXJ2aWNlKSB7XG4gICAgdGhpcy5fYXBtU2VydmVyID0gYXBtU2VydmVyO1xuICAgIHRoaXMuX2NvbmZpZ1NlcnZpY2UgPSBjb25maWdTZXJ2aWNlO1xuICAgIHRoaXMuX2xvZ2dpblNlcnZpY2UgPSBsb2dnaW5nU2VydmljZTtcbiAgICB0aGlzLl90cmFuc2FjdGlvblNlcnZpY2UgPSB0cmFuc2FjdGlvblNlcnZpY2U7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gUGVyZm9ybWFuY2VNb25pdG9yaW5nLnByb3RvdHlwZTtcblxuICBfcHJvdG8uaW5pdCA9IGZ1bmN0aW9uIGluaXQoZmxhZ3MpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKGZsYWdzID09PSB2b2lkIDApIHtcbiAgICAgIGZsYWdzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlnU2VydmljZS5ldmVudHMub2JzZXJ2ZShUUkFOU0FDVElPTl9FTkQgKyBBRlRFUl9FVkVOVCwgZnVuY3Rpb24gKHRyKSB7XG4gICAgICB2YXIgcGF5bG9hZCA9IF90aGlzLmNyZWF0ZVRyYW5zYWN0aW9uUGF5bG9hZCh0cik7XG5cbiAgICAgIGlmIChwYXlsb2FkKSB7XG4gICAgICAgIF90aGlzLl9hcG1TZXJ2ZXIuYWRkVHJhbnNhY3Rpb24ocGF5bG9hZCk7XG5cbiAgICAgICAgX3RoaXMuX2NvbmZpZ1NlcnZpY2UuZGlzcGF0Y2hFdmVudChRVUVVRV9BRERfVFJBTlNBQ1RJT04pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGZsYWdzW0hJU1RPUlldKSB7XG4gICAgICBwYXRjaEV2ZW50SGFuZGxlci5vYnNlcnZlKEhJU1RPUlksIHRoaXMuZ2V0SGlzdG9yeVN1YigpKTtcbiAgICB9XG5cbiAgICBpZiAoZmxhZ3NbWE1MSFRUUFJFUVVFU1RdKSB7XG4gICAgICBwYXRjaEV2ZW50SGFuZGxlci5vYnNlcnZlKFhNTEhUVFBSRVFVRVNULCB0aGlzLmdldFhIUlN1YigpKTtcbiAgICB9XG5cbiAgICBpZiAoZmxhZ3NbRkVUQ0hdKSB7XG4gICAgICBwYXRjaEV2ZW50SGFuZGxlci5vYnNlcnZlKEZFVENILCB0aGlzLmdldEZldGNoU3ViKCkpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZ2V0SGlzdG9yeVN1YiA9IGZ1bmN0aW9uIGdldEhpc3RvcnlTdWIoKSB7XG4gICAgdmFyIHRyYW5zYWN0aW9uU2VydmljZSA9IHRoaXMuX3RyYW5zYWN0aW9uU2VydmljZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50LCB0YXNrKSB7XG4gICAgICBpZiAodGFzay5zb3VyY2UgPT09IEhJU1RPUlkgJiYgZXZlbnQgPT09IElOVk9LRSkge1xuICAgICAgICB0cmFuc2FjdGlvblNlcnZpY2Uuc3RhcnRUcmFuc2FjdGlvbih0YXNrLmRhdGEudGl0bGUsICdyb3V0ZS1jaGFuZ2UnLCB7XG4gICAgICAgICAgbWFuYWdlZDogdHJ1ZSxcbiAgICAgICAgICBjYW5SZXVzZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIF9wcm90by5nZXRYSFJTdWIgPSBmdW5jdGlvbiBnZXRYSFJTdWIoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50LCB0YXNrKSB7XG4gICAgICBpZiAodGFzay5zb3VyY2UgPT09IFhNTEhUVFBSRVFVRVNUICYmICFnbG9iYWxTdGF0ZS5mZXRjaEluUHJvZ3Jlc3MpIHtcbiAgICAgICAgX3RoaXMyLnByb2Nlc3NBUElDYWxscyhldmVudCwgdGFzayk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0RmV0Y2hTdWIgPSBmdW5jdGlvbiBnZXRGZXRjaFN1YigpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQsIHRhc2spIHtcbiAgICAgIGlmICh0YXNrLnNvdXJjZSA9PT0gRkVUQ0gpIHtcbiAgICAgICAgX3RoaXMzLnByb2Nlc3NBUElDYWxscyhldmVudCwgdGFzayk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBfcHJvdG8ucHJvY2Vzc0FQSUNhbGxzID0gZnVuY3Rpb24gcHJvY2Vzc0FQSUNhbGxzKGV2ZW50LCB0YXNrKSB7XG4gICAgdmFyIGNvbmZpZ1NlcnZpY2UgPSB0aGlzLl9jb25maWdTZXJ2aWNlO1xuICAgIHZhciB0cmFuc2FjdGlvblNlcnZpY2UgPSB0aGlzLl90cmFuc2FjdGlvblNlcnZpY2U7XG5cbiAgICBpZiAodGFzay5kYXRhICYmIHRhc2suZGF0YS51cmwpIHtcbiAgICAgIHZhciBlbmRwb2ludHMgPSB0aGlzLl9hcG1TZXJ2ZXIuZ2V0RW5kcG9pbnRzKCk7XG5cbiAgICAgIHZhciBpc093bkVuZHBvaW50ID0gT2JqZWN0LmtleXMoZW5kcG9pbnRzKS5zb21lKGZ1bmN0aW9uIChlbmRwb2ludCkge1xuICAgICAgICByZXR1cm4gdGFzay5kYXRhLnVybC5pbmRleE9mKGVuZHBvaW50c1tlbmRwb2ludF0pICE9PSAtMTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNPd25FbmRwb2ludCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSBTQ0hFRFVMRSAmJiB0YXNrLmRhdGEpIHtcbiAgICAgIHZhciBkYXRhID0gdGFzay5kYXRhO1xuICAgICAgdmFyIHJlcXVlc3RVcmwgPSBuZXcgVXJsKGRhdGEudXJsKTtcbiAgICAgIHZhciBzcGFuTmFtZSA9IGRhdGEubWV0aG9kICsgJyAnICsgKHJlcXVlc3RVcmwucmVsYXRpdmUgPyByZXF1ZXN0VXJsLnBhdGggOiBzdHJpcFF1ZXJ5U3RyaW5nRnJvbVVybChyZXF1ZXN0VXJsLmhyZWYpKTtcblxuICAgICAgaWYgKCF0cmFuc2FjdGlvblNlcnZpY2UuZ2V0Q3VycmVudFRyYW5zYWN0aW9uKCkpIHtcbiAgICAgICAgdHJhbnNhY3Rpb25TZXJ2aWNlLnN0YXJ0VHJhbnNhY3Rpb24oc3Bhbk5hbWUsIEhUVFBfUkVRVUVTVF9UWVBFLCB7XG4gICAgICAgICAgbWFuYWdlZDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNwYW4gPSB0cmFuc2FjdGlvblNlcnZpY2Uuc3RhcnRTcGFuKHNwYW5OYW1lLCAnZXh0ZXJuYWwuaHR0cCcsIHtcbiAgICAgICAgYmxvY2tpbmc6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXNwYW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNEdEVuYWJsZWQgPSBjb25maWdTZXJ2aWNlLmdldCgnZGlzdHJpYnV0ZWRUcmFjaW5nJyk7XG4gICAgICB2YXIgZHRPcmlnaW5zID0gY29uZmlnU2VydmljZS5nZXQoJ2Rpc3RyaWJ1dGVkVHJhY2luZ09yaWdpbnMnKTtcbiAgICAgIHZhciBjdXJyZW50VXJsID0gbmV3IFVybCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICB2YXIgaXNTYW1lT3JpZ2luID0gY2hlY2tTYW1lT3JpZ2luKHJlcXVlc3RVcmwub3JpZ2luLCBjdXJyZW50VXJsLm9yaWdpbikgfHwgY2hlY2tTYW1lT3JpZ2luKHJlcXVlc3RVcmwub3JpZ2luLCBkdE9yaWdpbnMpO1xuICAgICAgdmFyIHRhcmdldCA9IGRhdGEudGFyZ2V0O1xuXG4gICAgICBpZiAoaXNEdEVuYWJsZWQgJiYgaXNTYW1lT3JpZ2luICYmIHRhcmdldCkge1xuICAgICAgICB0aGlzLmluamVjdER0SGVhZGVyKHNwYW4sIHRhcmdldCk7XG4gICAgICAgIHZhciBwcm9wYWdhdGVUcmFjZXN0YXRlID0gY29uZmlnU2VydmljZS5nZXQoJ3Byb3BhZ2F0ZVRyYWNlc3RhdGUnKTtcblxuICAgICAgICBpZiAocHJvcGFnYXRlVHJhY2VzdGF0ZSkge1xuICAgICAgICAgIHRoaXMuaW5qZWN0VFNIZWFkZXIoc3BhbiwgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dpblNlcnZpY2UuZGVidWcoXCJDb3VsZCBub3QgaW5qZWN0IGRpc3RyaWJ1dGVkIHRyYWNpbmcgaGVhZGVyIHRvIHRoZSByZXF1ZXN0IG9yaWdpbiAoJ1wiICsgcmVxdWVzdFVybC5vcmlnaW4gKyBcIicpIGZyb20gdGhlIGN1cnJlbnQgb3JpZ2luICgnXCIgKyBjdXJyZW50VXJsLm9yaWdpbiArIFwiJylcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLnN5bmMpIHtcbiAgICAgICAgc3Bhbi5zeW5jID0gZGF0YS5zeW5jO1xuICAgICAgfVxuXG4gICAgICBkYXRhLnNwYW4gPSBzcGFuO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09IElOVk9LRSkge1xuICAgICAgdmFyIF9kYXRhID0gdGFzay5kYXRhO1xuXG4gICAgICBpZiAoX2RhdGEgJiYgX2RhdGEuc3Bhbikge1xuICAgICAgICB2YXIgX3NwYW4gPSBfZGF0YS5zcGFuLFxuICAgICAgICAgICAgcmVzcG9uc2UgPSBfZGF0YS5yZXNwb25zZSxcbiAgICAgICAgICAgIF90YXJnZXQgPSBfZGF0YS50YXJnZXQ7XG4gICAgICAgIHZhciBzdGF0dXM7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXR1cyA9IF90YXJnZXQuc3RhdHVzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG91dGNvbWU7XG5cbiAgICAgICAgaWYgKF9kYXRhLnN0YXR1cyAhPSAnYWJvcnQnICYmICFfZGF0YS5hYm9ydGVkKSB7XG4gICAgICAgICAgaWYgKHN0YXR1cyA+PSA0MDAgfHwgc3RhdHVzID09IDApIHtcbiAgICAgICAgICAgIG91dGNvbWUgPSBPVVRDT01FX0ZBSUxVUkU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dGNvbWUgPSBPVVRDT01FX1NVQ0NFU1M7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dGNvbWUgPSBPVVRDT01FX1VOS05PV047XG4gICAgICAgIH1cblxuICAgICAgICBfc3Bhbi5vdXRjb21lID0gb3V0Y29tZTtcbiAgICAgICAgdmFyIHRyID0gdHJhbnNhY3Rpb25TZXJ2aWNlLmdldEN1cnJlbnRUcmFuc2FjdGlvbigpO1xuXG4gICAgICAgIGlmICh0ciAmJiB0ci50eXBlID09PSBIVFRQX1JFUVVFU1RfVFlQRSkge1xuICAgICAgICAgIHRyLm91dGNvbWUgPSBvdXRjb21lO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhbnNhY3Rpb25TZXJ2aWNlLmVuZFNwYW4oX3NwYW4sIF9kYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmluamVjdER0SGVhZGVyID0gZnVuY3Rpb24gaW5qZWN0RHRIZWFkZXIoc3BhbiwgdGFyZ2V0KSB7XG4gICAgdmFyIGhlYWRlck5hbWUgPSB0aGlzLl9jb25maWdTZXJ2aWNlLmdldCgnZGlzdHJpYnV0ZWRUcmFjaW5nSGVhZGVyTmFtZScpO1xuXG4gICAgdmFyIGhlYWRlclZhbHVlID0gZ2V0RHRIZWFkZXJWYWx1ZShzcGFuKTtcbiAgICB2YXIgaXNIZWFkZXJWYWxpZCA9IGlzRHRIZWFkZXJWYWxpZChoZWFkZXJWYWx1ZSk7XG5cbiAgICBpZiAoaXNIZWFkZXJWYWxpZCAmJiBoZWFkZXJWYWx1ZSAmJiBoZWFkZXJOYW1lKSB7XG4gICAgICBzZXRSZXF1ZXN0SGVhZGVyKHRhcmdldCwgaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uaW5qZWN0VFNIZWFkZXIgPSBmdW5jdGlvbiBpbmplY3RUU0hlYWRlcihzcGFuLCB0YXJnZXQpIHtcbiAgICB2YXIgaGVhZGVyVmFsdWUgPSBnZXRUU0hlYWRlclZhbHVlKHNwYW4pO1xuXG4gICAgaWYgKGhlYWRlclZhbHVlKSB7XG4gICAgICBzZXRSZXF1ZXN0SGVhZGVyKHRhcmdldCwgJ3RyYWNlc3RhdGUnLCBoZWFkZXJWYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5leHRyYWN0RHRIZWFkZXIgPSBmdW5jdGlvbiBleHRyYWN0RHRIZWFkZXIodGFyZ2V0KSB7XG4gICAgdmFyIGNvbmZpZ1NlcnZpY2UgPSB0aGlzLl9jb25maWdTZXJ2aWNlO1xuICAgIHZhciBoZWFkZXJOYW1lID0gY29uZmlnU2VydmljZS5nZXQoJ2Rpc3RyaWJ1dGVkVHJhY2luZ0hlYWRlck5hbWUnKTtcblxuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHJldHVybiBwYXJzZUR0SGVhZGVyVmFsdWUodGFyZ2V0W2hlYWRlck5hbWVdKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmZpbHRlclRyYW5zYWN0aW9uID0gZnVuY3Rpb24gZmlsdGVyVHJhbnNhY3Rpb24odHIpIHtcbiAgICB2YXIgZHVyYXRpb24gPSB0ci5kdXJhdGlvbigpO1xuXG4gICAgaWYgKCFkdXJhdGlvbikge1xuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBcInRyYW5zYWN0aW9uKFwiICsgdHIuaWQgKyBcIiwgXCIgKyB0ci5uYW1lICsgXCIpIHdhcyBkaXNjYXJkZWQhIFwiO1xuXG4gICAgICAgIGlmIChkdXJhdGlvbiA9PT0gMCkge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gXCJUcmFuc2FjdGlvbiBkdXJhdGlvbiBpcyAwXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBcIlRyYW5zYWN0aW9uIHdhc24ndCBlbmRlZFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9nZ2luU2VydmljZS5kZWJ1ZyhtZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0ci5pc01hbmFnZWQoKSkge1xuICAgICAgaWYgKGR1cmF0aW9uID4gVFJBTlNBQ1RJT05fRFVSQVRJT05fVEhSRVNIT0xEKSB7XG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2luU2VydmljZS5kZWJ1ZyhcInRyYW5zYWN0aW9uKFwiICsgdHIuaWQgKyBcIiwgXCIgKyB0ci5uYW1lICsgXCIpIHdhcyBkaXNjYXJkZWQhIFRyYW5zYWN0aW9uIGR1cmF0aW9uIChcIiArIGR1cmF0aW9uICsgXCIpIGlzIGdyZWF0ZXIgdGhhbiBtYW5hZ2VkIHRyYW5zYWN0aW9uIHRocmVzaG9sZCAoXCIgKyBUUkFOU0FDVElPTl9EVVJBVElPTl9USFJFU0hPTEQgKyBcIilcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0ci5zYW1wbGVkICYmIHRyLnNwYW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICAgIHRoaXMuX2xvZ2dpblNlcnZpY2UuZGVidWcoXCJ0cmFuc2FjdGlvbihcIiArIHRyLmlkICsgXCIsIFwiICsgdHIubmFtZSArIFwiKSB3YXMgZGlzY2FyZGVkISBUcmFuc2FjdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBzcGFuc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBfcHJvdG8uY3JlYXRlVHJhbnNhY3Rpb25EYXRhTW9kZWwgPSBmdW5jdGlvbiBjcmVhdGVUcmFuc2FjdGlvbkRhdGFNb2RlbCh0cmFuc2FjdGlvbikge1xuICAgIHZhciB0cmFuc2FjdGlvblN0YXJ0ID0gdHJhbnNhY3Rpb24uX3N0YXJ0O1xuICAgIHZhciBzcGFucyA9IHRyYW5zYWN0aW9uLnNwYW5zLm1hcChmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgdmFyIHNwYW5EYXRhID0ge1xuICAgICAgICBpZDogc3Bhbi5pZCxcbiAgICAgICAgdHJhbnNhY3Rpb25faWQ6IHRyYW5zYWN0aW9uLmlkLFxuICAgICAgICBwYXJlbnRfaWQ6IHNwYW4ucGFyZW50SWQgfHwgdHJhbnNhY3Rpb24uaWQsXG4gICAgICAgIHRyYWNlX2lkOiB0cmFuc2FjdGlvbi50cmFjZUlkLFxuICAgICAgICBuYW1lOiBzcGFuLm5hbWUsXG4gICAgICAgIHR5cGU6IHNwYW4udHlwZSxcbiAgICAgICAgc3VidHlwZTogc3Bhbi5zdWJ0eXBlLFxuICAgICAgICBhY3Rpb246IHNwYW4uYWN0aW9uLFxuICAgICAgICBzeW5jOiBzcGFuLnN5bmMsXG4gICAgICAgIHN0YXJ0OiBwYXJzZUludChzcGFuLl9zdGFydCAtIHRyYW5zYWN0aW9uU3RhcnQpLFxuICAgICAgICBkdXJhdGlvbjogc3Bhbi5kdXJhdGlvbigpLFxuICAgICAgICBjb250ZXh0OiBzcGFuLmNvbnRleHQsXG4gICAgICAgIG91dGNvbWU6IHNwYW4ub3V0Y29tZSxcbiAgICAgICAgc2FtcGxlX3JhdGU6IHNwYW4uc2FtcGxlUmF0ZVxuICAgICAgfTtcbiAgICAgIHJldHVybiB0cnVuY2F0ZU1vZGVsKFNQQU5fTU9ERUwsIHNwYW5EYXRhKTtcbiAgICB9KTtcbiAgICB2YXIgdHJhbnNhY3Rpb25EYXRhID0ge1xuICAgICAgaWQ6IHRyYW5zYWN0aW9uLmlkLFxuICAgICAgdHJhY2VfaWQ6IHRyYW5zYWN0aW9uLnRyYWNlSWQsXG4gICAgICBzZXNzaW9uOiB0cmFuc2FjdGlvbi5zZXNzaW9uLFxuICAgICAgbmFtZTogdHJhbnNhY3Rpb24ubmFtZSxcbiAgICAgIHR5cGU6IHRyYW5zYWN0aW9uLnR5cGUsXG4gICAgICBkdXJhdGlvbjogdHJhbnNhY3Rpb24uZHVyYXRpb24oKSxcbiAgICAgIHNwYW5zOiBzcGFucyxcbiAgICAgIGNvbnRleHQ6IHRyYW5zYWN0aW9uLmNvbnRleHQsXG4gICAgICBtYXJrczogdHJhbnNhY3Rpb24ubWFya3MsXG4gICAgICBicmVha2Rvd246IHRyYW5zYWN0aW9uLmJyZWFrZG93blRpbWluZ3MsXG4gICAgICBzcGFuX2NvdW50OiB7XG4gICAgICAgIHN0YXJ0ZWQ6IHNwYW5zLmxlbmd0aFxuICAgICAgfSxcbiAgICAgIHNhbXBsZWQ6IHRyYW5zYWN0aW9uLnNhbXBsZWQsXG4gICAgICBzYW1wbGVfcmF0ZTogdHJhbnNhY3Rpb24uc2FtcGxlUmF0ZSxcbiAgICAgIGV4cGVyaWVuY2U6IHRyYW5zYWN0aW9uLmV4cGVyaWVuY2UsXG4gICAgICBvdXRjb21lOiB0cmFuc2FjdGlvbi5vdXRjb21lXG4gICAgfTtcbiAgICByZXR1cm4gdHJ1bmNhdGVNb2RlbChUUkFOU0FDVElPTl9NT0RFTCwgdHJhbnNhY3Rpb25EYXRhKTtcbiAgfTtcblxuICBfcHJvdG8uY3JlYXRlVHJhbnNhY3Rpb25QYXlsb2FkID0gZnVuY3Rpb24gY3JlYXRlVHJhbnNhY3Rpb25QYXlsb2FkKHRyYW5zYWN0aW9uKSB7XG4gICAgdmFyIGFkanVzdGVkVHJhbnNhY3Rpb24gPSBhZGp1c3RUcmFuc2FjdGlvbih0cmFuc2FjdGlvbik7XG4gICAgdmFyIGZpbHRlcmVkID0gdGhpcy5maWx0ZXJUcmFuc2FjdGlvbihhZGp1c3RlZFRyYW5zYWN0aW9uKTtcblxuICAgIGlmIChmaWx0ZXJlZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVHJhbnNhY3Rpb25EYXRhTW9kZWwodHJhbnNhY3Rpb24pO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gUGVyZm9ybWFuY2VNb25pdG9yaW5nO1xufSgpO1xuXG5leHBvcnQgeyBQZXJmb3JtYW5jZU1vbml0b3JpbmcgYXMgZGVmYXVsdCB9OyIsImltcG9ydCB7IGdlbmVyYXRlUmFuZG9tSWQsIHNldExhYmVsLCBtZXJnZSwgZ2V0RHVyYXRpb24sIGdldFRpbWUgfSBmcm9tICcuLi9jb21tb24vdXRpbHMnO1xuaW1wb3J0IHsgTkFNRV9VTktOT1dOLCBUWVBFX0NVU1RPTSB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuXG52YXIgU3BhbkJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNwYW5CYXNlKG5hbWUsIHR5cGUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICBuYW1lID0gTkFNRV9VTktOT1dOO1xuICAgIH1cblxuICAgIGlmICghdHlwZSkge1xuICAgICAgdHlwZSA9IFRZUEVfQ1VTVE9NO1xuICAgIH1cblxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkIHx8IGdlbmVyYXRlUmFuZG9tSWQoMTYpO1xuICAgIHRoaXMudHJhY2VJZCA9IG9wdGlvbnMudHJhY2VJZDtcbiAgICB0aGlzLnNhbXBsZWQgPSBvcHRpb25zLnNhbXBsZWQ7XG4gICAgdGhpcy5zYW1wbGVSYXRlID0gb3B0aW9ucy5zYW1wbGVSYXRlO1xuICAgIHRoaXMudGltZXN0YW1wID0gb3B0aW9ucy50aW1lc3RhbXA7XG4gICAgdGhpcy5fc3RhcnQgPSBnZXRUaW1lKG9wdGlvbnMuc3RhcnRUaW1lKTtcbiAgICB0aGlzLl9lbmQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMub3V0Y29tZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9uRW5kID0gb3B0aW9ucy5vbkVuZDtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTcGFuQmFzZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmVuc3VyZUNvbnRleHQgPSBmdW5jdGlvbiBlbnN1cmVDb250ZXh0KCkge1xuICAgIGlmICghdGhpcy5jb250ZXh0KSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSB7fTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmFkZExhYmVscyA9IGZ1bmN0aW9uIGFkZExhYmVscyh0YWdzKSB7XG4gICAgdGhpcy5lbnN1cmVDb250ZXh0KCk7XG4gICAgdmFyIGN0eCA9IHRoaXMuY29udGV4dDtcblxuICAgIGlmICghY3R4LnRhZ3MpIHtcbiAgICAgIGN0eC50YWdzID0ge307XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0YWdzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgIHJldHVybiBzZXRMYWJlbChrLCB0YWdzW2tdLCBjdHgudGFncyk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLmFkZENvbnRleHQgPSBmdW5jdGlvbiBhZGRDb250ZXh0KCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBjb250ZXh0ID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgY29udGV4dFtfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBpZiAoY29udGV4dC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmVuc3VyZUNvbnRleHQoKTtcbiAgICBtZXJnZS5hcHBseSh2b2lkIDAsIFt0aGlzLmNvbnRleHRdLmNvbmNhdChjb250ZXh0KSk7XG4gIH07XG5cbiAgX3Byb3RvLmVuZCA9IGZ1bmN0aW9uIGVuZChlbmRUaW1lKSB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9lbmQgPSBnZXRUaW1lKGVuZFRpbWUpO1xuICAgIHRoaXMuY2FsbE9uRW5kKCk7XG4gIH07XG5cbiAgX3Byb3RvLmNhbGxPbkVuZCA9IGZ1bmN0aW9uIGNhbGxPbkVuZCgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMub25FbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMub25FbmQodGhpcyk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5kdXJhdGlvbiA9IGZ1bmN0aW9uIGR1cmF0aW9uKCkge1xuICAgIHJldHVybiBnZXREdXJhdGlvbih0aGlzLl9zdGFydCwgdGhpcy5fZW5kKTtcbiAgfTtcblxuICByZXR1cm4gU3BhbkJhc2U7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFNwYW5CYXNlOyIsImZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5pbXBvcnQgU3BhbkJhc2UgZnJvbSAnLi9zcGFuLWJhc2UnO1xuaW1wb3J0IHsgYWRkU3BhbkNvbnRleHQgfSBmcm9tICcuLi9jb21tb24vY29udGV4dCc7XG5cbnZhciBTcGFuID0gZnVuY3Rpb24gKF9TcGFuQmFzZSkge1xuICBfaW5oZXJpdHNMb29zZShTcGFuLCBfU3BhbkJhc2UpO1xuXG4gIGZ1bmN0aW9uIFNwYW4obmFtZSwgdHlwZSwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1NwYW5CYXNlLmNhbGwodGhpcywgbmFtZSwgdHlwZSwgb3B0aW9ucykgfHwgdGhpcztcbiAgICBfdGhpcy5wYXJlbnRJZCA9IF90aGlzLm9wdGlvbnMucGFyZW50SWQ7XG4gICAgX3RoaXMuc3VidHlwZSA9IHVuZGVmaW5lZDtcbiAgICBfdGhpcy5hY3Rpb24gPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoX3RoaXMudHlwZS5pbmRleE9mKCcuJykgIT09IC0xKSB7XG4gICAgICB2YXIgZmllbGRzID0gX3RoaXMudHlwZS5zcGxpdCgnLicsIDMpO1xuXG4gICAgICBfdGhpcy50eXBlID0gZmllbGRzWzBdO1xuICAgICAgX3RoaXMuc3VidHlwZSA9IGZpZWxkc1sxXTtcbiAgICAgIF90aGlzLmFjdGlvbiA9IGZpZWxkc1syXTtcbiAgICB9XG5cbiAgICBfdGhpcy5zeW5jID0gX3RoaXMub3B0aW9ucy5zeW5jO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTcGFuLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZW5kID0gZnVuY3Rpb24gZW5kKGVuZFRpbWUsIGRhdGEpIHtcbiAgICBfU3BhbkJhc2UucHJvdG90eXBlLmVuZC5jYWxsKHRoaXMsIGVuZFRpbWUpO1xuXG4gICAgYWRkU3BhbkNvbnRleHQodGhpcywgZGF0YSk7XG4gIH07XG5cbiAgcmV0dXJuIFNwYW47XG59KFNwYW5CYXNlKTtcblxuZXhwb3J0IGRlZmF1bHQgU3BhbjsiLCJpbXBvcnQgeyBQcm9taXNlIH0gZnJvbSAnLi4vY29tbW9uL3BvbHlmaWxscyc7XG5pbXBvcnQgVHJhbnNhY3Rpb24gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBQZXJmRW50cnlSZWNvcmRlciwgY2FwdHVyZU9ic2VydmVyRW50cmllcywgbWV0cmljcywgY3JlYXRlVG90YWxCbG9ja2luZ1RpbWVTcGFuIH0gZnJvbSAnLi9tZXRyaWNzJztcbmltcG9ydCB7IGV4dGVuZCwgZ2V0RWFybGllc3RTcGFuLCBnZXRMYXRlc3ROb25YSFJTcGFuLCBnZXRMYXRlc3RYSFJTcGFuLCBpc1BlcmZUeXBlU3VwcG9ydGVkLCBnZW5lcmF0ZVJhbmRvbUlkIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IGNhcHR1cmVOYXZpZ2F0aW9uIH0gZnJvbSAnLi9jYXB0dXJlLW5hdmlnYXRpb24nO1xuaW1wb3J0IHsgUEFHRV9MT0FELCBOQU1FX1VOS05PV04sIFRSQU5TQUNUSU9OX1NUQVJULCBUUkFOU0FDVElPTl9FTkQsIFRFTVBPUkFSWV9UWVBFLCBUUkFOU0FDVElPTl9UWVBFX09SREVSLCBMQVJHRVNUX0NPTlRFTlRGVUxfUEFJTlQsIExPTkdfVEFTSywgUEFJTlQsIFRSVU5DQVRFRF9UWVBFLCBGSVJTVF9JTlBVVCwgTEFZT1VUX1NISUZULCBTRVNTSU9OX1RJTUVPVVQsIFBBR0VfTE9BRF9ERUxBWSB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgYWRkVHJhbnNhY3Rpb25Db250ZXh0IH0gZnJvbSAnLi4vY29tbW9uL2NvbnRleHQnO1xuaW1wb3J0IHsgX19ERVZfXywgc3RhdGUgfSBmcm9tICcuLi9zdGF0ZSc7XG5pbXBvcnQgeyBzbHVnaWZ5VXJsIH0gZnJvbSAnLi4vY29tbW9uL3VybCc7XG5cbnZhciBUcmFuc2FjdGlvblNlcnZpY2UgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFRyYW5zYWN0aW9uU2VydmljZShsb2dnZXIsIGNvbmZpZykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5fbG9nZ2VyID0gbG9nZ2VyO1xuICAgIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmVzcEludGVydmFsSWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZWNvcmRlciA9IG5ldyBQZXJmRW50cnlSZWNvcmRlcihmdW5jdGlvbiAobGlzdCkge1xuICAgICAgdmFyIHRyID0gX3RoaXMuZ2V0Q3VycmVudFRyYW5zYWN0aW9uKCk7XG5cbiAgICAgIGlmICh0ciAmJiB0ci5jYXB0dXJlVGltaW5ncykge1xuICAgICAgICB2YXIgX3RyJHNwYW5zO1xuXG4gICAgICAgIHZhciBpc0hhcmROYXZpZ2F0aW9uID0gdHIudHlwZSA9PT0gUEFHRV9MT0FEO1xuXG4gICAgICAgIHZhciBfY2FwdHVyZU9ic2VydmVyRW50cmkgPSBjYXB0dXJlT2JzZXJ2ZXJFbnRyaWVzKGxpc3QsIHtcbiAgICAgICAgICBpc0hhcmROYXZpZ2F0aW9uOiBpc0hhcmROYXZpZ2F0aW9uLFxuICAgICAgICAgIHRyU3RhcnQ6IGlzSGFyZE5hdmlnYXRpb24gPyAwIDogdHIuX3N0YXJ0XG4gICAgICAgIH0pLFxuICAgICAgICAgICAgc3BhbnMgPSBfY2FwdHVyZU9ic2VydmVyRW50cmkuc3BhbnMsXG4gICAgICAgICAgICBtYXJrcyA9IF9jYXB0dXJlT2JzZXJ2ZXJFbnRyaS5tYXJrcztcblxuICAgICAgICAoX3RyJHNwYW5zID0gdHIuc3BhbnMpLnB1c2guYXBwbHkoX3RyJHNwYW5zLCBzcGFucyk7XG5cbiAgICAgICAgdHIuYWRkTWFya3Moe1xuICAgICAgICAgIGFnZW50OiBtYXJrc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBUcmFuc2FjdGlvblNlcnZpY2UucHJvdG90eXBlO1xuXG4gIF9wcm90by5jcmVhdGVDdXJyZW50VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiBjcmVhdGVDdXJyZW50VHJhbnNhY3Rpb24obmFtZSwgdHlwZSwgb3B0aW9ucykge1xuICAgIHZhciB0ciA9IG5ldyBUcmFuc2FjdGlvbihuYW1lLCB0eXBlLCBvcHRpb25zKTtcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiA9IHRyO1xuICAgIHJldHVybiB0cjtcbiAgfTtcblxuICBfcHJvdG8uZ2V0Q3VycmVudFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiAmJiAhdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24uZW5kZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbjtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmNyZWF0ZU9wdGlvbnMgPSBmdW5jdGlvbiBjcmVhdGVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICB2YXIgY29uZmlnID0gdGhpcy5fY29uZmlnLmNvbmZpZztcbiAgICB2YXIgcHJlc2V0T3B0aW9ucyA9IHtcbiAgICAgIHRyYW5zYWN0aW9uU2FtcGxlUmF0ZTogY29uZmlnLnRyYW5zYWN0aW9uU2FtcGxlUmF0ZVxuICAgIH07XG4gICAgdmFyIHBlcmZPcHRpb25zID0gZXh0ZW5kKHByZXNldE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHBlcmZPcHRpb25zLm1hbmFnZWQpIHtcbiAgICAgIHBlcmZPcHRpb25zID0gZXh0ZW5kKHtcbiAgICAgICAgcGFnZUxvYWRUcmFjZUlkOiBjb25maWcucGFnZUxvYWRUcmFjZUlkLFxuICAgICAgICBwYWdlTG9hZFNhbXBsZWQ6IGNvbmZpZy5wYWdlTG9hZFNhbXBsZWQsXG4gICAgICAgIHBhZ2VMb2FkU3BhbklkOiBjb25maWcucGFnZUxvYWRTcGFuSWQsXG4gICAgICAgIHBhZ2VMb2FkVHJhbnNhY3Rpb25OYW1lOiBjb25maWcucGFnZUxvYWRUcmFuc2FjdGlvbk5hbWVcbiAgICAgIH0sIHBlcmZPcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGVyZk9wdGlvbnM7XG4gIH07XG5cbiAgX3Byb3RvLnN0YXJ0TWFuYWdlZFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gc3RhcnRNYW5hZ2VkVHJhbnNhY3Rpb24obmFtZSwgdHlwZSwgcGVyZk9wdGlvbnMpIHtcbiAgICB2YXIgdHIgPSB0aGlzLmdldEN1cnJlbnRUcmFuc2FjdGlvbigpO1xuICAgIHZhciBpc1JlZGVmaW5lZCA9IGZhbHNlO1xuXG4gICAgaWYgKCF0cikge1xuICAgICAgdHIgPSB0aGlzLmNyZWF0ZUN1cnJlbnRUcmFuc2FjdGlvbihuYW1lLCB0eXBlLCBwZXJmT3B0aW9ucyk7XG4gICAgfSBlbHNlIGlmICh0ci5jYW5SZXVzZSgpICYmIHBlcmZPcHRpb25zLmNhblJldXNlKSB7XG4gICAgICB2YXIgcmVkZWZpbmVUeXBlID0gdHIudHlwZTtcbiAgICAgIHZhciBjdXJyZW50VHlwZU9yZGVyID0gVFJBTlNBQ1RJT05fVFlQRV9PUkRFUi5pbmRleE9mKHRyLnR5cGUpO1xuICAgICAgdmFyIHJlZGVmaW5lVHlwZU9yZGVyID0gVFJBTlNBQ1RJT05fVFlQRV9PUkRFUi5pbmRleE9mKHR5cGUpO1xuXG4gICAgICBpZiAoY3VycmVudFR5cGVPcmRlciA+PSAwICYmIHJlZGVmaW5lVHlwZU9yZGVyIDwgY3VycmVudFR5cGVPcmRlcikge1xuICAgICAgICByZWRlZmluZVR5cGUgPSB0eXBlO1xuICAgICAgfVxuXG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoXCJyZWRlZmluaW5nIHRyYW5zYWN0aW9uKFwiICsgdHIuaWQgKyBcIiwgXCIgKyB0ci5uYW1lICsgXCIsIFwiICsgdHIudHlwZSArIFwiKVwiLCAndG8nLCBcIihcIiArIChuYW1lIHx8IHRyLm5hbWUpICsgXCIsIFwiICsgcmVkZWZpbmVUeXBlICsgXCIpXCIsIHRyKTtcbiAgICAgIH1cblxuICAgICAgdHIucmVkZWZpbmUobmFtZSwgcmVkZWZpbmVUeXBlLCBwZXJmT3B0aW9ucyk7XG4gICAgICBpc1JlZGVmaW5lZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhcImVuZGluZyBwcmV2aW91cyB0cmFuc2FjdGlvbihcIiArIHRyLmlkICsgXCIsIFwiICsgdHIubmFtZSArIFwiKVwiLCB0cik7XG4gICAgICB9XG5cbiAgICAgIHRyLmVuZCgpO1xuICAgICAgdHIgPSB0aGlzLmNyZWF0ZUN1cnJlbnRUcmFuc2FjdGlvbihuYW1lLCB0eXBlLCBwZXJmT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKHRyLnR5cGUgPT09IFBBR0VfTE9BRCkge1xuICAgICAgaWYgKCFpc1JlZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlY29yZGVyLnN0YXJ0KExBUkdFU1RfQ09OVEVOVEZVTF9QQUlOVCk7XG4gICAgICAgIHRoaXMucmVjb3JkZXIuc3RhcnQoUEFJTlQpO1xuICAgICAgICB0aGlzLnJlY29yZGVyLnN0YXJ0KEZJUlNUX0lOUFVUKTtcbiAgICAgICAgdGhpcy5yZWNvcmRlci5zdGFydChMQVlPVVRfU0hJRlQpO1xuICAgICAgfVxuXG4gICAgICBpZiAocGVyZk9wdGlvbnMucGFnZUxvYWRUcmFjZUlkKSB7XG4gICAgICAgIHRyLnRyYWNlSWQgPSBwZXJmT3B0aW9ucy5wYWdlTG9hZFRyYWNlSWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChwZXJmT3B0aW9ucy5wYWdlTG9hZFNhbXBsZWQpIHtcbiAgICAgICAgdHIuc2FtcGxlZCA9IHBlcmZPcHRpb25zLnBhZ2VMb2FkU2FtcGxlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyLm5hbWUgPT09IE5BTUVfVU5LTk9XTiAmJiBwZXJmT3B0aW9ucy5wYWdlTG9hZFRyYW5zYWN0aW9uTmFtZSkge1xuICAgICAgICB0ci5uYW1lID0gcGVyZk9wdGlvbnMucGFnZUxvYWRUcmFuc2FjdGlvbk5hbWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFpc1JlZGVmaW5lZCAmJiB0aGlzLl9jb25maWcuZ2V0KCdtb25pdG9yTG9uZ3Rhc2tzJykpIHtcbiAgICAgIHRoaXMucmVjb3JkZXIuc3RhcnQoTE9OR19UQVNLKTtcbiAgICB9XG5cbiAgICBpZiAodHIuc2FtcGxlZCkge1xuICAgICAgdHIuY2FwdHVyZVRpbWluZ3MgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB0cjtcbiAgfTtcblxuICBfcHJvdG8uc3RhcnRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIHN0YXJ0VHJhbnNhY3Rpb24obmFtZSwgdHlwZSwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIHBlcmZPcHRpb25zID0gdGhpcy5jcmVhdGVPcHRpb25zKG9wdGlvbnMpO1xuICAgIHZhciB0cjtcbiAgICB2YXIgZmlyZU9uc3RhcnRIb29rID0gdHJ1ZTtcblxuICAgIGlmIChwZXJmT3B0aW9ucy5tYW5hZ2VkKSB7XG4gICAgICB2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudFRyYW5zYWN0aW9uO1xuICAgICAgdHIgPSB0aGlzLnN0YXJ0TWFuYWdlZFRyYW5zYWN0aW9uKG5hbWUsIHR5cGUsIHBlcmZPcHRpb25zKTtcblxuICAgICAgaWYgKGN1cnJlbnQgPT09IHRyKSB7XG4gICAgICAgIGZpcmVPbnN0YXJ0SG9vayA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0ciA9IG5ldyBUcmFuc2FjdGlvbihuYW1lLCB0eXBlLCBwZXJmT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgdHIub25FbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMyLmhhbmRsZVRyYW5zYWN0aW9uRW5kKHRyKTtcbiAgICB9O1xuXG4gICAgaWYgKGZpcmVPbnN0YXJ0SG9vaykge1xuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKFwic3RhcnRUcmFuc2FjdGlvbihcIiArIHRyLmlkICsgXCIsIFwiICsgdHIubmFtZSArIFwiLCBcIiArIHRyLnR5cGUgKyBcIilcIik7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2NvbmZpZy5ldmVudHMuc2VuZChUUkFOU0FDVElPTl9TVEFSVCwgW3RyXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyO1xuICB9O1xuXG4gIF9wcm90by5oYW5kbGVUcmFuc2FjdGlvbkVuZCA9IGZ1bmN0aW9uIGhhbmRsZVRyYW5zYWN0aW9uRW5kKHRyKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB0aGlzLnJlY29yZGVyLnN0b3AoKTtcbiAgICB2YXIgY3VycmVudFVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBuYW1lID0gdHIubmFtZSxcbiAgICAgICAgICB0eXBlID0gdHIudHlwZTtcbiAgICAgIHZhciBsYXN0SGlkZGVuU3RhcnQgPSBzdGF0ZS5sYXN0SGlkZGVuU3RhcnQ7XG5cbiAgICAgIGlmIChsYXN0SGlkZGVuU3RhcnQgPj0gdHIuX3N0YXJ0KSB7XG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgX3RoaXMzLl9sb2dnZXIuZGVidWcoXCJ0cmFuc2FjdGlvbihcIiArIHRyLmlkICsgXCIsIFwiICsgbmFtZSArIFwiLCBcIiArIHR5cGUgKyBcIikgd2FzIGRpc2NhcmRlZCEgVGhlIHBhZ2Ugd2FzIGhpZGRlbiBkdXJpbmcgdGhlIHRyYW5zYWN0aW9uIVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMy5zaG91bGRJZ25vcmVUcmFuc2FjdGlvbihuYW1lKSB8fCB0eXBlID09PSBURU1QT1JBUllfVFlQRSkge1xuICAgICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICAgIF90aGlzMy5fbG9nZ2VyLmRlYnVnKFwidHJhbnNhY3Rpb24oXCIgKyB0ci5pZCArIFwiLCBcIiArIG5hbWUgKyBcIiwgXCIgKyB0eXBlICsgXCIpIGlzIGlnbm9yZWRcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSBQQUdFX0xPQUQpIHtcbiAgICAgICAgdmFyIHBhZ2VMb2FkVHJhbnNhY3Rpb25OYW1lID0gX3RoaXMzLl9jb25maWcuZ2V0KCdwYWdlTG9hZFRyYW5zYWN0aW9uTmFtZScpO1xuXG4gICAgICAgIGlmIChuYW1lID09PSBOQU1FX1VOS05PV04gJiYgcGFnZUxvYWRUcmFuc2FjdGlvbk5hbWUpIHtcbiAgICAgICAgICB0ci5uYW1lID0gcGFnZUxvYWRUcmFuc2FjdGlvbk5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHIuY2FwdHVyZVRpbWluZ3MpIHtcbiAgICAgICAgICB2YXIgY2xzID0gbWV0cmljcy5jbHMsXG4gICAgICAgICAgICAgIGZpZCA9IG1ldHJpY3MuZmlkLFxuICAgICAgICAgICAgICB0YnQgPSBtZXRyaWNzLnRidCxcbiAgICAgICAgICAgICAgbG9uZ3Rhc2sgPSBtZXRyaWNzLmxvbmd0YXNrO1xuXG4gICAgICAgICAgaWYgKHRidC5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgICAgIHRyLnNwYW5zLnB1c2goY3JlYXRlVG90YWxCbG9ja2luZ1RpbWVTcGFuKHRidCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyLmV4cGVyaWVuY2UgPSB7fTtcblxuICAgICAgICAgIGlmIChpc1BlcmZUeXBlU3VwcG9ydGVkKExPTkdfVEFTSykpIHtcbiAgICAgICAgICAgIHRyLmV4cGVyaWVuY2UudGJ0ID0gdGJ0LmR1cmF0aW9uO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc1BlcmZUeXBlU3VwcG9ydGVkKExBWU9VVF9TSElGVCkpIHtcbiAgICAgICAgICAgIHRyLmV4cGVyaWVuY2UuY2xzID0gY2xzLnNjb3JlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmaWQgPiAwKSB7XG4gICAgICAgICAgICB0ci5leHBlcmllbmNlLmZpZCA9IGZpZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobG9uZ3Rhc2suY291bnQgPiAwKSB7XG4gICAgICAgICAgICB0ci5leHBlcmllbmNlLmxvbmd0YXNrID0ge1xuICAgICAgICAgICAgICBjb3VudDogbG9uZ3Rhc2suY291bnQsXG4gICAgICAgICAgICAgIHN1bTogbG9uZ3Rhc2suZHVyYXRpb24sXG4gICAgICAgICAgICAgIG1heDogbG9uZ3Rhc2subWF4XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMy5zZXRTZXNzaW9uKHRyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyLm5hbWUgPT09IE5BTUVfVU5LTk9XTikge1xuICAgICAgICB0ci5uYW1lID0gc2x1Z2lmeVVybChjdXJyZW50VXJsKTtcbiAgICAgIH1cblxuICAgICAgY2FwdHVyZU5hdmlnYXRpb24odHIpO1xuXG4gICAgICBfdGhpczMuYWRqdXN0VHJhbnNhY3Rpb25UaW1lKHRyKTtcblxuICAgICAgdmFyIGJyZWFrZG93bk1ldHJpY3MgPSBfdGhpczMuX2NvbmZpZy5nZXQoJ2JyZWFrZG93bk1ldHJpY3MnKTtcblxuICAgICAgaWYgKGJyZWFrZG93bk1ldHJpY3MpIHtcbiAgICAgICAgdHIuY2FwdHVyZUJyZWFrZG93bigpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29uZmlnQ29udGV4dCA9IF90aGlzMy5fY29uZmlnLmdldCgnY29udGV4dCcpO1xuXG4gICAgICBhZGRUcmFuc2FjdGlvbkNvbnRleHQodHIsIGNvbmZpZ0NvbnRleHQpO1xuXG4gICAgICBfdGhpczMuX2NvbmZpZy5ldmVudHMuc2VuZChUUkFOU0FDVElPTl9FTkQsIFt0cl0pO1xuXG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBfdGhpczMuX2xvZ2dlci5kZWJ1ZyhcImVuZCB0cmFuc2FjdGlvbihcIiArIHRyLmlkICsgXCIsIFwiICsgdHIubmFtZSArIFwiLCBcIiArIHRyLnR5cGUgKyBcIilcIiwgdHIpO1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIF90aGlzMy5fbG9nZ2VyLmRlYnVnKFwiZXJyb3IgZW5kaW5nIHRyYW5zYWN0aW9uKFwiICsgdHIuaWQgKyBcIiwgXCIgKyB0ci5uYW1lICsgXCIpXCIsIGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLnNldFNlc3Npb24gPSBmdW5jdGlvbiBzZXRTZXNzaW9uKHRyKSB7XG4gICAgdmFyIHNlc3Npb24gPSB0aGlzLl9jb25maWcuZ2V0KCdzZXNzaW9uJyk7XG5cbiAgICBpZiAoc2Vzc2lvbikge1xuICAgICAgaWYgKHR5cGVvZiBzZXNzaW9uID09ICdib29sZWFuJykge1xuICAgICAgICB0ci5zZXNzaW9uID0ge1xuICAgICAgICAgIGlkOiBnZW5lcmF0ZVJhbmRvbUlkKDE2KSxcbiAgICAgICAgICBzZXF1ZW5jZTogMVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNlc3Npb24udGltZXN0YW1wICYmIERhdGUubm93KCkgLSBzZXNzaW9uLnRpbWVzdGFtcCA+IFNFU1NJT05fVElNRU9VVCkge1xuICAgICAgICAgIHRyLnNlc3Npb24gPSB7XG4gICAgICAgICAgICBpZDogZ2VuZXJhdGVSYW5kb21JZCgxNiksXG4gICAgICAgICAgICBzZXF1ZW5jZTogMVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHIuc2Vzc2lvbiA9IHtcbiAgICAgICAgICAgIGlkOiBzZXNzaW9uLmlkLFxuICAgICAgICAgICAgc2VxdWVuY2U6IHNlc3Npb24uc2VxdWVuY2UgPyBzZXNzaW9uLnNlcXVlbmNlICsgMSA6IDFcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBzZXNzaW9uQ29uZmlnID0ge1xuICAgICAgICBzZXNzaW9uOiB7XG4gICAgICAgICAgaWQ6IHRyLnNlc3Npb24uaWQsXG4gICAgICAgICAgc2VxdWVuY2U6IHRyLnNlc3Npb24uc2VxdWVuY2UsXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMuX2NvbmZpZy5zZXRDb25maWcoc2Vzc2lvbkNvbmZpZyk7XG5cbiAgICAgIHRoaXMuX2NvbmZpZy5zZXRMb2NhbENvbmZpZyhzZXNzaW9uQ29uZmlnLCB0cnVlKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmFkanVzdFRyYW5zYWN0aW9uVGltZSA9IGZ1bmN0aW9uIGFkanVzdFRyYW5zYWN0aW9uVGltZSh0cmFuc2FjdGlvbikge1xuICAgIHZhciBzcGFucyA9IHRyYW5zYWN0aW9uLnNwYW5zO1xuICAgIHZhciBlYXJsaWVzdFNwYW4gPSBnZXRFYXJsaWVzdFNwYW4oc3BhbnMpO1xuXG4gICAgaWYgKGVhcmxpZXN0U3BhbiAmJiBlYXJsaWVzdFNwYW4uX3N0YXJ0IDwgdHJhbnNhY3Rpb24uX3N0YXJ0KSB7XG4gICAgICB0cmFuc2FjdGlvbi5fc3RhcnQgPSBlYXJsaWVzdFNwYW4uX3N0YXJ0O1xuICAgIH1cblxuICAgIHZhciBsYXRlc3RTcGFuID0gZ2V0TGF0ZXN0Tm9uWEhSU3BhbihzcGFucykgfHwge307XG4gICAgdmFyIGxhdGVzdFNwYW5FbmQgPSBsYXRlc3RTcGFuLl9lbmQgfHwgMDtcblxuICAgIGlmICh0cmFuc2FjdGlvbi50eXBlID09PSBQQUdFX0xPQUQpIHtcbiAgICAgIHZhciB0cmFuc2FjdGlvbkVuZFdpdGhvdXREZWxheSA9IHRyYW5zYWN0aW9uLl9lbmQgLSBQQUdFX0xPQURfREVMQVk7XG4gICAgICB2YXIgbGNwID0gbWV0cmljcy5sY3AgfHwgMDtcbiAgICAgIHZhciBsYXRlc3RYSFJTcGFuID0gZ2V0TGF0ZXN0WEhSU3BhbihzcGFucykgfHwge307XG4gICAgICB2YXIgbGF0ZXN0WEhSU3BhbkVuZCA9IGxhdGVzdFhIUlNwYW4uX2VuZCB8fCAwO1xuICAgICAgdHJhbnNhY3Rpb24uX2VuZCA9IE1hdGgubWF4KGxhdGVzdFNwYW5FbmQsIGxhdGVzdFhIUlNwYW5FbmQsIGxjcCwgdHJhbnNhY3Rpb25FbmRXaXRob3V0RGVsYXkpO1xuICAgIH0gZWxzZSBpZiAobGF0ZXN0U3BhbkVuZCA+IHRyYW5zYWN0aW9uLl9lbmQpIHtcbiAgICAgIHRyYW5zYWN0aW9uLl9lbmQgPSBsYXRlc3RTcGFuRW5kO1xuICAgIH1cblxuICAgIHRoaXMudHJ1bmNhdGVTcGFucyhzcGFucywgdHJhbnNhY3Rpb24uX2VuZCk7XG4gIH07XG5cbiAgX3Byb3RvLnRydW5jYXRlU3BhbnMgPSBmdW5jdGlvbiB0cnVuY2F0ZVNwYW5zKHNwYW5zLCB0cmFuc2FjdGlvbkVuZCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcGFuID0gc3BhbnNbaV07XG5cbiAgICAgIGlmIChzcGFuLl9lbmQgPiB0cmFuc2FjdGlvbkVuZCkge1xuICAgICAgICBzcGFuLl9lbmQgPSB0cmFuc2FjdGlvbkVuZDtcbiAgICAgICAgc3Bhbi50eXBlICs9IFRSVU5DQVRFRF9UWVBFO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3Bhbi5fc3RhcnQgPiB0cmFuc2FjdGlvbkVuZCkge1xuICAgICAgICBzcGFuLl9zdGFydCA9IHRyYW5zYWN0aW9uRW5kO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uc2hvdWxkSWdub3JlVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiBzaG91bGRJZ25vcmVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbk5hbWUpIHtcbiAgICB2YXIgaWdub3JlTGlzdCA9IHRoaXMuX2NvbmZpZy5nZXQoJ2lnbm9yZVRyYW5zYWN0aW9ucycpO1xuXG4gICAgaWYgKGlnbm9yZUxpc3QgJiYgaWdub3JlTGlzdC5sZW5ndGgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWdub3JlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlbWVudCA9IGlnbm9yZUxpc3RbaV07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnRlc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudC50ZXN0KHRyYW5zYWN0aW9uTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID09PSB0cmFuc2FjdGlvbk5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBfcHJvdG8uc3RhcnRTcGFuID0gZnVuY3Rpb24gc3RhcnRTcGFuKG5hbWUsIHR5cGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgdHIgPSB0aGlzLmdldEN1cnJlbnRUcmFuc2FjdGlvbigpO1xuXG4gICAgaWYgKCF0cikge1xuICAgICAgdHIgPSB0aGlzLmNyZWF0ZUN1cnJlbnRUcmFuc2FjdGlvbih1bmRlZmluZWQsIFRFTVBPUkFSWV9UWVBFLCB0aGlzLmNyZWF0ZU9wdGlvbnMoe1xuICAgICAgICBjYW5SZXVzZTogdHJ1ZSxcbiAgICAgICAgbWFuYWdlZDogdHJ1ZVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHZhciBzcGFuID0gdHIuc3RhcnRTcGFuKG5hbWUsIHR5cGUsIG9wdGlvbnMpO1xuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhcInN0YXJ0U3BhbihcIiArIG5hbWUgKyBcIiwgXCIgKyBzcGFuLnR5cGUgKyBcIilcIiwgXCJvbiB0cmFuc2FjdGlvbihcIiArIHRyLmlkICsgXCIsIFwiICsgdHIubmFtZSArIFwiKVwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3BhbjtcbiAgfTtcblxuICBfcHJvdG8uZW5kU3BhbiA9IGZ1bmN0aW9uIGVuZFNwYW4oc3BhbiwgY29udGV4dCkge1xuICAgIGlmICghc3Bhbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB2YXIgdHIgPSB0aGlzLmdldEN1cnJlbnRUcmFuc2FjdGlvbigpO1xuICAgICAgdHIgJiYgdGhpcy5fbG9nZ2VyLmRlYnVnKFwiZW5kU3BhbihcIiArIHNwYW4ubmFtZSArIFwiLCBcIiArIHNwYW4udHlwZSArIFwiKVwiLCBcIm9uIHRyYW5zYWN0aW9uKFwiICsgdHIuaWQgKyBcIiwgXCIgKyB0ci5uYW1lICsgXCIpXCIpO1xuICAgIH1cblxuICAgIHNwYW4uZW5kKG51bGwsIGNvbnRleHQpO1xuICB9O1xuXG4gIHJldHVybiBUcmFuc2FjdGlvblNlcnZpY2U7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFRyYW5zYWN0aW9uU2VydmljZTsiLCJmdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuaW1wb3J0IFNwYW4gZnJvbSAnLi9zcGFuJztcbmltcG9ydCBTcGFuQmFzZSBmcm9tICcuL3NwYW4tYmFzZSc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJhbmRvbUlkLCBtZXJnZSwgbm93LCBnZXRUaW1lLCBleHRlbmQsIHJlbW92ZUludmFsaWRDaGFycyB9IGZyb20gJy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBSRVVTQUJJTElUWV9USFJFU0hPTEQsIFRSVU5DQVRFRF9UWVBFIH0gZnJvbSAnLi4vY29tbW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBjYXB0dXJlQnJlYWtkb3duIGFzIF9jYXB0dXJlQnJlYWtkb3duIH0gZnJvbSAnLi9icmVha2Rvd24nO1xuXG52YXIgVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoX1NwYW5CYXNlKSB7XG4gIF9pbmhlcml0c0xvb3NlKFRyYW5zYWN0aW9uLCBfU3BhbkJhc2UpO1xuXG4gIGZ1bmN0aW9uIFRyYW5zYWN0aW9uKG5hbWUsIHR5cGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfdGhpcyA9IF9TcGFuQmFzZS5jYWxsKHRoaXMsIG5hbWUsIHR5cGUsIG9wdGlvbnMpIHx8IHRoaXM7XG4gICAgX3RoaXMudHJhY2VJZCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICBfdGhpcy5tYXJrcyA9IHVuZGVmaW5lZDtcbiAgICBfdGhpcy5zcGFucyA9IFtdO1xuICAgIF90aGlzLl9hY3RpdmVTcGFucyA9IHt9O1xuICAgIF90aGlzLl9hY3RpdmVUYXNrcyA9IG5ldyBTZXQoKTtcbiAgICBfdGhpcy5ibG9ja2VkID0gZmFsc2U7XG4gICAgX3RoaXMuY2FwdHVyZVRpbWluZ3MgPSBmYWxzZTtcbiAgICBfdGhpcy5icmVha2Rvd25UaW1pbmdzID0gW107XG4gICAgX3RoaXMuc2FtcGxlUmF0ZSA9IF90aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25TYW1wbGVSYXRlO1xuICAgIF90aGlzLnNhbXBsZWQgPSBNYXRoLnJhbmRvbSgpIDw9IF90aGlzLnNhbXBsZVJhdGU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFRyYW5zYWN0aW9uLnByb3RvdHlwZTtcblxuICBfcHJvdG8uYWRkTWFya3MgPSBmdW5jdGlvbiBhZGRNYXJrcyhvYmopIHtcbiAgICB0aGlzLm1hcmtzID0gbWVyZ2UodGhpcy5tYXJrcyB8fCB7fSwgb2JqKTtcbiAgfTtcblxuICBfcHJvdG8ubWFyayA9IGZ1bmN0aW9uIG1hcmsoa2V5KSB7XG4gICAgdmFyIHNrZXkgPSByZW1vdmVJbnZhbGlkQ2hhcnMoa2V5KTtcblxuICAgIHZhciBtYXJrVGltZSA9IG5vdygpIC0gdGhpcy5fc3RhcnQ7XG5cbiAgICB2YXIgY3VzdG9tID0ge307XG4gICAgY3VzdG9tW3NrZXldID0gbWFya1RpbWU7XG4gICAgdGhpcy5hZGRNYXJrcyh7XG4gICAgICBjdXN0b206IGN1c3RvbVxuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5jYW5SZXVzZSA9IGZ1bmN0aW9uIGNhblJldXNlKCkge1xuICAgIHZhciB0aHJlc2hvbGQgPSB0aGlzLm9wdGlvbnMucmV1c2VUaHJlc2hvbGQgfHwgUkVVU0FCSUxJVFlfVEhSRVNIT0xEO1xuICAgIHJldHVybiAhIXRoaXMub3B0aW9ucy5jYW5SZXVzZSAmJiAhdGhpcy5lbmRlZCAmJiBub3coKSAtIHRoaXMuX3N0YXJ0IDwgdGhyZXNob2xkO1xuICB9O1xuXG4gIF9wcm90by5yZWRlZmluZSA9IGZ1bmN0aW9uIHJlZGVmaW5lKG5hbWUsIHR5cGUsIG9wdGlvbnMpIHtcbiAgICBpZiAobmFtZSkge1xuICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSkge1xuICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zLnJldXNlVGhyZXNob2xkID0gb3B0aW9ucy5yZXVzZVRocmVzaG9sZDtcbiAgICAgIGV4dGVuZCh0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uc3RhcnRTcGFuID0gZnVuY3Rpb24gc3RhcnRTcGFuKG5hbWUsIHR5cGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmICh0aGlzLmVuZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG9wdHMgPSBleHRlbmQoe30sIG9wdGlvbnMpO1xuXG4gICAgb3B0cy5vbkVuZCA9IGZ1bmN0aW9uICh0cmMpIHtcbiAgICAgIF90aGlzMi5fb25TcGFuRW5kKHRyYyk7XG4gICAgfTtcblxuICAgIG9wdHMudHJhY2VJZCA9IHRoaXMudHJhY2VJZDtcbiAgICBvcHRzLnNhbXBsZWQgPSB0aGlzLnNhbXBsZWQ7XG4gICAgb3B0cy5zYW1wbGVSYXRlID0gdGhpcy5zYW1wbGVSYXRlO1xuXG4gICAgaWYgKCFvcHRzLnBhcmVudElkKSB7XG4gICAgICBvcHRzLnBhcmVudElkID0gdGhpcy5pZDtcbiAgICB9XG5cbiAgICB2YXIgc3BhbiA9IG5ldyBTcGFuKG5hbWUsIHR5cGUsIG9wdHMpO1xuICAgIHRoaXMuX2FjdGl2ZVNwYW5zW3NwYW4uaWRdID0gc3BhbjtcblxuICAgIGlmIChvcHRzLmJsb2NraW5nKSB7XG4gICAgICB0aGlzLmFkZFRhc2soc3Bhbi5pZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNwYW47XG4gIH07XG5cbiAgX3Byb3RvLmlzRmluaXNoZWQgPSBmdW5jdGlvbiBpc0ZpbmlzaGVkKCkge1xuICAgIHJldHVybiAhdGhpcy5ibG9ja2VkICYmIHRoaXMuX2FjdGl2ZVRhc2tzLnNpemUgPT09IDA7XG4gIH07XG5cbiAgX3Byb3RvLmRldGVjdEZpbmlzaCA9IGZ1bmN0aW9uIGRldGVjdEZpbmlzaCgpIHtcbiAgICBpZiAodGhpcy5pc0ZpbmlzaGVkKCkpIHRoaXMuZW5kKCk7XG4gIH07XG5cbiAgX3Byb3RvLmVuZCA9IGZ1bmN0aW9uIGVuZChlbmRUaW1lKSB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9lbmQgPSBnZXRUaW1lKGVuZFRpbWUpO1xuXG4gICAgZm9yICh2YXIgc2lkIGluIHRoaXMuX2FjdGl2ZVNwYW5zKSB7XG4gICAgICB2YXIgc3BhbiA9IHRoaXMuX2FjdGl2ZVNwYW5zW3NpZF07XG4gICAgICBzcGFuLnR5cGUgPSBzcGFuLnR5cGUgKyBUUlVOQ0FURURfVFlQRTtcbiAgICAgIHNwYW4uZW5kKGVuZFRpbWUpO1xuICAgIH1cblxuICAgIHRoaXMuY2FsbE9uRW5kKCk7XG4gIH07XG5cbiAgX3Byb3RvLmNhcHR1cmVCcmVha2Rvd24gPSBmdW5jdGlvbiBjYXB0dXJlQnJlYWtkb3duKCkge1xuICAgIHRoaXMuYnJlYWtkb3duVGltaW5ncyA9IF9jYXB0dXJlQnJlYWtkb3duKHRoaXMpO1xuICB9O1xuXG4gIF9wcm90by5ibG9jayA9IGZ1bmN0aW9uIGJsb2NrKGZsYWcpIHtcbiAgICB0aGlzLmJsb2NrZWQgPSBmbGFnO1xuXG4gICAgaWYgKCF0aGlzLmJsb2NrZWQpIHtcbiAgICAgIHRoaXMuZGV0ZWN0RmluaXNoKCk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5hZGRUYXNrID0gZnVuY3Rpb24gYWRkVGFzayh0YXNrSWQpIHtcbiAgICBpZiAoIXRhc2tJZCkge1xuICAgICAgdGFza0lkID0gJ3Rhc2stJyArIGdlbmVyYXRlUmFuZG9tSWQoMTYpO1xuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZVRhc2tzLmFkZCh0YXNrSWQpO1xuXG4gICAgcmV0dXJuIHRhc2tJZDtcbiAgfTtcblxuICBfcHJvdG8ucmVtb3ZlVGFzayA9IGZ1bmN0aW9uIHJlbW92ZVRhc2sodGFza0lkKSB7XG4gICAgdmFyIGRlbGV0ZWQgPSB0aGlzLl9hY3RpdmVUYXNrcy5kZWxldGUodGFza0lkKTtcblxuICAgIGRlbGV0ZWQgJiYgdGhpcy5kZXRlY3RGaW5pc2goKTtcbiAgfTtcblxuICBfcHJvdG8ucmVzZXRGaWVsZHMgPSBmdW5jdGlvbiByZXNldEZpZWxkcygpIHtcbiAgICB0aGlzLnNwYW5zID0gW107XG4gICAgdGhpcy5zYW1wbGVSYXRlID0gMDtcbiAgfTtcblxuICBfcHJvdG8uX29uU3BhbkVuZCA9IGZ1bmN0aW9uIF9vblNwYW5FbmQoc3Bhbikge1xuICAgIHRoaXMuc3BhbnMucHVzaChzcGFuKTtcbiAgICBkZWxldGUgdGhpcy5fYWN0aXZlU3BhbnNbc3Bhbi5pZF07XG4gICAgdGhpcy5yZW1vdmVUYXNrKHNwYW4uaWQpO1xuICB9O1xuXG4gIF9wcm90by5pc01hbmFnZWQgPSBmdW5jdGlvbiBpc01hbmFnZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5vcHRpb25zLm1hbmFnZWQ7XG4gIH07XG5cbiAgcmV0dXJuIFRyYW5zYWN0aW9uO1xufShTcGFuQmFzZSk7XG5cbmV4cG9ydCBkZWZhdWx0IFRyYW5zYWN0aW9uOyIsInZhciBfX0RFVl9fID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJztcblxudmFyIHN0YXRlID0ge1xuICBib290c3RyYXBUaW1lOiBudWxsLFxuICBsYXN0SGlkZGVuU3RhcnQ6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSXG59O1xuZXhwb3J0IHsgX19ERVZfXywgc3RhdGUgfTsiLCIvKipcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LXByZXNlbnQsIEVsYXN0aWNzZWFyY2ggQlZcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICpcbiAqL1xuXG5pbXBvcnQge1xuICBnZXRJbnN0cnVtZW50YXRpb25GbGFncyxcbiAgUEFHRV9MT0FEX0RFTEFZLFxuICBQQUdFX0xPQUQsXG4gIEVSUk9SLFxuICBDT05GSUdfU0VSVklDRSxcbiAgTE9HR0lOR19TRVJWSUNFLFxuICBUUkFOU0FDVElPTl9TRVJWSUNFLFxuICBQRVJGT1JNQU5DRV9NT05JVE9SSU5HLFxuICBFUlJPUl9MT0dHSU5HLFxuICBBUE1fU0VSVkVSLFxuICBFVkVOVF9UQVJHRVQsXG4gIENMSUNLLFxuICBvYnNlcnZlUGFnZVZpc2liaWxpdHksXG4gIG9ic2VydmVQYWdlQ2xpY2tzXG59IGZyb20gJ0BlbGFzdGljL2FwbS1ydW0tY29yZSdcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBtQmFzZSB7XG4gIGNvbnN0cnVjdG9yKHNlcnZpY2VGYWN0b3J5LCBkaXNhYmxlKSB7XG4gICAgdGhpcy5fZGlzYWJsZSA9IGRpc2FibGVcbiAgICB0aGlzLnNlcnZpY2VGYWN0b3J5ID0gc2VydmljZUZhY3RvcnlcbiAgICB0aGlzLl9pbml0aWFsaXplZCA9IGZhbHNlXG4gIH1cblxuICBpc0VuYWJsZWQoKSB7XG4gICAgcmV0dXJuICF0aGlzLl9kaXNhYmxlXG4gIH1cblxuICBpc0FjdGl2ZSgpIHtcbiAgICBjb25zdCBjb25maWdTZXJ2aWNlID0gdGhpcy5zZXJ2aWNlRmFjdG9yeS5nZXRTZXJ2aWNlKENPTkZJR19TRVJWSUNFKVxuICAgIHJldHVybiB0aGlzLmlzRW5hYmxlZCgpICYmIHRoaXMuX2luaXRpYWxpemVkICYmIGNvbmZpZ1NlcnZpY2UuZ2V0KCdhY3RpdmUnKVxuICB9XG5cbiAgaW5pdChjb25maWcpIHtcbiAgICBpZiAodGhpcy5pc0VuYWJsZWQoKSAmJiAhdGhpcy5faW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZVxuICAgICAgY29uc3QgW1xuICAgICAgICBjb25maWdTZXJ2aWNlLFxuICAgICAgICBsb2dnaW5nU2VydmljZSxcbiAgICAgICAgdHJhbnNhY3Rpb25TZXJ2aWNlXG4gICAgICBdID0gdGhpcy5zZXJ2aWNlRmFjdG9yeS5nZXRTZXJ2aWNlKFtcbiAgICAgICAgQ09ORklHX1NFUlZJQ0UsXG4gICAgICAgIExPR0dJTkdfU0VSVklDRSxcbiAgICAgICAgVFJBTlNBQ1RJT05fU0VSVklDRVxuICAgICAgXSlcbiAgICAgIC8qKlxuICAgICAgICogU2V0IEFnZW50IHZlcnNpb24gdG8gYmUgc2VudCBhcyBwYXJ0IG9mIG1ldGFkYXRhIHRvIHRoZSBBUE0gU2VydmVyXG4gICAgICAgKi9cbiAgICAgIGNvbmZpZ1NlcnZpY2Uuc2V0VmVyc2lvbignNS4xMi4wJylcbiAgICAgIHRoaXMuY29uZmlnKGNvbmZpZylcbiAgICAgIC8qKlxuICAgICAgICogU2V0IGxldmVsIGhlcmUgdG8gYWNjb3VudCBmb3IgYm90aCBhY3RpdmUgYW5kIGluYWN0aXZlIGNhc2VzXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGxvZ0xldmVsID0gY29uZmlnU2VydmljZS5nZXQoJ2xvZ0xldmVsJylcbiAgICAgIGxvZ2dpbmdTZXJ2aWNlLnNldExldmVsKGxvZ0xldmVsKVxuICAgICAgLyoqXG4gICAgICAgKiBEZWFjdGl2ZSBhZ2VudCB3aGVuIHRoZSBhY3RpdmUgY29uZmlnIGZsYWcgaXMgc2V0IHRvIGZhbHNlXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGlzQ29uZmlnQWN0aXZlID0gY29uZmlnU2VydmljZS5nZXQoJ2FjdGl2ZScpXG4gICAgICBpZiAoaXNDb25maWdBY3RpdmUpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlRmFjdG9yeS5pbml0KClcblxuICAgICAgICBjb25zdCBmbGFncyA9IGdldEluc3RydW1lbnRhdGlvbkZsYWdzKFxuICAgICAgICAgIGNvbmZpZ1NlcnZpY2UuZ2V0KCdpbnN0cnVtZW50JyksXG4gICAgICAgICAgY29uZmlnU2VydmljZS5nZXQoJ2Rpc2FibGVJbnN0cnVtZW50YXRpb25zJylcbiAgICAgICAgKVxuXG4gICAgICAgIGNvbnN0IHBlcmZvcm1hbmNlTW9uaXRvcmluZyA9IHRoaXMuc2VydmljZUZhY3RvcnkuZ2V0U2VydmljZShcbiAgICAgICAgICBQRVJGT1JNQU5DRV9NT05JVE9SSU5HXG4gICAgICAgIClcbiAgICAgICAgcGVyZm9ybWFuY2VNb25pdG9yaW5nLmluaXQoZmxhZ3MpXG5cbiAgICAgICAgaWYgKGZsYWdzW0VSUk9SXSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yTG9nZ2luZyA9IHRoaXMuc2VydmljZUZhY3RvcnkuZ2V0U2VydmljZShFUlJPUl9MT0dHSU5HKVxuICAgICAgICAgIGVycm9yTG9nZ2luZy5yZWdpc3Rlckxpc3RlbmVycygpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnU2VydmljZS5nZXQoJ3Nlc3Npb24nKSkge1xuICAgICAgICAgIGxldCBsb2NhbENvbmZpZyA9IGNvbmZpZ1NlcnZpY2UuZ2V0TG9jYWxDb25maWcoKVxuICAgICAgICAgIGlmIChsb2NhbENvbmZpZyAmJiBsb2NhbENvbmZpZy5zZXNzaW9uKSB7XG4gICAgICAgICAgICBjb25maWdTZXJ2aWNlLnNldENvbmZpZyh7XG4gICAgICAgICAgICAgIHNlc3Npb246IGxvY2FsQ29uZmlnLnNlc3Npb25cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VuZFBhZ2VMb2FkID0gKCkgPT5cbiAgICAgICAgICBmbGFnc1tQQUdFX0xPQURdICYmIHRoaXMuX3NlbmRQYWdlTG9hZE1ldHJpY3MoKVxuXG4gICAgICAgIGlmIChjb25maWdTZXJ2aWNlLmdldCgnY2VudHJhbENvbmZpZycpKSB7XG4gICAgICAgICAgLyoqXG4gICAgICAgICAgICogV2FpdGluZyBmb3IgdGhlIHJlbW90ZSBjb25maWcgYmVmb3JlIHNlbmRpbmcgdGhlIHBhZ2UgbG9hZCB0cmFuc2FjdGlvblxuICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMuZmV0Y2hDZW50cmFsQ29uZmlnKCkudGhlbihzZW5kUGFnZUxvYWQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2VuZFBhZ2VMb2FkKClcbiAgICAgICAgfVxuXG4gICAgICAgIG9ic2VydmVQYWdlVmlzaWJpbGl0eShjb25maWdTZXJ2aWNlLCB0cmFuc2FjdGlvblNlcnZpY2UpXG4gICAgICAgIGlmIChmbGFnc1tFVkVOVF9UQVJHRVRdICYmIGZsYWdzW0NMSUNLXSkge1xuICAgICAgICAgIG9ic2VydmVQYWdlQ2xpY2tzKHRyYW5zYWN0aW9uU2VydmljZSlcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZSA9IHRydWVcbiAgICAgICAgbG9nZ2luZ1NlcnZpY2Uud2FybignUlVNIGFnZW50IGlzIGluYWN0aXZlJylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBgZmV0Y2hDZW50cmFsQ29uZmlnYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYWx3YXlzIHJlc29sdmVcbiAgICogaWYgdGhlIGludGVybmFsIGNvbmZpZyBmZXRjaCBmYWlscyB0aGUgdGhlIHByb21pc2UgcmVzb2x2ZXMgdG8gYHVuZGVmaW5lZGAgb3RoZXJ3aXNlXG4gICAqIGl0IHJlc29sdmVzIHRvIHRoZSBmZXRjaGVkIGNvbmZpZy5cbiAgICovXG4gIGZldGNoQ2VudHJhbENvbmZpZygpIHtcbiAgICBjb25zdCBbXG4gICAgICBhcG1TZXJ2ZXIsXG4gICAgICBsb2dnaW5nU2VydmljZSxcbiAgICAgIGNvbmZpZ1NlcnZpY2VcbiAgICBdID0gdGhpcy5zZXJ2aWNlRmFjdG9yeS5nZXRTZXJ2aWNlKFtcbiAgICAgIEFQTV9TRVJWRVIsXG4gICAgICBMT0dHSU5HX1NFUlZJQ0UsXG4gICAgICBDT05GSUdfU0VSVklDRVxuICAgIF0pXG5cbiAgICByZXR1cm4gYXBtU2VydmVyXG4gICAgICAuZmV0Y2hDb25maWcoXG4gICAgICAgIGNvbmZpZ1NlcnZpY2UuZ2V0KCdzZXJ2aWNlTmFtZScpLFxuICAgICAgICBjb25maWdTZXJ2aWNlLmdldCgnZW52aXJvbm1lbnQnKVxuICAgICAgKVxuICAgICAgLnRoZW4oY29uZmlnID0+IHtcbiAgICAgICAgdmFyIHRyYW5zYWN0aW9uU2FtcGxlUmF0ZSA9IGNvbmZpZ1sndHJhbnNhY3Rpb25fc2FtcGxlX3JhdGUnXVxuICAgICAgICBpZiAodHJhbnNhY3Rpb25TYW1wbGVSYXRlKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb25TYW1wbGVSYXRlID0gTnVtYmVyKHRyYW5zYWN0aW9uU2FtcGxlUmF0ZSlcbiAgICAgICAgICBjb25zdCBjb25maWcgPSB7IHRyYW5zYWN0aW9uU2FtcGxlUmF0ZSB9XG4gICAgICAgICAgY29uc3QgeyBpbnZhbGlkIH0gPSBjb25maWdTZXJ2aWNlLnZhbGlkYXRlKGNvbmZpZylcbiAgICAgICAgICBpZiAoaW52YWxpZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZ1NlcnZpY2Uuc2V0Q29uZmlnKGNvbmZpZylcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeyBrZXksIHZhbHVlLCBhbGxvd2VkIH0gPSBpbnZhbGlkWzBdXG4gICAgICAgICAgICBsb2dnaW5nU2VydmljZS53YXJuKFxuICAgICAgICAgICAgICBgaW52YWxpZCB2YWx1ZSBcIiR7dmFsdWV9XCIgZm9yICR7a2V5fS4gQWxsb3dlZDogJHthbGxvd2VkfS5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25maWdcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBsb2dnaW5nU2VydmljZS53YXJuKCdmYWlsZWQgZmV0Y2hpbmcgY29uZmlnOicsIGVycm9yKVxuICAgICAgfSlcbiAgfVxuXG4gIF9zZW5kUGFnZUxvYWRNZXRyaWNzKCkge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIHRyYW5zYWN0aW9uIGlzIHNldCBpbiB0cmFuc2FjdGlvbiBzZXJ2aWNlIHRvXG4gICAgICogYXZvaWQgZHVwbGljYXRpbmcgdGhlIGxvZ2ljIGF0IG11bHRpcGxlIHBsYWNlc1xuICAgICAqL1xuICAgIGNvbnN0IHRyID0gdGhpcy5zdGFydFRyYW5zYWN0aW9uKHVuZGVmaW5lZCwgUEFHRV9MT0FELCB7XG4gICAgICBtYW5hZ2VkOiB0cnVlLFxuICAgICAgY2FuUmV1c2U6IHRydWVcbiAgICB9KVxuXG4gICAgaWYgKCF0cikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHIuYWRkVGFzayhQQUdFX0xPQUQpXG4gICAgY29uc3Qgc2VuZFBhZ2VMb2FkTWV0cmljcyA9ICgpID0+IHtcbiAgICAgIC8vIFRoZSByZWFzb25zIG9mIHRoaXMgdGltZW91dCBhcmU6XG4gICAgICAvLyAxLiB0byBtYWtlIHN1cmUgUGVyZm9ybWFuY2VUaW1pbmcubG9hZEV2ZW50RW5kIGhhcyBhIHZhbHVlLlxuICAgICAgLy8gMi4gdG8gbWFrZSBzdXJlIHRoZSBhZ2VudCBpbnRlcmNlcHRzIGFsbCB0aGUgTENQIGVudHJpZXMgdHJpZ2dlcmVkIGJ5IHRoZSBicm93c2VyIChhZGRpbmcgYSBkZWxheSBpbiB0aGUgdGltZW91dCkuXG4gICAgICAvLyBUaGUgYnJvd3NlciBtaWdodCBuZWVkIG1vcmUgdGltZSBhZnRlciB0aGUgcGFnZWxvYWQgZXZlbnQgdG8gcmVuZGVyIG90aGVyIGVsZW1lbnRzIChlLmcuIGltYWdlcykuXG4gICAgICAvLyBUaGF0J3MgaW1wb3J0YW50IGJlY2F1c2UgYSBMQ1AgaXMgb25seSB0cmlnZ2VyZWQgd2hlbiB0aGUgcmVsYXRlZCBlbGVtZW50IGlzIGNvbXBsZXRlbHkgcmVuZGVyZWQuXG4gICAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vbGFyZ2VzdC1jb250ZW50ZnVsLXBhaW50LyNzZWMtYWRkLWxjcC1lbnRyeVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0ci5yZW1vdmVUYXNrKFBBR0VfTE9BRCksIFBBR0VfTE9BRF9ERUxBWSlcbiAgICB9XG5cbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgc2VuZFBhZ2VMb2FkTWV0cmljcygpXG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgc2VuZFBhZ2VMb2FkTWV0cmljcylcbiAgICB9XG4gIH1cblxuICBvYnNlcnZlKG5hbWUsIGZuKSB7XG4gICAgY29uc3QgY29uZmlnU2VydmljZSA9IHRoaXMuc2VydmljZUZhY3RvcnkuZ2V0U2VydmljZShDT05GSUdfU0VSVklDRSlcbiAgICBjb25maWdTZXJ2aWNlLmV2ZW50cy5vYnNlcnZlKG5hbWUsIGZuKVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIHJlcXVpcmVkIGNvbmZpZyBrZXlzIGFyZSBpbnZhbGlkLCB0aGUgYWdlbnQgaXMgZGVhY3RpdmF0ZWQgd2l0aFxuICAgKiBsb2dnaW5nIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAqXG4gICAqIHZhbGlkYXRpb24gZXJyb3IgZm9ybWF0XG4gICAqIHtcbiAgICogIG1pc3Npbmc6IFsgJ2tleTEnLCAna2V5MiddLFxuICAgKiAgaW52YWxpZDogW3tcbiAgICogICAga2V5OiAnYScsXG4gICAqICAgIHZhbHVlOiAnYWJjZCcsXG4gICAqICAgIGFsbG93ZWQ6ICdzdHJpbmcnXG4gICAqICB9XSxcbiAgICogIHVua25vd246IFsna2V5MycsICdrZXk0J11cbiAgICogfVxuICAgKi9cbiAgY29uZmlnKGNvbmZpZykge1xuICAgIGNvbnN0IFtjb25maWdTZXJ2aWNlLCBsb2dnaW5nU2VydmljZV0gPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoW1xuICAgICAgQ09ORklHX1NFUlZJQ0UsXG4gICAgICBMT0dHSU5HX1NFUlZJQ0VcbiAgICBdKVxuICAgIGNvbnN0IHsgbWlzc2luZywgaW52YWxpZCwgdW5rbm93biB9ID0gY29uZmlnU2VydmljZS52YWxpZGF0ZShjb25maWcpXG4gICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICdVbmtub3duIGNvbmZpZyBvcHRpb25zIGFyZSBzcGVjaWZpZWQgZm9yIFJVTSBhZ2VudDogJyArXG4gICAgICAgIHVua25vd24uam9pbignLCAnKVxuICAgICAgbG9nZ2luZ1NlcnZpY2Uud2FybihtZXNzYWdlKVxuICAgIH1cblxuICAgIGlmIChtaXNzaW5nLmxlbmd0aCA9PT0gMCAmJiBpbnZhbGlkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uZmlnU2VydmljZS5zZXRDb25maWcoY29uZmlnKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZXBhcmF0b3IgPSAnLCAnXG4gICAgICBsZXQgbWVzc2FnZSA9IFwiUlVNIGFnZW50IGlzbid0IGNvcnJlY3RseSBjb25maWd1cmVkLiBcIlxuXG4gICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gbWlzc2luZy5qb2luKHNlcGFyYXRvcikgKyAnIGlzIG1pc3NpbmcnXG4gICAgICAgIGlmIChpbnZhbGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtZXNzYWdlICs9IHNlcGFyYXRvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGludmFsaWQuZm9yRWFjaCgoeyBrZXksIHZhbHVlLCBhbGxvd2VkIH0sIGluZGV4KSA9PiB7XG4gICAgICAgIG1lc3NhZ2UgKz1cbiAgICAgICAgICBgJHtrZXl9IFwiJHt2YWx1ZX1cIiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMhIChhbGxvd2VkOiAke2FsbG93ZWR9KWAgK1xuICAgICAgICAgIChpbmRleCAhPT0gaW52YWxpZC5sZW5ndGggLSAxID8gc2VwYXJhdG9yIDogJycpXG4gICAgICB9KVxuICAgICAgbG9nZ2luZ1NlcnZpY2UuZXJyb3IobWVzc2FnZSlcbiAgICAgIGNvbmZpZ1NlcnZpY2Uuc2V0Q29uZmlnKHsgYWN0aXZlOiBmYWxzZSB9KVxuICAgIH1cbiAgfVxuXG4gIHNldFVzZXJDb250ZXh0KHVzZXJDb250ZXh0KSB7XG4gICAgdmFyIGNvbmZpZ1NlcnZpY2UgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoQ09ORklHX1NFUlZJQ0UpXG4gICAgY29uZmlnU2VydmljZS5zZXRVc2VyQ29udGV4dCh1c2VyQ29udGV4dClcbiAgfVxuXG4gIHNldEN1c3RvbUNvbnRleHQoY3VzdG9tQ29udGV4dCkge1xuICAgIHZhciBjb25maWdTZXJ2aWNlID0gdGhpcy5zZXJ2aWNlRmFjdG9yeS5nZXRTZXJ2aWNlKENPTkZJR19TRVJWSUNFKVxuICAgIGNvbmZpZ1NlcnZpY2Uuc2V0Q3VzdG9tQ29udGV4dChjdXN0b21Db250ZXh0KVxuICB9XG5cbiAgYWRkTGFiZWxzKGxhYmVscykge1xuICAgIHZhciBjb25maWdTZXJ2aWNlID0gdGhpcy5zZXJ2aWNlRmFjdG9yeS5nZXRTZXJ2aWNlKENPTkZJR19TRVJWSUNFKVxuICAgIGNvbmZpZ1NlcnZpY2UuYWRkTGFiZWxzKGxhYmVscylcbiAgfVxuXG4gIC8vIFNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGJlZm9yZSAnbG9hZCcgZXZlbnQgb24gd2luZG93IGlzIGZpcmVkXG4gIHNldEluaXRpYWxQYWdlTG9hZE5hbWUobmFtZSkge1xuICAgIGNvbnN0IGNvbmZpZ1NlcnZpY2UgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoQ09ORklHX1NFUlZJQ0UpXG4gICAgY29uZmlnU2VydmljZS5zZXRDb25maWcoe1xuICAgICAgcGFnZUxvYWRUcmFuc2FjdGlvbk5hbWU6IG5hbWVcbiAgICB9KVxuICB9XG5cbiAgc3RhcnRUcmFuc2FjdGlvbihuYW1lLCB0eXBlLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHtcbiAgICAgIHZhciB0cmFuc2FjdGlvblNlcnZpY2UgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoXG4gICAgICAgIFRSQU5TQUNUSU9OX1NFUlZJQ0VcbiAgICAgIClcbiAgICAgIHJldHVybiB0cmFuc2FjdGlvblNlcnZpY2Uuc3RhcnRUcmFuc2FjdGlvbihuYW1lLCB0eXBlLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIHN0YXJ0U3BhbihuYW1lLCB0eXBlLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHtcbiAgICAgIHZhciB0cmFuc2FjdGlvblNlcnZpY2UgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoXG4gICAgICAgIFRSQU5TQUNUSU9OX1NFUlZJQ0VcbiAgICAgIClcbiAgICAgIHJldHVybiB0cmFuc2FjdGlvblNlcnZpY2Uuc3RhcnRTcGFuKG5hbWUsIHR5cGUsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgZ2V0Q3VycmVudFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSB7XG4gICAgICB2YXIgdHJhbnNhY3Rpb25TZXJ2aWNlID0gdGhpcy5zZXJ2aWNlRmFjdG9yeS5nZXRTZXJ2aWNlKFxuICAgICAgICBUUkFOU0FDVElPTl9TRVJWSUNFXG4gICAgICApXG4gICAgICByZXR1cm4gdHJhbnNhY3Rpb25TZXJ2aWNlLmdldEN1cnJlbnRUcmFuc2FjdGlvbigpXG4gICAgfVxuICB9XG5cbiAgY2FwdHVyZUVycm9yKGVycm9yKSB7XG4gICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHtcbiAgICAgIHZhciBlcnJvckxvZ2dpbmcgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoRVJST1JfTE9HR0lORylcbiAgICAgIHJldHVybiBlcnJvckxvZ2dpbmcubG9nRXJyb3IoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgYWRkRmlsdGVyKGZuKSB7XG4gICAgdmFyIGNvbmZpZ1NlcnZpY2UgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoQ09ORklHX1NFUlZJQ0UpXG4gICAgY29uZmlnU2VydmljZS5hZGRGaWx0ZXIoZm4pXG4gIH1cbn1cbiIsIihmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIC8vIFVuaXZlcnNhbCBNb2R1bGUgRGVmaW5pdGlvbiAoVU1EKSB0byBzdXBwb3J0IEFNRCwgQ29tbW9uSlMvTm9kZS5qcywgUmhpbm8sIGFuZCBicm93c2Vycy5cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoJ2Vycm9yLXN0YWNrLXBhcnNlcicsIFsnc3RhY2tmcmFtZSddLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnc3RhY2tmcmFtZScpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByb290LkVycm9yU3RhY2tQYXJzZXIgPSBmYWN0b3J5KHJvb3QuU3RhY2tGcmFtZSk7XG4gICAgfVxufSh0aGlzLCBmdW5jdGlvbiBFcnJvclN0YWNrUGFyc2VyKFN0YWNrRnJhbWUpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgRklSRUZPWF9TQUZBUklfU1RBQ0tfUkVHRVhQID0gLyhefEApXFxTK1xcOlxcZCsvO1xuICAgIHZhciBDSFJPTUVfSUVfU1RBQ0tfUkVHRVhQID0gL15cXHMqYXQgLiooXFxTK1xcOlxcZCt8XFwobmF0aXZlXFwpKS9tO1xuICAgIHZhciBTQUZBUklfTkFUSVZFX0NPREVfUkVHRVhQID0gL14oZXZhbEApPyhcXFtuYXRpdmUgY29kZVxcXSk/JC87XG5cbiAgICBmdW5jdGlvbiBfbWFwKGFycmF5LCBmbiwgdGhpc0FyZykge1xuICAgICAgICBpZiAodHlwZW9mIEFycmF5LnByb3RvdHlwZS5tYXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZm4sIHRoaXNBcmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IG5ldyBBcnJheShhcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9IGZuLmNhbGwodGhpc0FyZywgYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIF9maWx0ZXIoYXJyYXksIGZuLCB0aGlzQXJnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgQXJyYXkucHJvdG90eXBlLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5LmZpbHRlcihmbiwgdGhpc0FyZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwodGhpc0FyZywgYXJyYXlbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGFycmF5W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2luZGV4T2YoYXJyYXksIHRhcmdldCkge1xuICAgICAgICBpZiAodHlwZW9mIEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyYXkuaW5kZXhPZih0YXJnZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHaXZlbiBhbiBFcnJvciBvYmplY3QsIGV4dHJhY3QgdGhlIG1vc3QgaW5mb3JtYXRpb24gZnJvbSBpdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3Igb2JqZWN0XG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBvZiBTdGFja0ZyYW1lc1xuICAgICAgICAgKi9cbiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIEVycm9yU3RhY2tQYXJzZXIkJHBhcnNlKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVycm9yLnN0YWNrdHJhY2UgIT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBlcnJvclsnb3BlcmEjc291cmNlbG9jJ10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VPcGVyYShlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yLnN0YWNrICYmIGVycm9yLnN0YWNrLm1hdGNoKENIUk9NRV9JRV9TVEFDS19SRUdFWFApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWOE9ySUUoZXJyb3IpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5zdGFjaykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlRkZPclNhZmFyaShlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBhcnNlIGdpdmVuIEVycm9yIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFNlcGFyYXRlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIGZyb20gYSBzdHJpbmcgb2YgdGhlIGZvcm06IChVUkk6TGluZTpDb2x1bW4pXG4gICAgICAgIGV4dHJhY3RMb2NhdGlvbjogZnVuY3Rpb24gRXJyb3JTdGFja1BhcnNlciQkZXh0cmFjdExvY2F0aW9uKHVybExpa2UpIHtcbiAgICAgICAgICAgIC8vIEZhaWwtZmFzdCBidXQgcmV0dXJuIGxvY2F0aW9ucyBsaWtlIFwiKG5hdGl2ZSlcIlxuICAgICAgICAgICAgaWYgKHVybExpa2UuaW5kZXhPZignOicpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbdXJsTGlrZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZWdFeHAgPSAvKC4rPykoPzpcXDooXFxkKykpPyg/OlxcOihcXGQrKSk/JC87XG4gICAgICAgICAgICB2YXIgcGFydHMgPSByZWdFeHAuZXhlYyh1cmxMaWtlLnJlcGxhY2UoL1tcXChcXCldL2csICcnKSk7XG4gICAgICAgICAgICByZXR1cm4gW3BhcnRzWzFdLCBwYXJ0c1syXSB8fCB1bmRlZmluZWQsIHBhcnRzWzNdIHx8IHVuZGVmaW5lZF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFyc2VWOE9ySUU6IGZ1bmN0aW9uIEVycm9yU3RhY2tQYXJzZXIkJHBhcnNlVjhPcklFKGVycm9yKSB7XG4gICAgICAgICAgICB2YXIgZmlsdGVyZWQgPSBfZmlsdGVyKGVycm9yLnN0YWNrLnNwbGl0KCdcXG4nKSwgZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhIWxpbmUubWF0Y2goQ0hST01FX0lFX1NUQUNLX1JFR0VYUCk7XG4gICAgICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICAgICAgcmV0dXJuIF9tYXAoZmlsdGVyZWQsIGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAobGluZS5pbmRleE9mKCcoZXZhbCAnKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRocm93IGF3YXkgZXZhbCBpbmZvcm1hdGlvbiB1bnRpbCB3ZSBpbXBsZW1lbnQgc3RhY2t0cmFjZS5qcy9zdGFja2ZyYW1lIzhcbiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgvZXZhbCBjb2RlL2csICdldmFsJykucmVwbGFjZSgvKFxcKGV2YWwgYXQgW15cXCgpXSopfChcXClcXCwuKiQpL2csICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IGxpbmUucmVwbGFjZSgvXlxccysvLCAnJykucmVwbGFjZSgvXFwoZXZhbCBjb2RlL2csICcoJykuc3BsaXQoL1xccysvKS5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb25QYXJ0cyA9IHRoaXMuZXh0cmFjdExvY2F0aW9uKHRva2Vucy5wb3AoKSk7XG4gICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uTmFtZSA9IHRva2Vucy5qb2luKCcgJykgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9IF9pbmRleE9mKFsnZXZhbCcsICc8YW5vbnltb3VzPiddLCBsb2NhdGlvblBhcnRzWzBdKSA+IC0xID8gdW5kZWZpbmVkIDogbG9jYXRpb25QYXJ0c1swXTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhY2tGcmFtZShmdW5jdGlvbk5hbWUsIHVuZGVmaW5lZCwgZmlsZU5hbWUsIGxvY2F0aW9uUGFydHNbMV0sIGxvY2F0aW9uUGFydHNbMl0sIGxpbmUpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFyc2VGRk9yU2FmYXJpOiBmdW5jdGlvbiBFcnJvclN0YWNrUGFyc2VyJCRwYXJzZUZGT3JTYWZhcmkoZXJyb3IpIHtcbiAgICAgICAgICAgIHZhciBmaWx0ZXJlZCA9IF9maWx0ZXIoZXJyb3Iuc3RhY2suc3BsaXQoJ1xcbicpLCBmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFsaW5lLm1hdGNoKFNBRkFSSV9OQVRJVkVfQ09ERV9SRUdFWFApO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgIHJldHVybiBfbWFwKGZpbHRlcmVkLCBmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhyb3cgYXdheSBldmFsIGluZm9ybWF0aW9uIHVudGlsIHdlIGltcGxlbWVudCBzdGFja3RyYWNlLmpzL3N0YWNrZnJhbWUjOFxuICAgICAgICAgICAgICAgIGlmIChsaW5lLmluZGV4T2YoJyA+IGV2YWwnKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoLyBsaW5lIChcXGQrKSg/OiA+IGV2YWwgbGluZSBcXGQrKSogPiBldmFsXFw6XFxkK1xcOlxcZCsvZywgJzokMScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChsaW5lLmluZGV4T2YoJ0AnKSA9PT0gLTEgJiYgbGluZS5pbmRleE9mKCc6JykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBldmFsIGZyYW1lcyBvbmx5IGhhdmUgZnVuY3Rpb24gbmFtZXMgYW5kIG5vdGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YWNrRnJhbWUobGluZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IGxpbmUuc3BsaXQoJ0AnKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uUGFydHMgPSB0aGlzLmV4dHJhY3RMb2NhdGlvbih0b2tlbnMucG9wKCkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25OYW1lID0gdG9rZW5zLmpvaW4oJ0AnKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhY2tGcmFtZShmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvblBhcnRzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25QYXJ0c1sxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uUGFydHNbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBwYXJzZU9wZXJhOiBmdW5jdGlvbiBFcnJvclN0YWNrUGFyc2VyJCRwYXJzZU9wZXJhKGUpIHtcbiAgICAgICAgICAgIGlmICghZS5zdGFja3RyYWNlIHx8IChlLm1lc3NhZ2UuaW5kZXhPZignXFxuJykgPiAtMSAmJlxuICAgICAgICAgICAgICAgIGUubWVzc2FnZS5zcGxpdCgnXFxuJykubGVuZ3RoID4gZS5zdGFja3RyYWNlLnNwbGl0KCdcXG4nKS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VPcGVyYTkoZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFlLnN0YWNrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VPcGVyYTEwKGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU9wZXJhMTEoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFyc2VPcGVyYTk6IGZ1bmN0aW9uIEVycm9yU3RhY2tQYXJzZXIkJHBhcnNlT3BlcmE5KGUpIHtcbiAgICAgICAgICAgIHZhciBsaW5lUkUgPSAvTGluZSAoXFxkKykuKnNjcmlwdCAoPzppbiApPyhcXFMrKS9pO1xuICAgICAgICAgICAgdmFyIGxpbmVzID0gZS5tZXNzYWdlLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDIsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZVJFLmV4ZWMobGluZXNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgU3RhY2tGcmFtZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgbWF0Y2hbMl0sIG1hdGNoWzFdLCB1bmRlZmluZWQsIGxpbmVzW2ldKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIHBhcnNlT3BlcmExMDogZnVuY3Rpb24gRXJyb3JTdGFja1BhcnNlciQkcGFyc2VPcGVyYTEwKGUpIHtcbiAgICAgICAgICAgIHZhciBsaW5lUkUgPSAvTGluZSAoXFxkKykuKnNjcmlwdCAoPzppbiApPyhcXFMrKSg/OjogSW4gZnVuY3Rpb24gKFxcUyspKT8kL2k7XG4gICAgICAgICAgICB2YXIgbGluZXMgPSBlLnN0YWNrdHJhY2Uuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lUkUuZXhlYyhsaW5lc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0YWNrRnJhbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbM10gfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gT3BlcmEgMTAuNjUrIEVycm9yLnN0YWNrIHZlcnkgc2ltaWxhciB0byBGRi9TYWZhcmlcbiAgICAgICAgcGFyc2VPcGVyYTExOiBmdW5jdGlvbiBFcnJvclN0YWNrUGFyc2VyJCRwYXJzZU9wZXJhMTEoZXJyb3IpIHtcbiAgICAgICAgICAgIHZhciBmaWx0ZXJlZCA9IF9maWx0ZXIoZXJyb3Iuc3RhY2suc3BsaXQoJ1xcbicpLCBmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhbGluZS5tYXRjaChGSVJFRk9YX1NBRkFSSV9TVEFDS19SRUdFWFApICYmICFsaW5lLm1hdGNoKC9eRXJyb3IgY3JlYXRlZCBhdC8pO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgIHJldHVybiBfbWFwKGZpbHRlcmVkLCBmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IGxpbmUuc3BsaXQoJ0AnKTtcbiAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb25QYXJ0cyA9IHRoaXMuZXh0cmFjdExvY2F0aW9uKHRva2Vucy5wb3AoKSk7XG4gICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQ2FsbCA9ICh0b2tlbnMuc2hpZnQoKSB8fCAnJyk7XG4gICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uQ2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxhbm9ueW1vdXMgZnVuY3Rpb24oOiAoXFx3KykpPz4vLCAnJDInKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcKFteXFwpXSpcXCkvZywgJycpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2YXIgYXJnc1JhdztcbiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25DYWxsLm1hdGNoKC9cXCgoW15cXCldKilcXCkvKSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdzUmF3ID0gZnVuY3Rpb25DYWxsLnJlcGxhY2UoL15bXlxcKF0rXFwoKFteXFwpXSopXFwpJC8sICckMScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IChhcmdzUmF3ID09PSB1bmRlZmluZWQgfHwgYXJnc1JhdyA9PT0gJ1thcmd1bWVudHMgbm90IGF2YWlsYWJsZV0nKSA/XG4gICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCA6IGFyZ3NSYXcuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YWNrRnJhbWUoXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25QYXJ0c1swXSxcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25QYXJ0c1sxXSxcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25QYXJ0c1syXSxcbiAgICAgICAgICAgICAgICAgICAgbGluZSk7XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG59KSk7XG5cbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqXG4gKiBUaGUgRk9STUFUX0JJTkFSWSBmb3JtYXQgcmVwcmVzZW50cyBTcGFuQ29udGV4dHMgaW4gYW4gb3BhcXVlIGJpbmFyeVxuICogY2Fycmllci5cbiAqXG4gKiBUcmFjZXIuaW5qZWN0KCkgd2lsbCBzZXQgdGhlIGJ1ZmZlciBmaWVsZCB0byBhbiBBcnJheS1saWtlIChBcnJheSxcbiAqIEFycmF5QnVmZmVyLCBvciBUeXBlZEJ1ZmZlcikgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGluamVjdGVkIGJpbmFyeSBkYXRhLlxuICogQW55IHZhbGlkIE9iamVjdCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIHRoZSBidWZmZXIgZmllbGQgb2YgdGhlIG9iamVjdFxuICogY2FuIGJlIHNldC5cbiAqXG4gKiBUcmFjZXIuZXh0cmFjdCgpIHdpbGwgbG9vayBmb3IgYGNhcnJpZXIuYnVmZmVyYCwgYW5kIHRoYXQgZmllbGQgaXNcbiAqIGV4cGVjdGVkIHRvIGJlIGFuIEFycmF5LWxpa2Ugb2JqZWN0IChBcnJheSwgQXJyYXlCdWZmZXIsIG9yXG4gKiBUeXBlZEJ1ZmZlcikuXG4gKi9cbmV4cG9ydHMuRk9STUFUX0JJTkFSWSA9ICdiaW5hcnknO1xuLyoqXG4gKiBUaGUgRk9STUFUX1RFWFRfTUFQIGZvcm1hdCByZXByZXNlbnRzIFNwYW5Db250ZXh0cyB1c2luZyBhXG4gKiBzdHJpbmctPnN0cmluZyBtYXAgKGJhY2tlZCBieSBhIEphdmFzY3JpcHQgT2JqZWN0KSBhcyBhIGNhcnJpZXIuXG4gKlxuICogTk9URTogVW5saWtlIEZPUk1BVF9IVFRQX0hFQURFUlMsIEZPUk1BVF9URVhUX01BUCBwbGFjZXMgbm8gcmVzdHJpY3Rpb25zXG4gKiBvbiB0aGUgY2hhcmFjdGVycyB1c2VkIGluIGVpdGhlciB0aGUga2V5cyBvciB0aGUgdmFsdWVzIG9mIHRoZSBtYXBcbiAqIGVudHJpZXMuXG4gKlxuICogVGhlIEZPUk1BVF9URVhUX01BUCBjYXJyaWVyIG1hcCBtYXkgY29udGFpbiB1bnJlbGF0ZWQgZGF0YSAoZS5nLixcbiAqIGFyYml0cmFyeSBnUlBDIG1ldGFkYXRhKTsgYXMgc3VjaCwgdGhlIFRyYWNlciBpbXBsZW1lbnRhdGlvbiBzaG91bGQgdXNlXG4gKiBhIHByZWZpeCBvciBvdGhlciBjb252ZW50aW9uIHRvIGRpc3Rpbmd1aXNoIFRyYWNlci1zcGVjaWZpYyBrZXk6dmFsdWVcbiAqIHBhaXJzLlxuICovXG5leHBvcnRzLkZPUk1BVF9URVhUX01BUCA9ICd0ZXh0X21hcCc7XG4vKipcbiAqIFRoZSBGT1JNQVRfSFRUUF9IRUFERVJTIGZvcm1hdCByZXByZXNlbnRzIFNwYW5Db250ZXh0cyB1c2luZyBhXG4gKiBjaGFyYWN0ZXItcmVzdHJpY3RlZCBzdHJpbmctPnN0cmluZyBtYXAgKGJhY2tlZCBieSBhIEphdmFzY3JpcHQgT2JqZWN0KVxuICogYXMgYSBjYXJyaWVyLlxuICpcbiAqIEtleXMgYW5kIHZhbHVlcyBpbiB0aGUgRk9STUFUX0hUVFBfSEVBREVSUyBjYXJyaWVyIG11c3QgYmUgc3VpdGFibGUgZm9yXG4gKiB1c2UgYXMgSFRUUCBoZWFkZXJzICh3aXRob3V0IG1vZGlmaWNhdGlvbiBvciBmdXJ0aGVyIGVzY2FwaW5nKS4gVGhhdCBpcyxcbiAqIHRoZSBrZXlzIGhhdmUgYSBncmVhdGx5IHJlc3RyaWN0ZWQgY2hhcmFjdGVyIHNldCwgY2FzaW5nIGZvciB0aGUga2V5c1xuICogbWF5IG5vdCBiZSBwcmVzZXJ2ZWQgYnkgdmFyaW91cyBpbnRlcm1lZGlhcmllcywgYW5kIHRoZSB2YWx1ZXMgc2hvdWxkIGJlXG4gKiBVUkwtZXNjYXBlZC5cbiAqXG4gKiBUaGUgRk9STUFUX0hUVFBfSEVBREVSUyBjYXJyaWVyIG1hcCBtYXkgY29udGFpbiB1bnJlbGF0ZWQgZGF0YSAoZS5nLixcbiAqIGFyYml0cmFyeSBIVFRQIGhlYWRlcnMpOyBhcyBzdWNoLCB0aGUgVHJhY2VyIGltcGxlbWVudGF0aW9uIHNob3VsZCB1c2UgYVxuICogcHJlZml4IG9yIG90aGVyIGNvbnZlbnRpb24gdG8gZGlzdGluZ3Vpc2ggVHJhY2VyLXNwZWNpZmljIGtleTp2YWx1ZVxuICogcGFpcnMuXG4gKi9cbmV4cG9ydHMuRk9STUFUX0hUVFBfSEVBREVSUyA9ICdodHRwX2hlYWRlcnMnO1xuLyoqXG4gKiBBIFNwYW4gbWF5IGJlIHRoZSBcImNoaWxkIG9mXCIgYSBwYXJlbnQgU3Bhbi4gSW4gYSDigJxjaGlsZCBvZuKAnSByZWZlcmVuY2UsXG4gKiB0aGUgcGFyZW50IFNwYW4gZGVwZW5kcyBvbiB0aGUgY2hpbGQgU3BhbiBpbiBzb21lIGNhcGFjaXR5LlxuICpcbiAqIFNlZSBtb3JlIGFib3V0IHJlZmVyZW5jZSB0eXBlcyBhdCBodHRwczovL2dpdGh1Yi5jb20vb3BlbnRyYWNpbmcvc3BlY2lmaWNhdGlvblxuICovXG5leHBvcnRzLlJFRkVSRU5DRV9DSElMRF9PRiA9ICdjaGlsZF9vZic7XG4vKipcbiAqIFNvbWUgcGFyZW50IFNwYW5zIGRvIG5vdCBkZXBlbmQgaW4gYW55IHdheSBvbiB0aGUgcmVzdWx0IG9mIHRoZWlyIGNoaWxkXG4gKiBTcGFucy4gSW4gdGhlc2UgY2FzZXMsIHdlIHNheSBtZXJlbHkgdGhhdCB0aGUgY2hpbGQgU3BhbiDigJxmb2xsb3dzIGZyb23igJ1cbiAqIHRoZSBwYXJlbnQgU3BhbiBpbiBhIGNhdXNhbCBzZW5zZS5cbiAqXG4gKiBTZWUgbW9yZSBhYm91dCByZWZlcmVuY2UgdHlwZXMgYXQgaHR0cHM6Ly9naXRodWIuY29tL29wZW50cmFjaW5nL3NwZWNpZmljYXRpb25cbiAqL1xuZXhwb3J0cy5SRUZFUkVOQ0VfRk9MTE9XU19GUk9NID0gJ2ZvbGxvd3NfZnJvbSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdGFudHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgQ29uc3RhbnRzID0gcmVxdWlyZShcIi4vY29uc3RhbnRzXCIpO1xudmFyIHJlZmVyZW5jZV8xID0gcmVxdWlyZShcIi4vcmVmZXJlbmNlXCIpO1xudmFyIHNwYW5fMSA9IHJlcXVpcmUoXCIuL3NwYW5cIik7XG4vKipcbiAqIFJldHVybiBhIG5ldyBSRUZFUkVOQ0VfQ0hJTERfT0YgcmVmZXJlbmNlLlxuICpcbiAqIEBwYXJhbSB7U3BhbkNvbnRleHR9IHNwYW5Db250ZXh0IC0gdGhlIHBhcmVudCBTcGFuQ29udGV4dCBpbnN0YW5jZSB0b1xuICogICAgICAgIHJlZmVyZW5jZS5cbiAqIEByZXR1cm4gYSBSRUZFUkVOQ0VfQ0hJTERfT0YgcmVmZXJlbmNlIHBvaW50aW5nIHRvIGBzcGFuQ29udGV4dGBcbiAqL1xuZnVuY3Rpb24gY2hpbGRPZihzcGFuQ29udGV4dCkge1xuICAgIC8vIEFsbG93IHRoZSB1c2VyIHRvIHBhc3MgYSBTcGFuIGluc3RlYWQgb2YgYSBTcGFuQ29udGV4dFxuICAgIGlmIChzcGFuQ29udGV4dCBpbnN0YW5jZW9mIHNwYW5fMS5kZWZhdWx0KSB7XG4gICAgICAgIHNwYW5Db250ZXh0ID0gc3BhbkNvbnRleHQuY29udGV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHJlZmVyZW5jZV8xLmRlZmF1bHQoQ29uc3RhbnRzLlJFRkVSRU5DRV9DSElMRF9PRiwgc3BhbkNvbnRleHQpO1xufVxuZXhwb3J0cy5jaGlsZE9mID0gY2hpbGRPZjtcbi8qKlxuICogUmV0dXJuIGEgbmV3IFJFRkVSRU5DRV9GT0xMT1dTX0ZST00gcmVmZXJlbmNlLlxuICpcbiAqIEBwYXJhbSB7U3BhbkNvbnRleHR9IHNwYW5Db250ZXh0IC0gdGhlIHBhcmVudCBTcGFuQ29udGV4dCBpbnN0YW5jZSB0b1xuICogICAgICAgIHJlZmVyZW5jZS5cbiAqIEByZXR1cm4gYSBSRUZFUkVOQ0VfRk9MTE9XU19GUk9NIHJlZmVyZW5jZSBwb2ludGluZyB0byBgc3BhbkNvbnRleHRgXG4gKi9cbmZ1bmN0aW9uIGZvbGxvd3NGcm9tKHNwYW5Db250ZXh0KSB7XG4gICAgLy8gQWxsb3cgdGhlIHVzZXIgdG8gcGFzcyBhIFNwYW4gaW5zdGVhZCBvZiBhIFNwYW5Db250ZXh0XG4gICAgaWYgKHNwYW5Db250ZXh0IGluc3RhbmNlb2Ygc3Bhbl8xLmRlZmF1bHQpIHtcbiAgICAgICAgc3BhbkNvbnRleHQgPSBzcGFuQ29udGV4dC5jb250ZXh0KCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgcmVmZXJlbmNlXzEuZGVmYXVsdChDb25zdGFudHMuUkVGRVJFTkNFX0ZPTExPV1NfRlJPTSwgc3BhbkNvbnRleHQpO1xufVxuZXhwb3J0cy5mb2xsb3dzRnJvbSA9IGZvbGxvd3NGcm9tO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnVuY3Rpb25zLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHNwYW5fMSA9IHJlcXVpcmUoXCIuL3NwYW5cIik7XG52YXIgc3Bhbl9jb250ZXh0XzEgPSByZXF1aXJlKFwiLi9zcGFuX2NvbnRleHRcIik7XG52YXIgdHJhY2VyXzEgPSByZXF1aXJlKFwiLi90cmFjZXJcIik7XG5leHBvcnRzLnRyYWNlciA9IG51bGw7XG5leHBvcnRzLnNwYW5Db250ZXh0ID0gbnVsbDtcbmV4cG9ydHMuc3BhbiA9IG51bGw7XG4vLyBEZWZlcnJlZCBpbml0aWFsaXphdGlvbiB0byBhdm9pZCBhIGRlcGVuZGVuY3kgY3ljbGUgd2hlcmUgVHJhY2VyIGRlcGVuZHMgb25cbi8vIFNwYW4gd2hpY2ggZGVwZW5kcyBvbiB0aGUgbm9vcCB0cmFjZXIuXG5mdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIGV4cG9ydHMudHJhY2VyID0gbmV3IHRyYWNlcl8xLmRlZmF1bHQoKTtcbiAgICBleHBvcnRzLnNwYW4gPSBuZXcgc3Bhbl8xLmRlZmF1bHQoKTtcbiAgICBleHBvcnRzLnNwYW5Db250ZXh0ID0gbmV3IHNwYW5fY29udGV4dF8xLmRlZmF1bHQoKTtcbn1cbmV4cG9ydHMuaW5pdGlhbGl6ZSA9IGluaXRpYWxpemU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub29wLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHNwYW5fMSA9IHJlcXVpcmUoXCIuL3NwYW5cIik7XG4vKipcbiAqIFJlZmVyZW5jZSBwYWlycyBhIHJlZmVyZW5jZSB0eXBlIGNvbnN0YW50IChlLmcuLCBSRUZFUkVOQ0VfQ0hJTERfT0Ygb3JcbiAqIFJFRkVSRU5DRV9GT0xMT1dTX0ZST00pIHdpdGggdGhlIFNwYW5Db250ZXh0IGl0IHBvaW50cyB0by5cbiAqXG4gKiBTZWUgdGhlIGV4cG9ydGVkIGNoaWxkT2YoKSBhbmQgZm9sbG93c0Zyb20oKSBmdW5jdGlvbnMgYXQgdGhlIHBhY2thZ2UgbGV2ZWwuXG4gKi9cbnZhciBSZWZlcmVuY2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBhIG5ldyBSZWZlcmVuY2UgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIHRoZSBSZWZlcmVuY2UgdHlwZSBjb25zdGFudCAoZS5nLixcbiAgICAgKiAgICAgICAgUkVGRVJFTkNFX0NISUxEX09GIG9yIFJFRkVSRU5DRV9GT0xMT1dTX0ZST00pLlxuICAgICAqIEBwYXJhbSB7U3BhbkNvbnRleHR9IHJlZmVyZW5jZWRDb250ZXh0IC0gdGhlIFNwYW5Db250ZXh0IGJlaW5nIHJlZmVycmVkXG4gICAgICogICAgICAgIHRvLiBBcyBhIGNvbnZlbmllbmNlLCBhIFNwYW4gaW5zdGFuY2UgbWF5IGJlIHBhc3NlZCBpbiBpbnN0ZWFkXG4gICAgICogICAgICAgIChpbiB3aGljaCBjYXNlIGl0cyAuY29udGV4dCgpIGlzIHVzZWQgaGVyZSkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gUmVmZXJlbmNlKHR5cGUsIHJlZmVyZW5jZWRDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLl9yZWZlcmVuY2VkQ29udGV4dCA9IChyZWZlcmVuY2VkQ29udGV4dCBpbnN0YW5jZW9mIHNwYW5fMS5kZWZhdWx0ID9cbiAgICAgICAgICAgIHJlZmVyZW5jZWRDb250ZXh0LmNvbnRleHQoKSA6XG4gICAgICAgICAgICByZWZlcmVuY2VkQ29udGV4dCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFJlZmVyZW5jZSB0eXBlIChlLmcuLCBSRUZFUkVOQ0VfQ0hJTERfT0Ygb3JcbiAgICAgKiAgICAgICAgIFJFRkVSRU5DRV9GT0xMT1dTX0ZST00pLlxuICAgICAqL1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTcGFuQ29udGV4dH0gVGhlIFNwYW5Db250ZXh0IGJlaW5nIHJlZmVycmVkIHRvIChlLmcuLCB0aGVcbiAgICAgKiAgICAgICAgIHBhcmVudCBpbiBhIFJFRkVSRU5DRV9DSElMRF9PRiBSZWZlcmVuY2UpLlxuICAgICAqL1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUucmVmZXJlbmNlZENvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZlcmVuY2VkQ29udGV4dDtcbiAgICB9O1xuICAgIHJldHVybiBSZWZlcmVuY2U7XG59KCkpO1xuZXhwb3J0cy5kZWZhdWx0ID0gUmVmZXJlbmNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVmZXJlbmNlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIG5vb3AgPSByZXF1aXJlKFwiLi9ub29wXCIpO1xuLyoqXG4gKiBTcGFuIHJlcHJlc2VudHMgYSBsb2dpY2FsIHVuaXQgb2Ygd29yayBhcyBwYXJ0IG9mIGEgYnJvYWRlciBUcmFjZS4gRXhhbXBsZXNcbiAqIG9mIHNwYW4gbWlnaHQgaW5jbHVkZSByZW1vdGUgcHJvY2VkdXJlIGNhbGxzIG9yIGEgaW4tcHJvY2VzcyBmdW5jdGlvbiBjYWxsc1xuICogdG8gc3ViLWNvbXBvbmVudHMuIEEgVHJhY2UgaGFzIGEgc2luZ2xlLCB0b3AtbGV2ZWwgXCJyb290XCIgU3BhbiB0aGF0IGluIHR1cm5cbiAqIG1heSBoYXZlIHplcm8gb3IgbW9yZSBjaGlsZCBTcGFucywgd2hpY2ggaW4gdHVybiBtYXkgaGF2ZSBjaGlsZHJlbi5cbiAqL1xudmFyIFNwYW4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3BhbigpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAgIC8vIE9wZW5UcmFjaW5nIEFQSSBtZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIFNwYW5Db250ZXh0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBTcGFuLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhbkNvbnRleHR9XG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuY29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIFRyYWNlciBvYmplY3QgdXNlZCB0byBjcmVhdGUgdGhpcyBTcGFuLlxuICAgICAqXG4gICAgICogQHJldHVybiB7VHJhY2VyfVxuICAgICAqL1xuICAgIFNwYW4ucHJvdG90eXBlLnRyYWNlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNlcigpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RyaW5nIG5hbWUgZm9yIHRoZSBsb2dpY2FsIG9wZXJhdGlvbiB0aGlzIHNwYW4gcmVwcmVzZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuc2V0T3BlcmF0aW9uTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHRoaXMuX3NldE9wZXJhdGlvbk5hbWUobmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBhIGtleTp2YWx1ZSBwYWlyIG9uIHRoaXMgU3BhbiB0aGF0IGFsc28gcHJvcGFnYXRlcyB0byBmdXR1cmVcbiAgICAgKiBjaGlsZHJlbiBvZiB0aGUgYXNzb2NpYXRlZCBTcGFuLlxuICAgICAqXG4gICAgICogc2V0QmFnZ2FnZUl0ZW0oKSBlbmFibGVzIHBvd2VyZnVsIGZ1bmN0aW9uYWxpdHkgZ2l2ZW4gYSBmdWxsLXN0YWNrXG4gICAgICogb3BlbnRyYWNpbmcgaW50ZWdyYXRpb24gKGUuZy4sIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBkYXRhIGZyb20gYSB3ZWJcbiAgICAgKiBjbGllbnQgY2FuIG1ha2UgaXQsIHRyYW5zcGFyZW50bHksIGFsbCB0aGUgd2F5IGludG8gdGhlIGRlcHRocyBvZiBhXG4gICAgICogc3RvcmFnZSBzeXN0ZW0pLCBhbmQgd2l0aCBpdCBzb21lIHBvd2VyZnVsIGNvc3RzOiB1c2UgdGhpcyBmZWF0dXJlIHdpdGhcbiAgICAgKiBjYXJlLlxuICAgICAqXG4gICAgICogSU1QT1JUQU5UIE5PVEUgIzE6IHNldEJhZ2dhZ2VJdGVtKCkgd2lsbCBvbmx5IHByb3BhZ2F0ZSBiYWdnYWdlIGl0ZW1zIHRvXG4gICAgICogKmZ1dHVyZSogY2F1c2FsIGRlc2NlbmRhbnRzIG9mIHRoZSBhc3NvY2lhdGVkIFNwYW4uXG4gICAgICpcbiAgICAgKiBJTVBPUlRBTlQgTk9URSAjMjogVXNlIHRoaXMgdGhvdWdodGZ1bGx5IGFuZCB3aXRoIGNhcmUuIEV2ZXJ5IGtleSBhbmRcbiAgICAgKiB2YWx1ZSBpcyBjb3BpZWQgaW50byBldmVyeSBsb2NhbCAqYW5kIHJlbW90ZSogY2hpbGQgb2YgdGhlIGFzc29jaWF0ZWRcbiAgICAgKiBTcGFuLCBhbmQgdGhhdCBjYW4gYWRkIHVwIHRvIGEgbG90IG9mIG5ldHdvcmsgYW5kIGNwdSBvdmVyaGVhZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgKi9cbiAgICBTcGFuLnByb3RvdHlwZS5zZXRCYWdnYWdlSXRlbSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3NldEJhZ2dhZ2VJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciBhIGJhZ2dhZ2UgaXRlbSBnaXZlbiBpdHMga2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBrZXlcbiAgICAgKiAgICAgICAgIFRoZSBrZXkgZm9yIHRoZSBnaXZlbiB0cmFjZSBhdHRyaWJ1dGUuXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqICAgICAgICAgU3RyaW5nIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5LCBvciB1bmRlZmluZWQgaWYgdGhlIGtleSBkb2VzIG5vdFxuICAgICAqICAgICAgICAgY29ycmVzcG9uZCB0byBhIHNldCB0cmFjZSBhdHRyaWJ1dGUuXG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuZ2V0QmFnZ2FnZUl0ZW0gPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRCYWdnYWdlSXRlbShrZXkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNpbmdsZSB0YWcgdG8gdGhlIHNwYW4uICBTZWUgYGFkZFRhZ3MoKWAgZm9yIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuc2V0VGFnID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgLy8gTk9URTogdGhlIGNhbGwgaXMgbm9ybWFsaXplZCB0byBhIGNhbGwgdG8gX2FkZFRhZ3MoKVxuICAgICAgICB0aGlzLl9hZGRUYWdzKChfYSA9IHt9LCBfYVtrZXldID0gdmFsdWUsIF9hKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB2YXIgX2E7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBnaXZlbiBrZXkgdmFsdWUgcGFpcnMgdG8gdGhlIHNldCBvZiBzcGFuIHRhZ3MuXG4gICAgICpcbiAgICAgKiBNdWx0aXBsZSBjYWxscyB0byBhZGRUYWdzKCkgcmVzdWx0cyBpbiB0aGUgdGFncyBiZWluZyB0aGUgc3VwZXJzZXQgb2ZcbiAgICAgKiBhbGwgY2FsbHMuXG4gICAgICpcbiAgICAgKiBUaGUgYmVoYXZpb3Igb2Ygc2V0dGluZyB0aGUgc2FtZSBrZXkgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgc3BhblxuICAgICAqIGlzIHVuZGVmaW5lZC5cbiAgICAgKlxuICAgICAqIFRoZSBzdXBwb3J0ZWQgdHlwZSBvZiB0aGUgdmFsdWVzIGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC5cbiAgICAgKiBJbXBsZW1lbnRhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIHNhZmVseSBoYW5kbGUgYWxsIHR5cGVzIG9mIHZhbHVlcyBidXRcbiAgICAgKiBtYXkgY2hvb3NlIHRvIGlnbm9yZSB1bnJlY29nbml6ZWQgLyB1bmhhbmRsZS1hYmxlIHZhbHVlcyAoZS5nLiBvYmplY3RzXG4gICAgICogd2l0aCBjeWNsaWMgcmVmZXJlbmNlcywgZnVuY3Rpb24gb2JqZWN0cykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtbdHlwZV19IFtkZXNjcmlwdGlvbl1cbiAgICAgKi9cbiAgICBTcGFuLnByb3RvdHlwZS5hZGRUYWdzID0gZnVuY3Rpb24gKGtleVZhbHVlTWFwKSB7XG4gICAgICAgIHRoaXMuX2FkZFRhZ3Moa2V5VmFsdWVNYXApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCBhIGxvZyByZWNvcmQgdG8gdGhpcyBTcGFuLCBvcHRpb25hbGx5IGF0IGEgdXNlci1wcm92aWRlZCB0aW1lc3RhbXAuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKlxuICAgICAqICAgICBzcGFuLmxvZyh7XG4gICAgICogICAgICAgICBzaXplOiBycGMuc2l6ZSgpLCAgLy8gbnVtZXJpYyB2YWx1ZVxuICAgICAqICAgICAgICAgVVJJOiBycGMuVVJJKCksICAvLyBzdHJpbmcgdmFsdWVcbiAgICAgKiAgICAgICAgIHBheWxvYWQ6IHJwYy5wYXlsb2FkKCksICAvLyBPYmplY3QgdmFsdWVcbiAgICAgKiAgICAgICAgIFwia2V5cyBjYW4gYmUgYXJiaXRyYXJ5IHN0cmluZ3NcIjogcnBjLmZvbygpLFxuICAgICAqICAgICB9KTtcbiAgICAgKlxuICAgICAqICAgICBzcGFuLmxvZyh7XG4gICAgICogICAgICAgICBcImVycm9yLmRlc2NyaXB0aW9uXCI6IHNvbWVFcnJvci5kZXNjcmlwdGlvbigpLFxuICAgICAqICAgICB9LCBzb21lRXJyb3IudGltZXN0YW1wTWlsbGlzKCkpO1xuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGtleVZhbHVlUGFpcnNcbiAgICAgKiAgICAgICAgQW4gb2JqZWN0IG1hcHBpbmcgc3RyaW5nIGtleXMgdG8gYXJiaXRyYXJ5IHZhbHVlIHR5cGVzLiBBbGxcbiAgICAgKiAgICAgICAgVHJhY2VyIGltcGxlbWVudGF0aW9ucyBzaG91bGQgc3VwcG9ydCBib29sLCBzdHJpbmcsIGFuZCBudW1lcmljXG4gICAgICogICAgICAgIHZhbHVlIHR5cGVzLCBhbmQgc29tZSBtYXkgYWxzbyBzdXBwb3J0IE9iamVjdCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVzdGFtcFxuICAgICAqICAgICAgICBBbiBvcHRpb25hbCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kc1xuICAgICAqICAgICAgICBzaW5jZSB0aGUgVW5peCBlcG9jaC4gRnJhY3Rpb25hbCB2YWx1ZXMgYXJlIGFsbG93ZWQgc28gdGhhdFxuICAgICAqICAgICAgICB0aW1lc3RhbXBzIHdpdGggc3ViLW1pbGxpc2Vjb25kIGFjY3VyYWN5IGNhbiBiZSByZXByZXNlbnRlZC4gSWZcbiAgICAgKiAgICAgICAgbm90IHNwZWNpZmllZCwgdGhlIGltcGxlbWVudGF0aW9uIGlzIGV4cGVjdGVkIHRvIHVzZSBpdHMgbm90aW9uXG4gICAgICogICAgICAgIG9mIHRoZSBjdXJyZW50IHRpbWUgb2YgdGhlIGNhbGwuXG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKGtleVZhbHVlUGFpcnMsIHRpbWVzdGFtcCkge1xuICAgICAgICB0aGlzLl9sb2coa2V5VmFsdWVQYWlycywgdGltZXN0YW1wKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBERVBSRUNBVEVEXG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUubG9nRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBwYXlsb2FkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2coeyBldmVudDogZXZlbnROYW1lLCBwYXlsb2FkOiBwYXlsb2FkIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZW5kIHRpbWVzdGFtcCBhbmQgZmluYWxpemVzIFNwYW4gc3RhdGUuXG4gICAgICpcbiAgICAgKiBXaXRoIHRoZSBleGNlcHRpb24gb2YgY2FsbHMgdG8gU3Bhbi5jb250ZXh0KCkgKHdoaWNoIGFyZSBhbHdheXMgYWxsb3dlZCksXG4gICAgICogZmluaXNoKCkgbXVzdCBiZSB0aGUgbGFzdCBjYWxsIG1hZGUgdG8gYW55IHNwYW4gaW5zdGFuY2UsIGFuZCB0byBkb1xuICAgICAqIG90aGVyd2lzZSBsZWFkcyB0byB1bmRlZmluZWQgYmVoYXZpb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IGZpbmlzaFRpbWVcbiAgICAgKiAgICAgICAgIE9wdGlvbmFsIGZpbmlzaCB0aW1lIGluIG1pbGxpc2Vjb25kcyBhcyBhIFVuaXggdGltZXN0YW1wLiBEZWNpbWFsXG4gICAgICogICAgICAgICB2YWx1ZXMgYXJlIHN1cHBvcnRlZCBmb3IgdGltZXN0YW1wcyB3aXRoIHN1Yi1taWxsaXNlY29uZCBhY2N1cmFjeS5cbiAgICAgKiAgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHRpbWUgKGFzIGRlZmluZWQgYnkgdGhlXG4gICAgICogICAgICAgICBpbXBsZW1lbnRhdGlvbikgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIFNwYW4ucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uIChmaW5pc2hUaW1lKSB7XG4gICAgICAgIHRoaXMuX2ZpbmlzaChmaW5pc2hUaW1lKTtcbiAgICAgICAgLy8gRG8gbm90IHJldHVybiBgdGhpc2AuIFRoZSBTcGFuIGdlbmVyYWxseSBzaG91bGQgbm90IGJlIHVzZWQgYWZ0ZXIgaXRcbiAgICAgICAgLy8gaXMgZmluaXNoZWQgc28gY2hhaW5pbmcgaXMgbm90IGRlc2lyZWQgaW4gdGhpcyBjb250ZXh0LlxuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAgIC8vIERlcml2ZWQgY2xhc3NlcyBjYW4gY2hvb3NlIHRvIGltcGxlbWVudCB0aGUgYmVsb3dcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gICAgLy8gQnkgZGVmYXVsdCByZXR1cm5zIGEgbm8tb3AgU3BhbkNvbnRleHQuXG4gICAgU3Bhbi5wcm90b3R5cGUuX2NvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBub29wLnNwYW5Db250ZXh0O1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCByZXR1cm5zIGEgbm8tb3AgdHJhY2VyLlxuICAgIC8vXG4gICAgLy8gVGhlIGJhc2UgY2xhc3MgY291bGQgc3RvcmUgdGhlIHRyYWNlciB0aGF0IGNyZWF0ZWQgaXQsIGJ1dCBpdCBkb2VzIG5vdFxuICAgIC8vIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgbm8tb3Agc3BhbiBpbXBsZW1lbnRhdGlvbiBoYXMgemVybyBtZW1iZXJzLFxuICAgIC8vIHdoaWNoIGFsbG93cyBWOCB0byBhZ2dyZXNzaXZlbHkgb3B0aW1pemUgY2FsbHMgdG8gc3VjaCBvYmplY3RzLlxuICAgIFNwYW4ucHJvdG90eXBlLl90cmFjZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBub29wLnRyYWNlcjtcbiAgICB9O1xuICAgIC8vIEJ5IGRlZmF1bHQgZG9lcyBub3RoaW5nXG4gICAgU3Bhbi5wcm90b3R5cGUuX3NldE9wZXJhdGlvbk5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBTcGFuLnByb3RvdHlwZS5fc2V0QmFnZ2FnZUl0ZW0gPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBTcGFuLnByb3RvdHlwZS5fZ2V0QmFnZ2FnZUl0ZW0gPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIC8vXG4gICAgLy8gTk9URTogYm90aCBzZXRUYWcoKSBhbmQgYWRkVGFncygpIG1hcCB0byB0aGlzIGZ1bmN0aW9uLiBrZXlWYWx1ZVBhaXJzXG4gICAgLy8gd2lsbCBhbHdheXMgYmUgYW4gYXNzb2NpYXRpdmUgYXJyYXkuXG4gICAgU3Bhbi5wcm90b3R5cGUuX2FkZFRhZ3MgPSBmdW5jdGlvbiAoa2V5VmFsdWVQYWlycykge1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBTcGFuLnByb3RvdHlwZS5fbG9nID0gZnVuY3Rpb24gKGtleVZhbHVlUGFpcnMsIHRpbWVzdGFtcCkge1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICAvL1xuICAgIC8vIGZpbmlzaFRpbWUgaXMgZXhwZWN0ZWQgdG8gYmUgZWl0aGVyIGEgbnVtYmVyIG9yIHVuZGVmaW5lZC5cbiAgICBTcGFuLnByb3RvdHlwZS5fZmluaXNoID0gZnVuY3Rpb24gKGZpbmlzaFRpbWUpIHtcbiAgICB9O1xuICAgIHJldHVybiBTcGFuO1xufSgpKTtcbmV4cG9ydHMuU3BhbiA9IFNwYW47XG5leHBvcnRzLmRlZmF1bHQgPSBTcGFuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3Bhbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICogU3BhbkNvbnRleHQgcmVwcmVzZW50cyBTcGFuIHN0YXRlIHRoYXQgbXVzdCBwcm9wYWdhdGUgdG8gZGVzY2VuZGFudCBTcGFuc1xuICogYW5kIGFjcm9zcyBwcm9jZXNzIGJvdW5kYXJpZXMuXG4gKlxuICogU3BhbkNvbnRleHQgaXMgbG9naWNhbGx5IGRpdmlkZWQgaW50byB0d28gcGllY2VzOiB0aGUgdXNlci1sZXZlbCBcIkJhZ2dhZ2VcIlxuICogKHNlZSBzZXRCYWdnYWdlSXRlbSBhbmQgZ2V0QmFnZ2FnZUl0ZW0pIHRoYXQgcHJvcGFnYXRlcyBhY3Jvc3MgU3BhblxuICogYm91bmRhcmllcyBhbmQgYW55IFRyYWNlci1pbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBmaWVsZHMgdGhhdCBhcmUgbmVlZGVkIHRvXG4gKiBpZGVudGlmeSBvciBvdGhlcndpc2UgY29udGV4dHVhbGl6ZSB0aGUgYXNzb2NpYXRlZCBTcGFuIGluc3RhbmNlIChlLmcuLCBhXG4gKiA8dHJhY2VfaWQsIHNwYW5faWQsIHNhbXBsZWQ+IHR1cGxlKS5cbiAqL1xudmFyIFNwYW5Db250ZXh0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNwYW5Db250ZXh0KCkge1xuICAgIH1cbiAgICByZXR1cm4gU3BhbkNvbnRleHQ7XG59KCkpO1xuZXhwb3J0cy5TcGFuQ29udGV4dCA9IFNwYW5Db250ZXh0O1xuZXhwb3J0cy5kZWZhdWx0ID0gU3BhbkNvbnRleHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFuX2NvbnRleHQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgRnVuY3Rpb25zID0gcmVxdWlyZShcIi4vZnVuY3Rpb25zXCIpO1xudmFyIE5vb3AgPSByZXF1aXJlKFwiLi9ub29wXCIpO1xudmFyIHNwYW5fMSA9IHJlcXVpcmUoXCIuL3NwYW5cIik7XG4vKipcbiAqIFRyYWNlciBpcyB0aGUgZW50cnktcG9pbnQgYmV0d2VlbiB0aGUgaW5zdHJ1bWVudGF0aW9uIEFQSSBhbmQgdGhlIHRyYWNpbmdcbiAqIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIFRoZSBkZWZhdWx0IG9iamVjdCBhY3RzIGFzIGEgbm8tb3AgaW1wbGVtZW50YXRpb24uXG4gKlxuICogTm90ZSB0byBpbXBsZW1lbnRhdG9yczogZGVyaXZlZCBjbGFzc2VzIGNhbiBjaG9vc2UgdG8gZGlyZWN0bHkgaW1wbGVtZW50IHRoZVxuICogbWV0aG9kcyBpbiB0aGUgXCJPcGVuVHJhY2luZyBBUEkgbWV0aG9kc1wiIHNlY3Rpb24sIG9yIG9wdGlvbmFsbHkgdGhlIHN1YnNldCBvZlxuICogdW5kZXJzY29yZS1wcmVmaXhlZCBtZXRob2RzIHRvIHBpY2sgdXAgdGhlIGFyZ3VtZW50IGNoZWNraW5nIGFuZCBoYW5kbGluZ1xuICogYXV0b21hdGljYWxseSBmcm9tIHRoZSBiYXNlIGNsYXNzLlxuICovXG52YXIgVHJhY2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRyYWNlcigpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAgIC8vIE9wZW5UcmFjaW5nIEFQSSBtZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBhbmQgcmV0dXJucyBhIG5ldyBTcGFuIHJlcHJlc2VudGluZyBhIGxvZ2ljYWwgdW5pdCBvZiB3b3JrLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiAgICAgLy8gU3RhcnQgYSBuZXcgKHBhcmVudGxlc3MpIHJvb3QgU3BhbjpcbiAgICAgKiAgICAgdmFyIHBhcmVudCA9IFRyYWNlci5zdGFydFNwYW4oJ0RvV29yaycpO1xuICAgICAqXG4gICAgICogICAgIC8vIFN0YXJ0IGEgbmV3IChjaGlsZCkgU3BhbjpcbiAgICAgKiAgICAgdmFyIGNoaWxkID0gVHJhY2VyLnN0YXJ0U3BhbignbG9hZC1mcm9tLWRiJywge1xuICAgICAqICAgICAgICAgY2hpbGRPZjogcGFyZW50LmNvbnRleHQoKSxcbiAgICAgKiAgICAgfSk7XG4gICAgICpcbiAgICAgKiAgICAgLy8gU3RhcnQgYSBuZXcgYXN5bmMgKEZvbGxvd3NGcm9tKSBTcGFuOlxuICAgICAqICAgICB2YXIgY2hpbGQgPSBUcmFjZXIuc3RhcnRTcGFuKCdhc3luYy1jYWNoZS13cml0ZScsIHtcbiAgICAgKiAgICAgICAgIHJlZmVyZW5jZXM6IFtcbiAgICAgKiAgICAgICAgICAgICBvcGVudHJhY2luZy5mb2xsb3dzRnJvbShwYXJlbnQuY29udGV4dCgpKVxuICAgICAqICAgICAgICAgXSxcbiAgICAgKiAgICAgfSk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gKFJFUVVJUkVEKS5cbiAgICAgKiBAcGFyYW0ge1NwYW5PcHRpb25zfSBbb3B0aW9uc10gLSBvcHRpb25zIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBzcGFuLlxuICAgICAqIEByZXR1cm4ge1NwYW59IC0gYSBuZXcgU3BhbiBvYmplY3QuXG4gICAgICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5zdGFydFNwYW4gPSBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICAvLyBDb252ZXJ0IG9wdGlvbnMuY2hpbGRPZiB0byBmaWVsZHMucmVmZXJlbmNlcyBhcyBuZWVkZWQuXG4gICAgICAgIGlmIChvcHRpb25zLmNoaWxkT2YpIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgZnJvbSBhIFNwYW4gb3IgYSBTcGFuQ29udGV4dCBpbnRvIGEgUmVmZXJlbmNlLlxuICAgICAgICAgICAgdmFyIGNoaWxkT2YgPSBGdW5jdGlvbnMuY2hpbGRPZihvcHRpb25zLmNoaWxkT2YpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVmZXJlbmNlcykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMucmVmZXJlbmNlcy5wdXNoKGNoaWxkT2YpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5yZWZlcmVuY2VzID0gW2NoaWxkT2ZdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIChvcHRpb25zLmNoaWxkT2YpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFydFNwYW4obmFtZSwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmplY3RzIHRoZSBnaXZlbiBTcGFuQ29udGV4dCBpbnN0YW5jZSBmb3IgY3Jvc3MtcHJvY2VzcyBwcm9wYWdhdGlvblxuICAgICAqIHdpdGhpbiBgY2FycmllcmAuIFRoZSBleHBlY3RlZCB0eXBlIG9mIGBjYXJyaWVyYCBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZlxuICAgICAqIGBmb3JtYXQuXG4gICAgICpcbiAgICAgKiBPcGVuVHJhY2luZyBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBgZm9ybWF0YCB2YWx1ZXMgKHNlZVxuICAgICAqIEZPUk1BVF9URVhUX01BUCwgRk9STUFUX0hUVFBfSEVBREVSUywgYW5kIEZPUk1BVF9CSU5BUlkpLCBhbmQgZWFjaCBoYXNcbiAgICAgKiBhbiBleHBlY3RlZCBjYXJyaWVyIHR5cGUuXG4gICAgICpcbiAgICAgKiBDb25zaWRlciB0aGlzIHBzZXVkb2NvZGUgZXhhbXBsZTpcbiAgICAgKlxuICAgICAqICAgICB2YXIgY2xpZW50U3BhbiA9IC4uLjtcbiAgICAgKiAgICAgLi4uXG4gICAgICogICAgIC8vIEluamVjdCBjbGllbnRTcGFuIGludG8gYSB0ZXh0IGNhcnJpZXIuXG4gICAgICogICAgIHZhciBoZWFkZXJzQ2FycmllciA9IHt9O1xuICAgICAqICAgICBUcmFjZXIuaW5qZWN0KGNsaWVudFNwYW4uY29udGV4dCgpLCBUcmFjZXIuRk9STUFUX0hUVFBfSEVBREVSUywgaGVhZGVyc0NhcnJpZXIpO1xuICAgICAqICAgICAvLyBJbmNvcnBvcmF0ZSB0aGUgdGV4dENhcnJpZXIgaW50byB0aGUgb3V0Ym91bmQgSFRUUCByZXF1ZXN0IGhlYWRlclxuICAgICAqICAgICAvLyBtYXAuXG4gICAgICogICAgIE9iamVjdC5hc3NpZ24ob3V0Ym91bmRIVFRQUmVxLmhlYWRlcnMsIGhlYWRlcnNDYXJyaWVyKTtcbiAgICAgKiAgICAgLy8gLi4uIHNlbmQgdGhlIGh0dHBSZXFcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1NwYW5Db250ZXh0fSBzcGFuQ29udGV4dCAtIHRoZSBTcGFuQ29udGV4dCB0byBpbmplY3QgaW50byB0aGVcbiAgICAgKiAgICAgICAgIGNhcnJpZXIgb2JqZWN0LiBBcyBhIGNvbnZlbmllbmNlLCBhIFNwYW4gaW5zdGFuY2UgbWF5IGJlIHBhc3NlZFxuICAgICAqICAgICAgICAgaW4gaW5zdGVhZCAoaW4gd2hpY2ggY2FzZSBpdHMgLmNvbnRleHQoKSBpcyB1c2VkIGZvciB0aGVcbiAgICAgKiAgICAgICAgIGluamVjdCgpKS5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGZvcm1hdCAtIHRoZSBmb3JtYXQgb2YgdGhlIGNhcnJpZXIuXG4gICAgICogQHBhcmFtICB7YW55fSBjYXJyaWVyIC0gc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgY2hvc2VuIGBmb3JtYXRgXG4gICAgICogICAgICAgICBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2FycmllciBvYmplY3QuXG4gICAgICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5pbmplY3QgPSBmdW5jdGlvbiAoc3BhbkNvbnRleHQsIGZvcm1hdCwgY2Fycmllcikge1xuICAgICAgICAvLyBBbGxvdyB0aGUgdXNlciB0byBwYXNzIGEgU3BhbiBpbnN0ZWFkIG9mIGEgU3BhbkNvbnRleHRcbiAgICAgICAgaWYgKHNwYW5Db250ZXh0IGluc3RhbmNlb2Ygc3Bhbl8xLmRlZmF1bHQpIHtcbiAgICAgICAgICAgIHNwYW5Db250ZXh0ID0gc3BhbkNvbnRleHQuY29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3Qoc3BhbkNvbnRleHQsIGZvcm1hdCwgY2Fycmllcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgU3BhbkNvbnRleHQgaW5zdGFuY2UgZXh0cmFjdGVkIGZyb20gYGNhcnJpZXJgIGluIHRoZSBnaXZlblxuICAgICAqIGBmb3JtYXRgLlxuICAgICAqXG4gICAgICogT3BlblRyYWNpbmcgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYGZvcm1hdGAgdmFsdWVzIChzZWVcbiAgICAgKiBGT1JNQVRfVEVYVF9NQVAsIEZPUk1BVF9IVFRQX0hFQURFUlMsIGFuZCBGT1JNQVRfQklOQVJZKSwgYW5kIGVhY2ggaGFzXG4gICAgICogYW4gZXhwZWN0ZWQgY2FycmllciB0eXBlLlxuICAgICAqXG4gICAgICogQ29uc2lkZXIgdGhpcyBwc2V1ZG9jb2RlIGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiAgICAgLy8gVXNlIHRoZSBpbmJvdW5kIEhUVFAgcmVxdWVzdCdzIGhlYWRlcnMgYXMgYSB0ZXh0IG1hcCBjYXJyaWVyLlxuICAgICAqICAgICB2YXIgaGVhZGVyc0NhcnJpZXIgPSBpbmJvdW5kSFRUUFJlcS5oZWFkZXJzO1xuICAgICAqICAgICB2YXIgd2lyZUN0eCA9IFRyYWNlci5leHRyYWN0KFRyYWNlci5GT1JNQVRfSFRUUF9IRUFERVJTLCBoZWFkZXJzQ2Fycmllcik7XG4gICAgICogICAgIHZhciBzZXJ2ZXJTcGFuID0gVHJhY2VyLnN0YXJ0U3BhbignLi4uJywgeyBjaGlsZE9mIDogd2lyZUN0eCB9KTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gZm9ybWF0IC0gdGhlIGZvcm1hdCBvZiB0aGUgY2Fycmllci5cbiAgICAgKiBAcGFyYW0gIHthbnl9IGNhcnJpZXIgLSB0aGUgdHlwZSBvZiB0aGUgY2FycmllciBvYmplY3QgaXMgZGV0ZXJtaW5lZCBieVxuICAgICAqICAgICAgICAgdGhlIGZvcm1hdC5cbiAgICAgKiBAcmV0dXJuIHtTcGFuQ29udGV4dH1cbiAgICAgKiAgICAgICAgIFRoZSBleHRyYWN0ZWQgU3BhbkNvbnRleHQsIG9yIG51bGwgaWYgbm8gc3VjaCBTcGFuQ29udGV4dCBjb3VsZFxuICAgICAqICAgICAgICAgYmUgZm91bmQgaW4gYGNhcnJpZXJgXG4gICAgICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5leHRyYWN0ID0gZnVuY3Rpb24gKGZvcm1hdCwgY2Fycmllcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXh0cmFjdChmb3JtYXQsIGNhcnJpZXIpO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAgIC8vIERlcml2ZWQgY2xhc3NlcyBjYW4gY2hvb3NlIHRvIGltcGxlbWVudCB0aGUgYmVsb3dcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gICAgLy8gTk9URTogdGhlIGlucHV0IHRvIHRoaXMgbWV0aG9kIGlzICphbHdheXMqIGFuIGFzc29jaWF0aXZlIGFycmF5LiBUaGVcbiAgICAvLyBwdWJsaWMtZmFjaW5nIHN0YXJ0U3BhbigpIG1ldGhvZCBub3JtYWxpemVzIHRoZSBhcmd1bWVudHMgc28gdGhhdFxuICAgIC8vIGFsbCBOIGltcGxlbWVudGF0aW9ucyBkbyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCB2YXJpYXRpb25zIGluIHRoZSBjYWxsXG4gICAgLy8gc2lnbmF0dXJlLlxuICAgIC8vXG4gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3IgcmV0dXJucyBhIG5vLW9wIHNwYW4uXG4gICAgVHJhY2VyLnByb3RvdHlwZS5fc3RhcnRTcGFuID0gZnVuY3Rpb24gKG5hbWUsIGZpZWxkcykge1xuICAgICAgICByZXR1cm4gTm9vcC5zcGFuO1xuICAgIH07XG4gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgYSBuby1vcC5cbiAgICBUcmFjZXIucHJvdG90eXBlLl9pbmplY3QgPSBmdW5jdGlvbiAoc3BhbkNvbnRleHQsIGZvcm1hdCwgY2Fycmllcikge1xuICAgIH07XG4gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmV0dXJuIGEgbm8tb3AgU3BhbkNvbnRleHQuXG4gICAgVHJhY2VyLnByb3RvdHlwZS5fZXh0cmFjdCA9IGZ1bmN0aW9uIChmb3JtYXQsIGNhcnJpZXIpIHtcbiAgICAgICAgcmV0dXJuIE5vb3Auc3BhbkNvbnRleHQ7XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VyO1xufSgpKTtcbmV4cG9ydHMuVHJhY2VyID0gVHJhY2VyO1xuZXhwb3J0cy5kZWZhdWx0ID0gVHJhY2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhY2VyLmpzLm1hcCIsIi8qKlxuICogQHRoaXMge1Byb21pc2V9XG4gKi9cbmZ1bmN0aW9uIGZpbmFsbHlDb25zdHJ1Y3RvcihjYWxsYmFjaykge1xuICB2YXIgY29uc3RydWN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdGhpcy50aGVuKFxuICAgIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4gY29uc3RydWN0b3IucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLnJlc29sdmUoY2FsbGJhY2soKSkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVqZWN0KHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZpbmFsbHlDb25zdHJ1Y3RvcjtcbiIsImltcG9ydCBwcm9taXNlRmluYWxseSBmcm9tICcuL2ZpbmFsbHknO1xuXG4vLyBTdG9yZSBzZXRUaW1lb3V0IHJlZmVyZW5jZSBzbyBwcm9taXNlLXBvbHlmaWxsIHdpbGwgYmUgdW5hZmZlY3RlZCBieVxuLy8gb3RoZXIgY29kZSBtb2RpZnlpbmcgc2V0VGltZW91dCAobGlrZSBzaW5vbi51c2VGYWtlVGltZXJzKCkpXG52YXIgc2V0VGltZW91dEZ1bmMgPSBzZXRUaW1lb3V0O1xuXG5mdW5jdGlvbiBpc0FycmF5KHgpIHtcbiAgcmV0dXJuIEJvb2xlYW4oeCAmJiB0eXBlb2YgeC5sZW5ndGggIT09ICd1bmRlZmluZWQnKTtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8vIFBvbHlmaWxsIGZvciBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxuZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKi9cbmZ1bmN0aW9uIFByb21pc2UoZm4pIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFByb21pc2UpKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldycpO1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdub3QgYSBmdW5jdGlvbicpO1xuICAvKiogQHR5cGUgeyFudW1iZXJ9ICovXG4gIHRoaXMuX3N0YXRlID0gMDtcbiAgLyoqIEB0eXBlIHshYm9vbGVhbn0gKi9cbiAgdGhpcy5faGFuZGxlZCA9IGZhbHNlO1xuICAvKiogQHR5cGUge1Byb21pc2V8dW5kZWZpbmVkfSAqL1xuICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgLyoqIEB0eXBlIHshQXJyYXk8IUZ1bmN0aW9uPn0gKi9cbiAgdGhpcy5fZGVmZXJyZWRzID0gW107XG5cbiAgZG9SZXNvbHZlKGZuLCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlKHNlbGYsIGRlZmVycmVkKSB7XG4gIHdoaWxlIChzZWxmLl9zdGF0ZSA9PT0gMykge1xuICAgIHNlbGYgPSBzZWxmLl92YWx1ZTtcbiAgfVxuICBpZiAoc2VsZi5fc3RhdGUgPT09IDApIHtcbiAgICBzZWxmLl9kZWZlcnJlZHMucHVzaChkZWZlcnJlZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYuX2hhbmRsZWQgPSB0cnVlO1xuICBQcm9taXNlLl9pbW1lZGlhdGVGbihmdW5jdGlvbigpIHtcbiAgICB2YXIgY2IgPSBzZWxmLl9zdGF0ZSA9PT0gMSA/IGRlZmVycmVkLm9uRnVsZmlsbGVkIDogZGVmZXJyZWQub25SZWplY3RlZDtcbiAgICBpZiAoY2IgPT09IG51bGwpIHtcbiAgICAgIChzZWxmLl9zdGF0ZSA9PT0gMSA/IHJlc29sdmUgOiByZWplY3QpKGRlZmVycmVkLnByb21pc2UsIHNlbGYuX3ZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJldDtcbiAgICB0cnkge1xuICAgICAgcmV0ID0gY2Ioc2VsZi5fdmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChkZWZlcnJlZC5wcm9taXNlLCBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzb2x2ZShkZWZlcnJlZC5wcm9taXNlLCByZXQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZShzZWxmLCBuZXdWYWx1ZSkge1xuICB0cnkge1xuICAgIC8vIFByb21pc2UgUmVzb2x1dGlvbiBQcm9jZWR1cmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9taXNlcy1hcGx1cy9wcm9taXNlcy1zcGVjI3RoZS1wcm9taXNlLXJlc29sdXRpb24tcHJvY2VkdXJlXG4gICAgaWYgKG5ld1ZhbHVlID09PSBzZWxmKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi4nKTtcbiAgICBpZiAoXG4gICAgICBuZXdWYWx1ZSAmJlxuICAgICAgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG5ld1ZhbHVlID09PSAnZnVuY3Rpb24nKVxuICAgICkge1xuICAgICAgdmFyIHRoZW4gPSBuZXdWYWx1ZS50aGVuO1xuICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBzZWxmLl9zdGF0ZSA9IDM7XG4gICAgICAgIHNlbGYuX3ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIGZpbmFsZShzZWxmKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkb1Jlc29sdmUoYmluZCh0aGVuLCBuZXdWYWx1ZSksIHNlbGYpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHNlbGYuX3N0YXRlID0gMTtcbiAgICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIGZpbmFsZShzZWxmKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlamVjdChzZWxmLCBlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWplY3Qoc2VsZiwgbmV3VmFsdWUpIHtcbiAgc2VsZi5fc3RhdGUgPSAyO1xuICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICBmaW5hbGUoc2VsZik7XG59XG5cbmZ1bmN0aW9uIGZpbmFsZShzZWxmKSB7XG4gIGlmIChzZWxmLl9zdGF0ZSA9PT0gMiAmJiBzZWxmLl9kZWZlcnJlZHMubGVuZ3RoID09PSAwKSB7XG4gICAgUHJvbWlzZS5faW1tZWRpYXRlRm4oZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIXNlbGYuX2hhbmRsZWQpIHtcbiAgICAgICAgUHJvbWlzZS5fdW5oYW5kbGVkUmVqZWN0aW9uRm4oc2VsZi5fdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNlbGYuX2RlZmVycmVkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGhhbmRsZShzZWxmLCBzZWxmLl9kZWZlcnJlZHNbaV0pO1xuICB9XG4gIHNlbGYuX2RlZmVycmVkcyA9IG51bGw7XG59XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb21pc2UpIHtcbiAgdGhpcy5vbkZ1bGZpbGxlZCA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogbnVsbDtcbiAgdGhpcy5vblJlamVjdGVkID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT09ICdmdW5jdGlvbicgPyBvblJlamVjdGVkIDogbnVsbDtcbiAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbn1cblxuLyoqXG4gKiBUYWtlIGEgcG90ZW50aWFsbHkgbWlzYmVoYXZpbmcgcmVzb2x2ZXIgZnVuY3Rpb24gYW5kIG1ha2Ugc3VyZVxuICogb25GdWxmaWxsZWQgYW5kIG9uUmVqZWN0ZWQgYXJlIG9ubHkgY2FsbGVkIG9uY2UuXG4gKlxuICogTWFrZXMgbm8gZ3VhcmFudGVlcyBhYm91dCBhc3luY2hyb255LlxuICovXG5mdW5jdGlvbiBkb1Jlc29sdmUoZm4sIHNlbGYpIHtcbiAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBmbihcbiAgICAgIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICByZXNvbHZlKHNlbGYsIHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgIHJlamVjdChzZWxmLCByZWFzb24pO1xuICAgICAgfVxuICAgICk7XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICBkb25lID0gdHJ1ZTtcbiAgICByZWplY3Qoc2VsZiwgZXgpO1xuICB9XG59XG5cblByb21pc2UucHJvdG90eXBlWydjYXRjaCddID0gZnVuY3Rpb24ob25SZWplY3RlZCkge1xuICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0ZWQpO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgdmFyIHByb20gPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcihub29wKTtcblxuICBoYW5kbGUodGhpcywgbmV3IEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb20pKTtcbiAgcmV0dXJuIHByb207XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddID0gcHJvbWlzZUZpbmFsbHk7XG5cblByb21pc2UuYWxsID0gZnVuY3Rpb24oYXJyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICBpZiAoIWlzQXJyYXkoYXJyKSkge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgVHlwZUVycm9yKCdQcm9taXNlLmFsbCBhY2NlcHRzIGFuIGFycmF5JykpO1xuICAgIH1cblxuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJyKTtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiByZXNvbHZlKFtdKTtcbiAgICB2YXIgcmVtYWluaW5nID0gYXJncy5sZW5ndGg7XG5cbiAgICBmdW5jdGlvbiByZXMoaSwgdmFsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodmFsICYmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgIHZhciB0aGVuID0gdmFsLnRoZW47XG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwoXG4gICAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgICAgZnVuY3Rpb24odmFsKSB7XG4gICAgICAgICAgICAgICAgcmVzKGksIHZhbCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXJnc1tpXSA9IHZhbDtcbiAgICAgICAgaWYgKC0tcmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgcmVzb2x2ZShhcmdzKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgcmVqZWN0KGV4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcyhpLCBhcmdzW2ldKTtcbiAgICB9XG4gIH0pO1xufTtcblxuUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IFByb21pc2UpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuICAgIHJlc29sdmUodmFsdWUpO1xuICB9KTtcbn07XG5cblByb21pc2UucmVqZWN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlamVjdCh2YWx1ZSk7XG4gIH0pO1xufTtcblxuUHJvbWlzZS5yYWNlID0gZnVuY3Rpb24oYXJyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICBpZiAoIWlzQXJyYXkoYXJyKSkge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgVHlwZUVycm9yKCdQcm9taXNlLnJhY2UgYWNjZXB0cyBhbiBhcnJheScpKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUoYXJyW2ldKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8vIFVzZSBwb2x5ZmlsbCBmb3Igc2V0SW1tZWRpYXRlIGZvciBwZXJmb3JtYW5jZSBnYWluc1xuUHJvbWlzZS5faW1tZWRpYXRlRm4gPVxuICAvLyBAdHMtaWdub3JlXG4gICh0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nICYmXG4gICAgZnVuY3Rpb24oZm4pIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHNldEltbWVkaWF0ZShmbik7XG4gICAgfSkgfHxcbiAgZnVuY3Rpb24oZm4pIHtcbiAgICBzZXRUaW1lb3V0RnVuYyhmbiwgMCk7XG4gIH07XG5cblByb21pc2UuX3VuaGFuZGxlZFJlamVjdGlvbkZuID0gZnVuY3Rpb24gX3VuaGFuZGxlZFJlamVjdGlvbkZuKGVycikge1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUpIHtcbiAgICBjb25zb2xlLndhcm4oJ1Bvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjonLCBlcnIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUHJvbWlzZTtcbiIsIihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICAvLyBVbml2ZXJzYWwgTW9kdWxlIERlZmluaXRpb24gKFVNRCkgdG8gc3VwcG9ydCBBTUQsIENvbW1vbkpTL05vZGUuanMsIFJoaW5vLCBhbmQgYnJvd3NlcnMuXG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKCdzdGFja2ZyYW1lJywgW10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QuU3RhY2tGcmFtZSA9IGZhY3RvcnkoKTtcbiAgICB9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgZnVuY3Rpb24gX2lzTnVtYmVyKG4pIHtcbiAgICAgICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBTdGFja0ZyYW1lKGZ1bmN0aW9uTmFtZSwgYXJncywgZmlsZU5hbWUsIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlciwgc291cmNlKSB7XG4gICAgICAgIGlmIChmdW5jdGlvbk5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoZnVuY3Rpb25OYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldEFyZ3MoYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsZU5hbWUoZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1uTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29sdW1uTnVtYmVyKGNvbHVtbk51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNvdXJjZShzb3VyY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgU3RhY2tGcmFtZS5wcm90b3R5cGUgPSB7XG4gICAgICAgIGdldEZ1bmN0aW9uTmFtZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25OYW1lO1xuICAgICAgICB9LFxuICAgICAgICBzZXRGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICB0aGlzLmZ1bmN0aW9uTmFtZSA9IFN0cmluZyh2KTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRBcmdzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcmdzO1xuICAgICAgICB9LFxuICAgICAgICBzZXRBcmdzOiBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2KSAhPT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3MgbXVzdCBiZSBhbiBBcnJheScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hcmdzID0gdjtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBOT1RFOiBQcm9wZXJ0eSBuYW1lIG1heSBiZSBtaXNsZWFkaW5nIGFzIGl0IGluY2x1ZGVzIHRoZSBwYXRoLFxuICAgICAgICAvLyBidXQgaXQgc29tZXdoYXQgbWlycm9ycyBWOCdzIEphdmFTY3JpcHRTdGFja1RyYWNlQXBpXG4gICAgICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avdjgvd2lraS9KYXZhU2NyaXB0U3RhY2tUcmFjZUFwaSBhbmQgR2Vja28nc1xuICAgICAgICAvLyBodHRwOi8vbXhyLm1vemlsbGEub3JnL21vemlsbGEtY2VudHJhbC9zb3VyY2UveHBjb20vYmFzZS9uc0lFeGNlcHRpb24uaWRsIzE0XG4gICAgICAgIGdldEZpbGVOYW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlTmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0RmlsZU5hbWU6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVOYW1lID0gU3RyaW5nKHYpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldExpbmVOdW1iZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpbmVOdW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldExpbmVOdW1iZXI6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICBpZiAoIV9pc051bWJlcih2KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0xpbmUgTnVtYmVyIG11c3QgYmUgYSBOdW1iZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubGluZU51bWJlciA9IE51bWJlcih2KTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRDb2x1bW5OdW1iZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbHVtbk51bWJlcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0Q29sdW1uTnVtYmVyOiBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgaWYgKCFfaXNOdW1iZXIodikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb2x1bW4gTnVtYmVyIG11c3QgYmUgYSBOdW1iZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29sdW1uTnVtYmVyID0gTnVtYmVyKHYpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldFNvdXJjZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlO1xuICAgICAgICB9LFxuICAgICAgICBzZXRTb3VyY2U6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IFN0cmluZyh2KTtcbiAgICAgICAgfSxcblxuICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZnVuY3Rpb25OYW1lID0gdGhpcy5nZXRGdW5jdGlvbk5hbWUoKSB8fCAne2Fub255bW91c30nO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSAnKCcgKyAodGhpcy5nZXRBcmdzKCkgfHwgW10pLmpvaW4oJywnKSArICcpJztcbiAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9IHRoaXMuZ2V0RmlsZU5hbWUoKSA/ICgnQCcgKyB0aGlzLmdldEZpbGVOYW1lKCkpIDogJyc7XG4gICAgICAgICAgICB2YXIgbGluZU51bWJlciA9IF9pc051bWJlcih0aGlzLmdldExpbmVOdW1iZXIoKSkgPyAoJzonICsgdGhpcy5nZXRMaW5lTnVtYmVyKCkpIDogJyc7XG4gICAgICAgICAgICB2YXIgY29sdW1uTnVtYmVyID0gX2lzTnVtYmVyKHRoaXMuZ2V0Q29sdW1uTnVtYmVyKCkpID8gKCc6JyArIHRoaXMuZ2V0Q29sdW1uTnVtYmVyKCkpIDogJyc7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25OYW1lICsgYXJncyArIGZpbGVOYW1lICsgbGluZU51bWJlciArIGNvbHVtbk51bWJlcjtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gU3RhY2tGcmFtZTtcbn0pKTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgZGVmaW5pdGlvbikge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvKipcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LXByZXNlbnQsIEVsYXN0aWNzZWFyY2ggQlZcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICpcbiAqL1xuXG5pbXBvcnQge1xuICBjcmVhdGVTZXJ2aWNlRmFjdG9yeSxcbiAgYm9vdHN0cmFwLFxuICBpc0Jyb3dzZXJcbn0gZnJvbSAnQGVsYXN0aWMvYXBtLXJ1bS1jb3JlJ1xuaW1wb3J0IEFwbUJhc2UgZnJvbSAnLi9hcG0tYmFzZSdcblxuLyoqXG4gKiBVc2UgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgQXBtQmFzZSBhY3Jvc3MgYWxsIGluc3RhbmNlIG9mIHRoZSBhZ2VudFxuICogaW5jbHVkaW5nIHRoZSBpbnN0YW5jZXMgdXNlZCBpbiBmcmFtZXdvcmsgc3BlY2lmaWMgaW50ZWdyYXRpb25zXG4gKi9cbmZ1bmN0aW9uIGdldEFwbUJhc2UoKSB7XG4gIGlmIChpc0Jyb3dzZXIgJiYgd2luZG93LmVsYXN0aWNBcG0pIHtcbiAgICByZXR1cm4gd2luZG93LmVsYXN0aWNBcG1cbiAgfVxuICBjb25zdCBlbmFibGVkID0gYm9vdHN0cmFwKClcbiAgY29uc3Qgc2VydmljZUZhY3RvcnkgPSBjcmVhdGVTZXJ2aWNlRmFjdG9yeSgpXG4gIGNvbnN0IGFwbUJhc2UgPSBuZXcgQXBtQmFzZShzZXJ2aWNlRmFjdG9yeSwgIWVuYWJsZWQpXG5cbiAgaWYgKGlzQnJvd3Nlcikge1xuICAgIHdpbmRvdy5lbGFzdGljQXBtID0gYXBtQmFzZVxuICB9XG5cbiAgcmV0dXJuIGFwbUJhc2Vcbn1cblxuY29uc3QgYXBtQmFzZSA9IGdldEFwbUJhc2UoKVxuXG5jb25zdCBpbml0ID0gYXBtQmFzZS5pbml0LmJpbmQoYXBtQmFzZSlcblxuZXhwb3J0IGRlZmF1bHQgaW5pdFxuZXhwb3J0IHsgaW5pdCwgYXBtQmFzZSwgQXBtQmFzZSwgYXBtQmFzZSBhcyBhcG0gfVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7Ozs7OztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFEQTtBQUdBO0FBVkE7QUFZQTtBQWJBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNwV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFQQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFEQTtBQUdBO0FBVkE7QUFZQTtBQWJBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBZkE7QUFDQTtBQWlCQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQVJBO0FBVUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFEQTtBQUpBO0FBSkE7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFEQTtBQVBBO0FBREE7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7Ozs7O0FDNVZBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBOUJBO0FBZ0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0REE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBUEE7QUFTQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBTEE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFEQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBO0FBQ0E7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7Ozs7QUNyS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25EQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7Ozs7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7Ozs7Ozs7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7Ozs7OztBQzFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7OztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0E7Ozs7Ozs7Ozs7QUMzREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7Ozs7Ozs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQURBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7O0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFKQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7Ozs7Ozs7QUNuSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUZBO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN4QkE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0E7Ozs7Ozs7Ozs7Ozs7OztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQUpBO0FBQ0E7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7Ozs7Ozs7O0FDN0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBOzs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0E7Ozs7Ozs7Ozs7Ozs7QUN2RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBTkE7QUFRQTtBQUNBO0FBREE7QUFUQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFGQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFGQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFiQTtBQWVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBVEE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQVRBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQURBO0FBR0E7QUFaQTtBQUNBO0FBY0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QTs7Ozs7Ozs7Ozs7Ozs7O0FDeEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2xNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBOzs7Ozs7Ozs7Ozs7Ozs7O0FDN1dBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBUkE7QUFDQTtBQVVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUpBO0FBU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7Ozs7Ozs7O0FDdExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTs7O0E7Ozs7Ozs7Ozs7Ozs7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0E7Ozs7Ozs7Ozs7Ozs7QUNYQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQURBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFEQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7Ozs7Ozs7O0FDM0ZBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBO0FBQ0E7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7Ozs7Ozs7QUMzSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSEE7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBRkE7QUFDQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFHQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQU5BO0FBUUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFGQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7OztBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFiQTtBQW1CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUtBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFGQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFkQTtBQWdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBakJBO0FBbUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0E7Ozs7Ozs7Ozs7OztBQzlWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7Ozs7O0FDdkZBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBREE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFBQTtBQUFBO0FBQ0E7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQURBO0FBQ0E7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7Ozs7Ozs7QUNoWkE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFEQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBOzs7Ozs7Ozs7Ozs7OztBQzFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7OztBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3VCQTtBQUNBO0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBV0E7QUFDQTtBQUlBO0FBQ0E7QUFJQTtBQUNBO0FBQUE7QUFDQTtBQUVBO0FBS0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFFQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBTUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBU0E7QUFNQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBT0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWdCQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0E7Ozs7Ozs7O0FDdlVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsYUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QTs7Ozs7Ozs7O0FDeE5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0E7Ozs7Ozs7OztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QTs7Ozs7Ozs7O0FDOU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0E7Ozs7Ozs7OztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0E7Ozs7Ozs7Ozs7QUNsSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0E7Ozs7Ozs7Ozs7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0E7Ozs7Ozs7O0FDM1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQ0EsYUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBOzs7O0FDMUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDUEE7Ozs7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNtQkE7QUFLQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBRUE7Ozs7OztBIiwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxhc3RpYy1hcG0tcnVtLnVtZC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBREE7O0FBSUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7O0FBSUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBT0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTs7QUFFQTtBQUNBOztBQUVBO0FBQUE7O0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUFBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFEQTtBQUdBO0FBVkE7QUFZQTtBQWJBO0FBZUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFBQTs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDcFdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFQQTtBQVNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFEQTtBQUdBO0FBVkE7QUFZQTtBQWJBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUkE7O0FBV0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBO0FBaEJBOztBQW1CQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUdBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFSQTtBQVVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQURBO0FBSkE7QUFKQTtBQWFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQzNVQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQS9CQTtBQWlDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBS0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFBQTtBQUFBOztBQUlBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM5UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3pEQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTs7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUdBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBO0FBQ0E7QUFQQTtBQVNBOztBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFMQTtBQU9BOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBTEE7QUFPQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQURBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFYQTs7QUFjQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBSUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUMzS0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25EQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBT0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7O0FBTUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUtBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFPQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDMUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7QUNoQkE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7QUMzREE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTs7QUFNQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBREE7QUFLQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFKQTtBQUpBO0FBV0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFGQTtBQVFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZCQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3pEQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTEE7QUFKQTs7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3RkE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JEQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUFBO0FBQUE7O0FBSUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBQUE7O0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFOQTtBQVFBO0FBQ0E7QUFEQTtBQVRBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUZBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUZBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQURBO0FBR0E7QUFDQTtBQWJBO0FBZUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFUQTtBQVdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBVEE7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBREE7QUFHQTtBQVpBOztBQWVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3ZKQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBTEE7O0FBUUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUtBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbE1BO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BYQTs7QUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFBQTtBQUFBOztBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFSQTs7QUFXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFKQTtBQVNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFEQTs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMU1BO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7O0FBS0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNiQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTs7QUFFQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFNQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUxBO0FBT0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBRUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3RJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ2pCQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVkE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBS0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBREE7QUFPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0ZBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUVBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQURBOztBQUlBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFYQTtBQWFBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQVhBOztBQWNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDM0hBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUdBOztBQUVBO0FBQ0E7QUFBQTtBQUFBOztBQUlBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUFBO0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFIQTtBQVFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBRkE7O0FBS0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBSUE7QUFBQTtBQUFBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7QUFOQTtBQVFBO0FBQ0E7O0FBRUE7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNoS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBSUE7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBTUE7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3JHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFEQTtBQUtBOztBQUVBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlCQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUpBO0FBTUE7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQWJBO0FBbUJBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFLQTtBQUNBO0FBQ0E7QUFGQTs7QUFLQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFEQTtBQUdBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBSUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBOztBQUtBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7O0FBS0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFEQTtBQUdBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFEQTtBQUdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDOU5BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDNURBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUZBO0FBUUE7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQU1BO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUM3Q0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUlBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFNQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDMURBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFJQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFCQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFEQTtBQUdBOztBQUVBO0FBQ0E7QUFEQTs7QUFJQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUFBO0FBQUE7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWRBO0FBZ0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQWxCQTtBQW9CQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7O0FDaFdBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7QUN2RkE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFGQTtBQUFBO0FBQUE7O0FBT0E7O0FBRUE7QUFDQTtBQURBO0FBR0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQTtBQU9BOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQUE7QUFBQTtBQUFBOztBQUtBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFLQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRkE7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUZBO0FBSUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFEQTs7QUFRQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFGQTtBQUlBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNyWkE7QUFBQTtBQUFBOztBQUFBO0FBQUE7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7OztBQzFLQTs7QUFFQTtBQUNBO0FBQ0E7QUFGQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdUJBOztBQWtCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFBQTs7QUFDQTtBQUNBOztBQUNBO0FBQUE7QUFBQTtBQUFBOztBQVlBO0FBQ0E7QUFJQTtBQUNBO0FBSUE7O0FBQ0E7QUFDQTtBQUVBO0FBS0E7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQURBO0FBR0E7QUFDQTs7QUFFQTtBQUFBO0FBQUE7O0FBR0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7O0FBT0E7QUFDQTtBQUFBO0FBQUE7QUFBQTs7QUFVQTtBQU1BOztBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7O0FBQ0E7QUFBQTs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBR0E7QUFDQTs7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBS0E7QUFDQTtBQUNBO0FBRkE7O0FBS0E7QUFDQTtBQUNBOztBQUVBOztBQUNBO0FBT0E7QUFBQTtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQWlCQTtBQUNBO0FBQUE7QUFBQTs7QUFJQTtBQUFBO0FBQUE7QUFBQTs7QUFDQTtBQUNBO0FBR0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBREE7QUFHQTs7QUFFQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ3hVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7OztBQ3hOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDOURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7Ozs7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUM5TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7QUNsSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7OztBQzNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7OztBQzFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ1BBOzs7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDbUJBO0FBS0E7O0FBTUE7QUFDQTtBQUNBO0FBQ0E7O0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBRUE7QUFFQSIsInNvdXJjZXMiOlsid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9ib290c3RyYXAuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9hZnRlci1mcmFtZS5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL2FwbS1zZXJ2ZXIuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9jb21wcmVzcy5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL2NvbmZpZy1zZXJ2aWNlLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vY29uc3RhbnRzLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vY29udGV4dC5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL2V2ZW50LWhhbmRsZXIuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9odHRwL2ZldGNoLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vaHR0cC9yZXNwb25zZS1zdGF0dXMuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9odHRwL3hoci5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL2luc3RydW1lbnQuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9sb2dnaW5nLXNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9uZGpzb24uanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9vYnNlcnZlcnMvcGFnZS1jbGlja3MuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9vYnNlcnZlcnMvcGFnZS12aXNpYmlsaXR5LmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vcGF0Y2hpbmcvZmV0Y2gtcGF0Y2guanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9wYXRjaGluZy9oaXN0b3J5LXBhdGNoLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vcGF0Y2hpbmcvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi9wYXRjaGluZy9wYXRjaC11dGlscy5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL3BhdGNoaW5nL3hoci1wYXRjaC5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL3BvbHlmaWxscy5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL3F1ZXVlLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vc2VydmljZS1mYWN0b3J5LmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9jb21tb24vdGhyb3R0bGUuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2NvbW1vbi90cnVuY2F0ZS5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL3VybC5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvY29tbW9uL3V0aWxzLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9lcnJvci1sb2dnaW5nL2Vycm9yLWxvZ2dpbmcuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2Vycm9yLWxvZ2dpbmcvaW5kZXguanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2Vycm9yLWxvZ2dpbmcvc3RhY2stdHJhY2UuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL2luZGV4LmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9vcGVudHJhY2luZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvb3BlbnRyYWNpbmcvc3Bhbi5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvb3BlbnRyYWNpbmcvdHJhY2VyLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9wZXJmb3JtYW5jZS1tb25pdG9yaW5nL2JyZWFrZG93bi5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvcGVyZm9ybWFuY2UtbW9uaXRvcmluZy9pbmRleC5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvcGVyZm9ybWFuY2UtbW9uaXRvcmluZy9tZXRyaWNzL2lucC9wcm9jZXNzLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9wZXJmb3JtYW5jZS1tb25pdG9yaW5nL21ldHJpY3MvaW5wL3JlcG9ydC5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvcGVyZm9ybWFuY2UtbW9uaXRvcmluZy9tZXRyaWNzL21ldHJpY3MuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL3BlcmZvcm1hbmNlLW1vbml0b3JpbmcvbmF2aWdhdGlvbi9jYXB0dXJlLW5hdmlnYXRpb24uanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL3BlcmZvcm1hbmNlLW1vbml0b3JpbmcvbmF2aWdhdGlvbi9tYXJrcy5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvcGVyZm9ybWFuY2UtbW9uaXRvcmluZy9uYXZpZ2F0aW9uL25hdmlnYXRpb24tdGltaW5nLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9wZXJmb3JtYW5jZS1tb25pdG9yaW5nL25hdmlnYXRpb24vcmVzb3VyY2UtdGltaW5nLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9wZXJmb3JtYW5jZS1tb25pdG9yaW5nL25hdmlnYXRpb24vdXNlci10aW1pbmcuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL3BlcmZvcm1hbmNlLW1vbml0b3JpbmcvbmF2aWdhdGlvbi91dGlscy5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvcGVyZm9ybWFuY2UtbW9uaXRvcmluZy9wZXJmb3JtYW5jZS1tb25pdG9yaW5nLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9wZXJmb3JtYW5jZS1tb25pdG9yaW5nL3NwYW4tYmFzZS5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uL3J1bS1jb3JlL2Rpc3QvZXMvcGVyZm9ybWFuY2UtbW9uaXRvcmluZy9zcGFuLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vcnVtLWNvcmUvZGlzdC9lcy9wZXJmb3JtYW5jZS1tb25pdG9yaW5nL3RyYW5zYWN0aW9uLXNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL3BlcmZvcm1hbmNlLW1vbml0b3JpbmcvdHJhbnNhY3Rpb24uanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi9ydW0tY29yZS9kaXN0L2VzL3N0YXRlLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi9zcmMvYXBtLWJhc2UuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi8uLi9ub2RlX21vZHVsZXMvZXJyb3Itc3RhY2stcGFyc2VyL2Vycm9yLXN0YWNrLXBhcnNlci5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVudHJhY2luZy9saWIvY29uc3RhbnRzLmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW50cmFjaW5nL2xpYi9mdW5jdGlvbnMuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbnRyYWNpbmcvbGliL25vb3AuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi8uLi9ub2RlX21vZHVsZXMvb3BlbnRyYWNpbmcvbGliL3JlZmVyZW5jZS5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVudHJhY2luZy9saWIvc3Bhbi5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uLy4uL25vZGVfbW9kdWxlcy9vcGVudHJhY2luZy9saWIvc3Bhbl9jb250ZXh0LmpzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vLi4vLi4vbm9kZV9tb2R1bGVzL29wZW50cmFjaW5nL2xpYi90cmFjZXIuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uLi8uLi9ub2RlX21vZHVsZXMvcHJvbWlzZS1wb2x5ZmlsbC9zcmMvZmluYWxseS5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uLy4uL25vZGVfbW9kdWxlcy9wcm9taXNlLXBvbHlmaWxsL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtLy4uLy4uL25vZGVfbW9kdWxlcy9zdGFja2ZyYW1lL3N0YWNrZnJhbWUuanMiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL0BlbGFzdGljL2FwbS1ydW0vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9AZWxhc3RpYy9hcG0tcnVtL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vQGVsYXN0aWMvYXBtLXJ1bS8uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJlbGFzdGljLWFwbS1ydW1cIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiZWxhc3RpYy1hcG0tcnVtXCJdID0gZmFjdG9yeSgpO1xufSkoc2VsZiwgZnVuY3Rpb24oKSB7XG5yZXR1cm4gIiwiaW1wb3J0IHsgaXNQbGF0Zm9ybVN1cHBvcnRlZCwgaXNCcm93c2VyLCBub3cgfSBmcm9tICcuL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBwYXRjaEFsbCB9IGZyb20gJy4vY29tbW9uL3BhdGNoaW5nJztcbmltcG9ydCB7IHN0YXRlIH0gZnJvbSAnLi9zdGF0ZSc7XG52YXIgZW5hYmxlZCA9IGZhbHNlO1xuZXhwb3J0IGZ1bmN0aW9uIGJvb3RzdHJhcCgpIHtcbiAgaWYgKGlzUGxhdGZvcm1TdXBwb3J0ZWQoKSkge1xuICAgIHBhdGNoQWxsKCk7XG4gICAgc3RhdGUuYm9vdHN0cmFwVGltZSA9IG5vdygpO1xuICAgIGVuYWJsZWQgPSB0cnVlO1xuICB9IGVsc2UgaWYgKGlzQnJvd3Nlcikge1xuICAgIGNvbnNvbGUubG9nKCdbRWxhc3RpYyBBUE1dIHBsYXRmb3JtIGlzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIH1cblxuICByZXR1cm4gZW5hYmxlZDtcbn0iLCJ2YXIgUkFGX1RJTUVPVVQgPSAxMDA7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZnRlckZyYW1lKGNhbGxiYWNrKSB7XG4gIHZhciBoYW5kbGVyID0gZnVuY3Rpb24gaGFuZGxlcigpIHtcbiAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUocmFmKTtcbiAgICBzZXRUaW1lb3V0KGNhbGxiYWNrKTtcbiAgfTtcblxuICB2YXIgdGltZW91dCA9IHNldFRpbWVvdXQoaGFuZGxlciwgUkFGX1RJTUVPVVQpO1xuICB2YXIgcmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGhhbmRsZXIpO1xufSIsImltcG9ydCBRdWV1ZSBmcm9tICcuL3F1ZXVlJztcbmltcG9ydCB0aHJvdHRsZSBmcm9tICcuL3Rocm90dGxlJztcbmltcG9ydCBOREpTT04gZnJvbSAnLi9uZGpzb24nO1xuaW1wb3J0IHsgdHJ1bmNhdGVNb2RlbCwgTUVUQURBVEFfTU9ERUwgfSBmcm9tICcuL3RydW5jYXRlJztcbmltcG9ydCB7IEVSUk9SUywgSFRUUF9SRVFVRVNUX1RJTUVPVVQsIFFVRVVFX0ZMVVNILCBUUkFOU0FDVElPTlMgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBQcm9taXNlIH0gZnJvbSAnLi9wb2x5ZmlsbHMnO1xuaW1wb3J0IHsgY29tcHJlc3NNZXRhZGF0YSwgY29tcHJlc3NUcmFuc2FjdGlvbiwgY29tcHJlc3NFcnJvciwgY29tcHJlc3NQYXlsb2FkIH0gZnJvbSAnLi9jb21wcmVzcyc7XG5pbXBvcnQgeyBfX0RFVl9fIH0gZnJvbSAnLi4vc3RhdGUnO1xuaW1wb3J0IHsgc2VuZEZldGNoUmVxdWVzdCwgc2hvdWxkVXNlRmV0Y2hXaXRoS2VlcEFsaXZlIH0gZnJvbSAnLi9odHRwL2ZldGNoJztcbmltcG9ydCB7IHNlbmRYSFIgfSBmcm9tICcuL2h0dHAveGhyJztcbnZhciBUSFJPVFRMRV9JTlRFUlZBTCA9IDYwMDAwO1xuXG52YXIgQXBtU2VydmVyID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBcG1TZXJ2ZXIoY29uZmlnU2VydmljZSwgbG9nZ2luZ1NlcnZpY2UpIHtcbiAgICB0aGlzLl9jb25maWdTZXJ2aWNlID0gY29uZmlnU2VydmljZTtcbiAgICB0aGlzLl9sb2dnaW5nU2VydmljZSA9IGxvZ2dpbmdTZXJ2aWNlO1xuICAgIHRoaXMucXVldWUgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy50aHJvdHRsZUV2ZW50cyA9IG5vb3A7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gQXBtU2VydmVyLnByb3RvdHlwZTtcblxuICBfcHJvdG8uaW5pdCA9IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBxdWV1ZUxpbWl0ID0gdGhpcy5fY29uZmlnU2VydmljZS5nZXQoJ3F1ZXVlTGltaXQnKTtcblxuICAgIHZhciBmbHVzaEludGVydmFsID0gdGhpcy5fY29uZmlnU2VydmljZS5nZXQoJ2ZsdXNoSW50ZXJ2YWwnKTtcblxuICAgIHZhciBsaW1pdCA9IHRoaXMuX2NvbmZpZ1NlcnZpY2UuZ2V0KCdldmVudHNMaW1pdCcpO1xuXG4gICAgdmFyIG9uRmx1c2ggPSBmdW5jdGlvbiBvbkZsdXNoKGV2ZW50cykge1xuICAgICAgdmFyIHByb21pc2UgPSBfdGhpcy5zZW5kRXZlbnRzKGV2ZW50cyk7XG5cbiAgICAgIGlmIChwcm9taXNlKSB7XG4gICAgICAgIHByb21pc2UuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgICAgIF90aGlzLl9sb2dnaW5nU2VydmljZS53YXJuKCdGYWlsZWQgc2VuZGluZyBldmVudHMhJywgX3RoaXMuX2NvbnN0cnVjdEVycm9yKHJlYXNvbikpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBRdWV1ZShvbkZsdXNoLCB7XG4gICAgICBxdWV1ZUxpbWl0OiBxdWV1ZUxpbWl0LFxuICAgICAgZmx1c2hJbnRlcnZhbDogZmx1c2hJbnRlcnZhbFxuICAgIH0pO1xuICAgIHRoaXMudGhyb3R0bGVFdmVudHMgPSB0aHJvdHRsZSh0aGlzLnF1ZXVlLmFkZC5iaW5kKHRoaXMucXVldWUpLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuX2xvZ2dpbmdTZXJ2aWNlLndhcm4oJ0Ryb3BwZWQgZXZlbnRzIGR1ZSB0byB0aHJvdHRsaW5nIScpO1xuICAgIH0sIHtcbiAgICAgIGxpbWl0OiBsaW1pdCxcbiAgICAgIGludGVydmFsOiBUSFJPVFRMRV9JTlRFUlZBTFxuICAgIH0pO1xuXG4gICAgdGhpcy5fY29uZmlnU2VydmljZS5vYnNlcnZlRXZlbnQoUVVFVUVfRkxVU0gsIGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLnF1ZXVlLmZsdXNoKCk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLl9wb3N0SnNvbiA9IGZ1bmN0aW9uIF9wb3N0SnNvbihlbmRQb2ludCwgcGF5bG9hZCkge1xuICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgdmFyIGhlYWRlcnMgPSB7XG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtbmRqc29uJ1xuICAgIH07XG5cbiAgICB2YXIgYXBtUmVxdWVzdCA9IHRoaXMuX2NvbmZpZ1NlcnZpY2UuZ2V0KCdhcG1SZXF1ZXN0Jyk7XG5cbiAgICB2YXIgcGFyYW1zID0ge1xuICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICBiZWZvcmVTZW5kOiBhcG1SZXF1ZXN0XG4gICAgfTtcbiAgICByZXR1cm4gY29tcHJlc3NQYXlsb2FkKHBhcmFtcykuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBfdGhpczIuX2xvZ2dpbmdTZXJ2aWNlLmRlYnVnKCdDb21wcmVzc2luZyB0aGUgcGF5bG9hZCB1c2luZyBDb21wcmVzc2lvblN0cmVhbSBBUEkgZmFpbGVkJywgZXJyb3IubWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICByZXR1cm4gX3RoaXMyLl9tYWtlSHR0cFJlcXVlc3QoJ1BPU1QnLCBlbmRQb2ludCwgcmVzdWx0KTtcbiAgICB9KS50aGVuKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgcmVzcG9uc2VUZXh0ID0gX3JlZi5yZXNwb25zZVRleHQ7XG4gICAgICByZXR1cm4gcmVzcG9uc2VUZXh0O1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5fY29uc3RydWN0RXJyb3IgPSBmdW5jdGlvbiBfY29uc3RydWN0RXJyb3IocmVhc29uKSB7XG4gICAgdmFyIHVybCA9IHJlYXNvbi51cmwsXG4gICAgICAgIHN0YXR1cyA9IHJlYXNvbi5zdGF0dXMsXG4gICAgICAgIHJlc3BvbnNlVGV4dCA9IHJlYXNvbi5yZXNwb25zZVRleHQ7XG5cbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIHJlYXNvbjtcbiAgICB9XG5cbiAgICB2YXIgbWVzc2FnZSA9IHVybCArICcgSFRUUCBzdGF0dXM6ICcgKyBzdGF0dXM7XG5cbiAgICBpZiAoX19ERVZfXyAmJiByZXNwb25zZVRleHQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciBzZXJ2ZXJFcnJvcnMgPSBbXTtcbiAgICAgICAgdmFyIHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZXNwb25zZVRleHQpO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvcnMgJiYgcmVzcG9uc2UuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXNwb25zZS5lcnJvcnMuZm9yRWFjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VydmVyRXJyb3JzLnB1c2goZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIG1lc3NhZ2UgKz0gJyAnICsgc2VydmVyRXJyb3JzLmpvaW4oJywnKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLl9sb2dnaW5nU2VydmljZS5kZWJ1ZygnRXJyb3IgcGFyc2luZyByZXNwb25zZSBmcm9tIEFQTSBzZXJ2ZXInLCBlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEVycm9yKG1lc3NhZ2UpO1xuICB9O1xuXG4gIF9wcm90by5fbWFrZUh0dHBSZXF1ZXN0ID0gZnVuY3Rpb24gX21ha2VIdHRwUmVxdWVzdChtZXRob2QsIHVybCwgX3RlbXApIHtcbiAgICB2YXIgX3JlZjIgPSBfdGVtcCA9PT0gdm9pZCAwID8ge30gOiBfdGVtcCxcbiAgICAgICAgX3JlZjIkdGltZW91dCA9IF9yZWYyLnRpbWVvdXQsXG4gICAgICAgIHRpbWVvdXQgPSBfcmVmMiR0aW1lb3V0ID09PSB2b2lkIDAgPyBIVFRQX1JFUVVFU1RfVElNRU9VVCA6IF9yZWYyJHRpbWVvdXQsXG4gICAgICAgIHBheWxvYWQgPSBfcmVmMi5wYXlsb2FkLFxuICAgICAgICBoZWFkZXJzID0gX3JlZjIuaGVhZGVycyxcbiAgICAgICAgYmVmb3JlU2VuZCA9IF9yZWYyLmJlZm9yZVNlbmQ7XG5cbiAgICB2YXIgc2VuZENyZWRlbnRpYWxzID0gdGhpcy5fY29uZmlnU2VydmljZS5nZXQoJ3NlbmRDcmVkZW50aWFscycpO1xuXG4gICAgaWYgKCFiZWZvcmVTZW5kICYmIHNob3VsZFVzZUZldGNoV2l0aEtlZXBBbGl2ZShtZXRob2QsIHBheWxvYWQpKSB7XG4gICAgICByZXR1cm4gc2VuZEZldGNoUmVxdWVzdChtZXRob2QsIHVybCwge1xuICAgICAgICBrZWVwYWxpdmU6IHRydWUsXG4gICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQsXG4gICAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXG4gICAgICAgIHNlbmRDcmVkZW50aWFsczogc2VuZENyZWRlbnRpYWxzXG4gICAgICB9KS5jYXRjaChmdW5jdGlvbiAocmVhc29uKSB7XG4gICAgICAgIGlmIChyZWFzb24gaW5zdGFuY2VvZiBUeXBlRXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gc2VuZFhIUihtZXRob2QsIHVybCwge1xuICAgICAgICAgICAgdGltZW91dDogdGltZW91dCxcbiAgICAgICAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgICAgICAgYmVmb3JlU2VuZDogYmVmb3JlU2VuZCxcbiAgICAgICAgICAgIHNlbmRDcmVkZW50aWFsczogc2VuZENyZWRlbnRpYWxzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyByZWFzb247XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2VuZFhIUihtZXRob2QsIHVybCwge1xuICAgICAgdGltZW91dDogdGltZW91dCxcbiAgICAgIHBheWxvYWQ6IHBheWxvYWQsXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzLFxuICAgICAgYmVmb3JlU2VuZDogYmVmb3JlU2VuZCxcbiAgICAgIHNlbmRDcmVkZW50aWFsczogc2VuZENyZWRlbnRpYWxzXG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLmZldGNoQ29uZmlnID0gZnVuY3Rpb24gZmV0Y2hDb25maWcoc2VydmljZU5hbWUsIGVudmlyb25tZW50KSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICB2YXIgX3RoaXMkZ2V0RW5kcG9pbnRzID0gdGhpcy5nZXRFbmRwb2ludHMoKSxcbiAgICAgICAgY29uZmlnRW5kcG9pbnQgPSBfdGhpcyRnZXRFbmRwb2ludHMuY29uZmlnRW5kcG9pbnQ7XG5cbiAgICBpZiAoIXNlcnZpY2VOYW1lKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJ3NlcnZpY2VOYW1lIGlzIHJlcXVpcmVkIGZvciBmZXRjaGluZyBjZW50cmFsIGNvbmZpZy4nKTtcbiAgICB9XG5cbiAgICBjb25maWdFbmRwb2ludCArPSBcIj9zZXJ2aWNlLm5hbWU9XCIgKyBzZXJ2aWNlTmFtZTtcblxuICAgIGlmIChlbnZpcm9ubWVudCkge1xuICAgICAgY29uZmlnRW5kcG9pbnQgKz0gXCImc2VydmljZS5lbnZpcm9ubWVudD1cIiArIGVudmlyb25tZW50O1xuICAgIH1cblxuICAgIHZhciBsb2NhbENvbmZpZyA9IHRoaXMuX2NvbmZpZ1NlcnZpY2UuZ2V0TG9jYWxDb25maWcoKTtcblxuICAgIGlmIChsb2NhbENvbmZpZykge1xuICAgICAgY29uZmlnRW5kcG9pbnQgKz0gXCImaWZub25lbWF0Y2g9XCIgKyBsb2NhbENvbmZpZy5ldGFnO1xuICAgIH1cblxuICAgIHZhciBhcG1SZXF1ZXN0ID0gdGhpcy5fY29uZmlnU2VydmljZS5nZXQoJ2FwbVJlcXVlc3QnKTtcblxuICAgIHJldHVybiB0aGlzLl9tYWtlSHR0cFJlcXVlc3QoJ0dFVCcsIGNvbmZpZ0VuZHBvaW50LCB7XG4gICAgICB0aW1lb3V0OiA1MDAwLFxuICAgICAgYmVmb3JlU2VuZDogYXBtUmVxdWVzdFxuICAgIH0pLnRoZW4oZnVuY3Rpb24gKHhocikge1xuICAgICAgdmFyIHN0YXR1cyA9IHhoci5zdGF0dXMsXG4gICAgICAgICAgcmVzcG9uc2VUZXh0ID0geGhyLnJlc3BvbnNlVGV4dDtcblxuICAgICAgaWYgKHN0YXR1cyA9PT0gMzA0KSB7XG4gICAgICAgIHJldHVybiBsb2NhbENvbmZpZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciByZW1vdGVDb25maWcgPSBKU09OLnBhcnNlKHJlc3BvbnNlVGV4dCk7XG4gICAgICAgIHZhciBldGFnID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdldGFnJyk7XG5cbiAgICAgICAgaWYgKGV0YWcpIHtcbiAgICAgICAgICByZW1vdGVDb25maWcuZXRhZyA9IGV0YWcucmVwbGFjZSgvW1wiXS9nLCAnJyk7XG5cbiAgICAgICAgICBfdGhpczMuX2NvbmZpZ1NlcnZpY2Uuc2V0TG9jYWxDb25maWcocmVtb3RlQ29uZmlnLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZW1vdGVDb25maWc7XG4gICAgICB9XG4gICAgfSkuY2F0Y2goZnVuY3Rpb24gKHJlYXNvbikge1xuICAgICAgdmFyIGVycm9yID0gX3RoaXMzLl9jb25zdHJ1Y3RFcnJvcihyZWFzb24pO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5jcmVhdGVNZXRhRGF0YSA9IGZ1bmN0aW9uIGNyZWF0ZU1ldGFEYXRhKCkge1xuICAgIHZhciBjZmcgPSB0aGlzLl9jb25maWdTZXJ2aWNlO1xuICAgIHZhciBtZXRhZGF0YSA9IHtcbiAgICAgIHNlcnZpY2U6IHtcbiAgICAgICAgbmFtZTogY2ZnLmdldCgnc2VydmljZU5hbWUnKSxcbiAgICAgICAgdmVyc2lvbjogY2ZnLmdldCgnc2VydmljZVZlcnNpb24nKSxcbiAgICAgICAgYWdlbnQ6IHtcbiAgICAgICAgICBuYW1lOiAncnVtLWpzJyxcbiAgICAgICAgICB2ZXJzaW9uOiBjZmcudmVyc2lvblxuICAgICAgICB9LFxuICAgICAgICBsYW5ndWFnZToge1xuICAgICAgICAgIG5hbWU6ICdqYXZhc2NyaXB0J1xuICAgICAgICB9LFxuICAgICAgICBlbnZpcm9ubWVudDogY2ZnLmdldCgnZW52aXJvbm1lbnQnKVxuICAgICAgfSxcbiAgICAgIGxhYmVsczogY2ZnLmdldCgnY29udGV4dC50YWdzJylcbiAgICB9O1xuICAgIHJldHVybiB0cnVuY2F0ZU1vZGVsKE1FVEFEQVRBX01PREVMLCBtZXRhZGF0YSk7XG4gIH07XG5cbiAgX3Byb3RvLmFkZEVycm9yID0gZnVuY3Rpb24gYWRkRXJyb3IoZXJyb3IpIHtcbiAgICB2YXIgX3RoaXMkdGhyb3R0bGVFdmVudHM7XG5cbiAgICB0aGlzLnRocm90dGxlRXZlbnRzKChfdGhpcyR0aHJvdHRsZUV2ZW50cyA9IHt9LCBfdGhpcyR0aHJvdHRsZUV2ZW50c1tFUlJPUlNdID0gZXJyb3IsIF90aGlzJHRocm90dGxlRXZlbnRzKSk7XG4gIH07XG5cbiAgX3Byb3RvLmFkZFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gYWRkVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgICB2YXIgX3RoaXMkdGhyb3R0bGVFdmVudHMyO1xuXG4gICAgdGhpcy50aHJvdHRsZUV2ZW50cygoX3RoaXMkdGhyb3R0bGVFdmVudHMyID0ge30sIF90aGlzJHRocm90dGxlRXZlbnRzMltUUkFOU0FDVElPTlNdID0gdHJhbnNhY3Rpb24sIF90aGlzJHRocm90dGxlRXZlbnRzMikpO1xuICB9O1xuXG4gIF9wcm90by5uZGpzb25FcnJvcnMgPSBmdW5jdGlvbiBuZGpzb25FcnJvcnMoZXJyb3JzLCBjb21wcmVzcykge1xuICAgIHZhciBrZXkgPSBjb21wcmVzcyA/ICdlJyA6ICdlcnJvcic7XG4gICAgcmV0dXJuIGVycm9ycy5tYXAoZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICB2YXIgX05ESlNPTiRzdHJpbmdpZnk7XG5cbiAgICAgIHJldHVybiBOREpTT04uc3RyaW5naWZ5KChfTkRKU09OJHN0cmluZ2lmeSA9IHt9LCBfTkRKU09OJHN0cmluZ2lmeVtrZXldID0gY29tcHJlc3MgPyBjb21wcmVzc0Vycm9yKGVycm9yKSA6IGVycm9yLCBfTkRKU09OJHN0cmluZ2lmeSkpO1xuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5uZGpzb25NZXRyaWNzZXRzID0gZnVuY3Rpb24gbmRqc29uTWV0cmljc2V0cyhtZXRyaWNzZXRzKSB7XG4gICAgcmV0dXJuIG1ldHJpY3NldHMubWFwKGZ1bmN0aW9uIChtZXRyaWNzZXQpIHtcbiAgICAgIHJldHVybiBOREpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbWV0cmljc2V0OiBtZXRyaWNzZXRcbiAgICAgIH0pO1xuICAgIH0pLmpvaW4oJycpO1xuICB9O1xuXG4gIF9wcm90by5uZGpzb25UcmFuc2FjdGlvbnMgPSBmdW5jdGlvbiBuZGpzb25UcmFuc2FjdGlvbnModHJhbnNhY3Rpb25zLCBjb21wcmVzcykge1xuICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgdmFyIGtleSA9IGNvbXByZXNzID8gJ3gnIDogJ3RyYW5zYWN0aW9uJztcbiAgICByZXR1cm4gdHJhbnNhY3Rpb25zLm1hcChmdW5jdGlvbiAodHIpIHtcbiAgICAgIHZhciBfTkRKU09OJHN0cmluZ2lmeTI7XG5cbiAgICAgIHZhciBzcGFucyA9ICcnLFxuICAgICAgICAgIGJyZWFrZG93bnMgPSAnJztcblxuICAgICAgaWYgKCFjb21wcmVzcykge1xuICAgICAgICBpZiAodHIuc3BhbnMpIHtcbiAgICAgICAgICBzcGFucyA9IHRyLnNwYW5zLm1hcChmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgICAgICAgcmV0dXJuIE5ESlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICBzcGFuOiBzcGFuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KS5qb2luKCcnKTtcbiAgICAgICAgICBkZWxldGUgdHIuc3BhbnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHIuYnJlYWtkb3duKSB7XG4gICAgICAgICAgYnJlYWtkb3ducyA9IF90aGlzNC5uZGpzb25NZXRyaWNzZXRzKHRyLmJyZWFrZG93bik7XG4gICAgICAgICAgZGVsZXRlIHRyLmJyZWFrZG93bjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gTkRKU09OLnN0cmluZ2lmeSgoX05ESlNPTiRzdHJpbmdpZnkyID0ge30sIF9OREpTT04kc3RyaW5naWZ5MltrZXldID0gY29tcHJlc3MgPyBjb21wcmVzc1RyYW5zYWN0aW9uKHRyKSA6IHRyLCBfTkRKU09OJHN0cmluZ2lmeTIpKSArIHNwYW5zICsgYnJlYWtkb3ducztcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8uc2VuZEV2ZW50cyA9IGZ1bmN0aW9uIHNlbmRFdmVudHMoZXZlbnRzKSB7XG4gICAgdmFyIF9wYXlsb2FkLCBfTkRKU09OJHN0cmluZ2lmeTM7XG5cbiAgICBpZiAoZXZlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB0cmFuc2FjdGlvbnMgPSBbXTtcbiAgICB2YXIgZXJyb3JzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGV2ZW50ID0gZXZlbnRzW2ldO1xuXG4gICAgICBpZiAoZXZlbnRbVFJBTlNBQ1RJT05TXSkge1xuICAgICAgICB0cmFuc2FjdGlvbnMucHVzaChldmVudFtUUkFOU0FDVElPTlNdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50W0VSUk9SU10pIHtcbiAgICAgICAgZXJyb3JzLnB1c2goZXZlbnRbRVJST1JTXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRyYW5zYWN0aW9ucy5sZW5ndGggPT09IDAgJiYgZXJyb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBjZmcgPSB0aGlzLl9jb25maWdTZXJ2aWNlO1xuICAgIHZhciBwYXlsb2FkID0gKF9wYXlsb2FkID0ge30sIF9wYXlsb2FkW1RSQU5TQUNUSU9OU10gPSB0cmFuc2FjdGlvbnMsIF9wYXlsb2FkW0VSUk9SU10gPSBlcnJvcnMsIF9wYXlsb2FkKTtcbiAgICB2YXIgZmlsdGVyZWRQYXlsb2FkID0gY2ZnLmFwcGx5RmlsdGVycyhwYXlsb2FkKTtcblxuICAgIGlmICghZmlsdGVyZWRQYXlsb2FkKSB7XG4gICAgICB0aGlzLl9sb2dnaW5nU2VydmljZS53YXJuKCdEcm9wcGVkIHBheWxvYWQgZHVlIHRvIGZpbHRlcmluZyEnKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBhcGlWZXJzaW9uID0gY2ZnLmdldCgnYXBpVmVyc2lvbicpO1xuICAgIHZhciBjb21wcmVzcyA9IGFwaVZlcnNpb24gPiAyO1xuICAgIHZhciBuZGpzb24gPSBbXTtcbiAgICB2YXIgbWV0YWRhdGEgPSB0aGlzLmNyZWF0ZU1ldGFEYXRhKCk7XG4gICAgdmFyIG1ldGFkYXRhS2V5ID0gY29tcHJlc3MgPyAnbScgOiAnbWV0YWRhdGEnO1xuICAgIG5kanNvbi5wdXNoKE5ESlNPTi5zdHJpbmdpZnkoKF9OREpTT04kc3RyaW5naWZ5MyA9IHt9LCBfTkRKU09OJHN0cmluZ2lmeTNbbWV0YWRhdGFLZXldID0gY29tcHJlc3MgPyBjb21wcmVzc01ldGFkYXRhKG1ldGFkYXRhKSA6IG1ldGFkYXRhLCBfTkRKU09OJHN0cmluZ2lmeTMpKSk7XG4gICAgbmRqc29uID0gbmRqc29uLmNvbmNhdCh0aGlzLm5kanNvbkVycm9ycyhmaWx0ZXJlZFBheWxvYWRbRVJST1JTXSwgY29tcHJlc3MpLCB0aGlzLm5kanNvblRyYW5zYWN0aW9ucyhmaWx0ZXJlZFBheWxvYWRbVFJBTlNBQ1RJT05TXSwgY29tcHJlc3MpKTtcbiAgICB2YXIgbmRqc29uUGF5bG9hZCA9IG5kanNvbi5qb2luKCcnKTtcblxuICAgIHZhciBfdGhpcyRnZXRFbmRwb2ludHMyID0gdGhpcy5nZXRFbmRwb2ludHMoKSxcbiAgICAgICAgaW50YWtlRW5kcG9pbnQgPSBfdGhpcyRnZXRFbmRwb2ludHMyLmludGFrZUVuZHBvaW50O1xuXG4gICAgcmV0dXJuIHRoaXMuX3Bvc3RKc29uKGludGFrZUVuZHBvaW50LCBuZGpzb25QYXlsb2FkKTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0RW5kcG9pbnRzID0gZnVuY3Rpb24gZ2V0RW5kcG9pbnRzKCkge1xuICAgIHZhciBzZXJ2ZXJVcmwgPSB0aGlzLl9jb25maWdTZXJ2aWNlLmdldCgnc2VydmVyVXJsJyk7XG5cbiAgICB2YXIgYXBpVmVyc2lvbiA9IHRoaXMuX2NvbmZpZ1NlcnZpY2UuZ2V0KCdhcGlWZXJzaW9uJyk7XG5cbiAgICB2YXIgc2VydmVyVXJsUHJlZml4ID0gdGhpcy5fY29uZmlnU2VydmljZS5nZXQoJ3NlcnZlclVybFByZWZpeCcpIHx8IFwiL2ludGFrZS92XCIgKyBhcGlWZXJzaW9uICsgXCIvcnVtL2V2ZW50c1wiO1xuICAgIHZhciBpbnRha2VFbmRwb2ludCA9IHNlcnZlclVybCArIHNlcnZlclVybFByZWZpeDtcbiAgICB2YXIgY29uZmlnRW5kcG9pbnQgPSBzZXJ2ZXJVcmwgKyBcIi9jb25maWcvdjEvcnVtL2FnZW50c1wiO1xuICAgIHJldHVybiB7XG4gICAgICBpbnRha2VFbmRwb2ludDogaW50YWtlRW5kcG9pbnQsXG4gICAgICBjb25maWdFbmRwb2ludDogY29uZmlnRW5kcG9pbnRcbiAgICB9O1xuICB9O1xuXG4gIHJldHVybiBBcG1TZXJ2ZXI7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IEFwbVNlcnZlcjsiLCJpbXBvcnQgeyBQcm9taXNlIH0gZnJvbSAnLi9wb2x5ZmlsbHMnO1xuaW1wb3J0IHsgTkFWSUdBVElPTl9USU1JTkdfTUFSS1MsIENPTVBSRVNTRURfTkFWX1RJTUlOR19NQVJLUyB9IGZyb20gJy4uL3BlcmZvcm1hbmNlLW1vbml0b3JpbmcvbmF2aWdhdGlvbi9tYXJrcyc7XG5pbXBvcnQgeyBpc0JlYWNvbkluc3BlY3Rpb25FbmFibGVkIH0gZnJvbSAnLi91dGlscyc7XG5cbmZ1bmN0aW9uIGNvbXByZXNzU3RhY2tGcmFtZXMoZnJhbWVzKSB7XG4gIHJldHVybiBmcmFtZXMubWFwKGZ1bmN0aW9uIChmcmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICBhcDogZnJhbWUuYWJzX3BhdGgsXG4gICAgICBmOiBmcmFtZS5maWxlbmFtZSxcbiAgICAgIGZuOiBmcmFtZS5mdW5jdGlvbixcbiAgICAgIGxpOiBmcmFtZS5saW5lbm8sXG4gICAgICBjbzogZnJhbWUuY29sbm9cbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY29tcHJlc3NSZXNwb25zZShyZXNwb25zZSkge1xuICByZXR1cm4ge1xuICAgIHRzOiByZXNwb25zZS50cmFuc2Zlcl9zaXplLFxuICAgIGViczogcmVzcG9uc2UuZW5jb2RlZF9ib2R5X3NpemUsXG4gICAgZGJzOiByZXNwb25zZS5kZWNvZGVkX2JvZHlfc2l6ZVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb21wcmVzc0hUVFAoaHR0cCkge1xuICB2YXIgY29tcHJlc3NlZCA9IHt9O1xuICB2YXIgbWV0aG9kID0gaHR0cC5tZXRob2QsXG4gICAgICBzdGF0dXNfY29kZSA9IGh0dHAuc3RhdHVzX2NvZGUsXG4gICAgICB1cmwgPSBodHRwLnVybCxcbiAgICAgIHJlc3BvbnNlID0gaHR0cC5yZXNwb25zZTtcbiAgY29tcHJlc3NlZC51cmwgPSB1cmw7XG5cbiAgaWYgKG1ldGhvZCkge1xuICAgIGNvbXByZXNzZWQubXQgPSBtZXRob2Q7XG4gIH1cblxuICBpZiAoc3RhdHVzX2NvZGUpIHtcbiAgICBjb21wcmVzc2VkLnNjID0gc3RhdHVzX2NvZGU7XG4gIH1cblxuICBpZiAocmVzcG9uc2UpIHtcbiAgICBjb21wcmVzc2VkLnIgPSBjb21wcmVzc1Jlc3BvbnNlKHJlc3BvbnNlKTtcbiAgfVxuXG4gIHJldHVybiBjb21wcmVzc2VkO1xufVxuXG5mdW5jdGlvbiBjb21wcmVzc0NvbnRleHQoY29udGV4dCkge1xuICBpZiAoIWNvbnRleHQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBjb21wcmVzc2VkID0ge307XG4gIHZhciBwYWdlID0gY29udGV4dC5wYWdlLFxuICAgICAgaHR0cCA9IGNvbnRleHQuaHR0cCxcbiAgICAgIHJlc3BvbnNlID0gY29udGV4dC5yZXNwb25zZSxcbiAgICAgIGRlc3RpbmF0aW9uID0gY29udGV4dC5kZXN0aW5hdGlvbixcbiAgICAgIHVzZXIgPSBjb250ZXh0LnVzZXIsXG4gICAgICBjdXN0b20gPSBjb250ZXh0LmN1c3RvbTtcblxuICBpZiAocGFnZSkge1xuICAgIGNvbXByZXNzZWQucCA9IHtcbiAgICAgIHJmOiBwYWdlLnJlZmVyZXIsXG4gICAgICB1cmw6IHBhZ2UudXJsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChodHRwKSB7XG4gICAgY29tcHJlc3NlZC5oID0gY29tcHJlc3NIVFRQKGh0dHApO1xuICB9XG5cbiAgaWYgKHJlc3BvbnNlKSB7XG4gICAgY29tcHJlc3NlZC5yID0gY29tcHJlc3NSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICBpZiAoZGVzdGluYXRpb24pIHtcbiAgICB2YXIgc2VydmljZSA9IGRlc3RpbmF0aW9uLnNlcnZpY2U7XG4gICAgY29tcHJlc3NlZC5kdCA9IHtcbiAgICAgIHNlOiB7XG4gICAgICAgIG46IHNlcnZpY2UubmFtZSxcbiAgICAgICAgdDogc2VydmljZS50eXBlLFxuICAgICAgICByYzogc2VydmljZS5yZXNvdXJjZVxuICAgICAgfSxcbiAgICAgIGFkOiBkZXN0aW5hdGlvbi5hZGRyZXNzLFxuICAgICAgcG86IGRlc3RpbmF0aW9uLnBvcnRcbiAgICB9O1xuICB9XG5cbiAgaWYgKHVzZXIpIHtcbiAgICBjb21wcmVzc2VkLnUgPSB7XG4gICAgICBpZDogdXNlci5pZCxcbiAgICAgIHVuOiB1c2VyLnVzZXJuYW1lLFxuICAgICAgZW06IHVzZXIuZW1haWxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGN1c3RvbSkge1xuICAgIGNvbXByZXNzZWQuY3UgPSBjdXN0b207XG4gIH1cblxuICByZXR1cm4gY29tcHJlc3NlZDtcbn1cblxuZnVuY3Rpb24gY29tcHJlc3NNYXJrcyhtYXJrcykge1xuICBpZiAoIW1hcmtzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2YXIgY29tcHJlc3NlZE50TWFya3MgPSBjb21wcmVzc05hdmlnYXRpb25UaW1pbmdNYXJrcyhtYXJrcy5uYXZpZ2F0aW9uVGltaW5nKTtcbiAgdmFyIGNvbXByZXNzZWQgPSB7XG4gICAgbnQ6IGNvbXByZXNzZWROdE1hcmtzLFxuICAgIGE6IGNvbXByZXNzQWdlbnRNYXJrcyhjb21wcmVzc2VkTnRNYXJrcywgbWFya3MuYWdlbnQpXG4gIH07XG4gIHJldHVybiBjb21wcmVzc2VkO1xufVxuXG5mdW5jdGlvbiBjb21wcmVzc05hdmlnYXRpb25UaW1pbmdNYXJrcyhudE1hcmtzKSB7XG4gIGlmICghbnRNYXJrcykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIGNvbXByZXNzZWQgPSB7fTtcbiAgQ09NUFJFU1NFRF9OQVZfVElNSU5HX01BUktTLmZvckVhY2goZnVuY3Rpb24gKG1hcmssIGluZGV4KSB7XG4gICAgdmFyIG1hcHBpbmcgPSBOQVZJR0FUSU9OX1RJTUlOR19NQVJLU1tpbmRleF07XG4gICAgY29tcHJlc3NlZFttYXJrXSA9IG50TWFya3NbbWFwcGluZ107XG4gIH0pO1xuICByZXR1cm4gY29tcHJlc3NlZDtcbn1cblxuZnVuY3Rpb24gY29tcHJlc3NBZ2VudE1hcmtzKGNvbXByZXNzZWROdE1hcmtzLCBhZ2VudE1hcmtzKSB7XG4gIHZhciBjb21wcmVzc2VkID0ge307XG5cbiAgaWYgKGNvbXByZXNzZWROdE1hcmtzKSB7XG4gICAgY29tcHJlc3NlZCA9IHtcbiAgICAgIGZiOiBjb21wcmVzc2VkTnRNYXJrcy5ycyxcbiAgICAgIGRpOiBjb21wcmVzc2VkTnRNYXJrcy5kaSxcbiAgICAgIGRjOiBjb21wcmVzc2VkTnRNYXJrcy5kY1xuICAgIH07XG4gIH1cblxuICBpZiAoYWdlbnRNYXJrcykge1xuICAgIHZhciBmcCA9IGFnZW50TWFya3MuZmlyc3RDb250ZW50ZnVsUGFpbnQ7XG4gICAgdmFyIGxwID0gYWdlbnRNYXJrcy5sYXJnZXN0Q29udGVudGZ1bFBhaW50O1xuXG4gICAgaWYgKGZwKSB7XG4gICAgICBjb21wcmVzc2VkLmZwID0gZnA7XG4gICAgfVxuXG4gICAgaWYgKGxwKSB7XG4gICAgICBjb21wcmVzc2VkLmxwID0gbHA7XG4gICAgfVxuICB9XG5cbiAgaWYgKE9iamVjdC5rZXlzKGNvbXByZXNzZWQpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGNvbXByZXNzZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wcmVzc01ldGFkYXRhKG1ldGFkYXRhKSB7XG4gIHZhciBzZXJ2aWNlID0gbWV0YWRhdGEuc2VydmljZSxcbiAgICAgIGxhYmVscyA9IG1ldGFkYXRhLmxhYmVscztcbiAgdmFyIGFnZW50ID0gc2VydmljZS5hZ2VudCxcbiAgICAgIGxhbmd1YWdlID0gc2VydmljZS5sYW5ndWFnZTtcbiAgcmV0dXJuIHtcbiAgICBzZToge1xuICAgICAgbjogc2VydmljZS5uYW1lLFxuICAgICAgdmU6IHNlcnZpY2UudmVyc2lvbixcbiAgICAgIGE6IHtcbiAgICAgICAgbjogYWdlbnQubmFtZSxcbiAgICAgICAgdmU6IGFnZW50LnZlcnNpb25cbiAgICAgIH0sXG4gICAgICBsYToge1xuICAgICAgICBuOiBsYW5ndWFnZS5uYW1lXG4gICAgICB9LFxuICAgICAgZW46IHNlcnZpY2UuZW52aXJvbm1lbnRcbiAgICB9LFxuICAgIGw6IGxhYmVsc1xuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvbXByZXNzVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgdmFyIHNwYW5zID0gdHJhbnNhY3Rpb24uc3BhbnMubWFwKGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgdmFyIHNwYW5EYXRhID0ge1xuICAgICAgaWQ6IHNwYW4uaWQsXG4gICAgICBuOiBzcGFuLm5hbWUsXG4gICAgICB0OiBzcGFuLnR5cGUsXG4gICAgICBzOiBzcGFuLnN0YXJ0LFxuICAgICAgZDogc3Bhbi5kdXJhdGlvbixcbiAgICAgIGM6IGNvbXByZXNzQ29udGV4dChzcGFuLmNvbnRleHQpLFxuICAgICAgbzogc3Bhbi5vdXRjb21lLFxuICAgICAgc3I6IHNwYW4uc2FtcGxlX3JhdGVcbiAgICB9O1xuXG4gICAgaWYgKHNwYW4ucGFyZW50X2lkICE9PSB0cmFuc2FjdGlvbi5pZCkge1xuICAgICAgc3BhbkRhdGEucGlkID0gc3Bhbi5wYXJlbnRfaWQ7XG4gICAgfVxuXG4gICAgaWYgKHNwYW4uc3luYyA9PT0gdHJ1ZSkge1xuICAgICAgc3BhbkRhdGEuc3kgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChzcGFuLnN1YnR5cGUpIHtcbiAgICAgIHNwYW5EYXRhLnN1ID0gc3Bhbi5zdWJ0eXBlO1xuICAgIH1cblxuICAgIGlmIChzcGFuLmFjdGlvbikge1xuICAgICAgc3BhbkRhdGEuYWMgPSBzcGFuLmFjdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3BhbkRhdGE7XG4gIH0pO1xuICB2YXIgdHIgPSB7XG4gICAgaWQ6IHRyYW5zYWN0aW9uLmlkLFxuICAgIHBpZDogdHJhbnNhY3Rpb24ucGFyZW50X2lkLFxuICAgIHRpZDogdHJhbnNhY3Rpb24udHJhY2VfaWQsXG4gICAgbjogdHJhbnNhY3Rpb24ubmFtZSxcbiAgICB0OiB0cmFuc2FjdGlvbi50eXBlLFxuICAgIGQ6IHRyYW5zYWN0aW9uLmR1cmF0aW9uLFxuICAgIGM6IGNvbXByZXNzQ29udGV4dCh0cmFuc2FjdGlvbi5jb250ZXh0KSxcbiAgICBrOiBjb21wcmVzc01hcmtzKHRyYW5zYWN0aW9uLm1hcmtzKSxcbiAgICBtZTogY29tcHJlc3NNZXRyaWNzZXRzKHRyYW5zYWN0aW9uLmJyZWFrZG93biksXG4gICAgeTogc3BhbnMsXG4gICAgeWM6IHtcbiAgICAgIHNkOiBzcGFucy5sZW5ndGhcbiAgICB9LFxuICAgIHNtOiB0cmFuc2FjdGlvbi5zYW1wbGVkLFxuICAgIHNyOiB0cmFuc2FjdGlvbi5zYW1wbGVfcmF0ZSxcbiAgICBvOiB0cmFuc2FjdGlvbi5vdXRjb21lXG4gIH07XG5cbiAgaWYgKHRyYW5zYWN0aW9uLmV4cGVyaWVuY2UpIHtcbiAgICB2YXIgX3RyYW5zYWN0aW9uJGV4cGVyaWVuID0gdHJhbnNhY3Rpb24uZXhwZXJpZW5jZSxcbiAgICAgICAgY2xzID0gX3RyYW5zYWN0aW9uJGV4cGVyaWVuLmNscyxcbiAgICAgICAgZmlkID0gX3RyYW5zYWN0aW9uJGV4cGVyaWVuLmZpZCxcbiAgICAgICAgdGJ0ID0gX3RyYW5zYWN0aW9uJGV4cGVyaWVuLnRidCxcbiAgICAgICAgbG9uZ3Rhc2sgPSBfdHJhbnNhY3Rpb24kZXhwZXJpZW4ubG9uZ3Rhc2s7XG4gICAgdHIuZXhwID0ge1xuICAgICAgY2xzOiBjbHMsXG4gICAgICBmaWQ6IGZpZCxcbiAgICAgIHRidDogdGJ0LFxuICAgICAgbHQ6IGxvbmd0YXNrXG4gICAgfTtcbiAgfVxuXG4gIGlmICh0cmFuc2FjdGlvbi5zZXNzaW9uKSB7XG4gICAgdmFyIF90cmFuc2FjdGlvbiRzZXNzaW9uID0gdHJhbnNhY3Rpb24uc2Vzc2lvbixcbiAgICAgICAgaWQgPSBfdHJhbnNhY3Rpb24kc2Vzc2lvbi5pZCxcbiAgICAgICAgc2VxdWVuY2UgPSBfdHJhbnNhY3Rpb24kc2Vzc2lvbi5zZXF1ZW5jZTtcbiAgICB0ci5zZXMgPSB7XG4gICAgICBpZDogaWQsXG4gICAgICBzZXE6IHNlcXVlbmNlXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB0cjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjb21wcmVzc0Vycm9yKGVycm9yKSB7XG4gIHZhciBleGNlcHRpb24gPSBlcnJvci5leGNlcHRpb247XG4gIHZhciBjb21wcmVzc2VkID0ge1xuICAgIGlkOiBlcnJvci5pZCxcbiAgICBjbDogZXJyb3IuY3VscHJpdCxcbiAgICBleDoge1xuICAgICAgbWc6IGV4Y2VwdGlvbi5tZXNzYWdlLFxuICAgICAgc3Q6IGNvbXByZXNzU3RhY2tGcmFtZXMoZXhjZXB0aW9uLnN0YWNrdHJhY2UpLFxuICAgICAgdDogZXJyb3IudHlwZVxuICAgIH0sXG4gICAgYzogY29tcHJlc3NDb250ZXh0KGVycm9yLmNvbnRleHQpXG4gIH07XG4gIHZhciB0cmFuc2FjdGlvbiA9IGVycm9yLnRyYW5zYWN0aW9uO1xuXG4gIGlmICh0cmFuc2FjdGlvbikge1xuICAgIGNvbXByZXNzZWQudGlkID0gZXJyb3IudHJhY2VfaWQ7XG4gICAgY29tcHJlc3NlZC5waWQgPSBlcnJvci5wYXJlbnRfaWQ7XG4gICAgY29tcHJlc3NlZC54aWQgPSBlcnJvci50cmFuc2FjdGlvbl9pZDtcbiAgICBjb21wcmVzc2VkLnggPSB7XG4gICAgICB0OiB0cmFuc2FjdGlvbi50eXBlLFxuICAgICAgc206IHRyYW5zYWN0aW9uLnNhbXBsZWRcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIGNvbXByZXNzZWQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHJlc3NNZXRyaWNzZXRzKGJyZWFrZG93bnMpIHtcbiAgcmV0dXJuIGJyZWFrZG93bnMubWFwKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgdmFyIHNwYW4gPSBfcmVmLnNwYW4sXG4gICAgICAgIHNhbXBsZXMgPSBfcmVmLnNhbXBsZXM7XG4gICAgcmV0dXJuIHtcbiAgICAgIHk6IHtcbiAgICAgICAgdDogc3Bhbi50eXBlXG4gICAgICB9LFxuICAgICAgc2E6IHtcbiAgICAgICAgeXNjOiB7XG4gICAgICAgICAgdjogc2FtcGxlc1snc3Bhbi5zZWxmX3RpbWUuY291bnQnXS52YWx1ZVxuICAgICAgICB9LFxuICAgICAgICB5c3M6IHtcbiAgICAgICAgICB2OiBzYW1wbGVzWydzcGFuLnNlbGZfdGltZS5zdW0udXMnXS52YWx1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHJlc3NQYXlsb2FkKHBhcmFtcywgdHlwZSkge1xuICBpZiAodHlwZSA9PT0gdm9pZCAwKSB7XG4gICAgdHlwZSA9ICdnemlwJztcbiAgfVxuXG4gIHZhciBpc0NvbXByZXNzaW9uU3RyZWFtU3VwcG9ydGVkID0gdHlwZW9mIENvbXByZXNzaW9uU3RyZWFtID09PSAnZnVuY3Rpb24nO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICBpZiAoIWlzQ29tcHJlc3Npb25TdHJlYW1TdXBwb3J0ZWQpIHtcbiAgICAgIHJldHVybiByZXNvbHZlKHBhcmFtcyk7XG4gICAgfVxuXG4gICAgaWYgKGlzQmVhY29uSW5zcGVjdGlvbkVuYWJsZWQoKSkge1xuICAgICAgcmV0dXJuIHJlc29sdmUocGFyYW1zKTtcbiAgICB9XG5cbiAgICB2YXIgcGF5bG9hZCA9IHBhcmFtcy5wYXlsb2FkLFxuICAgICAgICBoZWFkZXJzID0gcGFyYW1zLmhlYWRlcnMsXG4gICAgICAgIGJlZm9yZVNlbmQgPSBwYXJhbXMuYmVmb3JlU2VuZDtcbiAgICB2YXIgcGF5bG9hZFN0cmVhbSA9IG5ldyBCbG9iKFtwYXlsb2FkXSkuc3RyZWFtKCk7XG4gICAgdmFyIGNvbXByZXNzZWRTdHJlYW0gPSBwYXlsb2FkU3RyZWFtLnBpcGVUaHJvdWdoKG5ldyBDb21wcmVzc2lvblN0cmVhbSh0eXBlKSk7XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShjb21wcmVzc2VkU3RyZWFtKS5ibG9iKCkudGhlbihmdW5jdGlvbiAocGF5bG9hZCkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1FbmNvZGluZyddID0gdHlwZTtcbiAgICAgIHJldHVybiByZXNvbHZlKHtcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgYmVmb3JlU2VuZDogYmVmb3JlU2VuZFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xufSIsImZ1bmN0aW9uIF9leHRlbmRzKCkgeyBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldOyBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7IGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gfSB9IHJldHVybiB0YXJnZXQ7IH07IHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9XG5cbmltcG9ydCB7IGdldEN1cnJlbnRTY3JpcHQsIHNldExhYmVsLCBtZXJnZSwgZXh0ZW5kLCBpc1VuZGVmaW5lZCB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEV2ZW50SGFuZGxlciBmcm9tICcuL2V2ZW50LWhhbmRsZXInO1xuaW1wb3J0IHsgQ09ORklHX0NIQU5HRSwgTE9DQUxfQ09ORklHX0tFWSB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZnVuY3Rpb24gZ2V0Q29uZmlnRnJvbVNjcmlwdCgpIHtcbiAgdmFyIHNjcmlwdCA9IGdldEN1cnJlbnRTY3JpcHQoKTtcbiAgdmFyIGNvbmZpZyA9IGdldERhdGFBdHRyaWJ1dGVzRnJvbU5vZGUoc2NyaXB0KTtcbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuZnVuY3Rpb24gZ2V0RGF0YUF0dHJpYnV0ZXNGcm9tTm9kZShub2RlKSB7XG4gIGlmICghbm9kZSkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIHZhciBkYXRhQXR0cnMgPSB7fTtcbiAgdmFyIGRhdGFSZWdleCA9IC9eZGF0YS0oW1xcdy1dKykkLztcbiAgdmFyIGF0dHJzID0gbm9kZS5hdHRyaWJ1dGVzO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgYXR0ciA9IGF0dHJzW2ldO1xuXG4gICAgaWYgKGRhdGFSZWdleC50ZXN0KGF0dHIubm9kZU5hbWUpKSB7XG4gICAgICB2YXIga2V5ID0gYXR0ci5ub2RlTmFtZS5tYXRjaChkYXRhUmVnZXgpWzFdO1xuICAgICAgdmFyIGNhbWVsQ2FzZWRrZXkgPSBrZXkuc3BsaXQoJy0nKS5tYXAoZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkge1xuICAgICAgICByZXR1cm4gaW5kZXggPiAwID8gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHJpbmcoMSkgOiB2YWx1ZTtcbiAgICAgIH0pLmpvaW4oJycpO1xuICAgICAgZGF0YUF0dHJzW2NhbWVsQ2FzZWRrZXldID0gYXR0ci52YWx1ZSB8fCBhdHRyLm5vZGVWYWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGF0YUF0dHJzO1xufVxuXG52YXIgQ29uZmlnID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBDb25maWcoKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBzZXJ2aWNlTmFtZTogJycsXG4gICAgICBzZXJ2aWNlVmVyc2lvbjogJycsXG4gICAgICBlbnZpcm9ubWVudDogJycsXG4gICAgICBzZXJ2ZXJVcmw6ICdodHRwOi8vbG9jYWxob3N0OjgyMDAnLFxuICAgICAgc2VydmVyVXJsUHJlZml4OiAnJyxcbiAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgIGluc3RydW1lbnQ6IHRydWUsXG4gICAgICBkaXNhYmxlSW5zdHJ1bWVudGF0aW9uczogW10sXG4gICAgICBsb2dMZXZlbDogJ3dhcm4nLFxuICAgICAgYnJlYWtkb3duTWV0cmljczogZmFsc2UsXG4gICAgICBpZ25vcmVUcmFuc2FjdGlvbnM6IFtdLFxuICAgICAgZXZlbnRzTGltaXQ6IDgwLFxuICAgICAgcXVldWVMaW1pdDogLTEsXG4gICAgICBmbHVzaEludGVydmFsOiA1MDAsXG4gICAgICBkaXN0cmlidXRlZFRyYWNpbmc6IHRydWUsXG4gICAgICBkaXN0cmlidXRlZFRyYWNpbmdPcmlnaW5zOiBbXSxcbiAgICAgIGRpc3RyaWJ1dGVkVHJhY2luZ0hlYWRlck5hbWU6ICd0cmFjZXBhcmVudCcsXG4gICAgICBwYWdlTG9hZFRyYWNlSWQ6ICcnLFxuICAgICAgcGFnZUxvYWRTcGFuSWQ6ICcnLFxuICAgICAgcGFnZUxvYWRTYW1wbGVkOiBmYWxzZSxcbiAgICAgIHBhZ2VMb2FkUGFyZW50SWQ6ICcnLFxuICAgICAgcGFnZUxvYWRUcmFuc2FjdGlvbk5hbWU6ICcnLFxuICAgICAgcHJvcGFnYXRlVHJhY2VzdGF0ZTogZmFsc2UsXG4gICAgICB0cmFuc2FjdGlvblNhbXBsZVJhdGU6IDEuMCxcbiAgICAgIGNlbnRyYWxDb25maWc6IGZhbHNlLFxuICAgICAgbW9uaXRvckxvbmd0YXNrczogdHJ1ZSxcbiAgICAgIGFwaVZlcnNpb246IDIsXG4gICAgICBjb250ZXh0OiB7fSxcbiAgICAgIHNlc3Npb246IGZhbHNlLFxuICAgICAgYXBtUmVxdWVzdDogbnVsbCxcbiAgICAgIHNlbmRDcmVkZW50aWFsczogZmFsc2VcbiAgICB9O1xuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50SGFuZGxlcigpO1xuICAgIHRoaXMuZmlsdGVycyA9IFtdO1xuICAgIHRoaXMudmVyc2lvbiA9ICcnO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IENvbmZpZy5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmluaXQgPSBmdW5jdGlvbiBpbml0KCkge1xuICAgIHZhciBzY3JpcHREYXRhID0gZ2V0Q29uZmlnRnJvbVNjcmlwdCgpO1xuICAgIHRoaXMuc2V0Q29uZmlnKHNjcmlwdERhdGEpO1xuICB9O1xuXG4gIF9wcm90by5zZXRWZXJzaW9uID0gZnVuY3Rpb24gc2V0VmVyc2lvbih2ZXJzaW9uKSB7XG4gICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjtcbiAgfTtcblxuICBfcHJvdG8uYWRkRmlsdGVyID0gZnVuY3Rpb24gYWRkRmlsdGVyKGNiKSB7XG4gICAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCB0byBtdXN0IGJlIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgdGhpcy5maWx0ZXJzLnB1c2goY2IpO1xuICB9O1xuXG4gIF9wcm90by5hcHBseUZpbHRlcnMgPSBmdW5jdGlvbiBhcHBseUZpbHRlcnMoZGF0YSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkYXRhID0gdGhpcy5maWx0ZXJzW2ldKGRhdGEpO1xuXG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkYXRhO1xuICB9O1xuXG4gIF9wcm90by5nZXQgPSBmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIGtleS5zcGxpdCgnLicpLnJlZHVjZShmdW5jdGlvbiAob2JqLCBvYmpLZXkpIHtcbiAgICAgIHJldHVybiBvYmogJiYgb2JqW29iaktleV07XG4gICAgfSwgdGhpcy5jb25maWcpO1xuICB9O1xuXG4gIF9wcm90by5zZXRVc2VyQ29udGV4dCA9IGZ1bmN0aW9uIHNldFVzZXJDb250ZXh0KHVzZXJDb250ZXh0KSB7XG4gICAgaWYgKHVzZXJDb250ZXh0ID09PSB2b2lkIDApIHtcbiAgICAgIHVzZXJDb250ZXh0ID0ge307XG4gICAgfVxuXG4gICAgdmFyIGNvbnRleHQgPSB7fTtcbiAgICB2YXIgX3VzZXJDb250ZXh0ID0gdXNlckNvbnRleHQsXG4gICAgICAgIGlkID0gX3VzZXJDb250ZXh0LmlkLFxuICAgICAgICB1c2VybmFtZSA9IF91c2VyQ29udGV4dC51c2VybmFtZSxcbiAgICAgICAgZW1haWwgPSBfdXNlckNvbnRleHQuZW1haWw7XG5cbiAgICBpZiAodHlwZW9mIGlkID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb250ZXh0LmlkID0gaWQ7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB1c2VybmFtZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnRleHQudXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGVtYWlsID09PSAnc3RyaW5nJykge1xuICAgICAgY29udGV4dC5lbWFpbCA9IGVtYWlsO1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlnLmNvbnRleHQudXNlciA9IGV4dGVuZCh0aGlzLmNvbmZpZy5jb250ZXh0LnVzZXIgfHwge30sIGNvbnRleHQpO1xuICB9O1xuXG4gIF9wcm90by5zZXRDdXN0b21Db250ZXh0ID0gZnVuY3Rpb24gc2V0Q3VzdG9tQ29udGV4dChjdXN0b21Db250ZXh0KSB7XG4gICAgaWYgKGN1c3RvbUNvbnRleHQgPT09IHZvaWQgMCkge1xuICAgICAgY3VzdG9tQ29udGV4dCA9IHt9O1xuICAgIH1cblxuICAgIHRoaXMuY29uZmlnLmNvbnRleHQuY3VzdG9tID0gZXh0ZW5kKHRoaXMuY29uZmlnLmNvbnRleHQuY3VzdG9tIHx8IHt9LCBjdXN0b21Db250ZXh0KTtcbiAgfTtcblxuICBfcHJvdG8uYWRkTGFiZWxzID0gZnVuY3Rpb24gYWRkTGFiZWxzKHRhZ3MpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKCF0aGlzLmNvbmZpZy5jb250ZXh0LnRhZ3MpIHtcbiAgICAgIHRoaXMuY29uZmlnLmNvbnRleHQudGFncyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGFncyk7XG4gICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICByZXR1cm4gc2V0TGFiZWwoaywgdGFnc1trXSwgX3RoaXMuY29uZmlnLmNvbnRleHQudGFncyk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLnNldENvbmZpZyA9IGZ1bmN0aW9uIHNldENvbmZpZyhwcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHByb3BlcnRpZXMgPT09IHZvaWQgMCkge1xuICAgICAgcHJvcGVydGllcyA9IHt9O1xuICAgIH1cblxuICAgIHZhciBfcHJvcGVydGllcyA9IHByb3BlcnRpZXMsXG4gICAgICAgIHRyYW5zYWN0aW9uU2FtcGxlUmF0ZSA9IF9wcm9wZXJ0aWVzLnRyYW5zYWN0aW9uU2FtcGxlUmF0ZSxcbiAgICAgICAgc2VydmVyVXJsID0gX3Byb3BlcnRpZXMuc2VydmVyVXJsO1xuXG4gICAgaWYgKHNlcnZlclVybCkge1xuICAgICAgcHJvcGVydGllcy5zZXJ2ZXJVcmwgPSBzZXJ2ZXJVcmwucmVwbGFjZSgvXFwvKyQvLCAnJyk7XG4gICAgfVxuXG4gICAgaWYgKCFpc1VuZGVmaW5lZCh0cmFuc2FjdGlvblNhbXBsZVJhdGUpKSB7XG4gICAgICBpZiAodHJhbnNhY3Rpb25TYW1wbGVSYXRlIDwgMC4wMDAxICYmIHRyYW5zYWN0aW9uU2FtcGxlUmF0ZSA+IDApIHtcbiAgICAgICAgdHJhbnNhY3Rpb25TYW1wbGVSYXRlID0gMC4wMDAxO1xuICAgICAgfVxuXG4gICAgICBwcm9wZXJ0aWVzLnRyYW5zYWN0aW9uU2FtcGxlUmF0ZSA9IE1hdGgucm91bmQodHJhbnNhY3Rpb25TYW1wbGVSYXRlICogMTAwMDApIC8gMTAwMDA7XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWcgPSBtZXJnZSh0aGlzLmNvbmZpZywgcHJvcGVydGllcyk7XG4gICAgdGhpcy5ldmVudHMuc2VuZChDT05GSUdfQ0hBTkdFLCBbdGhpcy5jb25maWddKTtcbiAgfTtcblxuICBfcHJvdG8udmFsaWRhdGUgPSBmdW5jdGlvbiB2YWxpZGF0ZShwcm9wZXJ0aWVzKSB7XG4gICAgaWYgKHByb3BlcnRpZXMgPT09IHZvaWQgMCkge1xuICAgICAgcHJvcGVydGllcyA9IHt9O1xuICAgIH1cblxuICAgIHZhciByZXF1aXJlZEtleXMgPSBbJ3NlcnZpY2VOYW1lJywgJ3NlcnZlclVybCddO1xuICAgIHZhciBhbGxLZXlzID0gT2JqZWN0LmtleXModGhpcy5jb25maWcpO1xuICAgIHZhciBlcnJvcnMgPSB7XG4gICAgICBtaXNzaW5nOiBbXSxcbiAgICAgIGludmFsaWQ6IFtdLFxuICAgICAgdW5rbm93bjogW11cbiAgICB9O1xuICAgIE9iamVjdC5rZXlzKHByb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgaWYgKHJlcXVpcmVkS2V5cy5pbmRleE9mKGtleSkgIT09IC0xICYmICFwcm9wZXJ0aWVzW2tleV0pIHtcbiAgICAgICAgZXJyb3JzLm1pc3NpbmcucHVzaChrZXkpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWxsS2V5cy5pbmRleE9mKGtleSkgPT09IC0xKSB7XG4gICAgICAgIGVycm9ycy51bmtub3duLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChwcm9wZXJ0aWVzLnNlcnZpY2VOYW1lICYmICEvXlthLXpBLVowLTkgXy1dKyQvLnRlc3QocHJvcGVydGllcy5zZXJ2aWNlTmFtZSkpIHtcbiAgICAgIGVycm9ycy5pbnZhbGlkLnB1c2goe1xuICAgICAgICBrZXk6ICdzZXJ2aWNlTmFtZScsXG4gICAgICAgIHZhbHVlOiBwcm9wZXJ0aWVzLnNlcnZpY2VOYW1lLFxuICAgICAgICBhbGxvd2VkOiAnYS16LCBBLVosIDAtOSwgXywgLSwgPHNwYWNlPidcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBzYW1wbGVSYXRlID0gcHJvcGVydGllcy50cmFuc2FjdGlvblNhbXBsZVJhdGU7XG5cbiAgICBpZiAodHlwZW9mIHNhbXBsZVJhdGUgIT09ICd1bmRlZmluZWQnICYmICh0eXBlb2Ygc2FtcGxlUmF0ZSAhPT0gJ251bWJlcicgfHwgaXNOYU4oc2FtcGxlUmF0ZSkgfHwgc2FtcGxlUmF0ZSA8IDAgfHwgc2FtcGxlUmF0ZSA+IDEpKSB7XG4gICAgICBlcnJvcnMuaW52YWxpZC5wdXNoKHtcbiAgICAgICAga2V5OiAndHJhbnNhY3Rpb25TYW1wbGVSYXRlJyxcbiAgICAgICAgdmFsdWU6IHNhbXBsZVJhdGUsXG4gICAgICAgIGFsbG93ZWQ6ICdOdW1iZXIgYmV0d2VlbiAwIGFuZCAxJ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9ycztcbiAgfTtcblxuICBfcHJvdG8uZ2V0TG9jYWxDb25maWcgPSBmdW5jdGlvbiBnZXRMb2NhbENvbmZpZygpIHtcbiAgICB2YXIgc3RvcmFnZSA9IHNlc3Npb25TdG9yYWdlO1xuXG4gICAgaWYgKHRoaXMuY29uZmlnLnNlc3Npb24pIHtcbiAgICAgIHN0b3JhZ2UgPSBsb2NhbFN0b3JhZ2U7XG4gICAgfVxuXG4gICAgdmFyIGNvbmZpZyA9IHN0b3JhZ2UuZ2V0SXRlbShMT0NBTF9DT05GSUdfS0VZKTtcblxuICAgIGlmIChjb25maWcpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGNvbmZpZyk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5zZXRMb2NhbENvbmZpZyA9IGZ1bmN0aW9uIHNldExvY2FsQ29uZmlnKGNvbmZpZywgbWVyZ2UpIHtcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICBpZiAobWVyZ2UpIHtcbiAgICAgICAgdmFyIHByZXZDb25maWcgPSB0aGlzLmdldExvY2FsQ29uZmlnKCk7XG4gICAgICAgIGNvbmZpZyA9IF9leHRlbmRzKHt9LCBwcmV2Q29uZmlnLCBjb25maWcpO1xuICAgICAgfVxuXG4gICAgICB2YXIgc3RvcmFnZSA9IHNlc3Npb25TdG9yYWdlO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcuc2Vzc2lvbikge1xuICAgICAgICBzdG9yYWdlID0gbG9jYWxTdG9yYWdlO1xuICAgICAgfVxuXG4gICAgICBzdG9yYWdlLnNldEl0ZW0oTE9DQUxfQ09ORklHX0tFWSwgSlNPTi5zdHJpbmdpZnkoY29uZmlnKSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChuYW1lLCBhcmdzKSB7XG4gICAgdGhpcy5ldmVudHMuc2VuZChuYW1lLCBhcmdzKTtcbiAgfTtcblxuICBfcHJvdG8ub2JzZXJ2ZUV2ZW50ID0gZnVuY3Rpb24gb2JzZXJ2ZUV2ZW50KG5hbWUsIGZuKSB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzLm9ic2VydmUobmFtZSwgZm4pO1xuICB9O1xuXG4gIHJldHVybiBDb25maWc7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IENvbmZpZzsiLCJ2YXIgU0NIRURVTEUgPSAnc2NoZWR1bGUnO1xudmFyIElOVk9LRSA9ICdpbnZva2UnO1xudmFyIEFERF9FVkVOVF9MSVNURU5FUl9TVFIgPSAnYWRkRXZlbnRMaXN0ZW5lcic7XG52YXIgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUiA9ICdyZW1vdmVFdmVudExpc3RlbmVyJztcbnZhciBSRVNPVVJDRV9JTklUSUFUT1JfVFlQRVMgPSBbJ2xpbmsnLCAnY3NzJywgJ3NjcmlwdCcsICdpbWcnLCAneG1saHR0cHJlcXVlc3QnLCAnZmV0Y2gnLCAnYmVhY29uJywgJ2lmcmFtZSddO1xudmFyIFJFVVNBQklMSVRZX1RIUkVTSE9MRCA9IDUwMDA7XG52YXIgTUFYX1NQQU5fRFVSQVRJT04gPSA1ICogNjAgKiAxMDAwO1xudmFyIFBBR0VfTE9BRF9ERUxBWSA9IDEwMDA7XG52YXIgUEFHRV9MT0FEID0gJ3BhZ2UtbG9hZCc7XG52YXIgUk9VVEVfQ0hBTkdFID0gJ3JvdXRlLWNoYW5nZSc7XG52YXIgVFlQRV9DVVNUT00gPSAnY3VzdG9tJztcbnZhciBVU0VSX0lOVEVSQUNUSU9OID0gJ3VzZXItaW50ZXJhY3Rpb24nO1xudmFyIEhUVFBfUkVRVUVTVF9UWVBFID0gJ2h0dHAtcmVxdWVzdCc7XG52YXIgVEVNUE9SQVJZX1RZUEUgPSAndGVtcG9yYXJ5JztcbnZhciBOQU1FX1VOS05PV04gPSAnVW5rbm93bic7XG52YXIgUEFHRV9FWElUID0gJ3BhZ2UtZXhpdCc7XG52YXIgVFJBTlNBQ1RJT05fVFlQRV9PUkRFUiA9IFtQQUdFX0xPQUQsIFJPVVRFX0NIQU5HRSwgVVNFUl9JTlRFUkFDVElPTiwgSFRUUF9SRVFVRVNUX1RZUEUsIFRZUEVfQ1VTVE9NLCBURU1QT1JBUllfVFlQRV07XG52YXIgT1VUQ09NRV9TVUNDRVNTID0gJ3N1Y2Nlc3MnO1xudmFyIE9VVENPTUVfRkFJTFVSRSA9ICdmYWlsdXJlJztcbnZhciBPVVRDT01FX1VOS05PV04gPSAndW5rbm93bic7XG52YXIgVVNFUl9USU1JTkdfVEhSRVNIT0xEID0gNjA7XG52YXIgVFJBTlNBQ1RJT05fU1RBUlQgPSAndHJhbnNhY3Rpb246c3RhcnQnO1xudmFyIFRSQU5TQUNUSU9OX0VORCA9ICd0cmFuc2FjdGlvbjplbmQnO1xudmFyIENPTkZJR19DSEFOR0UgPSAnY29uZmlnOmNoYW5nZSc7XG52YXIgUVVFVUVfRkxVU0ggPSAncXVldWU6Zmx1c2gnO1xudmFyIFFVRVVFX0FERF9UUkFOU0FDVElPTiA9ICdxdWV1ZTphZGRfdHJhbnNhY3Rpb24nO1xudmFyIFRSQU5TQUNUSU9OX0lHTk9SRSA9ICd0cmFuc2FjdGlvbjppZ25vcmUnO1xudmFyIFhNTEhUVFBSRVFVRVNUID0gJ3htbGh0dHByZXF1ZXN0JztcbnZhciBGRVRDSCA9ICdmZXRjaCc7XG52YXIgSElTVE9SWSA9ICdoaXN0b3J5JztcbnZhciBFVkVOVF9UQVJHRVQgPSAnZXZlbnR0YXJnZXQnO1xudmFyIENMSUNLID0gJ2NsaWNrJztcbnZhciBFUlJPUiA9ICdlcnJvcic7XG52YXIgQkVGT1JFX0VWRU5UID0gJzpiZWZvcmUnO1xudmFyIEFGVEVSX0VWRU5UID0gJzphZnRlcic7XG52YXIgTE9DQUxfQ09ORklHX0tFWSA9ICdlbGFzdGljX2FwbV9jb25maWcnO1xudmFyIExPTkdfVEFTSyA9ICdsb25ndGFzayc7XG52YXIgUEFJTlQgPSAncGFpbnQnO1xudmFyIE1FQVNVUkUgPSAnbWVhc3VyZSc7XG52YXIgTkFWSUdBVElPTiA9ICduYXZpZ2F0aW9uJztcbnZhciBSRVNPVVJDRSA9ICdyZXNvdXJjZSc7XG52YXIgRklSU1RfQ09OVEVOVEZVTF9QQUlOVCA9ICdmaXJzdC1jb250ZW50ZnVsLXBhaW50JztcbnZhciBMQVJHRVNUX0NPTlRFTlRGVUxfUEFJTlQgPSAnbGFyZ2VzdC1jb250ZW50ZnVsLXBhaW50JztcbnZhciBGSVJTVF9JTlBVVCA9ICdmaXJzdC1pbnB1dCc7XG52YXIgTEFZT1VUX1NISUZUID0gJ2xheW91dC1zaGlmdCc7XG52YXIgRVZFTlQgPSAnZXZlbnQnO1xudmFyIEVSUk9SUyA9ICdlcnJvcnMnO1xudmFyIFRSQU5TQUNUSU9OUyA9ICd0cmFuc2FjdGlvbnMnO1xudmFyIENPTkZJR19TRVJWSUNFID0gJ0NvbmZpZ1NlcnZpY2UnO1xudmFyIExPR0dJTkdfU0VSVklDRSA9ICdMb2dnaW5nU2VydmljZSc7XG52YXIgVFJBTlNBQ1RJT05fU0VSVklDRSA9ICdUcmFuc2FjdGlvblNlcnZpY2UnO1xudmFyIEFQTV9TRVJWRVIgPSAnQXBtU2VydmVyJztcbnZhciBQRVJGT1JNQU5DRV9NT05JVE9SSU5HID0gJ1BlcmZvcm1hbmNlTW9uaXRvcmluZyc7XG52YXIgRVJST1JfTE9HR0lORyA9ICdFcnJvckxvZ2dpbmcnO1xudmFyIFRSVU5DQVRFRF9UWVBFID0gJy50cnVuY2F0ZWQnO1xudmFyIEtFWVdPUkRfTElNSVQgPSAxMDI0O1xudmFyIFNFU1NJT05fVElNRU9VVCA9IDMwICogNjAwMDA7XG52YXIgSFRUUF9SRVFVRVNUX1RJTUVPVVQgPSAxMDAwMDtcbmV4cG9ydCB7IFNDSEVEVUxFLCBJTlZPS0UsIEFERF9FVkVOVF9MSVNURU5FUl9TVFIsIFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFIsIFJFU09VUkNFX0lOSVRJQVRPUl9UWVBFUywgUkVVU0FCSUxJVFlfVEhSRVNIT0xELCBNQVhfU1BBTl9EVVJBVElPTiwgUEFHRV9MT0FEX0RFTEFZLCBQQUdFX0xPQUQsIFJPVVRFX0NIQU5HRSwgTkFNRV9VTktOT1dOLCBQQUdFX0VYSVQsIFRZUEVfQ1VTVE9NLCBVU0VSX1RJTUlOR19USFJFU0hPTEQsIFRSQU5TQUNUSU9OX1NUQVJULCBUUkFOU0FDVElPTl9FTkQsIENPTkZJR19DSEFOR0UsIFFVRVVFX0ZMVVNILCBRVUVVRV9BRERfVFJBTlNBQ1RJT04sIFRSQU5TQUNUSU9OX0lHTk9SRSwgWE1MSFRUUFJFUVVFU1QsIEZFVENILCBISVNUT1JZLCBFVkVOVF9UQVJHRVQsIENMSUNLLCBFUlJPUiwgQkVGT1JFX0VWRU5ULCBBRlRFUl9FVkVOVCwgTE9DQUxfQ09ORklHX0tFWSwgSFRUUF9SRVFVRVNUX1RZUEUsIExPTkdfVEFTSywgUEFJTlQsIE1FQVNVUkUsIE5BVklHQVRJT04sIFJFU09VUkNFLCBGSVJTVF9DT05URU5URlVMX1BBSU5ULCBMQVJHRVNUX0NPTlRFTlRGVUxfUEFJTlQsIEtFWVdPUkRfTElNSVQsIFRFTVBPUkFSWV9UWVBFLCBVU0VSX0lOVEVSQUNUSU9OLCBUUkFOU0FDVElPTl9UWVBFX09SREVSLCBFUlJPUlMsIFRSQU5TQUNUSU9OUywgQ09ORklHX1NFUlZJQ0UsIExPR0dJTkdfU0VSVklDRSwgVFJBTlNBQ1RJT05fU0VSVklDRSwgQVBNX1NFUlZFUiwgUEVSRk9STUFOQ0VfTU9OSVRPUklORywgRVJST1JfTE9HR0lORywgVFJVTkNBVEVEX1RZUEUsIEZJUlNUX0lOUFVULCBMQVlPVVRfU0hJRlQsIEVWRU5ULCBPVVRDT01FX1NVQ0NFU1MsIE9VVENPTUVfRkFJTFVSRSwgT1VUQ09NRV9VTktOT1dOLCBTRVNTSU9OX1RJTUVPVVQsIEhUVFBfUkVRVUVTVF9USU1FT1VUIH07IiwidmFyIF9leGNsdWRlZCA9IFtcInRhZ3NcIl07XG5cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHsgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307IHZhciB0YXJnZXQgPSB7fTsgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpOyB2YXIga2V5LCBpOyBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykgeyBrZXkgPSBzb3VyY2VLZXlzW2ldOyBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlOyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IHsgVXJsIH0gZnJvbSAnLi91cmwnO1xuaW1wb3J0IHsgUEFHRV9MT0FELCBQQUdFX0VYSVQsIE5BVklHQVRJT04gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRTZXJ2ZXJUaW1pbmdJbmZvLCBQRVJGLCBpc1BlcmZUaW1lbGluZVN1cHBvcnRlZCB9IGZyb20gJy4vdXRpbHMnO1xudmFyIExFRlRfU1FVQVJFX0JSQUNLRVQgPSA5MTtcbnZhciBSSUdIVF9TUVVBUkVfQlJBQ0tFVCA9IDkzO1xudmFyIEVYVEVSTkFMID0gJ2V4dGVybmFsJztcbnZhciBSRVNPVVJDRSA9ICdyZXNvdXJjZSc7XG52YXIgSEFSRF9OQVZJR0FUSU9OID0gJ2hhcmQtbmF2aWdhdGlvbic7XG5cbmZ1bmN0aW9uIGdldFBvcnROdW1iZXIocG9ydCwgcHJvdG9jb2wpIHtcbiAgaWYgKHBvcnQgPT09ICcnKSB7XG4gICAgcG9ydCA9IHByb3RvY29sID09PSAnaHR0cDonID8gJzgwJyA6IHByb3RvY29sID09PSAnaHR0cHM6JyA/ICc0NDMnIDogJyc7XG4gIH1cblxuICByZXR1cm4gcG9ydDtcbn1cblxuZnVuY3Rpb24gZ2V0UmVzcG9uc2VDb250ZXh0KHBlcmZUaW1pbmdFbnRyeSkge1xuICB2YXIgdHJhbnNmZXJTaXplID0gcGVyZlRpbWluZ0VudHJ5LnRyYW5zZmVyU2l6ZSxcbiAgICAgIGVuY29kZWRCb2R5U2l6ZSA9IHBlcmZUaW1pbmdFbnRyeS5lbmNvZGVkQm9keVNpemUsXG4gICAgICBkZWNvZGVkQm9keVNpemUgPSBwZXJmVGltaW5nRW50cnkuZGVjb2RlZEJvZHlTaXplLFxuICAgICAgc2VydmVyVGltaW5nID0gcGVyZlRpbWluZ0VudHJ5LnNlcnZlclRpbWluZztcbiAgdmFyIHJlc3BDb250ZXh0ID0ge1xuICAgIHRyYW5zZmVyX3NpemU6IHRyYW5zZmVyU2l6ZSxcbiAgICBlbmNvZGVkX2JvZHlfc2l6ZTogZW5jb2RlZEJvZHlTaXplLFxuICAgIGRlY29kZWRfYm9keV9zaXplOiBkZWNvZGVkQm9keVNpemVcbiAgfTtcbiAgdmFyIHNlcnZlclRpbWluZ1N0ciA9IGdldFNlcnZlclRpbWluZ0luZm8oc2VydmVyVGltaW5nKTtcblxuICBpZiAoc2VydmVyVGltaW5nU3RyKSB7XG4gICAgcmVzcENvbnRleHQuaGVhZGVycyA9IHtcbiAgICAgICdzZXJ2ZXItdGltaW5nJzogc2VydmVyVGltaW5nU3RyXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiByZXNwQ29udGV4dDtcbn1cblxuZnVuY3Rpb24gZ2V0RGVzdGluYXRpb24ocGFyc2VkVXJsKSB7XG4gIHZhciBwb3J0ID0gcGFyc2VkVXJsLnBvcnQsXG4gICAgICBwcm90b2NvbCA9IHBhcnNlZFVybC5wcm90b2NvbCxcbiAgICAgIGhvc3RuYW1lID0gcGFyc2VkVXJsLmhvc3RuYW1lO1xuICB2YXIgcG9ydE51bWJlciA9IGdldFBvcnROdW1iZXIocG9ydCwgcHJvdG9jb2wpO1xuICB2YXIgaXB2Nkhvc3RuYW1lID0gaG9zdG5hbWUuY2hhckNvZGVBdCgwKSA9PT0gTEVGVF9TUVVBUkVfQlJBQ0tFVCAmJiBob3N0bmFtZS5jaGFyQ29kZUF0KGhvc3RuYW1lLmxlbmd0aCAtIDEpID09PSBSSUdIVF9TUVVBUkVfQlJBQ0tFVDtcbiAgdmFyIGFkZHJlc3MgPSBob3N0bmFtZTtcblxuICBpZiAoaXB2Nkhvc3RuYW1lKSB7XG4gICAgYWRkcmVzcyA9IGhvc3RuYW1lLnNsaWNlKDEsIC0xKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VydmljZToge1xuICAgICAgcmVzb3VyY2U6IGhvc3RuYW1lICsgJzonICsgcG9ydE51bWJlcixcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgdHlwZTogJydcbiAgICB9LFxuICAgIGFkZHJlc3M6IGFkZHJlc3MsXG4gICAgcG9ydDogTnVtYmVyKHBvcnROdW1iZXIpXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFJlc291cmNlQ29udGV4dChkYXRhKSB7XG4gIHZhciBlbnRyeSA9IGRhdGEuZW50cnksXG4gICAgICB1cmwgPSBkYXRhLnVybDtcbiAgdmFyIHBhcnNlZFVybCA9IG5ldyBVcmwodXJsKTtcbiAgdmFyIGRlc3RpbmF0aW9uID0gZ2V0RGVzdGluYXRpb24ocGFyc2VkVXJsKTtcbiAgcmV0dXJuIHtcbiAgICBodHRwOiB7XG4gICAgICB1cmw6IHVybCxcbiAgICAgIHJlc3BvbnNlOiBnZXRSZXNwb25zZUNvbnRleHQoZW50cnkpXG4gICAgfSxcbiAgICBkZXN0aW5hdGlvbjogZGVzdGluYXRpb25cbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RXh0ZXJuYWxDb250ZXh0KGRhdGEpIHtcbiAgdmFyIHVybCA9IGRhdGEudXJsLFxuICAgICAgbWV0aG9kID0gZGF0YS5tZXRob2QsXG4gICAgICB0YXJnZXQgPSBkYXRhLnRhcmdldCxcbiAgICAgIHJlc3BvbnNlID0gZGF0YS5yZXNwb25zZTtcbiAgdmFyIHBhcnNlZFVybCA9IG5ldyBVcmwodXJsKTtcbiAgdmFyIGRlc3RpbmF0aW9uID0gZ2V0RGVzdGluYXRpb24ocGFyc2VkVXJsKTtcbiAgdmFyIGNvbnRleHQgPSB7XG4gICAgaHR0cDoge1xuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICB1cmw6IHBhcnNlZFVybC5ocmVmXG4gICAgfSxcbiAgICBkZXN0aW5hdGlvbjogZGVzdGluYXRpb25cbiAgfTtcbiAgdmFyIHN0YXR1c0NvZGU7XG5cbiAgaWYgKHRhcmdldCAmJiB0eXBlb2YgdGFyZ2V0LnN0YXR1cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzdGF0dXNDb2RlID0gdGFyZ2V0LnN0YXR1cztcbiAgfSBlbHNlIGlmIChyZXNwb25zZSkge1xuICAgIHN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXM7XG4gIH1cblxuICBjb250ZXh0Lmh0dHAuc3RhdHVzX2NvZGUgPSBzdGF0dXNDb2RlO1xuICByZXR1cm4gY29udGV4dDtcbn1cblxuZnVuY3Rpb24gZ2V0TmF2aWdhdGlvbkNvbnRleHQoZGF0YSkge1xuICB2YXIgdXJsID0gZGF0YS51cmw7XG4gIHZhciBwYXJzZWRVcmwgPSBuZXcgVXJsKHVybCk7XG4gIHZhciBkZXN0aW5hdGlvbiA9IGdldERlc3RpbmF0aW9uKHBhcnNlZFVybCk7XG4gIHJldHVybiB7XG4gICAgZGVzdGluYXRpb246IGRlc3RpbmF0aW9uXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWdlQ29udGV4dCgpIHtcbiAgcmV0dXJuIHtcbiAgICBwYWdlOiB7XG4gICAgICByZWZlcmVyOiBkb2N1bWVudC5yZWZlcnJlcixcbiAgICAgIHVybDogbG9jYXRpb24uaHJlZlxuICAgIH1cbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhZGRTcGFuQ29udGV4dChzcGFuLCBkYXRhKSB7XG4gIGlmICghZGF0YSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciB0eXBlID0gc3Bhbi50eXBlO1xuICB2YXIgY29udGV4dDtcblxuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEVYVEVSTkFMOlxuICAgICAgY29udGV4dCA9IGdldEV4dGVybmFsQ29udGV4dChkYXRhKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBSRVNPVVJDRTpcbiAgICAgIGNvbnRleHQgPSBnZXRSZXNvdXJjZUNvbnRleHQoZGF0YSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgSEFSRF9OQVZJR0FUSU9OOlxuICAgICAgY29udGV4dCA9IGdldE5hdmlnYXRpb25Db250ZXh0KGRhdGEpO1xuICAgICAgYnJlYWs7XG4gIH1cblxuICBzcGFuLmFkZENvbnRleHQoY29udGV4dCk7XG59XG5leHBvcnQgZnVuY3Rpb24gYWRkVHJhbnNhY3Rpb25Db250ZXh0KHRyYW5zYWN0aW9uLCBfdGVtcCkge1xuICB2YXIgX3JlZiA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgdGFncyA9IF9yZWYudGFncyxcbiAgICAgIGNvbmZpZ0NvbnRleHQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZShfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIHZhciBwYWdlQ29udGV4dCA9IGdldFBhZ2VDb250ZXh0KCk7XG4gIHZhciByZXNwb25zZUNvbnRleHQgPSB7fTtcblxuICBpZiAodHJhbnNhY3Rpb24udHlwZSA9PT0gUEFHRV9FWElUKSB7XG4gICAgdHJhbnNhY3Rpb24uZW5zdXJlQ29udGV4dCgpO1xuXG4gICAgaWYgKHRyYW5zYWN0aW9uLmNvbnRleHQucGFnZSAmJiB0cmFuc2FjdGlvbi5jb250ZXh0LnBhZ2UudXJsKSB7XG4gICAgICBwYWdlQ29udGV4dC5wYWdlLnVybCA9IHRyYW5zYWN0aW9uLmNvbnRleHQucGFnZS51cmw7XG4gICAgfVxuICB9IGVsc2UgaWYgKHRyYW5zYWN0aW9uLnR5cGUgPT09IFBBR0VfTE9BRCAmJiBpc1BlcmZUaW1lbGluZVN1cHBvcnRlZCgpKSB7XG4gICAgdmFyIGVudHJpZXMgPSBQRVJGLmdldEVudHJpZXNCeVR5cGUoTkFWSUdBVElPTik7XG5cbiAgICBpZiAoZW50cmllcyAmJiBlbnRyaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc3BvbnNlQ29udGV4dCA9IHtcbiAgICAgICAgcmVzcG9uc2U6IGdldFJlc3BvbnNlQ29udGV4dChlbnRyaWVzWzBdKVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICB0cmFuc2FjdGlvbi5hZGRDb250ZXh0KHBhZ2VDb250ZXh0LCByZXNwb25zZUNvbnRleHQsIGNvbmZpZ0NvbnRleHQpO1xufSIsImltcG9ydCB7IEJFRk9SRV9FVkVOVCwgQUZURVJfRVZFTlQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbnZhciBFdmVudEhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEV2ZW50SGFuZGxlcigpIHtcbiAgICB0aGlzLm9ic2VydmVycyA9IHt9O1xuICB9XG5cbiAgdmFyIF9wcm90byA9IEV2ZW50SGFuZGxlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLm9ic2VydmUgPSBmdW5jdGlvbiBvYnNlcnZlKG5hbWUsIGZuKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIGlmICh0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICghdGhpcy5vYnNlcnZlcnNbbmFtZV0pIHtcbiAgICAgICAgdGhpcy5vYnNlcnZlcnNbbmFtZV0gPSBbXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5vYnNlcnZlcnNbbmFtZV0ucHVzaChmbik7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgaW5kZXggPSBfdGhpcy5vYnNlcnZlcnNbbmFtZV0uaW5kZXhPZihmbik7XG5cbiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICBfdGhpcy5vYnNlcnZlcnNbbmFtZV0uc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLnNlbmRPbmx5ID0gZnVuY3Rpb24gc2VuZE9ubHkobmFtZSwgYXJncykge1xuICAgIHZhciBvYnMgPSB0aGlzLm9ic2VydmVyc1tuYW1lXTtcblxuICAgIGlmIChvYnMpIHtcbiAgICAgIG9icy5mb3JFYWNoKGZ1bmN0aW9uIChmbikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZuLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coZXJyb3IsIGVycm9yLnN0YWNrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5zZW5kID0gZnVuY3Rpb24gc2VuZChuYW1lLCBhcmdzKSB7XG4gICAgdGhpcy5zZW5kT25seShuYW1lICsgQkVGT1JFX0VWRU5ULCBhcmdzKTtcbiAgICB0aGlzLnNlbmRPbmx5KG5hbWUsIGFyZ3MpO1xuICAgIHRoaXMuc2VuZE9ubHkobmFtZSArIEFGVEVSX0VWRU5ULCBhcmdzKTtcbiAgfTtcblxuICByZXR1cm4gRXZlbnRIYW5kbGVyO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBFdmVudEhhbmRsZXI7IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuaW1wb3J0IHsgSFRUUF9SRVFVRVNUX1RJTUVPVVQgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgaXNSZXNwb25zZVN1Y2Nlc3NmdWwgfSBmcm9tICcuL3Jlc3BvbnNlLXN0YXR1cyc7XG5leHBvcnQgdmFyIEJZVEVfTElNSVQgPSA2MCAqIDEwMDA7XG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkVXNlRmV0Y2hXaXRoS2VlcEFsaXZlKG1ldGhvZCwgcGF5bG9hZCkge1xuICBpZiAoIWlzRmV0Y2hTdXBwb3J0ZWQoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBpc0tlZXBBbGl2ZVN1cHBvcnRlZCA9ICgna2VlcGFsaXZlJyBpbiBuZXcgUmVxdWVzdCgnJykpO1xuXG4gIGlmICghaXNLZWVwQWxpdmVTdXBwb3J0ZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB2YXIgc2l6ZSA9IGNhbGN1bGF0ZVNpemUocGF5bG9hZCk7XG4gIHJldHVybiBtZXRob2QgPT09ICdQT1NUJyAmJiBzaXplIDwgQllURV9MSU1JVDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzZW5kRmV0Y2hSZXF1ZXN0KG1ldGhvZCwgdXJsLCBfcmVmKSB7XG4gIHZhciBfcmVmJGtlZXBhbGl2ZSA9IF9yZWYua2VlcGFsaXZlLFxuICAgICAga2VlcGFsaXZlID0gX3JlZiRrZWVwYWxpdmUgPT09IHZvaWQgMCA/IGZhbHNlIDogX3JlZiRrZWVwYWxpdmUsXG4gICAgICBfcmVmJHRpbWVvdXQgPSBfcmVmLnRpbWVvdXQsXG4gICAgICB0aW1lb3V0ID0gX3JlZiR0aW1lb3V0ID09PSB2b2lkIDAgPyBIVFRQX1JFUVVFU1RfVElNRU9VVCA6IF9yZWYkdGltZW91dCxcbiAgICAgIHBheWxvYWQgPSBfcmVmLnBheWxvYWQsXG4gICAgICBoZWFkZXJzID0gX3JlZi5oZWFkZXJzLFxuICAgICAgc2VuZENyZWRlbnRpYWxzID0gX3JlZi5zZW5kQ3JlZGVudGlhbHM7XG4gIHZhciB0aW1lb3V0Q29uZmlnID0ge307XG5cbiAgaWYgKHR5cGVvZiBBYm9ydENvbnRyb2xsZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICB2YXIgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aW1lb3V0Q29uZmlnLnNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfVxuXG4gIHZhciBmZXRjaFJlc3BvbnNlO1xuICByZXR1cm4gd2luZG93LmZldGNoKHVybCwgX2V4dGVuZHMoe1xuICAgIGJvZHk6IHBheWxvYWQsXG4gICAgaGVhZGVyczogaGVhZGVycyxcbiAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICBrZWVwYWxpdmU6IGtlZXBhbGl2ZSxcbiAgICBjcmVkZW50aWFsczogc2VuZENyZWRlbnRpYWxzID8gJ2luY2x1ZGUnIDogJ29taXQnXG4gIH0sIHRpbWVvdXRDb25maWcpKS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgIGZldGNoUmVzcG9uc2UgPSByZXNwb25zZTtcbiAgICByZXR1cm4gZmV0Y2hSZXNwb25zZS50ZXh0KCk7XG4gIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlVGV4dCkge1xuICAgIHZhciBib2R5UmVzcG9uc2UgPSB7XG4gICAgICB1cmw6IHVybCxcbiAgICAgIHN0YXR1czogZmV0Y2hSZXNwb25zZS5zdGF0dXMsXG4gICAgICByZXNwb25zZVRleHQ6IHJlc3BvbnNlVGV4dFxuICAgIH07XG5cbiAgICBpZiAoIWlzUmVzcG9uc2VTdWNjZXNzZnVsKGZldGNoUmVzcG9uc2Uuc3RhdHVzKSkge1xuICAgICAgdGhyb3cgYm9keVJlc3BvbnNlO1xuICAgIH1cblxuICAgIHJldHVybiBib2R5UmVzcG9uc2U7XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRmV0Y2hTdXBwb3J0ZWQoKSB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93LmZldGNoID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB3aW5kb3cuUmVxdWVzdCA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gY2FsY3VsYXRlU2l6ZShwYXlsb2FkKSB7XG4gIGlmICghcGF5bG9hZCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYgKHBheWxvYWQgaW5zdGFuY2VvZiBCbG9iKSB7XG4gICAgcmV0dXJuIHBheWxvYWQuc2l6ZTtcbiAgfVxuXG4gIHJldHVybiBuZXcgQmxvYihbcGF5bG9hZF0pLnNpemU7XG59IiwiZXhwb3J0IGZ1bmN0aW9uIGlzUmVzcG9uc2VTdWNjZXNzZnVsKHN0YXR1cykge1xuICBpZiAoc3RhdHVzID09PSAwIHx8IHN0YXR1cyA+IDM5OSAmJiBzdGF0dXMgPCA2MDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn0iLCJpbXBvcnQgeyBYSFJfSUdOT1JFIH0gZnJvbSAnLi4vcGF0Y2hpbmcvcGF0Y2gtdXRpbHMnO1xuaW1wb3J0IHsgaXNSZXNwb25zZVN1Y2Nlc3NmdWwgfSBmcm9tICcuL3Jlc3BvbnNlLXN0YXR1cyc7XG5pbXBvcnQgeyBQcm9taXNlIH0gZnJvbSAnLi4vcG9seWZpbGxzJztcbmV4cG9ydCBmdW5jdGlvbiBzZW5kWEhSKG1ldGhvZCwgdXJsLCBfcmVmKSB7XG4gIHZhciBfcmVmJHRpbWVvdXQgPSBfcmVmLnRpbWVvdXQsXG4gICAgICB0aW1lb3V0ID0gX3JlZiR0aW1lb3V0ID09PSB2b2lkIDAgPyBIVFRQX1JFUVVFU1RfVElNRU9VVCA6IF9yZWYkdGltZW91dCxcbiAgICAgIHBheWxvYWQgPSBfcmVmLnBheWxvYWQsXG4gICAgICBoZWFkZXJzID0gX3JlZi5oZWFkZXJzLFxuICAgICAgYmVmb3JlU2VuZCA9IF9yZWYuYmVmb3JlU2VuZCxcbiAgICAgIHNlbmRDcmVkZW50aWFscyA9IF9yZWYuc2VuZENyZWRlbnRpYWxzO1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciB4aHIgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgeGhyW1hIUl9JR05PUkVdID0gdHJ1ZTtcbiAgICB4aHIub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7XG4gICAgeGhyLnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSBzZW5kQ3JlZGVudGlhbHM7XG5cbiAgICBpZiAoaGVhZGVycykge1xuICAgICAgZm9yICh2YXIgaGVhZGVyIGluIGhlYWRlcnMpIHtcbiAgICAgICAgaWYgKGhlYWRlcnMuaGFzT3duUHJvcGVydHkoaGVhZGVyKSkge1xuICAgICAgICAgIHhoci5zZXRSZXF1ZXN0SGVhZGVyKGhlYWRlciwgaGVhZGVyc1toZWFkZXJdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT09IDQpIHtcbiAgICAgICAgdmFyIHN0YXR1cyA9IHhoci5zdGF0dXMsXG4gICAgICAgICAgICByZXNwb25zZVRleHQgPSB4aHIucmVzcG9uc2VUZXh0O1xuXG4gICAgICAgIGlmIChpc1Jlc3BvbnNlU3VjY2Vzc2Z1bChzdGF0dXMpKSB7XG4gICAgICAgICAgcmVzb2x2ZSh4aHIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlamVjdCh7XG4gICAgICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxuICAgICAgICAgICAgcmVzcG9uc2VUZXh0OiByZXNwb25zZVRleHRcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzdGF0dXMgPSB4aHIuc3RhdHVzLFxuICAgICAgICAgIHJlc3BvbnNlVGV4dCA9IHhoci5yZXNwb25zZVRleHQ7XG4gICAgICByZWplY3Qoe1xuICAgICAgICB1cmw6IHVybCxcbiAgICAgICAgc3RhdHVzOiBzdGF0dXMsXG4gICAgICAgIHJlc3BvbnNlVGV4dDogcmVzcG9uc2VUZXh0XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgdmFyIGNhblNlbmQgPSB0cnVlO1xuXG4gICAgaWYgKHR5cGVvZiBiZWZvcmVTZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYW5TZW5kID0gYmVmb3JlU2VuZCh7XG4gICAgICAgIHVybDogdXJsLFxuICAgICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgaGVhZGVyczogaGVhZGVycyxcbiAgICAgICAgcGF5bG9hZDogcGF5bG9hZCxcbiAgICAgICAgeGhyOiB4aHJcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjYW5TZW5kKSB7XG4gICAgICB4aHIuc2VuZChwYXlsb2FkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVqZWN0KHtcbiAgICAgICAgdXJsOiB1cmwsXG4gICAgICAgIHN0YXR1czogMCxcbiAgICAgICAgcmVzcG9uc2VUZXh0OiAnUmVxdWVzdCByZWplY3RlZCBieSB1c2VyIGNvbmZpZ3VyYXRpb24uJ1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn0iLCJpbXBvcnQgeyBYTUxIVFRQUkVRVUVTVCwgRkVUQ0gsIEhJU1RPUlksIFBBR0VfTE9BRCwgRVJST1IsIEVWRU5UX1RBUkdFVCwgQ0xJQ0sgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5zdHJ1bWVudGF0aW9uRmxhZ3MoaW5zdHJ1bWVudCwgZGlzYWJsZWRJbnN0cnVtZW50YXRpb25zKSB7XG4gIHZhciBfZmxhZ3M7XG5cbiAgdmFyIGZsYWdzID0gKF9mbGFncyA9IHt9LCBfZmxhZ3NbWE1MSFRUUFJFUVVFU1RdID0gZmFsc2UsIF9mbGFnc1tGRVRDSF0gPSBmYWxzZSwgX2ZsYWdzW0hJU1RPUlldID0gZmFsc2UsIF9mbGFnc1tQQUdFX0xPQURdID0gZmFsc2UsIF9mbGFnc1tFUlJPUl0gPSBmYWxzZSwgX2ZsYWdzW0VWRU5UX1RBUkdFVF0gPSBmYWxzZSwgX2ZsYWdzW0NMSUNLXSA9IGZhbHNlLCBfZmxhZ3MpO1xuXG4gIGlmICghaW5zdHJ1bWVudCkge1xuICAgIHJldHVybiBmbGFncztcbiAgfVxuXG4gIE9iamVjdC5rZXlzKGZsYWdzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoZGlzYWJsZWRJbnN0cnVtZW50YXRpb25zLmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgIGZsYWdzW2tleV0gPSB0cnVlO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBmbGFncztcbn0iLCJpbXBvcnQgeyBub29wIH0gZnJvbSAnLi91dGlscyc7XG5cbnZhciBMb2dnaW5nU2VydmljZSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTG9nZ2luZ1NlcnZpY2Uoc3BlYykge1xuICAgIGlmIChzcGVjID09PSB2b2lkIDApIHtcbiAgICAgIHNwZWMgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLmxldmVscyA9IFsndHJhY2UnLCAnZGVidWcnLCAnaW5mbycsICd3YXJuJywgJ2Vycm9yJ107XG4gICAgdGhpcy5sZXZlbCA9IHNwZWMubGV2ZWwgfHwgJ3dhcm4nO1xuICAgIHRoaXMucHJlZml4ID0gc3BlYy5wcmVmaXggfHwgJyc7XG4gICAgdGhpcy5yZXNldExvZ01ldGhvZHMoKTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBMb2dnaW5nU2VydmljZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLnNob3VsZExvZyA9IGZ1bmN0aW9uIHNob3VsZExvZyhsZXZlbCkge1xuICAgIHJldHVybiB0aGlzLmxldmVscy5pbmRleE9mKGxldmVsKSA+PSB0aGlzLmxldmVscy5pbmRleE9mKHRoaXMubGV2ZWwpO1xuICB9O1xuXG4gIF9wcm90by5zZXRMZXZlbCA9IGZ1bmN0aW9uIHNldExldmVsKGxldmVsKSB7XG4gICAgaWYgKGxldmVsID09PSB0aGlzLmxldmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sZXZlbCA9IGxldmVsO1xuICAgIHRoaXMucmVzZXRMb2dNZXRob2RzKCk7XG4gIH07XG5cbiAgX3Byb3RvLnJlc2V0TG9nTWV0aG9kcyA9IGZ1bmN0aW9uIHJlc2V0TG9nTWV0aG9kcygpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5sZXZlbHMuZm9yRWFjaChmdW5jdGlvbiAobGV2ZWwpIHtcbiAgICAgIF90aGlzW2xldmVsXSA9IF90aGlzLnNob3VsZExvZyhsZXZlbCkgPyBsb2cgOiBub29wO1xuXG4gICAgICBmdW5jdGlvbiBsb2coKSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkTGV2ZWwgPSBsZXZlbDtcblxuICAgICAgICBpZiAobGV2ZWwgPT09ICd0cmFjZScgfHwgbGV2ZWwgPT09ICdkZWJ1ZycpIHtcbiAgICAgICAgICBub3JtYWxpemVkTGV2ZWwgPSAnaW5mbyc7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgYXJnc1swXSA9IHRoaXMucHJlZml4ICsgYXJnc1swXTtcblxuICAgICAgICBpZiAoY29uc29sZSkge1xuICAgICAgICAgIHZhciByZWFsTWV0aG9kID0gY29uc29sZVtub3JtYWxpemVkTGV2ZWxdIHx8IGNvbnNvbGUubG9nO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiByZWFsTWV0aG9kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZWFsTWV0aG9kLmFwcGx5KGNvbnNvbGUsIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIHJldHVybiBMb2dnaW5nU2VydmljZTtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgTG9nZ2luZ1NlcnZpY2U7IiwidmFyIE5ESlNPTiA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gTkRKU09OKCkge31cblxuICBOREpTT04uc3RyaW5naWZ5ID0gZnVuY3Rpb24gc3RyaW5naWZ5KG9iamVjdCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShvYmplY3QpICsgJ1xcbic7XG4gIH07XG5cbiAgcmV0dXJuIE5ESlNPTjtcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgTkRKU09OOyIsImltcG9ydCB7IFVTRVJfSU5URVJBQ1RJT04gfSBmcm9tICcuLi9jb25zdGFudHMnO1xudmFyIElOVEVSQUNUSVZFX1NFTEVDVE9SID0gJ2FbZGF0YS10cmFuc2FjdGlvbi1uYW1lXSwgYnV0dG9uW2RhdGEtdHJhbnNhY3Rpb24tbmFtZV0nO1xuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmVQYWdlQ2xpY2tzKHRyYW5zYWN0aW9uU2VydmljZSkge1xuICB2YXIgY2xpY2tIYW5kbGVyID0gZnVuY3Rpb24gY2xpY2tIYW5kbGVyKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEVsZW1lbnQpIHtcbiAgICAgIGNyZWF0ZVVzZXJJbnRlcmFjdGlvblRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uU2VydmljZSwgZXZlbnQudGFyZ2V0KTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGV2ZW50TmFtZSA9ICdjbGljayc7XG4gIHZhciB1c2VDYXB0dXJlID0gdHJ1ZTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBjbGlja0hhbmRsZXIsIHVzZUNhcHR1cmUpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgY2xpY2tIYW5kbGVyLCB1c2VDYXB0dXJlKTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlVXNlckludGVyYWN0aW9uVHJhbnNhY3Rpb24odHJhbnNhY3Rpb25TZXJ2aWNlLCB0YXJnZXQpIHtcbiAgdmFyIF9nZXRUcmFuc2FjdGlvbk1ldGFkYSA9IGdldFRyYW5zYWN0aW9uTWV0YWRhdGEodGFyZ2V0KSxcbiAgICAgIHRyYW5zYWN0aW9uTmFtZSA9IF9nZXRUcmFuc2FjdGlvbk1ldGFkYS50cmFuc2FjdGlvbk5hbWUsXG4gICAgICBjb250ZXh0ID0gX2dldFRyYW5zYWN0aW9uTWV0YWRhLmNvbnRleHQ7XG5cbiAgdmFyIHRyID0gdHJhbnNhY3Rpb25TZXJ2aWNlLnN0YXJ0VHJhbnNhY3Rpb24oXCJDbGljayAtIFwiICsgdHJhbnNhY3Rpb25OYW1lLCBVU0VSX0lOVEVSQUNUSU9OLCB7XG4gICAgbWFuYWdlZDogdHJ1ZSxcbiAgICBjYW5SZXVzZTogdHJ1ZSxcbiAgICByZXVzZVRocmVzaG9sZDogMzAwXG4gIH0pO1xuXG4gIGlmICh0ciAmJiBjb250ZXh0KSB7XG4gICAgdHIuYWRkQ29udGV4dChjb250ZXh0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRUcmFuc2FjdGlvbk1ldGFkYXRhKHRhcmdldCkge1xuICB2YXIgbWV0YWRhdGEgPSB7XG4gICAgdHJhbnNhY3Rpb25OYW1lOiBudWxsLFxuICAgIGNvbnRleHQ6IG51bGxcbiAgfTtcbiAgbWV0YWRhdGEudHJhbnNhY3Rpb25OYW1lID0gYnVpbGRUcmFuc2FjdGlvbk5hbWUodGFyZ2V0KTtcbiAgdmFyIGNsYXNzZXMgPSB0YXJnZXQuZ2V0QXR0cmlidXRlKCdjbGFzcycpO1xuXG4gIGlmIChjbGFzc2VzKSB7XG4gICAgbWV0YWRhdGEuY29udGV4dCA9IHtcbiAgICAgIGN1c3RvbToge1xuICAgICAgICBjbGFzc2VzOiBjbGFzc2VzXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBtZXRhZGF0YTtcbn1cblxuZnVuY3Rpb24gYnVpbGRUcmFuc2FjdGlvbk5hbWUodGFyZ2V0KSB7XG4gIHZhciBkdE5hbWUgPSBmaW5kQ3VzdG9tVHJhbnNhY3Rpb25OYW1lKHRhcmdldCk7XG5cbiAgaWYgKGR0TmFtZSkge1xuICAgIHJldHVybiBkdE5hbWU7XG4gIH1cblxuICB2YXIgdGFnTmFtZSA9IHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gIHZhciBuYW1lID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gIGlmICghIW5hbWUpIHtcbiAgICByZXR1cm4gdGFnTmFtZSArIFwiW1xcXCJcIiArIG5hbWUgKyBcIlxcXCJdXCI7XG4gIH1cblxuICByZXR1cm4gdGFnTmFtZTtcbn1cblxuZnVuY3Rpb24gZmluZEN1c3RvbVRyYW5zYWN0aW9uTmFtZSh0YXJnZXQpIHtcbiAgdmFyIHRyQ3VzdG9tTmFtZUF0dHJpYnV0ZSA9ICdkYXRhLXRyYW5zYWN0aW9uLW5hbWUnO1xuICB2YXIgZmFsbGJhY2tOYW1lID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSh0ckN1c3RvbU5hbWVBdHRyaWJ1dGUpO1xuXG4gIGlmICh0YXJnZXQuY2xvc2VzdCkge1xuICAgIHZhciBlbGVtZW50ID0gdGFyZ2V0LmNsb3Nlc3QoSU5URVJBQ1RJVkVfU0VMRUNUT1IpO1xuICAgIHJldHVybiBlbGVtZW50ID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUodHJDdXN0b21OYW1lQXR0cmlidXRlKSA6IGZhbGxiYWNrTmFtZTtcbiAgfVxuXG4gIHJldHVybiBmYWxsYmFja05hbWU7XG59IiwiaW1wb3J0IHsgUVVFVUVfQUREX1RSQU5TQUNUSU9OLCBRVUVVRV9GTFVTSCwgVFJBTlNBQ1RJT05fSUdOT1JFIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IHN0YXRlIH0gZnJvbSAnLi4vLi4vc3RhdGUnO1xuaW1wb3J0IHsgbm93IH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgcmVwb3J0SW5wIH0gZnJvbSAnLi4vLi4vcGVyZm9ybWFuY2UtbW9uaXRvcmluZy9tZXRyaWNzL2lucC9yZXBvcnQnO1xuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmVQYWdlVmlzaWJpbGl0eShjb25maWdTZXJ2aWNlLCB0cmFuc2FjdGlvblNlcnZpY2UpIHtcbiAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHtcbiAgICBzdGF0ZS5sYXN0SGlkZGVuU3RhcnQgPSAwO1xuICB9XG5cbiAgdmFyIHZpc2liaWxpdHlDaGFuZ2VIYW5kbGVyID0gZnVuY3Rpb24gdmlzaWJpbGl0eUNoYW5nZUhhbmRsZXIoKSB7XG4gICAgaWYgKGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ2hpZGRlbicpIHtcbiAgICAgIG9uUGFnZUhpZGRlbihjb25maWdTZXJ2aWNlLCB0cmFuc2FjdGlvblNlcnZpY2UpO1xuICAgIH1cbiAgfTtcblxuICB2YXIgcGFnZUhpZGVIYW5kbGVyID0gZnVuY3Rpb24gcGFnZUhpZGVIYW5kbGVyKCkge1xuICAgIHJldHVybiBvblBhZ2VIaWRkZW4oY29uZmlnU2VydmljZSwgdHJhbnNhY3Rpb25TZXJ2aWNlKTtcbiAgfTtcblxuICB2YXIgdXNlQ2FwdHVyZSA9IHRydWU7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZUhhbmRsZXIsIHVzZUNhcHR1cmUpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCBwYWdlSGlkZUhhbmRsZXIsIHVzZUNhcHR1cmUpO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdmlzaWJpbGl0eUNoYW5nZUhhbmRsZXIsIHVzZUNhcHR1cmUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsIHBhZ2VIaWRlSGFuZGxlciwgdXNlQ2FwdHVyZSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIG9uUGFnZUhpZGRlbihjb25maWdTZXJ2aWNlLCB0cmFuc2FjdGlvblNlcnZpY2UpIHtcbiAgdmFyIGlucFRyID0gcmVwb3J0SW5wKHRyYW5zYWN0aW9uU2VydmljZSk7XG5cbiAgaWYgKGlucFRyKSB7XG4gICAgdmFyIHVub2JzZXJ2ZSA9IGNvbmZpZ1NlcnZpY2Uub2JzZXJ2ZUV2ZW50KFFVRVVFX0FERF9UUkFOU0FDVElPTiwgZnVuY3Rpb24gKCkge1xuICAgICAgZW5kTWFuYWdlZFRyYW5zYWN0aW9uKGNvbmZpZ1NlcnZpY2UsIHRyYW5zYWN0aW9uU2VydmljZSk7XG4gICAgICB1bm9ic2VydmUoKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBlbmRNYW5hZ2VkVHJhbnNhY3Rpb24oY29uZmlnU2VydmljZSwgdHJhbnNhY3Rpb25TZXJ2aWNlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBlbmRNYW5hZ2VkVHJhbnNhY3Rpb24oY29uZmlnU2VydmljZSwgdHJhbnNhY3Rpb25TZXJ2aWNlKSB7XG4gIHZhciB0ciA9IHRyYW5zYWN0aW9uU2VydmljZS5nZXRDdXJyZW50VHJhbnNhY3Rpb24oKTtcblxuICBpZiAodHIpIHtcbiAgICB2YXIgdW5vYnNlcnZlRGlzY2FyZCA9IGNvbmZpZ1NlcnZpY2Uub2JzZXJ2ZUV2ZW50KFRSQU5TQUNUSU9OX0lHTk9SRSwgZnVuY3Rpb24gKCkge1xuICAgICAgc3RhdGUubGFzdEhpZGRlblN0YXJ0ID0gbm93KCk7XG4gICAgICB1bm9ic2VydmVEaXNjYXJkKCk7XG4gICAgICB1bm9ic2VydmVRdWV1ZUFkZCgpO1xuICAgIH0pO1xuICAgIHZhciB1bm9ic2VydmVRdWV1ZUFkZCA9IGNvbmZpZ1NlcnZpY2Uub2JzZXJ2ZUV2ZW50KFFVRVVFX0FERF9UUkFOU0FDVElPTiwgZnVuY3Rpb24gKCkge1xuICAgICAgY29uZmlnU2VydmljZS5kaXNwYXRjaEV2ZW50KFFVRVVFX0ZMVVNIKTtcbiAgICAgIHN0YXRlLmxhc3RIaWRkZW5TdGFydCA9IG5vdygpO1xuICAgICAgdW5vYnNlcnZlUXVldWVBZGQoKTtcbiAgICAgIHVub2JzZXJ2ZURpc2NhcmQoKTtcbiAgICB9KTtcbiAgICB0ci5lbmQoKTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWdTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoUVVFVUVfRkxVU0gpO1xuICAgIHN0YXRlLmxhc3RIaWRkZW5TdGFydCA9IG5vdygpO1xuICB9XG59IiwiaW1wb3J0IHsgUHJvbWlzZSB9IGZyb20gJy4uL3BvbHlmaWxscyc7XG5pbXBvcnQgeyBnbG9iYWxTdGF0ZSB9IGZyb20gJy4vcGF0Y2gtdXRpbHMnO1xuaW1wb3J0IHsgU0NIRURVTEUsIElOVk9LRSwgRkVUQ0ggfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgc2NoZWR1bGVNaWNyb1Rhc2sgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBpc0ZldGNoU3VwcG9ydGVkIH0gZnJvbSAnLi4vaHR0cC9mZXRjaCc7XG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hGZXRjaChjYWxsYmFjaykge1xuICBpZiAoIWlzRmV0Y2hTdXBwb3J0ZWQoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNjaGVkdWxlVGFzayh0YXNrKSB7XG4gICAgdGFzay5zdGF0ZSA9IFNDSEVEVUxFO1xuICAgIGNhbGxiYWNrKFNDSEVEVUxFLCB0YXNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZVRhc2sodGFzaykge1xuICAgIHRhc2suc3RhdGUgPSBJTlZPS0U7XG4gICAgY2FsbGJhY2soSU5WT0tFLCB0YXNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGhhbmRsZVJlc3BvbnNlRXJyb3IodGFzaywgZXJyb3IpIHtcbiAgICB0YXNrLmRhdGEuYWJvcnRlZCA9IGlzQWJvcnRFcnJvcihlcnJvcik7XG4gICAgdGFzay5kYXRhLmVycm9yID0gZXJyb3I7XG4gICAgaW52b2tlVGFzayh0YXNrKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWRTdHJlYW0oc3RyZWFtLCB0YXNrKSB7XG4gICAgdmFyIHJlYWRlciA9IHN0cmVhbS5nZXRSZWFkZXIoKTtcblxuICAgIHZhciByZWFkID0gZnVuY3Rpb24gcmVhZCgpIHtcbiAgICAgIHJlYWRlci5yZWFkKCkudGhlbihmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICB2YXIgZG9uZSA9IF9yZWYuZG9uZTtcblxuICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgIGludm9rZVRhc2sodGFzayk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVhZCgpO1xuICAgICAgICB9XG4gICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgaGFuZGxlUmVzcG9uc2VFcnJvcih0YXNrLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgcmVhZCgpO1xuICB9XG5cbiAgdmFyIG5hdGl2ZUZldGNoID0gd2luZG93LmZldGNoO1xuXG4gIHdpbmRvdy5mZXRjaCA9IGZ1bmN0aW9uIChpbnB1dCwgaW5pdCkge1xuICAgIHZhciBmZXRjaFNlbGYgPSB0aGlzO1xuICAgIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICAgIHZhciByZXF1ZXN0LCB1cmw7XG4gICAgdmFyIGlzVVJMID0gaW5wdXQgaW5zdGFuY2VvZiBVUkw7XG5cbiAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpc1VSTCkge1xuICAgICAgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KGlucHV0LCBpbml0KTtcblxuICAgICAgaWYgKGlzVVJMKSB7XG4gICAgICAgIHVybCA9IHJlcXVlc3QudXJsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXJsID0gaW5wdXQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbnB1dCkge1xuICAgICAgcmVxdWVzdCA9IGlucHV0O1xuICAgICAgdXJsID0gcmVxdWVzdC51cmw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuYXRpdmVGZXRjaC5hcHBseShmZXRjaFNlbGYsIGFyZ3MpO1xuICAgIH1cblxuICAgIHZhciB0YXNrID0ge1xuICAgICAgc291cmNlOiBGRVRDSCxcbiAgICAgIHN0YXRlOiAnJyxcbiAgICAgIHR5cGU6ICdtYWNyb1Rhc2snLFxuICAgICAgZGF0YToge1xuICAgICAgICB0YXJnZXQ6IHJlcXVlc3QsXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIHVybDogdXJsLFxuICAgICAgICBhYm9ydGVkOiBmYWxzZVxuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGdsb2JhbFN0YXRlLmZldGNoSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICBzY2hlZHVsZVRhc2sodGFzayk7XG4gICAgICB2YXIgcHJvbWlzZTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgcHJvbWlzZSA9IG5hdGl2ZUZldGNoLmFwcGx5KGZldGNoU2VsZiwgW3JlcXVlc3RdKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIHRhc2suZGF0YS5lcnJvciA9IGVycm9yO1xuICAgICAgICBpbnZva2VUYXNrKHRhc2spO1xuICAgICAgICBnbG9iYWxTdGF0ZS5mZXRjaEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwcm9taXNlLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgIHZhciBjbG9uZWRSZXNwb25zZSA9IHJlc3BvbnNlLmNsb25lID8gcmVzcG9uc2UuY2xvbmUoKSA6IHt9O1xuICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHRhc2suZGF0YS5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgICAgICAgIHZhciBib2R5ID0gY2xvbmVkUmVzcG9uc2UuYm9keTtcblxuICAgICAgICAgIGlmIChib2R5KSB7XG4gICAgICAgICAgICByZWFkU3RyZWFtKGJvZHksIHRhc2spO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnZva2VUYXNrKHRhc2spO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGhhbmRsZVJlc3BvbnNlRXJyb3IodGFzaywgZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgZ2xvYmFsU3RhdGUuZmV0Y2hJblByb2dyZXNzID0gZmFsc2U7XG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGlzQWJvcnRFcnJvcihlcnJvcikge1xuICByZXR1cm4gZXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gJ0Fib3J0RXJyb3InO1xufSIsImltcG9ydCB7IElOVk9LRSwgSElTVE9SWSB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hIaXN0b3J5KGNhbGxiYWNrKSB7XG4gIGlmICghd2luZG93Lmhpc3RvcnkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgbmF0aXZlUHVzaFN0YXRlID0gaGlzdG9yeS5wdXNoU3RhdGU7XG5cbiAgaWYgKHR5cGVvZiBuYXRpdmVQdXNoU3RhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBoaXN0b3J5LnB1c2hTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSwgdGl0bGUsIHVybCkge1xuICAgICAgdmFyIHRhc2sgPSB7XG4gICAgICAgIHNvdXJjZTogSElTVE9SWSxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgdXJsOiB1cmxcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGNhbGxiYWNrKElOVk9LRSwgdGFzayk7XG4gICAgICBuYXRpdmVQdXNoU3RhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG59IiwiaW1wb3J0IHsgcGF0Y2hYTUxIdHRwUmVxdWVzdCB9IGZyb20gJy4veGhyLXBhdGNoJztcbmltcG9ydCB7IHBhdGNoRmV0Y2ggfSBmcm9tICcuL2ZldGNoLXBhdGNoJztcbmltcG9ydCB7IHBhdGNoSGlzdG9yeSB9IGZyb20gJy4vaGlzdG9yeS1wYXRjaCc7XG5pbXBvcnQgRXZlbnRIYW5kbGVyIGZyb20gJy4uL2V2ZW50LWhhbmRsZXInO1xuaW1wb3J0IHsgSElTVE9SWSwgRkVUQ0gsIFhNTEhUVFBSRVFVRVNUIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbnZhciBwYXRjaEV2ZW50SGFuZGxlciA9IG5ldyBFdmVudEhhbmRsZXIoKTtcbnZhciBhbHJlYWR5UGF0Y2hlZCA9IGZhbHNlO1xuXG5mdW5jdGlvbiBwYXRjaEFsbCgpIHtcbiAgaWYgKCFhbHJlYWR5UGF0Y2hlZCkge1xuICAgIGFscmVhZHlQYXRjaGVkID0gdHJ1ZTtcbiAgICBwYXRjaFhNTEh0dHBSZXF1ZXN0KGZ1bmN0aW9uIChldmVudCwgdGFzaykge1xuICAgICAgcGF0Y2hFdmVudEhhbmRsZXIuc2VuZChYTUxIVFRQUkVRVUVTVCwgW2V2ZW50LCB0YXNrXSk7XG4gICAgfSk7XG4gICAgcGF0Y2hGZXRjaChmdW5jdGlvbiAoZXZlbnQsIHRhc2spIHtcbiAgICAgIHBhdGNoRXZlbnRIYW5kbGVyLnNlbmQoRkVUQ0gsIFtldmVudCwgdGFza10pO1xuICAgIH0pO1xuICAgIHBhdGNoSGlzdG9yeShmdW5jdGlvbiAoZXZlbnQsIHRhc2spIHtcbiAgICAgIHBhdGNoRXZlbnRIYW5kbGVyLnNlbmQoSElTVE9SWSwgW2V2ZW50LCB0YXNrXSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcGF0Y2hFdmVudEhhbmRsZXI7XG59XG5cbmV4cG9ydCB7IHBhdGNoQWxsLCBwYXRjaEV2ZW50SGFuZGxlciB9OyIsImV4cG9ydCB2YXIgZ2xvYmFsU3RhdGUgPSB7XG4gIGZldGNoSW5Qcm9ncmVzczogZmFsc2Vcbn07XG5leHBvcnQgZnVuY3Rpb24gYXBtU3ltYm9sKG5hbWUpIHtcbiAgcmV0dXJuICdfX2FwbV9zeW1ib2xfXycgKyBuYW1lO1xufVxuXG5mdW5jdGlvbiBpc1Byb3BlcnR5V3JpdGFibGUocHJvcGVydHlEZXNjKSB7XG4gIGlmICghcHJvcGVydHlEZXNjKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAocHJvcGVydHlEZXNjLndyaXRhYmxlID09PSBmYWxzZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAhKHR5cGVvZiBwcm9wZXJ0eURlc2MuZ2V0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwcm9wZXJ0eURlc2Muc2V0ID09PSAndW5kZWZpbmVkJyk7XG59XG5cbmZ1bmN0aW9uIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwYXRjaGVkLCBvcmlnaW5hbCkge1xuICBwYXRjaGVkW2FwbVN5bWJvbCgnT3JpZ2luYWxEZWxlZ2F0ZScpXSA9IG9yaWdpbmFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hNZXRob2QodGFyZ2V0LCBuYW1lLCBwYXRjaEZuKSB7XG4gIHZhciBwcm90byA9IHRhcmdldDtcblxuICB3aGlsZSAocHJvdG8gJiYgIXByb3RvLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG5cbiAgaWYgKCFwcm90byAmJiB0YXJnZXRbbmFtZV0pIHtcbiAgICBwcm90byA9IHRhcmdldDtcbiAgfVxuXG4gIHZhciBkZWxlZ2F0ZU5hbWUgPSBhcG1TeW1ib2wobmFtZSk7XG4gIHZhciBkZWxlZ2F0ZTtcblxuICBpZiAocHJvdG8gJiYgIShkZWxlZ2F0ZSA9IHByb3RvW2RlbGVnYXRlTmFtZV0pKSB7XG4gICAgZGVsZWdhdGUgPSBwcm90b1tkZWxlZ2F0ZU5hbWVdID0gcHJvdG9bbmFtZV07XG4gICAgdmFyIGRlc2MgPSBwcm90byAmJiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBuYW1lKTtcblxuICAgIGlmIChpc1Byb3BlcnR5V3JpdGFibGUoZGVzYykpIHtcbiAgICAgIHZhciBwYXRjaERlbGVnYXRlID0gcGF0Y2hGbihkZWxlZ2F0ZSwgZGVsZWdhdGVOYW1lLCBuYW1lKTtcblxuICAgICAgcHJvdG9bbmFtZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBwYXRjaERlbGVnYXRlKHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuXG4gICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bbmFtZV0sIGRlbGVnYXRlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZGVsZWdhdGU7XG59XG5leHBvcnQgdmFyIFhIUl9JR05PUkUgPSBhcG1TeW1ib2woJ3hocklnbm9yZScpO1xuZXhwb3J0IHZhciBYSFJfU1lOQyA9IGFwbVN5bWJvbCgneGhyU3luYycpO1xuZXhwb3J0IHZhciBYSFJfVVJMID0gYXBtU3ltYm9sKCd4aHJVUkwnKTtcbmV4cG9ydCB2YXIgWEhSX01FVEhPRCA9IGFwbVN5bWJvbCgneGhyTWV0aG9kJyk7IiwiaW1wb3J0IHsgcGF0Y2hNZXRob2QsIFhIUl9TWU5DLCBYSFJfVVJMLCBYSFJfTUVUSE9ELCBYSFJfSUdOT1JFIH0gZnJvbSAnLi9wYXRjaC11dGlscyc7XG5pbXBvcnQgeyBTQ0hFRFVMRSwgSU5WT0tFLCBYTUxIVFRQUkVRVUVTVCwgQUREX0VWRU5UX0xJU1RFTkVSX1NUUiB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hYTUxIdHRwUmVxdWVzdChjYWxsYmFjaykge1xuICB2YXIgWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUgPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGU7XG5cbiAgaWYgKCFYTUxIdHRwUmVxdWVzdFByb3RvdHlwZSB8fCAhWE1MSHR0cFJlcXVlc3RQcm90b3R5cGVbQUREX0VWRU5UX0xJU1RFTkVSX1NUUl0pIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgUkVBRFlfU1RBVEVfQ0hBTkdFID0gJ3JlYWR5c3RhdGVjaGFuZ2UnO1xuICB2YXIgTE9BRCA9ICdsb2FkJztcbiAgdmFyIEVSUk9SID0gJ2Vycm9yJztcbiAgdmFyIFRJTUVPVVQgPSAndGltZW91dCc7XG4gIHZhciBBQk9SVCA9ICdhYm9ydCc7XG5cbiAgZnVuY3Rpb24gaW52b2tlVGFzayh0YXNrLCBzdGF0dXMpIHtcbiAgICBpZiAodGFzay5zdGF0ZSAhPT0gSU5WT0tFKSB7XG4gICAgICB0YXNrLnN0YXRlID0gSU5WT0tFO1xuICAgICAgdGFzay5kYXRhLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgIGNhbGxiYWNrKElOVk9LRSwgdGFzayk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gc2NoZWR1bGVUYXNrKHRhc2spIHtcbiAgICBpZiAodGFzay5zdGF0ZSA9PT0gU0NIRURVTEUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0YXNrLnN0YXRlID0gU0NIRURVTEU7XG4gICAgY2FsbGJhY2soU0NIRURVTEUsIHRhc2spO1xuICAgIHZhciB0YXJnZXQgPSB0YXNrLmRhdGEudGFyZ2V0O1xuXG4gICAgZnVuY3Rpb24gYWRkTGlzdGVuZXIobmFtZSkge1xuICAgICAgdGFyZ2V0W0FERF9FVkVOVF9MSVNURU5FUl9TVFJdKG5hbWUsIGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciB0eXBlID0gX3JlZi50eXBlO1xuXG4gICAgICAgIGlmICh0eXBlID09PSBSRUFEWV9TVEFURV9DSEFOR0UpIHtcbiAgICAgICAgICBpZiAodGFyZ2V0LnJlYWR5U3RhdGUgPT09IDQgJiYgdGFyZ2V0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgICAgaW52b2tlVGFzayh0YXNrLCAnc3VjY2VzcycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgc3RhdHVzID0gdHlwZSA9PT0gTE9BRCA/ICdzdWNjZXNzJyA6IHR5cGU7XG4gICAgICAgICAgaW52b2tlVGFzayh0YXNrLCBzdGF0dXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBhZGRMaXN0ZW5lcihSRUFEWV9TVEFURV9DSEFOR0UpO1xuICAgIGFkZExpc3RlbmVyKExPQUQpO1xuICAgIGFkZExpc3RlbmVyKFRJTUVPVVQpO1xuICAgIGFkZExpc3RlbmVyKEVSUk9SKTtcbiAgICBhZGRMaXN0ZW5lcihBQk9SVCk7XG4gIH1cblxuICB2YXIgb3Blbk5hdGl2ZSA9IHBhdGNoTWV0aG9kKFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlLCAnb3BlbicsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgIGlmICghc2VsZltYSFJfSUdOT1JFXSkge1xuICAgICAgICBzZWxmW1hIUl9NRVRIT0RdID0gYXJnc1swXTtcbiAgICAgICAgc2VsZltYSFJfVVJMXSA9IGFyZ3NbMV07XG4gICAgICAgIHNlbGZbWEhSX1NZTkNdID0gYXJnc1syXSA9PT0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvcGVuTmF0aXZlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH07XG4gIH0pO1xuICB2YXIgc2VuZE5hdGl2ZSA9IHBhdGNoTWV0aG9kKFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlLCAnc2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHtcbiAgICAgIGlmIChzZWxmW1hIUl9JR05PUkVdKSB7XG4gICAgICAgIHJldHVybiBzZW5kTmF0aXZlLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgICAgfVxuXG4gICAgICB2YXIgdGFzayA9IHtcbiAgICAgICAgc291cmNlOiBYTUxIVFRQUkVRVUVTVCxcbiAgICAgICAgc3RhdGU6ICcnLFxuICAgICAgICB0eXBlOiAnbWFjcm9UYXNrJyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHRhcmdldDogc2VsZixcbiAgICAgICAgICBtZXRob2Q6IHNlbGZbWEhSX01FVEhPRF0sXG4gICAgICAgICAgc3luYzogc2VsZltYSFJfU1lOQ10sXG4gICAgICAgICAgdXJsOiBzZWxmW1hIUl9VUkxdLFxuICAgICAgICAgIHN0YXR1czogJydcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgc2NoZWR1bGVUYXNrKHRhc2spO1xuICAgICAgICByZXR1cm4gc2VuZE5hdGl2ZS5hcHBseShzZWxmLCBhcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaW52b2tlVGFzayh0YXNrLCBFUlJPUik7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG59IiwiaW1wb3J0IFByb21pc2VQb2xseWZpbGwgZnJvbSAncHJvbWlzZS1wb2x5ZmlsbCc7XG5pbXBvcnQgeyBpc0Jyb3dzZXIgfSBmcm9tICcuL3V0aWxzJztcbnZhciBsb2NhbCA9IHt9O1xuXG5pZiAoaXNCcm93c2VyKSB7XG4gIGxvY2FsID0gd2luZG93O1xufSBlbHNlIGlmICh0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgbG9jYWwgPSBzZWxmO1xufVxuXG52YXIgUHJvbWlzZSA9ICdQcm9taXNlJyBpbiBsb2NhbCA/IGxvY2FsLlByb21pc2UgOiBQcm9taXNlUG9sbHlmaWxsO1xuZXhwb3J0IHsgUHJvbWlzZSB9OyIsInZhciBRdWV1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUXVldWUob25GbHVzaCwgb3B0cykge1xuICAgIGlmIChvcHRzID09PSB2b2lkIDApIHtcbiAgICAgIG9wdHMgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLm9uRmx1c2ggPSBvbkZsdXNoO1xuICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICB0aGlzLnF1ZXVlTGltaXQgPSBvcHRzLnF1ZXVlTGltaXQgfHwgLTE7XG4gICAgdGhpcy5mbHVzaEludGVydmFsID0gb3B0cy5mbHVzaEludGVydmFsIHx8IDA7XG4gICAgdGhpcy50aW1lb3V0SWQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gUXVldWUucHJvdG90eXBlO1xuXG4gIF9wcm90by5fc2V0VGltZXIgPSBmdW5jdGlvbiBfc2V0VGltZXIoKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHRoaXMudGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuZmx1c2goKTtcbiAgICB9LCB0aGlzLmZsdXNoSW50ZXJ2YWwpO1xuICB9O1xuXG4gIF9wcm90by5fY2xlYXIgPSBmdW5jdGlvbiBfY2xlYXIoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLnRpbWVvdXRJZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCk7XG4gICAgICB0aGlzLnRpbWVvdXRJZCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLml0ZW1zID0gW107XG4gIH07XG5cbiAgX3Byb3RvLmZsdXNoID0gZnVuY3Rpb24gZmx1c2goKSB7XG4gICAgdGhpcy5vbkZsdXNoKHRoaXMuaXRlbXMpO1xuXG4gICAgdGhpcy5fY2xlYXIoKTtcbiAgfTtcblxuICBfcHJvdG8uYWRkID0gZnVuY3Rpb24gYWRkKGl0ZW0pIHtcbiAgICB0aGlzLml0ZW1zLnB1c2goaXRlbSk7XG5cbiAgICBpZiAodGhpcy5xdWV1ZUxpbWl0ICE9PSAtMSAmJiB0aGlzLml0ZW1zLmxlbmd0aCA+PSB0aGlzLnF1ZXVlTGltaXQpIHtcbiAgICAgIHRoaXMuZmx1c2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLnRpbWVvdXRJZCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5fc2V0VGltZXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFF1ZXVlO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBRdWV1ZTsiLCJ2YXIgX3NlcnZpY2VDcmVhdG9ycztcblxuaW1wb3J0IEFwbVNlcnZlciBmcm9tICcuL2FwbS1zZXJ2ZXInO1xuaW1wb3J0IENvbmZpZ1NlcnZpY2UgZnJvbSAnLi9jb25maWctc2VydmljZSc7XG5pbXBvcnQgTG9nZ2luZ1NlcnZpY2UgZnJvbSAnLi9sb2dnaW5nLXNlcnZpY2UnO1xuaW1wb3J0IHsgQ09ORklHX0NIQU5HRSwgQ09ORklHX1NFUlZJQ0UsIExPR0dJTkdfU0VSVklDRSwgQVBNX1NFUlZFUiB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IF9fREVWX18gfSBmcm9tICcuLi9zdGF0ZSc7XG52YXIgc2VydmljZUNyZWF0b3JzID0gKF9zZXJ2aWNlQ3JlYXRvcnMgPSB7fSwgX3NlcnZpY2VDcmVhdG9yc1tDT05GSUdfU0VSVklDRV0gPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgQ29uZmlnU2VydmljZSgpO1xufSwgX3NlcnZpY2VDcmVhdG9yc1tMT0dHSU5HX1NFUlZJQ0VdID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gbmV3IExvZ2dpbmdTZXJ2aWNlKHtcbiAgICBwcmVmaXg6ICdbRWxhc3RpYyBBUE1dICdcbiAgfSk7XG59LCBfc2VydmljZUNyZWF0b3JzW0FQTV9TRVJWRVJdID0gZnVuY3Rpb24gKGZhY3RvcnkpIHtcbiAgdmFyIF9mYWN0b3J5JGdldFNlcnZpY2UgPSBmYWN0b3J5LmdldFNlcnZpY2UoW0NPTkZJR19TRVJWSUNFLCBMT0dHSU5HX1NFUlZJQ0VdKSxcbiAgICAgIGNvbmZpZ1NlcnZpY2UgPSBfZmFjdG9yeSRnZXRTZXJ2aWNlWzBdLFxuICAgICAgbG9nZ2luZ1NlcnZpY2UgPSBfZmFjdG9yeSRnZXRTZXJ2aWNlWzFdO1xuXG4gIHJldHVybiBuZXcgQXBtU2VydmVyKGNvbmZpZ1NlcnZpY2UsIGxvZ2dpbmdTZXJ2aWNlKTtcbn0sIF9zZXJ2aWNlQ3JlYXRvcnMpO1xuXG52YXIgU2VydmljZUZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNlcnZpY2VGYWN0b3J5KCkge1xuICAgIHRoaXMuaW5zdGFuY2VzID0ge307XG4gICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFNlcnZpY2VGYWN0b3J5LnByb3RvdHlwZTtcblxuICBfcHJvdG8uaW5pdCA9IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB2YXIgY29uZmlnU2VydmljZSA9IHRoaXMuZ2V0U2VydmljZShDT05GSUdfU0VSVklDRSk7XG4gICAgY29uZmlnU2VydmljZS5pbml0KCk7XG5cbiAgICB2YXIgX3RoaXMkZ2V0U2VydmljZSA9IHRoaXMuZ2V0U2VydmljZShbTE9HR0lOR19TRVJWSUNFLCBBUE1fU0VSVkVSXSksXG4gICAgICAgIGxvZ2dpbmdTZXJ2aWNlID0gX3RoaXMkZ2V0U2VydmljZVswXSxcbiAgICAgICAgYXBtU2VydmVyID0gX3RoaXMkZ2V0U2VydmljZVsxXTtcblxuICAgIGNvbmZpZ1NlcnZpY2UuZXZlbnRzLm9ic2VydmUoQ09ORklHX0NIQU5HRSwgZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIGxvZ0xldmVsID0gY29uZmlnU2VydmljZS5nZXQoJ2xvZ0xldmVsJyk7XG4gICAgICBsb2dnaW5nU2VydmljZS5zZXRMZXZlbChsb2dMZXZlbCk7XG4gICAgfSk7XG4gICAgYXBtU2VydmVyLmluaXQoKTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0U2VydmljZSA9IGZ1bmN0aW9uIGdldFNlcnZpY2UobmFtZSkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBpZiAodHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpZiAoIXRoaXMuaW5zdGFuY2VzW25hbWVdKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2VydmljZUNyZWF0b3JzW25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhpcy5pbnN0YW5jZXNbbmFtZV0gPSBzZXJ2aWNlQ3JlYXRvcnNbbmFtZV0odGhpcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoX19ERVZfXykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdDYW5ub3QgZ2V0IHNlcnZpY2UsIE5vIGNyZWF0b3IgZm9yOiAnICsgbmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2VzW25hbWVdO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShuYW1lKSkge1xuICAgICAgcmV0dXJuIG5hbWUubWFwKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5nZXRTZXJ2aWNlKG4pO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBTZXJ2aWNlRmFjdG9yeTtcbn0oKTtcblxuZXhwb3J0IHsgc2VydmljZUNyZWF0b3JzLCBTZXJ2aWNlRmFjdG9yeSB9OyIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHRocm90dGxlKGZuLCBvblRocm90dGxlLCBvcHRzKSB7XG4gIHZhciBjb250ZXh0ID0gdGhpcztcbiAgdmFyIGxpbWl0ID0gb3B0cy5saW1pdDtcbiAgdmFyIGludGVydmFsID0gb3B0cy5pbnRlcnZhbDtcbiAgdmFyIGNvdW50ZXIgPSAwO1xuICB2YXIgdGltZW91dElkO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGNvdW50ZXIrKztcblxuICAgIGlmICh0eXBlb2YgdGltZW91dElkID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNvdW50ZXIgPSAwO1xuICAgICAgICB0aW1lb3V0SWQgPSB1bmRlZmluZWQ7XG4gICAgICB9LCBpbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgaWYgKGNvdW50ZXIgPiBsaW1pdCAmJiB0eXBlb2Ygb25UaHJvdHRsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIG9uVGhyb3R0bGUuYXBwbHkoY29udGV4dCwgYXJndW1lbnRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9O1xufSIsImltcG9ydCB7IEtFWVdPUkRfTElNSVQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG52YXIgTUVUQURBVEFfTU9ERUwgPSB7XG4gIHNlcnZpY2U6IHtcbiAgICBuYW1lOiBbS0VZV09SRF9MSU1JVCwgdHJ1ZV0sXG4gICAgdmVyc2lvbjogdHJ1ZSxcbiAgICBhZ2VudDoge1xuICAgICAgdmVyc2lvbjogW0tFWVdPUkRfTElNSVQsIHRydWVdXG4gICAgfSxcbiAgICBlbnZpcm9ubWVudDogdHJ1ZVxuICB9LFxuICBsYWJlbHM6IHtcbiAgICAnKic6IHRydWVcbiAgfVxufTtcbnZhciBSRVNQT05TRV9NT0RFTCA9IHtcbiAgJyonOiB0cnVlLFxuICBoZWFkZXJzOiB7XG4gICAgJyonOiB0cnVlXG4gIH1cbn07XG52YXIgREVTVElOQVRJT05fTU9ERUwgPSB7XG4gIGFkZHJlc3M6IFtLRVlXT1JEX0xJTUlUXSxcbiAgc2VydmljZToge1xuICAgICcqJzogW0tFWVdPUkRfTElNSVQsIHRydWVdXG4gIH1cbn07XG52YXIgQ09OVEVYVF9NT0RFTCA9IHtcbiAgdXNlcjoge1xuICAgIGlkOiB0cnVlLFxuICAgIGVtYWlsOiB0cnVlLFxuICAgIHVzZXJuYW1lOiB0cnVlXG4gIH0sXG4gIHRhZ3M6IHtcbiAgICAnKic6IHRydWVcbiAgfSxcbiAgaHR0cDoge1xuICAgIHJlc3BvbnNlOiBSRVNQT05TRV9NT0RFTFxuICB9LFxuICBkZXN0aW5hdGlvbjogREVTVElOQVRJT05fTU9ERUwsXG4gIHJlc3BvbnNlOiBSRVNQT05TRV9NT0RFTFxufTtcbnZhciBTUEFOX01PREVMID0ge1xuICBuYW1lOiBbS0VZV09SRF9MSU1JVCwgdHJ1ZV0sXG4gIHR5cGU6IFtLRVlXT1JEX0xJTUlULCB0cnVlXSxcbiAgaWQ6IFtLRVlXT1JEX0xJTUlULCB0cnVlXSxcbiAgdHJhY2VfaWQ6IFtLRVlXT1JEX0xJTUlULCB0cnVlXSxcbiAgcGFyZW50X2lkOiBbS0VZV09SRF9MSU1JVCwgdHJ1ZV0sXG4gIHRyYW5zYWN0aW9uX2lkOiBbS0VZV09SRF9MSU1JVCwgdHJ1ZV0sXG4gIHN1YnR5cGU6IHRydWUsXG4gIGFjdGlvbjogdHJ1ZSxcbiAgY29udGV4dDogQ09OVEVYVF9NT0RFTFxufTtcbnZhciBUUkFOU0FDVElPTl9NT0RFTCA9IHtcbiAgbmFtZTogdHJ1ZSxcbiAgcGFyZW50X2lkOiB0cnVlLFxuICB0eXBlOiBbS0VZV09SRF9MSU1JVCwgdHJ1ZV0sXG4gIGlkOiBbS0VZV09SRF9MSU1JVCwgdHJ1ZV0sXG4gIHRyYWNlX2lkOiBbS0VZV09SRF9MSU1JVCwgdHJ1ZV0sXG4gIHNwYW5fY291bnQ6IHtcbiAgICBzdGFydGVkOiBbS0VZV09SRF9MSU1JVCwgdHJ1ZV1cbiAgfSxcbiAgY29udGV4dDogQ09OVEVYVF9NT0RFTFxufTtcbnZhciBFUlJPUl9NT0RFTCA9IHtcbiAgaWQ6IFtLRVlXT1JEX0xJTUlULCB0cnVlXSxcbiAgdHJhY2VfaWQ6IHRydWUsXG4gIHRyYW5zYWN0aW9uX2lkOiB0cnVlLFxuICBwYXJlbnRfaWQ6IHRydWUsXG4gIGN1bHByaXQ6IHRydWUsXG4gIGV4Y2VwdGlvbjoge1xuICAgIHR5cGU6IHRydWVcbiAgfSxcbiAgdHJhbnNhY3Rpb246IHtcbiAgICB0eXBlOiB0cnVlXG4gIH0sXG4gIGNvbnRleHQ6IENPTlRFWFRfTU9ERUxcbn07XG5cbmZ1bmN0aW9uIHRydW5jYXRlKHZhbHVlLCBsaW1pdCwgcmVxdWlyZWQsIHBsYWNlaG9sZGVyKSB7XG4gIGlmIChsaW1pdCA9PT0gdm9pZCAwKSB7XG4gICAgbGltaXQgPSBLRVlXT1JEX0xJTUlUO1xuICB9XG5cbiAgaWYgKHJlcXVpcmVkID09PSB2b2lkIDApIHtcbiAgICByZXF1aXJlZCA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKHBsYWNlaG9sZGVyID09PSB2b2lkIDApIHtcbiAgICBwbGFjZWhvbGRlciA9ICdOL0EnO1xuICB9XG5cbiAgaWYgKHJlcXVpcmVkICYmIGlzRW1wdHkodmFsdWUpKSB7XG4gICAgdmFsdWUgPSBwbGFjZWhvbGRlcjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlLnN1YnN0cmluZygwLCBsaW1pdCk7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUgPT09ICcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VWYWx1ZSh0YXJnZXQsIGtleSwgY3Vyck1vZGVsKSB7XG4gIHZhciB2YWx1ZSA9IHRydW5jYXRlKHRhcmdldFtrZXldLCBjdXJyTW9kZWxbMF0sIGN1cnJNb2RlbFsxXSk7XG5cbiAgaWYgKGlzRW1wdHkodmFsdWUpKSB7XG4gICAgZGVsZXRlIHRhcmdldFtrZXldO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRhcmdldFtrZXldID0gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRydW5jYXRlTW9kZWwobW9kZWwsIHRhcmdldCwgY2hpbGRUYXJnZXQpIHtcbiAgaWYgKG1vZGVsID09PSB2b2lkIDApIHtcbiAgICBtb2RlbCA9IHt9O1xuICB9XG5cbiAgaWYgKGNoaWxkVGFyZ2V0ID09PSB2b2lkIDApIHtcbiAgICBjaGlsZFRhcmdldCA9IHRhcmdldDtcbiAgfVxuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMobW9kZWwpO1xuICB2YXIgZW1wdHlBcnIgPSBbXTtcblxuICB2YXIgX2xvb3AgPSBmdW5jdGlvbiBfbG9vcChpKSB7XG4gICAgdmFyIGN1cnJLZXkgPSBrZXlzW2ldO1xuICAgIHZhciBjdXJyTW9kZWwgPSBtb2RlbFtjdXJyS2V5XSA9PT0gdHJ1ZSA/IGVtcHR5QXJyIDogbW9kZWxbY3VycktleV07XG5cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY3Vyck1vZGVsKSkge1xuICAgICAgdHJ1bmNhdGVNb2RlbChjdXJyTW9kZWwsIHRhcmdldCwgY2hpbGRUYXJnZXRbY3VycktleV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY3VycktleSA9PT0gJyonKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGNoaWxkVGFyZ2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICByZXR1cm4gcmVwbGFjZVZhbHVlKGNoaWxkVGFyZ2V0LCBrZXksIGN1cnJNb2RlbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVwbGFjZVZhbHVlKGNoaWxkVGFyZ2V0LCBjdXJyS2V5LCBjdXJyTW9kZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcbiAgICBfbG9vcChpKTtcbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbmV4cG9ydCB7IHRydW5jYXRlLCB0cnVuY2F0ZU1vZGVsLCBTUEFOX01PREVMLCBUUkFOU0FDVElPTl9NT0RFTCwgRVJST1JfTU9ERUwsIE1FVEFEQVRBX01PREVMLCBSRVNQT05TRV9NT0RFTCB9OyIsImltcG9ydCB7IGlzQnJvd3NlciB9IGZyb20gJy4vdXRpbHMnO1xuXG5mdW5jdGlvbiBpc0RlZmF1bHRQb3J0KHBvcnQsIHByb3RvY29sKSB7XG4gIHN3aXRjaCAocHJvdG9jb2wpIHtcbiAgICBjYXNlICdodHRwOic6XG4gICAgICByZXR1cm4gcG9ydCA9PT0gJzgwJztcblxuICAgIGNhc2UgJ2h0dHBzOic6XG4gICAgICByZXR1cm4gcG9ydCA9PT0gJzQ0Myc7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxudmFyIFJVTEVTID0gW1snIycsICdoYXNoJ10sIFsnPycsICdxdWVyeSddLCBbJy8nLCAncGF0aCddLCBbJ0AnLCAnYXV0aCcsIDFdLCBbTmFOLCAnaG9zdCcsIHVuZGVmaW5lZCwgMV1dO1xudmFyIFBST1RPQ09MX1JFR0VYID0gL14oW2Etel1bYS16MC05ListXSo6KT8oXFwvXFwvKT8oW1xcU1xcc10qKS9pO1xuZXhwb3J0IHZhciBVcmwgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFVybCh1cmwpIHtcbiAgICB2YXIgX3RoaXMkZXh0cmFjdFByb3RvY29sID0gdGhpcy5leHRyYWN0UHJvdG9jb2wodXJsIHx8ICcnKSxcbiAgICAgICAgcHJvdG9jb2wgPSBfdGhpcyRleHRyYWN0UHJvdG9jb2wucHJvdG9jb2wsXG4gICAgICAgIGFkZHJlc3MgPSBfdGhpcyRleHRyYWN0UHJvdG9jb2wuYWRkcmVzcyxcbiAgICAgICAgc2xhc2hlcyA9IF90aGlzJGV4dHJhY3RQcm90b2NvbC5zbGFzaGVzO1xuXG4gICAgdmFyIHJlbGF0aXZlID0gIXByb3RvY29sICYmICFzbGFzaGVzO1xuICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuZ2V0TG9jYXRpb24oKTtcbiAgICB2YXIgaW5zdHJ1Y3Rpb25zID0gUlVMRVMuc2xpY2UoKTtcbiAgICBhZGRyZXNzID0gYWRkcmVzcy5yZXBsYWNlKCdcXFxcJywgJy8nKTtcblxuICAgIGlmICghc2xhc2hlcykge1xuICAgICAgaW5zdHJ1Y3Rpb25zWzJdID0gW05hTiwgJ3BhdGgnXTtcbiAgICB9XG5cbiAgICB2YXIgaW5kZXg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluc3RydWN0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25zW2ldO1xuICAgICAgdmFyIHBhcnNlID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgICB2YXIga2V5ID0gaW5zdHJ1Y3Rpb25bMV07XG5cbiAgICAgIGlmICh0eXBlb2YgcGFyc2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGluZGV4ID0gYWRkcmVzcy5pbmRleE9mKHBhcnNlKTtcblxuICAgICAgICBpZiAofmluZGV4KSB7XG4gICAgICAgICAgdmFyIGluc3RMZW5ndGggPSBpbnN0cnVjdGlvblsyXTtcblxuICAgICAgICAgIGlmIChpbnN0TGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgbmV3SW5kZXggPSBhZGRyZXNzLmxhc3RJbmRleE9mKHBhcnNlKTtcbiAgICAgICAgICAgIGluZGV4ID0gTWF0aC5tYXgoaW5kZXgsIG5ld0luZGV4KTtcbiAgICAgICAgICAgIHRoaXNba2V5XSA9IGFkZHJlc3Muc2xpY2UoMCwgaW5kZXgpO1xuICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3Muc2xpY2UoaW5kZXggKyBpbnN0TGVuZ3RoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpc1trZXldID0gYWRkcmVzcy5zbGljZShpbmRleCk7XG4gICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzcy5zbGljZSgwLCBpbmRleCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzW2tleV0gPSBhZGRyZXNzO1xuICAgICAgICBhZGRyZXNzID0gJyc7XG4gICAgICB9XG5cbiAgICAgIHRoaXNba2V5XSA9IHRoaXNba2V5XSB8fCAocmVsYXRpdmUgJiYgaW5zdHJ1Y3Rpb25bM10gPyBsb2NhdGlvbltrZXldIHx8ICcnIDogJycpO1xuICAgICAgaWYgKGluc3RydWN0aW9uWzNdKSB0aGlzW2tleV0gPSB0aGlzW2tleV0udG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAocmVsYXRpdmUgJiYgdGhpcy5wYXRoLmNoYXJBdCgwKSAhPT0gJy8nKSB7XG4gICAgICB0aGlzLnBhdGggPSAnLycgKyB0aGlzLnBhdGg7XG4gICAgfVxuXG4gICAgdGhpcy5yZWxhdGl2ZSA9IHJlbGF0aXZlO1xuICAgIHRoaXMucHJvdG9jb2wgPSBwcm90b2NvbCB8fCBsb2NhdGlvbi5wcm90b2NvbDtcbiAgICB0aGlzLmhvc3RuYW1lID0gdGhpcy5ob3N0O1xuICAgIHRoaXMucG9ydCA9ICcnO1xuXG4gICAgaWYgKC86XFxkKyQvLnRlc3QodGhpcy5ob3N0KSkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5ob3N0LnNwbGl0KCc6Jyk7XG4gICAgICB2YXIgcG9ydCA9IHZhbHVlLnBvcCgpO1xuICAgICAgdmFyIGhvc3RuYW1lID0gdmFsdWUuam9pbignOicpO1xuXG4gICAgICBpZiAoaXNEZWZhdWx0UG9ydChwb3J0LCB0aGlzLnByb3RvY29sKSkge1xuICAgICAgICB0aGlzLmhvc3QgPSBob3N0bmFtZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucG9ydCA9IHBvcnQ7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaG9zdG5hbWUgPSBob3N0bmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLm9yaWdpbiA9IHRoaXMucHJvdG9jb2wgJiYgdGhpcy5ob3N0ICYmIHRoaXMucHJvdG9jb2wgIT09ICdmaWxlOicgPyB0aGlzLnByb3RvY29sICsgJy8vJyArIHRoaXMuaG9zdCA6ICdudWxsJztcbiAgICB0aGlzLmhyZWYgPSB0aGlzLnRvU3RyaW5nKCk7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gVXJsLnByb3RvdHlwZTtcblxuICBfcHJvdG8udG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5wcm90b2NvbDtcbiAgICByZXN1bHQgKz0gJy8vJztcblxuICAgIGlmICh0aGlzLmF1dGgpIHtcbiAgICAgIHZhciBSRURBQ1RFRCA9ICdbUkVEQUNURURdJztcbiAgICAgIHZhciB1c2VycGFzcyA9IHRoaXMuYXV0aC5zcGxpdCgnOicpO1xuICAgICAgdmFyIHVzZXJuYW1lID0gdXNlcnBhc3NbMF0gPyBSRURBQ1RFRCA6ICcnO1xuICAgICAgdmFyIHBhc3N3b3JkID0gdXNlcnBhc3NbMV0gPyAnOicgKyBSRURBQ1RFRCA6ICcnO1xuICAgICAgcmVzdWx0ICs9IHVzZXJuYW1lICsgcGFzc3dvcmQgKyAnQCc7XG4gICAgfVxuXG4gICAgcmVzdWx0ICs9IHRoaXMuaG9zdDtcbiAgICByZXN1bHQgKz0gdGhpcy5wYXRoO1xuICAgIHJlc3VsdCArPSB0aGlzLnF1ZXJ5O1xuICAgIHJlc3VsdCArPSB0aGlzLmhhc2g7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICBfcHJvdG8uZ2V0TG9jYXRpb24gPSBmdW5jdGlvbiBnZXRMb2NhdGlvbigpIHtcbiAgICB2YXIgZ2xvYmFsVmFyID0ge307XG5cbiAgICBpZiAoaXNCcm93c2VyKSB7XG4gICAgICBnbG9iYWxWYXIgPSB3aW5kb3c7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdsb2JhbFZhci5sb2NhdGlvbjtcbiAgfTtcblxuICBfcHJvdG8uZXh0cmFjdFByb3RvY29sID0gZnVuY3Rpb24gZXh0cmFjdFByb3RvY29sKHVybCkge1xuICAgIHZhciBtYXRjaCA9IFBST1RPQ09MX1JFR0VYLmV4ZWModXJsKTtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvdG9jb2w6IG1hdGNoWzFdID8gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSA6ICcnLFxuICAgICAgc2xhc2hlczogISFtYXRjaFsyXSxcbiAgICAgIGFkZHJlc3M6IG1hdGNoWzNdXG4gICAgfTtcbiAgfTtcblxuICByZXR1cm4gVXJsO1xufSgpO1xuZXhwb3J0IGZ1bmN0aW9uIHNsdWdpZnlVcmwodXJsU3RyLCBkZXB0aCkge1xuICBpZiAoZGVwdGggPT09IHZvaWQgMCkge1xuICAgIGRlcHRoID0gMjtcbiAgfVxuXG4gIHZhciBwYXJzZWRVcmwgPSBuZXcgVXJsKHVybFN0cik7XG4gIHZhciBxdWVyeSA9IHBhcnNlZFVybC5xdWVyeSxcbiAgICAgIHBhdGggPSBwYXJzZWRVcmwucGF0aDtcbiAgdmFyIHBhdGhQYXJ0cyA9IHBhdGguc3Vic3RyaW5nKDEpLnNwbGl0KCcvJyk7XG4gIHZhciByZWRhY3RTdHJpbmcgPSAnOmlkJztcbiAgdmFyIHdpbGRjYXJkID0gJyonO1xuICB2YXIgc3BlY2lhbENoYXJzUmVnZXggPSAvXFxXfF8vZztcbiAgdmFyIGRpZ2l0c1JlZ2V4ID0gL1swLTldL2c7XG4gIHZhciBsb3dlckNhc2VSZWdleCA9IC9bYS16XS9nO1xuICB2YXIgdXBwZXJDYXNlUmVnZXggPSAvW0EtWl0vZztcbiAgdmFyIHJlZGFjdGVkUGFydHMgPSBbXTtcbiAgdmFyIHJlZGFjdGVkQmVmb3JlID0gZmFsc2U7XG5cbiAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHBhdGhQYXJ0cy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICB2YXIgcGFydCA9IHBhdGhQYXJ0c1tpbmRleF07XG5cbiAgICBpZiAocmVkYWN0ZWRCZWZvcmUgfHwgaW5kZXggPiBkZXB0aCAtIDEpIHtcbiAgICAgIGlmIChwYXJ0KSB7XG4gICAgICAgIHJlZGFjdGVkUGFydHMucHVzaCh3aWxkY2FyZCk7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHZhciBudW1iZXJPZlNwZWNpYWxDaGFycyA9IChwYXJ0Lm1hdGNoKHNwZWNpYWxDaGFyc1JlZ2V4KSB8fCBbXSkubGVuZ3RoO1xuXG4gICAgaWYgKG51bWJlck9mU3BlY2lhbENoYXJzID49IDIpIHtcbiAgICAgIHJlZGFjdGVkUGFydHMucHVzaChyZWRhY3RTdHJpbmcpO1xuICAgICAgcmVkYWN0ZWRCZWZvcmUgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIG51bWJlck9mRGlnaXRzID0gKHBhcnQubWF0Y2goZGlnaXRzUmVnZXgpIHx8IFtdKS5sZW5ndGg7XG5cbiAgICBpZiAobnVtYmVyT2ZEaWdpdHMgPiAzIHx8IHBhcnQubGVuZ3RoID4gMyAmJiBudW1iZXJPZkRpZ2l0cyAvIHBhcnQubGVuZ3RoID49IDAuMykge1xuICAgICAgcmVkYWN0ZWRQYXJ0cy5wdXNoKHJlZGFjdFN0cmluZyk7XG4gICAgICByZWRhY3RlZEJlZm9yZSA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB2YXIgbnVtYmVyb2ZVcHBlckNhc2UgPSAocGFydC5tYXRjaCh1cHBlckNhc2VSZWdleCkgfHwgW10pLmxlbmd0aDtcbiAgICB2YXIgbnVtYmVyb2ZMb3dlckNhc2UgPSAocGFydC5tYXRjaChsb3dlckNhc2VSZWdleCkgfHwgW10pLmxlbmd0aDtcbiAgICB2YXIgbG93ZXJDYXNlUmF0ZSA9IG51bWJlcm9mTG93ZXJDYXNlIC8gcGFydC5sZW5ndGg7XG4gICAgdmFyIHVwcGVyQ2FzZVJhdGUgPSBudW1iZXJvZlVwcGVyQ2FzZSAvIHBhcnQubGVuZ3RoO1xuXG4gICAgaWYgKHBhcnQubGVuZ3RoID4gNSAmJiAodXBwZXJDYXNlUmF0ZSA+IDAuMyAmJiB1cHBlckNhc2VSYXRlIDwgMC42IHx8IGxvd2VyQ2FzZVJhdGUgPiAwLjMgJiYgbG93ZXJDYXNlUmF0ZSA8IDAuNikpIHtcbiAgICAgIHJlZGFjdGVkUGFydHMucHVzaChyZWRhY3RTdHJpbmcpO1xuICAgICAgcmVkYWN0ZWRCZWZvcmUgPSB0cnVlO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgcGFydCAmJiByZWRhY3RlZFBhcnRzLnB1c2gocGFydCk7XG4gIH1cblxuICB2YXIgcmVkYWN0ZWQgPSAnLycgKyAocmVkYWN0ZWRQYXJ0cy5sZW5ndGggPj0gMiA/IHJlZGFjdGVkUGFydHMuam9pbignLycpIDogcmVkYWN0ZWRQYXJ0cy5qb2luKCcnKSkgKyAocXVlcnkgPyAnP3txdWVyeX0nIDogJycpO1xuICByZXR1cm4gcmVkYWN0ZWQ7XG59IiwiaW1wb3J0IHsgUHJvbWlzZSB9IGZyb20gJy4vcG9seWZpbGxzJztcbnZhciBzbGljZSA9IFtdLnNsaWNlO1xudmFyIGlzQnJvd3NlciA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xudmFyIFBFUkYgPSBpc0Jyb3dzZXIgJiYgdHlwZW9mIHBlcmZvcm1hbmNlICE9PSAndW5kZWZpbmVkJyA/IHBlcmZvcm1hbmNlIDoge307XG5cbmZ1bmN0aW9uIGlzQ09SU1N1cHBvcnRlZCgpIHtcbiAgdmFyIHhociA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcbiAgcmV0dXJuICd3aXRoQ3JlZGVudGlhbHMnIGluIHhocjtcbn1cblxudmFyIGJ5dGVUb0hleCA9IFtdO1xuXG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gIGJ5dGVUb0hleFtpXSA9IChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSk7XG59XG5cbmZ1bmN0aW9uIGJ5dGVzVG9IZXgoYnVmZmVyKSB7XG4gIHZhciBoZXhPY3RldHMgPSBbXTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYnVmZmVyLmxlbmd0aDsgX2krKykge1xuICAgIGhleE9jdGV0cy5wdXNoKGJ5dGVUb0hleFtidWZmZXJbX2ldXSk7XG4gIH1cblxuICByZXR1cm4gaGV4T2N0ZXRzLmpvaW4oJycpO1xufVxuXG52YXIgZGVzdGluYXRpb24gPSBuZXcgVWludDhBcnJheSgxNik7XG5cbmZ1bmN0aW9uIHJuZygpIHtcbiAgaWYgKHR5cGVvZiBjcnlwdG8gIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGRlc3RpbmF0aW9uKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgbXNDcnlwdG8gIT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcyhkZXN0aW5hdGlvbik7XG4gIH1cblxuICByZXR1cm4gZGVzdGluYXRpb247XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlUmFuZG9tSWQobGVuZ3RoKSB7XG4gIHZhciBpZCA9IGJ5dGVzVG9IZXgocm5nKCkpO1xuICByZXR1cm4gaWQuc3Vic3RyKDAsIGxlbmd0aCk7XG59XG5cbmZ1bmN0aW9uIGdldER0SGVhZGVyVmFsdWUoc3Bhbikge1xuICB2YXIgZHRWZXJzaW9uID0gJzAwJztcbiAgdmFyIGR0VW5TYW1wbGVkRmxhZ3MgPSAnMDAnO1xuICB2YXIgZHRTYW1wbGVkRmxhZ3MgPSAnMDEnO1xuXG4gIGlmIChzcGFuICYmIHNwYW4udHJhY2VJZCAmJiBzcGFuLmlkICYmIHNwYW4ucGFyZW50SWQpIHtcbiAgICB2YXIgZmxhZ3MgPSBzcGFuLnNhbXBsZWQgPyBkdFNhbXBsZWRGbGFncyA6IGR0VW5TYW1wbGVkRmxhZ3M7XG4gICAgdmFyIGlkID0gc3Bhbi5zYW1wbGVkID8gc3Bhbi5pZCA6IHNwYW4ucGFyZW50SWQ7XG4gICAgcmV0dXJuIGR0VmVyc2lvbiArICctJyArIHNwYW4udHJhY2VJZCArICctJyArIGlkICsgJy0nICsgZmxhZ3M7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VEdEhlYWRlclZhbHVlKHZhbHVlKSB7XG4gIHZhciBwYXJzZWQgPSAvXihbXFxkYS1mXXsyfSktKFtcXGRhLWZdezMyfSktKFtcXGRhLWZdezE2fSktKFtcXGRhLWZdezJ9KSQvLmV4ZWModmFsdWUpO1xuXG4gIGlmIChwYXJzZWQpIHtcbiAgICB2YXIgZmxhZ3MgPSBwYXJzZWRbNF07XG4gICAgdmFyIHNhbXBsZWQgPSBmbGFncyAhPT0gJzAwJztcbiAgICByZXR1cm4ge1xuICAgICAgdHJhY2VJZDogcGFyc2VkWzJdLFxuICAgICAgaWQ6IHBhcnNlZFszXSxcbiAgICAgIHNhbXBsZWQ6IHNhbXBsZWRcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzRHRIZWFkZXJWYWxpZChoZWFkZXIpIHtcbiAgcmV0dXJuIC9eW1xcZGEtZl17Mn0tW1xcZGEtZl17MzJ9LVtcXGRhLWZdezE2fS1bXFxkYS1mXXsyfSQvLnRlc3QoaGVhZGVyKSAmJiBoZWFkZXIuc2xpY2UoMywgMzUpICE9PSAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnICYmIGhlYWRlci5zbGljZSgzNiwgNTIpICE9PSAnMDAwMDAwMDAwMDAwMDAwMCc7XG59XG5cbmZ1bmN0aW9uIGdldFRTSGVhZGVyVmFsdWUoX3JlZikge1xuICB2YXIgc2FtcGxlUmF0ZSA9IF9yZWYuc2FtcGxlUmF0ZTtcblxuICBpZiAodHlwZW9mIHNhbXBsZVJhdGUgIT09ICdudW1iZXInIHx8IFN0cmluZyhzYW1wbGVSYXRlKS5sZW5ndGggPiAyNTYpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgTkFNRVNQQUNFID0gJ2VzJztcbiAgdmFyIFNFUEFSQVRPUiA9ICc9JztcbiAgcmV0dXJuIFwiXCIgKyBOQU1FU1BBQ0UgKyBTRVBBUkFUT1IgKyBcInM6XCIgKyBzYW1wbGVSYXRlO1xufVxuXG5mdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVyKHRhcmdldCwgbmFtZSwgdmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB0YXJnZXQuc2V0UmVxdWVzdEhlYWRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHRhcmdldC5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKTtcbiAgfSBlbHNlIGlmICh0YXJnZXQuaGVhZGVycyAmJiB0eXBlb2YgdGFyZ2V0LmhlYWRlcnMuYXBwZW5kID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdGFyZ2V0LmhlYWRlcnMuYXBwZW5kKG5hbWUsIHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXRbbmFtZV0gPSB2YWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1NhbWVPcmlnaW4oc291cmNlLCB0YXJnZXQpIHtcbiAgdmFyIGlzU2FtZSA9IGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJykge1xuICAgIGlzU2FtZSA9IHNvdXJjZSA9PT0gdGFyZ2V0O1xuICB9IGVsc2UgaWYgKHRhcmdldCAmJiB0eXBlb2YgdGFyZ2V0LnRlc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpc1NhbWUgPSB0YXJnZXQudGVzdChzb3VyY2UpO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGFyZ2V0KSkge1xuICAgIHRhcmdldC5mb3JFYWNoKGZ1bmN0aW9uICh0KSB7XG4gICAgICBpZiAoIWlzU2FtZSkge1xuICAgICAgICBpc1NhbWUgPSBjaGVja1NhbWVPcmlnaW4oc291cmNlLCB0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBpc1NhbWU7XG59XG5cbmZ1bmN0aW9uIGlzUGxhdGZvcm1TdXBwb3J0ZWQoKSB7XG4gIHJldHVybiBpc0Jyb3dzZXIgJiYgdHlwZW9mIFNldCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgSlNPTi5zdHJpbmdpZnkgPT09ICdmdW5jdGlvbicgJiYgUEVSRiAmJiB0eXBlb2YgUEVSRi5ub3cgPT09ICdmdW5jdGlvbicgJiYgaXNDT1JTU3VwcG9ydGVkKCk7XG59XG5cbmZ1bmN0aW9uIHNldExhYmVsKGtleSwgdmFsdWUsIG9iaikge1xuICBpZiAoIW9iaiB8fCAha2V5KSByZXR1cm47XG4gIHZhciBza2V5ID0gcmVtb3ZlSW52YWxpZENoYXJzKGtleSk7XG4gIHZhciB2YWx1ZVR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cbiAgaWYgKHZhbHVlICE9IHVuZGVmaW5lZCAmJiB2YWx1ZVR5cGUgIT09ICdib29sZWFuJyAmJiB2YWx1ZVR5cGUgIT09ICdudW1iZXInKSB7XG4gICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgb2JqW3NrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmo7XG59XG5cbmZ1bmN0aW9uIGdldFNlcnZlclRpbWluZ0luZm8oc2VydmVyVGltaW5nRW50cmllcykge1xuICBpZiAoc2VydmVyVGltaW5nRW50cmllcyA9PT0gdm9pZCAwKSB7XG4gICAgc2VydmVyVGltaW5nRW50cmllcyA9IFtdO1xuICB9XG5cbiAgdmFyIHNlcnZlclRpbWluZ0luZm8gPSBbXTtcbiAgdmFyIGVudHJ5U2VwYXJhdG9yID0gJywgJztcbiAgdmFyIHZhbHVlU2VwYXJhdG9yID0gJzsnO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHNlcnZlclRpbWluZ0VudHJpZXMubGVuZ3RoOyBfaTIrKykge1xuICAgIHZhciBfc2VydmVyVGltaW5nRW50cmllcyQgPSBzZXJ2ZXJUaW1pbmdFbnRyaWVzW19pMl0sXG4gICAgICAgIG5hbWUgPSBfc2VydmVyVGltaW5nRW50cmllcyQubmFtZSxcbiAgICAgICAgZHVyYXRpb24gPSBfc2VydmVyVGltaW5nRW50cmllcyQuZHVyYXRpb24sXG4gICAgICAgIGRlc2NyaXB0aW9uID0gX3NlcnZlclRpbWluZ0VudHJpZXMkLmRlc2NyaXB0aW9uO1xuICAgIHZhciB0aW1pbmdWYWx1ZSA9IG5hbWU7XG5cbiAgICBpZiAoZGVzY3JpcHRpb24pIHtcbiAgICAgIHRpbWluZ1ZhbHVlICs9IHZhbHVlU2VwYXJhdG9yICsgJ2Rlc2M9JyArIGRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIGlmIChkdXJhdGlvbikge1xuICAgICAgdGltaW5nVmFsdWUgKz0gdmFsdWVTZXBhcmF0b3IgKyAnZHVyPScgKyBkdXJhdGlvbjtcbiAgICB9XG5cbiAgICBzZXJ2ZXJUaW1pbmdJbmZvLnB1c2godGltaW5nVmFsdWUpO1xuICB9XG5cbiAgcmV0dXJuIHNlcnZlclRpbWluZ0luZm8uam9pbihlbnRyeVNlcGFyYXRvcik7XG59XG5cbmZ1bmN0aW9uIGdldFRpbWVPcmlnaW4oKSB7XG4gIHJldHVybiBQRVJGLnRpbWluZy5mZXRjaFN0YXJ0O1xufVxuXG5mdW5jdGlvbiBzdHJpcFF1ZXJ5U3RyaW5nRnJvbVVybCh1cmwpIHtcbiAgcmV0dXJuIHVybCAmJiB1cmwuc3BsaXQoJz8nKVswXTtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gYmFzZUV4dGVuZChkc3QsIG9ianMsIGRlZXApIHtcbiAgZm9yICh2YXIgaSA9IDAsIGlpID0gb2Jqcy5sZW5ndGg7IGkgPCBpaTsgKytpKSB7XG4gICAgdmFyIG9iaiA9IG9ianNbaV07XG4gICAgaWYgKCFpc09iamVjdChvYmopICYmICFpc0Z1bmN0aW9uKG9iaikpIGNvbnRpbnVlO1xuICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcblxuICAgIGZvciAodmFyIGogPSAwLCBqaiA9IGtleXMubGVuZ3RoOyBqIDwgamo7IGorKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbal07XG4gICAgICB2YXIgc3JjID0gb2JqW2tleV07XG5cbiAgICAgIGlmIChkZWVwICYmIGlzT2JqZWN0KHNyYykpIHtcbiAgICAgICAgaWYgKCFpc09iamVjdChkc3Rba2V5XSkpIGRzdFtrZXldID0gQXJyYXkuaXNBcnJheShzcmMpID8gW10gOiB7fTtcbiAgICAgICAgYmFzZUV4dGVuZChkc3Rba2V5XSwgW3NyY10sIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRzdFtrZXldID0gc3JjO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkc3Q7XG59XG5cbmZ1bmN0aW9uIGdldEVsYXN0aWNTY3JpcHQoKSB7XG4gIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgdmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHNjcmlwdHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICB2YXIgc2MgPSBzY3JpcHRzW2ldO1xuXG4gICAgICBpZiAoc2Muc3JjLmluZGV4T2YoJ2VsYXN0aWMnKSA+IDApIHtcbiAgICAgICAgcmV0dXJuIHNjO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRDdXJyZW50U2NyaXB0KCkge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIHZhciBjdXJyZW50U2NyaXB0ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdDtcblxuICAgIGlmICghY3VycmVudFNjcmlwdCkge1xuICAgICAgcmV0dXJuIGdldEVsYXN0aWNTY3JpcHQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY3VycmVudFNjcmlwdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBleHRlbmQoKSB7XG4gIHJldHVybiBiYXNlRXh0ZW5kKE9iamVjdC5jcmVhdGUobnVsbCksIHNsaWNlLmNhbGwoYXJndW1lbnRzKSwgZmFsc2UpO1xufVxuXG5mdW5jdGlvbiBtZXJnZSgpIHtcbiAgcmV0dXJuIGJhc2VFeHRlbmQoT2JqZWN0LmNyZWF0ZShudWxsKSwgc2xpY2UuY2FsbChhcmd1bWVudHMpLCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSAndW5kZWZpbmVkJztcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbmZ1bmN0aW9uIGZpbmQoYXJyYXksIHByZWRpY2F0ZSwgdGhpc0FyZykge1xuICBpZiAoYXJyYXkgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2FycmF5IGlzIG51bGwgb3Igbm90IGRlZmluZWQnKTtcbiAgfVxuXG4gIHZhciBvID0gT2JqZWN0KGFycmF5KTtcbiAgdmFyIGxlbiA9IG8ubGVuZ3RoID4+PiAwO1xuXG4gIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJlZGljYXRlIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgdmFyIGsgPSAwO1xuXG4gIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgdmFyIGtWYWx1ZSA9IG9ba107XG5cbiAgICBpZiAocHJlZGljYXRlLmNhbGwodGhpc0FyZywga1ZhbHVlLCBrLCBvKSkge1xuICAgICAgcmV0dXJuIGtWYWx1ZTtcbiAgICB9XG5cbiAgICBrKys7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZW1vdmVJbnZhbGlkQ2hhcnMoa2V5KSB7XG4gIHJldHVybiBrZXkucmVwbGFjZSgvWy4qXCJdL2csICdfJyk7XG59XG5cbmZ1bmN0aW9uIGdldExhdGVzdFNwYW4oc3BhbnMsIHR5cGVGaWx0ZXIpIHtcbiAgdmFyIGxhdGVzdFNwYW4gPSBudWxsO1xuXG4gIGZvciAodmFyIF9pMyA9IDA7IF9pMyA8IHNwYW5zLmxlbmd0aDsgX2kzKyspIHtcbiAgICB2YXIgc3BhbiA9IHNwYW5zW19pM107XG5cbiAgICBpZiAodHlwZUZpbHRlciAmJiB0eXBlRmlsdGVyKHNwYW4udHlwZSkgJiYgKCFsYXRlc3RTcGFuIHx8IGxhdGVzdFNwYW4uX2VuZCA8IHNwYW4uX2VuZCkpIHtcbiAgICAgIGxhdGVzdFNwYW4gPSBzcGFuO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsYXRlc3RTcGFuO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3ROb25YSFJTcGFuKHNwYW5zKSB7XG4gIHJldHVybiBnZXRMYXRlc3RTcGFuKHNwYW5zLCBmdW5jdGlvbiAodHlwZSkge1xuICAgIHJldHVybiBTdHJpbmcodHlwZSkuaW5kZXhPZignZXh0ZXJuYWwnKSA9PT0gLTE7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRMYXRlc3RYSFJTcGFuKHNwYW5zKSB7XG4gIHJldHVybiBnZXRMYXRlc3RTcGFuKHNwYW5zLCBmdW5jdGlvbiAodHlwZSkge1xuICAgIHJldHVybiBTdHJpbmcodHlwZSkuaW5kZXhPZignZXh0ZXJuYWwnKSAhPT0gLTE7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRFYXJsaWVzdFNwYW4oc3BhbnMpIHtcbiAgdmFyIGVhcmxpZXN0U3BhbiA9IHNwYW5zWzBdO1xuXG4gIGZvciAodmFyIF9pNCA9IDE7IF9pNCA8IHNwYW5zLmxlbmd0aDsgX2k0KyspIHtcbiAgICB2YXIgc3BhbiA9IHNwYW5zW19pNF07XG5cbiAgICBpZiAoZWFybGllc3RTcGFuLl9zdGFydCA+IHNwYW4uX3N0YXJ0KSB7XG4gICAgICBlYXJsaWVzdFNwYW4gPSBzcGFuO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlYXJsaWVzdFNwYW47XG59XG5cbmZ1bmN0aW9uIG5vdygpIHtcbiAgcmV0dXJuIFBFUkYubm93KCk7XG59XG5cbmZ1bmN0aW9uIGdldFRpbWUodGltZSkge1xuICByZXR1cm4gdHlwZW9mIHRpbWUgPT09ICdudW1iZXInICYmIHRpbWUgPj0gMCA/IHRpbWUgOiBub3coKTtcbn1cblxuZnVuY3Rpb24gZ2V0RHVyYXRpb24oc3RhcnQsIGVuZCkge1xuICBpZiAoaXNVbmRlZmluZWQoZW5kKSB8fCBpc1VuZGVmaW5lZChzdGFydCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBwYXJzZUludChlbmQgLSBzdGFydCk7XG59XG5cbmZ1bmN0aW9uIHNjaGVkdWxlTWFjcm9UYXNrKGNhbGxiYWNrKSB7XG4gIHNldFRpbWVvdXQoY2FsbGJhY2ssIDApO1xufVxuXG5mdW5jdGlvbiBzY2hlZHVsZU1pY3JvVGFzayhjYWxsYmFjaykge1xuICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gaXNQZXJmVGltZWxpbmVTdXBwb3J0ZWQoKSB7XG4gIHJldHVybiB0eXBlb2YgUEVSRi5nZXRFbnRyaWVzQnlUeXBlID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc1BlcmZUeXBlU3VwcG9ydGVkKHR5cGUpIHtcbiAgcmV0dXJuIHR5cGVvZiBQZXJmb3JtYW5jZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiBQZXJmb3JtYW5jZU9ic2VydmVyLnN1cHBvcnRlZEVudHJ5VHlwZXMgJiYgUGVyZm9ybWFuY2VPYnNlcnZlci5zdXBwb3J0ZWRFbnRyeVR5cGVzLmluZGV4T2YodHlwZSkgPj0gMDtcbn1cblxuZnVuY3Rpb24gaXNQZXJmSW50ZXJhY3Rpb25Db3VudFN1cHBvcnRlZCgpIHtcbiAgcmV0dXJuICdpbnRlcmFjdGlvbkNvdW50JyBpbiBwZXJmb3JtYW5jZTtcbn1cblxuZnVuY3Rpb24gaXNCZWFjb25JbnNwZWN0aW9uRW5hYmxlZCgpIHtcbiAgdmFyIGZsYWdOYW1lID0gJ19lbGFzdGljX2luc3BlY3RfYmVhY29uXyc7XG5cbiAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oZmxhZ05hbWUpICE9IG51bGwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghd2luZG93LlVSTCB8fCAhd2luZG93LlVSTFNlYXJjaFBhcmFtcykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgdmFyIHBhcnNlZFVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgIHZhciBpc0ZsYWdTZXQgPSBwYXJzZWRVcmwuc2VhcmNoUGFyYW1zLmhhcyhmbGFnTmFtZSk7XG5cbiAgICBpZiAoaXNGbGFnU2V0KSB7XG4gICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGZsYWdOYW1lLCB0cnVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNGbGFnU2V0O1xuICB9IGNhdGNoIChlKSB7fVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNSZWRpcmVjdEluZm9BdmFpbGFibGUodGltaW5nKSB7XG4gIHJldHVybiB0aW1pbmcucmVkaXJlY3RTdGFydCA+IDA7XG59XG5cbmV4cG9ydCB7IGV4dGVuZCwgbWVyZ2UsIGlzVW5kZWZpbmVkLCBub29wLCBiYXNlRXh0ZW5kLCBieXRlc1RvSGV4LCBpc0NPUlNTdXBwb3J0ZWQsIGlzT2JqZWN0LCBpc0Z1bmN0aW9uLCBpc1BsYXRmb3JtU3VwcG9ydGVkLCBpc0R0SGVhZGVyVmFsaWQsIHBhcnNlRHRIZWFkZXJWYWx1ZSwgZ2V0U2VydmVyVGltaW5nSW5mbywgZ2V0RHRIZWFkZXJWYWx1ZSwgZ2V0VFNIZWFkZXJWYWx1ZSwgZ2V0Q3VycmVudFNjcmlwdCwgZ2V0RWxhc3RpY1NjcmlwdCwgZ2V0VGltZU9yaWdpbiwgZ2VuZXJhdGVSYW5kb21JZCwgZ2V0RWFybGllc3RTcGFuLCBnZXRMYXRlc3ROb25YSFJTcGFuLCBnZXRMYXRlc3RYSFJTcGFuLCBnZXREdXJhdGlvbiwgZ2V0VGltZSwgbm93LCBybmcsIGNoZWNrU2FtZU9yaWdpbiwgc2NoZWR1bGVNYWNyb1Rhc2ssIHNjaGVkdWxlTWljcm9UYXNrLCBzZXRMYWJlbCwgc2V0UmVxdWVzdEhlYWRlciwgc3RyaXBRdWVyeVN0cmluZ0Zyb21VcmwsIGZpbmQsIHJlbW92ZUludmFsaWRDaGFycywgUEVSRiwgaXNQZXJmVGltZWxpbmVTdXBwb3J0ZWQsIGlzQnJvd3NlciwgaXNQZXJmVHlwZVN1cHBvcnRlZCwgaXNQZXJmSW50ZXJhY3Rpb25Db3VudFN1cHBvcnRlZCwgaXNCZWFjb25JbnNwZWN0aW9uRW5hYmxlZCwgaXNSZWRpcmVjdEluZm9BdmFpbGFibGUgfTsiLCJ2YXIgX2V4Y2x1ZGVkID0gW1widGFnc1wiXTtcblxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkgeyBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTsgdmFyIHRhcmdldCA9IHt9OyB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7IHZhciBrZXksIGk7IGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7IGtleSA9IHNvdXJjZUtleXNbaV07IGlmIChleGNsdWRlZC5pbmRleE9mKGtleSkgPj0gMCkgY29udGludWU7IHRhcmdldFtrZXldID0gc291cmNlW2tleV07IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgeyBjcmVhdGVTdGFja1RyYWNlcywgZmlsdGVySW52YWxpZEZyYW1lcyB9IGZyb20gJy4vc3RhY2stdHJhY2UnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSYW5kb21JZCwgbWVyZ2UsIGV4dGVuZCB9IGZyb20gJy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBnZXRQYWdlQ29udGV4dCB9IGZyb20gJy4uL2NvbW1vbi9jb250ZXh0JztcbmltcG9ydCB7IHRydW5jYXRlTW9kZWwsIEVSUk9SX01PREVMIH0gZnJvbSAnLi4vY29tbW9uL3RydW5jYXRlJztcbmltcG9ydCBzdGFja1BhcnNlciBmcm9tICdlcnJvci1zdGFjay1wYXJzZXInO1xudmFyIElHTk9SRV9LRVlTID0gWydzdGFjaycsICdtZXNzYWdlJ107XG52YXIgUFJPTUlTRV9SRUpFQ1RJT05fUFJFRklYID0gJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbjogJztcblxuZnVuY3Rpb24gZ2V0RXJyb3JQcm9wZXJ0aWVzKGVycm9yKSB7XG4gIHZhciBwcm9wZXJ0eUZvdW5kID0gZmFsc2U7XG4gIHZhciBwcm9wZXJ0aWVzID0ge307XG4gIE9iamVjdC5rZXlzKGVycm9yKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICBpZiAoSUdOT1JFX0tFWVMuaW5kZXhPZihrZXkpID49IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdmFsID0gZXJyb3Jba2V5XTtcblxuICAgIGlmICh2YWwgPT0gbnVsbCB8fCB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAodHlwZW9mIHZhbC50b0lTT1N0cmluZyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuICAgICAgdmFsID0gdmFsLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuXG4gICAgcHJvcGVydGllc1trZXldID0gdmFsO1xuICAgIHByb3BlcnR5Rm91bmQgPSB0cnVlO1xuICB9KTtcblxuICBpZiAocHJvcGVydHlGb3VuZCkge1xuICAgIHJldHVybiBwcm9wZXJ0aWVzO1xuICB9XG59XG5cbnZhciBFcnJvckxvZ2dpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEVycm9yTG9nZ2luZyhhcG1TZXJ2ZXIsIGNvbmZpZ1NlcnZpY2UsIHRyYW5zYWN0aW9uU2VydmljZSkge1xuICAgIHRoaXMuX2FwbVNlcnZlciA9IGFwbVNlcnZlcjtcbiAgICB0aGlzLl9jb25maWdTZXJ2aWNlID0gY29uZmlnU2VydmljZTtcbiAgICB0aGlzLl90cmFuc2FjdGlvblNlcnZpY2UgPSB0cmFuc2FjdGlvblNlcnZpY2U7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gRXJyb3JMb2dnaW5nLnByb3RvdHlwZTtcblxuICBfcHJvdG8uY3JlYXRlRXJyb3JEYXRhTW9kZWwgPSBmdW5jdGlvbiBjcmVhdGVFcnJvckRhdGFNb2RlbChlcnJvckV2ZW50KSB7XG4gICAgdmFyIGZyYW1lcyA9IGNyZWF0ZVN0YWNrVHJhY2VzKHN0YWNrUGFyc2VyLCBlcnJvckV2ZW50KTtcbiAgICB2YXIgZmlsdGVyZWRGcmFtZXMgPSBmaWx0ZXJJbnZhbGlkRnJhbWVzKGZyYW1lcyk7XG4gICAgdmFyIGN1bHByaXQgPSAnKGlubGluZSBzY3JpcHQpJztcbiAgICB2YXIgbGFzdEZyYW1lID0gZmlsdGVyZWRGcmFtZXNbZmlsdGVyZWRGcmFtZXMubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAobGFzdEZyYW1lICYmIGxhc3RGcmFtZS5maWxlbmFtZSkge1xuICAgICAgY3VscHJpdCA9IGxhc3RGcmFtZS5maWxlbmFtZTtcbiAgICB9XG5cbiAgICB2YXIgbWVzc2FnZSA9IGVycm9yRXZlbnQubWVzc2FnZSxcbiAgICAgICAgZXJyb3IgPSBlcnJvckV2ZW50LmVycm9yO1xuICAgIHZhciBlcnJvck1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIHZhciBlcnJvclR5cGUgPSAnJztcbiAgICB2YXIgZXJyb3JDb250ZXh0ID0ge307XG5cbiAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0Jykge1xuICAgICAgZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlIHx8IGVycm9yLm1lc3NhZ2U7XG4gICAgICBlcnJvclR5cGUgPSBlcnJvci5uYW1lO1xuICAgICAgdmFyIGN1c3RvbVByb3BlcnRpZXMgPSBnZXRFcnJvclByb3BlcnRpZXMoZXJyb3IpO1xuXG4gICAgICBpZiAoY3VzdG9tUHJvcGVydGllcykge1xuICAgICAgICBlcnJvckNvbnRleHQuY3VzdG9tID0gY3VzdG9tUHJvcGVydGllcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWVycm9yVHlwZSkge1xuICAgICAgaWYgKGVycm9yTWVzc2FnZSAmJiBlcnJvck1lc3NhZ2UuaW5kZXhPZignOicpID4gLTEpIHtcbiAgICAgICAgZXJyb3JUeXBlID0gZXJyb3JNZXNzYWdlLnNwbGl0KCc6JylbMF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGN1cnJlbnRUcmFuc2FjdGlvbiA9IHRoaXMuX3RyYW5zYWN0aW9uU2VydmljZS5nZXRDdXJyZW50VHJhbnNhY3Rpb24oKTtcblxuICAgIHZhciB0cmFuc2FjdGlvbkNvbnRleHQgPSBjdXJyZW50VHJhbnNhY3Rpb24gPyBjdXJyZW50VHJhbnNhY3Rpb24uY29udGV4dCA6IHt9O1xuXG4gICAgdmFyIF90aGlzJF9jb25maWdTZXJ2aWNlJCA9IHRoaXMuX2NvbmZpZ1NlcnZpY2UuZ2V0KCdjb250ZXh0JyksXG4gICAgICAgIHRhZ3MgPSBfdGhpcyRfY29uZmlnU2VydmljZSQudGFncyxcbiAgICAgICAgY29uZmlnQ29udGV4dCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKF90aGlzJF9jb25maWdTZXJ2aWNlJCwgX2V4Y2x1ZGVkKTtcblxuICAgIHZhciBwYWdlQ29udGV4dCA9IGdldFBhZ2VDb250ZXh0KCk7XG4gICAgdmFyIGNvbnRleHQgPSBtZXJnZSh7fSwgcGFnZUNvbnRleHQsIHRyYW5zYWN0aW9uQ29udGV4dCwgY29uZmlnQ29udGV4dCwgZXJyb3JDb250ZXh0KTtcbiAgICB2YXIgZXJyb3JPYmplY3QgPSB7XG4gICAgICBpZDogZ2VuZXJhdGVSYW5kb21JZCgpLFxuICAgICAgY3VscHJpdDogY3VscHJpdCxcbiAgICAgIGV4Y2VwdGlvbjoge1xuICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgIHN0YWNrdHJhY2U6IGZpbHRlcmVkRnJhbWVzLFxuICAgICAgICB0eXBlOiBlcnJvclR5cGVcbiAgICAgIH0sXG4gICAgICBjb250ZXh0OiBjb250ZXh0XG4gICAgfTtcblxuICAgIGlmIChjdXJyZW50VHJhbnNhY3Rpb24pIHtcbiAgICAgIGVycm9yT2JqZWN0ID0gZXh0ZW5kKGVycm9yT2JqZWN0LCB7XG4gICAgICAgIHRyYWNlX2lkOiBjdXJyZW50VHJhbnNhY3Rpb24udHJhY2VJZCxcbiAgICAgICAgcGFyZW50X2lkOiBjdXJyZW50VHJhbnNhY3Rpb24uaWQsXG4gICAgICAgIHRyYW5zYWN0aW9uX2lkOiBjdXJyZW50VHJhbnNhY3Rpb24uaWQsXG4gICAgICAgIHRyYW5zYWN0aW9uOiB7XG4gICAgICAgICAgdHlwZTogY3VycmVudFRyYW5zYWN0aW9uLnR5cGUsXG4gICAgICAgICAgc2FtcGxlZDogY3VycmVudFRyYW5zYWN0aW9uLnNhbXBsZWRcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydW5jYXRlTW9kZWwoRVJST1JfTU9ERUwsIGVycm9yT2JqZWN0KTtcbiAgfTtcblxuICBfcHJvdG8ubG9nRXJyb3JFdmVudCA9IGZ1bmN0aW9uIGxvZ0Vycm9yRXZlbnQoZXJyb3JFdmVudCkge1xuICAgIGlmICh0eXBlb2YgZXJyb3JFdmVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZXJyb3JPYmplY3QgPSB0aGlzLmNyZWF0ZUVycm9yRGF0YU1vZGVsKGVycm9yRXZlbnQpO1xuXG4gICAgaWYgKHR5cGVvZiBlcnJvck9iamVjdC5leGNlcHRpb24ubWVzc2FnZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9hcG1TZXJ2ZXIuYWRkRXJyb3IoZXJyb3JPYmplY3QpO1xuICB9O1xuXG4gIF9wcm90by5yZWdpc3Rlckxpc3RlbmVycyA9IGZ1bmN0aW9uIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoZXJyb3JFdmVudCkge1xuICAgICAgcmV0dXJuIF90aGlzLmxvZ0Vycm9yRXZlbnQoZXJyb3JFdmVudCk7XG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicsIGZ1bmN0aW9uIChwcm9taXNlUmVqZWN0aW9uRXZlbnQpIHtcbiAgICAgIHJldHVybiBfdGhpcy5sb2dQcm9taXNlRXZlbnQocHJvbWlzZVJlamVjdGlvbkV2ZW50KTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8ubG9nUHJvbWlzZUV2ZW50ID0gZnVuY3Rpb24gbG9nUHJvbWlzZUV2ZW50KHByb21pc2VSZWplY3Rpb25FdmVudCkge1xuICAgIHZhciByZWFzb24gPSBwcm9taXNlUmVqZWN0aW9uRXZlbnQucmVhc29uO1xuXG4gICAgaWYgKHJlYXNvbiA9PSBudWxsKSB7XG4gICAgICByZWFzb24gPSAnPG5vIHJlYXNvbiBzcGVjaWZpZWQ+JztcbiAgICB9XG5cbiAgICB2YXIgZXJyb3JFdmVudDtcblxuICAgIGlmICh0eXBlb2YgcmVhc29uLm1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YXIgbmFtZSA9IHJlYXNvbi5uYW1lID8gcmVhc29uLm5hbWUgKyAnOiAnIDogJyc7XG4gICAgICBlcnJvckV2ZW50ID0ge1xuICAgICAgICBlcnJvcjogcmVhc29uLFxuICAgICAgICBtZXNzYWdlOiBQUk9NSVNFX1JFSkVDVElPTl9QUkVGSVggKyBuYW1lICsgcmVhc29uLm1lc3NhZ2VcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yRXZlbnQgPSB0aGlzLl9wYXJzZVJlamVjdFJlYXNvbihyZWFzb24pO1xuICAgIH1cblxuICAgIHRoaXMubG9nRXJyb3JFdmVudChlcnJvckV2ZW50KTtcbiAgfTtcblxuICBfcHJvdG8ubG9nRXJyb3IgPSBmdW5jdGlvbiBsb2dFcnJvcihtZXNzYWdlT3JFcnJvcikge1xuICAgIHZhciBlcnJvckV2ZW50ID0ge307XG5cbiAgICBpZiAodHlwZW9mIG1lc3NhZ2VPckVycm9yID09PSAnc3RyaW5nJykge1xuICAgICAgZXJyb3JFdmVudC5tZXNzYWdlID0gbWVzc2FnZU9yRXJyb3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yRXZlbnQuZXJyb3IgPSBtZXNzYWdlT3JFcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5sb2dFcnJvckV2ZW50KGVycm9yRXZlbnQpO1xuICB9O1xuXG4gIF9wcm90by5fcGFyc2VSZWplY3RSZWFzb24gPSBmdW5jdGlvbiBfcGFyc2VSZWplY3RSZWFzb24ocmVhc29uKSB7XG4gICAgdmFyIGVycm9yRXZlbnQgPSB7XG4gICAgICBtZXNzYWdlOiBQUk9NSVNFX1JFSkVDVElPTl9QUkVGSVhcbiAgICB9O1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmVhc29uKSkge1xuICAgICAgZXJyb3JFdmVudC5tZXNzYWdlICs9ICc8b2JqZWN0Pic7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVhc29uID09PSAnb2JqZWN0Jykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZXJyb3JFdmVudC5tZXNzYWdlICs9IEpTT04uc3RyaW5naWZ5KHJlYXNvbik7XG4gICAgICAgIGVycm9yRXZlbnQuZXJyb3IgPSByZWFzb247XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBlcnJvckV2ZW50Lm1lc3NhZ2UgKz0gJzxvYmplY3Q+JztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZWFzb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGVycm9yRXZlbnQubWVzc2FnZSArPSAnPGZ1bmN0aW9uPic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9yRXZlbnQubWVzc2FnZSArPSByZWFzb247XG4gICAgfVxuXG4gICAgcmV0dXJuIGVycm9yRXZlbnQ7XG4gIH07XG5cbiAgcmV0dXJuIEVycm9yTG9nZ2luZztcbn0oKTtcblxuZXhwb3J0IGRlZmF1bHQgRXJyb3JMb2dnaW5nOyIsImltcG9ydCBFcnJvckxvZ2dpbmcgZnJvbSAnLi9lcnJvci1sb2dnaW5nJztcbmltcG9ydCB7IENPTkZJR19TRVJWSUNFLCBUUkFOU0FDVElPTl9TRVJWSUNFLCBFUlJPUl9MT0dHSU5HLCBBUE1fU0VSVkVSIH0gZnJvbSAnLi4vY29tbW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBzZXJ2aWNlQ3JlYXRvcnMgfSBmcm9tICcuLi9jb21tb24vc2VydmljZS1mYWN0b3J5JztcblxuZnVuY3Rpb24gcmVnaXN0ZXJTZXJ2aWNlcygpIHtcbiAgc2VydmljZUNyZWF0b3JzW0VSUk9SX0xPR0dJTkddID0gZnVuY3Rpb24gKHNlcnZpY2VGYWN0b3J5KSB7XG4gICAgdmFyIF9zZXJ2aWNlRmFjdG9yeSRnZXRTZSA9IHNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoW0FQTV9TRVJWRVIsIENPTkZJR19TRVJWSUNFLCBUUkFOU0FDVElPTl9TRVJWSUNFXSksXG4gICAgICAgIGFwbVNlcnZlciA9IF9zZXJ2aWNlRmFjdG9yeSRnZXRTZVswXSxcbiAgICAgICAgY29uZmlnU2VydmljZSA9IF9zZXJ2aWNlRmFjdG9yeSRnZXRTZVsxXSxcbiAgICAgICAgdHJhbnNhY3Rpb25TZXJ2aWNlID0gX3NlcnZpY2VGYWN0b3J5JGdldFNlWzJdO1xuXG4gICAgcmV0dXJuIG5ldyBFcnJvckxvZ2dpbmcoYXBtU2VydmVyLCBjb25maWdTZXJ2aWNlLCB0cmFuc2FjdGlvblNlcnZpY2UpO1xuICB9O1xufVxuXG5leHBvcnQgeyByZWdpc3RlclNlcnZpY2VzIH07IiwiZnVuY3Rpb24gZmlsZVBhdGhUb0ZpbGVOYW1lKGZpbGVVcmwpIHtcbiAgdmFyIG9yaWdpbiA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4gfHwgd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSArICh3aW5kb3cubG9jYXRpb24ucG9ydCA/ICc6JyArIHdpbmRvdy5sb2NhdGlvbi5wb3J0IDogJycpO1xuXG4gIGlmIChmaWxlVXJsLmluZGV4T2Yob3JpZ2luKSA+IC0xKSB7XG4gICAgZmlsZVVybCA9IGZpbGVVcmwucmVwbGFjZShvcmlnaW4gKyAnLycsICcnKTtcbiAgfVxuXG4gIHJldHVybiBmaWxlVXJsO1xufVxuXG5mdW5jdGlvbiBjbGVhbkZpbGVQYXRoKGZpbGVQYXRoKSB7XG4gIGlmIChmaWxlUGF0aCA9PT0gdm9pZCAwKSB7XG4gICAgZmlsZVBhdGggPSAnJztcbiAgfVxuXG4gIGlmIChmaWxlUGF0aCA9PT0gJzxhbm9ueW1vdXM+Jykge1xuICAgIGZpbGVQYXRoID0gJyc7XG4gIH1cblxuICByZXR1cm4gZmlsZVBhdGg7XG59XG5cbmZ1bmN0aW9uIGlzRmlsZUlubGluZShmaWxlVXJsKSB7XG4gIGlmIChmaWxlVXJsKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoZmlsZVVybCkgPT09IDA7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0YWNrRnJhbWVzKHN0YWNrRnJhbWVzKSB7XG4gIHJldHVybiBzdGFja0ZyYW1lcy5tYXAoZnVuY3Rpb24gKGZyYW1lKSB7XG4gICAgaWYgKGZyYW1lLmZ1bmN0aW9uTmFtZSkge1xuICAgICAgZnJhbWUuZnVuY3Rpb25OYW1lID0gbm9ybWFsaXplRnVuY3Rpb25OYW1lKGZyYW1lLmZ1bmN0aW9uTmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyYW1lO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplRnVuY3Rpb25OYW1lKGZuTmFtZSkge1xuICB2YXIgcGFydHMgPSBmbk5hbWUuc3BsaXQoJy8nKTtcblxuICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgIGZuTmFtZSA9IFsnT2JqZWN0JywgcGFydHNbcGFydHMubGVuZ3RoIC0gMV1dLmpvaW4oJy4nKTtcbiAgfSBlbHNlIHtcbiAgICBmbk5hbWUgPSBwYXJ0c1swXTtcbiAgfVxuXG4gIGZuTmFtZSA9IGZuTmFtZS5yZXBsYWNlKC8uPCQvZ2ksICcuPGFub255bW91cz4nKTtcbiAgZm5OYW1lID0gZm5OYW1lLnJlcGxhY2UoL15Bbm9ueW1vdXMgZnVuY3Rpb24kLywgJzxhbm9ueW1vdXM+Jyk7XG4gIHBhcnRzID0gZm5OYW1lLnNwbGl0KCcuJyk7XG5cbiAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICBmbk5hbWUgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgfSBlbHNlIHtcbiAgICBmbk5hbWUgPSBwYXJ0c1swXTtcbiAgfVxuXG4gIHJldHVybiBmbk5hbWU7XG59XG5cbmZ1bmN0aW9uIGlzVmFsaWRTdGFja1RyYWNlKHN0YWNrVHJhY2VzKSB7XG4gIGlmIChzdGFja1RyYWNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc3RhY2tUcmFjZXMubGVuZ3RoID09PSAxKSB7XG4gICAgdmFyIHN0YWNrVHJhY2UgPSBzdGFja1RyYWNlc1swXTtcbiAgICByZXR1cm4gJ2xpbmVOdW1iZXInIGluIHN0YWNrVHJhY2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YWNrVHJhY2VzKHN0YWNrUGFyc2VyLCBlcnJvckV2ZW50KSB7XG4gIHZhciBlcnJvciA9IGVycm9yRXZlbnQuZXJyb3IsXG4gICAgICBmaWxlbmFtZSA9IGVycm9yRXZlbnQuZmlsZW5hbWUsXG4gICAgICBsaW5lbm8gPSBlcnJvckV2ZW50LmxpbmVubyxcbiAgICAgIGNvbG5vID0gZXJyb3JFdmVudC5jb2xubztcbiAgdmFyIHN0YWNrVHJhY2VzID0gW107XG5cbiAgaWYgKGVycm9yKSB7XG4gICAgdHJ5IHtcbiAgICAgIHN0YWNrVHJhY2VzID0gc3RhY2tQYXJzZXIucGFyc2UoZXJyb3IpO1xuICAgIH0gY2F0Y2ggKGUpIHt9XG4gIH1cblxuICBpZiAoIWlzVmFsaWRTdGFja1RyYWNlKHN0YWNrVHJhY2VzKSkge1xuICAgIHN0YWNrVHJhY2VzID0gW3tcbiAgICAgIGZpbGVOYW1lOiBmaWxlbmFtZSxcbiAgICAgIGxpbmVOdW1iZXI6IGxpbmVubyxcbiAgICAgIGNvbHVtbk51bWJlcjogY29sbm9cbiAgICB9XTtcbiAgfVxuXG4gIHZhciBub3JtYWxpemVkU3RhY2tUcmFjZXMgPSBub3JtYWxpemVTdGFja0ZyYW1lcyhzdGFja1RyYWNlcyk7XG4gIHJldHVybiBub3JtYWxpemVkU3RhY2tUcmFjZXMubWFwKGZ1bmN0aW9uIChzdGFjaykge1xuICAgIHZhciBmaWxlTmFtZSA9IHN0YWNrLmZpbGVOYW1lLFxuICAgICAgICBsaW5lTnVtYmVyID0gc3RhY2subGluZU51bWJlcixcbiAgICAgICAgY29sdW1uTnVtYmVyID0gc3RhY2suY29sdW1uTnVtYmVyLFxuICAgICAgICBfc3RhY2skZnVuY3Rpb25OYW1lID0gc3RhY2suZnVuY3Rpb25OYW1lLFxuICAgICAgICBmdW5jdGlvbk5hbWUgPSBfc3RhY2skZnVuY3Rpb25OYW1lID09PSB2b2lkIDAgPyAnPGFub255bW91cz4nIDogX3N0YWNrJGZ1bmN0aW9uTmFtZTtcblxuICAgIGlmICghZmlsZU5hbWUgJiYgIWxpbmVOdW1iZXIpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBpZiAoIWNvbHVtbk51bWJlciAmJiAhbGluZU51bWJlcikge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIHZhciBmaWxlUGF0aCA9IGNsZWFuRmlsZVBhdGgoZmlsZU5hbWUpO1xuICAgIHZhciBjbGVhbmVkRmlsZU5hbWUgPSBmaWxlUGF0aFRvRmlsZU5hbWUoZmlsZVBhdGgpO1xuXG4gICAgaWYgKGlzRmlsZUlubGluZShmaWxlUGF0aCkpIHtcbiAgICAgIGNsZWFuZWRGaWxlTmFtZSA9ICcoaW5saW5lIHNjcmlwdCknO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhYnNfcGF0aDogZmlsZU5hbWUsXG4gICAgICBmaWxlbmFtZTogY2xlYW5lZEZpbGVOYW1lLFxuICAgICAgZnVuY3Rpb246IGZ1bmN0aW9uTmFtZSxcbiAgICAgIGxpbmVubzogbGluZU51bWJlcixcbiAgICAgIGNvbG5vOiBjb2x1bW5OdW1iZXJcbiAgICB9O1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJJbnZhbGlkRnJhbWVzKGZyYW1lcykge1xuICByZXR1cm4gZnJhbWVzLmZpbHRlcihmdW5jdGlvbiAoX3JlZikge1xuICAgIHZhciBmaWxlbmFtZSA9IF9yZWYuZmlsZW5hbWUsXG4gICAgICAgIGxpbmVubyA9IF9yZWYubGluZW5vO1xuICAgIHJldHVybiB0eXBlb2YgZmlsZW5hbWUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBsaW5lbm8gIT09ICd1bmRlZmluZWQnO1xuICB9KTtcbn0iLCJpbXBvcnQgeyByZWdpc3RlclNlcnZpY2VzIGFzIHJlZ2lzdGVyRXJyb3JTZXJ2aWNlcyB9IGZyb20gJy4vZXJyb3ItbG9nZ2luZyc7XG5pbXBvcnQgeyByZWdpc3RlclNlcnZpY2VzIGFzIHJlZ2lzdGVyUGVyZlNlcnZpY2VzLCBvYnNlcnZlVXNlckludGVyYWN0aW9ucyB9IGZyb20gJy4vcGVyZm9ybWFuY2UtbW9uaXRvcmluZyc7XG5pbXBvcnQgeyBTZXJ2aWNlRmFjdG9yeSB9IGZyb20gJy4vY29tbW9uL3NlcnZpY2UtZmFjdG9yeSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtU3VwcG9ydGVkLCBzY2hlZHVsZU1pY3JvVGFzaywgc2NoZWR1bGVNYWNyb1Rhc2ssIGlzQnJvd3NlciB9IGZyb20gJy4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IHBhdGNoQWxsLCBwYXRjaEV2ZW50SGFuZGxlciB9IGZyb20gJy4vY29tbW9uL3BhdGNoaW5nJztcbmltcG9ydCB7IG9ic2VydmVQYWdlVmlzaWJpbGl0eSwgb2JzZXJ2ZVBhZ2VDbGlja3MgfSBmcm9tICcuL2NvbW1vbi9vYnNlcnZlcnMnO1xuaW1wb3J0IHsgUEFHRV9MT0FEX0RFTEFZLCBQQUdFX0xPQUQsIEVSUk9SLCBDT05GSUdfU0VSVklDRSwgTE9HR0lOR19TRVJWSUNFLCBUUkFOU0FDVElPTl9TRVJWSUNFLCBBUE1fU0VSVkVSLCBQRVJGT1JNQU5DRV9NT05JVE9SSU5HLCBFUlJPUl9MT0dHSU5HLCBFVkVOVF9UQVJHRVQsIENMSUNLIH0gZnJvbSAnLi9jb21tb24vY29uc3RhbnRzJztcbmltcG9ydCB7IGdldEluc3RydW1lbnRhdGlvbkZsYWdzIH0gZnJvbSAnLi9jb21tb24vaW5zdHJ1bWVudCc7XG5pbXBvcnQgYWZ0ZXJGcmFtZSBmcm9tICcuL2NvbW1vbi9hZnRlci1mcmFtZSc7XG5pbXBvcnQgeyBib290c3RyYXAgfSBmcm9tICcuL2Jvb3RzdHJhcCc7XG5pbXBvcnQgeyBjcmVhdGVUcmFjZXIgfSBmcm9tICcuL29wZW50cmFjaW5nJztcblxuZnVuY3Rpb24gY3JlYXRlU2VydmljZUZhY3RvcnkoKSB7XG4gIHJlZ2lzdGVyUGVyZlNlcnZpY2VzKCk7XG4gIHJlZ2lzdGVyRXJyb3JTZXJ2aWNlcygpO1xuICB2YXIgc2VydmljZUZhY3RvcnkgPSBuZXcgU2VydmljZUZhY3RvcnkoKTtcbiAgcmV0dXJuIHNlcnZpY2VGYWN0b3J5O1xufVxuXG5leHBvcnQgeyBjcmVhdGVTZXJ2aWNlRmFjdG9yeSwgU2VydmljZUZhY3RvcnksIHBhdGNoQWxsLCBwYXRjaEV2ZW50SGFuZGxlciwgaXNQbGF0Zm9ybVN1cHBvcnRlZCwgaXNCcm93c2VyLCBnZXRJbnN0cnVtZW50YXRpb25GbGFncywgY3JlYXRlVHJhY2VyLCBzY2hlZHVsZU1pY3JvVGFzaywgc2NoZWR1bGVNYWNyb1Rhc2ssIGFmdGVyRnJhbWUsIEVSUk9SLCBQQUdFX0xPQURfREVMQVksIFBBR0VfTE9BRCwgQ09ORklHX1NFUlZJQ0UsIExPR0dJTkdfU0VSVklDRSwgVFJBTlNBQ1RJT05fU0VSVklDRSwgQVBNX1NFUlZFUiwgUEVSRk9STUFOQ0VfTU9OSVRPUklORywgRVJST1JfTE9HR0lORywgRVZFTlRfVEFSR0VULCBDTElDSywgb2JzZXJ2ZVVzZXJJbnRlcmFjdGlvbnMsIGJvb3RzdHJhcCwgb2JzZXJ2ZVBhZ2VWaXNpYmlsaXR5LCBvYnNlcnZlUGFnZUNsaWNrcyB9OyIsImltcG9ydCBUcmFjZXIgZnJvbSAnLi90cmFjZXInO1xuaW1wb3J0IFNwYW4gZnJvbSAnLi9zcGFuJztcbmltcG9ydCB7IFRSQU5TQUNUSU9OX1NFUlZJQ0UsIExPR0dJTkdfU0VSVklDRSwgUEVSRk9STUFOQ0VfTU9OSVRPUklORywgRVJST1JfTE9HR0lORyB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuXG5mdW5jdGlvbiBjcmVhdGVUcmFjZXIoc2VydmljZUZhY3RvcnkpIHtcbiAgdmFyIHBlcmZvcm1hbmNlTW9uaXRvcmluZyA9IHNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoUEVSRk9STUFOQ0VfTU9OSVRPUklORyk7XG4gIHZhciB0cmFuc2FjdGlvblNlcnZpY2UgPSBzZXJ2aWNlRmFjdG9yeS5nZXRTZXJ2aWNlKFRSQU5TQUNUSU9OX1NFUlZJQ0UpO1xuICB2YXIgZXJyb3JMb2dnaW5nID0gc2VydmljZUZhY3RvcnkuZ2V0U2VydmljZShFUlJPUl9MT0dHSU5HKTtcbiAgdmFyIGxvZ2dpbmdTZXJ2aWNlID0gc2VydmljZUZhY3RvcnkuZ2V0U2VydmljZShMT0dHSU5HX1NFUlZJQ0UpO1xuICByZXR1cm4gbmV3IFRyYWNlcihwZXJmb3JtYW5jZU1vbml0b3JpbmcsIHRyYW5zYWN0aW9uU2VydmljZSwgbG9nZ2luZ1NlcnZpY2UsIGVycm9yTG9nZ2luZyk7XG59XG5cbmV4cG9ydCB7IFNwYW4sIFRyYWNlciwgY3JlYXRlVHJhY2VyIH07IiwiZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmltcG9ydCB7IFNwYW4gYXMgb3RTcGFuIH0gZnJvbSAnb3BlbnRyYWNpbmcvbGliL3NwYW4nO1xuaW1wb3J0IHsgZXh0ZW5kLCBnZXRUaW1lT3JpZ2luIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCBUcmFuc2FjdGlvbiBmcm9tICcuLi9wZXJmb3JtYW5jZS1tb25pdG9yaW5nL3RyYW5zYWN0aW9uJztcblxudmFyIFNwYW4gPSBmdW5jdGlvbiAoX290U3Bhbikge1xuICBfaW5oZXJpdHNMb29zZShTcGFuLCBfb3RTcGFuKTtcblxuICBmdW5jdGlvbiBTcGFuKHRyYWNlciwgc3Bhbikge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX290U3Bhbi5jYWxsKHRoaXMpIHx8IHRoaXM7XG4gICAgX3RoaXMuX190cmFjZXIgPSB0cmFjZXI7XG4gICAgX3RoaXMuc3BhbiA9IHNwYW47XG4gICAgX3RoaXMuaXNUcmFuc2FjdGlvbiA9IHNwYW4gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbjtcbiAgICBfdGhpcy5zcGFuQ29udGV4dCA9IHtcbiAgICAgIGlkOiBzcGFuLmlkLFxuICAgICAgdHJhY2VJZDogc3Bhbi50cmFjZUlkLFxuICAgICAgc2FtcGxlZDogc3Bhbi5zYW1wbGVkXG4gICAgfTtcbiAgICByZXR1cm4gX3RoaXM7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gU3Bhbi5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9jb250ZXh0ID0gZnVuY3Rpb24gX2NvbnRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3BhbkNvbnRleHQ7XG4gIH07XG5cbiAgX3Byb3RvLl90cmFjZXIgPSBmdW5jdGlvbiBfdHJhY2VyKCkge1xuICAgIHJldHVybiB0aGlzLl9fdHJhY2VyO1xuICB9O1xuXG4gIF9wcm90by5fc2V0T3BlcmF0aW9uTmFtZSA9IGZ1bmN0aW9uIF9zZXRPcGVyYXRpb25OYW1lKG5hbWUpIHtcbiAgICB0aGlzLnNwYW4ubmFtZSA9IG5hbWU7XG4gIH07XG5cbiAgX3Byb3RvLl9hZGRUYWdzID0gZnVuY3Rpb24gX2FkZFRhZ3Moa2V5VmFsdWVQYWlycykge1xuICAgIHZhciB0YWdzID0gZXh0ZW5kKHt9LCBrZXlWYWx1ZVBhaXJzKTtcblxuICAgIGlmICh0YWdzLnR5cGUpIHtcbiAgICAgIHRoaXMuc3Bhbi50eXBlID0gdGFncy50eXBlO1xuICAgICAgZGVsZXRlIHRhZ3MudHlwZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1RyYW5zYWN0aW9uKSB7XG4gICAgICB2YXIgdXNlcklkID0gdGFnc1sndXNlci5pZCddO1xuICAgICAgdmFyIHVzZXJuYW1lID0gdGFnc1sndXNlci51c2VybmFtZSddO1xuICAgICAgdmFyIGVtYWlsID0gdGFnc1sndXNlci5lbWFpbCddO1xuXG4gICAgICBpZiAodXNlcklkIHx8IHVzZXJuYW1lIHx8IGVtYWlsKSB7XG4gICAgICAgIHRoaXMuc3Bhbi5hZGRDb250ZXh0KHtcbiAgICAgICAgICB1c2VyOiB7XG4gICAgICAgICAgICBpZDogdXNlcklkLFxuICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgICAgZW1haWw6IGVtYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZGVsZXRlIHRhZ3NbJ3VzZXIuaWQnXTtcbiAgICAgICAgZGVsZXRlIHRhZ3NbJ3VzZXIudXNlcm5hbWUnXTtcbiAgICAgICAgZGVsZXRlIHRhZ3NbJ3VzZXIuZW1haWwnXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNwYW4uYWRkTGFiZWxzKHRhZ3MpO1xuICB9O1xuXG4gIF9wcm90by5fbG9nID0gZnVuY3Rpb24gX2xvZyhsb2csIHRpbWVzdGFtcCkge1xuICAgIGlmIChsb2cuZXZlbnQgPT09ICdlcnJvcicpIHtcbiAgICAgIGlmIChsb2dbJ2Vycm9yLm9iamVjdCddKSB7XG4gICAgICAgIHRoaXMuX190cmFjZXIuZXJyb3JMb2dnaW5nLmxvZ0Vycm9yKGxvZ1snZXJyb3Iub2JqZWN0J10pO1xuICAgICAgfSBlbHNlIGlmIChsb2cubWVzc2FnZSkge1xuICAgICAgICB0aGlzLl9fdHJhY2VyLmVycm9yTG9nZ2luZy5sb2dFcnJvcihsb2cubWVzc2FnZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5fZmluaXNoID0gZnVuY3Rpb24gX2ZpbmlzaChmaW5pc2hUaW1lKSB7XG4gICAgdGhpcy5zcGFuLmVuZCgpO1xuXG4gICAgaWYgKGZpbmlzaFRpbWUpIHtcbiAgICAgIHRoaXMuc3Bhbi5fZW5kID0gZmluaXNoVGltZSAtIGdldFRpbWVPcmlnaW4oKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFNwYW47XG59KG90U3Bhbik7XG5cbmV4cG9ydCBkZWZhdWx0IFNwYW47IiwiZnVuY3Rpb24gX2luaGVyaXRzTG9vc2Uoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpIHsgc3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckNsYXNzLnByb3RvdHlwZSk7IHN1YkNsYXNzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IHN1YkNsYXNzOyBfc2V0UHJvdG90eXBlT2Yoc3ViQ2xhc3MsIHN1cGVyQ2xhc3MpOyB9XG5cbmZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IF9zZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCBmdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBvLl9fcHJvdG9fXyA9IHA7IHJldHVybiBvOyB9OyByZXR1cm4gX3NldFByb3RvdHlwZU9mKG8sIHApOyB9XG5cbmltcG9ydCB7IFRyYWNlciBhcyBvdFRyYWNlciB9IGZyb20gJ29wZW50cmFjaW5nL2xpYi90cmFjZXInO1xuaW1wb3J0IHsgUkVGRVJFTkNFX0NISUxEX09GLCBGT1JNQVRfVEVYVF9NQVAsIEZPUk1BVF9IVFRQX0hFQURFUlMsIEZPUk1BVF9CSU5BUlkgfSBmcm9tICdvcGVudHJhY2luZy9saWIvY29uc3RhbnRzJztcbmltcG9ydCB7IFNwYW4gYXMgTm9vcFNwYW4gfSBmcm9tICdvcGVudHJhY2luZy9saWIvc3Bhbic7XG5pbXBvcnQgeyBnZXRUaW1lT3JpZ2luLCBmaW5kIH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCB7IF9fREVWX18gfSBmcm9tICcuLi9zdGF0ZSc7XG5pbXBvcnQgU3BhbiBmcm9tICcuL3NwYW4nO1xuXG52YXIgVHJhY2VyID0gZnVuY3Rpb24gKF9vdFRyYWNlcikge1xuICBfaW5oZXJpdHNMb29zZShUcmFjZXIsIF9vdFRyYWNlcik7XG5cbiAgZnVuY3Rpb24gVHJhY2VyKHBlcmZvcm1hbmNlTW9uaXRvcmluZywgdHJhbnNhY3Rpb25TZXJ2aWNlLCBsb2dnaW5nU2VydmljZSwgZXJyb3JMb2dnaW5nKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgX3RoaXMgPSBfb3RUcmFjZXIuY2FsbCh0aGlzKSB8fCB0aGlzO1xuICAgIF90aGlzLnBlcmZvcm1hbmNlTW9uaXRvcmluZyA9IHBlcmZvcm1hbmNlTW9uaXRvcmluZztcbiAgICBfdGhpcy50cmFuc2FjdGlvblNlcnZpY2UgPSB0cmFuc2FjdGlvblNlcnZpY2U7XG4gICAgX3RoaXMubG9nZ2luZ1NlcnZpY2UgPSBsb2dnaW5nU2VydmljZTtcbiAgICBfdGhpcy5lcnJvckxvZ2dpbmcgPSBlcnJvckxvZ2dpbmc7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFRyYWNlci5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLl9zdGFydFNwYW4gPSBmdW5jdGlvbiBfc3RhcnRTcGFuKG5hbWUsIG9wdGlvbnMpIHtcbiAgICB2YXIgc3Bhbk9wdGlvbnMgPSB7XG4gICAgICBtYW5hZ2VkOiB0cnVlXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zKSB7XG4gICAgICBzcGFuT3B0aW9ucy50aW1lc3RhbXAgPSBvcHRpb25zLnN0YXJ0VGltZTtcblxuICAgICAgaWYgKG9wdGlvbnMuY2hpbGRPZikge1xuICAgICAgICBzcGFuT3B0aW9ucy5wYXJlbnRJZCA9IG9wdGlvbnMuY2hpbGRPZi5pZDtcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5yZWZlcmVuY2VzICYmIG9wdGlvbnMucmVmZXJlbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGlmIChvcHRpb25zLnJlZmVyZW5jZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dpbmdTZXJ2aWNlLmRlYnVnKCdFbGFzdGljIEFQTSBPcGVuVHJhY2luZzogVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIHJlZmVyZW5jZXMsIG9ubHkgdGhlIGZpcnN0IGNoaWxkT2YgcmVmZXJlbmNlIHdpbGwgYmUgcmVjb3JkZWQuJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNoaWxkUmVmID0gZmluZChvcHRpb25zLnJlZmVyZW5jZXMsIGZ1bmN0aW9uIChyZWYpIHtcbiAgICAgICAgICByZXR1cm4gcmVmLnR5cGUoKSA9PT0gUkVGRVJFTkNFX0NISUxEX09GO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY2hpbGRSZWYpIHtcbiAgICAgICAgICBzcGFuT3B0aW9ucy5wYXJlbnRJZCA9IGNoaWxkUmVmLnJlZmVyZW5jZWRDb250ZXh0KCkuaWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgc3BhbjtcbiAgICB2YXIgY3VycmVudFRyYW5zYWN0aW9uID0gdGhpcy50cmFuc2FjdGlvblNlcnZpY2UuZ2V0Q3VycmVudFRyYW5zYWN0aW9uKCk7XG5cbiAgICBpZiAoY3VycmVudFRyYW5zYWN0aW9uKSB7XG4gICAgICBzcGFuID0gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uuc3RhcnRTcGFuKG5hbWUsIHVuZGVmaW5lZCwgc3Bhbk9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzcGFuID0gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uuc3RhcnRUcmFuc2FjdGlvbihuYW1lLCB1bmRlZmluZWQsIHNwYW5PcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoIXNwYW4pIHtcbiAgICAgIHJldHVybiBuZXcgTm9vcFNwYW4oKTtcbiAgICB9XG5cbiAgICBpZiAoc3Bhbk9wdGlvbnMudGltZXN0YW1wKSB7XG4gICAgICBzcGFuLl9zdGFydCA9IHNwYW5PcHRpb25zLnRpbWVzdGFtcCAtIGdldFRpbWVPcmlnaW4oKTtcbiAgICB9XG5cbiAgICB2YXIgb3RTcGFuID0gbmV3IFNwYW4odGhpcywgc3Bhbik7XG5cbiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnRhZ3MpIHtcbiAgICAgIG90U3Bhbi5hZGRUYWdzKG9wdGlvbnMudGFncyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG90U3BhbjtcbiAgfTtcblxuICBfcHJvdG8uX2luamVjdCA9IGZ1bmN0aW9uIF9pbmplY3Qoc3BhbkNvbnRleHQsIGZvcm1hdCwgY2Fycmllcikge1xuICAgIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgICBjYXNlIEZPUk1BVF9URVhUX01BUDpcbiAgICAgIGNhc2UgRk9STUFUX0hUVFBfSEVBREVSUzpcbiAgICAgICAgdGhpcy5wZXJmb3JtYW5jZU1vbml0b3JpbmcuaW5qZWN0RHRIZWFkZXIoc3BhbkNvbnRleHQsIGNhcnJpZXIpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBGT1JNQVRfQklOQVJZOlxuICAgICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICAgIHRoaXMubG9nZ2luZ1NlcnZpY2UuZGVidWcoJ0VsYXN0aWMgQVBNIE9wZW5UcmFjaW5nOiBiaW5hcnkgY2FycmllciBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uX2V4dHJhY3QgPSBmdW5jdGlvbiBfZXh0cmFjdChmb3JtYXQsIGNhcnJpZXIpIHtcbiAgICB2YXIgY3R4O1xuXG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgRk9STUFUX1RFWFRfTUFQOlxuICAgICAgY2FzZSBGT1JNQVRfSFRUUF9IRUFERVJTOlxuICAgICAgICBjdHggPSB0aGlzLnBlcmZvcm1hbmNlTW9uaXRvcmluZy5leHRyYWN0RHRIZWFkZXIoY2Fycmllcik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEZPUk1BVF9CSU5BUlk6XG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgdGhpcy5sb2dnaW5nU2VydmljZS5kZWJ1ZygnRWxhc3RpYyBBUE0gT3BlblRyYWNpbmc6IGJpbmFyeSBjYXJyaWVyIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKCFjdHgpIHtcbiAgICAgIGN0eCA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGN0eDtcbiAgfTtcblxuICByZXR1cm4gVHJhY2VyO1xufShvdFRyYWNlcik7XG5cbmV4cG9ydCBkZWZhdWx0IFRyYWNlcjsiLCJpbXBvcnQgeyBnZXREdXJhdGlvbiwgUEVSRiB9IGZyb20gJy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBQQUdFX0xPQUQsIFRSVU5DQVRFRF9UWVBFIH0gZnJvbSAnLi4vY29tbW9uL2NvbnN0YW50cyc7XG52YXIgcGFnZUxvYWRCcmVha2Rvd25zID0gW1snZG9tYWluTG9va3VwU3RhcnQnLCAnZG9tYWluTG9va3VwRW5kJywgJ0ROUyddLCBbJ2Nvbm5lY3RTdGFydCcsICdjb25uZWN0RW5kJywgJ1RDUCddLCBbJ3JlcXVlc3RTdGFydCcsICdyZXNwb25zZVN0YXJ0JywgJ1JlcXVlc3QnXSwgWydyZXNwb25zZVN0YXJ0JywgJ3Jlc3BvbnNlRW5kJywgJ1Jlc3BvbnNlJ10sIFsnZG9tTG9hZGluZycsICdkb21Db21wbGV0ZScsICdQcm9jZXNzaW5nJ10sIFsnbG9hZEV2ZW50U3RhcnQnLCAnbG9hZEV2ZW50RW5kJywgJ0xvYWQnXV07XG5cbmZ1bmN0aW9uIGdldFZhbHVlKHZhbHVlKSB7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHZhbHVlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNhbGN1bGF0ZVNlbGZUaW1lKHRyYW5zYWN0aW9uKSB7XG4gIHZhciBzcGFucyA9IHRyYW5zYWN0aW9uLnNwYW5zLFxuICAgICAgX3N0YXJ0ID0gdHJhbnNhY3Rpb24uX3N0YXJ0LFxuICAgICAgX2VuZCA9IHRyYW5zYWN0aW9uLl9lbmQ7XG5cbiAgaWYgKHNwYW5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cmFuc2FjdGlvbi5kdXJhdGlvbigpO1xuICB9XG5cbiAgc3BhbnMuc29ydChmdW5jdGlvbiAoc3BhbjEsIHNwYW4yKSB7XG4gICAgcmV0dXJuIHNwYW4xLl9zdGFydCAtIHNwYW4yLl9zdGFydDtcbiAgfSk7XG4gIHZhciBzcGFuID0gc3BhbnNbMF07XG4gIHZhciBzcGFuRW5kID0gc3Bhbi5fZW5kO1xuICB2YXIgc3BhblN0YXJ0ID0gc3Bhbi5fc3RhcnQ7XG4gIHZhciBsYXN0Q29udGludW91c0VuZCA9IHNwYW5FbmQ7XG4gIHZhciBzZWxmVGltZSA9IHNwYW5TdGFydCAtIF9zdGFydDtcblxuICBmb3IgKHZhciBpID0gMTsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgc3BhbiA9IHNwYW5zW2ldO1xuICAgIHNwYW5TdGFydCA9IHNwYW4uX3N0YXJ0O1xuICAgIHNwYW5FbmQgPSBzcGFuLl9lbmQ7XG5cbiAgICBpZiAoc3BhblN0YXJ0ID4gbGFzdENvbnRpbnVvdXNFbmQpIHtcbiAgICAgIHNlbGZUaW1lICs9IHNwYW5TdGFydCAtIGxhc3RDb250aW51b3VzRW5kO1xuICAgICAgbGFzdENvbnRpbnVvdXNFbmQgPSBzcGFuRW5kO1xuICAgIH0gZWxzZSBpZiAoc3BhbkVuZCA+IGxhc3RDb250aW51b3VzRW5kKSB7XG4gICAgICBsYXN0Q29udGludW91c0VuZCA9IHNwYW5FbmQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxhc3RDb250aW51b3VzRW5kIDwgX2VuZCkge1xuICAgIHNlbGZUaW1lICs9IF9lbmQgLSBsYXN0Q29udGludW91c0VuZDtcbiAgfVxuXG4gIHJldHVybiBzZWxmVGltZTtcbn1cblxuZnVuY3Rpb24gZ3JvdXBTcGFucyh0cmFuc2FjdGlvbikge1xuICB2YXIgc3Bhbk1hcCA9IHt9O1xuICB2YXIgdHJhbnNhY3Rpb25TZWxmVGltZSA9IGNhbGN1bGF0ZVNlbGZUaW1lKHRyYW5zYWN0aW9uKTtcbiAgc3Bhbk1hcFsnYXBwJ10gPSB7XG4gICAgY291bnQ6IDEsXG4gICAgZHVyYXRpb246IHRyYW5zYWN0aW9uU2VsZlRpbWVcbiAgfTtcbiAgdmFyIHNwYW5zID0gdHJhbnNhY3Rpb24uc3BhbnM7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBzcGFuID0gc3BhbnNbaV07XG4gICAgdmFyIGR1cmF0aW9uID0gc3Bhbi5kdXJhdGlvbigpO1xuXG4gICAgaWYgKGR1cmF0aW9uID09PSAwIHx8IGR1cmF0aW9uID09IG51bGwpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciB0eXBlID0gc3Bhbi50eXBlLFxuICAgICAgICBzdWJ0eXBlID0gc3Bhbi5zdWJ0eXBlO1xuICAgIHZhciBrZXkgPSB0eXBlLnJlcGxhY2UoVFJVTkNBVEVEX1RZUEUsICcnKTtcblxuICAgIGlmIChzdWJ0eXBlKSB7XG4gICAgICBrZXkgKz0gJy4nICsgc3VidHlwZTtcbiAgICB9XG5cbiAgICBpZiAoIXNwYW5NYXBba2V5XSkge1xuICAgICAgc3Bhbk1hcFtrZXldID0ge1xuICAgICAgICBkdXJhdGlvbjogMCxcbiAgICAgICAgY291bnQ6IDBcbiAgICAgIH07XG4gICAgfVxuXG4gICAgc3Bhbk1hcFtrZXldLmNvdW50Kys7XG4gICAgc3Bhbk1hcFtrZXldLmR1cmF0aW9uICs9IGR1cmF0aW9uO1xuICB9XG5cbiAgcmV0dXJuIHNwYW5NYXA7XG59XG5cbmZ1bmN0aW9uIGdldFNwYW5CcmVha2Rvd24odHJhbnNhY3Rpb25EZXRhaWxzLCBfcmVmKSB7XG4gIHZhciBkZXRhaWxzID0gX3JlZi5kZXRhaWxzLFxuICAgICAgX3JlZiRjb3VudCA9IF9yZWYuY291bnQsXG4gICAgICBjb3VudCA9IF9yZWYkY291bnQgPT09IHZvaWQgMCA/IDEgOiBfcmVmJGNvdW50LFxuICAgICAgZHVyYXRpb24gPSBfcmVmLmR1cmF0aW9uO1xuICByZXR1cm4ge1xuICAgIHRyYW5zYWN0aW9uOiB0cmFuc2FjdGlvbkRldGFpbHMsXG4gICAgc3BhbjogZGV0YWlscyxcbiAgICBzYW1wbGVzOiB7XG4gICAgICAnc3Bhbi5zZWxmX3RpbWUuY291bnQnOiBnZXRWYWx1ZShjb3VudCksXG4gICAgICAnc3Bhbi5zZWxmX3RpbWUuc3VtLnVzJzogZ2V0VmFsdWUoZHVyYXRpb24gKiAxMDAwKVxuICAgIH1cbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVCcmVha2Rvd24odHJhbnNhY3Rpb24sIHRpbWluZ3MpIHtcbiAgaWYgKHRpbWluZ3MgPT09IHZvaWQgMCkge1xuICAgIHRpbWluZ3MgPSBQRVJGLnRpbWluZztcbiAgfVxuXG4gIHZhciBicmVha2Rvd25zID0gW107XG4gIHZhciBuYW1lID0gdHJhbnNhY3Rpb24ubmFtZSxcbiAgICAgIHR5cGUgPSB0cmFuc2FjdGlvbi50eXBlLFxuICAgICAgc2FtcGxlZCA9IHRyYW5zYWN0aW9uLnNhbXBsZWQ7XG4gIHZhciB0cmFuc2FjdGlvbkRldGFpbHMgPSB7XG4gICAgbmFtZTogbmFtZSxcbiAgICB0eXBlOiB0eXBlXG4gIH07XG5cbiAgaWYgKCFzYW1wbGVkKSB7XG4gICAgcmV0dXJuIGJyZWFrZG93bnM7XG4gIH1cblxuICBpZiAodHlwZSA9PT0gUEFHRV9MT0FEICYmIHRpbWluZ3MpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhZ2VMb2FkQnJlYWtkb3ducy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGN1cnJlbnQgPSBwYWdlTG9hZEJyZWFrZG93bnNbaV07XG4gICAgICB2YXIgc3RhcnQgPSB0aW1pbmdzW2N1cnJlbnRbMF1dO1xuICAgICAgdmFyIGVuZCA9IHRpbWluZ3NbY3VycmVudFsxXV07XG4gICAgICB2YXIgZHVyYXRpb24gPSBnZXREdXJhdGlvbihzdGFydCwgZW5kKTtcblxuICAgICAgaWYgKGR1cmF0aW9uID09PSAwIHx8IGR1cmF0aW9uID09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrZG93bnMucHVzaChnZXRTcGFuQnJlYWtkb3duKHRyYW5zYWN0aW9uRGV0YWlscywge1xuICAgICAgICBkZXRhaWxzOiB7XG4gICAgICAgICAgdHlwZTogY3VycmVudFsyXVxuICAgICAgICB9LFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25cbiAgICAgIH0pKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIHNwYW5NYXAgPSBncm91cFNwYW5zKHRyYW5zYWN0aW9uKTtcbiAgICBPYmplY3Qua2V5cyhzcGFuTWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHZhciBfa2V5JHNwbGl0ID0ga2V5LnNwbGl0KCcuJyksXG4gICAgICAgICAgdHlwZSA9IF9rZXkkc3BsaXRbMF0sXG4gICAgICAgICAgc3VidHlwZSA9IF9rZXkkc3BsaXRbMV07XG5cbiAgICAgIHZhciBfc3Bhbk1hcCRrZXkgPSBzcGFuTWFwW2tleV0sXG4gICAgICAgICAgZHVyYXRpb24gPSBfc3Bhbk1hcCRrZXkuZHVyYXRpb24sXG4gICAgICAgICAgY291bnQgPSBfc3Bhbk1hcCRrZXkuY291bnQ7XG4gICAgICBicmVha2Rvd25zLnB1c2goZ2V0U3BhbkJyZWFrZG93bih0cmFuc2FjdGlvbkRldGFpbHMsIHtcbiAgICAgICAgZGV0YWlsczoge1xuICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgc3VidHlwZTogc3VidHlwZVxuICAgICAgICB9LFxuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgIGNvdW50OiBjb3VudFxuICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGJyZWFrZG93bnM7XG59IiwiaW1wb3J0IFBlcmZvcm1hbmNlTW9uaXRvcmluZyBmcm9tICcuL3BlcmZvcm1hbmNlLW1vbml0b3JpbmcnO1xuaW1wb3J0IFRyYW5zYWN0aW9uU2VydmljZSBmcm9tICcuL3RyYW5zYWN0aW9uLXNlcnZpY2UnO1xuaW1wb3J0IHsgQVBNX1NFUlZFUiwgQ09ORklHX1NFUlZJQ0UsIExPR0dJTkdfU0VSVklDRSwgVFJBTlNBQ1RJT05fU0VSVklDRSwgUEVSRk9STUFOQ0VfTU9OSVRPUklORyB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgc2VydmljZUNyZWF0b3JzIH0gZnJvbSAnLi4vY29tbW9uL3NlcnZpY2UtZmFjdG9yeSc7XG5pbXBvcnQgeyBvYnNlcnZlVXNlckludGVyYWN0aW9ucyB9IGZyb20gJy4vbWV0cmljcy9pbnAvcHJvY2Vzcyc7XG5pbXBvcnQgeyByZXBvcnRJbnAgfSBmcm9tICcuL21ldHJpY3MvaW5wL3JlcG9ydCc7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyU2VydmljZXMoKSB7XG4gIHNlcnZpY2VDcmVhdG9yc1tUUkFOU0FDVElPTl9TRVJWSUNFXSA9IGZ1bmN0aW9uIChzZXJ2aWNlRmFjdG9yeSkge1xuICAgIHZhciBfc2VydmljZUZhY3RvcnkkZ2V0U2UgPSBzZXJ2aWNlRmFjdG9yeS5nZXRTZXJ2aWNlKFtMT0dHSU5HX1NFUlZJQ0UsIENPTkZJR19TRVJWSUNFXSksXG4gICAgICAgIGxvZ2dpbmdTZXJ2aWNlID0gX3NlcnZpY2VGYWN0b3J5JGdldFNlWzBdLFxuICAgICAgICBjb25maWdTZXJ2aWNlID0gX3NlcnZpY2VGYWN0b3J5JGdldFNlWzFdO1xuXG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvblNlcnZpY2UobG9nZ2luZ1NlcnZpY2UsIGNvbmZpZ1NlcnZpY2UpO1xuICB9O1xuXG4gIHNlcnZpY2VDcmVhdG9yc1tQRVJGT1JNQU5DRV9NT05JVE9SSU5HXSA9IGZ1bmN0aW9uIChzZXJ2aWNlRmFjdG9yeSkge1xuICAgIHZhciBfc2VydmljZUZhY3RvcnkkZ2V0U2UyID0gc2VydmljZUZhY3RvcnkuZ2V0U2VydmljZShbQVBNX1NFUlZFUiwgQ09ORklHX1NFUlZJQ0UsIExPR0dJTkdfU0VSVklDRSwgVFJBTlNBQ1RJT05fU0VSVklDRV0pLFxuICAgICAgICBhcG1TZXJ2ZXIgPSBfc2VydmljZUZhY3RvcnkkZ2V0U2UyWzBdLFxuICAgICAgICBjb25maWdTZXJ2aWNlID0gX3NlcnZpY2VGYWN0b3J5JGdldFNlMlsxXSxcbiAgICAgICAgbG9nZ2luZ1NlcnZpY2UgPSBfc2VydmljZUZhY3RvcnkkZ2V0U2UyWzJdLFxuICAgICAgICB0cmFuc2FjdGlvblNlcnZpY2UgPSBfc2VydmljZUZhY3RvcnkkZ2V0U2UyWzNdO1xuXG4gICAgcmV0dXJuIG5ldyBQZXJmb3JtYW5jZU1vbml0b3JpbmcoYXBtU2VydmVyLCBjb25maWdTZXJ2aWNlLCBsb2dnaW5nU2VydmljZSwgdHJhbnNhY3Rpb25TZXJ2aWNlKTtcbiAgfTtcbn1cblxuZXhwb3J0IHsgcmVnaXN0ZXJTZXJ2aWNlcywgb2JzZXJ2ZVVzZXJJbnRlcmFjdGlvbnMsIHJlcG9ydElucCB9OyIsImltcG9ydCB7IEVWRU5ULCBGSVJTVF9JTlBVVCB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgaXNQZXJmSW50ZXJhY3Rpb25Db3VudFN1cHBvcnRlZCB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBQZXJmRW50cnlSZWNvcmRlciB9IGZyb20gJy4uL21ldHJpY3MnO1xudmFyIElOUF9USFJFU0hPTEQgPSA0MDtcbnZhciBNQVhfSU5URVJBQ1RJT05TX1RPX0NPTlNJREVSID0gMTA7XG5leHBvcnQgdmFyIGlucFN0YXRlID0ge1xuICBtaW5JbnRlcmFjdGlvbklkOiBJbmZpbml0eSxcbiAgbWF4SW50ZXJhY3Rpb25JZDogMCxcbiAgaW50ZXJhY3Rpb25Db3VudDogMCxcbiAgbG9uZ2VzdEludGVyYWN0aW9uczogW11cbn07XG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZVVzZXJJbnRlcmFjdGlvbnMocmVjb3JkZXIpIHtcbiAgaWYgKHJlY29yZGVyID09PSB2b2lkIDApIHtcbiAgICByZWNvcmRlciA9IG5ldyBQZXJmRW50cnlSZWNvcmRlcihwcm9jZXNzVXNlckludGVyYWN0aW9ucyk7XG4gIH1cblxuICB2YXIgaXNQZXJmQ291bnRTdXBwb3J0ZWQgPSBpc1BlcmZJbnRlcmFjdGlvbkNvdW50U3VwcG9ydGVkKCk7XG4gIHZhciBkdXJhdGlvblRocmVzaG9sZCA9IGlzUGVyZkNvdW50U3VwcG9ydGVkID8gSU5QX1RIUkVTSE9MRCA6IDE2O1xuICByZWNvcmRlci5zdGFydChFVkVOVCwge1xuICAgIGJ1ZmZlcmVkOiB0cnVlLFxuICAgIGR1cmF0aW9uVGhyZXNob2xkOiBkdXJhdGlvblRocmVzaG9sZFxuICB9KTtcblxuICBpZiAoIWlzUGVyZkNvdW50U3VwcG9ydGVkKSB7XG4gICAgcmVjb3JkZXIuc3RhcnQoRklSU1RfSU5QVVQpO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1VzZXJJbnRlcmFjdGlvbnMobGlzdCkge1xuICB2YXIgZW50cmllcyA9IGxpc3QuZ2V0RW50cmllcygpO1xuICBlbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgaWYgKCFlbnRyeS5pbnRlcmFjdGlvbklkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdXBkYXRlSW50ZXJhY3Rpb25Db3VudChlbnRyeSk7XG5cbiAgICBpZiAoZW50cnkuZHVyYXRpb24gPCBJTlBfVEhSRVNIT0xEKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3RvcmVVc2VySW50ZXJhY3Rpb24oZW50cnkpO1xuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVJbnAoKSB7XG4gIGlmIChpbnBTdGF0ZS5sb25nZXN0SW50ZXJhY3Rpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpbnRlcmFjdGlvbkNvdW50KCkgPiAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgaW50ZXJhY3Rpb25JbmRleCA9IE1hdGgubWluKGlucFN0YXRlLmxvbmdlc3RJbnRlcmFjdGlvbnMubGVuZ3RoIC0gMSwgTWF0aC5mbG9vcihpbnRlcmFjdGlvbkNvdW50KCkgLyA1MCkpO1xuICB2YXIgaW5wID0gaW5wU3RhdGUubG9uZ2VzdEludGVyYWN0aW9uc1tpbnRlcmFjdGlvbkluZGV4XS5kdXJhdGlvbjtcbiAgcmV0dXJuIGlucDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcmFjdGlvbkNvdW50KCkge1xuICByZXR1cm4gcGVyZm9ybWFuY2UuaW50ZXJhY3Rpb25Db3VudCB8fCBpbnBTdGF0ZS5pbnRlcmFjdGlvbkNvdW50O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc3RvcmVJTlBTdGF0ZSgpIHtcbiAgaW5wU3RhdGUubWluSW50ZXJhY3Rpb25JZCA9IEluZmluaXR5O1xuICBpbnBTdGF0ZS5tYXhJbnRlcmFjdGlvbklkID0gMDtcbiAgaW5wU3RhdGUuaW50ZXJhY3Rpb25Db3VudCA9IDA7XG4gIGlucFN0YXRlLmxvbmdlc3RJbnRlcmFjdGlvbnMgPSBbXTtcbn1cblxuZnVuY3Rpb24gc3RvcmVVc2VySW50ZXJhY3Rpb24oZW50cnkpIHtcbiAgdmFyIGxlYXN0U2xvdyA9IGlucFN0YXRlLmxvbmdlc3RJbnRlcmFjdGlvbnNbaW5wU3RhdGUubG9uZ2VzdEludGVyYWN0aW9ucy5sZW5ndGggLSAxXTtcblxuICBpZiAodHlwZW9mIGxlYXN0U2xvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgZW50cnkuZHVyYXRpb24gPD0gbGVhc3RTbG93LmR1cmF0aW9uICYmIGVudHJ5LmludGVyYWN0aW9uSWQgIT0gbGVhc3RTbG93LmlkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGZpbHRlcmVkSW50ZXJhY3Rpb24gPSBpbnBTdGF0ZS5sb25nZXN0SW50ZXJhY3Rpb25zLmZpbHRlcihmdW5jdGlvbiAoaW50ZXJhY3Rpb24pIHtcbiAgICByZXR1cm4gaW50ZXJhY3Rpb24uaWQgPT09IGVudHJ5LmludGVyYWN0aW9uSWQ7XG4gIH0pO1xuXG4gIGlmIChmaWx0ZXJlZEludGVyYWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgZm91bmRJbnRlcmFjdGlvbiA9IGZpbHRlcmVkSW50ZXJhY3Rpb25bMF07XG4gICAgZm91bmRJbnRlcmFjdGlvbi5kdXJhdGlvbiA9IE1hdGgubWF4KGZvdW5kSW50ZXJhY3Rpb24uZHVyYXRpb24sIGVudHJ5LmR1cmF0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICBpbnBTdGF0ZS5sb25nZXN0SW50ZXJhY3Rpb25zLnB1c2goe1xuICAgICAgaWQ6IGVudHJ5LmludGVyYWN0aW9uSWQsXG4gICAgICBkdXJhdGlvbjogZW50cnkuZHVyYXRpb25cbiAgICB9KTtcbiAgfVxuXG4gIGlucFN0YXRlLmxvbmdlc3RJbnRlcmFjdGlvbnMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBiLmR1cmF0aW9uIC0gYS5kdXJhdGlvbjtcbiAgfSk7XG4gIGlucFN0YXRlLmxvbmdlc3RJbnRlcmFjdGlvbnMuc3BsaWNlKE1BWF9JTlRFUkFDVElPTlNfVE9fQ09OU0lERVIpO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVJbnRlcmFjdGlvbkNvdW50KGVudHJ5KSB7XG4gIGlmIChpc1BlcmZJbnRlcmFjdGlvbkNvdW50U3VwcG9ydGVkKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpbnBTdGF0ZS5taW5JbnRlcmFjdGlvbklkID0gTWF0aC5taW4oaW5wU3RhdGUubWluSW50ZXJhY3Rpb25JZCwgZW50cnkuaW50ZXJhY3Rpb25JZCk7XG4gIGlucFN0YXRlLm1heEludGVyYWN0aW9uSWQgPSBNYXRoLm1heChpbnBTdGF0ZS5tYXhJbnRlcmFjdGlvbklkLCBlbnRyeS5pbnRlcmFjdGlvbklkKTtcbiAgaW5wU3RhdGUuaW50ZXJhY3Rpb25Db3VudCA9IChpbnBTdGF0ZS5tYXhJbnRlcmFjdGlvbklkIC0gaW5wU3RhdGUubWluSW50ZXJhY3Rpb25JZCkgLyA3ICsgMTtcbn0iLCJpbXBvcnQgeyBjYWxjdWxhdGVJbnAsIHJlc3RvcmVJTlBTdGF0ZSB9IGZyb20gJy4vcHJvY2Vzcyc7XG5pbXBvcnQgeyBub3cgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdXRpbHMnO1xuaW1wb3J0IHsgUEFHRV9FWElUIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2NvbnN0YW50cyc7XG5leHBvcnQgZnVuY3Rpb24gcmVwb3J0SW5wKHRyYW5zYWN0aW9uU2VydmljZSkge1xuICB2YXIgaW5wID0gY2FsY3VsYXRlSW5wKCk7XG5cbiAgaWYgKGlucCA+PSAwKSB7XG4gICAgdmFyIHN0YXJ0VGltZSA9IG5vdygpO1xuICAgIHZhciBpbnBUciA9IHRyYW5zYWN0aW9uU2VydmljZS5zdGFydFRyYW5zYWN0aW9uKFBBR0VfRVhJVCwgUEFHRV9FWElULCB7XG4gICAgICBzdGFydFRpbWU6IHN0YXJ0VGltZVxuICAgIH0pO1xuICAgIHZhciBuYXZpZ2F0aW9ucyA9IHBlcmZvcm1hbmNlLmdldEVudHJpZXNCeVR5cGUoJ25hdmlnYXRpb24nKTtcblxuICAgIGlmIChuYXZpZ2F0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgaGFyZE5hdmlnYXRpb25VcmwgPSBuYXZpZ2F0aW9uc1swXS5uYW1lO1xuICAgICAgaW5wVHIuYWRkQ29udGV4dCh7XG4gICAgICAgIHBhZ2U6IHtcbiAgICAgICAgICB1cmw6IGhhcmROYXZpZ2F0aW9uVXJsXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlucFRyLmFkZExhYmVscyh7XG4gICAgICBpbnBfdmFsdWU6IGlucFxuICAgIH0pO1xuICAgIHZhciBlbmRUaW1lID0gc3RhcnRUaW1lICsgaW5wICsgMTtcbiAgICBpbnBUci5lbmQoZW5kVGltZSk7XG4gICAgcmVzdG9yZUlOUFN0YXRlKCk7XG4gICAgcmV0dXJuIGlucFRyO1xuICB9XG59IiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuaW1wb3J0IHsgTE9OR19UQVNLLCBMQVJHRVNUX0NPTlRFTlRGVUxfUEFJTlQsIEZJUlNUX0NPTlRFTlRGVUxfUEFJTlQsIEZJUlNUX0lOUFVULCBMQVlPVVRfU0hJRlQgfSBmcm9tICcuLi8uLi9jb21tb24vY29uc3RhbnRzJztcbmltcG9ydCB7IG5vb3AsIFBFUkYsIGlzUGVyZlR5cGVTdXBwb3J0ZWQsIGlzUmVkaXJlY3RJbmZvQXZhaWxhYmxlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWxzJztcbmltcG9ydCBTcGFuIGZyb20gJy4uL3NwYW4nO1xuZXhwb3J0IHZhciBtZXRyaWNzID0ge1xuICBmaWQ6IDAsXG4gIGZjcDogMCxcbiAgdGJ0OiB7XG4gICAgc3RhcnQ6IEluZmluaXR5LFxuICAgIGR1cmF0aW9uOiAwXG4gIH0sXG4gIGNsczoge1xuICAgIHNjb3JlOiAwLFxuICAgIGZpcnN0RW50cnlUaW1lOiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgcHJldkVudHJ5VGltZTogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFxuICAgIGN1cnJlbnRTZXNzaW9uU2NvcmU6IDBcbiAgfSxcbiAgbG9uZ3Rhc2s6IHtcbiAgICBjb3VudDogMCxcbiAgICBkdXJhdGlvbjogMCxcbiAgICBtYXg6IDBcbiAgfVxufTtcbnZhciBMT05HX1RBU0tfVEhSRVNIT0xEID0gNTA7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTG9uZ1Rhc2tTcGFucyhsb25ndGFza3MsIGFnZykge1xuICB2YXIgc3BhbnMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxvbmd0YXNrcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfbG9uZ3Rhc2tzJGkgPSBsb25ndGFza3NbaV0sXG4gICAgICAgIG5hbWUgPSBfbG9uZ3Rhc2tzJGkubmFtZSxcbiAgICAgICAgc3RhcnRUaW1lID0gX2xvbmd0YXNrcyRpLnN0YXJ0VGltZSxcbiAgICAgICAgZHVyYXRpb24gPSBfbG9uZ3Rhc2tzJGkuZHVyYXRpb24sXG4gICAgICAgIGF0dHJpYnV0aW9uID0gX2xvbmd0YXNrcyRpLmF0dHJpYnV0aW9uO1xuICAgIHZhciBlbmQgPSBzdGFydFRpbWUgKyBkdXJhdGlvbjtcbiAgICB2YXIgc3BhbiA9IG5ldyBTcGFuKFwiTG9uZ3Rhc2soXCIgKyBuYW1lICsgXCIpXCIsIExPTkdfVEFTSywge1xuICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWVcbiAgICB9KTtcbiAgICBhZ2cuY291bnQrKztcbiAgICBhZ2cuZHVyYXRpb24gKz0gZHVyYXRpb247XG4gICAgYWdnLm1heCA9IE1hdGgubWF4KGR1cmF0aW9uLCBhZ2cubWF4KTtcblxuICAgIGlmIChhdHRyaWJ1dGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICB2YXIgX2F0dHJpYnV0aW9uJCA9IGF0dHJpYnV0aW9uWzBdLFxuICAgICAgICAgIF9uYW1lID0gX2F0dHJpYnV0aW9uJC5uYW1lLFxuICAgICAgICAgIGNvbnRhaW5lclR5cGUgPSBfYXR0cmlidXRpb24kLmNvbnRhaW5lclR5cGUsXG4gICAgICAgICAgY29udGFpbmVyTmFtZSA9IF9hdHRyaWJ1dGlvbiQuY29udGFpbmVyTmFtZSxcbiAgICAgICAgICBjb250YWluZXJJZCA9IF9hdHRyaWJ1dGlvbiQuY29udGFpbmVySWQ7XG4gICAgICB2YXIgY3VzdG9tQ29udGV4dCA9IHtcbiAgICAgICAgYXR0cmlidXRpb246IF9uYW1lLFxuICAgICAgICB0eXBlOiBjb250YWluZXJUeXBlXG4gICAgICB9O1xuXG4gICAgICBpZiAoY29udGFpbmVyTmFtZSkge1xuICAgICAgICBjdXN0b21Db250ZXh0Lm5hbWUgPSBjb250YWluZXJOYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29udGFpbmVySWQpIHtcbiAgICAgICAgY3VzdG9tQ29udGV4dC5pZCA9IGNvbnRhaW5lcklkO1xuICAgICAgfVxuXG4gICAgICBzcGFuLmFkZENvbnRleHQoe1xuICAgICAgICBjdXN0b206IGN1c3RvbUNvbnRleHRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHNwYW4uZW5kKGVuZCk7XG4gICAgc3BhbnMucHVzaChzcGFuKTtcbiAgfVxuXG4gIHJldHVybiBzcGFucztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGaXJzdElucHV0RGVsYXlTcGFuKGZpZEVudHJpZXMpIHtcbiAgdmFyIGZpcnN0SW5wdXQgPSBmaWRFbnRyaWVzWzBdO1xuXG4gIGlmIChmaXJzdElucHV0KSB7XG4gICAgdmFyIHN0YXJ0VGltZSA9IGZpcnN0SW5wdXQuc3RhcnRUaW1lLFxuICAgICAgICBwcm9jZXNzaW5nU3RhcnQgPSBmaXJzdElucHV0LnByb2Nlc3NpbmdTdGFydDtcbiAgICB2YXIgc3BhbiA9IG5ldyBTcGFuKCdGaXJzdCBJbnB1dCBEZWxheScsIEZJUlNUX0lOUFVULCB7XG4gICAgICBzdGFydFRpbWU6IHN0YXJ0VGltZVxuICAgIH0pO1xuICAgIHNwYW4uZW5kKHByb2Nlc3NpbmdTdGFydCk7XG4gICAgcmV0dXJuIHNwYW47XG4gIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUb3RhbEJsb2NraW5nVGltZVNwYW4odGJ0T2JqZWN0KSB7XG4gIHZhciBzdGFydCA9IHRidE9iamVjdC5zdGFydCxcbiAgICAgIGR1cmF0aW9uID0gdGJ0T2JqZWN0LmR1cmF0aW9uO1xuICB2YXIgdGJ0U3BhbiA9IG5ldyBTcGFuKCdUb3RhbCBCbG9ja2luZyBUaW1lJywgTE9OR19UQVNLLCB7XG4gICAgc3RhcnRUaW1lOiBzdGFydFxuICB9KTtcbiAgdGJ0U3Bhbi5lbmQoc3RhcnQgKyBkdXJhdGlvbik7XG4gIHJldHVybiB0YnRTcGFuO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVRvdGFsQmxvY2tpbmdUaW1lKGxvbmd0YXNrRW50cmllcykge1xuICBsb25ndGFza0VudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICB2YXIgbmFtZSA9IGVudHJ5Lm5hbWUsXG4gICAgICAgIHN0YXJ0VGltZSA9IGVudHJ5LnN0YXJ0VGltZSxcbiAgICAgICAgZHVyYXRpb24gPSBlbnRyeS5kdXJhdGlvbjtcblxuICAgIGlmIChzdGFydFRpbWUgPCBtZXRyaWNzLmZjcCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChuYW1lICE9PSAnc2VsZicgJiYgbmFtZS5pbmRleE9mKCdzYW1lLW9yaWdpbicpID09PSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG1ldHJpY3MudGJ0LnN0YXJ0ID0gTWF0aC5taW4obWV0cmljcy50YnQuc3RhcnQsIHN0YXJ0VGltZSk7XG4gICAgdmFyIGJsb2NraW5nVGltZSA9IGR1cmF0aW9uIC0gTE9OR19UQVNLX1RIUkVTSE9MRDtcblxuICAgIGlmIChibG9ja2luZ1RpbWUgPiAwKSB7XG4gICAgICBtZXRyaWNzLnRidC5kdXJhdGlvbiArPSBibG9ja2luZ1RpbWU7XG4gICAgfVxuICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDdW11bGF0aXZlTGF5b3V0U2hpZnQoY2xzRW50cmllcykge1xuICBjbHNFbnRyaWVzLmZvckVhY2goZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgaWYgKCFlbnRyeS5oYWRSZWNlbnRJbnB1dCAmJiBlbnRyeS52YWx1ZSkge1xuICAgICAgdmFyIHNob3VsZENyZWF0ZU5ld1Nlc3Npb24gPSBlbnRyeS5zdGFydFRpbWUgLSBtZXRyaWNzLmNscy5maXJzdEVudHJ5VGltZSA+IDUwMDAgfHwgZW50cnkuc3RhcnRUaW1lIC0gbWV0cmljcy5jbHMucHJldkVudHJ5VGltZSA+IDEwMDA7XG5cbiAgICAgIGlmIChzaG91bGRDcmVhdGVOZXdTZXNzaW9uKSB7XG4gICAgICAgIG1ldHJpY3MuY2xzLmZpcnN0RW50cnlUaW1lID0gZW50cnkuc3RhcnRUaW1lO1xuICAgICAgICBtZXRyaWNzLmNscy5jdXJyZW50U2Vzc2lvblNjb3JlID0gMDtcbiAgICAgIH1cblxuICAgICAgbWV0cmljcy5jbHMucHJldkVudHJ5VGltZSA9IGVudHJ5LnN0YXJ0VGltZTtcbiAgICAgIG1ldHJpY3MuY2xzLmN1cnJlbnRTZXNzaW9uU2NvcmUgKz0gZW50cnkudmFsdWU7XG4gICAgICBtZXRyaWNzLmNscy5zY29yZSA9IE1hdGgubWF4KG1ldHJpY3MuY2xzLnNjb3JlLCBtZXRyaWNzLmNscy5jdXJyZW50U2Vzc2lvblNjb3JlKTtcbiAgICB9XG4gIH0pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNhcHR1cmVPYnNlcnZlckVudHJpZXMobGlzdCwgX3JlZikge1xuICB2YXIgaXNIYXJkTmF2aWdhdGlvbiA9IF9yZWYuaXNIYXJkTmF2aWdhdGlvbixcbiAgICAgIHRyU3RhcnQgPSBfcmVmLnRyU3RhcnQ7XG4gIHZhciBsb25ndGFza0VudHJpZXMgPSBsaXN0LmdldEVudHJpZXNCeVR5cGUoTE9OR19UQVNLKS5maWx0ZXIoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgcmV0dXJuIGVudHJ5LnN0YXJ0VGltZSA+PSB0clN0YXJ0O1xuICB9KTtcbiAgdmFyIGxvbmdUYXNrU3BhbnMgPSBjcmVhdGVMb25nVGFza1NwYW5zKGxvbmd0YXNrRW50cmllcywgbWV0cmljcy5sb25ndGFzayk7XG4gIHZhciByZXN1bHQgPSB7XG4gICAgc3BhbnM6IGxvbmdUYXNrU3BhbnMsXG4gICAgbWFya3M6IHt9XG4gIH07XG5cbiAgaWYgKCFpc0hhcmROYXZpZ2F0aW9uKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHZhciBsY3BFbnRyaWVzID0gbGlzdC5nZXRFbnRyaWVzQnlUeXBlKExBUkdFU1RfQ09OVEVOVEZVTF9QQUlOVCk7XG4gIHZhciBsYXN0TGNwRW50cnkgPSBsY3BFbnRyaWVzW2xjcEVudHJpZXMubGVuZ3RoIC0gMV07XG5cbiAgaWYgKGxhc3RMY3BFbnRyeSkge1xuICAgIHZhciBsY3AgPSBwYXJzZUludChsYXN0TGNwRW50cnkuc3RhcnRUaW1lKTtcbiAgICBtZXRyaWNzLmxjcCA9IGxjcDtcbiAgICByZXN1bHQubWFya3MubGFyZ2VzdENvbnRlbnRmdWxQYWludCA9IGxjcDtcbiAgfVxuXG4gIHZhciB0aW1pbmcgPSBQRVJGLnRpbWluZztcbiAgdmFyIHVubG9hZERpZmYgPSB0aW1pbmcuZmV0Y2hTdGFydCAtIHRpbWluZy5uYXZpZ2F0aW9uU3RhcnQ7XG5cbiAgaWYgKGlzUmVkaXJlY3RJbmZvQXZhaWxhYmxlKHRpbWluZykpIHtcbiAgICB1bmxvYWREaWZmID0gMDtcbiAgfVxuXG4gIHZhciBmY3BFbnRyeSA9IGxpc3QuZ2V0RW50cmllc0J5TmFtZShGSVJTVF9DT05URU5URlVMX1BBSU5UKVswXTtcblxuICBpZiAoZmNwRW50cnkpIHtcbiAgICB2YXIgZmNwID0gcGFyc2VJbnQodW5sb2FkRGlmZiA+PSAwID8gZmNwRW50cnkuc3RhcnRUaW1lIC0gdW5sb2FkRGlmZiA6IGZjcEVudHJ5LnN0YXJ0VGltZSk7XG4gICAgbWV0cmljcy5mY3AgPSBmY3A7XG4gICAgcmVzdWx0Lm1hcmtzLmZpcnN0Q29udGVudGZ1bFBhaW50ID0gZmNwO1xuICB9XG5cbiAgdmFyIGZpZEVudHJpZXMgPSBsaXN0LmdldEVudHJpZXNCeVR5cGUoRklSU1RfSU5QVVQpO1xuICB2YXIgZmlkU3BhbiA9IGNyZWF0ZUZpcnN0SW5wdXREZWxheVNwYW4oZmlkRW50cmllcyk7XG5cbiAgaWYgKGZpZFNwYW4pIHtcbiAgICBtZXRyaWNzLmZpZCA9IGZpZFNwYW4uZHVyYXRpb24oKTtcbiAgICByZXN1bHQuc3BhbnMucHVzaChmaWRTcGFuKTtcbiAgfVxuXG4gIGNhbGN1bGF0ZVRvdGFsQmxvY2tpbmdUaW1lKGxvbmd0YXNrRW50cmllcyk7XG4gIHZhciBjbHNFbnRyaWVzID0gbGlzdC5nZXRFbnRyaWVzQnlUeXBlKExBWU9VVF9TSElGVCk7XG4gIGNhbGN1bGF0ZUN1bXVsYXRpdmVMYXlvdXRTaGlmdChjbHNFbnRyaWVzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmV4cG9ydCB2YXIgUGVyZkVudHJ5UmVjb3JkZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFBlcmZFbnRyeVJlY29yZGVyKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5wbyA9IHtcbiAgICAgIG9ic2VydmU6IG5vb3AsXG4gICAgICBkaXNjb25uZWN0OiBub29wXG4gICAgfTtcblxuICAgIGlmICh3aW5kb3cuUGVyZm9ybWFuY2VPYnNlcnZlcikge1xuICAgICAgdGhpcy5wbyA9IG5ldyBQZXJmb3JtYW5jZU9ic2VydmVyKGNhbGxiYWNrKTtcbiAgICB9XG4gIH1cblxuICB2YXIgX3Byb3RvID0gUGVyZkVudHJ5UmVjb3JkZXIucHJvdG90eXBlO1xuXG4gIF9wcm90by5zdGFydCA9IGZ1bmN0aW9uIHN0YXJ0KHR5cGUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICBidWZmZXJlZDogdHJ1ZVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKCFpc1BlcmZUeXBlU3VwcG9ydGVkKHR5cGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wby5vYnNlcnZlKF9leHRlbmRzKHtcbiAgICAgICAgdHlwZTogdHlwZVxuICAgICAgfSwgb3B0aW9ucykpO1xuICAgIH0gY2F0Y2ggKF8pIHt9XG4gIH07XG5cbiAgX3Byb3RvLnN0b3AgPSBmdW5jdGlvbiBzdG9wKCkge1xuICAgIHRoaXMucG8uZGlzY29ubmVjdCgpO1xuICB9O1xuXG4gIHJldHVybiBQZXJmRW50cnlSZWNvcmRlcjtcbn0oKTsiLCJpbXBvcnQgeyBQRVJGLCBpc1BlcmZUaW1lbGluZVN1cHBvcnRlZCwgaXNSZWRpcmVjdEluZm9BdmFpbGFibGUgfSBmcm9tICcuLi8uLi9jb21tb24vdXRpbHMnO1xuaW1wb3J0IHsgUEFHRV9MT0FELCBSRVNPVVJDRSwgTUVBU1VSRSB9IGZyb20gJy4uLy4uL2NvbW1vbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgc3RhdGUgfSBmcm9tICcuLi8uLi9zdGF0ZSc7XG5pbXBvcnQgeyBjcmVhdGVOYXZpZ2F0aW9uVGltaW5nU3BhbnMgfSBmcm9tICcuL25hdmlnYXRpb24tdGltaW5nJztcbmltcG9ydCB7IGNyZWF0ZVVzZXJUaW1pbmdTcGFucyB9IGZyb20gJy4vdXNlci10aW1pbmcnO1xuaW1wb3J0IHsgY3JlYXRlUmVzb3VyY2VUaW1pbmdTcGFucyB9IGZyb20gJy4vcmVzb3VyY2UtdGltaW5nJztcbmltcG9ydCB7IGdldFBhZ2VMb2FkTWFya3MgfSBmcm9tICcuL21hcmtzJztcblxuZnVuY3Rpb24gY2FwdHVyZU5hdmlnYXRpb24odHJhbnNhY3Rpb24pIHtcbiAgaWYgKCF0cmFuc2FjdGlvbi5jYXB0dXJlVGltaW5ncykge1xuICAgIGlmICh0cmFuc2FjdGlvbi50eXBlID09PSBQQUdFX0xPQUQpIHtcbiAgICAgIHRyYW5zYWN0aW9uLl9zdGFydCA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHRyRW5kID0gdHJhbnNhY3Rpb24uX2VuZDtcblxuICBpZiAodHJhbnNhY3Rpb24udHlwZSA9PT0gUEFHRV9MT0FEKSB7XG4gICAgaWYgKHRyYW5zYWN0aW9uLm1hcmtzICYmIHRyYW5zYWN0aW9uLm1hcmtzLmN1c3RvbSkge1xuICAgICAgdmFyIGN1c3RvbU1hcmtzID0gdHJhbnNhY3Rpb24ubWFya3MuY3VzdG9tO1xuICAgICAgT2JqZWN0LmtleXMoY3VzdG9tTWFya3MpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBjdXN0b21NYXJrc1trZXldICs9IHRyYW5zYWN0aW9uLl9zdGFydDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciB0clN0YXJ0ID0gMDtcbiAgICB0cmFuc2FjdGlvbi5fc3RhcnQgPSB0clN0YXJ0O1xuICAgIHZhciB0aW1pbmdzID0gUEVSRi50aW1pbmc7XG4gICAgdmFyIGJhc2VUaW1lID0gaXNSZWRpcmVjdEluZm9BdmFpbGFibGUodGltaW5ncykgPyB0aW1pbmdzLnJlZGlyZWN0U3RhcnQgOiB0aW1pbmdzLmZldGNoU3RhcnQ7XG4gICAgY3JlYXRlTmF2aWdhdGlvblRpbWluZ1NwYW5zKHRpbWluZ3MsIGJhc2VUaW1lLCB0clN0YXJ0LCB0ckVuZCkuZm9yRWFjaChmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgc3Bhbi50cmFjZUlkID0gdHJhbnNhY3Rpb24udHJhY2VJZDtcbiAgICAgIHNwYW4uc2FtcGxlZCA9IHRyYW5zYWN0aW9uLnNhbXBsZWQ7XG5cbiAgICAgIGlmIChzcGFuLnBhZ2VSZXNwb25zZSAmJiB0cmFuc2FjdGlvbi5vcHRpb25zLnBhZ2VMb2FkU3BhbklkKSB7XG4gICAgICAgIHNwYW4uaWQgPSB0cmFuc2FjdGlvbi5vcHRpb25zLnBhZ2VMb2FkU3BhbklkO1xuICAgICAgfVxuXG4gICAgICB0cmFuc2FjdGlvbi5zcGFucy5wdXNoKHNwYW4pO1xuICAgIH0pO1xuXG4gICAgaWYgKHRyYW5zYWN0aW9uLm9wdGlvbnMucGFnZUxvYWRQYXJlbnRJZCkge1xuICAgICAgdHJhbnNhY3Rpb24ucGFyZW50SWQgPSB0cmFuc2FjdGlvbi5vcHRpb25zLnBhZ2VMb2FkUGFyZW50SWQ7XG4gICAgfVxuXG4gICAgdHJhbnNhY3Rpb24uYWRkTWFya3MoZ2V0UGFnZUxvYWRNYXJrcyh0aW1pbmdzKSk7XG4gIH1cblxuICBpZiAoaXNQZXJmVGltZWxpbmVTdXBwb3J0ZWQoKSkge1xuICAgIHZhciBfdHJTdGFydCA9IHRyYW5zYWN0aW9uLl9zdGFydDtcbiAgICB2YXIgcmVzb3VyY2VFbnRyaWVzID0gUEVSRi5nZXRFbnRyaWVzQnlUeXBlKFJFU09VUkNFKTtcbiAgICBjcmVhdGVSZXNvdXJjZVRpbWluZ1NwYW5zKHJlc291cmNlRW50cmllcywgc3RhdGUuYm9vdHN0cmFwVGltZSwgX3RyU3RhcnQsIHRyRW5kKS5mb3JFYWNoKGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICByZXR1cm4gdHJhbnNhY3Rpb24uc3BhbnMucHVzaChzcGFuKTtcbiAgICB9KTtcbiAgICB2YXIgdXNlckVudHJpZXMgPSBQRVJGLmdldEVudHJpZXNCeVR5cGUoTUVBU1VSRSk7XG4gICAgY3JlYXRlVXNlclRpbWluZ1NwYW5zKHVzZXJFbnRyaWVzLCBfdHJTdGFydCwgdHJFbmQpLmZvckVhY2goZnVuY3Rpb24gKHNwYW4pIHtcbiAgICAgIHJldHVybiB0cmFuc2FjdGlvbi5zcGFucy5wdXNoKHNwYW4pO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCB7IGNhcHR1cmVOYXZpZ2F0aW9uLCBjcmVhdGVOYXZpZ2F0aW9uVGltaW5nU3BhbnMsIGNyZWF0ZVJlc291cmNlVGltaW5nU3BhbnMsIGNyZWF0ZVVzZXJUaW1pbmdTcGFucywgZ2V0UGFnZUxvYWRNYXJrcyB9OyIsImltcG9ydCB7IGlzUmVkaXJlY3RJbmZvQXZhaWxhYmxlIH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWxzJztcbnZhciBOQVZJR0FUSU9OX1RJTUlOR19NQVJLUyA9IFsnZmV0Y2hTdGFydCcsICdkb21haW5Mb29rdXBTdGFydCcsICdkb21haW5Mb29rdXBFbmQnLCAnY29ubmVjdFN0YXJ0JywgJ2Nvbm5lY3RFbmQnLCAncmVxdWVzdFN0YXJ0JywgJ3Jlc3BvbnNlU3RhcnQnLCAncmVzcG9uc2VFbmQnLCAnZG9tTG9hZGluZycsICdkb21JbnRlcmFjdGl2ZScsICdkb21Db250ZW50TG9hZGVkRXZlbnRTdGFydCcsICdkb21Db250ZW50TG9hZGVkRXZlbnRFbmQnLCAnZG9tQ29tcGxldGUnLCAnbG9hZEV2ZW50U3RhcnQnLCAnbG9hZEV2ZW50RW5kJ107XG52YXIgQ09NUFJFU1NFRF9OQVZfVElNSU5HX01BUktTID0gWydmcycsICdscycsICdsZScsICdjcycsICdjZScsICdxcycsICdycycsICdyZScsICdkbCcsICdkaScsICdkcycsICdkZScsICdkYycsICdlcycsICdlZSddO1xuXG5mdW5jdGlvbiBnZXRQYWdlTG9hZE1hcmtzKHRpbWluZykge1xuICB2YXIgbWFya3MgPSBnZXROYXZpZ2F0aW9uVGltaW5nTWFya3ModGltaW5nKTtcblxuICBpZiAobWFya3MgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYXZpZ2F0aW9uVGltaW5nOiBtYXJrcyxcbiAgICBhZ2VudDoge1xuICAgICAgdGltZVRvRmlyc3RCeXRlOiBtYXJrcy5yZXNwb25zZVN0YXJ0LFxuICAgICAgZG9tSW50ZXJhY3RpdmU6IG1hcmtzLmRvbUludGVyYWN0aXZlLFxuICAgICAgZG9tQ29tcGxldGU6IG1hcmtzLmRvbUNvbXBsZXRlXG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXROYXZpZ2F0aW9uVGltaW5nTWFya3ModGltaW5nKSB7XG4gIHZhciByZWRpcmVjdFN0YXJ0ID0gdGltaW5nLnJlZGlyZWN0U3RhcnQsXG4gICAgICBmZXRjaFN0YXJ0ID0gdGltaW5nLmZldGNoU3RhcnQsXG4gICAgICBuYXZpZ2F0aW9uU3RhcnQgPSB0aW1pbmcubmF2aWdhdGlvblN0YXJ0LFxuICAgICAgcmVzcG9uc2VTdGFydCA9IHRpbWluZy5yZXNwb25zZVN0YXJ0LFxuICAgICAgcmVzcG9uc2VFbmQgPSB0aW1pbmcucmVzcG9uc2VFbmQ7XG5cbiAgaWYgKGZldGNoU3RhcnQgPj0gbmF2aWdhdGlvblN0YXJ0ICYmIHJlc3BvbnNlU3RhcnQgPj0gZmV0Y2hTdGFydCAmJiByZXNwb25zZUVuZCA+PSByZXNwb25zZVN0YXJ0KSB7XG4gICAgdmFyIG1hcmtzID0ge307XG4gICAgTkFWSUdBVElPTl9USU1JTkdfTUFSS1MuZm9yRWFjaChmdW5jdGlvbiAodGltaW5nS2V5KSB7XG4gICAgICB2YXIgbSA9IHRpbWluZ1t0aW1pbmdLZXldO1xuXG4gICAgICBpZiAobSAmJiBtID49IGZldGNoU3RhcnQpIHtcbiAgICAgICAgaWYgKGlzUmVkaXJlY3RJbmZvQXZhaWxhYmxlKHRpbWluZykpIHtcbiAgICAgICAgICBtYXJrc1t0aW1pbmdLZXldID0gcGFyc2VJbnQobSAtIHJlZGlyZWN0U3RhcnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hcmtzW3RpbWluZ0tleV0gPSBwYXJzZUludChtIC0gZmV0Y2hTdGFydCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gbWFya3M7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IHsgZ2V0UGFnZUxvYWRNYXJrcywgTkFWSUdBVElPTl9USU1JTkdfTUFSS1MsIENPTVBSRVNTRURfTkFWX1RJTUlOR19NQVJLUyB9OyIsImltcG9ydCB7IHNob3VsZENyZWF0ZVNwYW4gfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBTcGFuIGZyb20gJy4uL3NwYW4nO1xudmFyIGV2ZW50UGFpcnMgPSBbWydyZWRpcmVjdFN0YXJ0JywgJ3JlZGlyZWN0RW5kJywgJ1JlZGlyZWN0J10sIFsnZG9tYWluTG9va3VwU3RhcnQnLCAnZG9tYWluTG9va3VwRW5kJywgJ0RvbWFpbiBsb29rdXAnXSwgWydjb25uZWN0U3RhcnQnLCAnY29ubmVjdEVuZCcsICdNYWtpbmcgYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXInXSwgWydyZXF1ZXN0U3RhcnQnLCAncmVzcG9uc2VFbmQnLCAnUmVxdWVzdGluZyBhbmQgcmVjZWl2aW5nIHRoZSBkb2N1bWVudCddLCBbJ2RvbUxvYWRpbmcnLCAnZG9tSW50ZXJhY3RpdmUnLCAnUGFyc2luZyB0aGUgZG9jdW1lbnQsIGV4ZWN1dGluZyBzeW5jLiBzY3JpcHRzJ10sIFsnZG9tQ29udGVudExvYWRlZEV2ZW50U3RhcnQnLCAnZG9tQ29udGVudExvYWRlZEV2ZW50RW5kJywgJ0ZpcmUgXCJET01Db250ZW50TG9hZGVkXCIgZXZlbnQnXSwgWydsb2FkRXZlbnRTdGFydCcsICdsb2FkRXZlbnRFbmQnLCAnRmlyZSBcImxvYWRcIiBldmVudCddXTtcblxuZnVuY3Rpb24gY3JlYXRlTmF2aWdhdGlvblRpbWluZ1NwYW5zKHRpbWluZ3MsIGJhc2VUaW1lLCB0clN0YXJ0LCB0ckVuZCkge1xuICB2YXIgc3BhbnMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50UGFpcnMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc3RhcnQgPSB0aW1pbmdzW2V2ZW50UGFpcnNbaV1bMF1dO1xuICAgIHZhciBlbmQgPSB0aW1pbmdzW2V2ZW50UGFpcnNbaV1bMV1dO1xuXG4gICAgaWYgKCFzaG91bGRDcmVhdGVTcGFuKHN0YXJ0LCBlbmQsIHRyU3RhcnQsIHRyRW5kLCBiYXNlVGltZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHZhciBzcGFuID0gbmV3IFNwYW4oZXZlbnRQYWlyc1tpXVsyXSwgJ2hhcmQtbmF2aWdhdGlvbi5icm93c2VyLXRpbWluZycpO1xuICAgIHZhciBkYXRhID0gbnVsbDtcblxuICAgIGlmIChldmVudFBhaXJzW2ldWzBdID09PSAncmVxdWVzdFN0YXJ0Jykge1xuICAgICAgc3Bhbi5wYWdlUmVzcG9uc2UgPSB0cnVlO1xuICAgICAgZGF0YSA9IHtcbiAgICAgICAgdXJsOiBsb2NhdGlvbi5vcmlnaW5cbiAgICAgIH07XG4gICAgfVxuXG4gICAgc3Bhbi5fc3RhcnQgPSBzdGFydCAtIGJhc2VUaW1lO1xuICAgIHNwYW4uZW5kKGVuZCAtIGJhc2VUaW1lLCBkYXRhKTtcbiAgICBzcGFucy5wdXNoKHNwYW4pO1xuICB9XG5cbiAgcmV0dXJuIHNwYW5zO1xufVxuXG5leHBvcnQgeyBjcmVhdGVOYXZpZ2F0aW9uVGltaW5nU3BhbnMgfTsiLCJpbXBvcnQgeyBzdHJpcFF1ZXJ5U3RyaW5nRnJvbVVybCB9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBzaG91bGRDcmVhdGVTcGFuIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBSRVNPVVJDRV9JTklUSUFUT1JfVFlQRVMgfSBmcm9tICcuLi8uLi9jb21tb24vY29uc3RhbnRzJztcbmltcG9ydCBTcGFuIGZyb20gJy4uL3NwYW4nO1xuXG5mdW5jdGlvbiBjcmVhdGVSZXNvdXJjZVRpbWluZ1NwYW4ocmVzb3VyY2VUaW1pbmdFbnRyeSkge1xuICB2YXIgbmFtZSA9IHJlc291cmNlVGltaW5nRW50cnkubmFtZSxcbiAgICAgIGluaXRpYXRvclR5cGUgPSByZXNvdXJjZVRpbWluZ0VudHJ5LmluaXRpYXRvclR5cGUsXG4gICAgICBzdGFydFRpbWUgPSByZXNvdXJjZVRpbWluZ0VudHJ5LnN0YXJ0VGltZSxcbiAgICAgIHJlc3BvbnNlRW5kID0gcmVzb3VyY2VUaW1pbmdFbnRyeS5yZXNwb25zZUVuZDtcbiAgdmFyIGtpbmQgPSAncmVzb3VyY2UnO1xuXG4gIGlmIChpbml0aWF0b3JUeXBlKSB7XG4gICAga2luZCArPSAnLicgKyBpbml0aWF0b3JUeXBlO1xuICB9XG5cbiAgdmFyIHNwYW5OYW1lID0gc3RyaXBRdWVyeVN0cmluZ0Zyb21VcmwobmFtZSk7XG4gIHZhciBzcGFuID0gbmV3IFNwYW4oc3Bhbk5hbWUsIGtpbmQpO1xuICBzcGFuLl9zdGFydCA9IHN0YXJ0VGltZTtcbiAgc3Bhbi5lbmQocmVzcG9uc2VFbmQsIHtcbiAgICB1cmw6IG5hbWUsXG4gICAgZW50cnk6IHJlc291cmNlVGltaW5nRW50cnlcbiAgfSk7XG4gIHJldHVybiBzcGFuO1xufVxuXG5mdW5jdGlvbiBpc0NhcHR1cmVkQnlQYXRjaGluZyhyZXNvdXJjZVN0YXJ0VGltZSwgcmVxdWVzdFBhdGNoVGltZSkge1xuICByZXR1cm4gcmVxdWVzdFBhdGNoVGltZSAhPSBudWxsICYmIHJlc291cmNlU3RhcnRUaW1lID4gcmVxdWVzdFBhdGNoVGltZTtcbn1cblxuZnVuY3Rpb24gaXNJbnRha2VBUElFbmRwb2ludCh1cmwpIHtcbiAgcmV0dXJuIC9pbnRha2VcXC92XFxkK1xcL3J1bVxcL2V2ZW50cy8udGVzdCh1cmwpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXNvdXJjZVRpbWluZ1NwYW5zKGVudHJpZXMsIHJlcXVlc3RQYXRjaFRpbWUsIHRyU3RhcnQsIHRyRW5kKSB7XG4gIHZhciBzcGFucyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBfZW50cmllcyRpID0gZW50cmllc1tpXSxcbiAgICAgICAgaW5pdGlhdG9yVHlwZSA9IF9lbnRyaWVzJGkuaW5pdGlhdG9yVHlwZSxcbiAgICAgICAgbmFtZSA9IF9lbnRyaWVzJGkubmFtZSxcbiAgICAgICAgc3RhcnRUaW1lID0gX2VudHJpZXMkaS5zdGFydFRpbWUsXG4gICAgICAgIHJlc3BvbnNlRW5kID0gX2VudHJpZXMkaS5yZXNwb25zZUVuZDtcblxuICAgIGlmIChSRVNPVVJDRV9JTklUSUFUT1JfVFlQRVMuaW5kZXhPZihpbml0aWF0b3JUeXBlKSA9PT0gLTEgfHwgbmFtZSA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoKGluaXRpYXRvclR5cGUgPT09ICd4bWxodHRwcmVxdWVzdCcgfHwgaW5pdGlhdG9yVHlwZSA9PT0gJ2ZldGNoJykgJiYgKGlzSW50YWtlQVBJRW5kcG9pbnQobmFtZSkgfHwgaXNDYXB0dXJlZEJ5UGF0Y2hpbmcoc3RhcnRUaW1lLCByZXF1ZXN0UGF0Y2hUaW1lKSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRDcmVhdGVTcGFuKHN0YXJ0VGltZSwgcmVzcG9uc2VFbmQsIHRyU3RhcnQsIHRyRW5kKSkge1xuICAgICAgc3BhbnMucHVzaChjcmVhdGVSZXNvdXJjZVRpbWluZ1NwYW4oZW50cmllc1tpXSkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzcGFucztcbn1cblxuZXhwb3J0IHsgY3JlYXRlUmVzb3VyY2VUaW1pbmdTcGFucyB9OyIsImltcG9ydCB7IFVTRVJfVElNSU5HX1RIUkVTSE9MRCB9IGZyb20gJy4uLy4uL2NvbW1vbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgc2hvdWxkQ3JlYXRlU3BhbiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IFNwYW4gZnJvbSAnLi4vc3Bhbic7XG5cbmZ1bmN0aW9uIGNyZWF0ZVVzZXJUaW1pbmdTcGFucyhlbnRyaWVzLCB0clN0YXJ0LCB0ckVuZCkge1xuICB2YXIgdXNlclRpbWluZ1NwYW5zID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIF9lbnRyaWVzJGkgPSBlbnRyaWVzW2ldLFxuICAgICAgICBuYW1lID0gX2VudHJpZXMkaS5uYW1lLFxuICAgICAgICBzdGFydFRpbWUgPSBfZW50cmllcyRpLnN0YXJ0VGltZSxcbiAgICAgICAgZHVyYXRpb24gPSBfZW50cmllcyRpLmR1cmF0aW9uO1xuICAgIHZhciBlbmQgPSBzdGFydFRpbWUgKyBkdXJhdGlvbjtcblxuICAgIGlmIChkdXJhdGlvbiA8PSBVU0VSX1RJTUlOR19USFJFU0hPTEQgfHwgIXNob3VsZENyZWF0ZVNwYW4oc3RhcnRUaW1lLCBlbmQsIHRyU3RhcnQsIHRyRW5kKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdmFyIGtpbmQgPSAnYXBwJztcbiAgICB2YXIgc3BhbiA9IG5ldyBTcGFuKG5hbWUsIGtpbmQpO1xuICAgIHNwYW4uX3N0YXJ0ID0gc3RhcnRUaW1lO1xuICAgIHNwYW4uZW5kKGVuZCk7XG4gICAgdXNlclRpbWluZ1NwYW5zLnB1c2goc3Bhbik7XG4gIH1cblxuICByZXR1cm4gdXNlclRpbWluZ1NwYW5zO1xufVxuXG5leHBvcnQgeyBjcmVhdGVVc2VyVGltaW5nU3BhbnMgfTsiLCJpbXBvcnQgeyBNQVhfU1BBTl9EVVJBVElPTiB9IGZyb20gJy4uLy4uL2NvbW1vbi9jb25zdGFudHMnO1xuXG5mdW5jdGlvbiBzaG91bGRDcmVhdGVTcGFuKHN0YXJ0LCBlbmQsIHRyU3RhcnQsIHRyRW5kLCBiYXNlVGltZSkge1xuICBpZiAoYmFzZVRpbWUgPT09IHZvaWQgMCkge1xuICAgIGJhc2VUaW1lID0gMDtcbiAgfVxuXG4gIHJldHVybiB0eXBlb2Ygc3RhcnQgPT09ICdudW1iZXInICYmIHR5cGVvZiBlbmQgPT09ICdudW1iZXInICYmIHN0YXJ0ID49IGJhc2VUaW1lICYmIGVuZCA+IHN0YXJ0ICYmIHN0YXJ0IC0gYmFzZVRpbWUgPj0gdHJTdGFydCAmJiBlbmQgLSBiYXNlVGltZSA8PSB0ckVuZCAmJiBlbmQgLSBzdGFydCA8IE1BWF9TUEFOX0RVUkFUSU9OICYmIHN0YXJ0IC0gYmFzZVRpbWUgPCBNQVhfU1BBTl9EVVJBVElPTiAmJiBlbmQgLSBiYXNlVGltZSA8IE1BWF9TUEFOX0RVUkFUSU9OO1xufVxuXG5leHBvcnQgeyBzaG91bGRDcmVhdGVTcGFuIH07IiwiaW1wb3J0IHsgY2hlY2tTYW1lT3JpZ2luLCBpc0R0SGVhZGVyVmFsaWQsIHBhcnNlRHRIZWFkZXJWYWx1ZSwgZ2V0RHRIZWFkZXJWYWx1ZSwgZ2V0VFNIZWFkZXJWYWx1ZSwgc3RyaXBRdWVyeVN0cmluZ0Zyb21VcmwsIHNldFJlcXVlc3RIZWFkZXIgfSBmcm9tICcuLi9jb21tb24vdXRpbHMnO1xuaW1wb3J0IHsgVXJsIH0gZnJvbSAnLi4vY29tbW9uL3VybCc7XG5pbXBvcnQgeyBwYXRjaEV2ZW50SGFuZGxlciB9IGZyb20gJy4uL2NvbW1vbi9wYXRjaGluZyc7XG5pbXBvcnQgeyBnbG9iYWxTdGF0ZSB9IGZyb20gJy4uL2NvbW1vbi9wYXRjaGluZy9wYXRjaC11dGlscyc7XG5pbXBvcnQgeyBTQ0hFRFVMRSwgSU5WT0tFLCBUUkFOU0FDVElPTl9FTkQsIEFGVEVSX0VWRU5ULCBGRVRDSCwgSElTVE9SWSwgWE1MSFRUUFJFUVVFU1QsIEhUVFBfUkVRVUVTVF9UWVBFLCBPVVRDT01FX0ZBSUxVUkUsIE9VVENPTUVfU1VDQ0VTUywgT1VUQ09NRV9VTktOT1dOLCBRVUVVRV9BRERfVFJBTlNBQ1RJT04sIFRSQU5TQUNUSU9OX0lHTk9SRSB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgdHJ1bmNhdGVNb2RlbCwgU1BBTl9NT0RFTCwgVFJBTlNBQ1RJT05fTU9ERUwgfSBmcm9tICcuLi9jb21tb24vdHJ1bmNhdGUnO1xuaW1wb3J0IHsgX19ERVZfXyB9IGZyb20gJy4uL3N0YXRlJztcbnZhciBTSU1JTEFSX1NQQU5fVE9fVFJBTlNBQ1RJT05fUkFUSU8gPSAwLjA1O1xudmFyIFRSQU5TQUNUSU9OX0RVUkFUSU9OX1RIUkVTSE9MRCA9IDYwMDAwO1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwU21hbGxDb250aW51b3VzbHlTaW1pbGFyU3BhbnMob3JpZ2luYWxTcGFucywgdHJhbnNEdXJhdGlvbiwgdGhyZXNob2xkKSB7XG4gIG9yaWdpbmFsU3BhbnMuc29ydChmdW5jdGlvbiAoc3BhbkEsIHNwYW5CKSB7XG4gICAgcmV0dXJuIHNwYW5BLl9zdGFydCAtIHNwYW5CLl9zdGFydDtcbiAgfSk7XG4gIHZhciBzcGFucyA9IFtdO1xuICB2YXIgbGFzdENvdW50ID0gMTtcbiAgb3JpZ2luYWxTcGFucy5mb3JFYWNoKGZ1bmN0aW9uIChzcGFuLCBpbmRleCkge1xuICAgIGlmIChzcGFucy5sZW5ndGggPT09IDApIHtcbiAgICAgIHNwYW5zLnB1c2goc3Bhbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBsYXN0U3BhbiA9IHNwYW5zW3NwYW5zLmxlbmd0aCAtIDFdO1xuICAgICAgdmFyIGlzQ29udGludW91c2x5U2ltaWxhciA9IGxhc3RTcGFuLnR5cGUgPT09IHNwYW4udHlwZSAmJiBsYXN0U3Bhbi5zdWJ0eXBlID09PSBzcGFuLnN1YnR5cGUgJiYgbGFzdFNwYW4uYWN0aW9uID09PSBzcGFuLmFjdGlvbiAmJiBsYXN0U3Bhbi5uYW1lID09PSBzcGFuLm5hbWUgJiYgc3Bhbi5kdXJhdGlvbigpIC8gdHJhbnNEdXJhdGlvbiA8IHRocmVzaG9sZCAmJiAoc3Bhbi5fc3RhcnQgLSBsYXN0U3Bhbi5fZW5kKSAvIHRyYW5zRHVyYXRpb24gPCB0aHJlc2hvbGQ7XG4gICAgICB2YXIgaXNMYXN0U3BhbiA9IG9yaWdpbmFsU3BhbnMubGVuZ3RoID09PSBpbmRleCArIDE7XG5cbiAgICAgIGlmIChpc0NvbnRpbnVvdXNseVNpbWlsYXIpIHtcbiAgICAgICAgbGFzdENvdW50Kys7XG4gICAgICAgIGxhc3RTcGFuLl9lbmQgPSBzcGFuLl9lbmQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChsYXN0Q291bnQgPiAxICYmICghaXNDb250aW51b3VzbHlTaW1pbGFyIHx8IGlzTGFzdFNwYW4pKSB7XG4gICAgICAgIGxhc3RTcGFuLm5hbWUgPSBsYXN0Q291bnQgKyAneCAnICsgbGFzdFNwYW4ubmFtZTtcbiAgICAgICAgbGFzdENvdW50ID0gMTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc0NvbnRpbnVvdXNseVNpbWlsYXIpIHtcbiAgICAgICAgc3BhbnMucHVzaChzcGFuKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gc3BhbnM7XG59XG5leHBvcnQgZnVuY3Rpb24gYWRqdXN0VHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pIHtcbiAgaWYgKHRyYW5zYWN0aW9uLnNhbXBsZWQpIHtcbiAgICB2YXIgZmlsdGVyZFNwYW5zID0gdHJhbnNhY3Rpb24uc3BhbnMuZmlsdGVyKGZ1bmN0aW9uIChzcGFuKSB7XG4gICAgICByZXR1cm4gc3Bhbi5kdXJhdGlvbigpID4gMCAmJiBzcGFuLl9zdGFydCA+PSB0cmFuc2FjdGlvbi5fc3RhcnQgJiYgc3Bhbi5fZW5kIDw9IHRyYW5zYWN0aW9uLl9lbmQ7XG4gICAgfSk7XG5cbiAgICBpZiAodHJhbnNhY3Rpb24uaXNNYW5hZ2VkKCkpIHtcbiAgICAgIHZhciBkdXJhdGlvbiA9IHRyYW5zYWN0aW9uLmR1cmF0aW9uKCk7XG4gICAgICB2YXIgc2ltaWxhclNwYW5zID0gZ3JvdXBTbWFsbENvbnRpbnVvdXNseVNpbWlsYXJTcGFucyhmaWx0ZXJkU3BhbnMsIGR1cmF0aW9uLCBTSU1JTEFSX1NQQU5fVE9fVFJBTlNBQ1RJT05fUkFUSU8pO1xuICAgICAgdHJhbnNhY3Rpb24uc3BhbnMgPSBzaW1pbGFyU3BhbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyYW5zYWN0aW9uLnNwYW5zID0gZmlsdGVyZFNwYW5zO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0cmFuc2FjdGlvbi5yZXNldEZpZWxkcygpO1xuICB9XG5cbiAgcmV0dXJuIHRyYW5zYWN0aW9uO1xufVxuXG52YXIgUGVyZm9ybWFuY2VNb25pdG9yaW5nID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQZXJmb3JtYW5jZU1vbml0b3JpbmcoYXBtU2VydmVyLCBjb25maWdTZXJ2aWNlLCBsb2dnaW5nU2VydmljZSwgdHJhbnNhY3Rpb25TZXJ2aWNlKSB7XG4gICAgdGhpcy5fYXBtU2VydmVyID0gYXBtU2VydmVyO1xuICAgIHRoaXMuX2NvbmZpZ1NlcnZpY2UgPSBjb25maWdTZXJ2aWNlO1xuICAgIHRoaXMuX2xvZ2dpblNlcnZpY2UgPSBsb2dnaW5nU2VydmljZTtcbiAgICB0aGlzLl90cmFuc2FjdGlvblNlcnZpY2UgPSB0cmFuc2FjdGlvblNlcnZpY2U7XG4gIH1cblxuICB2YXIgX3Byb3RvID0gUGVyZm9ybWFuY2VNb25pdG9yaW5nLnByb3RvdHlwZTtcblxuICBfcHJvdG8uaW5pdCA9IGZ1bmN0aW9uIGluaXQoZmxhZ3MpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgaWYgKGZsYWdzID09PSB2b2lkIDApIHtcbiAgICAgIGZsYWdzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlnU2VydmljZS5ldmVudHMub2JzZXJ2ZShUUkFOU0FDVElPTl9FTkQgKyBBRlRFUl9FVkVOVCwgZnVuY3Rpb24gKHRyKSB7XG4gICAgICB2YXIgcGF5bG9hZCA9IF90aGlzLmNyZWF0ZVRyYW5zYWN0aW9uUGF5bG9hZCh0cik7XG5cbiAgICAgIGlmIChwYXlsb2FkKSB7XG4gICAgICAgIF90aGlzLl9hcG1TZXJ2ZXIuYWRkVHJhbnNhY3Rpb24ocGF5bG9hZCk7XG5cbiAgICAgICAgX3RoaXMuX2NvbmZpZ1NlcnZpY2UuZGlzcGF0Y2hFdmVudChRVUVVRV9BRERfVFJBTlNBQ1RJT04pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKGZsYWdzW0hJU1RPUlldKSB7XG4gICAgICBwYXRjaEV2ZW50SGFuZGxlci5vYnNlcnZlKEhJU1RPUlksIHRoaXMuZ2V0SGlzdG9yeVN1YigpKTtcbiAgICB9XG5cbiAgICBpZiAoZmxhZ3NbWE1MSFRUUFJFUVVFU1RdKSB7XG4gICAgICBwYXRjaEV2ZW50SGFuZGxlci5vYnNlcnZlKFhNTEhUVFBSRVFVRVNULCB0aGlzLmdldFhIUlN1YigpKTtcbiAgICB9XG5cbiAgICBpZiAoZmxhZ3NbRkVUQ0hdKSB7XG4gICAgICBwYXRjaEV2ZW50SGFuZGxlci5vYnNlcnZlKEZFVENILCB0aGlzLmdldEZldGNoU3ViKCkpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uZ2V0SGlzdG9yeVN1YiA9IGZ1bmN0aW9uIGdldEhpc3RvcnlTdWIoKSB7XG4gICAgdmFyIHRyYW5zYWN0aW9uU2VydmljZSA9IHRoaXMuX3RyYW5zYWN0aW9uU2VydmljZTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50LCB0YXNrKSB7XG4gICAgICBpZiAodGFzay5zb3VyY2UgPT09IEhJU1RPUlkgJiYgZXZlbnQgPT09IElOVk9LRSkge1xuICAgICAgICB0cmFuc2FjdGlvblNlcnZpY2Uuc3RhcnRUcmFuc2FjdGlvbih0YXNrLmRhdGEudGl0bGUsICdyb3V0ZS1jaGFuZ2UnLCB7XG4gICAgICAgICAgbWFuYWdlZDogdHJ1ZSxcbiAgICAgICAgICBjYW5SZXVzZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9O1xuXG4gIF9wcm90by5nZXRYSFJTdWIgPSBmdW5jdGlvbiBnZXRYSFJTdWIoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKGV2ZW50LCB0YXNrKSB7XG4gICAgICBpZiAodGFzay5zb3VyY2UgPT09IFhNTEhUVFBSRVFVRVNUICYmICFnbG9iYWxTdGF0ZS5mZXRjaEluUHJvZ3Jlc3MpIHtcbiAgICAgICAgX3RoaXMyLnByb2Nlc3NBUElDYWxscyhldmVudCwgdGFzayk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBfcHJvdG8uZ2V0RmV0Y2hTdWIgPSBmdW5jdGlvbiBnZXRGZXRjaFN1YigpIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQsIHRhc2spIHtcbiAgICAgIGlmICh0YXNrLnNvdXJjZSA9PT0gRkVUQ0gpIHtcbiAgICAgICAgX3RoaXMzLnByb2Nlc3NBUElDYWxscyhldmVudCwgdGFzayk7XG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICBfcHJvdG8ucHJvY2Vzc0FQSUNhbGxzID0gZnVuY3Rpb24gcHJvY2Vzc0FQSUNhbGxzKGV2ZW50LCB0YXNrKSB7XG4gICAgdmFyIGNvbmZpZ1NlcnZpY2UgPSB0aGlzLl9jb25maWdTZXJ2aWNlO1xuICAgIHZhciB0cmFuc2FjdGlvblNlcnZpY2UgPSB0aGlzLl90cmFuc2FjdGlvblNlcnZpY2U7XG5cbiAgICBpZiAodGFzay5kYXRhICYmIHRhc2suZGF0YS51cmwpIHtcbiAgICAgIHZhciBlbmRwb2ludHMgPSB0aGlzLl9hcG1TZXJ2ZXIuZ2V0RW5kcG9pbnRzKCk7XG5cbiAgICAgIHZhciBpc093bkVuZHBvaW50ID0gT2JqZWN0LmtleXMoZW5kcG9pbnRzKS5zb21lKGZ1bmN0aW9uIChlbmRwb2ludCkge1xuICAgICAgICByZXR1cm4gdGFzay5kYXRhLnVybC5pbmRleE9mKGVuZHBvaW50c1tlbmRwb2ludF0pICE9PSAtMTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNPd25FbmRwb2ludCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50ID09PSBTQ0hFRFVMRSAmJiB0YXNrLmRhdGEpIHtcbiAgICAgIHZhciBkYXRhID0gdGFzay5kYXRhO1xuICAgICAgdmFyIHJlcXVlc3RVcmwgPSBuZXcgVXJsKGRhdGEudXJsKTtcbiAgICAgIHZhciBzcGFuTmFtZSA9IGRhdGEubWV0aG9kICsgJyAnICsgKHJlcXVlc3RVcmwucmVsYXRpdmUgPyByZXF1ZXN0VXJsLnBhdGggOiBzdHJpcFF1ZXJ5U3RyaW5nRnJvbVVybChyZXF1ZXN0VXJsLmhyZWYpKTtcblxuICAgICAgaWYgKCF0cmFuc2FjdGlvblNlcnZpY2UuZ2V0Q3VycmVudFRyYW5zYWN0aW9uKCkpIHtcbiAgICAgICAgdHJhbnNhY3Rpb25TZXJ2aWNlLnN0YXJ0VHJhbnNhY3Rpb24oc3Bhbk5hbWUsIEhUVFBfUkVRVUVTVF9UWVBFLCB7XG4gICAgICAgICAgbWFuYWdlZDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNwYW4gPSB0cmFuc2FjdGlvblNlcnZpY2Uuc3RhcnRTcGFuKHNwYW5OYW1lLCAnZXh0ZXJuYWwuaHR0cCcsIHtcbiAgICAgICAgYmxvY2tpbmc6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXNwYW4pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaXNEdEVuYWJsZWQgPSBjb25maWdTZXJ2aWNlLmdldCgnZGlzdHJpYnV0ZWRUcmFjaW5nJyk7XG4gICAgICB2YXIgZHRPcmlnaW5zID0gY29uZmlnU2VydmljZS5nZXQoJ2Rpc3RyaWJ1dGVkVHJhY2luZ09yaWdpbnMnKTtcbiAgICAgIHZhciBjdXJyZW50VXJsID0gbmV3IFVybCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICB2YXIgaXNTYW1lT3JpZ2luID0gY2hlY2tTYW1lT3JpZ2luKHJlcXVlc3RVcmwub3JpZ2luLCBjdXJyZW50VXJsLm9yaWdpbikgfHwgY2hlY2tTYW1lT3JpZ2luKHJlcXVlc3RVcmwub3JpZ2luLCBkdE9yaWdpbnMpO1xuICAgICAgdmFyIHRhcmdldCA9IGRhdGEudGFyZ2V0O1xuXG4gICAgICBpZiAoaXNEdEVuYWJsZWQgJiYgaXNTYW1lT3JpZ2luICYmIHRhcmdldCkge1xuICAgICAgICB0aGlzLmluamVjdER0SGVhZGVyKHNwYW4sIHRhcmdldCk7XG4gICAgICAgIHZhciBwcm9wYWdhdGVUcmFjZXN0YXRlID0gY29uZmlnU2VydmljZS5nZXQoJ3Byb3BhZ2F0ZVRyYWNlc3RhdGUnKTtcblxuICAgICAgICBpZiAocHJvcGFnYXRlVHJhY2VzdGF0ZSkge1xuICAgICAgICAgIHRoaXMuaW5qZWN0VFNIZWFkZXIoc3BhbiwgdGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dpblNlcnZpY2UuZGVidWcoXCJDb3VsZCBub3QgaW5qZWN0IGRpc3RyaWJ1dGVkIHRyYWNpbmcgaGVhZGVyIHRvIHRoZSByZXF1ZXN0IG9yaWdpbiAoJ1wiICsgcmVxdWVzdFVybC5vcmlnaW4gKyBcIicpIGZyb20gdGhlIGN1cnJlbnQgb3JpZ2luICgnXCIgKyBjdXJyZW50VXJsLm9yaWdpbiArIFwiJylcIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLnN5bmMpIHtcbiAgICAgICAgc3Bhbi5zeW5jID0gZGF0YS5zeW5jO1xuICAgICAgfVxuXG4gICAgICBkYXRhLnNwYW4gPSBzcGFuO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQgPT09IElOVk9LRSkge1xuICAgICAgdmFyIF9kYXRhID0gdGFzay5kYXRhO1xuXG4gICAgICBpZiAoX2RhdGEgJiYgX2RhdGEuc3Bhbikge1xuICAgICAgICB2YXIgX3NwYW4gPSBfZGF0YS5zcGFuLFxuICAgICAgICAgICAgcmVzcG9uc2UgPSBfZGF0YS5yZXNwb25zZSxcbiAgICAgICAgICAgIF90YXJnZXQgPSBfZGF0YS50YXJnZXQ7XG4gICAgICAgIHZhciBzdGF0dXM7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXR1cyA9IF90YXJnZXQuc3RhdHVzO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG91dGNvbWU7XG5cbiAgICAgICAgaWYgKF9kYXRhLnN0YXR1cyAhPSAnYWJvcnQnICYmICFfZGF0YS5hYm9ydGVkKSB7XG4gICAgICAgICAgaWYgKHN0YXR1cyA+PSA0MDAgfHwgc3RhdHVzID09IDApIHtcbiAgICAgICAgICAgIG91dGNvbWUgPSBPVVRDT01FX0ZBSUxVUkU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dGNvbWUgPSBPVVRDT01FX1NVQ0NFU1M7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dGNvbWUgPSBPVVRDT01FX1VOS05PV047XG4gICAgICAgIH1cblxuICAgICAgICBfc3Bhbi5vdXRjb21lID0gb3V0Y29tZTtcbiAgICAgICAgdmFyIHRyID0gdHJhbnNhY3Rpb25TZXJ2aWNlLmdldEN1cnJlbnRUcmFuc2FjdGlvbigpO1xuXG4gICAgICAgIGlmICh0ciAmJiB0ci50eXBlID09PSBIVFRQX1JFUVVFU1RfVFlQRSkge1xuICAgICAgICAgIHRyLm91dGNvbWUgPSBvdXRjb21lO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJhbnNhY3Rpb25TZXJ2aWNlLmVuZFNwYW4oX3NwYW4sIF9kYXRhKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmluamVjdER0SGVhZGVyID0gZnVuY3Rpb24gaW5qZWN0RHRIZWFkZXIoc3BhbiwgdGFyZ2V0KSB7XG4gICAgdmFyIGhlYWRlck5hbWUgPSB0aGlzLl9jb25maWdTZXJ2aWNlLmdldCgnZGlzdHJpYnV0ZWRUcmFjaW5nSGVhZGVyTmFtZScpO1xuXG4gICAgdmFyIGhlYWRlclZhbHVlID0gZ2V0RHRIZWFkZXJWYWx1ZShzcGFuKTtcbiAgICB2YXIgaXNIZWFkZXJWYWxpZCA9IGlzRHRIZWFkZXJWYWxpZChoZWFkZXJWYWx1ZSk7XG5cbiAgICBpZiAoaXNIZWFkZXJWYWxpZCAmJiBoZWFkZXJWYWx1ZSAmJiBoZWFkZXJOYW1lKSB7XG4gICAgICBzZXRSZXF1ZXN0SGVhZGVyKHRhcmdldCwgaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uaW5qZWN0VFNIZWFkZXIgPSBmdW5jdGlvbiBpbmplY3RUU0hlYWRlcihzcGFuLCB0YXJnZXQpIHtcbiAgICB2YXIgaGVhZGVyVmFsdWUgPSBnZXRUU0hlYWRlclZhbHVlKHNwYW4pO1xuXG4gICAgaWYgKGhlYWRlclZhbHVlKSB7XG4gICAgICBzZXRSZXF1ZXN0SGVhZGVyKHRhcmdldCwgJ3RyYWNlc3RhdGUnLCBoZWFkZXJWYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5leHRyYWN0RHRIZWFkZXIgPSBmdW5jdGlvbiBleHRyYWN0RHRIZWFkZXIodGFyZ2V0KSB7XG4gICAgdmFyIGNvbmZpZ1NlcnZpY2UgPSB0aGlzLl9jb25maWdTZXJ2aWNlO1xuICAgIHZhciBoZWFkZXJOYW1lID0gY29uZmlnU2VydmljZS5nZXQoJ2Rpc3RyaWJ1dGVkVHJhY2luZ0hlYWRlck5hbWUnKTtcblxuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHJldHVybiBwYXJzZUR0SGVhZGVyVmFsdWUodGFyZ2V0W2hlYWRlck5hbWVdKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmZpbHRlclRyYW5zYWN0aW9uID0gZnVuY3Rpb24gZmlsdGVyVHJhbnNhY3Rpb24odHIpIHtcbiAgICB2YXIgZHVyYXRpb24gPSB0ci5kdXJhdGlvbigpO1xuXG4gICAgaWYgKCFkdXJhdGlvbikge1xuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSBcInRyYW5zYWN0aW9uKFwiICsgdHIuaWQgKyBcIiwgXCIgKyB0ci5uYW1lICsgXCIpIHdhcyBkaXNjYXJkZWQhIFwiO1xuXG4gICAgICAgIGlmIChkdXJhdGlvbiA9PT0gMCkge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gXCJUcmFuc2FjdGlvbiBkdXJhdGlvbiBpcyAwXCI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWVzc2FnZSArPSBcIlRyYW5zYWN0aW9uIHdhc24ndCBlbmRlZFwiO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9nZ2luU2VydmljZS5kZWJ1ZyhtZXNzYWdlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0ci5pc01hbmFnZWQoKSkge1xuICAgICAgaWYgKGR1cmF0aW9uID4gVFJBTlNBQ1RJT05fRFVSQVRJT05fVEhSRVNIT0xEKSB7XG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgdGhpcy5fbG9nZ2luU2VydmljZS5kZWJ1ZyhcInRyYW5zYWN0aW9uKFwiICsgdHIuaWQgKyBcIiwgXCIgKyB0ci5uYW1lICsgXCIpIHdhcyBkaXNjYXJkZWQhIFRyYW5zYWN0aW9uIGR1cmF0aW9uIChcIiArIGR1cmF0aW9uICsgXCIpIGlzIGdyZWF0ZXIgdGhhbiBtYW5hZ2VkIHRyYW5zYWN0aW9uIHRocmVzaG9sZCAoXCIgKyBUUkFOU0FDVElPTl9EVVJBVElPTl9USFJFU0hPTEQgKyBcIilcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0ci5zYW1wbGVkICYmIHRyLnNwYW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICAgIHRoaXMuX2xvZ2dpblNlcnZpY2UuZGVidWcoXCJ0cmFuc2FjdGlvbihcIiArIHRyLmlkICsgXCIsIFwiICsgdHIubmFtZSArIFwiKSB3YXMgZGlzY2FyZGVkISBUcmFuc2FjdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBzcGFuc1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICBfcHJvdG8uY3JlYXRlVHJhbnNhY3Rpb25EYXRhTW9kZWwgPSBmdW5jdGlvbiBjcmVhdGVUcmFuc2FjdGlvbkRhdGFNb2RlbCh0cmFuc2FjdGlvbikge1xuICAgIHZhciB0cmFuc2FjdGlvblN0YXJ0ID0gdHJhbnNhY3Rpb24uX3N0YXJ0O1xuICAgIHZhciBzcGFucyA9IHRyYW5zYWN0aW9uLnNwYW5zLm1hcChmdW5jdGlvbiAoc3Bhbikge1xuICAgICAgdmFyIHNwYW5EYXRhID0ge1xuICAgICAgICBpZDogc3Bhbi5pZCxcbiAgICAgICAgdHJhbnNhY3Rpb25faWQ6IHRyYW5zYWN0aW9uLmlkLFxuICAgICAgICBwYXJlbnRfaWQ6IHNwYW4ucGFyZW50SWQgfHwgdHJhbnNhY3Rpb24uaWQsXG4gICAgICAgIHRyYWNlX2lkOiB0cmFuc2FjdGlvbi50cmFjZUlkLFxuICAgICAgICBuYW1lOiBzcGFuLm5hbWUsXG4gICAgICAgIHR5cGU6IHNwYW4udHlwZSxcbiAgICAgICAgc3VidHlwZTogc3Bhbi5zdWJ0eXBlLFxuICAgICAgICBhY3Rpb246IHNwYW4uYWN0aW9uLFxuICAgICAgICBzeW5jOiBzcGFuLnN5bmMsXG4gICAgICAgIHN0YXJ0OiBwYXJzZUludChzcGFuLl9zdGFydCAtIHRyYW5zYWN0aW9uU3RhcnQpLFxuICAgICAgICBkdXJhdGlvbjogc3Bhbi5kdXJhdGlvbigpLFxuICAgICAgICBjb250ZXh0OiBzcGFuLmNvbnRleHQsXG4gICAgICAgIG91dGNvbWU6IHNwYW4ub3V0Y29tZSxcbiAgICAgICAgc2FtcGxlX3JhdGU6IHNwYW4uc2FtcGxlUmF0ZVxuICAgICAgfTtcbiAgICAgIHJldHVybiB0cnVuY2F0ZU1vZGVsKFNQQU5fTU9ERUwsIHNwYW5EYXRhKTtcbiAgICB9KTtcbiAgICB2YXIgdHJhbnNhY3Rpb25EYXRhID0ge1xuICAgICAgaWQ6IHRyYW5zYWN0aW9uLmlkLFxuICAgICAgcGFyZW50X2lkOiB0cmFuc2FjdGlvbi5wYXJlbnRJZCxcbiAgICAgIHRyYWNlX2lkOiB0cmFuc2FjdGlvbi50cmFjZUlkLFxuICAgICAgc2Vzc2lvbjogdHJhbnNhY3Rpb24uc2Vzc2lvbixcbiAgICAgIG5hbWU6IHRyYW5zYWN0aW9uLm5hbWUsXG4gICAgICB0eXBlOiB0cmFuc2FjdGlvbi50eXBlLFxuICAgICAgZHVyYXRpb246IHRyYW5zYWN0aW9uLmR1cmF0aW9uKCksXG4gICAgICBzcGFuczogc3BhbnMsXG4gICAgICBjb250ZXh0OiB0cmFuc2FjdGlvbi5jb250ZXh0LFxuICAgICAgbWFya3M6IHRyYW5zYWN0aW9uLm1hcmtzLFxuICAgICAgYnJlYWtkb3duOiB0cmFuc2FjdGlvbi5icmVha2Rvd25UaW1pbmdzLFxuICAgICAgc3Bhbl9jb3VudDoge1xuICAgICAgICBzdGFydGVkOiBzcGFucy5sZW5ndGhcbiAgICAgIH0sXG4gICAgICBzYW1wbGVkOiB0cmFuc2FjdGlvbi5zYW1wbGVkLFxuICAgICAgc2FtcGxlX3JhdGU6IHRyYW5zYWN0aW9uLnNhbXBsZVJhdGUsXG4gICAgICBleHBlcmllbmNlOiB0cmFuc2FjdGlvbi5leHBlcmllbmNlLFxuICAgICAgb3V0Y29tZTogdHJhbnNhY3Rpb24ub3V0Y29tZVxuICAgIH07XG4gICAgcmV0dXJuIHRydW5jYXRlTW9kZWwoVFJBTlNBQ1RJT05fTU9ERUwsIHRyYW5zYWN0aW9uRGF0YSk7XG4gIH07XG5cbiAgX3Byb3RvLmNyZWF0ZVRyYW5zYWN0aW9uUGF5bG9hZCA9IGZ1bmN0aW9uIGNyZWF0ZVRyYW5zYWN0aW9uUGF5bG9hZCh0cmFuc2FjdGlvbikge1xuICAgIHZhciBhZGp1c3RlZFRyYW5zYWN0aW9uID0gYWRqdXN0VHJhbnNhY3Rpb24odHJhbnNhY3Rpb24pO1xuICAgIHZhciBmaWx0ZXJlZCA9IHRoaXMuZmlsdGVyVHJhbnNhY3Rpb24oYWRqdXN0ZWRUcmFuc2FjdGlvbik7XG5cbiAgICBpZiAoZmlsdGVyZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZVRyYW5zYWN0aW9uRGF0YU1vZGVsKHRyYW5zYWN0aW9uKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jb25maWdTZXJ2aWNlLmRpc3BhdGNoRXZlbnQoVFJBTlNBQ1RJT05fSUdOT1JFKTtcbiAgfTtcblxuICByZXR1cm4gUGVyZm9ybWFuY2VNb25pdG9yaW5nO1xufSgpO1xuXG5leHBvcnQgeyBQZXJmb3JtYW5jZU1vbml0b3JpbmcgYXMgZGVmYXVsdCB9OyIsImltcG9ydCB7IGdlbmVyYXRlUmFuZG9tSWQsIHNldExhYmVsLCBtZXJnZSwgZ2V0RHVyYXRpb24sIGdldFRpbWUgfSBmcm9tICcuLi9jb21tb24vdXRpbHMnO1xuaW1wb3J0IHsgTkFNRV9VTktOT1dOLCBUWVBFX0NVU1RPTSB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuXG52YXIgU3BhbkJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFNwYW5CYXNlKG5hbWUsIHR5cGUsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0ge307XG4gICAgfVxuXG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICBuYW1lID0gTkFNRV9VTktOT1dOO1xuICAgIH1cblxuICAgIGlmICghdHlwZSkge1xuICAgICAgdHlwZSA9IFRZUEVfQ1VTVE9NO1xuICAgIH1cblxuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuaWQgPSBvcHRpb25zLmlkIHx8IGdlbmVyYXRlUmFuZG9tSWQoMTYpO1xuICAgIHRoaXMudHJhY2VJZCA9IG9wdGlvbnMudHJhY2VJZDtcbiAgICB0aGlzLnNhbXBsZWQgPSBvcHRpb25zLnNhbXBsZWQ7XG4gICAgdGhpcy5zYW1wbGVSYXRlID0gb3B0aW9ucy5zYW1wbGVSYXRlO1xuICAgIHRoaXMudGltZXN0YW1wID0gb3B0aW9ucy50aW1lc3RhbXA7XG4gICAgdGhpcy5fc3RhcnQgPSBnZXRUaW1lKG9wdGlvbnMuc3RhcnRUaW1lKTtcbiAgICB0aGlzLl9lbmQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICAgIHRoaXMub3V0Y29tZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm9uRW5kID0gb3B0aW9ucy5vbkVuZDtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTcGFuQmFzZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvLmVuc3VyZUNvbnRleHQgPSBmdW5jdGlvbiBlbnN1cmVDb250ZXh0KCkge1xuICAgIGlmICghdGhpcy5jb250ZXh0KSB7XG4gICAgICB0aGlzLmNvbnRleHQgPSB7fTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmFkZExhYmVscyA9IGZ1bmN0aW9uIGFkZExhYmVscyh0YWdzKSB7XG4gICAgdGhpcy5lbnN1cmVDb250ZXh0KCk7XG4gICAgdmFyIGN0eCA9IHRoaXMuY29udGV4dDtcblxuICAgIGlmICghY3R4LnRhZ3MpIHtcbiAgICAgIGN0eC50YWdzID0ge307XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0YWdzKTtcbiAgICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgIHJldHVybiBzZXRMYWJlbChrLCB0YWdzW2tdLCBjdHgudGFncyk7XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLmFkZENvbnRleHQgPSBmdW5jdGlvbiBhZGRDb250ZXh0KCkge1xuICAgIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBjb250ZXh0ID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgY29udGV4dFtfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgICB9XG5cbiAgICBpZiAoY29udGV4dC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICB0aGlzLmVuc3VyZUNvbnRleHQoKTtcbiAgICB0aGlzLmNvbnRleHQgPSBtZXJnZS5hcHBseSh2b2lkIDAsIFt0aGlzLmNvbnRleHRdLmNvbmNhdChjb250ZXh0KSk7XG4gIH07XG5cbiAgX3Byb3RvLmVuZCA9IGZ1bmN0aW9uIGVuZChlbmRUaW1lKSB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9lbmQgPSBnZXRUaW1lKGVuZFRpbWUpO1xuICAgIHRoaXMuY2FsbE9uRW5kKCk7XG4gIH07XG5cbiAgX3Byb3RvLmNhbGxPbkVuZCA9IGZ1bmN0aW9uIGNhbGxPbkVuZCgpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMub25FbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMub25FbmQodGhpcyk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5kdXJhdGlvbiA9IGZ1bmN0aW9uIGR1cmF0aW9uKCkge1xuICAgIHJldHVybiBnZXREdXJhdGlvbih0aGlzLl9zdGFydCwgdGhpcy5fZW5kKTtcbiAgfTtcblxuICByZXR1cm4gU3BhbkJhc2U7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFNwYW5CYXNlOyIsImZ1bmN0aW9uIF9pbmhlcml0c0xvb3NlKHN1YkNsYXNzLCBzdXBlckNsYXNzKSB7IHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcy5wcm90b3R5cGUpOyBzdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJDbGFzczsgX3NldFByb3RvdHlwZU9mKHN1YkNsYXNzLCBzdXBlckNsYXNzKTsgfVxuXG5mdW5jdGlvbiBfc2V0UHJvdG90eXBlT2YobywgcCkgeyBfc2V0UHJvdG90eXBlT2YgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgby5fX3Byb3RvX18gPSBwOyByZXR1cm4gbzsgfTsgcmV0dXJuIF9zZXRQcm90b3R5cGVPZihvLCBwKTsgfVxuXG5pbXBvcnQgU3BhbkJhc2UgZnJvbSAnLi9zcGFuLWJhc2UnO1xuaW1wb3J0IHsgYWRkU3BhbkNvbnRleHQgfSBmcm9tICcuLi9jb21tb24vY29udGV4dCc7XG5cbnZhciBTcGFuID0gZnVuY3Rpb24gKF9TcGFuQmFzZSkge1xuICBfaW5oZXJpdHNMb29zZShTcGFuLCBfU3BhbkJhc2UpO1xuXG4gIGZ1bmN0aW9uIFNwYW4obmFtZSwgdHlwZSwgb3B0aW9ucykge1xuICAgIHZhciBfdGhpcztcblxuICAgIF90aGlzID0gX1NwYW5CYXNlLmNhbGwodGhpcywgbmFtZSwgdHlwZSwgb3B0aW9ucykgfHwgdGhpcztcbiAgICBfdGhpcy5wYXJlbnRJZCA9IF90aGlzLm9wdGlvbnMucGFyZW50SWQ7XG4gICAgX3RoaXMuc3VidHlwZSA9IHVuZGVmaW5lZDtcbiAgICBfdGhpcy5hY3Rpb24gPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoX3RoaXMudHlwZS5pbmRleE9mKCcuJykgIT09IC0xKSB7XG4gICAgICB2YXIgZmllbGRzID0gX3RoaXMudHlwZS5zcGxpdCgnLicsIDMpO1xuXG4gICAgICBfdGhpcy50eXBlID0gZmllbGRzWzBdO1xuICAgICAgX3RoaXMuc3VidHlwZSA9IGZpZWxkc1sxXTtcbiAgICAgIF90aGlzLmFjdGlvbiA9IGZpZWxkc1syXTtcbiAgICB9XG5cbiAgICBfdGhpcy5zeW5jID0gX3RoaXMub3B0aW9ucy5zeW5jO1xuICAgIHJldHVybiBfdGhpcztcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBTcGFuLnByb3RvdHlwZTtcblxuICBfcHJvdG8uZW5kID0gZnVuY3Rpb24gZW5kKGVuZFRpbWUsIGRhdGEpIHtcbiAgICBfU3BhbkJhc2UucHJvdG90eXBlLmVuZC5jYWxsKHRoaXMsIGVuZFRpbWUpO1xuXG4gICAgYWRkU3BhbkNvbnRleHQodGhpcywgZGF0YSk7XG4gIH07XG5cbiAgcmV0dXJuIFNwYW47XG59KFNwYW5CYXNlKTtcblxuZXhwb3J0IGRlZmF1bHQgU3BhbjsiLCJpbXBvcnQgeyBQcm9taXNlIH0gZnJvbSAnLi4vY29tbW9uL3BvbHlmaWxscyc7XG5pbXBvcnQgVHJhbnNhY3Rpb24gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBQZXJmRW50cnlSZWNvcmRlciwgY2FwdHVyZU9ic2VydmVyRW50cmllcywgbWV0cmljcywgY3JlYXRlVG90YWxCbG9ja2luZ1RpbWVTcGFuIH0gZnJvbSAnLi9tZXRyaWNzL21ldHJpY3MnO1xuaW1wb3J0IHsgZXh0ZW5kLCBnZXRFYXJsaWVzdFNwYW4sIGdldExhdGVzdE5vblhIUlNwYW4sIGdldExhdGVzdFhIUlNwYW4sIGlzUGVyZlR5cGVTdXBwb3J0ZWQsIGdlbmVyYXRlUmFuZG9tSWQgfSBmcm9tICcuLi9jb21tb24vdXRpbHMnO1xuaW1wb3J0IHsgY2FwdHVyZU5hdmlnYXRpb24gfSBmcm9tICcuL25hdmlnYXRpb24vY2FwdHVyZS1uYXZpZ2F0aW9uJztcbmltcG9ydCB7IFBBR0VfTE9BRCwgTkFNRV9VTktOT1dOLCBUUkFOU0FDVElPTl9TVEFSVCwgVFJBTlNBQ1RJT05fRU5ELCBUUkFOU0FDVElPTl9JR05PUkUsIFRFTVBPUkFSWV9UWVBFLCBUUkFOU0FDVElPTl9UWVBFX09SREVSLCBMQVJHRVNUX0NPTlRFTlRGVUxfUEFJTlQsIExPTkdfVEFTSywgUEFJTlQsIFRSVU5DQVRFRF9UWVBFLCBGSVJTVF9JTlBVVCwgTEFZT1VUX1NISUZULCBTRVNTSU9OX1RJTUVPVVQsIFBBR0VfTE9BRF9ERUxBWSB9IGZyb20gJy4uL2NvbW1vbi9jb25zdGFudHMnO1xuaW1wb3J0IHsgYWRkVHJhbnNhY3Rpb25Db250ZXh0IH0gZnJvbSAnLi4vY29tbW9uL2NvbnRleHQnO1xuaW1wb3J0IHsgX19ERVZfXywgc3RhdGUgfSBmcm9tICcuLi9zdGF0ZSc7XG5pbXBvcnQgeyBzbHVnaWZ5VXJsIH0gZnJvbSAnLi4vY29tbW9uL3VybCc7XG5cbnZhciBUcmFuc2FjdGlvblNlcnZpY2UgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFRyYW5zYWN0aW9uU2VydmljZShsb2dnZXIsIGNvbmZpZykge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gICAgdGhpcy5fbG9nZ2VyID0gbG9nZ2VyO1xuICAgIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmVzcEludGVydmFsSWQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5yZWNvcmRlciA9IG5ldyBQZXJmRW50cnlSZWNvcmRlcihmdW5jdGlvbiAobGlzdCkge1xuICAgICAgdmFyIHRyID0gX3RoaXMuZ2V0Q3VycmVudFRyYW5zYWN0aW9uKCk7XG5cbiAgICAgIGlmICh0ciAmJiB0ci5jYXB0dXJlVGltaW5ncykge1xuICAgICAgICB2YXIgX3RyJHNwYW5zO1xuXG4gICAgICAgIHZhciBpc0hhcmROYXZpZ2F0aW9uID0gdHIudHlwZSA9PT0gUEFHRV9MT0FEO1xuXG4gICAgICAgIHZhciBfY2FwdHVyZU9ic2VydmVyRW50cmkgPSBjYXB0dXJlT2JzZXJ2ZXJFbnRyaWVzKGxpc3QsIHtcbiAgICAgICAgICBpc0hhcmROYXZpZ2F0aW9uOiBpc0hhcmROYXZpZ2F0aW9uLFxuICAgICAgICAgIHRyU3RhcnQ6IGlzSGFyZE5hdmlnYXRpb24gPyAwIDogdHIuX3N0YXJ0XG4gICAgICAgIH0pLFxuICAgICAgICAgICAgc3BhbnMgPSBfY2FwdHVyZU9ic2VydmVyRW50cmkuc3BhbnMsXG4gICAgICAgICAgICBtYXJrcyA9IF9jYXB0dXJlT2JzZXJ2ZXJFbnRyaS5tYXJrcztcblxuICAgICAgICAoX3RyJHNwYW5zID0gdHIuc3BhbnMpLnB1c2guYXBwbHkoX3RyJHNwYW5zLCBzcGFucyk7XG5cbiAgICAgICAgdHIuYWRkTWFya3Moe1xuICAgICAgICAgIGFnZW50OiBtYXJrc1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBUcmFuc2FjdGlvblNlcnZpY2UucHJvdG90eXBlO1xuXG4gIF9wcm90by5jcmVhdGVDdXJyZW50VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiBjcmVhdGVDdXJyZW50VHJhbnNhY3Rpb24obmFtZSwgdHlwZSwgb3B0aW9ucykge1xuICAgIHZhciB0ciA9IG5ldyBUcmFuc2FjdGlvbihuYW1lLCB0eXBlLCBvcHRpb25zKTtcbiAgICB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiA9IHRyO1xuICAgIHJldHVybiB0cjtcbiAgfTtcblxuICBfcHJvdG8uZ2V0Q3VycmVudFRyYW5zYWN0aW9uID0gZnVuY3Rpb24gZ2V0Q3VycmVudFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbiAmJiAhdGhpcy5jdXJyZW50VHJhbnNhY3Rpb24uZW5kZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbjtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmNyZWF0ZU9wdGlvbnMgPSBmdW5jdGlvbiBjcmVhdGVPcHRpb25zKG9wdGlvbnMpIHtcbiAgICB2YXIgY29uZmlnID0gdGhpcy5fY29uZmlnLmNvbmZpZztcbiAgICB2YXIgcHJlc2V0T3B0aW9ucyA9IHtcbiAgICAgIHRyYW5zYWN0aW9uU2FtcGxlUmF0ZTogY29uZmlnLnRyYW5zYWN0aW9uU2FtcGxlUmF0ZVxuICAgIH07XG4gICAgdmFyIHBlcmZPcHRpb25zID0gZXh0ZW5kKHByZXNldE9wdGlvbnMsIG9wdGlvbnMpO1xuXG4gICAgaWYgKHBlcmZPcHRpb25zLm1hbmFnZWQpIHtcbiAgICAgIHBlcmZPcHRpb25zID0gZXh0ZW5kKHtcbiAgICAgICAgcGFnZUxvYWRUcmFjZUlkOiBjb25maWcucGFnZUxvYWRUcmFjZUlkLFxuICAgICAgICBwYWdlTG9hZFNhbXBsZWQ6IGNvbmZpZy5wYWdlTG9hZFNhbXBsZWQsXG4gICAgICAgIHBhZ2VMb2FkU3BhbklkOiBjb25maWcucGFnZUxvYWRTcGFuSWQsXG4gICAgICAgIHBhZ2VMb2FkVHJhbnNhY3Rpb25OYW1lOiBjb25maWcucGFnZUxvYWRUcmFuc2FjdGlvbk5hbWUsXG4gICAgICAgIHBhZ2VMb2FkUGFyZW50SWQ6IGNvbmZpZy5wYWdlTG9hZFBhcmVudElkXG4gICAgICB9LCBwZXJmT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlcmZPcHRpb25zO1xuICB9O1xuXG4gIF9wcm90by5zdGFydE1hbmFnZWRUcmFuc2FjdGlvbiA9IGZ1bmN0aW9uIHN0YXJ0TWFuYWdlZFRyYW5zYWN0aW9uKG5hbWUsIHR5cGUsIHBlcmZPcHRpb25zKSB7XG4gICAgdmFyIHRyID0gdGhpcy5nZXRDdXJyZW50VHJhbnNhY3Rpb24oKTtcbiAgICB2YXIgaXNSZWRlZmluZWQgPSBmYWxzZTtcblxuICAgIGlmICghdHIpIHtcbiAgICAgIHRyID0gdGhpcy5jcmVhdGVDdXJyZW50VHJhbnNhY3Rpb24obmFtZSwgdHlwZSwgcGVyZk9wdGlvbnMpO1xuICAgIH0gZWxzZSBpZiAodHIuY2FuUmV1c2UoKSAmJiBwZXJmT3B0aW9ucy5jYW5SZXVzZSkge1xuICAgICAgdmFyIHJlZGVmaW5lVHlwZSA9IHRyLnR5cGU7XG4gICAgICB2YXIgY3VycmVudFR5cGVPcmRlciA9IFRSQU5TQUNUSU9OX1RZUEVfT1JERVIuaW5kZXhPZih0ci50eXBlKTtcbiAgICAgIHZhciByZWRlZmluZVR5cGVPcmRlciA9IFRSQU5TQUNUSU9OX1RZUEVfT1JERVIuaW5kZXhPZih0eXBlKTtcblxuICAgICAgaWYgKGN1cnJlbnRUeXBlT3JkZXIgPj0gMCAmJiByZWRlZmluZVR5cGVPcmRlciA8IGN1cnJlbnRUeXBlT3JkZXIpIHtcbiAgICAgICAgcmVkZWZpbmVUeXBlID0gdHlwZTtcbiAgICAgIH1cblxuICAgICAgaWYgKF9fREVWX18pIHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKFwicmVkZWZpbmluZyB0cmFuc2FjdGlvbihcIiArIHRyLmlkICsgXCIsIFwiICsgdHIubmFtZSArIFwiLCBcIiArIHRyLnR5cGUgKyBcIilcIiwgJ3RvJywgXCIoXCIgKyAobmFtZSB8fCB0ci5uYW1lKSArIFwiLCBcIiArIHJlZGVmaW5lVHlwZSArIFwiKVwiLCB0cik7XG4gICAgICB9XG5cbiAgICAgIHRyLnJlZGVmaW5lKG5hbWUsIHJlZGVmaW5lVHlwZSwgcGVyZk9wdGlvbnMpO1xuICAgICAgaXNSZWRlZmluZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICB0aGlzLl9sb2dnZXIuZGVidWcoXCJlbmRpbmcgcHJldmlvdXMgdHJhbnNhY3Rpb24oXCIgKyB0ci5pZCArIFwiLCBcIiArIHRyLm5hbWUgKyBcIilcIiwgdHIpO1xuICAgICAgfVxuXG4gICAgICB0ci5lbmQoKTtcbiAgICAgIHRyID0gdGhpcy5jcmVhdGVDdXJyZW50VHJhbnNhY3Rpb24obmFtZSwgdHlwZSwgcGVyZk9wdGlvbnMpO1xuICAgIH1cblxuICAgIGlmICh0ci50eXBlID09PSBQQUdFX0xPQUQpIHtcbiAgICAgIGlmICghaXNSZWRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yZWNvcmRlci5zdGFydChMQVJHRVNUX0NPTlRFTlRGVUxfUEFJTlQpO1xuICAgICAgICB0aGlzLnJlY29yZGVyLnN0YXJ0KFBBSU5UKTtcbiAgICAgICAgdGhpcy5yZWNvcmRlci5zdGFydChGSVJTVF9JTlBVVCk7XG4gICAgICAgIHRoaXMucmVjb3JkZXIuc3RhcnQoTEFZT1VUX1NISUZUKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBlcmZPcHRpb25zLnBhZ2VMb2FkVHJhY2VJZCkge1xuICAgICAgICB0ci50cmFjZUlkID0gcGVyZk9wdGlvbnMucGFnZUxvYWRUcmFjZUlkO1xuICAgICAgfVxuXG4gICAgICBpZiAocGVyZk9wdGlvbnMucGFnZUxvYWRTYW1wbGVkKSB7XG4gICAgICAgIHRyLnNhbXBsZWQgPSBwZXJmT3B0aW9ucy5wYWdlTG9hZFNhbXBsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0ci5uYW1lID09PSBOQU1FX1VOS05PV04gJiYgcGVyZk9wdGlvbnMucGFnZUxvYWRUcmFuc2FjdGlvbk5hbWUpIHtcbiAgICAgICAgdHIubmFtZSA9IHBlcmZPcHRpb25zLnBhZ2VMb2FkVHJhbnNhY3Rpb25OYW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghaXNSZWRlZmluZWQgJiYgdGhpcy5fY29uZmlnLmdldCgnbW9uaXRvckxvbmd0YXNrcycpKSB7XG4gICAgICB0aGlzLnJlY29yZGVyLnN0YXJ0KExPTkdfVEFTSyk7XG4gICAgfVxuXG4gICAgaWYgKHRyLnNhbXBsZWQpIHtcbiAgICAgIHRyLmNhcHR1cmVUaW1pbmdzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHI7XG4gIH07XG5cbiAgX3Byb3RvLnN0YXJ0VHJhbnNhY3Rpb24gPSBmdW5jdGlvbiBzdGFydFRyYW5zYWN0aW9uKG5hbWUsIHR5cGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHZhciBwZXJmT3B0aW9ucyA9IHRoaXMuY3JlYXRlT3B0aW9ucyhvcHRpb25zKTtcbiAgICB2YXIgdHI7XG4gICAgdmFyIGZpcmVPbnN0YXJ0SG9vayA9IHRydWU7XG5cbiAgICBpZiAocGVyZk9wdGlvbnMubWFuYWdlZCkge1xuICAgICAgdmFyIGN1cnJlbnQgPSB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbjtcbiAgICAgIHRyID0gdGhpcy5zdGFydE1hbmFnZWRUcmFuc2FjdGlvbihuYW1lLCB0eXBlLCBwZXJmT3B0aW9ucyk7XG5cbiAgICAgIGlmIChjdXJyZW50ID09PSB0cikge1xuICAgICAgICBmaXJlT25zdGFydEhvb2sgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdHIgPSBuZXcgVHJhbnNhY3Rpb24obmFtZSwgdHlwZSwgcGVyZk9wdGlvbnMpO1xuICAgIH1cblxuICAgIHRyLm9uRW5kID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzMi5oYW5kbGVUcmFuc2FjdGlvbkVuZCh0cik7XG4gICAgfTtcblxuICAgIGlmIChmaXJlT25zdGFydEhvb2spIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhcInN0YXJ0VHJhbnNhY3Rpb24oXCIgKyB0ci5pZCArIFwiLCBcIiArIHRyLm5hbWUgKyBcIiwgXCIgKyB0ci50eXBlICsgXCIpXCIpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jb25maWcuZXZlbnRzLnNlbmQoVFJBTlNBQ1RJT05fU1RBUlQsIFt0cl0pO1xuICAgIH1cblxuICAgIHJldHVybiB0cjtcbiAgfTtcblxuICBfcHJvdG8uaGFuZGxlVHJhbnNhY3Rpb25FbmQgPSBmdW5jdGlvbiBoYW5kbGVUcmFuc2FjdGlvbkVuZCh0cikge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgdGhpcy5yZWNvcmRlci5zdG9wKCk7XG4gICAgdmFyIGN1cnJlbnRVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgbmFtZSA9IHRyLm5hbWUsXG4gICAgICAgICAgdHlwZSA9IHRyLnR5cGU7XG4gICAgICB2YXIgbGFzdEhpZGRlblN0YXJ0ID0gc3RhdGUubGFzdEhpZGRlblN0YXJ0O1xuXG4gICAgICBpZiAobGFzdEhpZGRlblN0YXJ0ID49IHRyLl9zdGFydCkge1xuICAgICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICAgIF90aGlzMy5fbG9nZ2VyLmRlYnVnKFwidHJhbnNhY3Rpb24oXCIgKyB0ci5pZCArIFwiLCBcIiArIG5hbWUgKyBcIiwgXCIgKyB0eXBlICsgXCIpIHdhcyBkaXNjYXJkZWQhIFRoZSBwYWdlIHdhcyBoaWRkZW4gZHVyaW5nIHRoZSB0cmFuc2FjdGlvbiFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczMuX2NvbmZpZy5kaXNwYXRjaEV2ZW50KFRSQU5TQUNUSU9OX0lHTk9SRSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoX3RoaXMzLnNob3VsZElnbm9yZVRyYW5zYWN0aW9uKG5hbWUpIHx8IHR5cGUgPT09IFRFTVBPUkFSWV9UWVBFKSB7XG4gICAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgICAgX3RoaXMzLl9sb2dnZXIuZGVidWcoXCJ0cmFuc2FjdGlvbihcIiArIHRyLmlkICsgXCIsIFwiICsgbmFtZSArIFwiLCBcIiArIHR5cGUgKyBcIikgaXMgaWdub3JlZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMy5fY29uZmlnLmRpc3BhdGNoRXZlbnQoVFJBTlNBQ1RJT05fSUdOT1JFKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSBQQUdFX0xPQUQpIHtcbiAgICAgICAgdmFyIHBhZ2VMb2FkVHJhbnNhY3Rpb25OYW1lID0gX3RoaXMzLl9jb25maWcuZ2V0KCdwYWdlTG9hZFRyYW5zYWN0aW9uTmFtZScpO1xuXG4gICAgICAgIGlmIChuYW1lID09PSBOQU1FX1VOS05PV04gJiYgcGFnZUxvYWRUcmFuc2FjdGlvbk5hbWUpIHtcbiAgICAgICAgICB0ci5uYW1lID0gcGFnZUxvYWRUcmFuc2FjdGlvbk5hbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHIuY2FwdHVyZVRpbWluZ3MpIHtcbiAgICAgICAgICB2YXIgY2xzID0gbWV0cmljcy5jbHMsXG4gICAgICAgICAgICAgIGZpZCA9IG1ldHJpY3MuZmlkLFxuICAgICAgICAgICAgICB0YnQgPSBtZXRyaWNzLnRidCxcbiAgICAgICAgICAgICAgbG9uZ3Rhc2sgPSBtZXRyaWNzLmxvbmd0YXNrO1xuXG4gICAgICAgICAgaWYgKHRidC5kdXJhdGlvbiA+IDApIHtcbiAgICAgICAgICAgIHRyLnNwYW5zLnB1c2goY3JlYXRlVG90YWxCbG9ja2luZ1RpbWVTcGFuKHRidCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyLmV4cGVyaWVuY2UgPSB7fTtcblxuICAgICAgICAgIGlmIChpc1BlcmZUeXBlU3VwcG9ydGVkKExPTkdfVEFTSykpIHtcbiAgICAgICAgICAgIHRyLmV4cGVyaWVuY2UudGJ0ID0gdGJ0LmR1cmF0aW9uO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChpc1BlcmZUeXBlU3VwcG9ydGVkKExBWU9VVF9TSElGVCkpIHtcbiAgICAgICAgICAgIHRyLmV4cGVyaWVuY2UuY2xzID0gY2xzLnNjb3JlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChmaWQgPiAwKSB7XG4gICAgICAgICAgICB0ci5leHBlcmllbmNlLmZpZCA9IGZpZDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobG9uZ3Rhc2suY291bnQgPiAwKSB7XG4gICAgICAgICAgICB0ci5leHBlcmllbmNlLmxvbmd0YXNrID0ge1xuICAgICAgICAgICAgICBjb3VudDogbG9uZ3Rhc2suY291bnQsXG4gICAgICAgICAgICAgIHN1bTogbG9uZ3Rhc2suZHVyYXRpb24sXG4gICAgICAgICAgICAgIG1heDogbG9uZ3Rhc2subWF4XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMy5zZXRTZXNzaW9uKHRyKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyLm5hbWUgPT09IE5BTUVfVU5LTk9XTikge1xuICAgICAgICB0ci5uYW1lID0gc2x1Z2lmeVVybChjdXJyZW50VXJsKTtcbiAgICAgIH1cblxuICAgICAgY2FwdHVyZU5hdmlnYXRpb24odHIpO1xuXG4gICAgICBfdGhpczMuYWRqdXN0VHJhbnNhY3Rpb25UaW1lKHRyKTtcblxuICAgICAgdmFyIGJyZWFrZG93bk1ldHJpY3MgPSBfdGhpczMuX2NvbmZpZy5nZXQoJ2JyZWFrZG93bk1ldHJpY3MnKTtcblxuICAgICAgaWYgKGJyZWFrZG93bk1ldHJpY3MpIHtcbiAgICAgICAgdHIuY2FwdHVyZUJyZWFrZG93bigpO1xuICAgICAgfVxuXG4gICAgICB2YXIgY29uZmlnQ29udGV4dCA9IF90aGlzMy5fY29uZmlnLmdldCgnY29udGV4dCcpO1xuXG4gICAgICBhZGRUcmFuc2FjdGlvbkNvbnRleHQodHIsIGNvbmZpZ0NvbnRleHQpO1xuXG4gICAgICBfdGhpczMuX2NvbmZpZy5ldmVudHMuc2VuZChUUkFOU0FDVElPTl9FTkQsIFt0cl0pO1xuXG4gICAgICBpZiAoX19ERVZfXykge1xuICAgICAgICBfdGhpczMuX2xvZ2dlci5kZWJ1ZyhcImVuZCB0cmFuc2FjdGlvbihcIiArIHRyLmlkICsgXCIsIFwiICsgdHIubmFtZSArIFwiLCBcIiArIHRyLnR5cGUgKyBcIilcIiwgdHIpO1xuICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICAgIF90aGlzMy5fbG9nZ2VyLmRlYnVnKFwiZXJyb3IgZW5kaW5nIHRyYW5zYWN0aW9uKFwiICsgdHIuaWQgKyBcIiwgXCIgKyB0ci5uYW1lICsgXCIpXCIsIGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgX3Byb3RvLnNldFNlc3Npb24gPSBmdW5jdGlvbiBzZXRTZXNzaW9uKHRyKSB7XG4gICAgdmFyIHNlc3Npb24gPSB0aGlzLl9jb25maWcuZ2V0KCdzZXNzaW9uJyk7XG5cbiAgICBpZiAoc2Vzc2lvbikge1xuICAgICAgaWYgKHR5cGVvZiBzZXNzaW9uID09ICdib29sZWFuJykge1xuICAgICAgICB0ci5zZXNzaW9uID0ge1xuICAgICAgICAgIGlkOiBnZW5lcmF0ZVJhbmRvbUlkKDE2KSxcbiAgICAgICAgICBzZXF1ZW5jZTogMVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNlc3Npb24udGltZXN0YW1wICYmIERhdGUubm93KCkgLSBzZXNzaW9uLnRpbWVzdGFtcCA+IFNFU1NJT05fVElNRU9VVCkge1xuICAgICAgICAgIHRyLnNlc3Npb24gPSB7XG4gICAgICAgICAgICBpZDogZ2VuZXJhdGVSYW5kb21JZCgxNiksXG4gICAgICAgICAgICBzZXF1ZW5jZTogMVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHIuc2Vzc2lvbiA9IHtcbiAgICAgICAgICAgIGlkOiBzZXNzaW9uLmlkLFxuICAgICAgICAgICAgc2VxdWVuY2U6IHNlc3Npb24uc2VxdWVuY2UgPyBzZXNzaW9uLnNlcXVlbmNlICsgMSA6IDFcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHZhciBzZXNzaW9uQ29uZmlnID0ge1xuICAgICAgICBzZXNzaW9uOiB7XG4gICAgICAgICAgaWQ6IHRyLnNlc3Npb24uaWQsXG4gICAgICAgICAgc2VxdWVuY2U6IHRyLnNlc3Npb24uc2VxdWVuY2UsXG4gICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHRoaXMuX2NvbmZpZy5zZXRDb25maWcoc2Vzc2lvbkNvbmZpZyk7XG5cbiAgICAgIHRoaXMuX2NvbmZpZy5zZXRMb2NhbENvbmZpZyhzZXNzaW9uQ29uZmlnLCB0cnVlKTtcbiAgICB9XG4gIH07XG5cbiAgX3Byb3RvLmFkanVzdFRyYW5zYWN0aW9uVGltZSA9IGZ1bmN0aW9uIGFkanVzdFRyYW5zYWN0aW9uVGltZSh0cmFuc2FjdGlvbikge1xuICAgIHZhciBzcGFucyA9IHRyYW5zYWN0aW9uLnNwYW5zO1xuICAgIHZhciBlYXJsaWVzdFNwYW4gPSBnZXRFYXJsaWVzdFNwYW4oc3BhbnMpO1xuXG4gICAgaWYgKGVhcmxpZXN0U3BhbiAmJiBlYXJsaWVzdFNwYW4uX3N0YXJ0IDwgdHJhbnNhY3Rpb24uX3N0YXJ0KSB7XG4gICAgICB0cmFuc2FjdGlvbi5fc3RhcnQgPSBlYXJsaWVzdFNwYW4uX3N0YXJ0O1xuICAgIH1cblxuICAgIHZhciBsYXRlc3RTcGFuID0gZ2V0TGF0ZXN0Tm9uWEhSU3BhbihzcGFucykgfHwge307XG4gICAgdmFyIGxhdGVzdFNwYW5FbmQgPSBsYXRlc3RTcGFuLl9lbmQgfHwgMDtcblxuICAgIGlmICh0cmFuc2FjdGlvbi50eXBlID09PSBQQUdFX0xPQUQpIHtcbiAgICAgIHZhciB0cmFuc2FjdGlvbkVuZFdpdGhvdXREZWxheSA9IHRyYW5zYWN0aW9uLl9lbmQgLSBQQUdFX0xPQURfREVMQVk7XG4gICAgICB2YXIgbGNwID0gbWV0cmljcy5sY3AgfHwgMDtcbiAgICAgIHZhciBsYXRlc3RYSFJTcGFuID0gZ2V0TGF0ZXN0WEhSU3BhbihzcGFucykgfHwge307XG4gICAgICB2YXIgbGF0ZXN0WEhSU3BhbkVuZCA9IGxhdGVzdFhIUlNwYW4uX2VuZCB8fCAwO1xuICAgICAgdHJhbnNhY3Rpb24uX2VuZCA9IE1hdGgubWF4KGxhdGVzdFNwYW5FbmQsIGxhdGVzdFhIUlNwYW5FbmQsIGxjcCwgdHJhbnNhY3Rpb25FbmRXaXRob3V0RGVsYXkpO1xuICAgIH0gZWxzZSBpZiAobGF0ZXN0U3BhbkVuZCA+IHRyYW5zYWN0aW9uLl9lbmQpIHtcbiAgICAgIHRyYW5zYWN0aW9uLl9lbmQgPSBsYXRlc3RTcGFuRW5kO1xuICAgIH1cblxuICAgIHRoaXMudHJ1bmNhdGVTcGFucyhzcGFucywgdHJhbnNhY3Rpb24uX2VuZCk7XG4gIH07XG5cbiAgX3Byb3RvLnRydW5jYXRlU3BhbnMgPSBmdW5jdGlvbiB0cnVuY2F0ZVNwYW5zKHNwYW5zLCB0cmFuc2FjdGlvbkVuZCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzcGFuID0gc3BhbnNbaV07XG5cbiAgICAgIGlmIChzcGFuLl9lbmQgPiB0cmFuc2FjdGlvbkVuZCkge1xuICAgICAgICBzcGFuLl9lbmQgPSB0cmFuc2FjdGlvbkVuZDtcbiAgICAgICAgc3Bhbi50eXBlICs9IFRSVU5DQVRFRF9UWVBFO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3Bhbi5fc3RhcnQgPiB0cmFuc2FjdGlvbkVuZCkge1xuICAgICAgICBzcGFuLl9zdGFydCA9IHRyYW5zYWN0aW9uRW5kO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uc2hvdWxkSWdub3JlVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiBzaG91bGRJZ25vcmVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbk5hbWUpIHtcbiAgICB2YXIgaWdub3JlTGlzdCA9IHRoaXMuX2NvbmZpZy5nZXQoJ2lnbm9yZVRyYW5zYWN0aW9ucycpO1xuXG4gICAgaWYgKGlnbm9yZUxpc3QgJiYgaWdub3JlTGlzdC5sZW5ndGgpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWdub3JlTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZWxlbWVudCA9IGlnbm9yZUxpc3RbaV07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnRlc3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBpZiAoZWxlbWVudC50ZXN0KHRyYW5zYWN0aW9uTmFtZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50ID09PSB0cmFuc2FjdGlvbk5hbWUpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBfcHJvdG8uc3RhcnRTcGFuID0gZnVuY3Rpb24gc3RhcnRTcGFuKG5hbWUsIHR5cGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgdHIgPSB0aGlzLmdldEN1cnJlbnRUcmFuc2FjdGlvbigpO1xuXG4gICAgaWYgKCF0cikge1xuICAgICAgdHIgPSB0aGlzLmNyZWF0ZUN1cnJlbnRUcmFuc2FjdGlvbih1bmRlZmluZWQsIFRFTVBPUkFSWV9UWVBFLCB0aGlzLmNyZWF0ZU9wdGlvbnMoe1xuICAgICAgICBjYW5SZXVzZTogdHJ1ZSxcbiAgICAgICAgbWFuYWdlZDogdHJ1ZVxuICAgICAgfSkpO1xuICAgIH1cblxuICAgIHZhciBzcGFuID0gdHIuc3RhcnRTcGFuKG5hbWUsIHR5cGUsIG9wdGlvbnMpO1xuXG4gICAgaWYgKF9fREVWX18pIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZyhcInN0YXJ0U3BhbihcIiArIG5hbWUgKyBcIiwgXCIgKyBzcGFuLnR5cGUgKyBcIilcIiwgXCJvbiB0cmFuc2FjdGlvbihcIiArIHRyLmlkICsgXCIsIFwiICsgdHIubmFtZSArIFwiKVwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3BhbjtcbiAgfTtcblxuICBfcHJvdG8uZW5kU3BhbiA9IGZ1bmN0aW9uIGVuZFNwYW4oc3BhbiwgY29udGV4dCkge1xuICAgIGlmICghc3Bhbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfX0RFVl9fKSB7XG4gICAgICB2YXIgdHIgPSB0aGlzLmdldEN1cnJlbnRUcmFuc2FjdGlvbigpO1xuICAgICAgdHIgJiYgdGhpcy5fbG9nZ2VyLmRlYnVnKFwiZW5kU3BhbihcIiArIHNwYW4ubmFtZSArIFwiLCBcIiArIHNwYW4udHlwZSArIFwiKVwiLCBcIm9uIHRyYW5zYWN0aW9uKFwiICsgdHIuaWQgKyBcIiwgXCIgKyB0ci5uYW1lICsgXCIpXCIpO1xuICAgIH1cblxuICAgIHNwYW4uZW5kKG51bGwsIGNvbnRleHQpO1xuICB9O1xuXG4gIHJldHVybiBUcmFuc2FjdGlvblNlcnZpY2U7XG59KCk7XG5cbmV4cG9ydCBkZWZhdWx0IFRyYW5zYWN0aW9uU2VydmljZTsiLCJmdW5jdGlvbiBfaW5oZXJpdHNMb29zZShzdWJDbGFzcywgc3VwZXJDbGFzcykgeyBzdWJDbGFzcy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ2xhc3MucHJvdG90eXBlKTsgc3ViQ2xhc3MucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3M7IF9zZXRQcm90b3R5cGVPZihzdWJDbGFzcywgc3VwZXJDbGFzcyk7IH1cblxuZnVuY3Rpb24gX3NldFByb3RvdHlwZU9mKG8sIHApIHsgX3NldFByb3RvdHlwZU9mID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uIF9zZXRQcm90b3R5cGVPZihvLCBwKSB7IG8uX19wcm90b19fID0gcDsgcmV0dXJuIG87IH07IHJldHVybiBfc2V0UHJvdG90eXBlT2YobywgcCk7IH1cblxuaW1wb3J0IFNwYW4gZnJvbSAnLi9zcGFuJztcbmltcG9ydCBTcGFuQmFzZSBmcm9tICcuL3NwYW4tYmFzZSc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJhbmRvbUlkLCBtZXJnZSwgbm93LCBnZXRUaW1lLCBleHRlbmQsIHJlbW92ZUludmFsaWRDaGFycyB9IGZyb20gJy4uL2NvbW1vbi91dGlscyc7XG5pbXBvcnQgeyBSRVVTQUJJTElUWV9USFJFU0hPTEQsIFRSVU5DQVRFRF9UWVBFIH0gZnJvbSAnLi4vY29tbW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBjYXB0dXJlQnJlYWtkb3duIGFzIF9jYXB0dXJlQnJlYWtkb3duIH0gZnJvbSAnLi9icmVha2Rvd24nO1xuXG52YXIgVHJhbnNhY3Rpb24gPSBmdW5jdGlvbiAoX1NwYW5CYXNlKSB7XG4gIF9pbmhlcml0c0xvb3NlKFRyYW5zYWN0aW9uLCBfU3BhbkJhc2UpO1xuXG4gIGZ1bmN0aW9uIFRyYW5zYWN0aW9uKG5hbWUsIHR5cGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXM7XG5cbiAgICBfdGhpcyA9IF9TcGFuQmFzZS5jYWxsKHRoaXMsIG5hbWUsIHR5cGUsIG9wdGlvbnMpIHx8IHRoaXM7XG4gICAgX3RoaXMudHJhY2VJZCA9IGdlbmVyYXRlUmFuZG9tSWQoKTtcbiAgICBfdGhpcy5tYXJrcyA9IHVuZGVmaW5lZDtcbiAgICBfdGhpcy5zcGFucyA9IFtdO1xuICAgIF90aGlzLl9hY3RpdmVTcGFucyA9IHt9O1xuICAgIF90aGlzLl9hY3RpdmVUYXNrcyA9IG5ldyBTZXQoKTtcbiAgICBfdGhpcy5ibG9ja2VkID0gZmFsc2U7XG4gICAgX3RoaXMuY2FwdHVyZVRpbWluZ3MgPSBmYWxzZTtcbiAgICBfdGhpcy5icmVha2Rvd25UaW1pbmdzID0gW107XG4gICAgX3RoaXMuc2FtcGxlUmF0ZSA9IF90aGlzLm9wdGlvbnMudHJhbnNhY3Rpb25TYW1wbGVSYXRlO1xuICAgIF90aGlzLnNhbXBsZWQgPSBNYXRoLnJhbmRvbSgpIDw9IF90aGlzLnNhbXBsZVJhdGU7XG4gICAgcmV0dXJuIF90aGlzO1xuICB9XG5cbiAgdmFyIF9wcm90byA9IFRyYW5zYWN0aW9uLnByb3RvdHlwZTtcblxuICBfcHJvdG8uYWRkTWFya3MgPSBmdW5jdGlvbiBhZGRNYXJrcyhvYmopIHtcbiAgICB0aGlzLm1hcmtzID0gbWVyZ2UodGhpcy5tYXJrcyB8fCB7fSwgb2JqKTtcbiAgfTtcblxuICBfcHJvdG8ubWFyayA9IGZ1bmN0aW9uIG1hcmsoa2V5KSB7XG4gICAgdmFyIHNrZXkgPSByZW1vdmVJbnZhbGlkQ2hhcnMoa2V5KTtcblxuICAgIHZhciBtYXJrVGltZSA9IG5vdygpIC0gdGhpcy5fc3RhcnQ7XG5cbiAgICB2YXIgY3VzdG9tID0ge307XG4gICAgY3VzdG9tW3NrZXldID0gbWFya1RpbWU7XG4gICAgdGhpcy5hZGRNYXJrcyh7XG4gICAgICBjdXN0b206IGN1c3RvbVxuICAgIH0pO1xuICB9O1xuXG4gIF9wcm90by5jYW5SZXVzZSA9IGZ1bmN0aW9uIGNhblJldXNlKCkge1xuICAgIHZhciB0aHJlc2hvbGQgPSB0aGlzLm9wdGlvbnMucmV1c2VUaHJlc2hvbGQgfHwgUkVVU0FCSUxJVFlfVEhSRVNIT0xEO1xuICAgIHJldHVybiAhIXRoaXMub3B0aW9ucy5jYW5SZXVzZSAmJiAhdGhpcy5lbmRlZCAmJiBub3coKSAtIHRoaXMuX3N0YXJ0IDwgdGhyZXNob2xkO1xuICB9O1xuXG4gIF9wcm90by5yZWRlZmluZSA9IGZ1bmN0aW9uIHJlZGVmaW5lKG5hbWUsIHR5cGUsIG9wdGlvbnMpIHtcbiAgICBpZiAobmFtZSkge1xuICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSkge1xuICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucykge1xuICAgICAgdGhpcy5vcHRpb25zLnJldXNlVGhyZXNob2xkID0gb3B0aW9ucy5yZXVzZVRocmVzaG9sZDtcbiAgICAgIHRoaXMub3B0aW9ucyA9IGV4dGVuZCh0aGlzLm9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIH1cbiAgfTtcblxuICBfcHJvdG8uc3RhcnRTcGFuID0gZnVuY3Rpb24gc3RhcnRTcGFuKG5hbWUsIHR5cGUsIG9wdGlvbnMpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGlmICh0aGlzLmVuZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIG9wdHMgPSBleHRlbmQoe30sIG9wdGlvbnMpO1xuXG4gICAgb3B0cy5vbkVuZCA9IGZ1bmN0aW9uICh0cmMpIHtcbiAgICAgIF90aGlzMi5fb25TcGFuRW5kKHRyYyk7XG4gICAgfTtcblxuICAgIG9wdHMudHJhY2VJZCA9IHRoaXMudHJhY2VJZDtcbiAgICBvcHRzLnNhbXBsZWQgPSB0aGlzLnNhbXBsZWQ7XG4gICAgb3B0cy5zYW1wbGVSYXRlID0gdGhpcy5zYW1wbGVSYXRlO1xuXG4gICAgaWYgKCFvcHRzLnBhcmVudElkKSB7XG4gICAgICBvcHRzLnBhcmVudElkID0gdGhpcy5pZDtcbiAgICB9XG5cbiAgICB2YXIgc3BhbiA9IG5ldyBTcGFuKG5hbWUsIHR5cGUsIG9wdHMpO1xuICAgIHRoaXMuX2FjdGl2ZVNwYW5zW3NwYW4uaWRdID0gc3BhbjtcblxuICAgIGlmIChvcHRzLmJsb2NraW5nKSB7XG4gICAgICB0aGlzLmFkZFRhc2soc3Bhbi5pZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNwYW47XG4gIH07XG5cbiAgX3Byb3RvLmlzRmluaXNoZWQgPSBmdW5jdGlvbiBpc0ZpbmlzaGVkKCkge1xuICAgIHJldHVybiAhdGhpcy5ibG9ja2VkICYmIHRoaXMuX2FjdGl2ZVRhc2tzLnNpemUgPT09IDA7XG4gIH07XG5cbiAgX3Byb3RvLmRldGVjdEZpbmlzaCA9IGZ1bmN0aW9uIGRldGVjdEZpbmlzaCgpIHtcbiAgICBpZiAodGhpcy5pc0ZpbmlzaGVkKCkpIHRoaXMuZW5kKCk7XG4gIH07XG5cbiAgX3Byb3RvLmVuZCA9IGZ1bmN0aW9uIGVuZChlbmRUaW1lKSB7XG4gICAgaWYgKHRoaXMuZW5kZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9lbmQgPSBnZXRUaW1lKGVuZFRpbWUpO1xuXG4gICAgZm9yICh2YXIgc2lkIGluIHRoaXMuX2FjdGl2ZVNwYW5zKSB7XG4gICAgICB2YXIgc3BhbiA9IHRoaXMuX2FjdGl2ZVNwYW5zW3NpZF07XG4gICAgICBzcGFuLnR5cGUgPSBzcGFuLnR5cGUgKyBUUlVOQ0FURURfVFlQRTtcbiAgICAgIHNwYW4uZW5kKGVuZFRpbWUpO1xuICAgIH1cblxuICAgIHRoaXMuY2FsbE9uRW5kKCk7XG4gIH07XG5cbiAgX3Byb3RvLmNhcHR1cmVCcmVha2Rvd24gPSBmdW5jdGlvbiBjYXB0dXJlQnJlYWtkb3duKCkge1xuICAgIHRoaXMuYnJlYWtkb3duVGltaW5ncyA9IF9jYXB0dXJlQnJlYWtkb3duKHRoaXMpO1xuICB9O1xuXG4gIF9wcm90by5ibG9jayA9IGZ1bmN0aW9uIGJsb2NrKGZsYWcpIHtcbiAgICB0aGlzLmJsb2NrZWQgPSBmbGFnO1xuXG4gICAgaWYgKCF0aGlzLmJsb2NrZWQpIHtcbiAgICAgIHRoaXMuZGV0ZWN0RmluaXNoKCk7XG4gICAgfVxuICB9O1xuXG4gIF9wcm90by5hZGRUYXNrID0gZnVuY3Rpb24gYWRkVGFzayh0YXNrSWQpIHtcbiAgICBpZiAoIXRhc2tJZCkge1xuICAgICAgdGFza0lkID0gJ3Rhc2stJyArIGdlbmVyYXRlUmFuZG9tSWQoMTYpO1xuICAgIH1cblxuICAgIHRoaXMuX2FjdGl2ZVRhc2tzLmFkZCh0YXNrSWQpO1xuXG4gICAgcmV0dXJuIHRhc2tJZDtcbiAgfTtcblxuICBfcHJvdG8ucmVtb3ZlVGFzayA9IGZ1bmN0aW9uIHJlbW92ZVRhc2sodGFza0lkKSB7XG4gICAgdmFyIGRlbGV0ZWQgPSB0aGlzLl9hY3RpdmVUYXNrcy5kZWxldGUodGFza0lkKTtcblxuICAgIGRlbGV0ZWQgJiYgdGhpcy5kZXRlY3RGaW5pc2goKTtcbiAgfTtcblxuICBfcHJvdG8ucmVzZXRGaWVsZHMgPSBmdW5jdGlvbiByZXNldEZpZWxkcygpIHtcbiAgICB0aGlzLnNwYW5zID0gW107XG4gICAgdGhpcy5zYW1wbGVSYXRlID0gMDtcbiAgfTtcblxuICBfcHJvdG8uX29uU3BhbkVuZCA9IGZ1bmN0aW9uIF9vblNwYW5FbmQoc3Bhbikge1xuICAgIHRoaXMuc3BhbnMucHVzaChzcGFuKTtcbiAgICBkZWxldGUgdGhpcy5fYWN0aXZlU3BhbnNbc3Bhbi5pZF07XG4gICAgdGhpcy5yZW1vdmVUYXNrKHNwYW4uaWQpO1xuICB9O1xuXG4gIF9wcm90by5pc01hbmFnZWQgPSBmdW5jdGlvbiBpc01hbmFnZWQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5vcHRpb25zLm1hbmFnZWQ7XG4gIH07XG5cbiAgcmV0dXJuIFRyYW5zYWN0aW9uO1xufShTcGFuQmFzZSk7XG5cbmV4cG9ydCBkZWZhdWx0IFRyYW5zYWN0aW9uOyIsInZhciBfX0RFVl9fID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJztcblxudmFyIHN0YXRlID0ge1xuICBib290c3RyYXBUaW1lOiBudWxsLFxuICBsYXN0SGlkZGVuU3RhcnQ6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSXG59O1xuZXhwb3J0IHsgX19ERVZfXywgc3RhdGUgfTsiLCIvKipcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LXByZXNlbnQsIEVsYXN0aWNzZWFyY2ggQlZcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICpcbiAqL1xuXG5pbXBvcnQge1xuICBnZXRJbnN0cnVtZW50YXRpb25GbGFncyxcbiAgUEFHRV9MT0FEX0RFTEFZLFxuICBQQUdFX0xPQUQsXG4gIEVSUk9SLFxuICBDT05GSUdfU0VSVklDRSxcbiAgTE9HR0lOR19TRVJWSUNFLFxuICBUUkFOU0FDVElPTl9TRVJWSUNFLFxuICBQRVJGT1JNQU5DRV9NT05JVE9SSU5HLFxuICBFUlJPUl9MT0dHSU5HLFxuICBBUE1fU0VSVkVSLFxuICBFVkVOVF9UQVJHRVQsXG4gIENMSUNLLFxuICBvYnNlcnZlUGFnZVZpc2liaWxpdHksXG4gIG9ic2VydmVQYWdlQ2xpY2tzLFxuICBvYnNlcnZlVXNlckludGVyYWN0aW9uc1xufSBmcm9tICdAZWxhc3RpYy9hcG0tcnVtLWNvcmUnXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwbUJhc2Uge1xuICBjb25zdHJ1Y3RvcihzZXJ2aWNlRmFjdG9yeSwgZGlzYWJsZSkge1xuICAgIHRoaXMuX2Rpc2FibGUgPSBkaXNhYmxlXG4gICAgdGhpcy5zZXJ2aWNlRmFjdG9yeSA9IHNlcnZpY2VGYWN0b3J5XG4gICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZVxuICB9XG5cbiAgaXNFbmFibGVkKCkge1xuICAgIHJldHVybiAhdGhpcy5fZGlzYWJsZVxuICB9XG5cbiAgaXNBY3RpdmUoKSB7XG4gICAgY29uc3QgY29uZmlnU2VydmljZSA9IHRoaXMuc2VydmljZUZhY3RvcnkuZ2V0U2VydmljZShDT05GSUdfU0VSVklDRSlcbiAgICByZXR1cm4gdGhpcy5pc0VuYWJsZWQoKSAmJiB0aGlzLl9pbml0aWFsaXplZCAmJiBjb25maWdTZXJ2aWNlLmdldCgnYWN0aXZlJylcbiAgfVxuXG4gIGluaXQoY29uZmlnKSB7XG4gICAgaWYgKHRoaXMuaXNFbmFibGVkKCkgJiYgIXRoaXMuX2luaXRpYWxpemVkKSB7XG4gICAgICB0aGlzLl9pbml0aWFsaXplZCA9IHRydWVcbiAgICAgIGNvbnN0IFtcbiAgICAgICAgY29uZmlnU2VydmljZSxcbiAgICAgICAgbG9nZ2luZ1NlcnZpY2UsXG4gICAgICAgIHRyYW5zYWN0aW9uU2VydmljZVxuICAgICAgXSA9IHRoaXMuc2VydmljZUZhY3RvcnkuZ2V0U2VydmljZShbXG4gICAgICAgIENPTkZJR19TRVJWSUNFLFxuICAgICAgICBMT0dHSU5HX1NFUlZJQ0UsXG4gICAgICAgIFRSQU5TQUNUSU9OX1NFUlZJQ0VcbiAgICAgIF0pXG4gICAgICAvKipcbiAgICAgICAqIFNldCBBZ2VudCB2ZXJzaW9uIHRvIGJlIHNlbnQgYXMgcGFydCBvZiBtZXRhZGF0YSB0byB0aGUgQVBNIFNlcnZlclxuICAgICAgICovXG4gICAgICBjb25maWdTZXJ2aWNlLnNldFZlcnNpb24oJzUuMTYuMycpXG4gICAgICB0aGlzLmNvbmZpZyhjb25maWcpXG4gICAgICAvKipcbiAgICAgICAqIFNldCBsZXZlbCBoZXJlIHRvIGFjY291bnQgZm9yIGJvdGggYWN0aXZlIGFuZCBpbmFjdGl2ZSBjYXNlc1xuICAgICAgICovXG4gICAgICBjb25zdCBsb2dMZXZlbCA9IGNvbmZpZ1NlcnZpY2UuZ2V0KCdsb2dMZXZlbCcpXG4gICAgICBsb2dnaW5nU2VydmljZS5zZXRMZXZlbChsb2dMZXZlbClcbiAgICAgIC8qKlxuICAgICAgICogRGVhY3RpdmUgYWdlbnQgd2hlbiB0aGUgYWN0aXZlIGNvbmZpZyBmbGFnIGlzIHNldCB0byBmYWxzZVxuICAgICAgICovXG4gICAgICBjb25zdCBpc0NvbmZpZ0FjdGl2ZSA9IGNvbmZpZ1NlcnZpY2UuZ2V0KCdhY3RpdmUnKVxuICAgICAgaWYgKGlzQ29uZmlnQWN0aXZlKSB7XG4gICAgICAgIHRoaXMuc2VydmljZUZhY3RvcnkuaW5pdCgpXG5cbiAgICAgICAgY29uc3QgZmxhZ3MgPSBnZXRJbnN0cnVtZW50YXRpb25GbGFncyhcbiAgICAgICAgICBjb25maWdTZXJ2aWNlLmdldCgnaW5zdHJ1bWVudCcpLFxuICAgICAgICAgIGNvbmZpZ1NlcnZpY2UuZ2V0KCdkaXNhYmxlSW5zdHJ1bWVudGF0aW9ucycpXG4gICAgICAgIClcblxuICAgICAgICBjb25zdCBwZXJmb3JtYW5jZU1vbml0b3JpbmcgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoXG4gICAgICAgICAgUEVSRk9STUFOQ0VfTU9OSVRPUklOR1xuICAgICAgICApXG4gICAgICAgIHBlcmZvcm1hbmNlTW9uaXRvcmluZy5pbml0KGZsYWdzKVxuXG4gICAgICAgIGlmIChmbGFnc1tFUlJPUl0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvckxvZ2dpbmcgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoRVJST1JfTE9HR0lORylcbiAgICAgICAgICBlcnJvckxvZ2dpbmcucmVnaXN0ZXJMaXN0ZW5lcnMoKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ1NlcnZpY2UuZ2V0KCdzZXNzaW9uJykpIHtcbiAgICAgICAgICBsZXQgbG9jYWxDb25maWcgPSBjb25maWdTZXJ2aWNlLmdldExvY2FsQ29uZmlnKClcbiAgICAgICAgICBpZiAobG9jYWxDb25maWcgJiYgbG9jYWxDb25maWcuc2Vzc2lvbikge1xuICAgICAgICAgICAgY29uZmlnU2VydmljZS5zZXRDb25maWcoe1xuICAgICAgICAgICAgICBzZXNzaW9uOiBsb2NhbENvbmZpZy5zZXNzaW9uXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlbmRQYWdlTG9hZCA9ICgpID0+XG4gICAgICAgICAgZmxhZ3NbUEFHRV9MT0FEXSAmJiB0aGlzLl9zZW5kUGFnZUxvYWRNZXRyaWNzKClcblxuICAgICAgICBpZiAoY29uZmlnU2VydmljZS5nZXQoJ2NlbnRyYWxDb25maWcnKSkge1xuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIFdhaXRpbmcgZm9yIHRoZSByZW1vdGUgY29uZmlnIGJlZm9yZSBzZW5kaW5nIHRoZSBwYWdlIGxvYWQgdHJhbnNhY3Rpb25cbiAgICAgICAgICAgKi9cbiAgICAgICAgICB0aGlzLmZldGNoQ2VudHJhbENvbmZpZygpLnRoZW4oc2VuZFBhZ2VMb2FkKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNlbmRQYWdlTG9hZCgpXG4gICAgICAgIH1cblxuICAgICAgICBvYnNlcnZlUGFnZVZpc2liaWxpdHkoY29uZmlnU2VydmljZSwgdHJhbnNhY3Rpb25TZXJ2aWNlKVxuICAgICAgICBpZiAoZmxhZ3NbRVZFTlRfVEFSR0VUXSAmJiBmbGFnc1tDTElDS10pIHtcbiAgICAgICAgICBvYnNlcnZlUGFnZUNsaWNrcyh0cmFuc2FjdGlvblNlcnZpY2UpXG4gICAgICAgIH1cbiAgICAgICAgb2JzZXJ2ZVVzZXJJbnRlcmFjdGlvbnMoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZSA9IHRydWVcbiAgICAgICAgbG9nZ2luZ1NlcnZpY2Uud2FybignUlVNIGFnZW50IGlzIGluYWN0aXZlJylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXNcbiAgfVxuXG4gIC8qKlxuICAgKiBgZmV0Y2hDZW50cmFsQ29uZmlnYCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHdpbGwgYWx3YXlzIHJlc29sdmVcbiAgICogaWYgdGhlIGludGVybmFsIGNvbmZpZyBmZXRjaCBmYWlscyB0aGUgdGhlIHByb21pc2UgcmVzb2x2ZXMgdG8gYHVuZGVmaW5lZGAgb3RoZXJ3aXNlXG4gICAqIGl0IHJlc29sdmVzIHRvIHRoZSBmZXRjaGVkIGNvbmZpZy5cbiAgICovXG4gIGZldGNoQ2VudHJhbENvbmZpZygpIHtcbiAgICBjb25zdCBbXG4gICAgICBhcG1TZXJ2ZXIsXG4gICAgICBsb2dnaW5nU2VydmljZSxcbiAgICAgIGNvbmZpZ1NlcnZpY2VcbiAgICBdID0gdGhpcy5zZXJ2aWNlRmFjdG9yeS5nZXRTZXJ2aWNlKFtcbiAgICAgIEFQTV9TRVJWRVIsXG4gICAgICBMT0dHSU5HX1NFUlZJQ0UsXG4gICAgICBDT05GSUdfU0VSVklDRVxuICAgIF0pXG5cbiAgICByZXR1cm4gYXBtU2VydmVyXG4gICAgICAuZmV0Y2hDb25maWcoXG4gICAgICAgIGNvbmZpZ1NlcnZpY2UuZ2V0KCdzZXJ2aWNlTmFtZScpLFxuICAgICAgICBjb25maWdTZXJ2aWNlLmdldCgnZW52aXJvbm1lbnQnKVxuICAgICAgKVxuICAgICAgLnRoZW4oY29uZmlnID0+IHtcbiAgICAgICAgdmFyIHRyYW5zYWN0aW9uU2FtcGxlUmF0ZSA9IGNvbmZpZ1sndHJhbnNhY3Rpb25fc2FtcGxlX3JhdGUnXVxuICAgICAgICBpZiAodHJhbnNhY3Rpb25TYW1wbGVSYXRlKSB7XG4gICAgICAgICAgdHJhbnNhY3Rpb25TYW1wbGVSYXRlID0gTnVtYmVyKHRyYW5zYWN0aW9uU2FtcGxlUmF0ZSlcbiAgICAgICAgICBjb25zdCBjb25maWcgPSB7IHRyYW5zYWN0aW9uU2FtcGxlUmF0ZSB9XG4gICAgICAgICAgY29uc3QgeyBpbnZhbGlkIH0gPSBjb25maWdTZXJ2aWNlLnZhbGlkYXRlKGNvbmZpZylcbiAgICAgICAgICBpZiAoaW52YWxpZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZ1NlcnZpY2Uuc2V0Q29uZmlnKGNvbmZpZylcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgeyBrZXksIHZhbHVlLCBhbGxvd2VkIH0gPSBpbnZhbGlkWzBdXG4gICAgICAgICAgICBsb2dnaW5nU2VydmljZS53YXJuKFxuICAgICAgICAgICAgICBgaW52YWxpZCB2YWx1ZSBcIiR7dmFsdWV9XCIgZm9yICR7a2V5fS4gQWxsb3dlZDogJHthbGxvd2VkfS5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb25maWdcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBsb2dnaW5nU2VydmljZS53YXJuKCdmYWlsZWQgZmV0Y2hpbmcgY29uZmlnOicsIGVycm9yKVxuICAgICAgfSlcbiAgfVxuXG4gIF9zZW5kUGFnZUxvYWRNZXRyaWNzKCkge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIHRyYW5zYWN0aW9uIGlzIHNldCBpbiB0cmFuc2FjdGlvbiBzZXJ2aWNlIHRvXG4gICAgICogYXZvaWQgZHVwbGljYXRpbmcgdGhlIGxvZ2ljIGF0IG11bHRpcGxlIHBsYWNlc1xuICAgICAqL1xuICAgIGNvbnN0IHRyID0gdGhpcy5zdGFydFRyYW5zYWN0aW9uKHVuZGVmaW5lZCwgUEFHRV9MT0FELCB7XG4gICAgICBtYW5hZ2VkOiB0cnVlLFxuICAgICAgY2FuUmV1c2U6IHRydWVcbiAgICB9KVxuXG4gICAgaWYgKCF0cikge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdHIuYWRkVGFzayhQQUdFX0xPQUQpXG4gICAgY29uc3Qgc2VuZFBhZ2VMb2FkTWV0cmljcyA9ICgpID0+IHtcbiAgICAgIC8vIFRoZSByZWFzb25zIG9mIHRoaXMgdGltZW91dCBhcmU6XG4gICAgICAvLyAxLiB0byBtYWtlIHN1cmUgUGVyZm9ybWFuY2VUaW1pbmcubG9hZEV2ZW50RW5kIGhhcyBhIHZhbHVlLlxuICAgICAgLy8gMi4gdG8gbWFrZSBzdXJlIHRoZSBhZ2VudCBpbnRlcmNlcHRzIGFsbCB0aGUgTENQIGVudHJpZXMgdHJpZ2dlcmVkIGJ5IHRoZSBicm93c2VyIChhZGRpbmcgYSBkZWxheSBpbiB0aGUgdGltZW91dCkuXG4gICAgICAvLyBUaGUgYnJvd3NlciBtaWdodCBuZWVkIG1vcmUgdGltZSBhZnRlciB0aGUgcGFnZWxvYWQgZXZlbnQgdG8gcmVuZGVyIG90aGVyIGVsZW1lbnRzIChlLmcuIGltYWdlcykuXG4gICAgICAvLyBUaGF0J3MgaW1wb3J0YW50IGJlY2F1c2UgYSBMQ1AgaXMgb25seSB0cmlnZ2VyZWQgd2hlbiB0aGUgcmVsYXRlZCBlbGVtZW50IGlzIGNvbXBsZXRlbHkgcmVuZGVyZWQuXG4gICAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vbGFyZ2VzdC1jb250ZW50ZnVsLXBhaW50LyNzZWMtYWRkLWxjcC1lbnRyeVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0ci5yZW1vdmVUYXNrKFBBR0VfTE9BRCksIFBBR0VfTE9BRF9ERUxBWSlcbiAgICB9XG5cbiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgc2VuZFBhZ2VMb2FkTWV0cmljcygpXG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgc2VuZFBhZ2VMb2FkTWV0cmljcylcbiAgICB9XG4gIH1cblxuICBvYnNlcnZlKG5hbWUsIGZuKSB7XG4gICAgY29uc3QgY29uZmlnU2VydmljZSA9IHRoaXMuc2VydmljZUZhY3RvcnkuZ2V0U2VydmljZShDT05GSUdfU0VSVklDRSlcbiAgICBjb25maWdTZXJ2aWNlLmV2ZW50cy5vYnNlcnZlKG5hbWUsIGZuKVxuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIHJlcXVpcmVkIGNvbmZpZyBrZXlzIGFyZSBpbnZhbGlkLCB0aGUgYWdlbnQgaXMgZGVhY3RpdmF0ZWQgd2l0aFxuICAgKiBsb2dnaW5nIGVycm9yIHRvIHRoZSBjb25zb2xlXG4gICAqXG4gICAqIHZhbGlkYXRpb24gZXJyb3IgZm9ybWF0XG4gICAqIHtcbiAgICogIG1pc3Npbmc6IFsgJ2tleTEnLCAna2V5MiddLFxuICAgKiAgaW52YWxpZDogW3tcbiAgICogICAga2V5OiAnYScsXG4gICAqICAgIHZhbHVlOiAnYWJjZCcsXG4gICAqICAgIGFsbG93ZWQ6ICdzdHJpbmcnXG4gICAqICB9XSxcbiAgICogIHVua25vd246IFsna2V5MycsICdrZXk0J11cbiAgICogfVxuICAgKi9cbiAgY29uZmlnKGNvbmZpZykge1xuICAgIGNvbnN0IFtjb25maWdTZXJ2aWNlLCBsb2dnaW5nU2VydmljZV0gPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoW1xuICAgICAgQ09ORklHX1NFUlZJQ0UsXG4gICAgICBMT0dHSU5HX1NFUlZJQ0VcbiAgICBdKVxuICAgIGNvbnN0IHsgbWlzc2luZywgaW52YWxpZCwgdW5rbm93biB9ID0gY29uZmlnU2VydmljZS52YWxpZGF0ZShjb25maWcpXG4gICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICdVbmtub3duIGNvbmZpZyBvcHRpb25zIGFyZSBzcGVjaWZpZWQgZm9yIFJVTSBhZ2VudDogJyArXG4gICAgICAgIHVua25vd24uam9pbignLCAnKVxuICAgICAgbG9nZ2luZ1NlcnZpY2Uud2FybihtZXNzYWdlKVxuICAgIH1cblxuICAgIGlmIChtaXNzaW5nLmxlbmd0aCA9PT0gMCAmJiBpbnZhbGlkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uZmlnU2VydmljZS5zZXRDb25maWcoY29uZmlnKVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZXBhcmF0b3IgPSAnLCAnXG4gICAgICBsZXQgbWVzc2FnZSA9IFwiUlVNIGFnZW50IGlzbid0IGNvcnJlY3RseSBjb25maWd1cmVkLiBcIlxuXG4gICAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gbWlzc2luZy5qb2luKHNlcGFyYXRvcikgKyAnIGlzIG1pc3NpbmcnXG4gICAgICAgIGlmIChpbnZhbGlkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBtZXNzYWdlICs9IHNlcGFyYXRvclxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGludmFsaWQuZm9yRWFjaCgoeyBrZXksIHZhbHVlLCBhbGxvd2VkIH0sIGluZGV4KSA9PiB7XG4gICAgICAgIG1lc3NhZ2UgKz1cbiAgICAgICAgICBgJHtrZXl9IFwiJHt2YWx1ZX1cIiBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnMhIChhbGxvd2VkOiAke2FsbG93ZWR9KWAgK1xuICAgICAgICAgIChpbmRleCAhPT0gaW52YWxpZC5sZW5ndGggLSAxID8gc2VwYXJhdG9yIDogJycpXG4gICAgICB9KVxuICAgICAgbG9nZ2luZ1NlcnZpY2UuZXJyb3IobWVzc2FnZSlcbiAgICAgIGNvbmZpZ1NlcnZpY2Uuc2V0Q29uZmlnKHsgYWN0aXZlOiBmYWxzZSB9KVxuICAgIH1cbiAgfVxuXG4gIHNldFVzZXJDb250ZXh0KHVzZXJDb250ZXh0KSB7XG4gICAgdmFyIGNvbmZpZ1NlcnZpY2UgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoQ09ORklHX1NFUlZJQ0UpXG4gICAgY29uZmlnU2VydmljZS5zZXRVc2VyQ29udGV4dCh1c2VyQ29udGV4dClcbiAgfVxuXG4gIHNldEN1c3RvbUNvbnRleHQoY3VzdG9tQ29udGV4dCkge1xuICAgIHZhciBjb25maWdTZXJ2aWNlID0gdGhpcy5zZXJ2aWNlRmFjdG9yeS5nZXRTZXJ2aWNlKENPTkZJR19TRVJWSUNFKVxuICAgIGNvbmZpZ1NlcnZpY2Uuc2V0Q3VzdG9tQ29udGV4dChjdXN0b21Db250ZXh0KVxuICB9XG5cbiAgYWRkTGFiZWxzKGxhYmVscykge1xuICAgIHZhciBjb25maWdTZXJ2aWNlID0gdGhpcy5zZXJ2aWNlRmFjdG9yeS5nZXRTZXJ2aWNlKENPTkZJR19TRVJWSUNFKVxuICAgIGNvbmZpZ1NlcnZpY2UuYWRkTGFiZWxzKGxhYmVscylcbiAgfVxuXG4gIC8vIFNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIGJlZm9yZSAnbG9hZCcgZXZlbnQgb24gd2luZG93IGlzIGZpcmVkXG4gIHNldEluaXRpYWxQYWdlTG9hZE5hbWUobmFtZSkge1xuICAgIGNvbnN0IGNvbmZpZ1NlcnZpY2UgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoQ09ORklHX1NFUlZJQ0UpXG4gICAgY29uZmlnU2VydmljZS5zZXRDb25maWcoe1xuICAgICAgcGFnZUxvYWRUcmFuc2FjdGlvbk5hbWU6IG5hbWVcbiAgICB9KVxuICB9XG5cbiAgc3RhcnRUcmFuc2FjdGlvbihuYW1lLCB0eXBlLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHtcbiAgICAgIHZhciB0cmFuc2FjdGlvblNlcnZpY2UgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoXG4gICAgICAgIFRSQU5TQUNUSU9OX1NFUlZJQ0VcbiAgICAgIClcbiAgICAgIHJldHVybiB0cmFuc2FjdGlvblNlcnZpY2Uuc3RhcnRUcmFuc2FjdGlvbihuYW1lLCB0eXBlLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIHN0YXJ0U3BhbihuYW1lLCB0eXBlLCBvcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHtcbiAgICAgIHZhciB0cmFuc2FjdGlvblNlcnZpY2UgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoXG4gICAgICAgIFRSQU5TQUNUSU9OX1NFUlZJQ0VcbiAgICAgIClcbiAgICAgIHJldHVybiB0cmFuc2FjdGlvblNlcnZpY2Uuc3RhcnRTcGFuKG5hbWUsIHR5cGUsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgZ2V0Q3VycmVudFRyYW5zYWN0aW9uKCkge1xuICAgIGlmICh0aGlzLmlzRW5hYmxlZCgpKSB7XG4gICAgICB2YXIgdHJhbnNhY3Rpb25TZXJ2aWNlID0gdGhpcy5zZXJ2aWNlRmFjdG9yeS5nZXRTZXJ2aWNlKFxuICAgICAgICBUUkFOU0FDVElPTl9TRVJWSUNFXG4gICAgICApXG4gICAgICByZXR1cm4gdHJhbnNhY3Rpb25TZXJ2aWNlLmdldEN1cnJlbnRUcmFuc2FjdGlvbigpXG4gICAgfVxuICB9XG5cbiAgY2FwdHVyZUVycm9yKGVycm9yKSB7XG4gICAgaWYgKHRoaXMuaXNFbmFibGVkKCkpIHtcbiAgICAgIHZhciBlcnJvckxvZ2dpbmcgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoRVJST1JfTE9HR0lORylcbiAgICAgIHJldHVybiBlcnJvckxvZ2dpbmcubG9nRXJyb3IoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgYWRkRmlsdGVyKGZuKSB7XG4gICAgdmFyIGNvbmZpZ1NlcnZpY2UgPSB0aGlzLnNlcnZpY2VGYWN0b3J5LmdldFNlcnZpY2UoQ09ORklHX1NFUlZJQ0UpXG4gICAgY29uZmlnU2VydmljZS5hZGRGaWx0ZXIoZm4pXG4gIH1cbn1cbiIsIihmdW5jdGlvbihyb290LCBmYWN0b3J5KSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuICAgIC8vIFVuaXZlcnNhbCBNb2R1bGUgRGVmaW5pdGlvbiAoVU1EKSB0byBzdXBwb3J0IEFNRCwgQ29tbW9uSlMvTm9kZS5qcywgUmhpbm8sIGFuZCBicm93c2Vycy5cblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgICAgICBkZWZpbmUoJ2Vycm9yLXN0YWNrLXBhcnNlcicsIFsnc3RhY2tmcmFtZSddLCBmYWN0b3J5KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnc3RhY2tmcmFtZScpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByb290LkVycm9yU3RhY2tQYXJzZXIgPSBmYWN0b3J5KHJvb3QuU3RhY2tGcmFtZSk7XG4gICAgfVxufSh0aGlzLCBmdW5jdGlvbiBFcnJvclN0YWNrUGFyc2VyKFN0YWNrRnJhbWUpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgRklSRUZPWF9TQUZBUklfU1RBQ0tfUkVHRVhQID0gLyhefEApXFxTK1xcOlxcZCsvO1xuICAgIHZhciBDSFJPTUVfSUVfU1RBQ0tfUkVHRVhQID0gL15cXHMqYXQgLiooXFxTK1xcOlxcZCt8XFwobmF0aXZlXFwpKS9tO1xuICAgIHZhciBTQUZBUklfTkFUSVZFX0NPREVfUkVHRVhQID0gL14oZXZhbEApPyhcXFtuYXRpdmUgY29kZVxcXSk/JC87XG5cbiAgICBmdW5jdGlvbiBfbWFwKGFycmF5LCBmbiwgdGhpc0FyZykge1xuICAgICAgICBpZiAodHlwZW9mIEFycmF5LnByb3RvdHlwZS5tYXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZm4sIHRoaXNBcmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIG91dHB1dCA9IG5ldyBBcnJheShhcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG91dHB1dFtpXSA9IGZuLmNhbGwodGhpc0FyZywgYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIF9maWx0ZXIoYXJyYXksIGZuLCB0aGlzQXJnKSB7XG4gICAgICAgIGlmICh0eXBlb2YgQXJyYXkucHJvdG90eXBlLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5LmZpbHRlcihmbiwgdGhpc0FyZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgb3V0cHV0ID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZuLmNhbGwodGhpc0FyZywgYXJyYXlbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGFycmF5W2ldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gX2luZGV4T2YoYXJyYXksIHRhcmdldCkge1xuICAgICAgICBpZiAodHlwZW9mIEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICByZXR1cm4gYXJyYXkuaW5kZXhPZih0YXJnZXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChhcnJheVtpXSA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHaXZlbiBhbiBFcnJvciBvYmplY3QsIGV4dHJhY3QgdGhlIG1vc3QgaW5mb3JtYXRpb24gZnJvbSBpdC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3Igb2JqZWN0XG4gICAgICAgICAqIEByZXR1cm4ge0FycmF5fSBvZiBTdGFja0ZyYW1lc1xuICAgICAgICAgKi9cbiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIEVycm9yU3RhY2tQYXJzZXIkJHBhcnNlKGVycm9yKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVycm9yLnN0YWNrdHJhY2UgIT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBlcnJvclsnb3BlcmEjc291cmNlbG9jJ10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VPcGVyYShlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yLnN0YWNrICYmIGVycm9yLnN0YWNrLm1hdGNoKENIUk9NRV9JRV9TVEFDS19SRUdFWFApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWOE9ySUUoZXJyb3IpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5zdGFjaykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlRkZPclNhZmFyaShlcnJvcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBhcnNlIGdpdmVuIEVycm9yIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8vIFNlcGFyYXRlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIGZyb20gYSBzdHJpbmcgb2YgdGhlIGZvcm06IChVUkk6TGluZTpDb2x1bW4pXG4gICAgICAgIGV4dHJhY3RMb2NhdGlvbjogZnVuY3Rpb24gRXJyb3JTdGFja1BhcnNlciQkZXh0cmFjdExvY2F0aW9uKHVybExpa2UpIHtcbiAgICAgICAgICAgIC8vIEZhaWwtZmFzdCBidXQgcmV0dXJuIGxvY2F0aW9ucyBsaWtlIFwiKG5hdGl2ZSlcIlxuICAgICAgICAgICAgaWYgKHVybExpa2UuaW5kZXhPZignOicpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbdXJsTGlrZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZWdFeHAgPSAvKC4rPykoPzpcXDooXFxkKykpPyg/OlxcOihcXGQrKSk/JC87XG4gICAgICAgICAgICB2YXIgcGFydHMgPSByZWdFeHAuZXhlYyh1cmxMaWtlLnJlcGxhY2UoL1tcXChcXCldL2csICcnKSk7XG4gICAgICAgICAgICByZXR1cm4gW3BhcnRzWzFdLCBwYXJ0c1syXSB8fCB1bmRlZmluZWQsIHBhcnRzWzNdIHx8IHVuZGVmaW5lZF07XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFyc2VWOE9ySUU6IGZ1bmN0aW9uIEVycm9yU3RhY2tQYXJzZXIkJHBhcnNlVjhPcklFKGVycm9yKSB7XG4gICAgICAgICAgICB2YXIgZmlsdGVyZWQgPSBfZmlsdGVyKGVycm9yLnN0YWNrLnNwbGl0KCdcXG4nKSwgZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhIWxpbmUubWF0Y2goQ0hST01FX0lFX1NUQUNLX1JFR0VYUCk7XG4gICAgICAgICAgICB9LCB0aGlzKTtcblxuICAgICAgICAgICAgcmV0dXJuIF9tYXAoZmlsdGVyZWQsIGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgICAgICBpZiAobGluZS5pbmRleE9mKCcoZXZhbCAnKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRocm93IGF3YXkgZXZhbCBpbmZvcm1hdGlvbiB1bnRpbCB3ZSBpbXBsZW1lbnQgc3RhY2t0cmFjZS5qcy9zdGFja2ZyYW1lIzhcbiAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgvZXZhbCBjb2RlL2csICdldmFsJykucmVwbGFjZSgvKFxcKGV2YWwgYXQgW15cXCgpXSopfChcXClcXCwuKiQpL2csICcnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IGxpbmUucmVwbGFjZSgvXlxccysvLCAnJykucmVwbGFjZSgvXFwoZXZhbCBjb2RlL2csICcoJykuc3BsaXQoL1xccysvKS5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb25QYXJ0cyA9IHRoaXMuZXh0cmFjdExvY2F0aW9uKHRva2Vucy5wb3AoKSk7XG4gICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uTmFtZSA9IHRva2Vucy5qb2luKCcgJykgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9IF9pbmRleE9mKFsnZXZhbCcsICc8YW5vbnltb3VzPiddLCBsb2NhdGlvblBhcnRzWzBdKSA+IC0xID8gdW5kZWZpbmVkIDogbG9jYXRpb25QYXJ0c1swXTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhY2tGcmFtZShmdW5jdGlvbk5hbWUsIHVuZGVmaW5lZCwgZmlsZU5hbWUsIGxvY2F0aW9uUGFydHNbMV0sIGxvY2F0aW9uUGFydHNbMl0sIGxpbmUpO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFyc2VGRk9yU2FmYXJpOiBmdW5jdGlvbiBFcnJvclN0YWNrUGFyc2VyJCRwYXJzZUZGT3JTYWZhcmkoZXJyb3IpIHtcbiAgICAgICAgICAgIHZhciBmaWx0ZXJlZCA9IF9maWx0ZXIoZXJyb3Iuc3RhY2suc3BsaXQoJ1xcbicpLCBmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFsaW5lLm1hdGNoKFNBRkFSSV9OQVRJVkVfQ09ERV9SRUdFWFApO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgIHJldHVybiBfbWFwKGZpbHRlcmVkLCBmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhyb3cgYXdheSBldmFsIGluZm9ybWF0aW9uIHVudGlsIHdlIGltcGxlbWVudCBzdGFja3RyYWNlLmpzL3N0YWNrZnJhbWUjOFxuICAgICAgICAgICAgICAgIGlmIChsaW5lLmluZGV4T2YoJyA+IGV2YWwnKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoLyBsaW5lIChcXGQrKSg/OiA+IGV2YWwgbGluZSBcXGQrKSogPiBldmFsXFw6XFxkK1xcOlxcZCsvZywgJzokMScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChsaW5lLmluZGV4T2YoJ0AnKSA9PT0gLTEgJiYgbGluZS5pbmRleE9mKCc6JykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhZmFyaSBldmFsIGZyYW1lcyBvbmx5IGhhdmUgZnVuY3Rpb24gbmFtZXMgYW5kIG5vdGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YWNrRnJhbWUobGluZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IGxpbmUuc3BsaXQoJ0AnKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uUGFydHMgPSB0aGlzLmV4dHJhY3RMb2NhdGlvbih0b2tlbnMucG9wKCkpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZnVuY3Rpb25OYW1lID0gdG9rZW5zLmpvaW4oJ0AnKSB8fCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3RhY2tGcmFtZShmdW5jdGlvbk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvblBhcnRzWzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25QYXJ0c1sxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uUGFydHNbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBwYXJzZU9wZXJhOiBmdW5jdGlvbiBFcnJvclN0YWNrUGFyc2VyJCRwYXJzZU9wZXJhKGUpIHtcbiAgICAgICAgICAgIGlmICghZS5zdGFja3RyYWNlIHx8IChlLm1lc3NhZ2UuaW5kZXhPZignXFxuJykgPiAtMSAmJlxuICAgICAgICAgICAgICAgIGUubWVzc2FnZS5zcGxpdCgnXFxuJykubGVuZ3RoID4gZS5zdGFja3RyYWNlLnNwbGl0KCdcXG4nKS5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VPcGVyYTkoZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFlLnN0YWNrKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VPcGVyYTEwKGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU9wZXJhMTEoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgcGFyc2VPcGVyYTk6IGZ1bmN0aW9uIEVycm9yU3RhY2tQYXJzZXIkJHBhcnNlT3BlcmE5KGUpIHtcbiAgICAgICAgICAgIHZhciBsaW5lUkUgPSAvTGluZSAoXFxkKykuKnNjcmlwdCAoPzppbiApPyhcXFMrKS9pO1xuICAgICAgICAgICAgdmFyIGxpbmVzID0gZS5tZXNzYWdlLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgIHZhciByZXN1bHQgPSBbXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDIsIGxlbiA9IGxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZVJFLmV4ZWMobGluZXNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgU3RhY2tGcmFtZSh1bmRlZmluZWQsIHVuZGVmaW5lZCwgbWF0Y2hbMl0sIG1hdGNoWzFdLCB1bmRlZmluZWQsIGxpbmVzW2ldKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LFxuXG4gICAgICAgIHBhcnNlT3BlcmExMDogZnVuY3Rpb24gRXJyb3JTdGFja1BhcnNlciQkcGFyc2VPcGVyYTEwKGUpIHtcbiAgICAgICAgICAgIHZhciBsaW5lUkUgPSAvTGluZSAoXFxkKykuKnNjcmlwdCAoPzppbiApPyhcXFMrKSg/OjogSW4gZnVuY3Rpb24gKFxcUyspKT8kL2k7XG4gICAgICAgICAgICB2YXIgbGluZXMgPSBlLnN0YWNrdHJhY2Uuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IFtdO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gbGluZXMubGVuZ3RoOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBsaW5lUkUuZXhlYyhsaW5lc1tpXSk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0YWNrRnJhbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hbM10gfHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFsxXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbaV1cbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gT3BlcmEgMTAuNjUrIEVycm9yLnN0YWNrIHZlcnkgc2ltaWxhciB0byBGRi9TYWZhcmlcbiAgICAgICAgcGFyc2VPcGVyYTExOiBmdW5jdGlvbiBFcnJvclN0YWNrUGFyc2VyJCRwYXJzZU9wZXJhMTEoZXJyb3IpIHtcbiAgICAgICAgICAgIHZhciBmaWx0ZXJlZCA9IF9maWx0ZXIoZXJyb3Iuc3RhY2suc3BsaXQoJ1xcbicpLCBmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhbGluZS5tYXRjaChGSVJFRk9YX1NBRkFSSV9TVEFDS19SRUdFWFApICYmICFsaW5lLm1hdGNoKC9eRXJyb3IgY3JlYXRlZCBhdC8pO1xuICAgICAgICAgICAgfSwgdGhpcyk7XG5cbiAgICAgICAgICAgIHJldHVybiBfbWFwKGZpbHRlcmVkLCBmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRva2VucyA9IGxpbmUuc3BsaXQoJ0AnKTtcbiAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb25QYXJ0cyA9IHRoaXMuZXh0cmFjdExvY2F0aW9uKHRva2Vucy5wb3AoKSk7XG4gICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uQ2FsbCA9ICh0b2tlbnMuc2hpZnQoKSB8fCAnJyk7XG4gICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uTmFtZSA9IGZ1bmN0aW9uQ2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxhbm9ueW1vdXMgZnVuY3Rpb24oOiAoXFx3KykpPz4vLCAnJDInKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcKFteXFwpXSpcXCkvZywgJycpIHx8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB2YXIgYXJnc1JhdztcbiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25DYWxsLm1hdGNoKC9cXCgoW15cXCldKilcXCkvKSkge1xuICAgICAgICAgICAgICAgICAgICBhcmdzUmF3ID0gZnVuY3Rpb25DYWxsLnJlcGxhY2UoL15bXlxcKF0rXFwoKFteXFwpXSopXFwpJC8sICckMScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IChhcmdzUmF3ID09PSB1bmRlZmluZWQgfHwgYXJnc1JhdyA9PT0gJ1thcmd1bWVudHMgbm90IGF2YWlsYWJsZV0nKSA/XG4gICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCA6IGFyZ3NSYXcuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0YWNrRnJhbWUoXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25QYXJ0c1swXSxcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25QYXJ0c1sxXSxcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25QYXJ0c1syXSxcbiAgICAgICAgICAgICAgICAgICAgbGluZSk7XG4gICAgICAgICAgICB9LCB0aGlzKTtcbiAgICAgICAgfVxuICAgIH07XG59KSk7XG5cbiIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuLyoqXG4gKiBUaGUgRk9STUFUX0JJTkFSWSBmb3JtYXQgcmVwcmVzZW50cyBTcGFuQ29udGV4dHMgaW4gYW4gb3BhcXVlIGJpbmFyeVxuICogY2Fycmllci5cbiAqXG4gKiBUcmFjZXIuaW5qZWN0KCkgd2lsbCBzZXQgdGhlIGJ1ZmZlciBmaWVsZCB0byBhbiBBcnJheS1saWtlIChBcnJheSxcbiAqIEFycmF5QnVmZmVyLCBvciBUeXBlZEJ1ZmZlcikgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGluamVjdGVkIGJpbmFyeSBkYXRhLlxuICogQW55IHZhbGlkIE9iamVjdCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIHRoZSBidWZmZXIgZmllbGQgb2YgdGhlIG9iamVjdFxuICogY2FuIGJlIHNldC5cbiAqXG4gKiBUcmFjZXIuZXh0cmFjdCgpIHdpbGwgbG9vayBmb3IgYGNhcnJpZXIuYnVmZmVyYCwgYW5kIHRoYXQgZmllbGQgaXNcbiAqIGV4cGVjdGVkIHRvIGJlIGFuIEFycmF5LWxpa2Ugb2JqZWN0IChBcnJheSwgQXJyYXlCdWZmZXIsIG9yXG4gKiBUeXBlZEJ1ZmZlcikuXG4gKi9cbmV4cG9ydHMuRk9STUFUX0JJTkFSWSA9ICdiaW5hcnknO1xuLyoqXG4gKiBUaGUgRk9STUFUX1RFWFRfTUFQIGZvcm1hdCByZXByZXNlbnRzIFNwYW5Db250ZXh0cyB1c2luZyBhXG4gKiBzdHJpbmctPnN0cmluZyBtYXAgKGJhY2tlZCBieSBhIEphdmFzY3JpcHQgT2JqZWN0KSBhcyBhIGNhcnJpZXIuXG4gKlxuICogTk9URTogVW5saWtlIEZPUk1BVF9IVFRQX0hFQURFUlMsIEZPUk1BVF9URVhUX01BUCBwbGFjZXMgbm8gcmVzdHJpY3Rpb25zXG4gKiBvbiB0aGUgY2hhcmFjdGVycyB1c2VkIGluIGVpdGhlciB0aGUga2V5cyBvciB0aGUgdmFsdWVzIG9mIHRoZSBtYXBcbiAqIGVudHJpZXMuXG4gKlxuICogVGhlIEZPUk1BVF9URVhUX01BUCBjYXJyaWVyIG1hcCBtYXkgY29udGFpbiB1bnJlbGF0ZWQgZGF0YSAoZS5nLixcbiAqIGFyYml0cmFyeSBnUlBDIG1ldGFkYXRhKTsgYXMgc3VjaCwgdGhlIFRyYWNlciBpbXBsZW1lbnRhdGlvbiBzaG91bGQgdXNlXG4gKiBhIHByZWZpeCBvciBvdGhlciBjb252ZW50aW9uIHRvIGRpc3Rpbmd1aXNoIFRyYWNlci1zcGVjaWZpYyBrZXk6dmFsdWVcbiAqIHBhaXJzLlxuICovXG5leHBvcnRzLkZPUk1BVF9URVhUX01BUCA9ICd0ZXh0X21hcCc7XG4vKipcbiAqIFRoZSBGT1JNQVRfSFRUUF9IRUFERVJTIGZvcm1hdCByZXByZXNlbnRzIFNwYW5Db250ZXh0cyB1c2luZyBhXG4gKiBjaGFyYWN0ZXItcmVzdHJpY3RlZCBzdHJpbmctPnN0cmluZyBtYXAgKGJhY2tlZCBieSBhIEphdmFzY3JpcHQgT2JqZWN0KVxuICogYXMgYSBjYXJyaWVyLlxuICpcbiAqIEtleXMgYW5kIHZhbHVlcyBpbiB0aGUgRk9STUFUX0hUVFBfSEVBREVSUyBjYXJyaWVyIG11c3QgYmUgc3VpdGFibGUgZm9yXG4gKiB1c2UgYXMgSFRUUCBoZWFkZXJzICh3aXRob3V0IG1vZGlmaWNhdGlvbiBvciBmdXJ0aGVyIGVzY2FwaW5nKS4gVGhhdCBpcyxcbiAqIHRoZSBrZXlzIGhhdmUgYSBncmVhdGx5IHJlc3RyaWN0ZWQgY2hhcmFjdGVyIHNldCwgY2FzaW5nIGZvciB0aGUga2V5c1xuICogbWF5IG5vdCBiZSBwcmVzZXJ2ZWQgYnkgdmFyaW91cyBpbnRlcm1lZGlhcmllcywgYW5kIHRoZSB2YWx1ZXMgc2hvdWxkIGJlXG4gKiBVUkwtZXNjYXBlZC5cbiAqXG4gKiBUaGUgRk9STUFUX0hUVFBfSEVBREVSUyBjYXJyaWVyIG1hcCBtYXkgY29udGFpbiB1bnJlbGF0ZWQgZGF0YSAoZS5nLixcbiAqIGFyYml0cmFyeSBIVFRQIGhlYWRlcnMpOyBhcyBzdWNoLCB0aGUgVHJhY2VyIGltcGxlbWVudGF0aW9uIHNob3VsZCB1c2UgYVxuICogcHJlZml4IG9yIG90aGVyIGNvbnZlbnRpb24gdG8gZGlzdGluZ3Vpc2ggVHJhY2VyLXNwZWNpZmljIGtleTp2YWx1ZVxuICogcGFpcnMuXG4gKi9cbmV4cG9ydHMuRk9STUFUX0hUVFBfSEVBREVSUyA9ICdodHRwX2hlYWRlcnMnO1xuLyoqXG4gKiBBIFNwYW4gbWF5IGJlIHRoZSBcImNoaWxkIG9mXCIgYSBwYXJlbnQgU3Bhbi4gSW4gYSDigJxjaGlsZCBvZuKAnSByZWZlcmVuY2UsXG4gKiB0aGUgcGFyZW50IFNwYW4gZGVwZW5kcyBvbiB0aGUgY2hpbGQgU3BhbiBpbiBzb21lIGNhcGFjaXR5LlxuICpcbiAqIFNlZSBtb3JlIGFib3V0IHJlZmVyZW5jZSB0eXBlcyBhdCBodHRwczovL2dpdGh1Yi5jb20vb3BlbnRyYWNpbmcvc3BlY2lmaWNhdGlvblxuICovXG5leHBvcnRzLlJFRkVSRU5DRV9DSElMRF9PRiA9ICdjaGlsZF9vZic7XG4vKipcbiAqIFNvbWUgcGFyZW50IFNwYW5zIGRvIG5vdCBkZXBlbmQgaW4gYW55IHdheSBvbiB0aGUgcmVzdWx0IG9mIHRoZWlyIGNoaWxkXG4gKiBTcGFucy4gSW4gdGhlc2UgY2FzZXMsIHdlIHNheSBtZXJlbHkgdGhhdCB0aGUgY2hpbGQgU3BhbiDigJxmb2xsb3dzIGZyb23igJ1cbiAqIHRoZSBwYXJlbnQgU3BhbiBpbiBhIGNhdXNhbCBzZW5zZS5cbiAqXG4gKiBTZWUgbW9yZSBhYm91dCByZWZlcmVuY2UgdHlwZXMgYXQgaHR0cHM6Ly9naXRodWIuY29tL29wZW50cmFjaW5nL3NwZWNpZmljYXRpb25cbiAqL1xuZXhwb3J0cy5SRUZFUkVOQ0VfRk9MTE9XU19GUk9NID0gJ2ZvbGxvd3NfZnJvbSc7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb25zdGFudHMuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgQ29uc3RhbnRzID0gcmVxdWlyZShcIi4vY29uc3RhbnRzXCIpO1xudmFyIHJlZmVyZW5jZV8xID0gcmVxdWlyZShcIi4vcmVmZXJlbmNlXCIpO1xudmFyIHNwYW5fMSA9IHJlcXVpcmUoXCIuL3NwYW5cIik7XG4vKipcbiAqIFJldHVybiBhIG5ldyBSRUZFUkVOQ0VfQ0hJTERfT0YgcmVmZXJlbmNlLlxuICpcbiAqIEBwYXJhbSB7U3BhbkNvbnRleHR9IHNwYW5Db250ZXh0IC0gdGhlIHBhcmVudCBTcGFuQ29udGV4dCBpbnN0YW5jZSB0b1xuICogICAgICAgIHJlZmVyZW5jZS5cbiAqIEByZXR1cm4gYSBSRUZFUkVOQ0VfQ0hJTERfT0YgcmVmZXJlbmNlIHBvaW50aW5nIHRvIGBzcGFuQ29udGV4dGBcbiAqL1xuZnVuY3Rpb24gY2hpbGRPZihzcGFuQ29udGV4dCkge1xuICAgIC8vIEFsbG93IHRoZSB1c2VyIHRvIHBhc3MgYSBTcGFuIGluc3RlYWQgb2YgYSBTcGFuQ29udGV4dFxuICAgIGlmIChzcGFuQ29udGV4dCBpbnN0YW5jZW9mIHNwYW5fMS5kZWZhdWx0KSB7XG4gICAgICAgIHNwYW5Db250ZXh0ID0gc3BhbkNvbnRleHQuY29udGV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHJlZmVyZW5jZV8xLmRlZmF1bHQoQ29uc3RhbnRzLlJFRkVSRU5DRV9DSElMRF9PRiwgc3BhbkNvbnRleHQpO1xufVxuZXhwb3J0cy5jaGlsZE9mID0gY2hpbGRPZjtcbi8qKlxuICogUmV0dXJuIGEgbmV3IFJFRkVSRU5DRV9GT0xMT1dTX0ZST00gcmVmZXJlbmNlLlxuICpcbiAqIEBwYXJhbSB7U3BhbkNvbnRleHR9IHNwYW5Db250ZXh0IC0gdGhlIHBhcmVudCBTcGFuQ29udGV4dCBpbnN0YW5jZSB0b1xuICogICAgICAgIHJlZmVyZW5jZS5cbiAqIEByZXR1cm4gYSBSRUZFUkVOQ0VfRk9MTE9XU19GUk9NIHJlZmVyZW5jZSBwb2ludGluZyB0byBgc3BhbkNvbnRleHRgXG4gKi9cbmZ1bmN0aW9uIGZvbGxvd3NGcm9tKHNwYW5Db250ZXh0KSB7XG4gICAgLy8gQWxsb3cgdGhlIHVzZXIgdG8gcGFzcyBhIFNwYW4gaW5zdGVhZCBvZiBhIFNwYW5Db250ZXh0XG4gICAgaWYgKHNwYW5Db250ZXh0IGluc3RhbmNlb2Ygc3Bhbl8xLmRlZmF1bHQpIHtcbiAgICAgICAgc3BhbkNvbnRleHQgPSBzcGFuQ29udGV4dC5jb250ZXh0KCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgcmVmZXJlbmNlXzEuZGVmYXVsdChDb25zdGFudHMuUkVGRVJFTkNFX0ZPTExPV1NfRlJPTSwgc3BhbkNvbnRleHQpO1xufVxuZXhwb3J0cy5mb2xsb3dzRnJvbSA9IGZvbGxvd3NGcm9tO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnVuY3Rpb25zLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHNwYW5fMSA9IHJlcXVpcmUoXCIuL3NwYW5cIik7XG52YXIgc3Bhbl9jb250ZXh0XzEgPSByZXF1aXJlKFwiLi9zcGFuX2NvbnRleHRcIik7XG52YXIgdHJhY2VyXzEgPSByZXF1aXJlKFwiLi90cmFjZXJcIik7XG5leHBvcnRzLnRyYWNlciA9IG51bGw7XG5leHBvcnRzLnNwYW5Db250ZXh0ID0gbnVsbDtcbmV4cG9ydHMuc3BhbiA9IG51bGw7XG4vLyBEZWZlcnJlZCBpbml0aWFsaXphdGlvbiB0byBhdm9pZCBhIGRlcGVuZGVuY3kgY3ljbGUgd2hlcmUgVHJhY2VyIGRlcGVuZHMgb25cbi8vIFNwYW4gd2hpY2ggZGVwZW5kcyBvbiB0aGUgbm9vcCB0cmFjZXIuXG5mdW5jdGlvbiBpbml0aWFsaXplKCkge1xuICAgIGV4cG9ydHMudHJhY2VyID0gbmV3IHRyYWNlcl8xLmRlZmF1bHQoKTtcbiAgICBleHBvcnRzLnNwYW4gPSBuZXcgc3Bhbl8xLmRlZmF1bHQoKTtcbiAgICBleHBvcnRzLnNwYW5Db250ZXh0ID0gbmV3IHNwYW5fY29udGV4dF8xLmRlZmF1bHQoKTtcbn1cbmV4cG9ydHMuaW5pdGlhbGl6ZSA9IGluaXRpYWxpemU7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ub29wLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIHNwYW5fMSA9IHJlcXVpcmUoXCIuL3NwYW5cIik7XG4vKipcbiAqIFJlZmVyZW5jZSBwYWlycyBhIHJlZmVyZW5jZSB0eXBlIGNvbnN0YW50IChlLmcuLCBSRUZFUkVOQ0VfQ0hJTERfT0Ygb3JcbiAqIFJFRkVSRU5DRV9GT0xMT1dTX0ZST00pIHdpdGggdGhlIFNwYW5Db250ZXh0IGl0IHBvaW50cyB0by5cbiAqXG4gKiBTZWUgdGhlIGV4cG9ydGVkIGNoaWxkT2YoKSBhbmQgZm9sbG93c0Zyb20oKSBmdW5jdGlvbnMgYXQgdGhlIHBhY2thZ2UgbGV2ZWwuXG4gKi9cbnZhciBSZWZlcmVuY2UgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogSW5pdGlhbGl6ZSBhIG5ldyBSZWZlcmVuY2UgaW5zdGFuY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIHRoZSBSZWZlcmVuY2UgdHlwZSBjb25zdGFudCAoZS5nLixcbiAgICAgKiAgICAgICAgUkVGRVJFTkNFX0NISUxEX09GIG9yIFJFRkVSRU5DRV9GT0xMT1dTX0ZST00pLlxuICAgICAqIEBwYXJhbSB7U3BhbkNvbnRleHR9IHJlZmVyZW5jZWRDb250ZXh0IC0gdGhlIFNwYW5Db250ZXh0IGJlaW5nIHJlZmVycmVkXG4gICAgICogICAgICAgIHRvLiBBcyBhIGNvbnZlbmllbmNlLCBhIFNwYW4gaW5zdGFuY2UgbWF5IGJlIHBhc3NlZCBpbiBpbnN0ZWFkXG4gICAgICogICAgICAgIChpbiB3aGljaCBjYXNlIGl0cyAuY29udGV4dCgpIGlzIHVzZWQgaGVyZSkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gUmVmZXJlbmNlKHR5cGUsIHJlZmVyZW5jZWRDb250ZXh0KSB7XG4gICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLl9yZWZlcmVuY2VkQ29udGV4dCA9IChyZWZlcmVuY2VkQ29udGV4dCBpbnN0YW5jZW9mIHNwYW5fMS5kZWZhdWx0ID9cbiAgICAgICAgICAgIHJlZmVyZW5jZWRDb250ZXh0LmNvbnRleHQoKSA6XG4gICAgICAgICAgICByZWZlcmVuY2VkQ29udGV4dCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIFJlZmVyZW5jZSB0eXBlIChlLmcuLCBSRUZFUkVOQ0VfQ0hJTERfT0Ygb3JcbiAgICAgKiAgICAgICAgIFJFRkVSRU5DRV9GT0xMT1dTX0ZST00pLlxuICAgICAqL1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUudHlwZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBAcmV0dXJuIHtTcGFuQ29udGV4dH0gVGhlIFNwYW5Db250ZXh0IGJlaW5nIHJlZmVycmVkIHRvIChlLmcuLCB0aGVcbiAgICAgKiAgICAgICAgIHBhcmVudCBpbiBhIFJFRkVSRU5DRV9DSElMRF9PRiBSZWZlcmVuY2UpLlxuICAgICAqL1xuICAgIFJlZmVyZW5jZS5wcm90b3R5cGUucmVmZXJlbmNlZENvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZlcmVuY2VkQ29udGV4dDtcbiAgICB9O1xuICAgIHJldHVybiBSZWZlcmVuY2U7XG59KCkpO1xuZXhwb3J0cy5kZWZhdWx0ID0gUmVmZXJlbmNlO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmVmZXJlbmNlLmpzLm1hcCIsIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xudmFyIG5vb3AgPSByZXF1aXJlKFwiLi9ub29wXCIpO1xuLyoqXG4gKiBTcGFuIHJlcHJlc2VudHMgYSBsb2dpY2FsIHVuaXQgb2Ygd29yayBhcyBwYXJ0IG9mIGEgYnJvYWRlciBUcmFjZS4gRXhhbXBsZXNcbiAqIG9mIHNwYW4gbWlnaHQgaW5jbHVkZSByZW1vdGUgcHJvY2VkdXJlIGNhbGxzIG9yIGEgaW4tcHJvY2VzcyBmdW5jdGlvbiBjYWxsc1xuICogdG8gc3ViLWNvbXBvbmVudHMuIEEgVHJhY2UgaGFzIGEgc2luZ2xlLCB0b3AtbGV2ZWwgXCJyb290XCIgU3BhbiB0aGF0IGluIHR1cm5cbiAqIG1heSBoYXZlIHplcm8gb3IgbW9yZSBjaGlsZCBTcGFucywgd2hpY2ggaW4gdHVybiBtYXkgaGF2ZSBjaGlsZHJlbi5cbiAqL1xudmFyIFNwYW4gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gU3BhbigpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAgIC8vIE9wZW5UcmFjaW5nIEFQSSBtZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIFNwYW5Db250ZXh0IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBTcGFuLlxuICAgICAqXG4gICAgICogQHJldHVybiB7U3BhbkNvbnRleHR9XG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuY29udGV4dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRleHQoKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIFRyYWNlciBvYmplY3QgdXNlZCB0byBjcmVhdGUgdGhpcyBTcGFuLlxuICAgICAqXG4gICAgICogQHJldHVybiB7VHJhY2VyfVxuICAgICAqL1xuICAgIFNwYW4ucHJvdG90eXBlLnRyYWNlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNlcigpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgc3RyaW5nIG5hbWUgZm9yIHRoZSBsb2dpY2FsIG9wZXJhdGlvbiB0aGlzIHNwYW4gcmVwcmVzZW50cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuc2V0T3BlcmF0aW9uTmFtZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHRoaXMuX3NldE9wZXJhdGlvbk5hbWUobmFtZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyBhIGtleTp2YWx1ZSBwYWlyIG9uIHRoaXMgU3BhbiB0aGF0IGFsc28gcHJvcGFnYXRlcyB0byBmdXR1cmVcbiAgICAgKiBjaGlsZHJlbiBvZiB0aGUgYXNzb2NpYXRlZCBTcGFuLlxuICAgICAqXG4gICAgICogc2V0QmFnZ2FnZUl0ZW0oKSBlbmFibGVzIHBvd2VyZnVsIGZ1bmN0aW9uYWxpdHkgZ2l2ZW4gYSBmdWxsLXN0YWNrXG4gICAgICogb3BlbnRyYWNpbmcgaW50ZWdyYXRpb24gKGUuZy4sIGFyYml0cmFyeSBhcHBsaWNhdGlvbiBkYXRhIGZyb20gYSB3ZWJcbiAgICAgKiBjbGllbnQgY2FuIG1ha2UgaXQsIHRyYW5zcGFyZW50bHksIGFsbCB0aGUgd2F5IGludG8gdGhlIGRlcHRocyBvZiBhXG4gICAgICogc3RvcmFnZSBzeXN0ZW0pLCBhbmQgd2l0aCBpdCBzb21lIHBvd2VyZnVsIGNvc3RzOiB1c2UgdGhpcyBmZWF0dXJlIHdpdGhcbiAgICAgKiBjYXJlLlxuICAgICAqXG4gICAgICogSU1QT1JUQU5UIE5PVEUgIzE6IHNldEJhZ2dhZ2VJdGVtKCkgd2lsbCBvbmx5IHByb3BhZ2F0ZSBiYWdnYWdlIGl0ZW1zIHRvXG4gICAgICogKmZ1dHVyZSogY2F1c2FsIGRlc2NlbmRhbnRzIG9mIHRoZSBhc3NvY2lhdGVkIFNwYW4uXG4gICAgICpcbiAgICAgKiBJTVBPUlRBTlQgTk9URSAjMjogVXNlIHRoaXMgdGhvdWdodGZ1bGx5IGFuZCB3aXRoIGNhcmUuIEV2ZXJ5IGtleSBhbmRcbiAgICAgKiB2YWx1ZSBpcyBjb3BpZWQgaW50byBldmVyeSBsb2NhbCAqYW5kIHJlbW90ZSogY2hpbGQgb2YgdGhlIGFzc29jaWF0ZWRcbiAgICAgKiBTcGFuLCBhbmQgdGhhdCBjYW4gYWRkIHVwIHRvIGEgbG90IG9mIG5ldHdvcmsgYW5kIGNwdSBvdmVyaGVhZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWVcbiAgICAgKi9cbiAgICBTcGFuLnByb3RvdHlwZS5zZXRCYWdnYWdlSXRlbSA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3NldEJhZ2dhZ2VJdGVtKGtleSwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGZvciBhIGJhZ2dhZ2UgaXRlbSBnaXZlbiBpdHMga2V5LlxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBrZXlcbiAgICAgKiAgICAgICAgIFRoZSBrZXkgZm9yIHRoZSBnaXZlbiB0cmFjZSBhdHRyaWJ1dGUuXG4gICAgICogQHJldHVybiB7c3RyaW5nfVxuICAgICAqICAgICAgICAgU3RyaW5nIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5LCBvciB1bmRlZmluZWQgaWYgdGhlIGtleSBkb2VzIG5vdFxuICAgICAqICAgICAgICAgY29ycmVzcG9uZCB0byBhIHNldCB0cmFjZSBhdHRyaWJ1dGUuXG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuZ2V0QmFnZ2FnZUl0ZW0gPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRCYWdnYWdlSXRlbShrZXkpO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogQWRkcyBhIHNpbmdsZSB0YWcgdG8gdGhlIHNwYW4uICBTZWUgYGFkZFRhZ3MoKWAgZm9yIGRldGFpbHMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAgICogQHBhcmFtIHthbnl9IHZhbHVlXG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUuc2V0VGFnID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICAgICAgLy8gTk9URTogdGhlIGNhbGwgaXMgbm9ybWFsaXplZCB0byBhIGNhbGwgdG8gX2FkZFRhZ3MoKVxuICAgICAgICB0aGlzLl9hZGRUYWdzKChfYSA9IHt9LCBfYVtrZXldID0gdmFsdWUsIF9hKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB2YXIgX2E7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBBZGRzIHRoZSBnaXZlbiBrZXkgdmFsdWUgcGFpcnMgdG8gdGhlIHNldCBvZiBzcGFuIHRhZ3MuXG4gICAgICpcbiAgICAgKiBNdWx0aXBsZSBjYWxscyB0byBhZGRUYWdzKCkgcmVzdWx0cyBpbiB0aGUgdGFncyBiZWluZyB0aGUgc3VwZXJzZXQgb2ZcbiAgICAgKiBhbGwgY2FsbHMuXG4gICAgICpcbiAgICAgKiBUaGUgYmVoYXZpb3Igb2Ygc2V0dGluZyB0aGUgc2FtZSBrZXkgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgc3BhblxuICAgICAqIGlzIHVuZGVmaW5lZC5cbiAgICAgKlxuICAgICAqIFRoZSBzdXBwb3J0ZWQgdHlwZSBvZiB0aGUgdmFsdWVzIGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC5cbiAgICAgKiBJbXBsZW1lbnRhdGlvbnMgYXJlIGV4cGVjdGVkIHRvIHNhZmVseSBoYW5kbGUgYWxsIHR5cGVzIG9mIHZhbHVlcyBidXRcbiAgICAgKiBtYXkgY2hvb3NlIHRvIGlnbm9yZSB1bnJlY29nbml6ZWQgLyB1bmhhbmRsZS1hYmxlIHZhbHVlcyAoZS5nLiBvYmplY3RzXG4gICAgICogd2l0aCBjeWNsaWMgcmVmZXJlbmNlcywgZnVuY3Rpb24gb2JqZWN0cykuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtbdHlwZV19IFtkZXNjcmlwdGlvbl1cbiAgICAgKi9cbiAgICBTcGFuLnByb3RvdHlwZS5hZGRUYWdzID0gZnVuY3Rpb24gKGtleVZhbHVlTWFwKSB7XG4gICAgICAgIHRoaXMuX2FkZFRhZ3Moa2V5VmFsdWVNYXApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEFkZCBhIGxvZyByZWNvcmQgdG8gdGhpcyBTcGFuLCBvcHRpb25hbGx5IGF0IGEgdXNlci1wcm92aWRlZCB0aW1lc3RhbXAuXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZTpcbiAgICAgKlxuICAgICAqICAgICBzcGFuLmxvZyh7XG4gICAgICogICAgICAgICBzaXplOiBycGMuc2l6ZSgpLCAgLy8gbnVtZXJpYyB2YWx1ZVxuICAgICAqICAgICAgICAgVVJJOiBycGMuVVJJKCksICAvLyBzdHJpbmcgdmFsdWVcbiAgICAgKiAgICAgICAgIHBheWxvYWQ6IHJwYy5wYXlsb2FkKCksICAvLyBPYmplY3QgdmFsdWVcbiAgICAgKiAgICAgICAgIFwia2V5cyBjYW4gYmUgYXJiaXRyYXJ5IHN0cmluZ3NcIjogcnBjLmZvbygpLFxuICAgICAqICAgICB9KTtcbiAgICAgKlxuICAgICAqICAgICBzcGFuLmxvZyh7XG4gICAgICogICAgICAgICBcImVycm9yLmRlc2NyaXB0aW9uXCI6IHNvbWVFcnJvci5kZXNjcmlwdGlvbigpLFxuICAgICAqICAgICB9LCBzb21lRXJyb3IudGltZXN0YW1wTWlsbGlzKCkpO1xuICAgICAqXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGtleVZhbHVlUGFpcnNcbiAgICAgKiAgICAgICAgQW4gb2JqZWN0IG1hcHBpbmcgc3RyaW5nIGtleXMgdG8gYXJiaXRyYXJ5IHZhbHVlIHR5cGVzLiBBbGxcbiAgICAgKiAgICAgICAgVHJhY2VyIGltcGxlbWVudGF0aW9ucyBzaG91bGQgc3VwcG9ydCBib29sLCBzdHJpbmcsIGFuZCBudW1lcmljXG4gICAgICogICAgICAgIHZhbHVlIHR5cGVzLCBhbmQgc29tZSBtYXkgYWxzbyBzdXBwb3J0IE9iamVjdCB2YWx1ZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHRpbWVzdGFtcFxuICAgICAqICAgICAgICBBbiBvcHRpb25hbCBwYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kc1xuICAgICAqICAgICAgICBzaW5jZSB0aGUgVW5peCBlcG9jaC4gRnJhY3Rpb25hbCB2YWx1ZXMgYXJlIGFsbG93ZWQgc28gdGhhdFxuICAgICAqICAgICAgICB0aW1lc3RhbXBzIHdpdGggc3ViLW1pbGxpc2Vjb25kIGFjY3VyYWN5IGNhbiBiZSByZXByZXNlbnRlZC4gSWZcbiAgICAgKiAgICAgICAgbm90IHNwZWNpZmllZCwgdGhlIGltcGxlbWVudGF0aW9uIGlzIGV4cGVjdGVkIHRvIHVzZSBpdHMgbm90aW9uXG4gICAgICogICAgICAgIG9mIHRoZSBjdXJyZW50IHRpbWUgb2YgdGhlIGNhbGwuXG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUubG9nID0gZnVuY3Rpb24gKGtleVZhbHVlUGFpcnMsIHRpbWVzdGFtcCkge1xuICAgICAgICB0aGlzLl9sb2coa2V5VmFsdWVQYWlycywgdGltZXN0YW1wKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBERVBSRUNBVEVEXG4gICAgICovXG4gICAgU3Bhbi5wcm90b3R5cGUubG9nRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBwYXlsb2FkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2coeyBldmVudDogZXZlbnROYW1lLCBwYXlsb2FkOiBwYXlsb2FkIH0pO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgZW5kIHRpbWVzdGFtcCBhbmQgZmluYWxpemVzIFNwYW4gc3RhdGUuXG4gICAgICpcbiAgICAgKiBXaXRoIHRoZSBleGNlcHRpb24gb2YgY2FsbHMgdG8gU3Bhbi5jb250ZXh0KCkgKHdoaWNoIGFyZSBhbHdheXMgYWxsb3dlZCksXG4gICAgICogZmluaXNoKCkgbXVzdCBiZSB0aGUgbGFzdCBjYWxsIG1hZGUgdG8gYW55IHNwYW4gaW5zdGFuY2UsIGFuZCB0byBkb1xuICAgICAqIG90aGVyd2lzZSBsZWFkcyB0byB1bmRlZmluZWQgYmVoYXZpb3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtudW1iZXJ9IGZpbmlzaFRpbWVcbiAgICAgKiAgICAgICAgIE9wdGlvbmFsIGZpbmlzaCB0aW1lIGluIG1pbGxpc2Vjb25kcyBhcyBhIFVuaXggdGltZXN0YW1wLiBEZWNpbWFsXG4gICAgICogICAgICAgICB2YWx1ZXMgYXJlIHN1cHBvcnRlZCBmb3IgdGltZXN0YW1wcyB3aXRoIHN1Yi1taWxsaXNlY29uZCBhY2N1cmFjeS5cbiAgICAgKiAgICAgICAgIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHRpbWUgKGFzIGRlZmluZWQgYnkgdGhlXG4gICAgICogICAgICAgICBpbXBsZW1lbnRhdGlvbikgd2lsbCBiZSB1c2VkLlxuICAgICAqL1xuICAgIFNwYW4ucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uIChmaW5pc2hUaW1lKSB7XG4gICAgICAgIHRoaXMuX2ZpbmlzaChmaW5pc2hUaW1lKTtcbiAgICAgICAgLy8gRG8gbm90IHJldHVybiBgdGhpc2AuIFRoZSBTcGFuIGdlbmVyYWxseSBzaG91bGQgbm90IGJlIHVzZWQgYWZ0ZXIgaXRcbiAgICAgICAgLy8gaXMgZmluaXNoZWQgc28gY2hhaW5pbmcgaXMgbm90IGRlc2lyZWQgaW4gdGhpcyBjb250ZXh0LlxuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAgIC8vIERlcml2ZWQgY2xhc3NlcyBjYW4gY2hvb3NlIHRvIGltcGxlbWVudCB0aGUgYmVsb3dcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gICAgLy8gQnkgZGVmYXVsdCByZXR1cm5zIGEgbm8tb3AgU3BhbkNvbnRleHQuXG4gICAgU3Bhbi5wcm90b3R5cGUuX2NvbnRleHQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBub29wLnNwYW5Db250ZXh0O1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCByZXR1cm5zIGEgbm8tb3AgdHJhY2VyLlxuICAgIC8vXG4gICAgLy8gVGhlIGJhc2UgY2xhc3MgY291bGQgc3RvcmUgdGhlIHRyYWNlciB0aGF0IGNyZWF0ZWQgaXQsIGJ1dCBpdCBkb2VzIG5vdFxuICAgIC8vIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgbm8tb3Agc3BhbiBpbXBsZW1lbnRhdGlvbiBoYXMgemVybyBtZW1iZXJzLFxuICAgIC8vIHdoaWNoIGFsbG93cyBWOCB0byBhZ2dyZXNzaXZlbHkgb3B0aW1pemUgY2FsbHMgdG8gc3VjaCBvYmplY3RzLlxuICAgIFNwYW4ucHJvdG90eXBlLl90cmFjZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBub29wLnRyYWNlcjtcbiAgICB9O1xuICAgIC8vIEJ5IGRlZmF1bHQgZG9lcyBub3RoaW5nXG4gICAgU3Bhbi5wcm90b3R5cGUuX3NldE9wZXJhdGlvbk5hbWUgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBTcGFuLnByb3RvdHlwZS5fc2V0QmFnZ2FnZUl0ZW0gPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBTcGFuLnByb3RvdHlwZS5fZ2V0QmFnZ2FnZUl0ZW0gPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgICAvLyBCeSBkZWZhdWx0IGRvZXMgbm90aGluZ1xuICAgIC8vXG4gICAgLy8gTk9URTogYm90aCBzZXRUYWcoKSBhbmQgYWRkVGFncygpIG1hcCB0byB0aGlzIGZ1bmN0aW9uLiBrZXlWYWx1ZVBhaXJzXG4gICAgLy8gd2lsbCBhbHdheXMgYmUgYW4gYXNzb2NpYXRpdmUgYXJyYXkuXG4gICAgU3Bhbi5wcm90b3R5cGUuX2FkZFRhZ3MgPSBmdW5jdGlvbiAoa2V5VmFsdWVQYWlycykge1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICBTcGFuLnByb3RvdHlwZS5fbG9nID0gZnVuY3Rpb24gKGtleVZhbHVlUGFpcnMsIHRpbWVzdGFtcCkge1xuICAgIH07XG4gICAgLy8gQnkgZGVmYXVsdCBkb2VzIG5vdGhpbmdcbiAgICAvL1xuICAgIC8vIGZpbmlzaFRpbWUgaXMgZXhwZWN0ZWQgdG8gYmUgZWl0aGVyIGEgbnVtYmVyIG9yIHVuZGVmaW5lZC5cbiAgICBTcGFuLnByb3RvdHlwZS5fZmluaXNoID0gZnVuY3Rpb24gKGZpbmlzaFRpbWUpIHtcbiAgICB9O1xuICAgIHJldHVybiBTcGFuO1xufSgpKTtcbmV4cG9ydHMuU3BhbiA9IFNwYW47XG5leHBvcnRzLmRlZmF1bHQgPSBTcGFuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9c3Bhbi5qcy5tYXAiLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbi8qKlxuICogU3BhbkNvbnRleHQgcmVwcmVzZW50cyBTcGFuIHN0YXRlIHRoYXQgbXVzdCBwcm9wYWdhdGUgdG8gZGVzY2VuZGFudCBTcGFuc1xuICogYW5kIGFjcm9zcyBwcm9jZXNzIGJvdW5kYXJpZXMuXG4gKlxuICogU3BhbkNvbnRleHQgaXMgbG9naWNhbGx5IGRpdmlkZWQgaW50byB0d28gcGllY2VzOiB0aGUgdXNlci1sZXZlbCBcIkJhZ2dhZ2VcIlxuICogKHNlZSBzZXRCYWdnYWdlSXRlbSBhbmQgZ2V0QmFnZ2FnZUl0ZW0pIHRoYXQgcHJvcGFnYXRlcyBhY3Jvc3MgU3BhblxuICogYm91bmRhcmllcyBhbmQgYW55IFRyYWNlci1pbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBmaWVsZHMgdGhhdCBhcmUgbmVlZGVkIHRvXG4gKiBpZGVudGlmeSBvciBvdGhlcndpc2UgY29udGV4dHVhbGl6ZSB0aGUgYXNzb2NpYXRlZCBTcGFuIGluc3RhbmNlIChlLmcuLCBhXG4gKiA8dHJhY2VfaWQsIHNwYW5faWQsIHNhbXBsZWQ+IHR1cGxlKS5cbiAqL1xudmFyIFNwYW5Db250ZXh0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFNwYW5Db250ZXh0KCkge1xuICAgIH1cbiAgICByZXR1cm4gU3BhbkNvbnRleHQ7XG59KCkpO1xuZXhwb3J0cy5TcGFuQ29udGV4dCA9IFNwYW5Db250ZXh0O1xuZXhwb3J0cy5kZWZhdWx0ID0gU3BhbkNvbnRleHQ7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zcGFuX2NvbnRleHQuanMubWFwIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG52YXIgRnVuY3Rpb25zID0gcmVxdWlyZShcIi4vZnVuY3Rpb25zXCIpO1xudmFyIE5vb3AgPSByZXF1aXJlKFwiLi9ub29wXCIpO1xudmFyIHNwYW5fMSA9IHJlcXVpcmUoXCIuL3NwYW5cIik7XG4vKipcbiAqIFRyYWNlciBpcyB0aGUgZW50cnktcG9pbnQgYmV0d2VlbiB0aGUgaW5zdHJ1bWVudGF0aW9uIEFQSSBhbmQgdGhlIHRyYWNpbmdcbiAqIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIFRoZSBkZWZhdWx0IG9iamVjdCBhY3RzIGFzIGEgbm8tb3AgaW1wbGVtZW50YXRpb24uXG4gKlxuICogTm90ZSB0byBpbXBsZW1lbnRhdG9yczogZGVyaXZlZCBjbGFzc2VzIGNhbiBjaG9vc2UgdG8gZGlyZWN0bHkgaW1wbGVtZW50IHRoZVxuICogbWV0aG9kcyBpbiB0aGUgXCJPcGVuVHJhY2luZyBBUEkgbWV0aG9kc1wiIHNlY3Rpb24sIG9yIG9wdGlvbmFsbHkgdGhlIHN1YnNldCBvZlxuICogdW5kZXJzY29yZS1wcmVmaXhlZCBtZXRob2RzIHRvIHBpY2sgdXAgdGhlIGFyZ3VtZW50IGNoZWNraW5nIGFuZCBoYW5kbGluZ1xuICogYXV0b21hdGljYWxseSBmcm9tIHRoZSBiYXNlIGNsYXNzLlxuICovXG52YXIgVHJhY2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIFRyYWNlcigpIHtcbiAgICB9XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAgIC8vIE9wZW5UcmFjaW5nIEFQSSBtZXRob2RzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBhbmQgcmV0dXJucyBhIG5ldyBTcGFuIHJlcHJlc2VudGluZyBhIGxvZ2ljYWwgdW5pdCBvZiB3b3JrLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiAgICAgLy8gU3RhcnQgYSBuZXcgKHBhcmVudGxlc3MpIHJvb3QgU3BhbjpcbiAgICAgKiAgICAgdmFyIHBhcmVudCA9IFRyYWNlci5zdGFydFNwYW4oJ0RvV29yaycpO1xuICAgICAqXG4gICAgICogICAgIC8vIFN0YXJ0IGEgbmV3IChjaGlsZCkgU3BhbjpcbiAgICAgKiAgICAgdmFyIGNoaWxkID0gVHJhY2VyLnN0YXJ0U3BhbignbG9hZC1mcm9tLWRiJywge1xuICAgICAqICAgICAgICAgY2hpbGRPZjogcGFyZW50LmNvbnRleHQoKSxcbiAgICAgKiAgICAgfSk7XG4gICAgICpcbiAgICAgKiAgICAgLy8gU3RhcnQgYSBuZXcgYXN5bmMgKEZvbGxvd3NGcm9tKSBTcGFuOlxuICAgICAqICAgICB2YXIgY2hpbGQgPSBUcmFjZXIuc3RhcnRTcGFuKCdhc3luYy1jYWNoZS13cml0ZScsIHtcbiAgICAgKiAgICAgICAgIHJlZmVyZW5jZXM6IFtcbiAgICAgKiAgICAgICAgICAgICBvcGVudHJhY2luZy5mb2xsb3dzRnJvbShwYXJlbnQuY29udGV4dCgpKVxuICAgICAqICAgICAgICAgXSxcbiAgICAgKiAgICAgfSk7XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gKFJFUVVJUkVEKS5cbiAgICAgKiBAcGFyYW0ge1NwYW5PcHRpb25zfSBbb3B0aW9uc10gLSBvcHRpb25zIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBzcGFuLlxuICAgICAqIEByZXR1cm4ge1NwYW59IC0gYSBuZXcgU3BhbiBvYmplY3QuXG4gICAgICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5zdGFydFNwYW4gPSBmdW5jdGlvbiAobmFtZSwgb3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgICAgICAvLyBDb252ZXJ0IG9wdGlvbnMuY2hpbGRPZiB0byBmaWVsZHMucmVmZXJlbmNlcyBhcyBuZWVkZWQuXG4gICAgICAgIGlmIChvcHRpb25zLmNoaWxkT2YpIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgZnJvbSBhIFNwYW4gb3IgYSBTcGFuQ29udGV4dCBpbnRvIGEgUmVmZXJlbmNlLlxuICAgICAgICAgICAgdmFyIGNoaWxkT2YgPSBGdW5jdGlvbnMuY2hpbGRPZihvcHRpb25zLmNoaWxkT2YpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVmZXJlbmNlcykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMucmVmZXJlbmNlcy5wdXNoKGNoaWxkT2YpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5yZWZlcmVuY2VzID0gW2NoaWxkT2ZdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVsZXRlIChvcHRpb25zLmNoaWxkT2YpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGFydFNwYW4obmFtZSwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBJbmplY3RzIHRoZSBnaXZlbiBTcGFuQ29udGV4dCBpbnN0YW5jZSBmb3IgY3Jvc3MtcHJvY2VzcyBwcm9wYWdhdGlvblxuICAgICAqIHdpdGhpbiBgY2FycmllcmAuIFRoZSBleHBlY3RlZCB0eXBlIG9mIGBjYXJyaWVyYCBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZlxuICAgICAqIGBmb3JtYXQuXG4gICAgICpcbiAgICAgKiBPcGVuVHJhY2luZyBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBgZm9ybWF0YCB2YWx1ZXMgKHNlZVxuICAgICAqIEZPUk1BVF9URVhUX01BUCwgRk9STUFUX0hUVFBfSEVBREVSUywgYW5kIEZPUk1BVF9CSU5BUlkpLCBhbmQgZWFjaCBoYXNcbiAgICAgKiBhbiBleHBlY3RlZCBjYXJyaWVyIHR5cGUuXG4gICAgICpcbiAgICAgKiBDb25zaWRlciB0aGlzIHBzZXVkb2NvZGUgZXhhbXBsZTpcbiAgICAgKlxuICAgICAqICAgICB2YXIgY2xpZW50U3BhbiA9IC4uLjtcbiAgICAgKiAgICAgLi4uXG4gICAgICogICAgIC8vIEluamVjdCBjbGllbnRTcGFuIGludG8gYSB0ZXh0IGNhcnJpZXIuXG4gICAgICogICAgIHZhciBoZWFkZXJzQ2FycmllciA9IHt9O1xuICAgICAqICAgICBUcmFjZXIuaW5qZWN0KGNsaWVudFNwYW4uY29udGV4dCgpLCBUcmFjZXIuRk9STUFUX0hUVFBfSEVBREVSUywgaGVhZGVyc0NhcnJpZXIpO1xuICAgICAqICAgICAvLyBJbmNvcnBvcmF0ZSB0aGUgdGV4dENhcnJpZXIgaW50byB0aGUgb3V0Ym91bmQgSFRUUCByZXF1ZXN0IGhlYWRlclxuICAgICAqICAgICAvLyBtYXAuXG4gICAgICogICAgIE9iamVjdC5hc3NpZ24ob3V0Ym91bmRIVFRQUmVxLmhlYWRlcnMsIGhlYWRlcnNDYXJyaWVyKTtcbiAgICAgKiAgICAgLy8gLi4uIHNlbmQgdGhlIGh0dHBSZXFcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1NwYW5Db250ZXh0fSBzcGFuQ29udGV4dCAtIHRoZSBTcGFuQ29udGV4dCB0byBpbmplY3QgaW50byB0aGVcbiAgICAgKiAgICAgICAgIGNhcnJpZXIgb2JqZWN0LiBBcyBhIGNvbnZlbmllbmNlLCBhIFNwYW4gaW5zdGFuY2UgbWF5IGJlIHBhc3NlZFxuICAgICAqICAgICAgICAgaW4gaW5zdGVhZCAoaW4gd2hpY2ggY2FzZSBpdHMgLmNvbnRleHQoKSBpcyB1c2VkIGZvciB0aGVcbiAgICAgKiAgICAgICAgIGluamVjdCgpKS5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGZvcm1hdCAtIHRoZSBmb3JtYXQgb2YgdGhlIGNhcnJpZXIuXG4gICAgICogQHBhcmFtICB7YW55fSBjYXJyaWVyIC0gc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgY2hvc2VuIGBmb3JtYXRgXG4gICAgICogICAgICAgICBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY2FycmllciBvYmplY3QuXG4gICAgICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5pbmplY3QgPSBmdW5jdGlvbiAoc3BhbkNvbnRleHQsIGZvcm1hdCwgY2Fycmllcikge1xuICAgICAgICAvLyBBbGxvdyB0aGUgdXNlciB0byBwYXNzIGEgU3BhbiBpbnN0ZWFkIG9mIGEgU3BhbkNvbnRleHRcbiAgICAgICAgaWYgKHNwYW5Db250ZXh0IGluc3RhbmNlb2Ygc3Bhbl8xLmRlZmF1bHQpIHtcbiAgICAgICAgICAgIHNwYW5Db250ZXh0ID0gc3BhbkNvbnRleHQuY29udGV4dCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3Qoc3BhbkNvbnRleHQsIGZvcm1hdCwgY2Fycmllcik7XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgU3BhbkNvbnRleHQgaW5zdGFuY2UgZXh0cmFjdGVkIGZyb20gYGNhcnJpZXJgIGluIHRoZSBnaXZlblxuICAgICAqIGBmb3JtYXRgLlxuICAgICAqXG4gICAgICogT3BlblRyYWNpbmcgZGVmaW5lcyBhIGNvbW1vbiBzZXQgb2YgYGZvcm1hdGAgdmFsdWVzIChzZWVcbiAgICAgKiBGT1JNQVRfVEVYVF9NQVAsIEZPUk1BVF9IVFRQX0hFQURFUlMsIGFuZCBGT1JNQVRfQklOQVJZKSwgYW5kIGVhY2ggaGFzXG4gICAgICogYW4gZXhwZWN0ZWQgY2FycmllciB0eXBlLlxuICAgICAqXG4gICAgICogQ29uc2lkZXIgdGhpcyBwc2V1ZG9jb2RlIGV4YW1wbGU6XG4gICAgICpcbiAgICAgKiAgICAgLy8gVXNlIHRoZSBpbmJvdW5kIEhUVFAgcmVxdWVzdCdzIGhlYWRlcnMgYXMgYSB0ZXh0IG1hcCBjYXJyaWVyLlxuICAgICAqICAgICB2YXIgaGVhZGVyc0NhcnJpZXIgPSBpbmJvdW5kSFRUUFJlcS5oZWFkZXJzO1xuICAgICAqICAgICB2YXIgd2lyZUN0eCA9IFRyYWNlci5leHRyYWN0KFRyYWNlci5GT1JNQVRfSFRUUF9IRUFERVJTLCBoZWFkZXJzQ2Fycmllcik7XG4gICAgICogICAgIHZhciBzZXJ2ZXJTcGFuID0gVHJhY2VyLnN0YXJ0U3BhbignLi4uJywgeyBjaGlsZE9mIDogd2lyZUN0eCB9KTtcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gZm9ybWF0IC0gdGhlIGZvcm1hdCBvZiB0aGUgY2Fycmllci5cbiAgICAgKiBAcGFyYW0gIHthbnl9IGNhcnJpZXIgLSB0aGUgdHlwZSBvZiB0aGUgY2FycmllciBvYmplY3QgaXMgZGV0ZXJtaW5lZCBieVxuICAgICAqICAgICAgICAgdGhlIGZvcm1hdC5cbiAgICAgKiBAcmV0dXJuIHtTcGFuQ29udGV4dH1cbiAgICAgKiAgICAgICAgIFRoZSBleHRyYWN0ZWQgU3BhbkNvbnRleHQsIG9yIG51bGwgaWYgbm8gc3VjaCBTcGFuQ29udGV4dCBjb3VsZFxuICAgICAqICAgICAgICAgYmUgZm91bmQgaW4gYGNhcnJpZXJgXG4gICAgICovXG4gICAgVHJhY2VyLnByb3RvdHlwZS5leHRyYWN0ID0gZnVuY3Rpb24gKGZvcm1hdCwgY2Fycmllcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fZXh0cmFjdChmb3JtYXQsIGNhcnJpZXIpO1xuICAgIH07XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuICAgIC8vIERlcml2ZWQgY2xhc3NlcyBjYW4gY2hvb3NlIHRvIGltcGxlbWVudCB0aGUgYmVsb3dcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4gICAgLy8gTk9URTogdGhlIGlucHV0IHRvIHRoaXMgbWV0aG9kIGlzICphbHdheXMqIGFuIGFzc29jaWF0aXZlIGFycmF5LiBUaGVcbiAgICAvLyBwdWJsaWMtZmFjaW5nIHN0YXJ0U3BhbigpIG1ldGhvZCBub3JtYWxpemVzIHRoZSBhcmd1bWVudHMgc28gdGhhdFxuICAgIC8vIGFsbCBOIGltcGxlbWVudGF0aW9ucyBkbyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCB2YXJpYXRpb25zIGluIHRoZSBjYWxsXG4gICAgLy8gc2lnbmF0dXJlLlxuICAgIC8vXG4gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3IgcmV0dXJucyBhIG5vLW9wIHNwYW4uXG4gICAgVHJhY2VyLnByb3RvdHlwZS5fc3RhcnRTcGFuID0gZnVuY3Rpb24gKG5hbWUsIGZpZWxkcykge1xuICAgICAgICByZXR1cm4gTm9vcC5zcGFuO1xuICAgIH07XG4gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgYSBuby1vcC5cbiAgICBUcmFjZXIucHJvdG90eXBlLl9pbmplY3QgPSBmdW5jdGlvbiAoc3BhbkNvbnRleHQsIGZvcm1hdCwgY2Fycmllcikge1xuICAgIH07XG4gICAgLy8gVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmV0dXJuIGEgbm8tb3AgU3BhbkNvbnRleHQuXG4gICAgVHJhY2VyLnByb3RvdHlwZS5fZXh0cmFjdCA9IGZ1bmN0aW9uIChmb3JtYXQsIGNhcnJpZXIpIHtcbiAgICAgICAgcmV0dXJuIE5vb3Auc3BhbkNvbnRleHQ7XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VyO1xufSgpKTtcbmV4cG9ydHMuVHJhY2VyID0gVHJhY2VyO1xuZXhwb3J0cy5kZWZhdWx0ID0gVHJhY2VyO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dHJhY2VyLmpzLm1hcCIsIi8qKlxuICogQHRoaXMge1Byb21pc2V9XG4gKi9cbmZ1bmN0aW9uIGZpbmFsbHlDb25zdHJ1Y3RvcihjYWxsYmFjaykge1xuICB2YXIgY29uc3RydWN0b3IgPSB0aGlzLmNvbnN0cnVjdG9yO1xuICByZXR1cm4gdGhpcy50aGVuKFxuICAgIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICByZXR1cm4gY29uc3RydWN0b3IucmVzb2x2ZShjYWxsYmFjaygpKS50aGVuKGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGZ1bmN0aW9uKHJlYXNvbikge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLnJlc29sdmUoY2FsbGJhY2soKSkudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gY29uc3RydWN0b3IucmVqZWN0KHJlYXNvbik7XG4gICAgICB9KTtcbiAgICB9XG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZpbmFsbHlDb25zdHJ1Y3RvcjtcbiIsImltcG9ydCBwcm9taXNlRmluYWxseSBmcm9tICcuL2ZpbmFsbHknO1xuXG4vLyBTdG9yZSBzZXRUaW1lb3V0IHJlZmVyZW5jZSBzbyBwcm9taXNlLXBvbHlmaWxsIHdpbGwgYmUgdW5hZmZlY3RlZCBieVxuLy8gb3RoZXIgY29kZSBtb2RpZnlpbmcgc2V0VGltZW91dCAobGlrZSBzaW5vbi51c2VGYWtlVGltZXJzKCkpXG52YXIgc2V0VGltZW91dEZ1bmMgPSBzZXRUaW1lb3V0O1xuXG5mdW5jdGlvbiBpc0FycmF5KHgpIHtcbiAgcmV0dXJuIEJvb2xlYW4oeCAmJiB0eXBlb2YgeC5sZW5ndGggIT09ICd1bmRlZmluZWQnKTtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbi8vIFBvbHlmaWxsIGZvciBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxuZnVuY3Rpb24gYmluZChmbiwgdGhpc0FyZykge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgZm4uYXBwbHkodGhpc0FyZywgYXJndW1lbnRzKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKi9cbmZ1bmN0aW9uIFByb21pc2UoZm4pIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFByb21pc2UpKVxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Byb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldycpO1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdub3QgYSBmdW5jdGlvbicpO1xuICAvKiogQHR5cGUgeyFudW1iZXJ9ICovXG4gIHRoaXMuX3N0YXRlID0gMDtcbiAgLyoqIEB0eXBlIHshYm9vbGVhbn0gKi9cbiAgdGhpcy5faGFuZGxlZCA9IGZhbHNlO1xuICAvKiogQHR5cGUge1Byb21pc2V8dW5kZWZpbmVkfSAqL1xuICB0aGlzLl92YWx1ZSA9IHVuZGVmaW5lZDtcbiAgLyoqIEB0eXBlIHshQXJyYXk8IUZ1bmN0aW9uPn0gKi9cbiAgdGhpcy5fZGVmZXJyZWRzID0gW107XG5cbiAgZG9SZXNvbHZlKGZuLCB0aGlzKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlKHNlbGYsIGRlZmVycmVkKSB7XG4gIHdoaWxlIChzZWxmLl9zdGF0ZSA9PT0gMykge1xuICAgIHNlbGYgPSBzZWxmLl92YWx1ZTtcbiAgfVxuICBpZiAoc2VsZi5fc3RhdGUgPT09IDApIHtcbiAgICBzZWxmLl9kZWZlcnJlZHMucHVzaChkZWZlcnJlZCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHNlbGYuX2hhbmRsZWQgPSB0cnVlO1xuICBQcm9taXNlLl9pbW1lZGlhdGVGbihmdW5jdGlvbigpIHtcbiAgICB2YXIgY2IgPSBzZWxmLl9zdGF0ZSA9PT0gMSA/IGRlZmVycmVkLm9uRnVsZmlsbGVkIDogZGVmZXJyZWQub25SZWplY3RlZDtcbiAgICBpZiAoY2IgPT09IG51bGwpIHtcbiAgICAgIChzZWxmLl9zdGF0ZSA9PT0gMSA/IHJlc29sdmUgOiByZWplY3QpKGRlZmVycmVkLnByb21pc2UsIHNlbGYuX3ZhbHVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJldDtcbiAgICB0cnkge1xuICAgICAgcmV0ID0gY2Ioc2VsZi5fdmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChkZWZlcnJlZC5wcm9taXNlLCBlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVzb2x2ZShkZWZlcnJlZC5wcm9taXNlLCByZXQpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZShzZWxmLCBuZXdWYWx1ZSkge1xuICB0cnkge1xuICAgIC8vIFByb21pc2UgUmVzb2x1dGlvbiBQcm9jZWR1cmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9taXNlcy1hcGx1cy9wcm9taXNlcy1zcGVjI3RoZS1wcm9taXNlLXJlc29sdXRpb24tcHJvY2VkdXJlXG4gICAgaWYgKG5ld1ZhbHVlID09PSBzZWxmKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQSBwcm9taXNlIGNhbm5vdCBiZSByZXNvbHZlZCB3aXRoIGl0c2VsZi4nKTtcbiAgICBpZiAoXG4gICAgICBuZXdWYWx1ZSAmJlxuICAgICAgKHR5cGVvZiBuZXdWYWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIG5ld1ZhbHVlID09PSAnZnVuY3Rpb24nKVxuICAgICkge1xuICAgICAgdmFyIHRoZW4gPSBuZXdWYWx1ZS50aGVuO1xuICAgICAgaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBzZWxmLl9zdGF0ZSA9IDM7XG4gICAgICAgIHNlbGYuX3ZhbHVlID0gbmV3VmFsdWU7XG4gICAgICAgIGZpbmFsZShzZWxmKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBkb1Jlc29sdmUoYmluZCh0aGVuLCBuZXdWYWx1ZSksIHNlbGYpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHNlbGYuX3N0YXRlID0gMTtcbiAgICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICAgIGZpbmFsZShzZWxmKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlamVjdChzZWxmLCBlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWplY3Qoc2VsZiwgbmV3VmFsdWUpIHtcbiAgc2VsZi5fc3RhdGUgPSAyO1xuICBzZWxmLl92YWx1ZSA9IG5ld1ZhbHVlO1xuICBmaW5hbGUoc2VsZik7XG59XG5cbmZ1bmN0aW9uIGZpbmFsZShzZWxmKSB7XG4gIGlmIChzZWxmLl9zdGF0ZSA9PT0gMiAmJiBzZWxmLl9kZWZlcnJlZHMubGVuZ3RoID09PSAwKSB7XG4gICAgUHJvbWlzZS5faW1tZWRpYXRlRm4oZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoIXNlbGYuX2hhbmRsZWQpIHtcbiAgICAgICAgUHJvbWlzZS5fdW5oYW5kbGVkUmVqZWN0aW9uRm4oc2VsZi5fdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IHNlbGYuX2RlZmVycmVkcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgIGhhbmRsZShzZWxmLCBzZWxmLl9kZWZlcnJlZHNbaV0pO1xuICB9XG4gIHNlbGYuX2RlZmVycmVkcyA9IG51bGw7XG59XG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb21pc2UpIHtcbiAgdGhpcy5vbkZ1bGZpbGxlZCA9IHR5cGVvZiBvbkZ1bGZpbGxlZCA9PT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogbnVsbDtcbiAgdGhpcy5vblJlamVjdGVkID0gdHlwZW9mIG9uUmVqZWN0ZWQgPT09ICdmdW5jdGlvbicgPyBvblJlamVjdGVkIDogbnVsbDtcbiAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbn1cblxuLyoqXG4gKiBUYWtlIGEgcG90ZW50aWFsbHkgbWlzYmVoYXZpbmcgcmVzb2x2ZXIgZnVuY3Rpb24gYW5kIG1ha2Ugc3VyZVxuICogb25GdWxmaWxsZWQgYW5kIG9uUmVqZWN0ZWQgYXJlIG9ubHkgY2FsbGVkIG9uY2UuXG4gKlxuICogTWFrZXMgbm8gZ3VhcmFudGVlcyBhYm91dCBhc3luY2hyb255LlxuICovXG5mdW5jdGlvbiBkb1Jlc29sdmUoZm4sIHNlbGYpIHtcbiAgdmFyIGRvbmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBmbihcbiAgICAgIGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICByZXNvbHZlKHNlbGYsIHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICBmdW5jdGlvbihyZWFzb24pIHtcbiAgICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgIHJlamVjdChzZWxmLCByZWFzb24pO1xuICAgICAgfVxuICAgICk7XG4gIH0gY2F0Y2ggKGV4KSB7XG4gICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICBkb25lID0gdHJ1ZTtcbiAgICByZWplY3Qoc2VsZiwgZXgpO1xuICB9XG59XG5cblByb21pc2UucHJvdG90eXBlWydjYXRjaCddID0gZnVuY3Rpb24ob25SZWplY3RlZCkge1xuICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0ZWQpO1xufTtcblxuUHJvbWlzZS5wcm90b3R5cGUudGhlbiA9IGZ1bmN0aW9uKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKSB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgdmFyIHByb20gPSBuZXcgdGhpcy5jb25zdHJ1Y3Rvcihub29wKTtcblxuICBoYW5kbGUodGhpcywgbmV3IEhhbmRsZXIob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQsIHByb20pKTtcbiAgcmV0dXJuIHByb207XG59O1xuXG5Qcm9taXNlLnByb3RvdHlwZVsnZmluYWxseSddID0gcHJvbWlzZUZpbmFsbHk7XG5cblByb21pc2UuYWxsID0gZnVuY3Rpb24oYXJyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICBpZiAoIWlzQXJyYXkoYXJyKSkge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgVHlwZUVycm9yKCdQcm9taXNlLmFsbCBhY2NlcHRzIGFuIGFycmF5JykpO1xuICAgIH1cblxuICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJyKTtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiByZXNvbHZlKFtdKTtcbiAgICB2YXIgcmVtYWluaW5nID0gYXJncy5sZW5ndGg7XG5cbiAgICBmdW5jdGlvbiByZXMoaSwgdmFsKSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAodmFsICYmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKSkge1xuICAgICAgICAgIHZhciB0aGVuID0gdmFsLnRoZW47XG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGVuLmNhbGwoXG4gICAgICAgICAgICAgIHZhbCxcbiAgICAgICAgICAgICAgZnVuY3Rpb24odmFsKSB7XG4gICAgICAgICAgICAgICAgcmVzKGksIHZhbCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJlamVjdFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXJnc1tpXSA9IHZhbDtcbiAgICAgICAgaWYgKC0tcmVtYWluaW5nID09PSAwKSB7XG4gICAgICAgICAgcmVzb2x2ZShhcmdzKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgcmVqZWN0KGV4KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlcyhpLCBhcmdzW2ldKTtcbiAgICB9XG4gIH0pO1xufTtcblxuUHJvbWlzZS5yZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IFByb21pc2UpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSkge1xuICAgIHJlc29sdmUodmFsdWUpO1xuICB9KTtcbn07XG5cblByb21pc2UucmVqZWN0ID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlamVjdCh2YWx1ZSk7XG4gIH0pO1xufTtcblxuUHJvbWlzZS5yYWNlID0gZnVuY3Rpb24oYXJyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICBpZiAoIWlzQXJyYXkoYXJyKSkge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgVHlwZUVycm9yKCdQcm9taXNlLnJhY2UgYWNjZXB0cyBhbiBhcnJheScpKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYXJyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBQcm9taXNlLnJlc29sdmUoYXJyW2ldKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8vIFVzZSBwb2x5ZmlsbCBmb3Igc2V0SW1tZWRpYXRlIGZvciBwZXJmb3JtYW5jZSBnYWluc1xuUHJvbWlzZS5faW1tZWRpYXRlRm4gPVxuICAvLyBAdHMtaWdub3JlXG4gICh0eXBlb2Ygc2V0SW1tZWRpYXRlID09PSAnZnVuY3Rpb24nICYmXG4gICAgZnVuY3Rpb24oZm4pIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHNldEltbWVkaWF0ZShmbik7XG4gICAgfSkgfHxcbiAgZnVuY3Rpb24oZm4pIHtcbiAgICBzZXRUaW1lb3V0RnVuYyhmbiwgMCk7XG4gIH07XG5cblByb21pc2UuX3VuaGFuZGxlZFJlamVjdGlvbkZuID0gZnVuY3Rpb24gX3VuaGFuZGxlZFJlamVjdGlvbkZuKGVycikge1xuICBpZiAodHlwZW9mIGNvbnNvbGUgIT09ICd1bmRlZmluZWQnICYmIGNvbnNvbGUpIHtcbiAgICBjb25zb2xlLndhcm4oJ1Bvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjonLCBlcnIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgUHJvbWlzZTtcbiIsIihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkge1xuICAgICd1c2Ugc3RyaWN0JztcbiAgICAvLyBVbml2ZXJzYWwgTW9kdWxlIERlZmluaXRpb24gKFVNRCkgdG8gc3VwcG9ydCBBTUQsIENvbW1vbkpTL05vZGUuanMsIFJoaW5vLCBhbmQgYnJvd3NlcnMuXG5cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgZGVmaW5lKCdzdGFja2ZyYW1lJywgW10sIGZhY3RvcnkpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3QuU3RhY2tGcmFtZSA9IGZhY3RvcnkoKTtcbiAgICB9XG59KHRoaXMsIGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgZnVuY3Rpb24gX2lzTnVtYmVyKG4pIHtcbiAgICAgICAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KG4pKSAmJiBpc0Zpbml0ZShuKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBTdGFja0ZyYW1lKGZ1bmN0aW9uTmFtZSwgYXJncywgZmlsZU5hbWUsIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlciwgc291cmNlKSB7XG4gICAgICAgIGlmIChmdW5jdGlvbk5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5zZXRGdW5jdGlvbk5hbWUoZnVuY3Rpb25OYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXJncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldEFyZ3MoYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbGVOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsZU5hbWUoZmlsZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5lTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0TGluZU51bWJlcihsaW5lTnVtYmVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29sdW1uTnVtYmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29sdW1uTnVtYmVyKGNvbHVtbk51bWJlcik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnNldFNvdXJjZShzb3VyY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgU3RhY2tGcmFtZS5wcm90b3R5cGUgPSB7XG4gICAgICAgIGdldEZ1bmN0aW9uTmFtZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZnVuY3Rpb25OYW1lO1xuICAgICAgICB9LFxuICAgICAgICBzZXRGdW5jdGlvbk5hbWU6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICB0aGlzLmZ1bmN0aW9uTmFtZSA9IFN0cmluZyh2KTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRBcmdzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcmdzO1xuICAgICAgICB9LFxuICAgICAgICBzZXRBcmdzOiBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2KSAhPT0gJ1tvYmplY3QgQXJyYXldJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3MgbXVzdCBiZSBhbiBBcnJheScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hcmdzID0gdjtcbiAgICAgICAgfSxcblxuICAgICAgICAvLyBOT1RFOiBQcm9wZXJ0eSBuYW1lIG1heSBiZSBtaXNsZWFkaW5nIGFzIGl0IGluY2x1ZGVzIHRoZSBwYXRoLFxuICAgICAgICAvLyBidXQgaXQgc29tZXdoYXQgbWlycm9ycyBWOCdzIEphdmFTY3JpcHRTdGFja1RyYWNlQXBpXG4gICAgICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avdjgvd2lraS9KYXZhU2NyaXB0U3RhY2tUcmFjZUFwaSBhbmQgR2Vja28nc1xuICAgICAgICAvLyBodHRwOi8vbXhyLm1vemlsbGEub3JnL21vemlsbGEtY2VudHJhbC9zb3VyY2UveHBjb20vYmFzZS9uc0lFeGNlcHRpb24uaWRsIzE0XG4gICAgICAgIGdldEZpbGVOYW1lOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWxlTmFtZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0RmlsZU5hbWU6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVOYW1lID0gU3RyaW5nKHYpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldExpbmVOdW1iZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxpbmVOdW1iZXI7XG4gICAgICAgIH0sXG4gICAgICAgIHNldExpbmVOdW1iZXI6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICBpZiAoIV9pc051bWJlcih2KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0xpbmUgTnVtYmVyIG11c3QgYmUgYSBOdW1iZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubGluZU51bWJlciA9IE51bWJlcih2KTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRDb2x1bW5OdW1iZXI6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbHVtbk51bWJlcjtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0Q29sdW1uTnVtYmVyOiBmdW5jdGlvbiAodikge1xuICAgICAgICAgICAgaWYgKCFfaXNOdW1iZXIodikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdDb2x1bW4gTnVtYmVyIG11c3QgYmUgYSBOdW1iZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29sdW1uTnVtYmVyID0gTnVtYmVyKHYpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldFNvdXJjZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc291cmNlO1xuICAgICAgICB9LFxuICAgICAgICBzZXRTb3VyY2U6IGZ1bmN0aW9uICh2KSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IFN0cmluZyh2KTtcbiAgICAgICAgfSxcblxuICAgICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgZnVuY3Rpb25OYW1lID0gdGhpcy5nZXRGdW5jdGlvbk5hbWUoKSB8fCAne2Fub255bW91c30nO1xuICAgICAgICAgICAgdmFyIGFyZ3MgPSAnKCcgKyAodGhpcy5nZXRBcmdzKCkgfHwgW10pLmpvaW4oJywnKSArICcpJztcbiAgICAgICAgICAgIHZhciBmaWxlTmFtZSA9IHRoaXMuZ2V0RmlsZU5hbWUoKSA/ICgnQCcgKyB0aGlzLmdldEZpbGVOYW1lKCkpIDogJyc7XG4gICAgICAgICAgICB2YXIgbGluZU51bWJlciA9IF9pc051bWJlcih0aGlzLmdldExpbmVOdW1iZXIoKSkgPyAoJzonICsgdGhpcy5nZXRMaW5lTnVtYmVyKCkpIDogJyc7XG4gICAgICAgICAgICB2YXIgY29sdW1uTnVtYmVyID0gX2lzTnVtYmVyKHRoaXMuZ2V0Q29sdW1uTnVtYmVyKCkpID8gKCc6JyArIHRoaXMuZ2V0Q29sdW1uTnVtYmVyKCkpIDogJyc7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb25OYW1lICsgYXJncyArIGZpbGVOYW1lICsgbGluZU51bWJlciArIGNvbHVtbk51bWJlcjtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gU3RhY2tGcmFtZTtcbn0pKTtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuXHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgZGVmaW5pdGlvbikge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmosIHByb3ApIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApOyB9IiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvKipcbiAqIE1JVCBMaWNlbnNlXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE3LXByZXNlbnQsIEVsYXN0aWNzZWFyY2ggQlZcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbiAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuICogVEhFIFNPRlRXQVJFLlxuICpcbiAqL1xuXG5pbXBvcnQge1xuICBjcmVhdGVTZXJ2aWNlRmFjdG9yeSxcbiAgYm9vdHN0cmFwLFxuICBpc0Jyb3dzZXJcbn0gZnJvbSAnQGVsYXN0aWMvYXBtLXJ1bS1jb3JlJ1xuaW1wb3J0IEFwbUJhc2UgZnJvbSAnLi9hcG0tYmFzZSdcblxuLyoqXG4gKiBVc2UgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgQXBtQmFzZSBhY3Jvc3MgYWxsIGluc3RhbmNlIG9mIHRoZSBhZ2VudFxuICogaW5jbHVkaW5nIHRoZSBpbnN0YW5jZXMgdXNlZCBpbiBmcmFtZXdvcmsgc3BlY2lmaWMgaW50ZWdyYXRpb25zXG4gKi9cbmZ1bmN0aW9uIGdldEFwbUJhc2UoKSB7XG4gIGlmIChpc0Jyb3dzZXIgJiYgd2luZG93LmVsYXN0aWNBcG0pIHtcbiAgICByZXR1cm4gd2luZG93LmVsYXN0aWNBcG1cbiAgfVxuICBjb25zdCBlbmFibGVkID0gYm9vdHN0cmFwKClcbiAgY29uc3Qgc2VydmljZUZhY3RvcnkgPSBjcmVhdGVTZXJ2aWNlRmFjdG9yeSgpXG4gIGNvbnN0IGFwbUJhc2UgPSBuZXcgQXBtQmFzZShzZXJ2aWNlRmFjdG9yeSwgIWVuYWJsZWQpXG5cbiAgaWYgKGlzQnJvd3Nlcikge1xuICAgIHdpbmRvdy5lbGFzdGljQXBtID0gYXBtQmFzZVxuICB9XG5cbiAgcmV0dXJuIGFwbUJhc2Vcbn1cblxuY29uc3QgYXBtQmFzZSA9IGdldEFwbUJhc2UoKVxuXG5jb25zdCBpbml0ID0gYXBtQmFzZS5pbml0LmJpbmQoYXBtQmFzZSlcblxuZXhwb3J0IGRlZmF1bHQgaW5pdFxuZXhwb3J0IHsgaW5pdCwgYXBtQmFzZSwgQXBtQmFzZSwgYXBtQmFzZSBhcyBhcG0gfVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/an_website/vendored/apm-rum/elastic-apm-rum.umd.min.js b/an_website/vendored/apm-rum/elastic-apm-rum.umd.min.js index edecd7ccf..3a0e12f83 100644 --- a/an_website/vendored/apm-rum/elastic-apm-rum.umd.min.js +++ b/an_website/vendored/apm-rum/elastic-apm-rum.umd.min.js @@ -1,2 +1,2 @@ -!function(){var t={816:function(t,e,n){var r,i,a;!function(o,s){"use strict";i=[n(170)],void 0===(a="function"==typeof(r=function(t){var e=/(^|@)\S+\:\d+/,n=/^\s*at .*(\S+\:\d+|\(native\))/m,r=/^(eval@)?(\[native code\])?$/;function i(t,e,n){if("function"==typeof Array.prototype.map)return t.map(e,n);for(var r=new Array(t.length),i=0;i-1&&(e=e.replace(/eval code/g,"eval").replace(/(\(eval at [^\()]*)|(\)\,.*$)/g,""));var n=e.replace(/^\s+/,"").replace(/\(eval code/g,"(").split(/\s+/).slice(1),r=this.extractLocation(n.pop()),i=n.join(" ")||void 0,a=function(t,e){if("function"==typeof Array.prototype.indexOf)return t.indexOf(e);for(var n=0;n"],r[0])>-1?void 0:r[0];return new t(i,void 0,a,r[1],r[2],e)}),this)},parseFFOrSafari:function(e){return i(a(e.stack.split("\n"),(function(t){return!t.match(r)}),this),(function(e){if(e.indexOf(" > eval")>-1&&(e=e.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g,":$1")),-1===e.indexOf("@")&&-1===e.indexOf(":"))return new t(e);var n=e.split("@"),r=this.extractLocation(n.pop()),i=n.join("@")||void 0;return new t(i,void 0,r[0],r[1],r[2],e)}),this)},parseOpera:function(t){return!t.stacktrace||t.message.indexOf("\n")>-1&&t.message.split("\n").length>t.stacktrace.split("\n").length?this.parseOpera9(t):t.stack?this.parseOpera11(t):this.parseOpera10(t)},parseOpera9:function(e){for(var n=/Line (\d+).*script (?:in )?(\S+)/i,r=e.message.split("\n"),i=[],a=2,o=r.length;a/,"$2").replace(/\([^\)]*\)/g,"")||void 0;a.match(/\(([^\)]*)\)/)&&(n=a.replace(/^[^\(]+\(([^\)]*)\)$/,"$1"));var s=void 0===n||"[arguments not available]"===n?void 0:n.split(",");return new t(o,s,i[0],i[1],i[2],e)}),this)}}})?r.apply(e,i):r)||(t.exports=a)}()},170:function(t,e){var n,r,i;!function(a,o){"use strict";r=[],void 0===(i="function"==typeof(n=function(){function t(t){return!isNaN(parseFloat(t))&&isFinite(t)}function e(t,e,n,r,i,a){void 0!==t&&this.setFunctionName(t),void 0!==e&&this.setArgs(e),void 0!==n&&this.setFileName(n),void 0!==r&&this.setLineNumber(r),void 0!==i&&this.setColumnNumber(i),void 0!==a&&this.setSource(a)}return e.prototype={getFunctionName:function(){return this.functionName},setFunctionName:function(t){this.functionName=String(t)},getArgs:function(){return this.args},setArgs:function(t){if("[object Array]"!==Object.prototype.toString.call(t))throw new TypeError("Args must be an Array");this.args=t},getFileName:function(){return this.fileName},setFileName:function(t){this.fileName=String(t)},getLineNumber:function(){return this.lineNumber},setLineNumber:function(e){if(!t(e))throw new TypeError("Line Number must be a Number");this.lineNumber=Number(e)},getColumnNumber:function(){return this.columnNumber},setColumnNumber:function(e){if(!t(e))throw new TypeError("Column Number must be a Number");this.columnNumber=Number(e)},getSource:function(){return this.source},setSource:function(t){this.source=String(t)},toString:function(){return(this.getFunctionName()||"{anonymous}")+("("+(this.getArgs()||[]).join(",")+")")+(this.getFileName()?"@"+this.getFileName():"")+(t(this.getLineNumber())?":"+this.getLineNumber():"")+(t(this.getColumnNumber())?":"+this.getColumnNumber():"")}},e})?n.apply(e,r):n)||(t.exports=i)}()}},e={};function n(r){var i=e[r];if(void 0!==i)return i.exports;var a=e[r]={exports:{}};return t[r].call(a.exports,a,a.exports,n),a.exports}n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,{a:e}),e},n.d=function(t,e){for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},function(){"use strict";function t(t,e){var n=e.error,r=e.filename,i=e.lineno,a=e.colno,o=[];if(n)try{o=t.parse(n)}catch(t){}return function(t){return 0!==t.length&&(1!==t.length||"lineNumber"in t[0])}(o)||(o=[{fileName:r,lineNumber:i,columnNumber:a}]),o.map((function(t){return t.functionName&&(t.functionName=(e=t.functionName,n=e.split("/"),e=(e=(e=n.length>1?["Object",n[n.length-1]].join("."):n[0]).replace(/.<$/gi,".")).replace(/^Anonymous function$/,""),e=(n=e.split(".")).length>1?n[n.length-1]:n[0])),t;var e,n})).map((function(t){var e=t.fileName,n=t.lineNumber,r=t.columnNumber,i=t.functionName,a=void 0===i?"":i;if(!e&&!n)return{};if(!r&&!n)return{};var o,s,c=function(t){return void 0===t&&(t=""),""===t&&(t=""),t}(e),u=(o=c,s=window.location.origin||window.location.protocol+"//"+window.location.hostname+(window.location.port?":"+window.location.port:""),o.indexOf(s)>-1&&(o=o.replace(s+"/","")),o);return function(t){return!!t&&0===window.location.href.indexOf(t)}(c)&&(u="(inline script)"),{abs_path:e,filename:u,function:a,lineno:n,colno:r}}))}var e=function(t){var e=this.constructor;return this.then((function(n){return e.resolve(t()).then((function(){return n}))}),(function(n){return e.resolve(t()).then((function(){return e.reject(n)}))}))},r=setTimeout;function i(t){return Boolean(t&&void 0!==t.length)}function a(){}function o(t){if(!(this instanceof o))throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],l(t,this)}function s(t,e){for(;3===t._state;)t=t._value;0!==t._state?(t._handled=!0,o._immediateFn((function(){var n=1===t._state?e.onFulfilled:e.onRejected;if(null!==n){var r;try{r=n(t._value)}catch(t){return void u(e.promise,t)}c(e.promise,r)}else(1===t._state?c:u)(e.promise,t._value)}))):t._deferreds.push(e)}function c(t,e){try{if(e===t)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var n=e.then;if(e instanceof o)return t._state=3,t._value=e,void f(t);if("function"==typeof n)return void l((r=n,i=e,function(){r.apply(i,arguments)}),t)}t._state=1,t._value=e,f(t)}catch(e){u(t,e)}var r,i}function u(t,e){t._state=2,t._value=e,f(t)}function f(t){2===t._state&&0===t._deferreds.length&&o._immediateFn((function(){t._handled||o._unhandledRejectionFn(t._value)}));for(var e=0,n=t._deferreds.length;e0)return r}}()}}function I(t){return O(t,g.call(arguments,1),!1)}function j(t){return O(t,g.call(arguments,1),!0)}function R(t){return void 0===t}function q(){}function F(t){return t.replace(/[.*"]/g,"_")}function A(t,e){for(var n=null,r=0;r=0?t:P()}function H(t,e){return R(e)||R(t)?null:parseInt(e-t)}function U(t){h.resolve().then(t)}function z(){return"function"==typeof y.getEntriesByType}function D(t){return"undefined"!=typeof PerformanceObserver&&PerformanceObserver.supportedEntryTypes&&PerformanceObserver.supportedEntryTypes.indexOf(t)>=0}var B=[["#","hash"],["?","query"],["/","path"],["@","auth",1],[NaN,"host",void 0,1]],V=/^([a-z][a-z0-9.+-]*:)?(\/\/)?([\S\s]*)/i,$=function(){function t(t){var e,n=this.extractProtocol(t||""),r=n.protocol,i=n.address,a=n.slashes,o=!r&&!a,s=this.getLocation(),c=B.slice();i=i.replace("\\","/"),a||(c[2]=[NaN,"path"]);for(var u=0;u=0||(i[n]=t[n]);return i}(n,Y)),i=K(),a={};if(t.type===G&&z()){var o=y.getEntriesByType("navigation");o&&o.length>0&&(a={response:Q(o[0])})}t.addContext(i,a,r)}var nt={service:{name:[1024,!0],version:!0,agent:{version:[1024,!0]},environment:!0},labels:{"*":!0}},rt={"*":!0,headers:{"*":!0}},it={user:{id:!0,email:!0,username:!0},tags:{"*":!0},http:{response:rt},destination:{address:[1024],service:{"*":[1024,!0]}},response:rt},at={name:[1024,!0],type:[1024,!0],id:[1024,!0],trace_id:[1024,!0],parent_id:[1024,!0],transaction_id:[1024,!0],subtype:!0,action:!0,context:it},ot={name:!0,parent_id:!0,type:[1024,!0],id:[1024,!0],trace_id:[1024,!0],span_count:{started:[1024,!0]},context:it},st={id:[1024,!0],trace_id:!0,transaction_id:!0,parent_id:!0,culprit:!0,exception:{type:!0},transaction:{type:!0},context:it};function ct(t){return null==t||""===t||void 0===t}function ut(t,e,n){var r=function(t,e,n,r){return void 0===e&&(e=1024),void 0===n&&(n=!1),void 0===r&&(r="N/A"),n&&ct(t)&&(t=r),"string"==typeof t?t.substring(0,e):t}(t[e],n[0],n[1]);ct(r)?delete t[e]:t[e]=r}function ft(t,e,n){void 0===t&&(t={}),void 0===n&&(n=e);for(var r=Object.keys(t),i=[],a=function(a){var o=r[a],s=!0===t[o]?i:t[o];Array.isArray(s)?"*"===o?Object.keys(n).forEach((function(t){return ut(n,t,s)})):ut(n,o,s):ft(s,e,n[o])},o=0;o=0)){var i=t[r];if(null!=i&&"function"!=typeof i){if("object"==typeof i){if("function"!=typeof i.toISOString)return;i=i.toISOString()}n[r]=i,e=!0}}})),e)return n}(o);f&&(u.custom=f)}c||s&&s.indexOf(":")>-1&&(c=s.split(":")[0]);var d=this._transactionService.getCurrentTransaction(),l=d?d.context:{},p=this._configService.get("context"),v=(p.tags,function(t,e){if(null==t)return{};var n,r,i={},a=Object.keys(t);for(r=0;r=0||(i[n]=t[n]);return i}(p,pt)),h=j({},K(),l,v,u),g={id:w(),culprit:r,exception:{message:s,stacktrace:n,type:c},context:h};return d&&(g=I(g,{trace_id:d.traceId,parent_id:d.id,transaction_id:d.id,transaction:{type:d.type,sampled:d.sampled}})),ft(st,g)},n.logErrorEvent=function(t){if(void 0!==t){var e=this.createErrorDataModel(t);void 0!==e.exception.message&&this._apmServer.addError(e)}},n.registerListeners=function(){var t=this;window.addEventListener("error",(function(e){return t.logErrorEvent(e)})),window.addEventListener("unhandledrejection",(function(e){return t.logPromiseEvent(e)}))},n.logPromiseEvent=function(t){var e,n="Unhandled promise rejection: ",r=t.reason;(null==r&&(r=""),"string"==typeof r.message)?e={error:r,message:n+(r.name?r.name+": ":"")+r.message}:e={message:n+(r="object"==typeof r?"":"function"==typeof r?"":r)};this.logErrorEvent(e)},n.logError=function(t){var e={};return"string"==typeof t?e.message=t:e.error=t,this.logErrorEvent(e)},e}(),gt=function(){function t(t,e){void 0===e&&(e={}),this.onFlush=t,this.items=[],this.queueLimit=e.queueLimit||-1,this.flushInterval=e.flushInterval||0,this.timeoutId=void 0}var e=t.prototype;return e._setTimer=function(){var t=this;this.timeoutId=setTimeout((function(){return t.flush()}),this.flushInterval)},e._clear=function(){void 0!==this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=void 0),this.items=[]},e.flush=function(){this.onFlush(this.items),this._clear()},e.add=function(t){this.items.push(t),-1!==this.queueLimit&&this.items.length>=this.queueLimit?this.flush():void 0===this.timeoutId&&this._setTimer()},t}();var mt=function(){function t(){}return t.stringify=function(t){return JSON.stringify(t)+"\n"},t}(),yt=function(){function t(t,e,n){void 0===n&&(n={}),t||(t="Unknown"),e||(e="custom"),this.name=t,this.type=e,this.options=n,this.id=n.id||w(16),this.traceId=n.traceId,this.sampled=n.sampled,this.sampleRate=n.sampleRate,this.timestamp=n.timestamp,this._start=M(n.startTime),this._end=void 0,this.ended=!1,this.outcome=void 0,this.onEnd=n.onEnd}var e=t.prototype;return e.ensureContext=function(){this.context||(this.context={})},e.addLabels=function(t){this.ensureContext();var e=this.context;e.tags||(e.tags={}),Object.keys(t).forEach((function(n){return k(n,t[n],e.tags)}))},e.addContext=function(){for(var t=arguments.length,e=new Array(t),n=0;n=i&&e>t&&t-i>=n&&e-i<=r&&e-t<3e5&&t-i<3e5&&e-i<3e5}function Et(t){var e=t.name,n=t.initiatorType,r=t.startTime,i=t.responseEnd,a="resource";n&&(a+="."+n);var o=C(e),s=new _t(o,a);return s._start=r,s.end(i,{url:e,entry:t}),s}function xt(t,e){return null!=e&&t>e}var kt=["fetchStart","domainLookupStart","domainLookupEnd","connectStart","connectEnd","requestStart","responseStart","responseEnd","domLoading","domInteractive","domContentLoadedEventStart","domContentLoadedEventEnd","domComplete","loadEventStart","loadEventEnd"],Ct=["fs","ls","le","cs","ce","qs","rs","re","dl","di","ds","de","dc","es","ee"];function Lt(t){var e=function(t){var e=t.fetchStart,n=t.navigationStart,r=t.responseStart,i=t.responseEnd;if(e>=n&&r>=e&&i>=r){var a={};return kt.forEach((function(n){var r=t[n];r&&r>=e&&(a[n]=parseInt(r-e))})),a}return null}(t);return null==e?null:{navigationTiming:e,agent:{timeToFirstByte:e.responseStart,domInteractive:e.domInteractive,domComplete:e.domComplete}}}function Ot(t){if(t.captureTimings){var e=t._end;if(t.type===G){if(t.marks&&t.marks.custom){var n=t.marks.custom;Object.keys(n).forEach((function(e){n[e]+=t._start}))}t._start=0;var r=y.timing;(function(t,e,n,r){for(var i=[],a=0;a399&&t<600)}function At(){return(At=Object.assign||function(t){for(var e=1;ea&&"function"==typeof e?e.apply(i,arguments):t.apply(i,arguments)}}(this.queue.add.bind(this.queue),(function(){return t._loggingService.warn("Dropped events due to throttling!")}),{limit:r,interval:6e4}),this._configService.observeEvent("queue:flush",(function(){t.queue.flush()}))},e._postJson=function(t,e){var n=this,r={payload:e,headers:{"Content-Type":"application/x-ndjson"},beforeSend:this._configService.get("apmRequest")};return qt(r).catch((function(t){return r})).then((function(e){return n._makeHttpRequest("POST",t,e)})).then((function(t){return t.responseText}))},e._constructError=function(t){var e=t.url,n=t.status;t.responseText;if(void 0===n)return t;var r=e+" HTTP status: "+n;return new Error(r)},e._makeHttpRequest=function(t,e,n){var r=void 0===n?{}:n,i=r.timeout,a=void 0===i?1e4:i,o=r.payload,s=r.headers,c=r.beforeSend,u=this._configService.get("sendCredentials");return!c&&Pt(t,o)?function(t,e,n){var r,i=n.keepalive,a=void 0!==i&&i,o=n.timeout,s=void 0===o?1e4:o,c=n.payload,u=n.headers,f=n.sendCredentials,d={};if("function"==typeof AbortController){var l=new AbortController;d.signal=l.signal,setTimeout((function(){return l.abort()}),s)}return window.fetch(e,At({body:c,headers:u,method:t,keepalive:a,credentials:f?"include":"omit"},d)).then((function(t){return(r=t).text()})).then((function(t){var n={url:e,status:r.status,responseText:t};if(!Ft(r.status))throw n;return n}))}(t,e,{keepalive:!0,timeout:a,payload:o,headers:s,sendCredentials:u}).catch((function(n){if(n instanceof TypeError)return Jt(t,e,{timeout:a,payload:o,headers:s,beforeSend:c,sendCredentials:u});throw n})):Jt(t,e,{timeout:a,payload:o,headers:s,beforeSend:c,sendCredentials:u})},e.fetchConfig=function(t,e){var n=this,r=this.getEndpoints().configEndpoint;if(!t)return h.reject("serviceName is required for fetching central config.");r+="?service.name="+t,e&&(r+="&service.environment="+e);var i=this._configService.getLocalConfig();i&&(r+="&ifnonematch="+i.etag);var a=this._configService.get("apmRequest");return this._makeHttpRequest("GET",r,{timeout:5e3,beforeSend:a}).then((function(t){var e=t.status,r=t.responseText;if(304===e)return i;var a=JSON.parse(r),o=t.getResponseHeader("etag");return o&&(a.etag=o.replace(/["]/g,""),n._configService.setLocalConfig(a,!0)),a})).catch((function(t){var e=n._constructError(t);return h.reject(e)}))},e.createMetaData=function(){var t=this._configService,e={service:{name:t.get("serviceName"),version:t.get("serviceVersion"),agent:{name:"rum-js",version:t.version},language:{name:"javascript"},environment:t.get("environment")},labels:t.get("context.tags")};return ft(nt,e)},e.addError=function(t){var e;this.throttleEvents(((e={}).errors=t,e))},e.addTransaction=function(t){var e;this.throttleEvents(((e={}).transactions=t,e))},e.ndjsonErrors=function(t,e){var n=e?"e":"error";return t.map((function(t){var r;return mt.stringify(((r={})[n]=e?function(t){var e,n=t.exception,r={id:t.id,cl:t.culprit,ex:{mg:n.message,st:(e=n.stacktrace,e.map((function(t){return{ap:t.abs_path,f:t.filename,fn:t.function,li:t.lineno,co:t.colno}}))),t:t.type},c:It(t.context)},i=t.transaction;return i&&(r.tid=t.trace_id,r.pid=t.parent_id,r.xid=t.transaction_id,r.x={t:i.type,sm:i.sampled}),r}(t):t,r))}))},e.ndjsonMetricsets=function(t){return t.map((function(t){return mt.stringify({metricset:t})})).join("")},e.ndjsonTransactions=function(t,e){var n=this,r=e?"x":"transaction";return t.map((function(t){var i,a="",o="";return e||(t.spans&&(a=t.spans.map((function(t){return mt.stringify({span:t})})).join(""),delete t.spans),t.breakdown&&(o=n.ndjsonMetricsets(t.breakdown),delete t.breakdown)),mt.stringify(((i={})[r]=e?function(t){var e,n=t.spans.map((function(e){var n={id:e.id,n:e.name,t:e.type,s:e.start,d:e.duration,c:It(e.context),o:e.outcome,sr:e.sample_rate};return e.parent_id!==t.id&&(n.pid=e.parent_id),!0===e.sync&&(n.sy=!0),e.subtype&&(n.su=e.subtype),e.action&&(n.ac=e.action),n})),r={id:t.id,tid:t.trace_id,n:t.name,t:t.type,d:t.duration,c:It(t.context),k:jt(t.marks),me:(e=t.breakdown,e.map((function(t){var e=t.span,n=t.samples,r=null!=e;return r?{y:{t:e.type},sa:{ysc:{v:n["span.self_time.count"].value},yss:{v:n["span.self_time.sum.us"].value}}}:{sa:{xdc:{v:n["transaction.duration.count"].value},xds:{v:n["transaction.duration.sum.us"].value},xbc:{v:n["transaction.breakdown.count"].value}}}}))),y:n,yc:{sd:n.length},sm:t.sampled,sr:t.sample_rate,o:t.outcome};if(t.experience){var i=t.experience,a=i.cls,o=i.fid,s=i.tbt,c=i.longtask;r.exp={cls:a,fid:o,tbt:s,lt:c}}if(t.session){var u=t.session,f=u.id,d=u.sequence;r.ses={id:f,seq:d}}return r}(t):t,i))+a+o}))},e.sendEvents=function(t){var e,n;if(0!==t.length){for(var r=[],i=[],a=0;a2,d=[],l=this.createMetaData(),p=f?"m":"metadata";d.push(mt.stringify(((n={})[p]=f?function(t){var e=t.service,n=t.labels,r=e.agent,i=e.language;return{se:{n:e.name,ve:e.version,a:{n:r.name,ve:r.version},la:{n:i.name},en:e.environment},l:n}}(l):l,n)));var v=(d=d.concat(this.ndjsonErrors(u.errors,f),this.ndjsonTransactions(u.transactions,f))).join(""),h=this.getEndpoints().intakeEndpoint;return this._postJson(h,v)}this._loggingService.warn("Dropped payload due to filtering!")}}},e.getEndpoints=function(){var t=this._configService.get("serverUrl"),e=this._configService.get("apiVersion");return{intakeEndpoint:t+(this._configService.get("serverUrlPrefix")||"/intake/v"+e+"/rum/events"),configEndpoint:t+"/config/v1/rum/agents"}},t}(),Gt=function(){function t(){this.observers={}}var e=t.prototype;return e.observe=function(t,e){var n=this;if("function"==typeof e)return this.observers[t]||(this.observers[t]=[]),this.observers[t].push(e),function(){var r=n.observers[t].indexOf(e);r>-1&&n.observers[t].splice(r,1)}},e.sendOnly=function(t,e){var n=this.observers[t];n&&n.forEach((function(t){try{t.apply(void 0,e)}catch(t){console.log(t,t.stack)}}))},e.send=function(t,e){this.sendOnly(t+":before",e),this.sendOnly(t,e),this.sendOnly(t+":after",e)},t}();function Zt(){return(Zt=Object.assign||function(t){for(var e=1;e0?t.charAt(0).toUpperCase()+t.substring(1):t})).join("");e[o]=a.value||a.nodeValue}}return e}(N());this.setConfig(t)},e.setVersion=function(t){this.version=t},e.addFilter=function(t){if("function"!=typeof t)throw new Error("Argument to must be function");this.filters.push(t)},e.applyFilters=function(t){for(var e=0;e0&&(n=1e-4),t.transactionSampleRate=Math.round(1e4*n)/1e4),j(this.config,t),this.events.send("config:change",[this.config])},e.validate=function(t){void 0===t&&(t={});var e=["serviceName","serverUrl"],n=Object.keys(this.config),r={missing:[],invalid:[],unknown:[]};Object.keys(t).forEach((function(i){-1===e.indexOf(i)||t[i]||r.missing.push(i),-1===n.indexOf(i)&&r.unknown.push(i)})),t.serviceName&&!/^[a-zA-Z0-9 _-]+$/.test(t.serviceName)&&r.invalid.push({key:"serviceName",value:t.serviceName,allowed:"a-z, A-Z, 0-9, _, -, "});var i=t.transactionSampleRate;return void 0!==i&&("number"!=typeof i||isNaN(i)||i<0||i>1)&&r.invalid.push({key:"transactionSampleRate",value:i,allowed:"Number between 0 and 1"}),r},e.getLocalConfig=function(){var t=sessionStorage;this.config.session&&(t=localStorage);var e=t.getItem("elastic_apm_config");if(e)return JSON.parse(e)},e.setLocalConfig=function(t,e){if(t){if(e)t=Zt({},this.getLocalConfig(),t);var n=sessionStorage;this.config.session&&(n=localStorage),n.setItem("elastic_apm_config",JSON.stringify(t))}},e.dispatchEvent=function(t,e){this.events.send(t,e)},e.observeEvent=function(t,e){return this.events.observe(t,e)},t}(),Wt=function(){function t(t){void 0===t&&(t={}),this.levels=["trace","debug","info","warn","error"],this.level=t.level||"warn",this.prefix=t.prefix||"",this.resetLogMethods()}var e=t.prototype;return e.shouldLog=function(t){return this.levels.indexOf(t)>=this.levels.indexOf(this.level)},e.setLevel=function(t){t!==this.level&&(this.level=t,this.resetLogMethods())},e.resetLogMethods=function(){var t=this;this.levels.forEach((function(e){t[e]=t.shouldLog(e)?function(){var t=e;"trace"!==e&&"debug"!==e||(t="info");var n=arguments;if(n[0]=this.prefix+n[0],console){var r=console[t]||console.log;"function"==typeof r&&r.apply(console,n)}}:q}))},t}(),Kt=((Yt={}).ConfigService=function(){return new Qt},Yt.LoggingService=function(){return new Wt({prefix:"[Elastic APM] "})},Yt.ApmServer=function(t){var e=t.getService(["ConfigService","LoggingService"]),n=e[0],r=e[1];return new Xt(n,r)},Yt),te=function(){function t(){this.instances={},this.initialized=!1}var e=t.prototype;return e.init=function(){if(!this.initialized){this.initialized=!0;var t=this.getService("ConfigService");t.init();var e=this.getService(["LoggingService","ApmServer"]),n=e[0],r=e[1];t.events.observe("config:change",(function(){var e=t.get("logLevel");n.setLevel(e)})),r.init()}},e.getService=function(t){var e=this;return"string"==typeof t?(this.instances[t]||"function"==typeof Kt[t]&&(this.instances[t]=Kt[t](this)),this.instances[t]):Array.isArray(t)?t.map((function(t){return e.getService(t)})):void 0},t}();function ee(t){var e=XMLHttpRequest.prototype;if(e&&e.addEventListener)var n=zt(e,"open",(function(){return function(t,e){return t[Dt]||(t[$t]=e[0],t[Vt]=e[1],t[Bt]=!1===e[2]),n.apply(t,e)}})),r=zt(e,"send",(function(){return function(e,n){if(e[Dt])return r.apply(e,n);var a={source:"xmlhttprequest",state:"",type:"macroTask",data:{target:e,method:e[$t],sync:e[Bt],url:e[Vt],status:""}};try{return function(e){if("schedule"!==e.state){e.state="schedule",t("schedule",e);var n=e.data.target;r("readystatechange"),r("load"),r("timeout"),r("error"),r("abort")}function r(t){n.addEventListener(t,(function(t){var r=t.type;"readystatechange"===r?4===n.readyState&&0!==n.status&&i(e,"success"):i(e,"load"===r?"success":r)}))}}(a),r.apply(e,n)}catch(t){throw i(a,"error"),t}}}));function i(e,n){e.state!==J&&(e.state=J,e.data.status=n,t(J,e))}}var ne=new Gt,re=!1;function ie(){return re||(re=!0,ee((function(t,e){ne.send("xmlhttprequest",[t,e])})),function(t){if(Mt()){var e=window.fetch;window.fetch=function(t,o){var s,c,u=this,f=arguments;if("string"==typeof t)s=new Request(t,o),c=t;else{if(!t)return e.apply(u,f);c=(s=t).url}var d={source:"fetch",state:"",type:"macroTask",data:{target:s,method:s.method,url:c,aborted:!1}};return new h((function(t,o){var c;Ht.fetchInProgress=!0,n(d);try{c=e.apply(u,[s])}catch(t){return o(t),d.data.error=t,r(d),void(Ht.fetchInProgress=!1)}c.then((function(e){var n=e.clone?e.clone():{};t(e),U((function(){d.data.response=e;var t=n.body;t?a(t,d):r(d)}))}),(function(t){o(t),U((function(){i(d,t)}))})),Ht.fetchInProgress=!1}))}}function n(e){e.state="schedule",t("schedule",e)}function r(e){e.state=J,t(J,e)}function i(t,e){t.data.aborted=function(t){return t&&"AbortError"===t.name}(e),t.data.error=e,r(t)}function a(t,e){var n=t.getReader();!function t(){n.read().then((function(n){n.done?r(e):t()}),(function(t){i(e,t)}))}()}}((function(t,e){ne.send("fetch",[t,e])})),function(t){if(window.history){var e=history.pushState;"function"==typeof e&&(history.pushState=function(n,r,i){var a={source:"history",data:{state:n,title:r,url:i}};t(J,a),e.apply(this,arguments)})}}((function(t,e){ne.send("history",[t,e])}))),ne}var ae=function(){function t(t,e,n,r){this._apmServer=t,this._configService=e,this._logginService=n,this._transactionService=r}var e=t.prototype;return e.init=function(t){var e=this;void 0===t&&(t={}),this._configService.events.observe("transaction:end:after",(function(t){var n=e.createTransactionPayload(t);n&&(e._apmServer.addTransaction(n),e._configService.dispatchEvent("queue:add_transaction"))})),t.history&&ne.observe("history",this.getHistorySub()),t.xmlhttprequest&&ne.observe("xmlhttprequest",this.getXHRSub()),t.fetch&&ne.observe("fetch",this.getFetchSub())},e.getHistorySub=function(){var t=this._transactionService;return function(e,n){"history"===n.source&&e===J&&t.startTransaction(n.data.title,"route-change",{managed:!0,canReuse:!0})}},e.getXHRSub=function(){var t=this;return function(e,n){"xmlhttprequest"!==n.source||Ht.fetchInProgress||t.processAPICalls(e,n)}},e.getFetchSub=function(){var t=this;return function(e,n){"fetch"===n.source&&t.processAPICalls(e,n)}},e.processAPICalls=function(t,e){var n=this._configService,r=this._transactionService;if(e.data&&e.data.url){var i=this._apmServer.getEndpoints();if(Object.keys(i).some((function(t){return-1!==e.data.url.indexOf(i[t])})))return}if("schedule"===t&&e.data){var a=e.data,o=new $(a.url),s=a.method+" "+(o.relative?o.path:C(o.href));r.getCurrentTransaction()||r.startTransaction(s,"http-request",{managed:!0});var c=r.startSpan(s,"external.http",{blocking:!0});if(!c)return;var u=n.get("distributedTracing"),f=n.get("distributedTracingOrigins"),d=new $(window.location.href),l=E(o.origin,d.origin)||E(o.origin,f),p=a.target;if(u&&l&&p)this.injectDtHeader(c,p),n.get("propagateTracestate")&&this.injectTSHeader(c,p);else 0;a.sync&&(c.sync=a.sync),a.span=c}else if(t===J){var v=e.data;if(v&&v.span){var h,g,m=v.span,y=v.response,S=v.target;h=y?y.status:S.status,g="abort"==v.status||v.aborted?"unknown":h>=400||0==h?"failure":"success",m.outcome=g;var _=r.getCurrentTransaction();_&&"http-request"===_.type&&(_.outcome=g),r.endSpan(m,v)}}},e.injectDtHeader=function(t,e){var n,r=this._configService.get("distributedTracingHeaderName"),i=function(t){if(t&&t.traceId&&t.id&&t.parentId){var e=t.sampled?"01":"00",n=t.sampled?t.id:t.parentId;return"00-"+t.traceId+"-"+n+"-"+e}}(t);/^[\da-f]{2}-[\da-f]{32}-[\da-f]{16}-[\da-f]{2}$/.test(n=i)&&"00000000000000000000000000000000"!==n.slice(3,35)&&"0000000000000000"!==n.slice(36,52)&&i&&r&&T(e,r,i)},e.injectTSHeader=function(t,e){var n=function(t){var e=t.sampleRate;if(!("number"!=typeof e||String(e).length>256)){return"es=s:"+e}}(t);n&&T(e,"tracestate",n)},e.extractDtHeader=function(t){var e=this._configService.get("distributedTracingHeaderName");if(t)return function(t){var e=/^([\da-f]{2})-([\da-f]{32})-([\da-f]{16})-([\da-f]{2})$/.exec(t);if(e){var n="00"!==e[4];return{traceId:e[2],id:e[3],sampled:n}}}(t[e])},e.filterTransaction=function(t){var e=t.duration();if(!e)return!1;if(t.isManaged()){if(e>6e4)return!1;if(t.sampled&&0===t.spans.length)return!1}return!0},e.createTransactionDataModel=function(t){var e=t._start,n=t.spans.map((function(n){var r={id:n.id,transaction_id:t.id,parent_id:n.parentId||t.id,trace_id:t.traceId,name:n.name,type:n.type,subtype:n.subtype,action:n.action,sync:n.sync,start:parseInt(n._start-e),duration:n.duration(),context:n.context,outcome:n.outcome,sample_rate:n.sampleRate};return ft(at,r)})),r={id:t.id,trace_id:t.traceId,session:t.session,name:t.name,type:t.type,duration:t.duration(),spans:n,context:t.context,marks:t.marks,breakdown:t.breakdownTimings,span_count:{started:n.length},sampled:t.sampled,sample_rate:t.sampleRate,experience:t.experience,outcome:t.outcome};return ft(ot,r)},e.createTransactionPayload=function(t){var e=function(t){if(t.sampled){var e=t.spans.filter((function(e){return e.duration()>0&&e._start>=t._start&&e._end<=t._end}));if(t.isManaged()){var n=function(t,e,n){t.sort((function(t,e){return t._start-e._start}));var r=[],i=1;return t.forEach((function(a,o){if(0===r.length)r.push(a);else{var s=r[r.length-1],c=s.type===a.type&&s.subtype===a.subtype&&s.action===a.action&&s.name===a.name&&a.duration()/e1&&(!c||u)&&(s.name=i+"x "+s.name,i=1),c||r.push(a)}})),r}(e,t.duration(),.05);t.spans=n}else t.spans=e}else t.resetFields();return t}(t);if(this.filterTransaction(e))return this.createTransactionDataModel(t)},t}(),oe=[["domainLookupStart","domainLookupEnd","DNS"],["connectStart","connectEnd","TCP"],["requestStart","responseStart","Request"],["responseStart","responseEnd","Response"],["domLoading","domComplete","Processing"],["loadEventStart","loadEventEnd","Load"]];function se(t){return{value:t}}function ce(t,e){var n=e.details,r=e.count,i=void 0===r?1:r,a=e.duration;return{transaction:t,span:n,samples:{"span.self_time.count":se(i),"span.self_time.sum.us":se(a)}}}function ue(t,e){return(ue=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}var fe=function(t){var e,n;function r(e,n,r){var i;return(i=t.call(this,e,n,r)||this).traceId=w(),i.marks=void 0,i.spans=[],i._activeSpans={},i._activeTasks=new Set,i.blocked=!1,i.captureTimings=!1,i.breakdownTimings=[],i.sampleRate=i.options.transactionSampleRate,i.sampled=Math.random()<=i.sampleRate,i}n=t,(e=r).prototype=Object.create(n.prototype),e.prototype.constructor=e,ue(e,n);var i=r.prototype;return i.addMarks=function(t){this.marks=j(this.marks||{},t)},i.mark=function(t){var e=F(t),n=P()-this._start,r={};r[e]=n,this.addMarks({custom:r})},i.canReuse=function(){var t=this.options.reuseThreshold||5e3;return!!this.options.canReuse&&!this.ended&&P()-this._starts?(c+=o-s,s=a):a>s&&(s=a);return s=r})),a={spans:function(t,e){for(var n=[],r=0;r0){var d=c[0],l=d.name,p=d.containerType,v=d.containerName,h=d.containerId,g={attribution:l,type:p};v&&(g.name=v),h&&(g.id=h),f.addContext({custom:g})}f.end(u),n.push(f)}return n}(i,de.longtask),marks:{}};if(!n)return a;var o=t.getEntriesByType("largest-contentful-paint"),s=o[o.length-1];if(s){var c=parseInt(s.startTime);de.lcp=c,a.marks.largestContentfulPaint=c}var u=y.timing,f=u.fetchStart-u.navigationStart,d=t.getEntriesByName("first-contentful-paint")[0];if(d){var l=parseInt(f>=0?d.startTime-f:d.startTime);de.fcp=l,a.marks.firstContentfulPaint=l}var p=function(t){var e=t[0];if(e){var n=e.startTime,r=e.processingStart,i=new _t("First Input Delay","first-input",{startTime:n});return i.end(r),i}}(t.getEntriesByType("first-input"));return p&&(de.fid=p.duration(),a.spans.push(p)),function(t){t.forEach((function(t){var e=t.name,n=t.startTime,r=t.duration;if(!(n0&&(de.tbt.duration+=i)}}))}(i),function(t){t.forEach((function(t){!t.hadRecentInput&&t.value&&((t.startTime-de.cls.firstEntryTime>5e3||t.startTime-de.cls.prevEntryTime>1e3)&&(de.cls.firstEntryTime=t.startTime,de.cls.currentSessionScore=0),de.cls.prevEntryTime=t.startTime,de.cls.currentSessionScore+=t.value,de.cls.score=Math.max(de.cls.score,de.cls.currentSessionScore))}))}(t.getEntriesByType("layout-shift")),a}var pe=function(){function t(t){this.po={observe:q,disconnect:q},window.PerformanceObserver&&(this.po=new PerformanceObserver(t))}var e=t.prototype;return e.start=function(t){try{this.po.observe({type:t,buffered:!0})}catch(t){}},e.stop=function(){this.po.disconnect()},t}(),ve=function(){function t(t,e){var n=this;this._config=e,this._logger=t,this.currentTransaction=void 0,this.respIntervalId=void 0,this.recorder=new pe((function(t){var e=n.getCurrentTransaction();if(e&&e.captureTimings){var r,i=e.type===G,a=le(t,{isHardNavigation:i,trStart:i?0:e._start}),o=a.spans,s=a.marks;(r=e.spans).push.apply(r,o),e.addMarks({agent:s})}}))}var e=t.prototype;return e.createCurrentTransaction=function(t,e,n){var r=new fe(t,e,n);return this.currentTransaction=r,r},e.getCurrentTransaction=function(){if(this.currentTransaction&&!this.currentTransaction.ended)return this.currentTransaction},e.createOptions=function(t){var e=this._config.config,n=I({transactionSampleRate:e.transactionSampleRate},t);return n.managed&&(n=I({pageLoadTraceId:e.pageLoadTraceId,pageLoadSampled:e.pageLoadSampled,pageLoadSpanId:e.pageLoadSpanId,pageLoadTransactionName:e.pageLoadTransactionName},n)),n},e.startManagedTransaction=function(t,e,n){var r=this.getCurrentTransaction(),i=!1;if(r)if(r.canReuse()&&n.canReuse){var a=r.type,o=Z.indexOf(r.type),s=Z.indexOf(e);o>=0&&s=t._start||e.shouldIgnoreTransaction(r)||"temporary"===i)){if(i===G){var a=e._config.get("pageLoadTransactionName");if("Unknown"===r&&a&&(t.name=a),t.captureTimings){var o=de.cls,s=de.fid,c=de.tbt,u=de.longtask;c.duration>0&&t.spans.push((d=(f=c).start,l=f.duration,(p=new _t("Total Blocking Time","longtask",{startTime:d})).end(d+l),p)),t.experience={},D("longtask")&&(t.experience.tbt=c.duration),D("layout-shift")&&(t.experience.cls=o.score),s>0&&(t.experience.fid=s),u.count>0&&(t.experience.longtask={count:u.count,sum:u.duration,max:u.max})}e.setSession(t)}var f,d,l,p;"Unknown"===t.name&&(t.name=function(t,e){void 0===e&&(e=2);for(var n=new $(t),r=n.query,i=n.path.substring(1).split("/"),a=/\W|_/g,o=/[0-9]/g,s=/[a-z]/g,c=/[A-Z]/g,u=[],f=!1,d=0;de-1){l&&u.push("*");break}if((l.match(a)||[]).length>=2)u.push(":id"),f=!0;else{var p=(l.match(o)||[]).length;if(p>3||l.length>3&&p/l.length>=.3)u.push(":id"),f=!0;else{var v=(l.match(c)||[]).length,h=(l.match(s)||[]).length/l.length,g=v/l.length;l.length>5&&(g>.3&&g<.6||h>.3&&h<.6)?(u.push(":id"),f=!0):l&&u.push(l)}}}return"/"+(u.length>=2?u.join("/"):u.join(""))+(r?"?{query}":"")}(n)),Ot(t),e.adjustTransactionTime(t),e._config.get("breakdownMetrics")&&t.captureBreakdown();var v=e._config.get("context");et(t,v),e._config.events.send("transaction:end",[t])}}),(function(t){0}))},e.setSession=function(t){var e=this._config.get("session");if(e){"boolean"==typeof e||e.timestamp&&Date.now()-e.timestamp>18e5?t.session={id:w(16),sequence:1}:t.session={id:e.id,sequence:e.sequence?e.sequence+1:1};var n={session:{id:t.session.id,sequence:t.session.sequence,timestamp:Date.now()}};this._config.setConfig(n),this._config.setLocalConfig(n,!0)}},e.adjustTransactionTime=function(t){var e=t.spans,n=function(t){for(var e=t[0],n=1;nr._start&&(e=r)}return e}(e);n&&n._startt._end&&(t._end=r);this.truncateSpans(e,t._end)},e.truncateSpans=function(t,e){for(var n=0;ne&&(r._end=e,r.type+=".truncated"),r._start>e&&(r._start=e)}},e.shouldIgnoreTransaction=function(t){var e=this._config.get("ignoreTransactions");if(e&&e.length)for(var n=0;n0){var c="Unknown config options are specified for RUM agent: "+s.join(", ");r.warn(c)}if(0===a.length&&0===o.length)n.setConfig(t);else{var u="RUM agent isn't correctly configured. ";a.length>0&&(u+=a.join(", ")+" is missing",o.length>0&&(u+=", ")),o.forEach((function(t,e){var n=t.key,r=t.value,i=t.allowed;u+=n+' "'+r+'" contains invalid characters! (allowed: '+i+")"+(e!==o.length-1?", ":"")})),r.error(u),n.setConfig({active:!1})}},e.setUserContext=function(t){this.serviceFactory.getService("ConfigService").setUserContext(t)},e.setCustomContext=function(t){this.serviceFactory.getService("ConfigService").setCustomContext(t)},e.addLabels=function(t){this.serviceFactory.getService("ConfigService").addLabels(t)},e.setInitialPageLoadName=function(t){this.serviceFactory.getService("ConfigService").setConfig({pageLoadTransactionName:t})},e.startTransaction=function(t,e,n){if(this.isEnabled())return this.serviceFactory.getService("TransactionService").startTransaction(t,e,n)},e.startSpan=function(t,e,n){if(this.isEnabled())return this.serviceFactory.getService("TransactionService").startSpan(t,e,n)},e.getCurrentTransaction=function(){if(this.isEnabled())return this.serviceFactory.getService("TransactionService").getCurrentTransaction()},e.captureError=function(t){if(this.isEnabled())return this.serviceFactory.getService("ErrorLogging").logError(t)},e.addFilter=function(t){this.serviceFactory.getService("ConfigService").addFilter(t)},t}();var be=function(){if(m&&window.elasticApm)return window.elasticApm;var t=me(),e=he(),n=new _e(e,!t);return m&&(window.elasticApm=n),n}();be.init.bind(be)}()}(); +!function(){var t={816:function(t,e,n){var r,i,a;!function(o,s){"use strict";i=[n(170)],void 0===(a="function"==typeof(r=function(t){var e=/(^|@)\S+\:\d+/,n=/^\s*at .*(\S+\:\d+|\(native\))/m,r=/^(eval@)?(\[native code\])?$/;function i(t,e,n){if("function"==typeof Array.prototype.map)return t.map(e,n);for(var r=new Array(t.length),i=0;i-1&&(e=e.replace(/eval code/g,"eval").replace(/(\(eval at [^\()]*)|(\)\,.*$)/g,""));var n=e.replace(/^\s+/,"").replace(/\(eval code/g,"(").split(/\s+/).slice(1),r=this.extractLocation(n.pop()),i=n.join(" ")||void 0,a=function(t,e){if("function"==typeof Array.prototype.indexOf)return t.indexOf(e);for(var n=0;n"],r[0])>-1?void 0:r[0];return new t(i,void 0,a,r[1],r[2],e)}),this)},parseFFOrSafari:function(e){return i(a(e.stack.split("\n"),(function(t){return!t.match(r)}),this),(function(e){if(e.indexOf(" > eval")>-1&&(e=e.replace(/ line (\d+)(?: > eval line \d+)* > eval\:\d+\:\d+/g,":$1")),-1===e.indexOf("@")&&-1===e.indexOf(":"))return new t(e);var n=e.split("@"),r=this.extractLocation(n.pop()),i=n.join("@")||void 0;return new t(i,void 0,r[0],r[1],r[2],e)}),this)},parseOpera:function(t){return!t.stacktrace||t.message.indexOf("\n")>-1&&t.message.split("\n").length>t.stacktrace.split("\n").length?this.parseOpera9(t):t.stack?this.parseOpera11(t):this.parseOpera10(t)},parseOpera9:function(e){for(var n=/Line (\d+).*script (?:in )?(\S+)/i,r=e.message.split("\n"),i=[],a=2,o=r.length;a/,"$2").replace(/\([^\)]*\)/g,"")||void 0;a.match(/\(([^\)]*)\)/)&&(n=a.replace(/^[^\(]+\(([^\)]*)\)$/,"$1"));var s=void 0===n||"[arguments not available]"===n?void 0:n.split(",");return new t(o,s,i[0],i[1],i[2],e)}),this)}}})?r.apply(e,i):r)||(t.exports=a)}()},170:function(t,e){var n,r,i;!function(a,o){"use strict";r=[],void 0===(i="function"==typeof(n=function(){function t(t){return!isNaN(parseFloat(t))&&isFinite(t)}function e(t,e,n,r,i,a){void 0!==t&&this.setFunctionName(t),void 0!==e&&this.setArgs(e),void 0!==n&&this.setFileName(n),void 0!==r&&this.setLineNumber(r),void 0!==i&&this.setColumnNumber(i),void 0!==a&&this.setSource(a)}return e.prototype={getFunctionName:function(){return this.functionName},setFunctionName:function(t){this.functionName=String(t)},getArgs:function(){return this.args},setArgs:function(t){if("[object Array]"!==Object.prototype.toString.call(t))throw new TypeError("Args must be an Array");this.args=t},getFileName:function(){return this.fileName},setFileName:function(t){this.fileName=String(t)},getLineNumber:function(){return this.lineNumber},setLineNumber:function(e){if(!t(e))throw new TypeError("Line Number must be a Number");this.lineNumber=Number(e)},getColumnNumber:function(){return this.columnNumber},setColumnNumber:function(e){if(!t(e))throw new TypeError("Column Number must be a Number");this.columnNumber=Number(e)},getSource:function(){return this.source},setSource:function(t){this.source=String(t)},toString:function(){return(this.getFunctionName()||"{anonymous}")+("("+(this.getArgs()||[]).join(",")+")")+(this.getFileName()?"@"+this.getFileName():"")+(t(this.getLineNumber())?":"+this.getLineNumber():"")+(t(this.getColumnNumber())?":"+this.getColumnNumber():"")}},e})?n.apply(e,r):n)||(t.exports=i)}()}},e={};function n(r){var i=e[r];if(void 0!==i)return i.exports;var a=e[r]={exports:{}};return t[r].call(a.exports,a,a.exports,n),a.exports}n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,{a:e}),e},n.d=function(t,e){for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},function(){"use strict";var t=function(t){var e=this.constructor;return this.then((function(n){return e.resolve(t()).then((function(){return n}))}),(function(n){return e.resolve(t()).then((function(){return e.reject(n)}))}))},e=setTimeout;function r(t){return Boolean(t&&void 0!==t.length)}function i(){}function a(t){if(!(this instanceof a))throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],d(t,this)}function o(t,e){for(;3===t._state;)t=t._value;0!==t._state?(t._handled=!0,a._immediateFn((function(){var n=1===t._state?e.onFulfilled:e.onRejected;if(null!==n){var r;try{r=n(t._value)}catch(t){return void c(e.promise,t)}s(e.promise,r)}else(1===t._state?s:c)(e.promise,t._value)}))):t._deferreds.push(e)}function s(t,e){try{if(e===t)throw new TypeError("A promise cannot be resolved with itself.");if(e&&("object"==typeof e||"function"==typeof e)){var n=e.then;if(e instanceof a)return t._state=3,t._value=e,void u(t);if("function"==typeof n)return void d((r=n,i=e,function(){r.apply(i,arguments)}),t)}t._state=1,t._value=e,u(t)}catch(e){c(t,e)}var r,i}function c(t,e){t._state=2,t._value=e,u(t)}function u(t){2===t._state&&0===t._deferreds.length&&a._immediateFn((function(){t._handled||a._unhandledRejectionFn(t._value)}));for(var e=0,n=t._deferreds.length;e0)return r}}()}}function O(){return C(Object.create(null),h.call(arguments),!1)}function N(){return C(Object.create(null),h.call(arguments),!0)}function j(t){return void 0===t}function R(){}function q(t){return t.replace(/[.*"]/g,"_")}function F(t,e){for(var n=null,r=0;r=0?t:P()}function M(t,e){return j(e)||j(t)?null:parseInt(e-t)}function H(t){v.resolve().then(t)}function U(){return"function"==typeof m.getEntriesByType}function z(t){return"undefined"!=typeof PerformanceObserver&&PerformanceObserver.supportedEntryTypes&&PerformanceObserver.supportedEntryTypes.indexOf(t)>=0}function D(){return"interactionCount"in performance}function B(t){return t.redirectStart>0}var V={fetchInProgress:!1};function $(t){return"__apm_symbol__"+t}function J(t,e,n){for(var r=t;r&&!r.hasOwnProperty(e);)r=Object.getPrototypeOf(r);!r&&t[e]&&(r=t);var i,a,o,s,c=$(e);if(r&&!(i=r[c])){i=r[c]=r[e];var u=r&&Object.getOwnPropertyDescriptor(r,e);if(!(s=u)||!1!==s.writable&&("function"!=typeof s.get||void 0!==s.set)){var f=n(i,c,e);r[e]=function(){return f(this,arguments)},a=r[e],o=i,a[$("OriginalDelegate")]=o}}return i}var X=$("xhrIgnore"),G=$("xhrSync"),Z=$("xhrURL"),Y=$("xhrMethod"),Q="invoke",W=["link","css","script","img","xmlhttprequest","fetch","beacon","iframe"],K="page-load",tt=[K,"route-change","user-interaction","http-request","custom","temporary"];function et(t){var e=XMLHttpRequest.prototype;if(e&&e.addEventListener)var n=J(e,"open",(function(){return function(t,e){return t[X]||(t[Y]=e[0],t[Z]=e[1],t[G]=!1===e[2]),n.apply(t,e)}})),r=J(e,"send",(function(){return function(e,n){if(e[X])return r.apply(e,n);var a={source:"xmlhttprequest",state:"",type:"macroTask",data:{target:e,method:e[Y],sync:e[G],url:e[Z],status:""}};try{return function(e){if("schedule"!==e.state){e.state="schedule",t("schedule",e);var n=e.data.target;r("readystatechange"),r("load"),r("timeout"),r("error"),r("abort")}function r(t){n.addEventListener(t,(function(t){var r=t.type;"readystatechange"===r?4===n.readyState&&0!==n.status&&i(e,"success"):i(e,"load"===r?"success":r)}))}}(a),r.apply(e,n)}catch(t){throw i(a,"error"),t}}}));function i(e,n){e.state!==Q&&(e.state=Q,e.data.status=n,t(Q,e))}}function nt(t){return!(0===t||t>399&&t<600)}function rt(){return(rt=Object.assign||function(t){for(var e=1;e-1&&n.observers[t].splice(r,1)}},e.sendOnly=function(t,e){var n=this.observers[t];n&&n.forEach((function(t){try{t.apply(void 0,e)}catch(t){console.log(t,t.stack)}}))},e.send=function(t,e){this.sendOnly(t+":before",e),this.sendOnly(t,e),this.sendOnly(t+":after",e)},t}(),st=new ot,ct=!1;function ut(){return ct||(ct=!0,et((function(t,e){st.send("xmlhttprequest",[t,e])})),function(t){if(at()){var e=window.fetch;window.fetch=function(t,o){var s,c,u=this,f=arguments,d=t instanceof URL;if("string"==typeof t||d)s=new Request(t,o),c=d?s.url:t;else{if(!t)return e.apply(u,f);c=(s=t).url}var l={source:"fetch",state:"",type:"macroTask",data:{target:s,method:s.method,url:c,aborted:!1}};return new v((function(t,o){var c;V.fetchInProgress=!0,n(l);try{c=e.apply(u,[s])}catch(t){return o(t),l.data.error=t,r(l),void(V.fetchInProgress=!1)}c.then((function(e){var n=e.clone?e.clone():{};t(e),H((function(){l.data.response=e;var t=n.body;t?a(t,l):r(l)}))}),(function(t){o(t),H((function(){i(l,t)}))})),V.fetchInProgress=!1}))}}function n(e){e.state="schedule",t("schedule",e)}function r(e){e.state=Q,t(Q,e)}function i(t,e){t.data.aborted=function(t){return t&&"AbortError"===t.name}(e),t.data.error=e,r(t)}function a(t,e){var n=t.getReader();!function t(){n.read().then((function(n){n.done?r(e):t()}),(function(t){i(e,t)}))}()}}((function(t,e){st.send("fetch",[t,e])})),function(t){if(window.history){var e=history.pushState;"function"==typeof e&&(history.pushState=function(n,r,i){var a={source:"history",data:{state:n,title:r,url:i}};t(Q,a),e.apply(this,arguments)})}}((function(t,e){st.send("history",[t,e])}))),st}var ft={bootstrapTime:null,lastHiddenStart:Number.MIN_SAFE_INTEGER},dt=!1;function lt(){return E()?(ut(),ft.bootstrapTime=P(),dt=!0):g&&console.log("[Elastic APM] platform is not supported!"),dt}function pt(t,e){var n=e.error,r=e.filename,i=e.lineno,a=e.colno,o=[];if(n)try{o=t.parse(n)}catch(t){}return function(t){return 0!==t.length&&(1!==t.length||"lineNumber"in t[0])}(o)||(o=[{fileName:r,lineNumber:i,columnNumber:a}]),o.map((function(t){return t.functionName&&(t.functionName=(e=t.functionName,n=e.split("/"),e=(e=(e=n.length>1?["Object",n[n.length-1]].join("."):n[0]).replace(/.<$/gi,".")).replace(/^Anonymous function$/,""),e=(n=e.split(".")).length>1?n[n.length-1]:n[0])),t;var e,n})).map((function(t){var e=t.fileName,n=t.lineNumber,r=t.columnNumber,i=t.functionName,a=void 0===i?"":i;if(!e&&!n)return{};if(!r&&!n)return{};var o,s,c=function(t){return void 0===t&&(t=""),""===t&&(t=""),t}(e),u=(o=c,s=window.location.origin||window.location.protocol+"//"+window.location.hostname+(window.location.port?":"+window.location.port:""),o.indexOf(s)>-1&&(o=o.replace(s+"/","")),o);return function(t){return!!t&&0===window.location.href.indexOf(t)}(c)&&(u="(inline script)"),{abs_path:e,filename:u,function:a,lineno:n,colno:r}}))}var vt=[["#","hash"],["?","query"],["/","path"],["@","auth",1],[NaN,"host",void 0,1]],ht=/^([a-z][a-z0-9.+-]*:)?(\/\/)?([\S\s]*)/i,gt=function(){function t(t){var e,n=this.extractProtocol(t||""),r=n.protocol,i=n.address,a=n.slashes,o=!r&&!a,s=this.getLocation(),c=vt.slice();i=i.replace("\\","/"),a||(c[2]=[NaN,"path"]);for(var u=0;u=0||(i[n]=t[n]);return i}(n,mt)),i=St(),a={};if("page-exit"===t.type)t.ensureContext(),t.context.page&&t.context.page.url&&(i.page.url=t.context.page.url);else if(t.type===K&&U()){var o=m.getEntriesByType("navigation");o&&o.length>0&&(a={response:yt(o[0])})}t.addContext(i,a,r)}var Tt={service:{name:[1024,!0],version:!0,agent:{version:[1024,!0]},environment:!0},labels:{"*":!0}},Et={"*":!0,headers:{"*":!0}},xt={user:{id:!0,email:!0,username:!0},tags:{"*":!0},http:{response:Et},destination:{address:[1024],service:{"*":[1024,!0]}},response:Et},It={name:[1024,!0],type:[1024,!0],id:[1024,!0],trace_id:[1024,!0],parent_id:[1024,!0],transaction_id:[1024,!0],subtype:!0,action:!0,context:xt},kt={name:!0,parent_id:!0,type:[1024,!0],id:[1024,!0],trace_id:[1024,!0],span_count:{started:[1024,!0]},context:xt},Ct={id:[1024,!0],trace_id:!0,transaction_id:!0,parent_id:!0,culprit:!0,exception:{type:!0},transaction:{type:!0},context:xt};function Lt(t){return null==t||""===t||void 0===t}function Ot(t,e,n){var r=function(t,e,n,r){return void 0===e&&(e=1024),void 0===n&&(n=!1),void 0===r&&(r="N/A"),n&&Lt(t)&&(t=r),"string"==typeof t?t.substring(0,e):t}(t[e],n[0],n[1]);Lt(r)?delete t[e]:t[e]=r}function Nt(t,e,n){void 0===t&&(t={}),void 0===n&&(n=e);for(var r=Object.keys(t),i=[],a=function(a){var o=r[a],s=!0===t[o]?i:t[o];Array.isArray(s)?"*"===o?Object.keys(n).forEach((function(t){return Ot(n,t,s)})):Ot(n,o,s):Nt(s,e,n[o])},o=0;o=0)){var i=t[r];if(null!=i&&"function"!=typeof i){if("object"==typeof i){if("function"!=typeof i.toISOString)return;i=i.toISOString()}n[r]=i,e=!0}}})),e)return n}(a);u&&(c.custom=u)}s||o&&o.indexOf(":")>-1&&(s=o.split(":")[0]);var f=this._transactionService.getCurrentTransaction(),d=f?f.context:{},l=this._configService.get("context"),p=(l.tags,function(t,e){if(null==t)return{};var n,r,i={},a=Object.keys(t);for(r=0;r=0||(i[n]=t[n]);return i}(l,qt)),v=N({},St(),d,p,c),h={id:b(),culprit:n,exception:{message:o,stacktrace:e,type:s},context:v};return f&&(h=O(h,{trace_id:f.traceId,parent_id:f.id,transaction_id:f.id,transaction:{type:f.type,sampled:f.sampled}})),Nt(Ct,h)},e.logErrorEvent=function(t){if(void 0!==t){var e=this.createErrorDataModel(t);void 0!==e.exception.message&&this._apmServer.addError(e)}},e.registerListeners=function(){var t=this;window.addEventListener("error",(function(e){return t.logErrorEvent(e)})),window.addEventListener("unhandledrejection",(function(e){return t.logPromiseEvent(e)}))},e.logPromiseEvent=function(t){var e,n=t.reason;(null==n&&(n=""),"string"==typeof n.message)?e={error:n,message:"Unhandled promise rejection: "+(n.name?n.name+": ":"")+n.message}:e=this._parseRejectReason(n);this.logErrorEvent(e)},e.logError=function(t){var e={};return"string"==typeof t?e.message=t:e.error=t,this.logErrorEvent(e)},e._parseRejectReason=function(t){var e={message:"Unhandled promise rejection: "};if(Array.isArray(t))e.message+="";else if("object"==typeof t)try{e.message+=JSON.stringify(t),e.error=t}catch(t){e.message+=""}else e.message+="function"==typeof t?"":t;return e},t}(),At=function(){function t(t,e){void 0===e&&(e={}),this.onFlush=t,this.items=[],this.queueLimit=e.queueLimit||-1,this.flushInterval=e.flushInterval||0,this.timeoutId=void 0}var e=t.prototype;return e._setTimer=function(){var t=this;this.timeoutId=setTimeout((function(){return t.flush()}),this.flushInterval)},e._clear=function(){void 0!==this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=void 0),this.items=[]},e.flush=function(){this.onFlush(this.items),this._clear()},e.add=function(t){this.items.push(t),-1!==this.queueLimit&&this.items.length>=this.queueLimit?this.flush():void 0===this.timeoutId&&this._setTimer()},t}();var Mt=function(){function t(){}return t.stringify=function(t){return JSON.stringify(t)+"\n"},t}(),Ht=["fetchStart","domainLookupStart","domainLookupEnd","connectStart","connectEnd","requestStart","responseStart","responseEnd","domLoading","domInteractive","domContentLoadedEventStart","domContentLoadedEventEnd","domComplete","loadEventStart","loadEventEnd"],Ut=["fs","ls","le","cs","ce","qs","rs","re","dl","di","ds","de","dc","es","ee"];function zt(t){var e=function(t){var e=t.redirectStart,n=t.fetchStart,r=t.navigationStart,i=t.responseStart,a=t.responseEnd;if(n>=r&&i>=n&&a>=i){var o={};return Ht.forEach((function(r){var i=t[r];i&&i>=n&&(B(t)?o[r]=parseInt(i-e):o[r]=parseInt(i-n))})),o}return null}(t);return null==e?null:{navigationTiming:e,agent:{timeToFirstByte:e.responseStart,domInteractive:e.domInteractive,domComplete:e.domComplete}}}function Dt(t){return{ts:t.transfer_size,ebs:t.encoded_body_size,dbs:t.decoded_body_size}}function Bt(t){if(!t)return null;var e={},n=t.page,r=t.http,i=t.response,a=t.destination,o=t.user,s=t.custom;if(n&&(e.p={rf:n.referer,url:n.url}),r&&(e.h=function(t){var e={},n=t.method,r=t.status_code,i=t.url,a=t.response;return e.url=i,n&&(e.mt=n),r&&(e.sc=r),a&&(e.r=Dt(a)),e}(r)),i&&(e.r=Dt(i)),a){var c=a.service;e.dt={se:{n:c.name,t:c.type,rc:c.resource},ad:a.address,po:a.port}}return o&&(e.u={id:o.id,un:o.username,em:o.email}),s&&(e.cu=s),e}function Vt(t){if(!t)return null;var e=function(t){if(!t)return null;var e={};return Ut.forEach((function(n,r){var i=Ht[r];e[n]=t[i]})),e}(t.navigationTiming);return{nt:e,a:$t(e,t.agent)}}function $t(t,e){var n={};if(t&&(n={fb:t.rs,di:t.di,dc:t.dc}),e){var r=e.firstContentfulPaint,i=e.largestContentfulPaint;r&&(n.fp=r),i&&(n.lp=i)}return 0===Object.keys(n).length?null:n}function Jt(t,e){void 0===e&&(e="gzip");var n="function"==typeof CompressionStream;return new v((function(r){if(!n)return r(t);if(function(){var t="_elastic_inspect_beacon_";if(null!=sessionStorage.getItem(t))return!0;if(!window.URL||!window.URLSearchParams)return!1;try{var e=new URL(window.location.href).searchParams.has(t);return e&&sessionStorage.setItem(t,!0),e}catch(t){}return!1}())return r(t);var i=t.payload,a=t.headers,o=t.beforeSend,s=new Blob([i]).stream().pipeThrough(new CompressionStream(e));return new Response(s).blob().then((function(t){return a["Content-Encoding"]=e,r({payload:t,headers:a,beforeSend:o})}))}))}function Xt(t,e,n){var r=n.timeout,i=void 0===r?HTTP_REQUEST_TIMEOUT:r,a=n.payload,o=n.headers,s=n.beforeSend,c=n.sendCredentials;return new v((function(n,r){var u=new window.XMLHttpRequest;if(u[X]=!0,u.open(t,e,!0),u.timeout=i,u.withCredentials=c,o)for(var f in o)o.hasOwnProperty(f)&&u.setRequestHeader(f,o[f]);u.onreadystatechange=function(){if(4===u.readyState){var t=u.status,i=u.responseText;nt(t)?n(u):r({url:e,status:t,responseText:i})}},u.onerror=function(){var t=u.status,n=u.responseText;r({url:e,status:t,responseText:n})};var d=!0;"function"==typeof s&&(d=s({url:e,method:t,headers:o,payload:a,xhr:u})),d?u.send(a):r({url:e,status:0,responseText:"Request rejected by user configuration."})}))}var Gt=function(){function t(t,e){this._configService=t,this._loggingService=e,this.queue=void 0,this.throttleEvents=R}var e=t.prototype;return e.init=function(){var t=this,e=this._configService.get("queueLimit"),n=this._configService.get("flushInterval"),r=this._configService.get("eventsLimit");this.queue=new At((function(e){var n=t.sendEvents(e);n&&n.catch((function(e){t._loggingService.warn("Failed sending events!",t._constructError(e))}))}),{queueLimit:e,flushInterval:n}),this.throttleEvents=function(t,e,n){var r,i=this,a=n.limit,o=n.interval,s=0;return function(){return s++,void 0===r&&(r=setTimeout((function(){s=0,r=void 0}),o)),s>a&&"function"==typeof e?e.apply(i,arguments):t.apply(i,arguments)}}(this.queue.add.bind(this.queue),(function(){return t._loggingService.warn("Dropped events due to throttling!")}),{limit:r,interval:6e4}),this._configService.observeEvent("queue:flush",(function(){t.queue.flush()}))},e._postJson=function(t,e){var n=this,r={payload:e,headers:{"Content-Type":"application/x-ndjson"},beforeSend:this._configService.get("apmRequest")};return Jt(r).catch((function(t){return r})).then((function(e){return n._makeHttpRequest("POST",t,e)})).then((function(t){return t.responseText}))},e._constructError=function(t){var e=t.url,n=t.status;t.responseText;if(void 0===n)return t;var r=e+" HTTP status: "+n;return new Error(r)},e._makeHttpRequest=function(t,e,n){var r=void 0===n?{}:n,i=r.timeout,a=void 0===i?1e4:i,o=r.payload,s=r.headers,c=r.beforeSend,u=this._configService.get("sendCredentials");return!c&&it(t,o)?function(t,e,n){var r,i=n.keepalive,a=void 0!==i&&i,o=n.timeout,s=void 0===o?1e4:o,c=n.payload,u=n.headers,f=n.sendCredentials,d={};if("function"==typeof AbortController){var l=new AbortController;d.signal=l.signal,setTimeout((function(){return l.abort()}),s)}return window.fetch(e,rt({body:c,headers:u,method:t,keepalive:a,credentials:f?"include":"omit"},d)).then((function(t){return(r=t).text()})).then((function(t){var n={url:e,status:r.status,responseText:t};if(!nt(r.status))throw n;return n}))}(t,e,{keepalive:!0,timeout:a,payload:o,headers:s,sendCredentials:u}).catch((function(n){if(n instanceof TypeError)return Xt(t,e,{timeout:a,payload:o,headers:s,beforeSend:c,sendCredentials:u});throw n})):Xt(t,e,{timeout:a,payload:o,headers:s,beforeSend:c,sendCredentials:u})},e.fetchConfig=function(t,e){var n=this,r=this.getEndpoints().configEndpoint;if(!t)return v.reject("serviceName is required for fetching central config.");r+="?service.name="+t,e&&(r+="&service.environment="+e);var i=this._configService.getLocalConfig();i&&(r+="&ifnonematch="+i.etag);var a=this._configService.get("apmRequest");return this._makeHttpRequest("GET",r,{timeout:5e3,beforeSend:a}).then((function(t){var e=t.status,r=t.responseText;if(304===e)return i;var a=JSON.parse(r),o=t.getResponseHeader("etag");return o&&(a.etag=o.replace(/["]/g,""),n._configService.setLocalConfig(a,!0)),a})).catch((function(t){var e=n._constructError(t);return v.reject(e)}))},e.createMetaData=function(){var t=this._configService,e={service:{name:t.get("serviceName"),version:t.get("serviceVersion"),agent:{name:"rum-js",version:t.version},language:{name:"javascript"},environment:t.get("environment")},labels:t.get("context.tags")};return Nt(Tt,e)},e.addError=function(t){var e;this.throttleEvents(((e={}).errors=t,e))},e.addTransaction=function(t){var e;this.throttleEvents(((e={}).transactions=t,e))},e.ndjsonErrors=function(t,e){var n=e?"e":"error";return t.map((function(t){var r;return Mt.stringify(((r={})[n]=e?function(t){var e,n=t.exception,r={id:t.id,cl:t.culprit,ex:{mg:n.message,st:(e=n.stacktrace,e.map((function(t){return{ap:t.abs_path,f:t.filename,fn:t.function,li:t.lineno,co:t.colno}}))),t:t.type},c:Bt(t.context)},i=t.transaction;return i&&(r.tid=t.trace_id,r.pid=t.parent_id,r.xid=t.transaction_id,r.x={t:i.type,sm:i.sampled}),r}(t):t,r))}))},e.ndjsonMetricsets=function(t){return t.map((function(t){return Mt.stringify({metricset:t})})).join("")},e.ndjsonTransactions=function(t,e){var n=this,r=e?"x":"transaction";return t.map((function(t){var i,a="",o="";return e||(t.spans&&(a=t.spans.map((function(t){return Mt.stringify({span:t})})).join(""),delete t.spans),t.breakdown&&(o=n.ndjsonMetricsets(t.breakdown),delete t.breakdown)),Mt.stringify(((i={})[r]=e?function(t){var e,n=t.spans.map((function(e){var n={id:e.id,n:e.name,t:e.type,s:e.start,d:e.duration,c:Bt(e.context),o:e.outcome,sr:e.sample_rate};return e.parent_id!==t.id&&(n.pid=e.parent_id),!0===e.sync&&(n.sy=!0),e.subtype&&(n.su=e.subtype),e.action&&(n.ac=e.action),n})),r={id:t.id,pid:t.parent_id,tid:t.trace_id,n:t.name,t:t.type,d:t.duration,c:Bt(t.context),k:Vt(t.marks),me:(e=t.breakdown,e.map((function(t){var e=t.span,n=t.samples;return{y:{t:e.type},sa:{ysc:{v:n["span.self_time.count"].value},yss:{v:n["span.self_time.sum.us"].value}}}}))),y:n,yc:{sd:n.length},sm:t.sampled,sr:t.sample_rate,o:t.outcome};if(t.experience){var i=t.experience,a=i.cls,o=i.fid,s=i.tbt,c=i.longtask;r.exp={cls:a,fid:o,tbt:s,lt:c}}if(t.session){var u=t.session,f=u.id,d=u.sequence;r.ses={id:f,seq:d}}return r}(t):t,i))+a+o}))},e.sendEvents=function(t){var e,n;if(0!==t.length){for(var r=[],i=[],a=0;a2,d=[],l=this.createMetaData(),p=f?"m":"metadata";d.push(Mt.stringify(((n={})[p]=f?function(t){var e=t.service,n=t.labels,r=e.agent,i=e.language;return{se:{n:e.name,ve:e.version,a:{n:r.name,ve:r.version},la:{n:i.name},en:e.environment},l:n}}(l):l,n)));var v=(d=d.concat(this.ndjsonErrors(u.errors,f),this.ndjsonTransactions(u.transactions,f))).join(""),h=this.getEndpoints().intakeEndpoint;return this._postJson(h,v)}this._loggingService.warn("Dropped payload due to filtering!")}}},e.getEndpoints=function(){var t=this._configService.get("serverUrl"),e=this._configService.get("apiVersion");return{intakeEndpoint:t+(this._configService.get("serverUrlPrefix")||"/intake/v"+e+"/rum/events"),configEndpoint:t+"/config/v1/rum/agents"}},t}();function Zt(){return(Zt=Object.assign||function(t){for(var e=1;e0?t.charAt(0).toUpperCase()+t.substring(1):t})).join("");e[o]=a.value||a.nodeValue}}return e}(L());this.setConfig(t)},e.setVersion=function(t){this.version=t},e.addFilter=function(t){if("function"!=typeof t)throw new Error("Argument to must be function");this.filters.push(t)},e.applyFilters=function(t){for(var e=0;e0&&(n=1e-4),t.transactionSampleRate=Math.round(1e4*n)/1e4),this.config=N(this.config,t),this.events.send("config:change",[this.config])},e.validate=function(t){void 0===t&&(t={});var e=["serviceName","serverUrl"],n=Object.keys(this.config),r={missing:[],invalid:[],unknown:[]};Object.keys(t).forEach((function(i){-1===e.indexOf(i)||t[i]||r.missing.push(i),-1===n.indexOf(i)&&r.unknown.push(i)})),t.serviceName&&!/^[a-zA-Z0-9 _-]+$/.test(t.serviceName)&&r.invalid.push({key:"serviceName",value:t.serviceName,allowed:"a-z, A-Z, 0-9, _, -, "});var i=t.transactionSampleRate;return void 0!==i&&("number"!=typeof i||isNaN(i)||i<0||i>1)&&r.invalid.push({key:"transactionSampleRate",value:i,allowed:"Number between 0 and 1"}),r},e.getLocalConfig=function(){var t=sessionStorage;this.config.session&&(t=localStorage);var e=t.getItem("elastic_apm_config");if(e)return JSON.parse(e)},e.setLocalConfig=function(t,e){if(t){if(e)t=Zt({},this.getLocalConfig(),t);var n=sessionStorage;this.config.session&&(n=localStorage),n.setItem("elastic_apm_config",JSON.stringify(t))}},e.dispatchEvent=function(t,e){this.events.send(t,e)},e.observeEvent=function(t,e){return this.events.observe(t,e)},t}(),Wt=function(){function t(t){void 0===t&&(t={}),this.levels=["trace","debug","info","warn","error"],this.level=t.level||"warn",this.prefix=t.prefix||"",this.resetLogMethods()}var e=t.prototype;return e.shouldLog=function(t){return this.levels.indexOf(t)>=this.levels.indexOf(this.level)},e.setLevel=function(t){t!==this.level&&(this.level=t,this.resetLogMethods())},e.resetLogMethods=function(){var t=this;this.levels.forEach((function(e){t[e]=t.shouldLog(e)?function(){var t=e;"trace"!==e&&"debug"!==e||(t="info");var n=arguments;if(n[0]=this.prefix+n[0],console){var r=console[t]||console.log;"function"==typeof r&&r.apply(console,n)}}:R}))},t}(),Kt=((Yt={}).ConfigService=function(){return new Qt},Yt.LoggingService=function(){return new Wt({prefix:"[Elastic APM] "})},Yt.ApmServer=function(t){var e=t.getService(["ConfigService","LoggingService"]),n=e[0],r=e[1];return new Gt(n,r)},Yt),te=function(){function t(){this.instances={},this.initialized=!1}var e=t.prototype;return e.init=function(){if(!this.initialized){this.initialized=!0;var t=this.getService("ConfigService");t.init();var e=this.getService(["LoggingService","ApmServer"]),n=e[0],r=e[1];t.events.observe("config:change",(function(){var e=t.get("logLevel");n.setLevel(e)})),r.init()}},e.getService=function(t){var e=this;return"string"==typeof t?(this.instances[t]||"function"==typeof Kt[t]&&(this.instances[t]=Kt[t](this)),this.instances[t]):Array.isArray(t)?t.map((function(t){return e.getService(t)})):void 0},t}();var ee=function(){function t(t,e,n,r){this._apmServer=t,this._configService=e,this._logginService=n,this._transactionService=r}var e=t.prototype;return e.init=function(t){var e=this;void 0===t&&(t={}),this._configService.events.observe("transaction:end:after",(function(t){var n=e.createTransactionPayload(t);n&&(e._apmServer.addTransaction(n),e._configService.dispatchEvent("queue:add_transaction"))})),t.history&&st.observe("history",this.getHistorySub()),t.xmlhttprequest&&st.observe("xmlhttprequest",this.getXHRSub()),t.fetch&&st.observe("fetch",this.getFetchSub())},e.getHistorySub=function(){var t=this._transactionService;return function(e,n){"history"===n.source&&e===Q&&t.startTransaction(n.data.title,"route-change",{managed:!0,canReuse:!0})}},e.getXHRSub=function(){var t=this;return function(e,n){"xmlhttprequest"!==n.source||V.fetchInProgress||t.processAPICalls(e,n)}},e.getFetchSub=function(){var t=this;return function(e,n){"fetch"===n.source&&t.processAPICalls(e,n)}},e.processAPICalls=function(t,e){var n=this._configService,r=this._transactionService;if(e.data&&e.data.url){var i=this._apmServer.getEndpoints();if(Object.keys(i).some((function(t){return-1!==e.data.url.indexOf(i[t])})))return}if("schedule"===t&&e.data){var a=e.data,o=new gt(a.url),s=a.method+" "+(o.relative?o.path:I(o.href));r.getCurrentTransaction()||r.startTransaction(s,"http-request",{managed:!0});var c=r.startSpan(s,"external.http",{blocking:!0});if(!c)return;var u=n.get("distributedTracing"),f=n.get("distributedTracingOrigins"),d=new gt(window.location.href),l=T(o.origin,d.origin)||T(o.origin,f),p=a.target;if(u&&l&&p)this.injectDtHeader(c,p),n.get("propagateTracestate")&&this.injectTSHeader(c,p);else 0;a.sync&&(c.sync=a.sync),a.span=c}else if(t===Q){var v=e.data;if(v&&v.span){var h,g,m=v.span,y=v.response,_=v.target;h=y?y.status:_.status,g="abort"==v.status||v.aborted?"unknown":h>=400||0==h?"failure":"success",m.outcome=g;var S=r.getCurrentTransaction();S&&"http-request"===S.type&&(S.outcome=g),r.endSpan(m,v)}}},e.injectDtHeader=function(t,e){var n,r=this._configService.get("distributedTracingHeaderName"),i=function(t){if(t&&t.traceId&&t.id&&t.parentId){var e=t.sampled?"01":"00",n=t.sampled?t.id:t.parentId;return"00-"+t.traceId+"-"+n+"-"+e}}(t);/^[\da-f]{2}-[\da-f]{32}-[\da-f]{16}-[\da-f]{2}$/.test(n=i)&&"00000000000000000000000000000000"!==n.slice(3,35)&&"0000000000000000"!==n.slice(36,52)&&i&&r&&w(e,r,i)},e.injectTSHeader=function(t,e){var n=function(t){var e=t.sampleRate;if(!("number"!=typeof e||String(e).length>256)){return"es=s:"+e}}(t);n&&w(e,"tracestate",n)},e.extractDtHeader=function(t){var e=this._configService.get("distributedTracingHeaderName");if(t)return function(t){var e=/^([\da-f]{2})-([\da-f]{32})-([\da-f]{16})-([\da-f]{2})$/.exec(t);if(e){var n="00"!==e[4];return{traceId:e[2],id:e[3],sampled:n}}}(t[e])},e.filterTransaction=function(t){var e=t.duration();if(!e)return!1;if(t.isManaged()){if(e>6e4)return!1;if(t.sampled&&0===t.spans.length)return!1}return!0},e.createTransactionDataModel=function(t){var e=t._start,n=t.spans.map((function(n){var r={id:n.id,transaction_id:t.id,parent_id:n.parentId||t.id,trace_id:t.traceId,name:n.name,type:n.type,subtype:n.subtype,action:n.action,sync:n.sync,start:parseInt(n._start-e),duration:n.duration(),context:n.context,outcome:n.outcome,sample_rate:n.sampleRate};return Nt(It,r)})),r={id:t.id,parent_id:t.parentId,trace_id:t.traceId,session:t.session,name:t.name,type:t.type,duration:t.duration(),spans:n,context:t.context,marks:t.marks,breakdown:t.breakdownTimings,span_count:{started:n.length},sampled:t.sampled,sample_rate:t.sampleRate,experience:t.experience,outcome:t.outcome};return Nt(kt,r)},e.createTransactionPayload=function(t){var e=function(t){if(t.sampled){var e=t.spans.filter((function(e){return e.duration()>0&&e._start>=t._start&&e._end<=t._end}));if(t.isManaged()){var n=function(t,e,n){t.sort((function(t,e){return t._start-e._start}));var r=[],i=1;return t.forEach((function(a,o){if(0===r.length)r.push(a);else{var s=r[r.length-1],c=s.type===a.type&&s.subtype===a.subtype&&s.action===a.action&&s.name===a.name&&a.duration()/e1&&(!c||u)&&(s.name=i+"x "+s.name,i=1),c||r.push(a)}})),r}(e,t.duration(),.05);t.spans=n}else t.spans=e}else t.resetFields();return t}(t);if(this.filterTransaction(e))return this.createTransactionDataModel(t);this._configService.dispatchEvent("transaction:ignore")},t}(),ne=function(){function t(t,e,n){void 0===n&&(n={}),t||(t="Unknown"),e||(e="custom"),this.name=t,this.type=e,this.options=n,this.id=n.id||b(16),this.traceId=n.traceId,this.sampled=n.sampled,this.sampleRate=n.sampleRate,this.timestamp=n.timestamp,this._start=A(n.startTime),this._end=void 0,this.ended=!1,this.outcome=void 0,this.onEnd=n.onEnd}var e=t.prototype;return e.ensureContext=function(){this.context||(this.context={})},e.addLabels=function(t){this.ensureContext();var e=this.context;e.tags||(e.tags={}),Object.keys(t).forEach((function(n){return x(n,t[n],e.tags)}))},e.addContext=function(){for(var t=arguments.length,e=new Array(t),n=0;ns?(c+=o-s,s=a):a>s&&(s=a);return s=r})),a={spans:function(t,e){for(var n=[],r=0;r0){var d=c[0],l=d.name,p=d.containerType,v=d.containerName,h=d.containerId,g={attribution:l,type:p};v&&(g.name=v),h&&(g.id=h),f.addContext({custom:g})}f.end(u),n.push(f)}return n}(i,de.longtask),marks:{}};if(!n)return a;var o=t.getEntriesByType("largest-contentful-paint"),s=o[o.length-1];if(s){var c=parseInt(s.startTime);de.lcp=c,a.marks.largestContentfulPaint=c}var u=m.timing,f=u.fetchStart-u.navigationStart;B(u)&&(f=0);var d=t.getEntriesByName("first-contentful-paint")[0];if(d){var l=parseInt(f>=0?d.startTime-f:d.startTime);de.fcp=l,a.marks.firstContentfulPaint=l}var p=function(t){var e=t[0];if(e){var n=e.startTime,r=e.processingStart,i=new ie("First Input Delay","first-input",{startTime:n});return i.end(r),i}}(t.getEntriesByType("first-input"));return p&&(de.fid=p.duration(),a.spans.push(p)),function(t){t.forEach((function(t){var e=t.name,n=t.startTime,r=t.duration;if(!(n0&&(de.tbt.duration+=i)}}))}(i),function(t){t.forEach((function(t){!t.hadRecentInput&&t.value&&((t.startTime-de.cls.firstEntryTime>5e3||t.startTime-de.cls.prevEntryTime>1e3)&&(de.cls.firstEntryTime=t.startTime,de.cls.currentSessionScore=0),de.cls.prevEntryTime=t.startTime,de.cls.currentSessionScore+=t.value,de.cls.score=Math.max(de.cls.score,de.cls.currentSessionScore))}))}(t.getEntriesByType("layout-shift")),a}var pe=function(){function t(t){this.po={observe:R,disconnect:R},window.PerformanceObserver&&(this.po=new PerformanceObserver(t))}var e=t.prototype;return e.start=function(t,e){void 0===e&&(e={buffered:!0});try{if(!z(t))return;this.po.observe(fe({type:t},e))}catch(t){}},e.stop=function(){this.po.disconnect()},t}();function ve(t,e,n,r,i){return void 0===i&&(i=0),"number"==typeof t&&"number"==typeof e&&t>=i&&e>t&&t-i>=n&&e-i<=r&&e-t<3e5&&t-i<3e5&&e-i<3e5}var he=[["redirectStart","redirectEnd","Redirect"],["domainLookupStart","domainLookupEnd","Domain lookup"],["connectStart","connectEnd","Making a connection to the server"],["requestStart","responseEnd","Requesting and receiving the document"],["domLoading","domInteractive","Parsing the document, executing sync. scripts"],["domContentLoadedEventStart","domContentLoadedEventEnd",'Fire "DOMContentLoaded" event'],["loadEventStart","loadEventEnd",'Fire "load" event']];function ge(t){var e=t.name,n=t.initiatorType,r=t.startTime,i=t.responseEnd,a="resource";n&&(a+="."+n);var o=I(e),s=new ie(o,a);return s._start=r,s.end(i,{url:e,entry:t}),s}function me(t,e){return null!=e&&t>e}function ye(t){if(t.captureTimings){var e=t._end;if(t.type===K){if(t.marks&&t.marks.custom){var n=t.marks.custom;Object.keys(n).forEach((function(e){n[e]+=t._start}))}t._start=0;var r=m.timing;(function(t,e,n,r){for(var i=[],a=0;a=0&&s=t._start)e._config.dispatchEvent("transaction:ignore");else if(e.shouldIgnoreTransaction(r)||"temporary"===i)e._config.dispatchEvent("transaction:ignore");else{if(i===K){var a=e._config.get("pageLoadTransactionName");if("Unknown"===r&&a&&(t.name=a),t.captureTimings){var o=de.cls,s=de.fid,c=de.tbt,u=de.longtask;c.duration>0&&t.spans.push((d=(f=c).start,l=f.duration,(p=new ie("Total Blocking Time","longtask",{startTime:d})).end(d+l),p)),t.experience={},z("longtask")&&(t.experience.tbt=c.duration),z("layout-shift")&&(t.experience.cls=o.score),s>0&&(t.experience.fid=s),u.count>0&&(t.experience.longtask={count:u.count,sum:u.duration,max:u.max})}e.setSession(t)}var f,d,l,p;"Unknown"===t.name&&(t.name=function(t,e){void 0===e&&(e=2);for(var n=new gt(t),r=n.query,i=n.path.substring(1).split("/"),a=/\W|_/g,o=/[0-9]/g,s=/[a-z]/g,c=/[A-Z]/g,u=[],f=!1,d=0;de-1){l&&u.push("*");break}if((l.match(a)||[]).length>=2)u.push(":id"),f=!0;else{var p=(l.match(o)||[]).length;if(p>3||l.length>3&&p/l.length>=.3)u.push(":id"),f=!0;else{var v=(l.match(c)||[]).length,h=(l.match(s)||[]).length/l.length,g=v/l.length;l.length>5&&(g>.3&&g<.6||h>.3&&h<.6)?(u.push(":id"),f=!0):l&&u.push(l)}}}return"/"+(u.length>=2?u.join("/"):u.join(""))+(r?"?{query}":"")}(n)),ye(t),e.adjustTransactionTime(t),e._config.get("breakdownMetrics")&&t.captureBreakdown();var v=e._config.get("context");wt(t,v),e._config.events.send("transaction:end",[t])}}),(function(t){0}))},e.setSession=function(t){var e=this._config.get("session");if(e){"boolean"==typeof e||e.timestamp&&Date.now()-e.timestamp>18e5?t.session={id:b(16),sequence:1}:t.session={id:e.id,sequence:e.sequence?e.sequence+1:1};var n={session:{id:t.session.id,sequence:t.session.sequence,timestamp:Date.now()}};this._config.setConfig(n),this._config.setLocalConfig(n,!0)}},e.adjustTransactionTime=function(t){var e=t.spans,n=function(t){for(var e=t[0],n=1;nr._start&&(e=r)}return e}(e);n&&n._startt._end&&(t._end=r);this.truncateSpans(e,t._end)},e.truncateSpans=function(t,e){for(var n=0;ne&&(r._end=e,r.type+=".truncated"),r._start>e&&(r._start=e)}},e.shouldIgnoreTransaction=function(t){var e=this._config.get("ignoreTransactions");if(e&&e.length)for(var n=0;n0){var r=n[0];r.duration=Math.max(r.duration,t.duration)}else be.longestInteractions.push({id:t.interactionId,duration:t.duration});be.longestInteractions.sort((function(t,e){return e.duration-t.duration})),be.longestInteractions.splice(10)}(t))}))}function Te(){return performance.interactionCount||be.interactionCount}function Ee(t){var e=function(){if(0===be.longestInteractions.length)return Te()>0?0:void 0;var t=Math.min(be.longestInteractions.length-1,Math.floor(Te()/50));return be.longestInteractions[t].duration}();if(e>=0){var n=P(),r=t.startTransaction("page-exit","page-exit",{startTime:n}),i=performance.getEntriesByType("navigation");if(i.length>0){var a=i[0].name;r.addContext({page:{url:a}})}r.addLabels({inp_value:e});var o=n+e+1;return r.end(o),be.minInteractionId=1/0,be.maxInteractionId=0,be.interactionCount=0,be.longestInteractions=[],r}}function xe(t,e){if(Ee(e))var n=t.observeEvent("queue:add_transaction",(function(){Ie(t,e),n()}));else Ie(t,e)}function Ie(t,e){var n=e.getCurrentTransaction();if(n){var r=t.observeEvent("transaction:ignore",(function(){ft.lastHiddenStart=P(),r(),i()})),i=t.observeEvent("queue:add_transaction",(function(){t.dispatchEvent("queue:flush"),ft.lastHiddenStart=P(),i(),r()}));n.end()}else t.dispatchEvent("queue:flush"),ft.lastHiddenStart=P()}function ke(t){var e=function(e){e.target instanceof Element&&function(t,e){var n=function(t){var e={transactionName:null,context:null};e.transactionName=function(t){var e=function(t){var e=t.getAttribute("data-transaction-name");if(t.closest){var n=t.closest("a[data-transaction-name], button[data-transaction-name]");return n?n.getAttribute("data-transaction-name"):e}return e}(t);if(e)return e;var n=t.tagName.toLowerCase(),r=t.getAttribute("name");if(r)return n+'["'+r+'"]';return n}(t);var n=t.getAttribute("class");n&&(e.context={custom:{classes:n}});return e}(e),r=n.transactionName,i=n.context,a=t.startTransaction("Click - "+r,"user-interaction",{managed:!0,canReuse:!0,reuseThreshold:300});a&&i&&a.addContext(i)}(t,e.target)};return window.addEventListener("click",e,!0),function(){window.removeEventListener("click",e,!0)}}var Ce=function(){function t(t,e){this._disable=e,this.serviceFactory=t,this._initialized=!1}var e=t.prototype;return e.isEnabled=function(){return!this._disable},e.isActive=function(){var t=this.serviceFactory.getService("ConfigService");return this.isEnabled()&&this._initialized&&t.get("active")},e.init=function(t){var e=this;if(this.isEnabled()&&!this._initialized){this._initialized=!0;var n=this.serviceFactory.getService(["ConfigService","LoggingService","TransactionService"]),r=n[0],i=n[1],a=n[2];r.setVersion("5.16.3"),this.config(t);var o=r.get("logLevel");if(i.setLevel(o),r.get("active")){this.serviceFactory.init();var s=function(t,e){var n,r=((n={}).xmlhttprequest=!1,n.fetch=!1,n.history=!1,n[K]=!1,n.error=!1,n.eventtarget=!1,n.click=!1,n);return t?(Object.keys(r).forEach((function(t){-1===e.indexOf(t)&&(r[t]=!0)})),r):r}(r.get("instrument"),r.get("disableInstrumentations"));if(this.serviceFactory.getService("PerformanceMonitoring").init(s),s.error)this.serviceFactory.getService("ErrorLogging").registerListeners();if(r.get("session")){var c=r.getLocalConfig();c&&c.session&&r.setConfig({session:c.session})}var u=function(){return s[K]&&e._sendPageLoadMetrics()};r.get("centralConfig")?this.fetchCentralConfig().then(u):u(),function(t,e){"hidden"===document.visibilityState&&(ft.lastHiddenStart=0);var n=function(){"hidden"===document.visibilityState&&xe(t,e)},r=function(){return xe(t,e)};window.addEventListener("visibilitychange",n,!0),window.addEventListener("pagehide",r,!0)}(r,a),s.eventtarget&&s.click&&ke(a),function(t){void 0===t&&(t=new pe(we));var e=D(),n=e?40:16;t.start("event",{buffered:!0,durationThreshold:n}),e||t.start("first-input")}()}else this._disable=!0,i.warn("RUM agent is inactive")}return this},e.fetchCentralConfig=function(){var t=this.serviceFactory.getService(["ApmServer","LoggingService","ConfigService"]),e=t[0],n=t[1],r=t[2];return e.fetchConfig(r.get("serviceName"),r.get("environment")).then((function(t){var e=t.transaction_sample_rate;if(e){var i={transactionSampleRate:e=Number(e)},a=r.validate(i).invalid;if(0===a.length)r.setConfig(i);else{var o=a[0],s=o.key,c=o.value,u=o.allowed;n.warn('invalid value "'+c+'" for '+s+". Allowed: "+u+".")}}return t})).catch((function(t){n.warn("failed fetching config:",t)}))},e._sendPageLoadMetrics=function(){var t=this.startTransaction(void 0,K,{managed:!0,canReuse:!0});if(t){t.addTask(K);var e=function(){setTimeout((function(){return t.removeTask(K)}),1e3)};"complete"===document.readyState?e():window.addEventListener("load",e)}},e.observe=function(t,e){this.serviceFactory.getService("ConfigService").events.observe(t,e)},e.config=function(t){var e=this.serviceFactory.getService(["ConfigService","LoggingService"]),n=e[0],r=e[1],i=n.validate(t),a=i.missing,o=i.invalid,s=i.unknown;if(s.length>0){var c="Unknown config options are specified for RUM agent: "+s.join(", ");r.warn(c)}if(0===a.length&&0===o.length)n.setConfig(t);else{var u="RUM agent isn't correctly configured. ";a.length>0&&(u+=a.join(", ")+" is missing",o.length>0&&(u+=", ")),o.forEach((function(t,e){var n=t.key,r=t.value,i=t.allowed;u+=n+' "'+r+'" contains invalid characters! (allowed: '+i+")"+(e!==o.length-1?", ":"")})),r.error(u),n.setConfig({active:!1})}},e.setUserContext=function(t){this.serviceFactory.getService("ConfigService").setUserContext(t)},e.setCustomContext=function(t){this.serviceFactory.getService("ConfigService").setCustomContext(t)},e.addLabels=function(t){this.serviceFactory.getService("ConfigService").addLabels(t)},e.setInitialPageLoadName=function(t){this.serviceFactory.getService("ConfigService").setConfig({pageLoadTransactionName:t})},e.startTransaction=function(t,e,n){if(this.isEnabled())return this.serviceFactory.getService("TransactionService").startTransaction(t,e,n)},e.startSpan=function(t,e,n){if(this.isEnabled())return this.serviceFactory.getService("TransactionService").startSpan(t,e,n)},e.getCurrentTransaction=function(){if(this.isEnabled())return this.serviceFactory.getService("TransactionService").getCurrentTransaction()},e.captureError=function(t){if(this.isEnabled())return this.serviceFactory.getService("ErrorLogging").logError(t)},e.addFilter=function(t){this.serviceFactory.getService("ConfigService").addFilter(t)},t}();var Le=function(){if(g&&window.elasticApm)return window.elasticApm;var t=lt(),e=Se(),n=new Ce(e,!t);return g&&(window.elasticApm=n),n}();Le.init.bind(Le)}()}(); //# sourceMappingURL=elastic-apm-rum.umd.min.js.map \ No newline at end of file diff --git a/an_website/vendored/apm-rum/elastic-apm-rum.umd.min.js.map b/an_website/vendored/apm-rum/elastic-apm-rum.umd.min.js.map index 29c1cff08..e54899c47 100644 --- a/an_website/vendored/apm-rum/elastic-apm-rum.umd.min.js.map +++ b/an_website/vendored/apm-rum/elastic-apm-rum.umd.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["webpack://@elastic/apm-rum/../node_modules/error-stack-parser/error-stack-parser.js","webpack://@elastic/apm-rum/../node_modules/stackframe/stackframe.js","webpack://@elastic/apm-rum/webpack/bootstrap","webpack://@elastic/apm-rum/webpack/runtime/compat get default export","webpack://@elastic/apm-rum/webpack/runtime/define property getters","webpack://@elastic/apm-rum/webpack/runtime/hasOwnProperty shorthand","webpack://@elastic/apm-rum/../rum-core/dist/es/error-logging/stack-trace.js","webpack://@elastic/apm-rum/../node_modules/promise-polyfill/src/finally.js","webpack://@elastic/apm-rum/../node_modules/promise-polyfill/src/index.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/polyfills.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/utils.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/url.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/constants.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/context.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/truncate.js","webpack://@elastic/apm-rum/../rum-core/dist/es/error-logging/error-logging.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/queue.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/ndjson.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/span-base.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/span.js","webpack://@elastic/apm-rum/../rum-core/dist/es/state.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/capture-navigation.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/compress.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/http/response-status.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/http/fetch.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/patching/patch-utils.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/http/xhr.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/apm-server.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/throttle.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/event-handler.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/config-service.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/service-factory.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/logging-service.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/patching/xhr-patch.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/patching/index.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/patching/fetch-patch.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/patching/history-patch.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/performance-monitoring.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/breakdown.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/transaction.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/metrics.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/transaction-service.js","webpack://@elastic/apm-rum/../rum-core/dist/es/index.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/index.js","webpack://@elastic/apm-rum/../rum-core/dist/es/error-logging/index.js","webpack://@elastic/apm-rum/../rum-core/dist/es/bootstrap.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/observers/page-visibility.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/observers/page-clicks.js","webpack://@elastic/apm-rum/./src/apm-base.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/instrument.js","webpack://@elastic/apm-rum/./src/index.js"],"names":["StackFrame","FIREFOX_SAFARI_STACK_REGEXP","CHROME_IE_STACK_REGEXP","SAFARI_NATIVE_CODE_REGEXP","_map","array","fn","thisArg","Array","prototype","map","output","length","i","call","_filter","filter","push","parse","error","stacktrace","this","parseOpera","stack","match","parseV8OrIE","parseFFOrSafari","Error","extractLocation","urlLike","indexOf","parts","exec","replace","undefined","split","line","tokens","slice","locationParts","pop","functionName","join","fileName","target","_indexOf","e","message","parseOpera9","parseOpera11","parseOpera10","lineRE","lines","result","len","argsRaw","functionCall","shift","args","_isNumber","n","isNaN","parseFloat","isFinite","lineNumber","columnNumber","source","setFunctionName","setArgs","setFileName","setLineNumber","setColumnNumber","setSource","getFunctionName","v","String","getArgs","Object","toString","TypeError","getFileName","getLineNumber","Number","getColumnNumber","getSource","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","getter","__esModule","d","a","definition","key","o","defineProperty","enumerable","get","obj","prop","hasOwnProperty","createStackTraces","stackParser","errorEvent","filename","lineno","colno","stackTraces","isValidStackTrace","frame","fnName","_stack$functionName","fileUrl","origin","filePath","cleanFilePath","cleanedFileName","window","location","protocol","hostname","port","href","isFileInline","abs_path","function","callback","constructor","then","value","resolve","reason","reject","setTimeoutFunc","setTimeout","isArray","x","Boolean","noop","Promise","_state","_handled","_value","_deferreds","doResolve","handle","self","deferred","_immediateFn","cb","onFulfilled","onRejected","ret","promise","newValue","finale","apply","arguments","_unhandledRejectionFn","Handler","done","ex","prom","all","arr","remaining","res","val","race","setImmediate","err","console","warn","local","isBrowser","PromisePollyfill","PERF","performance","byteToHex","substr","destination","Uint8Array","generateRandomId","buffer","hexOctets","_i","bytesToHex","crypto","getRandomValues","msCrypto","setRequestHeader","name","headers","append","checkSameOrigin","isSame","test","forEach","t","isPlatformSupported","Set","JSON","stringify","now","XMLHttpRequest","setLabel","skey","removeInvalidChars","valueType","stripQueryStringFromUrl","url","isObject","baseExtend","dst","objs","deep","ii","keys","j","jj","src","getCurrentScript","document","currentScript","scripts","getElementsByTagName","l","sc","getElasticScript","extend","merge","isUndefined","getLatestSpan","spans","typeFilter","latestSpan","_i3","span","type","_end","getTime","time","getDuration","start","end","parseInt","scheduleMicroTask","isPerfTimelineSupported","getEntriesByType","isPerfTypeSupported","PerformanceObserver","supportedEntryTypes","RULES","NaN","PROTOCOL_REGEX","Url","index","_this$extractProtocol","extractProtocol","address","slashes","relative","getLocation","instructions","instruction","instLength","newIndex","lastIndexOf","Math","max","toLowerCase","path","charAt","host","isDefaultPort","_proto","auth","userpass","query","hash","globalVar","INVOKE","RESOURCE_INITIATOR_TYPES","PAGE_LOAD","TRANSACTION_TYPE_ORDER","_excluded","getResponseContext","perfTimingEntry","respContext","transfer_size","transferSize","encoded_body_size","encodedBodySize","decoded_body_size","decodedBodySize","serverTimingStr","serverTimingEntries","serverTimingInfo","_i2","_serverTimingEntries$","duration","description","timingValue","valueSeparator","getServerTimingInfo","serverTiming","getDestination","parsedUrl","portNumber","getPortNumber","ipv6Hostname","charCodeAt","service","resource","getPageContext","page","referer","referrer","addSpanContext","data","context","statusCode","method","response","http","status","status_code","getExternalContext","entry","getResourceContext","getNavigationContext","addContext","addTransactionContext","transaction","_temp","_ref","configContext","tags","excluded","sourceKeys","_objectWithoutPropertiesLoose","pageContext","responseContext","entries","METADATA_MODEL","version","agent","environment","labels","RESPONSE_MODEL","CONTEXT_MODEL","user","id","email","username","SPAN_MODEL","trace_id","parent_id","transaction_id","subtype","action","TRANSACTION_MODEL","span_count","started","ERROR_MODEL","culprit","exception","isEmpty","replaceValue","currModel","limit","required","placeholder","substring","truncate","truncateModel","model","childTarget","emptyArr","_loop","currKey","IGNORE_KEYS","ErrorLogging","apmServer","configService","transactionService","_apmServer","_configService","_transactionService","createErrorDataModel","filteredFrames","frames","filterInvalidFrames","lastFrame","errorMessage","errorType","errorContext","customProperties","propertyFound","properties","toISOString","getErrorProperties","custom","currentTransaction","getCurrentTransaction","transactionContext","_this$_configService$","errorObject","traceId","sampled","logErrorEvent","addError","registerListeners","_this","addEventListener","promiseRejectionEvent","logPromiseEvent","prefix","logError","messageOrError","Queue","onFlush","opts","items","queueLimit","flushInterval","timeoutId","_setTimer","flush","_clear","clearTimeout","add","item","NDJSON","object","SpanBase","options","sampleRate","timestamp","_start","startTime","ended","outcome","onEnd","ensureContext","addLabels","ctx","k","_len","_key","concat","endTime","callOnEnd","_setPrototypeOf","p","setPrototypeOf","__proto__","_SpanBase","subClass","superClass","Span","parentId","fields","sync","create","state","bootstrapTime","lastHiddenStart","MIN_SAFE_INTEGER","eventPairs","shouldCreateSpan","trStart","trEnd","baseTime","createResourceTimingSpan","resourceTimingEntry","initiatorType","responseEnd","kind","spanName","isCapturedByPatching","resourceStartTime","requestPatchTime","NAVIGATION_TIMING_MARKS","COMPRESSED_NAV_TIMING_MARKS","getPageLoadMarks","timing","marks","fetchStart","navigationStart","responseStart","timingKey","m","getNavigationTimingMarks","navigationTiming","timeToFirstByte","domInteractive","domComplete","captureNavigation","captureTimings","customMarks","timings","pageResponse","createNavigationTimingSpans","pageLoadSpanId","addMarks","_trStart","_entries$i","createResourceTimingSpans","userTimingSpans","_entries$i2","createUserTimingSpans","compressResponse","ts","ebs","dbs","compressContext","compressed","rf","h","mt","r","compressHTTP","dt","se","rc","ad","po","u","un","em","cu","compressMarks","compressedNtMarks","ntMarks","mark","mapping","compressNavigationTimingMarks","nt","compressAgentMarks","agentMarks","fb","rs","di","dc","fp","firstContentfulPaint","lp","largestContentfulPaint","compressPayload","params","isCompressionStreamSupported","CompressionStream","flagName","sessionStorage","getItem","URL","URLSearchParams","isFlagSet","searchParams","has","setItem","isBeaconInspectionEnabled","payload","beforeSend","compressedStream","Blob","stream","pipeThrough","Response","blob","isResponseSuccessful","_extends","assign","shouldUseFetchWithKeepAlive","isFetchSupported","Request","size","calculateSize","fetch","globalState","fetchInProgress","apmSymbol","patchMethod","patchFn","proto","getPrototypeOf","delegate","patched","original","propertyDesc","delegateName","desc","getOwnPropertyDescriptor","writable","set","patchDelegate","XHR_IGNORE","XHR_SYNC","XHR_URL","XHR_METHOD","sendXHR","_ref$timeout","timeout","HTTP_REQUEST_TIMEOUT","sendCredentials","xhr","open","withCredentials","header","onreadystatechange","readyState","responseText","onerror","canSend","send","ApmServer","loggingService","_loggingService","queue","throttleEvents","init","events","sendEvents","catch","_constructError","onThrottle","interval","counter","throttle","bind","observeEvent","_postJson","endPoint","_this2","_makeHttpRequest","_ref2","_ref2$timeout","fetchResponse","_ref$keepalive","keepalive","timeoutConfig","AbortController","controller","signal","abort","body","credentials","text","bodyResponse","sendFetchRequest","fetchConfig","serviceName","_this3","configEndpoint","getEndpoints","localConfig","getLocalConfig","etag","apmRequest","remoteConfig","getResponseHeader","setLocalConfig","createMetaData","cfg","metadata","language","_this$throttleEvents","addTransaction","_this$throttleEvents2","ndjsonErrors","errors","compress","_NDJSON$stringify","cl","mg","st","ap","f","li","co","c","tid","pid","xid","sm","compressError","ndjsonMetricsets","metricsets","metricset","ndjsonTransactions","transactions","_this4","tr","_NDJSON$stringify2","breakdowns","breakdown","spanData","s","sr","sample_rate","sy","su","ac","me","samples","isSpan","y","sa","ysc","yss","xdc","xds","xbc","yc","sd","experience","_transaction$experien","cls","fid","tbt","longtask","exp","lt","session","_transaction$session","sequence","ses","seq","compressTransaction","_payload","_NDJSON$stringify3","event","filteredPayload","applyFilters","ndjson","metadataKey","ve","la","en","compressMetadata","ndjsonPayload","intakeEndpoint","serverUrl","apiVersion","EventHandler","observers","observe","splice","sendOnly","obs","log","_serviceCreators","Config","config","serviceVersion","serverUrlPrefix","active","instrument","disableInstrumentations","logLevel","breakdownMetrics","ignoreTransactions","eventsLimit","distributedTracing","distributedTracingOrigins","distributedTracingHeaderName","pageLoadTraceId","pageLoadSampled","pageLoadTransactionName","propagateTracestate","transactionSampleRate","centralConfig","monitorLongtasks","filters","scriptData","node","dataAttrs","dataRegex","attrs","attributes","attr","nodeName","camelCasedkey","toUpperCase","nodeValue","getDataAttributesFromNode","setConfig","setVersion","addFilter","reduce","objKey","setUserContext","userContext","_userContext","setCustomContext","customContext","_properties","round","validate","requiredKeys","allKeys","missing","invalid","unknown","allowed","storage","localStorage","dispatchEvent","LoggingService","spec","levels","level","resetLogMethods","shouldLog","setLevel","normalizedLevel","realMethod","serviceCreators","ConfigService","factory","_factory$getService","getService","ServiceFactory","instances","initialized","_this$getService","patchXMLHttpRequest","XMLHttpRequestPrototype","openNative","sendNative","task","addListener","invokeTask","scheduleTask","patchEventHandler","alreadyPatched","patchAll","nativeFetch","input","request","fetchSelf","aborted","clonedResponse","clone","readStream","handleResponseError","isAbortError","reader","getReader","read","patchFetch","history","nativePushState","pushState","title","patchHistory","PerformanceMonitoring","_logginService","flags","TRANSACTION_END","createTransactionPayload","getHistorySub","getXHRSub","getFetchSub","startTransaction","managed","canReuse","processAPICalls","endpoints","some","endpoint","requestUrl","startSpan","blocking","isDtEnabled","dtOrigins","currentUrl","isSameOrigin","injectDtHeader","injectTSHeader","process","_data","_span","_target","endSpan","headerName","headerValue","dtVersion","getDtHeaderValue","getTSHeaderValue","extractDtHeader","parsed","parseDtHeaderValue","filterTransaction","isManaged","createTransactionDataModel","transactionStart","transactionData","breakdownTimings","adjustedTransaction","filterdSpans","similarSpans","originalSpans","transDuration","threshold","sort","spanA","spanB","lastCount","lastSpan","isContinuouslySimilar","isLastSpan","groupSmallContinuouslySimilarSpans","resetFields","adjustTransaction","pageLoadBreakdowns","getValue","getSpanBreakdown","transactionDetails","details","_ref$count","count","Transaction","_activeSpans","_activeTasks","blocked","random","markTime","reuseThreshold","redefine","trc","_onSpanEnd","addTask","isFinished","detectFinish","sid","captureBreakdown","trDuration","current","spanMap","transactionSelfTime","span1","span2","spanEnd","spanStart","lastContinuousEnd","selfTime","calculateSelfTime","groupSpans","_key$split","_spanMap$key","_captureBreakdown","block","flag","taskId","removeTask","delete","metrics","fcp","Infinity","score","firstEntryTime","NEGATIVE_INFINITY","prevEntryTime","currentSessionScore","captureObserverEntries","list","isHardNavigation","longtaskEntries","longtasks","agg","_longtasks$i","attribution","_attribution$","_name","containerType","containerName","containerId","createLongTaskSpans","lcpEntries","lastLcpEntry","lcp","unloadDiff","fcpEntry","getEntriesByName","fidSpan","fidEntries","firstInput","processingStart","createFirstInputDelaySpan","min","blockingTime","calculateTotalBlockingTime","clsEntries","hadRecentInput","calculateCumulativeLayoutShift","PerfEntryRecorder","disconnect","buffered","_","stop","TransactionService","logger","_config","_logger","respIntervalId","recorder","_tr$spans","_captureObserverEntri","createCurrentTransaction","createOptions","perfOptions","startManagedTransaction","isRedefined","redefineType","currentTypeOrder","redefineTypeOrder","fireOnstartHook","handleTransactionEnd","shouldIgnoreTransaction","tbtObject","tbtSpan","sum","setSession","urlStr","depth","pathParts","specialCharsRegex","digitsRegex","lowerCaseRegex","upperCaseRegex","redactedParts","redactedBefore","part","numberOfDigits","numberofUpperCase","lowerCaseRate","upperCaseRate","slugifyUrl","adjustTransactionTime","Date","sessionConfig","earliestSpan","_i4","getEarliestSpan","latestSpanEnd","getLatestNonXHRSpan","transactionEndWithoutDelay","latestXHRSpanEnd","getLatestXHRSpan","truncateSpans","transactionEnd","transactionName","ignoreList","element","createServiceFactory","serviceFactory","_serviceFactory$getSe","_serviceFactory$getSe2","enabled","bootstrap","onPageHidden","unobserve","observePageClicks","clickHandler","Element","_getTransactionMetada","tagName","dataset","getAttribute","classes","getTransactionMetadata","createUserInteractionTransaction","removeEventListener","ApmBase","disable","_disable","_initialized","isEnabled","isActive","disabledInstrumentations","_flags","getInstrumentationFlags","sendPageLoad","_sendPageLoadMetrics","fetchCentralConfig","visibilityState","visibilityChangeHandler","pageHideHandler","observePageVisibility","sendPageLoadMetrics","setInitialPageLoadName","captureError","apmBase","elasticApm","getApmBase"],"mappings":"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","file":"elastic-apm-rum.umd.min.js","sourcesContent":["(function(root, factory) {\n 'use strict';\n // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.\n\n /* istanbul ignore next */\n if (typeof define === 'function' && define.amd) {\n define('error-stack-parser', ['stackframe'], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory(require('stackframe'));\n } else {\n root.ErrorStackParser = factory(root.StackFrame);\n }\n}(this, function ErrorStackParser(StackFrame) {\n 'use strict';\n\n var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+\\:\\d+/;\n var CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+\\:\\d+|\\(native\\))/m;\n var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code\\])?$/;\n\n function _map(array, fn, thisArg) {\n if (typeof Array.prototype.map === 'function') {\n return array.map(fn, thisArg);\n } else {\n var output = new Array(array.length);\n for (var i = 0; i < array.length; i++) {\n output[i] = fn.call(thisArg, array[i]);\n }\n return output;\n }\n }\n\n function _filter(array, fn, thisArg) {\n if (typeof Array.prototype.filter === 'function') {\n return array.filter(fn, thisArg);\n } else {\n var output = [];\n for (var i = 0; i < array.length; i++) {\n if (fn.call(thisArg, array[i])) {\n output.push(array[i]);\n }\n }\n return output;\n }\n }\n\n function _indexOf(array, target) {\n if (typeof Array.prototype.indexOf === 'function') {\n return array.indexOf(target);\n } else {\n for (var i = 0; i < array.length; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n return -1;\n }\n }\n\n return {\n /**\n * Given an Error object, extract the most information from it.\n *\n * @param {Error} error object\n * @return {Array} of StackFrames\n */\n parse: function ErrorStackParser$$parse(error) {\n if (typeof error.stacktrace !== 'undefined' || typeof error['opera#sourceloc'] !== 'undefined') {\n return this.parseOpera(error);\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error);\n } else if (error.stack) {\n return this.parseFFOrSafari(error);\n } else {\n throw new Error('Cannot parse given Error object');\n }\n },\n\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\n extractLocation: function ErrorStackParser$$extractLocation(urlLike) {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n\n var regExp = /(.+?)(?:\\:(\\d+))?(?:\\:(\\d+))?$/;\n var parts = regExp.exec(urlLike.replace(/[\\(\\)]/g, ''));\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n\n parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) {\n var filtered = _filter(error.stack.split('\\n'), function(line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n\n return _map(filtered, function(line) {\n if (line.indexOf('(eval ') > -1) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n line = line.replace(/eval code/g, 'eval').replace(/(\\(eval at [^\\()]*)|(\\)\\,.*$)/g, '');\n }\n var tokens = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(').split(/\\s+/).slice(1);\n var locationParts = this.extractLocation(tokens.pop());\n var functionName = tokens.join(' ') || undefined;\n var fileName = _indexOf(['eval', ''], locationParts[0]) > -1 ? undefined : locationParts[0];\n\n return new StackFrame(functionName, undefined, fileName, locationParts[1], locationParts[2], line);\n }, this);\n },\n\n parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) {\n var filtered = _filter(error.stack.split('\\n'), function(line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n\n return _map(filtered, function(line) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(/ line (\\d+)(?: > eval line \\d+)* > eval\\:\\d+\\:\\d+/g, ':$1');\n }\n\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n // Safari eval frames only have function names and nothing else\n return new StackFrame(line);\n } else {\n var tokens = line.split('@');\n var locationParts = this.extractLocation(tokens.pop());\n var functionName = tokens.join('@') || undefined;\n return new StackFrame(functionName,\n undefined,\n locationParts[0],\n locationParts[1],\n locationParts[2],\n line);\n }\n }, this);\n },\n\n parseOpera: function ErrorStackParser$$parseOpera(e) {\n if (!e.stacktrace || (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)) {\n return this.parseOpera9(e);\n } else if (!e.stack) {\n return this.parseOpera10(e);\n } else {\n return this.parseOpera11(e);\n }\n },\n\n parseOpera9: function ErrorStackParser$$parseOpera9(e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n var lines = e.message.split('\\n');\n var result = [];\n\n for (var i = 2, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n if (match) {\n result.push(new StackFrame(undefined, undefined, match[2], match[1], undefined, lines[i]));\n }\n }\n\n return result;\n },\n\n parseOpera10: function ErrorStackParser$$parseOpera10(e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n var lines = e.stacktrace.split('\\n');\n var result = [];\n\n for (var i = 0, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame(\n match[3] || undefined,\n undefined,\n match[2],\n match[1],\n undefined,\n lines[i]\n )\n );\n }\n }\n\n return result;\n },\n\n // Opera 10.65+ Error.stack very similar to FF/Safari\n parseOpera11: function ErrorStackParser$$parseOpera11(error) {\n var filtered = _filter(error.stack.split('\\n'), function(line) {\n return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/);\n }, this);\n\n return _map(filtered, function(line) {\n var tokens = line.split('@');\n var locationParts = this.extractLocation(tokens.pop());\n var functionCall = (tokens.shift() || '');\n var functionName = functionCall\n .replace(//, '$2')\n .replace(/\\([^\\)]*\\)/g, '') || undefined;\n var argsRaw;\n if (functionCall.match(/\\(([^\\)]*)\\)/)) {\n argsRaw = functionCall.replace(/^[^\\(]+\\(([^\\)]*)\\)$/, '$1');\n }\n var args = (argsRaw === undefined || argsRaw === '[arguments not available]') ?\n undefined : argsRaw.split(',');\n return new StackFrame(\n functionName,\n args,\n locationParts[0],\n locationParts[1],\n locationParts[2],\n line);\n }, this);\n }\n };\n}));\n\n","(function (root, factory) {\n 'use strict';\n // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.\n\n /* istanbul ignore next */\n if (typeof define === 'function' && define.amd) {\n define('stackframe', [], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.StackFrame = factory();\n }\n}(this, function () {\n 'use strict';\n function _isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n }\n\n function StackFrame(functionName, args, fileName, lineNumber, columnNumber, source) {\n if (functionName !== undefined) {\n this.setFunctionName(functionName);\n }\n if (args !== undefined) {\n this.setArgs(args);\n }\n if (fileName !== undefined) {\n this.setFileName(fileName);\n }\n if (lineNumber !== undefined) {\n this.setLineNumber(lineNumber);\n }\n if (columnNumber !== undefined) {\n this.setColumnNumber(columnNumber);\n }\n if (source !== undefined) {\n this.setSource(source);\n }\n }\n\n StackFrame.prototype = {\n getFunctionName: function () {\n return this.functionName;\n },\n setFunctionName: function (v) {\n this.functionName = String(v);\n },\n\n getArgs: function () {\n return this.args;\n },\n setArgs: function (v) {\n if (Object.prototype.toString.call(v) !== '[object Array]') {\n throw new TypeError('Args must be an Array');\n }\n this.args = v;\n },\n\n // NOTE: Property name may be misleading as it includes the path,\n // but it somewhat mirrors V8's JavaScriptStackTraceApi\n // https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi and Gecko's\n // http://mxr.mozilla.org/mozilla-central/source/xpcom/base/nsIException.idl#14\n getFileName: function () {\n return this.fileName;\n },\n setFileName: function (v) {\n this.fileName = String(v);\n },\n\n getLineNumber: function () {\n return this.lineNumber;\n },\n setLineNumber: function (v) {\n if (!_isNumber(v)) {\n throw new TypeError('Line Number must be a Number');\n }\n this.lineNumber = Number(v);\n },\n\n getColumnNumber: function () {\n return this.columnNumber;\n },\n setColumnNumber: function (v) {\n if (!_isNumber(v)) {\n throw new TypeError('Column Number must be a Number');\n }\n this.columnNumber = Number(v);\n },\n\n getSource: function () {\n return this.source;\n },\n setSource: function (v) {\n this.source = String(v);\n },\n\n toString: function() {\n var functionName = this.getFunctionName() || '{anonymous}';\n var args = '(' + (this.getArgs() || []).join(',') + ')';\n var fileName = this.getFileName() ? ('@' + this.getFileName()) : '';\n var lineNumber = _isNumber(this.getLineNumber()) ? (':' + this.getLineNumber()) : '';\n var columnNumber = _isNumber(this.getColumnNumber()) ? (':' + this.getColumnNumber()) : '';\n return functionName + args + fileName + lineNumber + columnNumber;\n }\n };\n\n return StackFrame;\n}));\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","function filePathToFileName(fileUrl) {\n var origin = window.location.origin || window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : '');\n\n if (fileUrl.indexOf(origin) > -1) {\n fileUrl = fileUrl.replace(origin + '/', '');\n }\n\n return fileUrl;\n}\n\nfunction cleanFilePath(filePath) {\n if (filePath === void 0) {\n filePath = '';\n }\n\n if (filePath === '') {\n filePath = '';\n }\n\n return filePath;\n}\n\nfunction isFileInline(fileUrl) {\n if (fileUrl) {\n return window.location.href.indexOf(fileUrl) === 0;\n }\n\n return false;\n}\n\nfunction normalizeStackFrames(stackFrames) {\n return stackFrames.map(function (frame) {\n if (frame.functionName) {\n frame.functionName = normalizeFunctionName(frame.functionName);\n }\n\n return frame;\n });\n}\n\nfunction normalizeFunctionName(fnName) {\n var parts = fnName.split('/');\n\n if (parts.length > 1) {\n fnName = ['Object', parts[parts.length - 1]].join('.');\n } else {\n fnName = parts[0];\n }\n\n fnName = fnName.replace(/.<$/gi, '.');\n fnName = fnName.replace(/^Anonymous function$/, '');\n parts = fnName.split('.');\n\n if (parts.length > 1) {\n fnName = parts[parts.length - 1];\n } else {\n fnName = parts[0];\n }\n\n return fnName;\n}\n\nfunction isValidStackTrace(stackTraces) {\n if (stackTraces.length === 0) {\n return false;\n }\n\n if (stackTraces.length === 1) {\n var stackTrace = stackTraces[0];\n return 'lineNumber' in stackTrace;\n }\n\n return true;\n}\n\nexport function createStackTraces(stackParser, errorEvent) {\n var error = errorEvent.error,\n filename = errorEvent.filename,\n lineno = errorEvent.lineno,\n colno = errorEvent.colno;\n var stackTraces = [];\n\n if (error) {\n try {\n stackTraces = stackParser.parse(error);\n } catch (e) {}\n }\n\n if (!isValidStackTrace(stackTraces)) {\n stackTraces = [{\n fileName: filename,\n lineNumber: lineno,\n columnNumber: colno\n }];\n }\n\n var normalizedStackTraces = normalizeStackFrames(stackTraces);\n return normalizedStackTraces.map(function (stack) {\n var fileName = stack.fileName,\n lineNumber = stack.lineNumber,\n columnNumber = stack.columnNumber,\n _stack$functionName = stack.functionName,\n functionName = _stack$functionName === void 0 ? '' : _stack$functionName;\n\n if (!fileName && !lineNumber) {\n return {};\n }\n\n if (!columnNumber && !lineNumber) {\n return {};\n }\n\n var filePath = cleanFilePath(fileName);\n var cleanedFileName = filePathToFileName(filePath);\n\n if (isFileInline(filePath)) {\n cleanedFileName = '(inline script)';\n }\n\n return {\n abs_path: fileName,\n filename: cleanedFileName,\n function: functionName,\n lineno: lineNumber,\n colno: columnNumber\n };\n });\n}\nexport function filterInvalidFrames(frames) {\n return frames.filter(function (_ref) {\n var filename = _ref.filename,\n lineno = _ref.lineno;\n return typeof filename !== 'undefined' && typeof lineno !== 'undefined';\n });\n}","/**\n * @this {Promise}\n */\nfunction finallyConstructor(callback) {\n var constructor = this.constructor;\n return this.then(\n function(value) {\n // @ts-ignore\n return constructor.resolve(callback()).then(function() {\n return value;\n });\n },\n function(reason) {\n // @ts-ignore\n return constructor.resolve(callback()).then(function() {\n // @ts-ignore\n return constructor.reject(reason);\n });\n }\n );\n}\n\nexport default finallyConstructor;\n","import promiseFinally from './finally';\n\n// Store setTimeout reference so promise-polyfill will be unaffected by\n// other code modifying setTimeout (like sinon.useFakeTimers())\nvar setTimeoutFunc = setTimeout;\n\nfunction isArray(x) {\n return Boolean(x && typeof x.length !== 'undefined');\n}\n\nfunction noop() {}\n\n// Polyfill for Function.prototype.bind\nfunction bind(fn, thisArg) {\n return function() {\n fn.apply(thisArg, arguments);\n };\n}\n\n/**\n * @constructor\n * @param {Function} fn\n */\nfunction Promise(fn) {\n if (!(this instanceof Promise))\n throw new TypeError('Promises must be constructed via new');\n if (typeof fn !== 'function') throw new TypeError('not a function');\n /** @type {!number} */\n this._state = 0;\n /** @type {!boolean} */\n this._handled = false;\n /** @type {Promise|undefined} */\n this._value = undefined;\n /** @type {!Array} */\n this._deferreds = [];\n\n doResolve(fn, this);\n}\n\nfunction handle(self, deferred) {\n while (self._state === 3) {\n self = self._value;\n }\n if (self._state === 0) {\n self._deferreds.push(deferred);\n return;\n }\n self._handled = true;\n Promise._immediateFn(function() {\n var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n return;\n }\n var ret;\n try {\n ret = cb(self._value);\n } catch (e) {\n reject(deferred.promise, e);\n return;\n }\n resolve(deferred.promise, ret);\n });\n}\n\nfunction resolve(self, newValue) {\n try {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self)\n throw new TypeError('A promise cannot be resolved with itself.');\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = newValue.then;\n if (newValue instanceof Promise) {\n self._state = 3;\n self._value = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(bind(then, newValue), self);\n return;\n }\n }\n self._state = 1;\n self._value = newValue;\n finale(self);\n } catch (e) {\n reject(self, e);\n }\n}\n\nfunction reject(self, newValue) {\n self._state = 2;\n self._value = newValue;\n finale(self);\n}\n\nfunction finale(self) {\n if (self._state === 2 && self._deferreds.length === 0) {\n Promise._immediateFn(function() {\n if (!self._handled) {\n Promise._unhandledRejectionFn(self._value);\n }\n });\n }\n\n for (var i = 0, len = self._deferreds.length; i < len; i++) {\n handle(self, self._deferreds[i]);\n }\n self._deferreds = null;\n}\n\n/**\n * @constructor\n */\nfunction Handler(onFulfilled, onRejected, promise) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, self) {\n var done = false;\n try {\n fn(\n function(value) {\n if (done) return;\n done = true;\n resolve(self, value);\n },\n function(reason) {\n if (done) return;\n done = true;\n reject(self, reason);\n }\n );\n } catch (ex) {\n if (done) return;\n done = true;\n reject(self, ex);\n }\n}\n\nPromise.prototype['catch'] = function(onRejected) {\n return this.then(null, onRejected);\n};\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n // @ts-ignore\n var prom = new this.constructor(noop);\n\n handle(this, new Handler(onFulfilled, onRejected, prom));\n return prom;\n};\n\nPromise.prototype['finally'] = promiseFinally;\n\nPromise.all = function(arr) {\n return new Promise(function(resolve, reject) {\n if (!isArray(arr)) {\n return reject(new TypeError('Promise.all accepts an array'));\n }\n\n var args = Array.prototype.slice.call(arr);\n if (args.length === 0) return resolve([]);\n var remaining = args.length;\n\n function res(i, val) {\n try {\n if (val && (typeof val === 'object' || typeof val === 'function')) {\n var then = val.then;\n if (typeof then === 'function') {\n then.call(\n val,\n function(val) {\n res(i, val);\n },\n reject\n );\n return;\n }\n }\n args[i] = val;\n if (--remaining === 0) {\n resolve(args);\n }\n } catch (ex) {\n reject(ex);\n }\n }\n\n for (var i = 0; i < args.length; i++) {\n res(i, args[i]);\n }\n });\n};\n\nPromise.resolve = function(value) {\n if (value && typeof value === 'object' && value.constructor === Promise) {\n return value;\n }\n\n return new Promise(function(resolve) {\n resolve(value);\n });\n};\n\nPromise.reject = function(value) {\n return new Promise(function(resolve, reject) {\n reject(value);\n });\n};\n\nPromise.race = function(arr) {\n return new Promise(function(resolve, reject) {\n if (!isArray(arr)) {\n return reject(new TypeError('Promise.race accepts an array'));\n }\n\n for (var i = 0, len = arr.length; i < len; i++) {\n Promise.resolve(arr[i]).then(resolve, reject);\n }\n });\n};\n\n// Use polyfill for setImmediate for performance gains\nPromise._immediateFn =\n // @ts-ignore\n (typeof setImmediate === 'function' &&\n function(fn) {\n // @ts-ignore\n setImmediate(fn);\n }) ||\n function(fn) {\n setTimeoutFunc(fn, 0);\n };\n\nPromise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n if (typeof console !== 'undefined' && console) {\n console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n }\n};\n\nexport default Promise;\n","import PromisePollyfill from 'promise-polyfill';\nimport { isBrowser } from './utils';\nvar local = {};\n\nif (isBrowser) {\n local = window;\n} else if (typeof self !== 'undefined') {\n local = self;\n}\n\nvar Promise = 'Promise' in local ? local.Promise : PromisePollyfill;\nexport { Promise };","import { Promise } from './polyfills';\nvar slice = [].slice;\nvar isBrowser = typeof window !== 'undefined';\nvar PERF = isBrowser && typeof performance !== 'undefined' ? performance : {};\n\nfunction isCORSSupported() {\n var xhr = new window.XMLHttpRequest();\n return 'withCredentials' in xhr;\n}\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToHex(buffer) {\n var hexOctets = [];\n\n for (var _i = 0; _i < buffer.length; _i++) {\n hexOctets.push(byteToHex[buffer[_i]]);\n }\n\n return hexOctets.join('');\n}\n\nvar destination = new Uint8Array(16);\n\nfunction rng() {\n if (typeof crypto != 'undefined' && typeof crypto.getRandomValues == 'function') {\n return crypto.getRandomValues(destination);\n } else if (typeof msCrypto != 'undefined' && typeof msCrypto.getRandomValues == 'function') {\n return msCrypto.getRandomValues(destination);\n }\n\n return destination;\n}\n\nfunction generateRandomId(length) {\n var id = bytesToHex(rng());\n return id.substr(0, length);\n}\n\nfunction getDtHeaderValue(span) {\n var dtVersion = '00';\n var dtUnSampledFlags = '00';\n var dtSampledFlags = '01';\n\n if (span && span.traceId && span.id && span.parentId) {\n var flags = span.sampled ? dtSampledFlags : dtUnSampledFlags;\n var id = span.sampled ? span.id : span.parentId;\n return dtVersion + '-' + span.traceId + '-' + id + '-' + flags;\n }\n}\n\nfunction parseDtHeaderValue(value) {\n var parsed = /^([\\da-f]{2})-([\\da-f]{32})-([\\da-f]{16})-([\\da-f]{2})$/.exec(value);\n\n if (parsed) {\n var flags = parsed[4];\n var sampled = flags !== '00';\n return {\n traceId: parsed[2],\n id: parsed[3],\n sampled: sampled\n };\n }\n}\n\nfunction isDtHeaderValid(header) {\n return /^[\\da-f]{2}-[\\da-f]{32}-[\\da-f]{16}-[\\da-f]{2}$/.test(header) && header.slice(3, 35) !== '00000000000000000000000000000000' && header.slice(36, 52) !== '0000000000000000';\n}\n\nfunction getTSHeaderValue(_ref) {\n var sampleRate = _ref.sampleRate;\n\n if (typeof sampleRate !== 'number' || String(sampleRate).length > 256) {\n return;\n }\n\n var NAMESPACE = 'es';\n var SEPARATOR = '=';\n return \"\" + NAMESPACE + SEPARATOR + \"s:\" + sampleRate;\n}\n\nfunction setRequestHeader(target, name, value) {\n if (typeof target.setRequestHeader === 'function') {\n target.setRequestHeader(name, value);\n } else if (target.headers && typeof target.headers.append === 'function') {\n target.headers.append(name, value);\n } else {\n target[name] = value;\n }\n}\n\nfunction checkSameOrigin(source, target) {\n var isSame = false;\n\n if (typeof target === 'string') {\n isSame = source === target;\n } else if (target && typeof target.test === 'function') {\n isSame = target.test(source);\n } else if (Array.isArray(target)) {\n target.forEach(function (t) {\n if (!isSame) {\n isSame = checkSameOrigin(source, t);\n }\n });\n }\n\n return isSame;\n}\n\nfunction isPlatformSupported() {\n return isBrowser && typeof Set === 'function' && typeof JSON.stringify === 'function' && PERF && typeof PERF.now === 'function' && isCORSSupported();\n}\n\nfunction setLabel(key, value, obj) {\n if (!obj || !key) return;\n var skey = removeInvalidChars(key);\n var valueType = typeof value;\n\n if (value != undefined && valueType !== 'boolean' && valueType !== 'number') {\n value = String(value);\n }\n\n obj[skey] = value;\n return obj;\n}\n\nfunction getServerTimingInfo(serverTimingEntries) {\n if (serverTimingEntries === void 0) {\n serverTimingEntries = [];\n }\n\n var serverTimingInfo = [];\n var entrySeparator = ', ';\n var valueSeparator = ';';\n\n for (var _i2 = 0; _i2 < serverTimingEntries.length; _i2++) {\n var _serverTimingEntries$ = serverTimingEntries[_i2],\n name = _serverTimingEntries$.name,\n duration = _serverTimingEntries$.duration,\n description = _serverTimingEntries$.description;\n var timingValue = name;\n\n if (description) {\n timingValue += valueSeparator + 'desc=' + description;\n }\n\n if (duration) {\n timingValue += valueSeparator + 'dur=' + duration;\n }\n\n serverTimingInfo.push(timingValue);\n }\n\n return serverTimingInfo.join(entrySeparator);\n}\n\nfunction getTimeOrigin() {\n return PERF.timing.fetchStart;\n}\n\nfunction stripQueryStringFromUrl(url) {\n return url && url.split('?')[0];\n}\n\nfunction isObject(value) {\n return value !== null && typeof value === 'object';\n}\n\nfunction isFunction(value) {\n return typeof value === 'function';\n}\n\nfunction baseExtend(dst, objs, deep) {\n for (var i = 0, ii = objs.length; i < ii; ++i) {\n var obj = objs[i];\n if (!isObject(obj) && !isFunction(obj)) continue;\n var keys = Object.keys(obj);\n\n for (var j = 0, jj = keys.length; j < jj; j++) {\n var key = keys[j];\n var src = obj[key];\n\n if (deep && isObject(src)) {\n if (!isObject(dst[key])) dst[key] = Array.isArray(src) ? [] : {};\n baseExtend(dst[key], [src], false);\n } else {\n dst[key] = src;\n }\n }\n }\n\n return dst;\n}\n\nfunction getElasticScript() {\n if (typeof document !== 'undefined') {\n var scripts = document.getElementsByTagName('script');\n\n for (var i = 0, l = scripts.length; i < l; i++) {\n var sc = scripts[i];\n\n if (sc.src.indexOf('elastic') > 0) {\n return sc;\n }\n }\n }\n}\n\nfunction getCurrentScript() {\n if (typeof document !== 'undefined') {\n var currentScript = document.currentScript;\n\n if (!currentScript) {\n return getElasticScript();\n }\n\n return currentScript;\n }\n}\n\nfunction extend(dst) {\n return baseExtend(dst, slice.call(arguments, 1), false);\n}\n\nfunction merge(dst) {\n return baseExtend(dst, slice.call(arguments, 1), true);\n}\n\nfunction isUndefined(obj) {\n return typeof obj === 'undefined';\n}\n\nfunction noop() {}\n\nfunction find(array, predicate, thisArg) {\n if (array == null) {\n throw new TypeError('array is null or not defined');\n }\n\n var o = Object(array);\n var len = o.length >>> 0;\n\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n }\n\n var k = 0;\n\n while (k < len) {\n var kValue = o[k];\n\n if (predicate.call(thisArg, kValue, k, o)) {\n return kValue;\n }\n\n k++;\n }\n\n return undefined;\n}\n\nfunction removeInvalidChars(key) {\n return key.replace(/[.*\"]/g, '_');\n}\n\nfunction getLatestSpan(spans, typeFilter) {\n var latestSpan = null;\n\n for (var _i3 = 0; _i3 < spans.length; _i3++) {\n var span = spans[_i3];\n\n if (typeFilter && typeFilter(span.type) && (!latestSpan || latestSpan._end < span._end)) {\n latestSpan = span;\n }\n }\n\n return latestSpan;\n}\n\nfunction getLatestNonXHRSpan(spans) {\n return getLatestSpan(spans, function (type) {\n return String(type).indexOf('external') === -1;\n });\n}\n\nfunction getLatestXHRSpan(spans) {\n return getLatestSpan(spans, function (type) {\n return String(type).indexOf('external') !== -1;\n });\n}\n\nfunction getEarliestSpan(spans) {\n var earliestSpan = spans[0];\n\n for (var _i4 = 1; _i4 < spans.length; _i4++) {\n var span = spans[_i4];\n\n if (earliestSpan._start > span._start) {\n earliestSpan = span;\n }\n }\n\n return earliestSpan;\n}\n\nfunction now() {\n return PERF.now();\n}\n\nfunction getTime(time) {\n return typeof time === 'number' && time >= 0 ? time : now();\n}\n\nfunction getDuration(start, end) {\n if (isUndefined(end) || isUndefined(start)) {\n return null;\n }\n\n return parseInt(end - start);\n}\n\nfunction scheduleMacroTask(callback) {\n setTimeout(callback, 0);\n}\n\nfunction scheduleMicroTask(callback) {\n Promise.resolve().then(callback);\n}\n\nfunction isPerfTimelineSupported() {\n return typeof PERF.getEntriesByType === 'function';\n}\n\nfunction isPerfTypeSupported(type) {\n return typeof PerformanceObserver !== 'undefined' && PerformanceObserver.supportedEntryTypes && PerformanceObserver.supportedEntryTypes.indexOf(type) >= 0;\n}\n\nfunction isBeaconInspectionEnabled() {\n var flagName = '_elastic_inspect_beacon_';\n\n if (sessionStorage.getItem(flagName) != null) {\n return true;\n }\n\n if (!window.URL || !window.URLSearchParams) {\n return false;\n }\n\n try {\n var parsedUrl = new URL(window.location.href);\n var isFlagSet = parsedUrl.searchParams.has(flagName);\n\n if (isFlagSet) {\n sessionStorage.setItem(flagName, true);\n }\n\n return isFlagSet;\n } catch (e) {}\n\n return false;\n}\n\nexport { extend, merge, isUndefined, noop, baseExtend, bytesToHex, isCORSSupported, isObject, isFunction, isPlatformSupported, isDtHeaderValid, parseDtHeaderValue, getServerTimingInfo, getDtHeaderValue, getTSHeaderValue, getCurrentScript, getElasticScript, getTimeOrigin, generateRandomId, getEarliestSpan, getLatestNonXHRSpan, getLatestXHRSpan, getDuration, getTime, now, rng, checkSameOrigin, scheduleMacroTask, scheduleMicroTask, setLabel, setRequestHeader, stripQueryStringFromUrl, find, removeInvalidChars, PERF, isPerfTimelineSupported, isBrowser, isPerfTypeSupported, isBeaconInspectionEnabled };","import { isBrowser } from './utils';\n\nfunction isDefaultPort(port, protocol) {\n switch (protocol) {\n case 'http:':\n return port === '80';\n\n case 'https:':\n return port === '443';\n }\n\n return true;\n}\n\nvar RULES = [['#', 'hash'], ['?', 'query'], ['/', 'path'], ['@', 'auth', 1], [NaN, 'host', undefined, 1]];\nvar PROTOCOL_REGEX = /^([a-z][a-z0-9.+-]*:)?(\\/\\/)?([\\S\\s]*)/i;\nexport var Url = function () {\n function Url(url) {\n var _this$extractProtocol = this.extractProtocol(url || ''),\n protocol = _this$extractProtocol.protocol,\n address = _this$extractProtocol.address,\n slashes = _this$extractProtocol.slashes;\n\n var relative = !protocol && !slashes;\n var location = this.getLocation();\n var instructions = RULES.slice();\n address = address.replace('\\\\', '/');\n\n if (!slashes) {\n instructions[2] = [NaN, 'path'];\n }\n\n var index;\n\n for (var i = 0; i < instructions.length; i++) {\n var instruction = instructions[i];\n var parse = instruction[0];\n var key = instruction[1];\n\n if (typeof parse === 'string') {\n index = address.indexOf(parse);\n\n if (~index) {\n var instLength = instruction[2];\n\n if (instLength) {\n var newIndex = address.lastIndexOf(parse);\n index = Math.max(index, newIndex);\n this[key] = address.slice(0, index);\n address = address.slice(index + instLength);\n } else {\n this[key] = address.slice(index);\n address = address.slice(0, index);\n }\n }\n } else {\n this[key] = address;\n address = '';\n }\n\n this[key] = this[key] || (relative && instruction[3] ? location[key] || '' : '');\n if (instruction[3]) this[key] = this[key].toLowerCase();\n }\n\n if (relative && this.path.charAt(0) !== '/') {\n this.path = '/' + this.path;\n }\n\n this.relative = relative;\n this.protocol = protocol || location.protocol;\n this.hostname = this.host;\n this.port = '';\n\n if (/:\\d+$/.test(this.host)) {\n var value = this.host.split(':');\n var port = value.pop();\n var hostname = value.join(':');\n\n if (isDefaultPort(port, this.protocol)) {\n this.host = hostname;\n } else {\n this.port = port;\n }\n\n this.hostname = hostname;\n }\n\n this.origin = this.protocol && this.host && this.protocol !== 'file:' ? this.protocol + '//' + this.host : 'null';\n this.href = this.toString();\n }\n\n var _proto = Url.prototype;\n\n _proto.toString = function toString() {\n var result = this.protocol;\n result += '//';\n\n if (this.auth) {\n var REDACTED = '[REDACTED]';\n var userpass = this.auth.split(':');\n var username = userpass[0] ? REDACTED : '';\n var password = userpass[1] ? ':' + REDACTED : '';\n result += username + password + '@';\n }\n\n result += this.host;\n result += this.path;\n result += this.query;\n result += this.hash;\n return result;\n };\n\n _proto.getLocation = function getLocation() {\n var globalVar = {};\n\n if (isBrowser) {\n globalVar = window;\n }\n\n return globalVar.location;\n };\n\n _proto.extractProtocol = function extractProtocol(url) {\n var match = PROTOCOL_REGEX.exec(url);\n return {\n protocol: match[1] ? match[1].toLowerCase() : '',\n slashes: !!match[2],\n address: match[3]\n };\n };\n\n return Url;\n}();\nexport function slugifyUrl(urlStr, depth) {\n if (depth === void 0) {\n depth = 2;\n }\n\n var parsedUrl = new Url(urlStr);\n var query = parsedUrl.query,\n path = parsedUrl.path;\n var pathParts = path.substring(1).split('/');\n var redactString = ':id';\n var wildcard = '*';\n var specialCharsRegex = /\\W|_/g;\n var digitsRegex = /[0-9]/g;\n var lowerCaseRegex = /[a-z]/g;\n var upperCaseRegex = /[A-Z]/g;\n var redactedParts = [];\n var redactedBefore = false;\n\n for (var index = 0; index < pathParts.length; index++) {\n var part = pathParts[index];\n\n if (redactedBefore || index > depth - 1) {\n if (part) {\n redactedParts.push(wildcard);\n }\n\n break;\n }\n\n var numberOfSpecialChars = (part.match(specialCharsRegex) || []).length;\n\n if (numberOfSpecialChars >= 2) {\n redactedParts.push(redactString);\n redactedBefore = true;\n continue;\n }\n\n var numberOfDigits = (part.match(digitsRegex) || []).length;\n\n if (numberOfDigits > 3 || part.length > 3 && numberOfDigits / part.length >= 0.3) {\n redactedParts.push(redactString);\n redactedBefore = true;\n continue;\n }\n\n var numberofUpperCase = (part.match(upperCaseRegex) || []).length;\n var numberofLowerCase = (part.match(lowerCaseRegex) || []).length;\n var lowerCaseRate = numberofLowerCase / part.length;\n var upperCaseRate = numberofUpperCase / part.length;\n\n if (part.length > 5 && (upperCaseRate > 0.3 && upperCaseRate < 0.6 || lowerCaseRate > 0.3 && lowerCaseRate < 0.6)) {\n redactedParts.push(redactString);\n redactedBefore = true;\n continue;\n }\n\n part && redactedParts.push(part);\n }\n\n var redacted = '/' + (redactedParts.length >= 2 ? redactedParts.join('/') : redactedParts.join('')) + (query ? '?{query}' : '');\n return redacted;\n}","var SCHEDULE = 'schedule';\nvar INVOKE = 'invoke';\nvar ADD_EVENT_LISTENER_STR = 'addEventListener';\nvar REMOVE_EVENT_LISTENER_STR = 'removeEventListener';\nvar RESOURCE_INITIATOR_TYPES = ['link', 'css', 'script', 'img', 'xmlhttprequest', 'fetch', 'beacon', 'iframe'];\nvar REUSABILITY_THRESHOLD = 5000;\nvar MAX_SPAN_DURATION = 5 * 60 * 1000;\nvar PAGE_LOAD_DELAY = 1000;\nvar PAGE_LOAD = 'page-load';\nvar ROUTE_CHANGE = 'route-change';\nvar TYPE_CUSTOM = 'custom';\nvar USER_INTERACTION = 'user-interaction';\nvar HTTP_REQUEST_TYPE = 'http-request';\nvar TEMPORARY_TYPE = 'temporary';\nvar NAME_UNKNOWN = 'Unknown';\nvar TRANSACTION_TYPE_ORDER = [PAGE_LOAD, ROUTE_CHANGE, USER_INTERACTION, HTTP_REQUEST_TYPE, TYPE_CUSTOM, TEMPORARY_TYPE];\nvar OUTCOME_SUCCESS = 'success';\nvar OUTCOME_FAILURE = 'failure';\nvar OUTCOME_UNKNOWN = 'unknown';\nvar USER_TIMING_THRESHOLD = 60;\nvar TRANSACTION_START = 'transaction:start';\nvar TRANSACTION_END = 'transaction:end';\nvar CONFIG_CHANGE = 'config:change';\nvar QUEUE_FLUSH = 'queue:flush';\nvar QUEUE_ADD_TRANSACTION = 'queue:add_transaction';\nvar XMLHTTPREQUEST = 'xmlhttprequest';\nvar FETCH = 'fetch';\nvar HISTORY = 'history';\nvar EVENT_TARGET = 'eventtarget';\nvar CLICK = 'click';\nvar ERROR = 'error';\nvar BEFORE_EVENT = ':before';\nvar AFTER_EVENT = ':after';\nvar LOCAL_CONFIG_KEY = 'elastic_apm_config';\nvar LONG_TASK = 'longtask';\nvar PAINT = 'paint';\nvar MEASURE = 'measure';\nvar NAVIGATION = 'navigation';\nvar RESOURCE = 'resource';\nvar FIRST_CONTENTFUL_PAINT = 'first-contentful-paint';\nvar LARGEST_CONTENTFUL_PAINT = 'largest-contentful-paint';\nvar FIRST_INPUT = 'first-input';\nvar LAYOUT_SHIFT = 'layout-shift';\nvar ERRORS = 'errors';\nvar TRANSACTIONS = 'transactions';\nvar CONFIG_SERVICE = 'ConfigService';\nvar LOGGING_SERVICE = 'LoggingService';\nvar TRANSACTION_SERVICE = 'TransactionService';\nvar APM_SERVER = 'ApmServer';\nvar PERFORMANCE_MONITORING = 'PerformanceMonitoring';\nvar ERROR_LOGGING = 'ErrorLogging';\nvar TRUNCATED_TYPE = '.truncated';\nvar KEYWORD_LIMIT = 1024;\nvar SESSION_TIMEOUT = 30 * 60000;\nvar HTTP_REQUEST_TIMEOUT = 10000;\nexport { SCHEDULE, INVOKE, ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, RESOURCE_INITIATOR_TYPES, REUSABILITY_THRESHOLD, MAX_SPAN_DURATION, PAGE_LOAD_DELAY, PAGE_LOAD, ROUTE_CHANGE, NAME_UNKNOWN, TYPE_CUSTOM, USER_TIMING_THRESHOLD, TRANSACTION_START, TRANSACTION_END, CONFIG_CHANGE, QUEUE_FLUSH, QUEUE_ADD_TRANSACTION, XMLHTTPREQUEST, FETCH, HISTORY, EVENT_TARGET, CLICK, ERROR, BEFORE_EVENT, AFTER_EVENT, LOCAL_CONFIG_KEY, HTTP_REQUEST_TYPE, LONG_TASK, PAINT, MEASURE, NAVIGATION, RESOURCE, FIRST_CONTENTFUL_PAINT, LARGEST_CONTENTFUL_PAINT, KEYWORD_LIMIT, TEMPORARY_TYPE, USER_INTERACTION, TRANSACTION_TYPE_ORDER, ERRORS, TRANSACTIONS, CONFIG_SERVICE, LOGGING_SERVICE, TRANSACTION_SERVICE, APM_SERVER, PERFORMANCE_MONITORING, ERROR_LOGGING, TRUNCATED_TYPE, FIRST_INPUT, LAYOUT_SHIFT, OUTCOME_SUCCESS, OUTCOME_FAILURE, OUTCOME_UNKNOWN, SESSION_TIMEOUT, HTTP_REQUEST_TIMEOUT };","var _excluded = [\"tags\"];\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport { Url } from './url';\nimport { PAGE_LOAD, NAVIGATION } from './constants';\nimport { getServerTimingInfo, PERF, isPerfTimelineSupported } from './utils';\nvar LEFT_SQUARE_BRACKET = 91;\nvar RIGHT_SQUARE_BRACKET = 93;\nvar EXTERNAL = 'external';\nvar RESOURCE = 'resource';\nvar HARD_NAVIGATION = 'hard-navigation';\n\nfunction getPortNumber(port, protocol) {\n if (port === '') {\n port = protocol === 'http:' ? '80' : protocol === 'https:' ? '443' : '';\n }\n\n return port;\n}\n\nfunction getResponseContext(perfTimingEntry) {\n var transferSize = perfTimingEntry.transferSize,\n encodedBodySize = perfTimingEntry.encodedBodySize,\n decodedBodySize = perfTimingEntry.decodedBodySize,\n serverTiming = perfTimingEntry.serverTiming;\n var respContext = {\n transfer_size: transferSize,\n encoded_body_size: encodedBodySize,\n decoded_body_size: decodedBodySize\n };\n var serverTimingStr = getServerTimingInfo(serverTiming);\n\n if (serverTimingStr) {\n respContext.headers = {\n 'server-timing': serverTimingStr\n };\n }\n\n return respContext;\n}\n\nfunction getDestination(parsedUrl) {\n var port = parsedUrl.port,\n protocol = parsedUrl.protocol,\n hostname = parsedUrl.hostname;\n var portNumber = getPortNumber(port, protocol);\n var ipv6Hostname = hostname.charCodeAt(0) === LEFT_SQUARE_BRACKET && hostname.charCodeAt(hostname.length - 1) === RIGHT_SQUARE_BRACKET;\n var address = hostname;\n\n if (ipv6Hostname) {\n address = hostname.slice(1, -1);\n }\n\n return {\n service: {\n resource: hostname + ':' + portNumber,\n name: '',\n type: ''\n },\n address: address,\n port: Number(portNumber)\n };\n}\n\nfunction getResourceContext(data) {\n var entry = data.entry,\n url = data.url;\n var parsedUrl = new Url(url);\n var destination = getDestination(parsedUrl);\n return {\n http: {\n url: url,\n response: getResponseContext(entry)\n },\n destination: destination\n };\n}\n\nfunction getExternalContext(data) {\n var url = data.url,\n method = data.method,\n target = data.target,\n response = data.response;\n var parsedUrl = new Url(url);\n var destination = getDestination(parsedUrl);\n var context = {\n http: {\n method: method,\n url: parsedUrl.href\n },\n destination: destination\n };\n var statusCode;\n\n if (target && typeof target.status !== 'undefined') {\n statusCode = target.status;\n } else if (response) {\n statusCode = response.status;\n }\n\n context.http.status_code = statusCode;\n return context;\n}\n\nfunction getNavigationContext(data) {\n var url = data.url;\n var parsedUrl = new Url(url);\n var destination = getDestination(parsedUrl);\n return {\n destination: destination\n };\n}\n\nexport function getPageContext() {\n return {\n page: {\n referer: document.referrer,\n url: location.href\n }\n };\n}\nexport function addSpanContext(span, data) {\n if (!data) {\n return;\n }\n\n var type = span.type;\n var context;\n\n switch (type) {\n case EXTERNAL:\n context = getExternalContext(data);\n break;\n\n case RESOURCE:\n context = getResourceContext(data);\n break;\n\n case HARD_NAVIGATION:\n context = getNavigationContext(data);\n break;\n }\n\n span.addContext(context);\n}\nexport function addTransactionContext(transaction, _temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n tags = _ref.tags,\n configContext = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n var pageContext = getPageContext();\n var responseContext = {};\n\n if (transaction.type === PAGE_LOAD && isPerfTimelineSupported()) {\n var entries = PERF.getEntriesByType(NAVIGATION);\n\n if (entries && entries.length > 0) {\n responseContext = {\n response: getResponseContext(entries[0])\n };\n }\n }\n\n transaction.addContext(pageContext, responseContext, configContext);\n}","import { KEYWORD_LIMIT } from './constants';\nvar METADATA_MODEL = {\n service: {\n name: [KEYWORD_LIMIT, true],\n version: true,\n agent: {\n version: [KEYWORD_LIMIT, true]\n },\n environment: true\n },\n labels: {\n '*': true\n }\n};\nvar RESPONSE_MODEL = {\n '*': true,\n headers: {\n '*': true\n }\n};\nvar DESTINATION_MODEL = {\n address: [KEYWORD_LIMIT],\n service: {\n '*': [KEYWORD_LIMIT, true]\n }\n};\nvar CONTEXT_MODEL = {\n user: {\n id: true,\n email: true,\n username: true\n },\n tags: {\n '*': true\n },\n http: {\n response: RESPONSE_MODEL\n },\n destination: DESTINATION_MODEL,\n response: RESPONSE_MODEL\n};\nvar SPAN_MODEL = {\n name: [KEYWORD_LIMIT, true],\n type: [KEYWORD_LIMIT, true],\n id: [KEYWORD_LIMIT, true],\n trace_id: [KEYWORD_LIMIT, true],\n parent_id: [KEYWORD_LIMIT, true],\n transaction_id: [KEYWORD_LIMIT, true],\n subtype: true,\n action: true,\n context: CONTEXT_MODEL\n};\nvar TRANSACTION_MODEL = {\n name: true,\n parent_id: true,\n type: [KEYWORD_LIMIT, true],\n id: [KEYWORD_LIMIT, true],\n trace_id: [KEYWORD_LIMIT, true],\n span_count: {\n started: [KEYWORD_LIMIT, true]\n },\n context: CONTEXT_MODEL\n};\nvar ERROR_MODEL = {\n id: [KEYWORD_LIMIT, true],\n trace_id: true,\n transaction_id: true,\n parent_id: true,\n culprit: true,\n exception: {\n type: true\n },\n transaction: {\n type: true\n },\n context: CONTEXT_MODEL\n};\n\nfunction truncate(value, limit, required, placeholder) {\n if (limit === void 0) {\n limit = KEYWORD_LIMIT;\n }\n\n if (required === void 0) {\n required = false;\n }\n\n if (placeholder === void 0) {\n placeholder = 'N/A';\n }\n\n if (required && isEmpty(value)) {\n value = placeholder;\n }\n\n if (typeof value === 'string') {\n return value.substring(0, limit);\n }\n\n return value;\n}\n\nfunction isEmpty(value) {\n return value == null || value === '' || typeof value === 'undefined';\n}\n\nfunction replaceValue(target, key, currModel) {\n var value = truncate(target[key], currModel[0], currModel[1]);\n\n if (isEmpty(value)) {\n delete target[key];\n return;\n }\n\n target[key] = value;\n}\n\nfunction truncateModel(model, target, childTarget) {\n if (model === void 0) {\n model = {};\n }\n\n if (childTarget === void 0) {\n childTarget = target;\n }\n\n var keys = Object.keys(model);\n var emptyArr = [];\n\n var _loop = function _loop(i) {\n var currKey = keys[i];\n var currModel = model[currKey] === true ? emptyArr : model[currKey];\n\n if (!Array.isArray(currModel)) {\n truncateModel(currModel, target, childTarget[currKey]);\n } else {\n if (currKey === '*') {\n Object.keys(childTarget).forEach(function (key) {\n return replaceValue(childTarget, key, currModel);\n });\n } else {\n replaceValue(childTarget, currKey, currModel);\n }\n }\n };\n\n for (var i = 0; i < keys.length; i++) {\n _loop(i);\n }\n\n return target;\n}\n\nexport { truncate, truncateModel, SPAN_MODEL, TRANSACTION_MODEL, ERROR_MODEL, METADATA_MODEL, RESPONSE_MODEL };","var _excluded = [\"tags\"];\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport { createStackTraces, filterInvalidFrames } from './stack-trace';\nimport { generateRandomId, merge, extend } from '../common/utils';\nimport { getPageContext } from '../common/context';\nimport { truncateModel, ERROR_MODEL } from '../common/truncate';\nimport stackParser from 'error-stack-parser';\nvar IGNORE_KEYS = ['stack', 'message'];\n\nfunction getErrorProperties(error) {\n var propertyFound = false;\n var properties = {};\n Object.keys(error).forEach(function (key) {\n if (IGNORE_KEYS.indexOf(key) >= 0) {\n return;\n }\n\n var val = error[key];\n\n if (val == null || typeof val === 'function') {\n return;\n }\n\n if (typeof val === 'object') {\n if (typeof val.toISOString !== 'function') return;\n val = val.toISOString();\n }\n\n properties[key] = val;\n propertyFound = true;\n });\n\n if (propertyFound) {\n return properties;\n }\n}\n\nvar ErrorLogging = function () {\n function ErrorLogging(apmServer, configService, transactionService) {\n this._apmServer = apmServer;\n this._configService = configService;\n this._transactionService = transactionService;\n }\n\n var _proto = ErrorLogging.prototype;\n\n _proto.createErrorDataModel = function createErrorDataModel(errorEvent) {\n var frames = createStackTraces(stackParser, errorEvent);\n var filteredFrames = filterInvalidFrames(frames);\n var culprit = '(inline script)';\n var lastFrame = filteredFrames[filteredFrames.length - 1];\n\n if (lastFrame && lastFrame.filename) {\n culprit = lastFrame.filename;\n }\n\n var message = errorEvent.message,\n error = errorEvent.error;\n var errorMessage = message;\n var errorType = '';\n var errorContext = {};\n\n if (error && typeof error === 'object') {\n errorMessage = errorMessage || error.message;\n errorType = error.name;\n var customProperties = getErrorProperties(error);\n\n if (customProperties) {\n errorContext.custom = customProperties;\n }\n }\n\n if (!errorType) {\n if (errorMessage && errorMessage.indexOf(':') > -1) {\n errorType = errorMessage.split(':')[0];\n }\n }\n\n var currentTransaction = this._transactionService.getCurrentTransaction();\n\n var transactionContext = currentTransaction ? currentTransaction.context : {};\n\n var _this$_configService$ = this._configService.get('context'),\n tags = _this$_configService$.tags,\n configContext = _objectWithoutPropertiesLoose(_this$_configService$, _excluded);\n\n var pageContext = getPageContext();\n var context = merge({}, pageContext, transactionContext, configContext, errorContext);\n var errorObject = {\n id: generateRandomId(),\n culprit: culprit,\n exception: {\n message: errorMessage,\n stacktrace: filteredFrames,\n type: errorType\n },\n context: context\n };\n\n if (currentTransaction) {\n errorObject = extend(errorObject, {\n trace_id: currentTransaction.traceId,\n parent_id: currentTransaction.id,\n transaction_id: currentTransaction.id,\n transaction: {\n type: currentTransaction.type,\n sampled: currentTransaction.sampled\n }\n });\n }\n\n return truncateModel(ERROR_MODEL, errorObject);\n };\n\n _proto.logErrorEvent = function logErrorEvent(errorEvent) {\n if (typeof errorEvent === 'undefined') {\n return;\n }\n\n var errorObject = this.createErrorDataModel(errorEvent);\n\n if (typeof errorObject.exception.message === 'undefined') {\n return;\n }\n\n this._apmServer.addError(errorObject);\n };\n\n _proto.registerListeners = function registerListeners() {\n var _this = this;\n\n window.addEventListener('error', function (errorEvent) {\n return _this.logErrorEvent(errorEvent);\n });\n window.addEventListener('unhandledrejection', function (promiseRejectionEvent) {\n return _this.logPromiseEvent(promiseRejectionEvent);\n });\n };\n\n _proto.logPromiseEvent = function logPromiseEvent(promiseRejectionEvent) {\n var prefix = 'Unhandled promise rejection: ';\n var reason = promiseRejectionEvent.reason;\n\n if (reason == null) {\n reason = '';\n }\n\n var errorEvent;\n\n if (typeof reason.message === 'string') {\n var name = reason.name ? reason.name + ': ' : '';\n errorEvent = {\n error: reason,\n message: prefix + name + reason.message\n };\n } else {\n reason = typeof reason === 'object' ? '' : typeof reason === 'function' ? '' : reason;\n errorEvent = {\n message: prefix + reason\n };\n }\n\n this.logErrorEvent(errorEvent);\n };\n\n _proto.logError = function logError(messageOrError) {\n var errorEvent = {};\n\n if (typeof messageOrError === 'string') {\n errorEvent.message = messageOrError;\n } else {\n errorEvent.error = messageOrError;\n }\n\n return this.logErrorEvent(errorEvent);\n };\n\n return ErrorLogging;\n}();\n\nexport default ErrorLogging;","var Queue = function () {\n function Queue(onFlush, opts) {\n if (opts === void 0) {\n opts = {};\n }\n\n this.onFlush = onFlush;\n this.items = [];\n this.queueLimit = opts.queueLimit || -1;\n this.flushInterval = opts.flushInterval || 0;\n this.timeoutId = undefined;\n }\n\n var _proto = Queue.prototype;\n\n _proto._setTimer = function _setTimer() {\n var _this = this;\n\n this.timeoutId = setTimeout(function () {\n return _this.flush();\n }, this.flushInterval);\n };\n\n _proto._clear = function _clear() {\n if (typeof this.timeoutId !== 'undefined') {\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n }\n\n this.items = [];\n };\n\n _proto.flush = function flush() {\n this.onFlush(this.items);\n\n this._clear();\n };\n\n _proto.add = function add(item) {\n this.items.push(item);\n\n if (this.queueLimit !== -1 && this.items.length >= this.queueLimit) {\n this.flush();\n } else {\n if (typeof this.timeoutId === 'undefined') {\n this._setTimer();\n }\n }\n };\n\n return Queue;\n}();\n\nexport default Queue;","var NDJSON = function () {\n function NDJSON() {}\n\n NDJSON.stringify = function stringify(object) {\n return JSON.stringify(object) + '\\n';\n };\n\n return NDJSON;\n}();\n\nexport default NDJSON;","import { generateRandomId, setLabel, merge, getDuration, getTime } from '../common/utils';\nimport { NAME_UNKNOWN, TYPE_CUSTOM } from '../common/constants';\n\nvar SpanBase = function () {\n function SpanBase(name, type, options) {\n if (options === void 0) {\n options = {};\n }\n\n if (!name) {\n name = NAME_UNKNOWN;\n }\n\n if (!type) {\n type = TYPE_CUSTOM;\n }\n\n this.name = name;\n this.type = type;\n this.options = options;\n this.id = options.id || generateRandomId(16);\n this.traceId = options.traceId;\n this.sampled = options.sampled;\n this.sampleRate = options.sampleRate;\n this.timestamp = options.timestamp;\n this._start = getTime(options.startTime);\n this._end = undefined;\n this.ended = false;\n this.outcome = undefined;\n this.onEnd = options.onEnd;\n }\n\n var _proto = SpanBase.prototype;\n\n _proto.ensureContext = function ensureContext() {\n if (!this.context) {\n this.context = {};\n }\n };\n\n _proto.addLabels = function addLabels(tags) {\n this.ensureContext();\n var ctx = this.context;\n\n if (!ctx.tags) {\n ctx.tags = {};\n }\n\n var keys = Object.keys(tags);\n keys.forEach(function (k) {\n return setLabel(k, tags[k], ctx.tags);\n });\n };\n\n _proto.addContext = function addContext() {\n for (var _len = arguments.length, context = new Array(_len), _key = 0; _key < _len; _key++) {\n context[_key] = arguments[_key];\n }\n\n if (context.length === 0) return;\n this.ensureContext();\n merge.apply(void 0, [this.context].concat(context));\n };\n\n _proto.end = function end(endTime) {\n if (this.ended) {\n return;\n }\n\n this.ended = true;\n this._end = getTime(endTime);\n this.callOnEnd();\n };\n\n _proto.callOnEnd = function callOnEnd() {\n if (typeof this.onEnd === 'function') {\n this.onEnd(this);\n }\n };\n\n _proto.duration = function duration() {\n return getDuration(this._start, this._end);\n };\n\n return SpanBase;\n}();\n\nexport default SpanBase;","function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nimport SpanBase from './span-base';\nimport { addSpanContext } from '../common/context';\n\nvar Span = function (_SpanBase) {\n _inheritsLoose(Span, _SpanBase);\n\n function Span(name, type, options) {\n var _this;\n\n _this = _SpanBase.call(this, name, type, options) || this;\n _this.parentId = _this.options.parentId;\n _this.subtype = undefined;\n _this.action = undefined;\n\n if (_this.type.indexOf('.') !== -1) {\n var fields = _this.type.split('.', 3);\n\n _this.type = fields[0];\n _this.subtype = fields[1];\n _this.action = fields[2];\n }\n\n _this.sync = _this.options.sync;\n return _this;\n }\n\n var _proto = Span.prototype;\n\n _proto.end = function end(endTime, data) {\n _SpanBase.prototype.end.call(this, endTime);\n\n addSpanContext(this, data);\n };\n\n return Span;\n}(SpanBase);\n\nexport default Span;","var __DEV__ = process.env.NODE_ENV !== 'production';\n\nvar state = {\n bootstrapTime: null,\n lastHiddenStart: Number.MIN_SAFE_INTEGER\n};\nexport { __DEV__, state };","import Span from './span';\nimport { RESOURCE_INITIATOR_TYPES, MAX_SPAN_DURATION, USER_TIMING_THRESHOLD, PAGE_LOAD, RESOURCE, MEASURE } from '../common/constants';\nimport { stripQueryStringFromUrl, PERF, isPerfTimelineSupported } from '../common/utils';\nimport { state } from '../state';\nvar eventPairs = [['domainLookupStart', 'domainLookupEnd', 'Domain lookup'], ['connectStart', 'connectEnd', 'Making a connection to the server'], ['requestStart', 'responseEnd', 'Requesting and receiving the document'], ['domLoading', 'domInteractive', 'Parsing the document, executing sync. scripts'], ['domContentLoadedEventStart', 'domContentLoadedEventEnd', 'Fire \"DOMContentLoaded\" event'], ['loadEventStart', 'loadEventEnd', 'Fire \"load\" event']];\n\nfunction shouldCreateSpan(start, end, trStart, trEnd, baseTime) {\n if (baseTime === void 0) {\n baseTime = 0;\n }\n\n return typeof start === 'number' && typeof end === 'number' && start >= baseTime && end > start && start - baseTime >= trStart && end - baseTime <= trEnd && end - start < MAX_SPAN_DURATION && start - baseTime < MAX_SPAN_DURATION && end - baseTime < MAX_SPAN_DURATION;\n}\n\nfunction createNavigationTimingSpans(timings, baseTime, trStart, trEnd) {\n var spans = [];\n\n for (var i = 0; i < eventPairs.length; i++) {\n var start = timings[eventPairs[i][0]];\n var end = timings[eventPairs[i][1]];\n\n if (!shouldCreateSpan(start, end, trStart, trEnd, baseTime)) {\n continue;\n }\n\n var span = new Span(eventPairs[i][2], 'hard-navigation.browser-timing');\n var data = null;\n\n if (eventPairs[i][0] === 'requestStart') {\n span.pageResponse = true;\n data = {\n url: location.origin\n };\n }\n\n span._start = start - baseTime;\n span.end(end - baseTime, data);\n spans.push(span);\n }\n\n return spans;\n}\n\nfunction createResourceTimingSpan(resourceTimingEntry) {\n var name = resourceTimingEntry.name,\n initiatorType = resourceTimingEntry.initiatorType,\n startTime = resourceTimingEntry.startTime,\n responseEnd = resourceTimingEntry.responseEnd;\n var kind = 'resource';\n\n if (initiatorType) {\n kind += '.' + initiatorType;\n }\n\n var spanName = stripQueryStringFromUrl(name);\n var span = new Span(spanName, kind);\n span._start = startTime;\n span.end(responseEnd, {\n url: name,\n entry: resourceTimingEntry\n });\n return span;\n}\n\nfunction isCapturedByPatching(resourceStartTime, requestPatchTime) {\n return requestPatchTime != null && resourceStartTime > requestPatchTime;\n}\n\nfunction isIntakeAPIEndpoint(url) {\n return /intake\\/v\\d+\\/rum\\/events/.test(url);\n}\n\nfunction createResourceTimingSpans(entries, requestPatchTime, trStart, trEnd) {\n var spans = [];\n\n for (var i = 0; i < entries.length; i++) {\n var _entries$i = entries[i],\n initiatorType = _entries$i.initiatorType,\n name = _entries$i.name,\n startTime = _entries$i.startTime,\n responseEnd = _entries$i.responseEnd;\n\n if (RESOURCE_INITIATOR_TYPES.indexOf(initiatorType) === -1 || name == null) {\n continue;\n }\n\n if ((initiatorType === 'xmlhttprequest' || initiatorType === 'fetch') && (isIntakeAPIEndpoint(name) || isCapturedByPatching(startTime, requestPatchTime))) {\n continue;\n }\n\n if (shouldCreateSpan(startTime, responseEnd, trStart, trEnd)) {\n spans.push(createResourceTimingSpan(entries[i]));\n }\n }\n\n return spans;\n}\n\nfunction createUserTimingSpans(entries, trStart, trEnd) {\n var userTimingSpans = [];\n\n for (var i = 0; i < entries.length; i++) {\n var _entries$i2 = entries[i],\n name = _entries$i2.name,\n startTime = _entries$i2.startTime,\n duration = _entries$i2.duration;\n var end = startTime + duration;\n\n if (duration <= USER_TIMING_THRESHOLD || !shouldCreateSpan(startTime, end, trStart, trEnd)) {\n continue;\n }\n\n var kind = 'app';\n var span = new Span(name, kind);\n span._start = startTime;\n span.end(end);\n userTimingSpans.push(span);\n }\n\n return userTimingSpans;\n}\n\nvar NAVIGATION_TIMING_MARKS = ['fetchStart', 'domainLookupStart', 'domainLookupEnd', 'connectStart', 'connectEnd', 'requestStart', 'responseStart', 'responseEnd', 'domLoading', 'domInteractive', 'domContentLoadedEventStart', 'domContentLoadedEventEnd', 'domComplete', 'loadEventStart', 'loadEventEnd'];\nvar COMPRESSED_NAV_TIMING_MARKS = ['fs', 'ls', 'le', 'cs', 'ce', 'qs', 'rs', 're', 'dl', 'di', 'ds', 'de', 'dc', 'es', 'ee'];\n\nfunction getNavigationTimingMarks(timing) {\n var fetchStart = timing.fetchStart,\n navigationStart = timing.navigationStart,\n responseStart = timing.responseStart,\n responseEnd = timing.responseEnd;\n\n if (fetchStart >= navigationStart && responseStart >= fetchStart && responseEnd >= responseStart) {\n var marks = {};\n NAVIGATION_TIMING_MARKS.forEach(function (timingKey) {\n var m = timing[timingKey];\n\n if (m && m >= fetchStart) {\n marks[timingKey] = parseInt(m - fetchStart);\n }\n });\n return marks;\n }\n\n return null;\n}\n\nfunction getPageLoadMarks(timing) {\n var marks = getNavigationTimingMarks(timing);\n\n if (marks == null) {\n return null;\n }\n\n return {\n navigationTiming: marks,\n agent: {\n timeToFirstByte: marks.responseStart,\n domInteractive: marks.domInteractive,\n domComplete: marks.domComplete\n }\n };\n}\n\nfunction captureNavigation(transaction) {\n if (!transaction.captureTimings) {\n return;\n }\n\n var trEnd = transaction._end;\n\n if (transaction.type === PAGE_LOAD) {\n if (transaction.marks && transaction.marks.custom) {\n var customMarks = transaction.marks.custom;\n Object.keys(customMarks).forEach(function (key) {\n customMarks[key] += transaction._start;\n });\n }\n\n var trStart = 0;\n transaction._start = trStart;\n var timings = PERF.timing;\n createNavigationTimingSpans(timings, timings.fetchStart, trStart, trEnd).forEach(function (span) {\n span.traceId = transaction.traceId;\n span.sampled = transaction.sampled;\n\n if (span.pageResponse && transaction.options.pageLoadSpanId) {\n span.id = transaction.options.pageLoadSpanId;\n }\n\n transaction.spans.push(span);\n });\n transaction.addMarks(getPageLoadMarks(timings));\n }\n\n if (isPerfTimelineSupported()) {\n var _trStart = transaction._start;\n var resourceEntries = PERF.getEntriesByType(RESOURCE);\n createResourceTimingSpans(resourceEntries, state.bootstrapTime, _trStart, trEnd).forEach(function (span) {\n return transaction.spans.push(span);\n });\n var userEntries = PERF.getEntriesByType(MEASURE);\n createUserTimingSpans(userEntries, _trStart, trEnd).forEach(function (span) {\n return transaction.spans.push(span);\n });\n }\n}\n\nexport { getPageLoadMarks, captureNavigation, createNavigationTimingSpans, createResourceTimingSpans, createUserTimingSpans, NAVIGATION_TIMING_MARKS, COMPRESSED_NAV_TIMING_MARKS };","import { Promise } from './polyfills';\nimport { NAVIGATION_TIMING_MARKS, COMPRESSED_NAV_TIMING_MARKS } from '../performance-monitoring/capture-navigation';\nimport { isBeaconInspectionEnabled } from './utils';\n\nfunction compressStackFrames(frames) {\n return frames.map(function (frame) {\n return {\n ap: frame.abs_path,\n f: frame.filename,\n fn: frame.function,\n li: frame.lineno,\n co: frame.colno\n };\n });\n}\n\nfunction compressResponse(response) {\n return {\n ts: response.transfer_size,\n ebs: response.encoded_body_size,\n dbs: response.decoded_body_size\n };\n}\n\nfunction compressHTTP(http) {\n var compressed = {};\n var method = http.method,\n status_code = http.status_code,\n url = http.url,\n response = http.response;\n compressed.url = url;\n\n if (method) {\n compressed.mt = method;\n }\n\n if (status_code) {\n compressed.sc = status_code;\n }\n\n if (response) {\n compressed.r = compressResponse(response);\n }\n\n return compressed;\n}\n\nfunction compressContext(context) {\n if (!context) {\n return null;\n }\n\n var compressed = {};\n var page = context.page,\n http = context.http,\n response = context.response,\n destination = context.destination,\n user = context.user,\n custom = context.custom;\n\n if (page) {\n compressed.p = {\n rf: page.referer,\n url: page.url\n };\n }\n\n if (http) {\n compressed.h = compressHTTP(http);\n }\n\n if (response) {\n compressed.r = compressResponse(response);\n }\n\n if (destination) {\n var service = destination.service;\n compressed.dt = {\n se: {\n n: service.name,\n t: service.type,\n rc: service.resource\n },\n ad: destination.address,\n po: destination.port\n };\n }\n\n if (user) {\n compressed.u = {\n id: user.id,\n un: user.username,\n em: user.email\n };\n }\n\n if (custom) {\n compressed.cu = custom;\n }\n\n return compressed;\n}\n\nfunction compressMarks(marks) {\n if (!marks) {\n return null;\n }\n\n var compressedNtMarks = compressNavigationTimingMarks(marks.navigationTiming);\n var compressed = {\n nt: compressedNtMarks,\n a: compressAgentMarks(compressedNtMarks, marks.agent)\n };\n return compressed;\n}\n\nfunction compressNavigationTimingMarks(ntMarks) {\n if (!ntMarks) {\n return null;\n }\n\n var compressed = {};\n COMPRESSED_NAV_TIMING_MARKS.forEach(function (mark, index) {\n var mapping = NAVIGATION_TIMING_MARKS[index];\n compressed[mark] = ntMarks[mapping];\n });\n return compressed;\n}\n\nfunction compressAgentMarks(compressedNtMarks, agentMarks) {\n var compressed = {};\n\n if (compressedNtMarks) {\n compressed = {\n fb: compressedNtMarks.rs,\n di: compressedNtMarks.di,\n dc: compressedNtMarks.dc\n };\n }\n\n if (agentMarks) {\n var fp = agentMarks.firstContentfulPaint;\n var lp = agentMarks.largestContentfulPaint;\n\n if (fp) {\n compressed.fp = fp;\n }\n\n if (lp) {\n compressed.lp = lp;\n }\n }\n\n if (Object.keys(compressed).length === 0) {\n return null;\n }\n\n return compressed;\n}\n\nexport function compressMetadata(metadata) {\n var service = metadata.service,\n labels = metadata.labels;\n var agent = service.agent,\n language = service.language;\n return {\n se: {\n n: service.name,\n ve: service.version,\n a: {\n n: agent.name,\n ve: agent.version\n },\n la: {\n n: language.name\n },\n en: service.environment\n },\n l: labels\n };\n}\nexport function compressTransaction(transaction) {\n var spans = transaction.spans.map(function (span) {\n var spanData = {\n id: span.id,\n n: span.name,\n t: span.type,\n s: span.start,\n d: span.duration,\n c: compressContext(span.context),\n o: span.outcome,\n sr: span.sample_rate\n };\n\n if (span.parent_id !== transaction.id) {\n spanData.pid = span.parent_id;\n }\n\n if (span.sync === true) {\n spanData.sy = true;\n }\n\n if (span.subtype) {\n spanData.su = span.subtype;\n }\n\n if (span.action) {\n spanData.ac = span.action;\n }\n\n return spanData;\n });\n var tr = {\n id: transaction.id,\n tid: transaction.trace_id,\n n: transaction.name,\n t: transaction.type,\n d: transaction.duration,\n c: compressContext(transaction.context),\n k: compressMarks(transaction.marks),\n me: compressMetricsets(transaction.breakdown),\n y: spans,\n yc: {\n sd: spans.length\n },\n sm: transaction.sampled,\n sr: transaction.sample_rate,\n o: transaction.outcome\n };\n\n if (transaction.experience) {\n var _transaction$experien = transaction.experience,\n cls = _transaction$experien.cls,\n fid = _transaction$experien.fid,\n tbt = _transaction$experien.tbt,\n longtask = _transaction$experien.longtask;\n tr.exp = {\n cls: cls,\n fid: fid,\n tbt: tbt,\n lt: longtask\n };\n }\n\n if (transaction.session) {\n var _transaction$session = transaction.session,\n id = _transaction$session.id,\n sequence = _transaction$session.sequence;\n tr.ses = {\n id: id,\n seq: sequence\n };\n }\n\n return tr;\n}\nexport function compressError(error) {\n var exception = error.exception;\n var compressed = {\n id: error.id,\n cl: error.culprit,\n ex: {\n mg: exception.message,\n st: compressStackFrames(exception.stacktrace),\n t: error.type\n },\n c: compressContext(error.context)\n };\n var transaction = error.transaction;\n\n if (transaction) {\n compressed.tid = error.trace_id;\n compressed.pid = error.parent_id;\n compressed.xid = error.transaction_id;\n compressed.x = {\n t: transaction.type,\n sm: transaction.sampled\n };\n }\n\n return compressed;\n}\nexport function compressMetricsets(breakdowns) {\n return breakdowns.map(function (_ref) {\n var span = _ref.span,\n samples = _ref.samples;\n var isSpan = span != null;\n\n if (isSpan) {\n return {\n y: {\n t: span.type\n },\n sa: {\n ysc: {\n v: samples['span.self_time.count'].value\n },\n yss: {\n v: samples['span.self_time.sum.us'].value\n }\n }\n };\n }\n\n return {\n sa: {\n xdc: {\n v: samples['transaction.duration.count'].value\n },\n xds: {\n v: samples['transaction.duration.sum.us'].value\n },\n xbc: {\n v: samples['transaction.breakdown.count'].value\n }\n }\n };\n });\n}\nexport function compressPayload(params, type) {\n if (type === void 0) {\n type = 'gzip';\n }\n\n var isCompressionStreamSupported = typeof CompressionStream === 'function';\n return new Promise(function (resolve) {\n if (!isCompressionStreamSupported) {\n return resolve(params);\n }\n\n if (isBeaconInspectionEnabled()) {\n return resolve(params);\n }\n\n var payload = params.payload,\n headers = params.headers,\n beforeSend = params.beforeSend;\n var payloadStream = new Blob([payload]).stream();\n var compressedStream = payloadStream.pipeThrough(new CompressionStream(type));\n return new Response(compressedStream).blob().then(function (payload) {\n headers['Content-Encoding'] = type;\n return resolve({\n payload: payload,\n headers: headers,\n beforeSend: beforeSend\n });\n });\n });\n}","export function isResponseSuccessful(status) {\n if (status === 0 || status > 399 && status < 600) {\n return false;\n }\n\n return true;\n}","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport { HTTP_REQUEST_TIMEOUT } from '../constants';\nimport { isResponseSuccessful } from './response-status';\nexport var BYTE_LIMIT = 60 * 1000;\nexport function shouldUseFetchWithKeepAlive(method, payload) {\n if (!isFetchSupported()) {\n return false;\n }\n\n var isKeepAliveSupported = ('keepalive' in new Request(''));\n\n if (!isKeepAliveSupported) {\n return false;\n }\n\n var size = calculateSize(payload);\n return method === 'POST' && size < BYTE_LIMIT;\n}\nexport function sendFetchRequest(method, url, _ref) {\n var _ref$keepalive = _ref.keepalive,\n keepalive = _ref$keepalive === void 0 ? false : _ref$keepalive,\n _ref$timeout = _ref.timeout,\n timeout = _ref$timeout === void 0 ? HTTP_REQUEST_TIMEOUT : _ref$timeout,\n payload = _ref.payload,\n headers = _ref.headers,\n sendCredentials = _ref.sendCredentials;\n var timeoutConfig = {};\n\n if (typeof AbortController === 'function') {\n var controller = new AbortController();\n timeoutConfig.signal = controller.signal;\n setTimeout(function () {\n return controller.abort();\n }, timeout);\n }\n\n var fetchResponse;\n return window.fetch(url, _extends({\n body: payload,\n headers: headers,\n method: method,\n keepalive: keepalive,\n credentials: sendCredentials ? 'include' : 'omit'\n }, timeoutConfig)).then(function (response) {\n fetchResponse = response;\n return fetchResponse.text();\n }).then(function (responseText) {\n var bodyResponse = {\n url: url,\n status: fetchResponse.status,\n responseText: responseText\n };\n\n if (!isResponseSuccessful(fetchResponse.status)) {\n throw bodyResponse;\n }\n\n return bodyResponse;\n });\n}\nexport function isFetchSupported() {\n return typeof window.fetch === 'function' && typeof window.Request === 'function';\n}\n\nfunction calculateSize(payload) {\n if (!payload) {\n return 0;\n }\n\n if (payload instanceof Blob) {\n return payload.size;\n }\n\n return new Blob([payload]).size;\n}","export var globalState = {\n fetchInProgress: false\n};\nexport function apmSymbol(name) {\n return '__apm_symbol__' + name;\n}\n\nfunction isPropertyWritable(propertyDesc) {\n if (!propertyDesc) {\n return true;\n }\n\n if (propertyDesc.writable === false) {\n return false;\n }\n\n return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined');\n}\n\nfunction attachOriginToPatched(patched, original) {\n patched[apmSymbol('OriginalDelegate')] = original;\n}\n\nexport function patchMethod(target, name, patchFn) {\n var proto = target;\n\n while (proto && !proto.hasOwnProperty(name)) {\n proto = Object.getPrototypeOf(proto);\n }\n\n if (!proto && target[name]) {\n proto = target;\n }\n\n var delegateName = apmSymbol(name);\n var delegate;\n\n if (proto && !(delegate = proto[delegateName])) {\n delegate = proto[delegateName] = proto[name];\n var desc = proto && Object.getOwnPropertyDescriptor(proto, name);\n\n if (isPropertyWritable(desc)) {\n var patchDelegate = patchFn(delegate, delegateName, name);\n\n proto[name] = function () {\n return patchDelegate(this, arguments);\n };\n\n attachOriginToPatched(proto[name], delegate);\n }\n }\n\n return delegate;\n}\nexport var XHR_IGNORE = apmSymbol('xhrIgnore');\nexport var XHR_SYNC = apmSymbol('xhrSync');\nexport var XHR_URL = apmSymbol('xhrURL');\nexport var XHR_METHOD = apmSymbol('xhrMethod');","import { XHR_IGNORE } from '../patching/patch-utils';\nimport { isResponseSuccessful } from './response-status';\nimport { Promise } from '../polyfills';\nexport function sendXHR(method, url, _ref) {\n var _ref$timeout = _ref.timeout,\n timeout = _ref$timeout === void 0 ? HTTP_REQUEST_TIMEOUT : _ref$timeout,\n payload = _ref.payload,\n headers = _ref.headers,\n beforeSend = _ref.beforeSend,\n sendCredentials = _ref.sendCredentials;\n return new Promise(function (resolve, reject) {\n var xhr = new window.XMLHttpRequest();\n xhr[XHR_IGNORE] = true;\n xhr.open(method, url, true);\n xhr.timeout = timeout;\n xhr.withCredentials = sendCredentials;\n\n if (headers) {\n for (var header in headers) {\n if (headers.hasOwnProperty(header)) {\n xhr.setRequestHeader(header, headers[header]);\n }\n }\n }\n\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n var status = xhr.status,\n responseText = xhr.responseText;\n\n if (isResponseSuccessful(status)) {\n resolve(xhr);\n } else {\n reject({\n url: url,\n status: status,\n responseText: responseText\n });\n }\n }\n };\n\n xhr.onerror = function () {\n var status = xhr.status,\n responseText = xhr.responseText;\n reject({\n url: url,\n status: status,\n responseText: responseText\n });\n };\n\n var canSend = true;\n\n if (typeof beforeSend === 'function') {\n canSend = beforeSend({\n url: url,\n method: method,\n headers: headers,\n payload: payload,\n xhr: xhr\n });\n }\n\n if (canSend) {\n xhr.send(payload);\n } else {\n reject({\n url: url,\n status: 0,\n responseText: 'Request rejected by user configuration.'\n });\n }\n });\n}","import Queue from './queue';\nimport throttle from './throttle';\nimport NDJSON from './ndjson';\nimport { truncateModel, METADATA_MODEL } from './truncate';\nimport { ERRORS, HTTP_REQUEST_TIMEOUT, QUEUE_FLUSH, TRANSACTIONS } from './constants';\nimport { noop } from './utils';\nimport { Promise } from './polyfills';\nimport { compressMetadata, compressTransaction, compressError, compressPayload } from './compress';\nimport { __DEV__ } from '../state';\nimport { sendFetchRequest, shouldUseFetchWithKeepAlive } from './http/fetch';\nimport { sendXHR } from './http/xhr';\nvar THROTTLE_INTERVAL = 60000;\n\nvar ApmServer = function () {\n function ApmServer(configService, loggingService) {\n this._configService = configService;\n this._loggingService = loggingService;\n this.queue = undefined;\n this.throttleEvents = noop;\n }\n\n var _proto = ApmServer.prototype;\n\n _proto.init = function init() {\n var _this = this;\n\n var queueLimit = this._configService.get('queueLimit');\n\n var flushInterval = this._configService.get('flushInterval');\n\n var limit = this._configService.get('eventsLimit');\n\n var onFlush = function onFlush(events) {\n var promise = _this.sendEvents(events);\n\n if (promise) {\n promise.catch(function (reason) {\n _this._loggingService.warn('Failed sending events!', _this._constructError(reason));\n });\n }\n };\n\n this.queue = new Queue(onFlush, {\n queueLimit: queueLimit,\n flushInterval: flushInterval\n });\n this.throttleEvents = throttle(this.queue.add.bind(this.queue), function () {\n return _this._loggingService.warn('Dropped events due to throttling!');\n }, {\n limit: limit,\n interval: THROTTLE_INTERVAL\n });\n\n this._configService.observeEvent(QUEUE_FLUSH, function () {\n _this.queue.flush();\n });\n };\n\n _proto._postJson = function _postJson(endPoint, payload) {\n var _this2 = this;\n\n var headers = {\n 'Content-Type': 'application/x-ndjson'\n };\n\n var apmRequest = this._configService.get('apmRequest');\n\n var params = {\n payload: payload,\n headers: headers,\n beforeSend: apmRequest\n };\n return compressPayload(params).catch(function (error) {\n if (__DEV__) {\n _this2._loggingService.debug('Compressing the payload using CompressionStream API failed', error.message);\n }\n\n return params;\n }).then(function (result) {\n return _this2._makeHttpRequest('POST', endPoint, result);\n }).then(function (_ref) {\n var responseText = _ref.responseText;\n return responseText;\n });\n };\n\n _proto._constructError = function _constructError(reason) {\n var url = reason.url,\n status = reason.status,\n responseText = reason.responseText;\n\n if (typeof status == 'undefined') {\n return reason;\n }\n\n var message = url + ' HTTP status: ' + status;\n\n if (__DEV__ && responseText) {\n try {\n var serverErrors = [];\n var response = JSON.parse(responseText);\n\n if (response.errors && response.errors.length > 0) {\n response.errors.forEach(function (err) {\n return serverErrors.push(err.message);\n });\n message += ' ' + serverErrors.join(',');\n }\n } catch (e) {\n this._loggingService.debug('Error parsing response from APM server', e);\n }\n }\n\n return new Error(message);\n };\n\n _proto._makeHttpRequest = function _makeHttpRequest(method, url, _temp) {\n var _ref2 = _temp === void 0 ? {} : _temp,\n _ref2$timeout = _ref2.timeout,\n timeout = _ref2$timeout === void 0 ? HTTP_REQUEST_TIMEOUT : _ref2$timeout,\n payload = _ref2.payload,\n headers = _ref2.headers,\n beforeSend = _ref2.beforeSend;\n\n var sendCredentials = this._configService.get('sendCredentials');\n\n if (!beforeSend && shouldUseFetchWithKeepAlive(method, payload)) {\n return sendFetchRequest(method, url, {\n keepalive: true,\n timeout: timeout,\n payload: payload,\n headers: headers,\n sendCredentials: sendCredentials\n }).catch(function (reason) {\n if (reason instanceof TypeError) {\n return sendXHR(method, url, {\n timeout: timeout,\n payload: payload,\n headers: headers,\n beforeSend: beforeSend,\n sendCredentials: sendCredentials\n });\n }\n\n throw reason;\n });\n }\n\n return sendXHR(method, url, {\n timeout: timeout,\n payload: payload,\n headers: headers,\n beforeSend: beforeSend,\n sendCredentials: sendCredentials\n });\n };\n\n _proto.fetchConfig = function fetchConfig(serviceName, environment) {\n var _this3 = this;\n\n var _this$getEndpoints = this.getEndpoints(),\n configEndpoint = _this$getEndpoints.configEndpoint;\n\n if (!serviceName) {\n return Promise.reject('serviceName is required for fetching central config.');\n }\n\n configEndpoint += \"?service.name=\" + serviceName;\n\n if (environment) {\n configEndpoint += \"&service.environment=\" + environment;\n }\n\n var localConfig = this._configService.getLocalConfig();\n\n if (localConfig) {\n configEndpoint += \"&ifnonematch=\" + localConfig.etag;\n }\n\n var apmRequest = this._configService.get('apmRequest');\n\n return this._makeHttpRequest('GET', configEndpoint, {\n timeout: 5000,\n beforeSend: apmRequest\n }).then(function (xhr) {\n var status = xhr.status,\n responseText = xhr.responseText;\n\n if (status === 304) {\n return localConfig;\n } else {\n var remoteConfig = JSON.parse(responseText);\n var etag = xhr.getResponseHeader('etag');\n\n if (etag) {\n remoteConfig.etag = etag.replace(/[\"]/g, '');\n\n _this3._configService.setLocalConfig(remoteConfig, true);\n }\n\n return remoteConfig;\n }\n }).catch(function (reason) {\n var error = _this3._constructError(reason);\n\n return Promise.reject(error);\n });\n };\n\n _proto.createMetaData = function createMetaData() {\n var cfg = this._configService;\n var metadata = {\n service: {\n name: cfg.get('serviceName'),\n version: cfg.get('serviceVersion'),\n agent: {\n name: 'rum-js',\n version: cfg.version\n },\n language: {\n name: 'javascript'\n },\n environment: cfg.get('environment')\n },\n labels: cfg.get('context.tags')\n };\n return truncateModel(METADATA_MODEL, metadata);\n };\n\n _proto.addError = function addError(error) {\n var _this$throttleEvents;\n\n this.throttleEvents((_this$throttleEvents = {}, _this$throttleEvents[ERRORS] = error, _this$throttleEvents));\n };\n\n _proto.addTransaction = function addTransaction(transaction) {\n var _this$throttleEvents2;\n\n this.throttleEvents((_this$throttleEvents2 = {}, _this$throttleEvents2[TRANSACTIONS] = transaction, _this$throttleEvents2));\n };\n\n _proto.ndjsonErrors = function ndjsonErrors(errors, compress) {\n var key = compress ? 'e' : 'error';\n return errors.map(function (error) {\n var _NDJSON$stringify;\n\n return NDJSON.stringify((_NDJSON$stringify = {}, _NDJSON$stringify[key] = compress ? compressError(error) : error, _NDJSON$stringify));\n });\n };\n\n _proto.ndjsonMetricsets = function ndjsonMetricsets(metricsets) {\n return metricsets.map(function (metricset) {\n return NDJSON.stringify({\n metricset: metricset\n });\n }).join('');\n };\n\n _proto.ndjsonTransactions = function ndjsonTransactions(transactions, compress) {\n var _this4 = this;\n\n var key = compress ? 'x' : 'transaction';\n return transactions.map(function (tr) {\n var _NDJSON$stringify2;\n\n var spans = '',\n breakdowns = '';\n\n if (!compress) {\n if (tr.spans) {\n spans = tr.spans.map(function (span) {\n return NDJSON.stringify({\n span: span\n });\n }).join('');\n delete tr.spans;\n }\n\n if (tr.breakdown) {\n breakdowns = _this4.ndjsonMetricsets(tr.breakdown);\n delete tr.breakdown;\n }\n }\n\n return NDJSON.stringify((_NDJSON$stringify2 = {}, _NDJSON$stringify2[key] = compress ? compressTransaction(tr) : tr, _NDJSON$stringify2)) + spans + breakdowns;\n });\n };\n\n _proto.sendEvents = function sendEvents(events) {\n var _payload, _NDJSON$stringify3;\n\n if (events.length === 0) {\n return;\n }\n\n var transactions = [];\n var errors = [];\n\n for (var i = 0; i < events.length; i++) {\n var event = events[i];\n\n if (event[TRANSACTIONS]) {\n transactions.push(event[TRANSACTIONS]);\n }\n\n if (event[ERRORS]) {\n errors.push(event[ERRORS]);\n }\n }\n\n if (transactions.length === 0 && errors.length === 0) {\n return;\n }\n\n var cfg = this._configService;\n var payload = (_payload = {}, _payload[TRANSACTIONS] = transactions, _payload[ERRORS] = errors, _payload);\n var filteredPayload = cfg.applyFilters(payload);\n\n if (!filteredPayload) {\n this._loggingService.warn('Dropped payload due to filtering!');\n\n return;\n }\n\n var apiVersion = cfg.get('apiVersion');\n var compress = apiVersion > 2;\n var ndjson = [];\n var metadata = this.createMetaData();\n var metadataKey = compress ? 'm' : 'metadata';\n ndjson.push(NDJSON.stringify((_NDJSON$stringify3 = {}, _NDJSON$stringify3[metadataKey] = compress ? compressMetadata(metadata) : metadata, _NDJSON$stringify3)));\n ndjson = ndjson.concat(this.ndjsonErrors(filteredPayload[ERRORS], compress), this.ndjsonTransactions(filteredPayload[TRANSACTIONS], compress));\n var ndjsonPayload = ndjson.join('');\n\n var _this$getEndpoints2 = this.getEndpoints(),\n intakeEndpoint = _this$getEndpoints2.intakeEndpoint;\n\n return this._postJson(intakeEndpoint, ndjsonPayload);\n };\n\n _proto.getEndpoints = function getEndpoints() {\n var serverUrl = this._configService.get('serverUrl');\n\n var apiVersion = this._configService.get('apiVersion');\n\n var serverUrlPrefix = this._configService.get('serverUrlPrefix') || \"/intake/v\" + apiVersion + \"/rum/events\";\n var intakeEndpoint = serverUrl + serverUrlPrefix;\n var configEndpoint = serverUrl + \"/config/v1/rum/agents\";\n return {\n intakeEndpoint: intakeEndpoint,\n configEndpoint: configEndpoint\n };\n };\n\n return ApmServer;\n}();\n\nexport default ApmServer;","export default function throttle(fn, onThrottle, opts) {\n var context = this;\n var limit = opts.limit;\n var interval = opts.interval;\n var counter = 0;\n var timeoutId;\n return function () {\n counter++;\n\n if (typeof timeoutId === 'undefined') {\n timeoutId = setTimeout(function () {\n counter = 0;\n timeoutId = undefined;\n }, interval);\n }\n\n if (counter > limit && typeof onThrottle === 'function') {\n return onThrottle.apply(context, arguments);\n } else {\n return fn.apply(context, arguments);\n }\n };\n}","import { BEFORE_EVENT, AFTER_EVENT } from './constants';\n\nvar EventHandler = function () {\n function EventHandler() {\n this.observers = {};\n }\n\n var _proto = EventHandler.prototype;\n\n _proto.observe = function observe(name, fn) {\n var _this = this;\n\n if (typeof fn === 'function') {\n if (!this.observers[name]) {\n this.observers[name] = [];\n }\n\n this.observers[name].push(fn);\n return function () {\n var index = _this.observers[name].indexOf(fn);\n\n if (index > -1) {\n _this.observers[name].splice(index, 1);\n }\n };\n }\n };\n\n _proto.sendOnly = function sendOnly(name, args) {\n var obs = this.observers[name];\n\n if (obs) {\n obs.forEach(function (fn) {\n try {\n fn.apply(undefined, args);\n } catch (error) {\n console.log(error, error.stack);\n }\n });\n }\n };\n\n _proto.send = function send(name, args) {\n this.sendOnly(name + BEFORE_EVENT, args);\n this.sendOnly(name, args);\n this.sendOnly(name + AFTER_EVENT, args);\n };\n\n return EventHandler;\n}();\n\nexport default EventHandler;","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport { getCurrentScript, setLabel, merge, extend, isUndefined } from './utils';\nimport EventHandler from './event-handler';\nimport { CONFIG_CHANGE, LOCAL_CONFIG_KEY } from './constants';\n\nfunction getConfigFromScript() {\n var script = getCurrentScript();\n var config = getDataAttributesFromNode(script);\n return config;\n}\n\nfunction getDataAttributesFromNode(node) {\n if (!node) {\n return {};\n }\n\n var dataAttrs = {};\n var dataRegex = /^data-([\\w-]+)$/;\n var attrs = node.attributes;\n\n for (var i = 0; i < attrs.length; i++) {\n var attr = attrs[i];\n\n if (dataRegex.test(attr.nodeName)) {\n var key = attr.nodeName.match(dataRegex)[1];\n var camelCasedkey = key.split('-').map(function (value, index) {\n return index > 0 ? value.charAt(0).toUpperCase() + value.substring(1) : value;\n }).join('');\n dataAttrs[camelCasedkey] = attr.value || attr.nodeValue;\n }\n }\n\n return dataAttrs;\n}\n\nvar Config = function () {\n function Config() {\n this.config = {\n serviceName: '',\n serviceVersion: '',\n environment: '',\n serverUrl: 'http://localhost:8200',\n serverUrlPrefix: '',\n active: true,\n instrument: true,\n disableInstrumentations: [],\n logLevel: 'warn',\n breakdownMetrics: false,\n ignoreTransactions: [],\n eventsLimit: 80,\n queueLimit: -1,\n flushInterval: 500,\n distributedTracing: true,\n distributedTracingOrigins: [],\n distributedTracingHeaderName: 'traceparent',\n pageLoadTraceId: '',\n pageLoadSpanId: '',\n pageLoadSampled: false,\n pageLoadTransactionName: '',\n propagateTracestate: false,\n transactionSampleRate: 1.0,\n centralConfig: false,\n monitorLongtasks: true,\n apiVersion: 2,\n context: {},\n session: false,\n apmRequest: null,\n sendCredentials: false\n };\n this.events = new EventHandler();\n this.filters = [];\n this.version = '';\n }\n\n var _proto = Config.prototype;\n\n _proto.init = function init() {\n var scriptData = getConfigFromScript();\n this.setConfig(scriptData);\n };\n\n _proto.setVersion = function setVersion(version) {\n this.version = version;\n };\n\n _proto.addFilter = function addFilter(cb) {\n if (typeof cb !== 'function') {\n throw new Error('Argument to must be function');\n }\n\n this.filters.push(cb);\n };\n\n _proto.applyFilters = function applyFilters(data) {\n for (var i = 0; i < this.filters.length; i++) {\n data = this.filters[i](data);\n\n if (!data) {\n return;\n }\n }\n\n return data;\n };\n\n _proto.get = function get(key) {\n return key.split('.').reduce(function (obj, objKey) {\n return obj && obj[objKey];\n }, this.config);\n };\n\n _proto.setUserContext = function setUserContext(userContext) {\n if (userContext === void 0) {\n userContext = {};\n }\n\n var context = {};\n var _userContext = userContext,\n id = _userContext.id,\n username = _userContext.username,\n email = _userContext.email;\n\n if (typeof id === 'number' || typeof id === 'string') {\n context.id = id;\n }\n\n if (typeof username === 'string') {\n context.username = username;\n }\n\n if (typeof email === 'string') {\n context.email = email;\n }\n\n this.config.context.user = extend(this.config.context.user || {}, context);\n };\n\n _proto.setCustomContext = function setCustomContext(customContext) {\n if (customContext === void 0) {\n customContext = {};\n }\n\n this.config.context.custom = extend(this.config.context.custom || {}, customContext);\n };\n\n _proto.addLabels = function addLabels(tags) {\n var _this = this;\n\n if (!this.config.context.tags) {\n this.config.context.tags = {};\n }\n\n var keys = Object.keys(tags);\n keys.forEach(function (k) {\n return setLabel(k, tags[k], _this.config.context.tags);\n });\n };\n\n _proto.setConfig = function setConfig(properties) {\n if (properties === void 0) {\n properties = {};\n }\n\n var _properties = properties,\n transactionSampleRate = _properties.transactionSampleRate,\n serverUrl = _properties.serverUrl;\n\n if (serverUrl) {\n properties.serverUrl = serverUrl.replace(/\\/+$/, '');\n }\n\n if (!isUndefined(transactionSampleRate)) {\n if (transactionSampleRate < 0.0001 && transactionSampleRate > 0) {\n transactionSampleRate = 0.0001;\n }\n\n properties.transactionSampleRate = Math.round(transactionSampleRate * 10000) / 10000;\n }\n\n merge(this.config, properties);\n this.events.send(CONFIG_CHANGE, [this.config]);\n };\n\n _proto.validate = function validate(properties) {\n if (properties === void 0) {\n properties = {};\n }\n\n var requiredKeys = ['serviceName', 'serverUrl'];\n var allKeys = Object.keys(this.config);\n var errors = {\n missing: [],\n invalid: [],\n unknown: []\n };\n Object.keys(properties).forEach(function (key) {\n if (requiredKeys.indexOf(key) !== -1 && !properties[key]) {\n errors.missing.push(key);\n }\n\n if (allKeys.indexOf(key) === -1) {\n errors.unknown.push(key);\n }\n });\n\n if (properties.serviceName && !/^[a-zA-Z0-9 _-]+$/.test(properties.serviceName)) {\n errors.invalid.push({\n key: 'serviceName',\n value: properties.serviceName,\n allowed: 'a-z, A-Z, 0-9, _, -, '\n });\n }\n\n var sampleRate = properties.transactionSampleRate;\n\n if (typeof sampleRate !== 'undefined' && (typeof sampleRate !== 'number' || isNaN(sampleRate) || sampleRate < 0 || sampleRate > 1)) {\n errors.invalid.push({\n key: 'transactionSampleRate',\n value: sampleRate,\n allowed: 'Number between 0 and 1'\n });\n }\n\n return errors;\n };\n\n _proto.getLocalConfig = function getLocalConfig() {\n var storage = sessionStorage;\n\n if (this.config.session) {\n storage = localStorage;\n }\n\n var config = storage.getItem(LOCAL_CONFIG_KEY);\n\n if (config) {\n return JSON.parse(config);\n }\n };\n\n _proto.setLocalConfig = function setLocalConfig(config, merge) {\n if (config) {\n if (merge) {\n var prevConfig = this.getLocalConfig();\n config = _extends({}, prevConfig, config);\n }\n\n var storage = sessionStorage;\n\n if (this.config.session) {\n storage = localStorage;\n }\n\n storage.setItem(LOCAL_CONFIG_KEY, JSON.stringify(config));\n }\n };\n\n _proto.dispatchEvent = function dispatchEvent(name, args) {\n this.events.send(name, args);\n };\n\n _proto.observeEvent = function observeEvent(name, fn) {\n return this.events.observe(name, fn);\n };\n\n return Config;\n}();\n\nexport default Config;","var _serviceCreators;\n\nimport ApmServer from './apm-server';\nimport ConfigService from './config-service';\nimport LoggingService from './logging-service';\nimport { CONFIG_CHANGE, CONFIG_SERVICE, LOGGING_SERVICE, APM_SERVER } from './constants';\nimport { __DEV__ } from '../state';\nvar serviceCreators = (_serviceCreators = {}, _serviceCreators[CONFIG_SERVICE] = function () {\n return new ConfigService();\n}, _serviceCreators[LOGGING_SERVICE] = function () {\n return new LoggingService({\n prefix: '[Elastic APM] '\n });\n}, _serviceCreators[APM_SERVER] = function (factory) {\n var _factory$getService = factory.getService([CONFIG_SERVICE, LOGGING_SERVICE]),\n configService = _factory$getService[0],\n loggingService = _factory$getService[1];\n\n return new ApmServer(configService, loggingService);\n}, _serviceCreators);\n\nvar ServiceFactory = function () {\n function ServiceFactory() {\n this.instances = {};\n this.initialized = false;\n }\n\n var _proto = ServiceFactory.prototype;\n\n _proto.init = function init() {\n if (this.initialized) {\n return;\n }\n\n this.initialized = true;\n var configService = this.getService(CONFIG_SERVICE);\n configService.init();\n\n var _this$getService = this.getService([LOGGING_SERVICE, APM_SERVER]),\n loggingService = _this$getService[0],\n apmServer = _this$getService[1];\n\n configService.events.observe(CONFIG_CHANGE, function () {\n var logLevel = configService.get('logLevel');\n loggingService.setLevel(logLevel);\n });\n apmServer.init();\n };\n\n _proto.getService = function getService(name) {\n var _this = this;\n\n if (typeof name === 'string') {\n if (!this.instances[name]) {\n if (typeof serviceCreators[name] === 'function') {\n this.instances[name] = serviceCreators[name](this);\n } else if (__DEV__) {\n console.log('Cannot get service, No creator for: ' + name);\n }\n }\n\n return this.instances[name];\n } else if (Array.isArray(name)) {\n return name.map(function (n) {\n return _this.getService(n);\n });\n }\n };\n\n return ServiceFactory;\n}();\n\nexport { serviceCreators, ServiceFactory };","import { noop } from './utils';\n\nvar LoggingService = function () {\n function LoggingService(spec) {\n if (spec === void 0) {\n spec = {};\n }\n\n this.levels = ['trace', 'debug', 'info', 'warn', 'error'];\n this.level = spec.level || 'warn';\n this.prefix = spec.prefix || '';\n this.resetLogMethods();\n }\n\n var _proto = LoggingService.prototype;\n\n _proto.shouldLog = function shouldLog(level) {\n return this.levels.indexOf(level) >= this.levels.indexOf(this.level);\n };\n\n _proto.setLevel = function setLevel(level) {\n if (level === this.level) {\n return;\n }\n\n this.level = level;\n this.resetLogMethods();\n };\n\n _proto.resetLogMethods = function resetLogMethods() {\n var _this = this;\n\n this.levels.forEach(function (level) {\n _this[level] = _this.shouldLog(level) ? log : noop;\n\n function log() {\n var normalizedLevel = level;\n\n if (level === 'trace' || level === 'debug') {\n normalizedLevel = 'info';\n }\n\n var args = arguments;\n args[0] = this.prefix + args[0];\n\n if (console) {\n var realMethod = console[normalizedLevel] || console.log;\n\n if (typeof realMethod === 'function') {\n realMethod.apply(console, args);\n }\n }\n }\n });\n };\n\n return LoggingService;\n}();\n\nexport default LoggingService;","import { patchMethod, XHR_SYNC, XHR_URL, XHR_METHOD, XHR_IGNORE } from './patch-utils';\nimport { SCHEDULE, INVOKE, XMLHTTPREQUEST, ADD_EVENT_LISTENER_STR } from '../constants';\nexport function patchXMLHttpRequest(callback) {\n var XMLHttpRequestPrototype = XMLHttpRequest.prototype;\n\n if (!XMLHttpRequestPrototype || !XMLHttpRequestPrototype[ADD_EVENT_LISTENER_STR]) {\n return;\n }\n\n var READY_STATE_CHANGE = 'readystatechange';\n var LOAD = 'load';\n var ERROR = 'error';\n var TIMEOUT = 'timeout';\n var ABORT = 'abort';\n\n function invokeTask(task, status) {\n if (task.state !== INVOKE) {\n task.state = INVOKE;\n task.data.status = status;\n callback(INVOKE, task);\n }\n }\n\n function scheduleTask(task) {\n if (task.state === SCHEDULE) {\n return;\n }\n\n task.state = SCHEDULE;\n callback(SCHEDULE, task);\n var target = task.data.target;\n\n function addListener(name) {\n target[ADD_EVENT_LISTENER_STR](name, function (_ref) {\n var type = _ref.type;\n\n if (type === READY_STATE_CHANGE) {\n if (target.readyState === 4 && target.status !== 0) {\n invokeTask(task, 'success');\n }\n } else {\n var status = type === LOAD ? 'success' : type;\n invokeTask(task, status);\n }\n });\n }\n\n addListener(READY_STATE_CHANGE);\n addListener(LOAD);\n addListener(TIMEOUT);\n addListener(ERROR);\n addListener(ABORT);\n }\n\n var openNative = patchMethod(XMLHttpRequestPrototype, 'open', function () {\n return function (self, args) {\n if (!self[XHR_IGNORE]) {\n self[XHR_METHOD] = args[0];\n self[XHR_URL] = args[1];\n self[XHR_SYNC] = args[2] === false;\n }\n\n return openNative.apply(self, args);\n };\n });\n var sendNative = patchMethod(XMLHttpRequestPrototype, 'send', function () {\n return function (self, args) {\n if (self[XHR_IGNORE]) {\n return sendNative.apply(self, args);\n }\n\n var task = {\n source: XMLHTTPREQUEST,\n state: '',\n type: 'macroTask',\n data: {\n target: self,\n method: self[XHR_METHOD],\n sync: self[XHR_SYNC],\n url: self[XHR_URL],\n status: ''\n }\n };\n\n try {\n scheduleTask(task);\n return sendNative.apply(self, args);\n } catch (e) {\n invokeTask(task, ERROR);\n throw e;\n }\n };\n });\n}","import { patchXMLHttpRequest } from './xhr-patch';\nimport { patchFetch } from './fetch-patch';\nimport { patchHistory } from './history-patch';\nimport EventHandler from '../event-handler';\nimport { HISTORY, FETCH, XMLHTTPREQUEST } from '../constants';\nvar patchEventHandler = new EventHandler();\nvar alreadyPatched = false;\n\nfunction patchAll() {\n if (!alreadyPatched) {\n alreadyPatched = true;\n patchXMLHttpRequest(function (event, task) {\n patchEventHandler.send(XMLHTTPREQUEST, [event, task]);\n });\n patchFetch(function (event, task) {\n patchEventHandler.send(FETCH, [event, task]);\n });\n patchHistory(function (event, task) {\n patchEventHandler.send(HISTORY, [event, task]);\n });\n }\n\n return patchEventHandler;\n}\n\nexport { patchAll, patchEventHandler };","import { Promise } from '../polyfills';\nimport { globalState } from './patch-utils';\nimport { SCHEDULE, INVOKE, FETCH } from '../constants';\nimport { scheduleMicroTask } from '../utils';\nimport { isFetchSupported } from '../http/fetch';\nexport function patchFetch(callback) {\n if (!isFetchSupported()) {\n return;\n }\n\n function scheduleTask(task) {\n task.state = SCHEDULE;\n callback(SCHEDULE, task);\n }\n\n function invokeTask(task) {\n task.state = INVOKE;\n callback(INVOKE, task);\n }\n\n function handleResponseError(task, error) {\n task.data.aborted = isAbortError(error);\n task.data.error = error;\n invokeTask(task);\n }\n\n function readStream(stream, task) {\n var reader = stream.getReader();\n\n var read = function read() {\n reader.read().then(function (_ref) {\n var done = _ref.done;\n\n if (done) {\n invokeTask(task);\n } else {\n read();\n }\n }, function (error) {\n handleResponseError(task, error);\n });\n };\n\n read();\n }\n\n var nativeFetch = window.fetch;\n\n window.fetch = function (input, init) {\n var fetchSelf = this;\n var args = arguments;\n var request, url;\n\n if (typeof input === 'string') {\n request = new Request(input, init);\n url = input;\n } else if (input) {\n request = input;\n url = request.url;\n } else {\n return nativeFetch.apply(fetchSelf, args);\n }\n\n var task = {\n source: FETCH,\n state: '',\n type: 'macroTask',\n data: {\n target: request,\n method: request.method,\n url: url,\n aborted: false\n }\n };\n return new Promise(function (resolve, reject) {\n globalState.fetchInProgress = true;\n scheduleTask(task);\n var promise;\n\n try {\n promise = nativeFetch.apply(fetchSelf, [request]);\n } catch (error) {\n reject(error);\n task.data.error = error;\n invokeTask(task);\n globalState.fetchInProgress = false;\n return;\n }\n\n promise.then(function (response) {\n var clonedResponse = response.clone ? response.clone() : {};\n resolve(response);\n scheduleMicroTask(function () {\n task.data.response = response;\n var body = clonedResponse.body;\n\n if (body) {\n readStream(body, task);\n } else {\n invokeTask(task);\n }\n });\n }, function (error) {\n reject(error);\n scheduleMicroTask(function () {\n handleResponseError(task, error);\n });\n });\n globalState.fetchInProgress = false;\n });\n };\n}\n\nfunction isAbortError(error) {\n return error && error.name === 'AbortError';\n}","import { INVOKE, HISTORY } from '../constants';\nexport function patchHistory(callback) {\n if (!window.history) {\n return;\n }\n\n var nativePushState = history.pushState;\n\n if (typeof nativePushState === 'function') {\n history.pushState = function (state, title, url) {\n var task = {\n source: HISTORY,\n data: {\n state: state,\n title: title,\n url: url\n }\n };\n callback(INVOKE, task);\n nativePushState.apply(this, arguments);\n };\n }\n}","import { checkSameOrigin, isDtHeaderValid, parseDtHeaderValue, getDtHeaderValue, getTSHeaderValue, stripQueryStringFromUrl, setRequestHeader } from '../common/utils';\nimport { Url } from '../common/url';\nimport { patchEventHandler } from '../common/patching';\nimport { globalState } from '../common/patching/patch-utils';\nimport { SCHEDULE, INVOKE, TRANSACTION_END, AFTER_EVENT, FETCH, HISTORY, XMLHTTPREQUEST, HTTP_REQUEST_TYPE, OUTCOME_FAILURE, OUTCOME_SUCCESS, OUTCOME_UNKNOWN, QUEUE_ADD_TRANSACTION } from '../common/constants';\nimport { truncateModel, SPAN_MODEL, TRANSACTION_MODEL } from '../common/truncate';\nimport { __DEV__ } from '../state';\nvar SIMILAR_SPAN_TO_TRANSACTION_RATIO = 0.05;\nvar TRANSACTION_DURATION_THRESHOLD = 60000;\nexport function groupSmallContinuouslySimilarSpans(originalSpans, transDuration, threshold) {\n originalSpans.sort(function (spanA, spanB) {\n return spanA._start - spanB._start;\n });\n var spans = [];\n var lastCount = 1;\n originalSpans.forEach(function (span, index) {\n if (spans.length === 0) {\n spans.push(span);\n } else {\n var lastSpan = spans[spans.length - 1];\n var isContinuouslySimilar = lastSpan.type === span.type && lastSpan.subtype === span.subtype && lastSpan.action === span.action && lastSpan.name === span.name && span.duration() / transDuration < threshold && (span._start - lastSpan._end) / transDuration < threshold;\n var isLastSpan = originalSpans.length === index + 1;\n\n if (isContinuouslySimilar) {\n lastCount++;\n lastSpan._end = span._end;\n }\n\n if (lastCount > 1 && (!isContinuouslySimilar || isLastSpan)) {\n lastSpan.name = lastCount + 'x ' + lastSpan.name;\n lastCount = 1;\n }\n\n if (!isContinuouslySimilar) {\n spans.push(span);\n }\n }\n });\n return spans;\n}\nexport function adjustTransaction(transaction) {\n if (transaction.sampled) {\n var filterdSpans = transaction.spans.filter(function (span) {\n return span.duration() > 0 && span._start >= transaction._start && span._end <= transaction._end;\n });\n\n if (transaction.isManaged()) {\n var duration = transaction.duration();\n var similarSpans = groupSmallContinuouslySimilarSpans(filterdSpans, duration, SIMILAR_SPAN_TO_TRANSACTION_RATIO);\n transaction.spans = similarSpans;\n } else {\n transaction.spans = filterdSpans;\n }\n } else {\n transaction.resetFields();\n }\n\n return transaction;\n}\n\nvar PerformanceMonitoring = function () {\n function PerformanceMonitoring(apmServer, configService, loggingService, transactionService) {\n this._apmServer = apmServer;\n this._configService = configService;\n this._logginService = loggingService;\n this._transactionService = transactionService;\n }\n\n var _proto = PerformanceMonitoring.prototype;\n\n _proto.init = function init(flags) {\n var _this = this;\n\n if (flags === void 0) {\n flags = {};\n }\n\n this._configService.events.observe(TRANSACTION_END + AFTER_EVENT, function (tr) {\n var payload = _this.createTransactionPayload(tr);\n\n if (payload) {\n _this._apmServer.addTransaction(payload);\n\n _this._configService.dispatchEvent(QUEUE_ADD_TRANSACTION);\n }\n });\n\n if (flags[HISTORY]) {\n patchEventHandler.observe(HISTORY, this.getHistorySub());\n }\n\n if (flags[XMLHTTPREQUEST]) {\n patchEventHandler.observe(XMLHTTPREQUEST, this.getXHRSub());\n }\n\n if (flags[FETCH]) {\n patchEventHandler.observe(FETCH, this.getFetchSub());\n }\n };\n\n _proto.getHistorySub = function getHistorySub() {\n var transactionService = this._transactionService;\n return function (event, task) {\n if (task.source === HISTORY && event === INVOKE) {\n transactionService.startTransaction(task.data.title, 'route-change', {\n managed: true,\n canReuse: true\n });\n }\n };\n };\n\n _proto.getXHRSub = function getXHRSub() {\n var _this2 = this;\n\n return function (event, task) {\n if (task.source === XMLHTTPREQUEST && !globalState.fetchInProgress) {\n _this2.processAPICalls(event, task);\n }\n };\n };\n\n _proto.getFetchSub = function getFetchSub() {\n var _this3 = this;\n\n return function (event, task) {\n if (task.source === FETCH) {\n _this3.processAPICalls(event, task);\n }\n };\n };\n\n _proto.processAPICalls = function processAPICalls(event, task) {\n var configService = this._configService;\n var transactionService = this._transactionService;\n\n if (task.data && task.data.url) {\n var endpoints = this._apmServer.getEndpoints();\n\n var isOwnEndpoint = Object.keys(endpoints).some(function (endpoint) {\n return task.data.url.indexOf(endpoints[endpoint]) !== -1;\n });\n\n if (isOwnEndpoint) {\n return;\n }\n }\n\n if (event === SCHEDULE && task.data) {\n var data = task.data;\n var requestUrl = new Url(data.url);\n var spanName = data.method + ' ' + (requestUrl.relative ? requestUrl.path : stripQueryStringFromUrl(requestUrl.href));\n\n if (!transactionService.getCurrentTransaction()) {\n transactionService.startTransaction(spanName, HTTP_REQUEST_TYPE, {\n managed: true\n });\n }\n\n var span = transactionService.startSpan(spanName, 'external.http', {\n blocking: true\n });\n\n if (!span) {\n return;\n }\n\n var isDtEnabled = configService.get('distributedTracing');\n var dtOrigins = configService.get('distributedTracingOrigins');\n var currentUrl = new Url(window.location.href);\n var isSameOrigin = checkSameOrigin(requestUrl.origin, currentUrl.origin) || checkSameOrigin(requestUrl.origin, dtOrigins);\n var target = data.target;\n\n if (isDtEnabled && isSameOrigin && target) {\n this.injectDtHeader(span, target);\n var propagateTracestate = configService.get('propagateTracestate');\n\n if (propagateTracestate) {\n this.injectTSHeader(span, target);\n }\n } else if (__DEV__) {\n this._logginService.debug(\"Could not inject distributed tracing header to the request origin ('\" + requestUrl.origin + \"') from the current origin ('\" + currentUrl.origin + \"')\");\n }\n\n if (data.sync) {\n span.sync = data.sync;\n }\n\n data.span = span;\n } else if (event === INVOKE) {\n var _data = task.data;\n\n if (_data && _data.span) {\n var _span = _data.span,\n response = _data.response,\n _target = _data.target;\n var status;\n\n if (response) {\n status = response.status;\n } else {\n status = _target.status;\n }\n\n var outcome;\n\n if (_data.status != 'abort' && !_data.aborted) {\n if (status >= 400 || status == 0) {\n outcome = OUTCOME_FAILURE;\n } else {\n outcome = OUTCOME_SUCCESS;\n }\n } else {\n outcome = OUTCOME_UNKNOWN;\n }\n\n _span.outcome = outcome;\n var tr = transactionService.getCurrentTransaction();\n\n if (tr && tr.type === HTTP_REQUEST_TYPE) {\n tr.outcome = outcome;\n }\n\n transactionService.endSpan(_span, _data);\n }\n }\n };\n\n _proto.injectDtHeader = function injectDtHeader(span, target) {\n var headerName = this._configService.get('distributedTracingHeaderName');\n\n var headerValue = getDtHeaderValue(span);\n var isHeaderValid = isDtHeaderValid(headerValue);\n\n if (isHeaderValid && headerValue && headerName) {\n setRequestHeader(target, headerName, headerValue);\n }\n };\n\n _proto.injectTSHeader = function injectTSHeader(span, target) {\n var headerValue = getTSHeaderValue(span);\n\n if (headerValue) {\n setRequestHeader(target, 'tracestate', headerValue);\n }\n };\n\n _proto.extractDtHeader = function extractDtHeader(target) {\n var configService = this._configService;\n var headerName = configService.get('distributedTracingHeaderName');\n\n if (target) {\n return parseDtHeaderValue(target[headerName]);\n }\n };\n\n _proto.filterTransaction = function filterTransaction(tr) {\n var duration = tr.duration();\n\n if (!duration) {\n if (__DEV__) {\n var message = \"transaction(\" + tr.id + \", \" + tr.name + \") was discarded! \";\n\n if (duration === 0) {\n message += \"Transaction duration is 0\";\n } else {\n message += \"Transaction wasn't ended\";\n }\n\n this._logginService.debug(message);\n }\n\n return false;\n }\n\n if (tr.isManaged()) {\n if (duration > TRANSACTION_DURATION_THRESHOLD) {\n if (__DEV__) {\n this._logginService.debug(\"transaction(\" + tr.id + \", \" + tr.name + \") was discarded! Transaction duration (\" + duration + \") is greater than managed transaction threshold (\" + TRANSACTION_DURATION_THRESHOLD + \")\");\n }\n\n return false;\n }\n\n if (tr.sampled && tr.spans.length === 0) {\n if (__DEV__) {\n this._logginService.debug(\"transaction(\" + tr.id + \", \" + tr.name + \") was discarded! Transaction does not have any spans\");\n }\n\n return false;\n }\n }\n\n return true;\n };\n\n _proto.createTransactionDataModel = function createTransactionDataModel(transaction) {\n var transactionStart = transaction._start;\n var spans = transaction.spans.map(function (span) {\n var spanData = {\n id: span.id,\n transaction_id: transaction.id,\n parent_id: span.parentId || transaction.id,\n trace_id: transaction.traceId,\n name: span.name,\n type: span.type,\n subtype: span.subtype,\n action: span.action,\n sync: span.sync,\n start: parseInt(span._start - transactionStart),\n duration: span.duration(),\n context: span.context,\n outcome: span.outcome,\n sample_rate: span.sampleRate\n };\n return truncateModel(SPAN_MODEL, spanData);\n });\n var transactionData = {\n id: transaction.id,\n trace_id: transaction.traceId,\n session: transaction.session,\n name: transaction.name,\n type: transaction.type,\n duration: transaction.duration(),\n spans: spans,\n context: transaction.context,\n marks: transaction.marks,\n breakdown: transaction.breakdownTimings,\n span_count: {\n started: spans.length\n },\n sampled: transaction.sampled,\n sample_rate: transaction.sampleRate,\n experience: transaction.experience,\n outcome: transaction.outcome\n };\n return truncateModel(TRANSACTION_MODEL, transactionData);\n };\n\n _proto.createTransactionPayload = function createTransactionPayload(transaction) {\n var adjustedTransaction = adjustTransaction(transaction);\n var filtered = this.filterTransaction(adjustedTransaction);\n\n if (filtered) {\n return this.createTransactionDataModel(transaction);\n }\n };\n\n return PerformanceMonitoring;\n}();\n\nexport { PerformanceMonitoring as default };","import { getDuration, PERF } from '../common/utils';\nimport { PAGE_LOAD, TRUNCATED_TYPE } from '../common/constants';\nvar pageLoadBreakdowns = [['domainLookupStart', 'domainLookupEnd', 'DNS'], ['connectStart', 'connectEnd', 'TCP'], ['requestStart', 'responseStart', 'Request'], ['responseStart', 'responseEnd', 'Response'], ['domLoading', 'domComplete', 'Processing'], ['loadEventStart', 'loadEventEnd', 'Load']];\n\nfunction getValue(value) {\n return {\n value: value\n };\n}\n\nfunction calculateSelfTime(transaction) {\n var spans = transaction.spans,\n _start = transaction._start,\n _end = transaction._end;\n\n if (spans.length === 0) {\n return transaction.duration();\n }\n\n spans.sort(function (span1, span2) {\n return span1._start - span2._start;\n });\n var span = spans[0];\n var spanEnd = span._end;\n var spanStart = span._start;\n var lastContinuousEnd = spanEnd;\n var selfTime = spanStart - _start;\n\n for (var i = 1; i < spans.length; i++) {\n span = spans[i];\n spanStart = span._start;\n spanEnd = span._end;\n\n if (spanStart > lastContinuousEnd) {\n selfTime += spanStart - lastContinuousEnd;\n lastContinuousEnd = spanEnd;\n } else if (spanEnd > lastContinuousEnd) {\n lastContinuousEnd = spanEnd;\n }\n }\n\n if (lastContinuousEnd < _end) {\n selfTime += _end - lastContinuousEnd;\n }\n\n return selfTime;\n}\n\nfunction groupSpans(transaction) {\n var spanMap = {};\n var transactionSelfTime = calculateSelfTime(transaction);\n spanMap['app'] = {\n count: 1,\n duration: transactionSelfTime\n };\n var spans = transaction.spans;\n\n for (var i = 0; i < spans.length; i++) {\n var span = spans[i];\n var duration = span.duration();\n\n if (duration === 0 || duration == null) {\n continue;\n }\n\n var type = span.type,\n subtype = span.subtype;\n var key = type.replace(TRUNCATED_TYPE, '');\n\n if (subtype) {\n key += '.' + subtype;\n }\n\n if (!spanMap[key]) {\n spanMap[key] = {\n duration: 0,\n count: 0\n };\n }\n\n spanMap[key].count++;\n spanMap[key].duration += duration;\n }\n\n return spanMap;\n}\n\nfunction getSpanBreakdown(transactionDetails, _ref) {\n var details = _ref.details,\n _ref$count = _ref.count,\n count = _ref$count === void 0 ? 1 : _ref$count,\n duration = _ref.duration;\n return {\n transaction: transactionDetails,\n span: details,\n samples: {\n 'span.self_time.count': getValue(count),\n 'span.self_time.sum.us': getValue(duration)\n }\n };\n}\n\nexport function captureBreakdown(transaction, timings) {\n if (timings === void 0) {\n timings = PERF.timing;\n }\n\n var breakdowns = [];\n var trDuration = transaction.duration();\n var name = transaction.name,\n type = transaction.type,\n sampled = transaction.sampled;\n var transactionDetails = {\n name: name,\n type: type\n };\n breakdowns.push({\n transaction: transactionDetails,\n samples: {\n 'transaction.duration.count': getValue(1),\n 'transaction.duration.sum.us': getValue(trDuration),\n 'transaction.breakdown.count': getValue(sampled ? 1 : 0)\n }\n });\n\n if (!sampled) {\n return breakdowns;\n }\n\n if (type === PAGE_LOAD && timings) {\n for (var i = 0; i < pageLoadBreakdowns.length; i++) {\n var current = pageLoadBreakdowns[i];\n var start = timings[current[0]];\n var end = timings[current[1]];\n var duration = getDuration(start, end);\n\n if (duration === 0 || duration == null) {\n continue;\n }\n\n breakdowns.push(getSpanBreakdown(transactionDetails, {\n details: {\n type: current[2]\n },\n duration: duration\n }));\n }\n } else {\n var spanMap = groupSpans(transaction);\n Object.keys(spanMap).forEach(function (key) {\n var _key$split = key.split('.'),\n type = _key$split[0],\n subtype = _key$split[1];\n\n var _spanMap$key = spanMap[key],\n duration = _spanMap$key.duration,\n count = _spanMap$key.count;\n breakdowns.push(getSpanBreakdown(transactionDetails, {\n details: {\n type: type,\n subtype: subtype\n },\n duration: duration,\n count: count\n }));\n });\n }\n\n return breakdowns;\n}","function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nimport Span from './span';\nimport SpanBase from './span-base';\nimport { generateRandomId, merge, now, getTime, extend, removeInvalidChars } from '../common/utils';\nimport { REUSABILITY_THRESHOLD, TRUNCATED_TYPE } from '../common/constants';\nimport { captureBreakdown as _captureBreakdown } from './breakdown';\n\nvar Transaction = function (_SpanBase) {\n _inheritsLoose(Transaction, _SpanBase);\n\n function Transaction(name, type, options) {\n var _this;\n\n _this = _SpanBase.call(this, name, type, options) || this;\n _this.traceId = generateRandomId();\n _this.marks = undefined;\n _this.spans = [];\n _this._activeSpans = {};\n _this._activeTasks = new Set();\n _this.blocked = false;\n _this.captureTimings = false;\n _this.breakdownTimings = [];\n _this.sampleRate = _this.options.transactionSampleRate;\n _this.sampled = Math.random() <= _this.sampleRate;\n return _this;\n }\n\n var _proto = Transaction.prototype;\n\n _proto.addMarks = function addMarks(obj) {\n this.marks = merge(this.marks || {}, obj);\n };\n\n _proto.mark = function mark(key) {\n var skey = removeInvalidChars(key);\n\n var markTime = now() - this._start;\n\n var custom = {};\n custom[skey] = markTime;\n this.addMarks({\n custom: custom\n });\n };\n\n _proto.canReuse = function canReuse() {\n var threshold = this.options.reuseThreshold || REUSABILITY_THRESHOLD;\n return !!this.options.canReuse && !this.ended && now() - this._start < threshold;\n };\n\n _proto.redefine = function redefine(name, type, options) {\n if (name) {\n this.name = name;\n }\n\n if (type) {\n this.type = type;\n }\n\n if (options) {\n this.options.reuseThreshold = options.reuseThreshold;\n extend(this.options, options);\n }\n };\n\n _proto.startSpan = function startSpan(name, type, options) {\n var _this2 = this;\n\n if (this.ended) {\n return;\n }\n\n var opts = extend({}, options);\n\n opts.onEnd = function (trc) {\n _this2._onSpanEnd(trc);\n };\n\n opts.traceId = this.traceId;\n opts.sampled = this.sampled;\n opts.sampleRate = this.sampleRate;\n\n if (!opts.parentId) {\n opts.parentId = this.id;\n }\n\n var span = new Span(name, type, opts);\n this._activeSpans[span.id] = span;\n\n if (opts.blocking) {\n this.addTask(span.id);\n }\n\n return span;\n };\n\n _proto.isFinished = function isFinished() {\n return !this.blocked && this._activeTasks.size === 0;\n };\n\n _proto.detectFinish = function detectFinish() {\n if (this.isFinished()) this.end();\n };\n\n _proto.end = function end(endTime) {\n if (this.ended) {\n return;\n }\n\n this.ended = true;\n this._end = getTime(endTime);\n\n for (var sid in this._activeSpans) {\n var span = this._activeSpans[sid];\n span.type = span.type + TRUNCATED_TYPE;\n span.end(endTime);\n }\n\n this.callOnEnd();\n };\n\n _proto.captureBreakdown = function captureBreakdown() {\n this.breakdownTimings = _captureBreakdown(this);\n };\n\n _proto.block = function block(flag) {\n this.blocked = flag;\n\n if (!this.blocked) {\n this.detectFinish();\n }\n };\n\n _proto.addTask = function addTask(taskId) {\n if (!taskId) {\n taskId = 'task-' + generateRandomId(16);\n }\n\n this._activeTasks.add(taskId);\n\n return taskId;\n };\n\n _proto.removeTask = function removeTask(taskId) {\n var deleted = this._activeTasks.delete(taskId);\n\n deleted && this.detectFinish();\n };\n\n _proto.resetFields = function resetFields() {\n this.spans = [];\n this.sampleRate = 0;\n };\n\n _proto._onSpanEnd = function _onSpanEnd(span) {\n this.spans.push(span);\n delete this._activeSpans[span.id];\n this.removeTask(span.id);\n };\n\n _proto.isManaged = function isManaged() {\n return !!this.options.managed;\n };\n\n return Transaction;\n}(SpanBase);\n\nexport default Transaction;","import { LONG_TASK, LARGEST_CONTENTFUL_PAINT, FIRST_CONTENTFUL_PAINT, FIRST_INPUT, LAYOUT_SHIFT } from '../common/constants';\nimport { noop, PERF } from '../common/utils';\nimport Span from './span';\nexport var metrics = {\n fid: 0,\n fcp: 0,\n tbt: {\n start: Infinity,\n duration: 0\n },\n cls: {\n score: 0,\n firstEntryTime: Number.NEGATIVE_INFINITY,\n prevEntryTime: Number.NEGATIVE_INFINITY,\n currentSessionScore: 0\n },\n longtask: {\n count: 0,\n duration: 0,\n max: 0\n }\n};\nvar LONG_TASK_THRESHOLD = 50;\nexport function createLongTaskSpans(longtasks, agg) {\n var spans = [];\n\n for (var i = 0; i < longtasks.length; i++) {\n var _longtasks$i = longtasks[i],\n name = _longtasks$i.name,\n startTime = _longtasks$i.startTime,\n duration = _longtasks$i.duration,\n attribution = _longtasks$i.attribution;\n var end = startTime + duration;\n var span = new Span(\"Longtask(\" + name + \")\", LONG_TASK, {\n startTime: startTime\n });\n agg.count++;\n agg.duration += duration;\n agg.max = Math.max(duration, agg.max);\n\n if (attribution.length > 0) {\n var _attribution$ = attribution[0],\n _name = _attribution$.name,\n containerType = _attribution$.containerType,\n containerName = _attribution$.containerName,\n containerId = _attribution$.containerId;\n var customContext = {\n attribution: _name,\n type: containerType\n };\n\n if (containerName) {\n customContext.name = containerName;\n }\n\n if (containerId) {\n customContext.id = containerId;\n }\n\n span.addContext({\n custom: customContext\n });\n }\n\n span.end(end);\n spans.push(span);\n }\n\n return spans;\n}\nexport function createFirstInputDelaySpan(fidEntries) {\n var firstInput = fidEntries[0];\n\n if (firstInput) {\n var startTime = firstInput.startTime,\n processingStart = firstInput.processingStart;\n var span = new Span('First Input Delay', FIRST_INPUT, {\n startTime: startTime\n });\n span.end(processingStart);\n return span;\n }\n}\nexport function createTotalBlockingTimeSpan(tbtObject) {\n var start = tbtObject.start,\n duration = tbtObject.duration;\n var tbtSpan = new Span('Total Blocking Time', LONG_TASK, {\n startTime: start\n });\n tbtSpan.end(start + duration);\n return tbtSpan;\n}\nexport function calculateTotalBlockingTime(longtaskEntries) {\n longtaskEntries.forEach(function (entry) {\n var name = entry.name,\n startTime = entry.startTime,\n duration = entry.duration;\n\n if (startTime < metrics.fcp) {\n return;\n }\n\n if (name !== 'self' && name.indexOf('same-origin') === -1) {\n return;\n }\n\n metrics.tbt.start = Math.min(metrics.tbt.start, startTime);\n var blockingTime = duration - LONG_TASK_THRESHOLD;\n\n if (blockingTime > 0) {\n metrics.tbt.duration += blockingTime;\n }\n });\n}\nexport function calculateCumulativeLayoutShift(clsEntries) {\n clsEntries.forEach(function (entry) {\n if (!entry.hadRecentInput && entry.value) {\n var shouldCreateNewSession = entry.startTime - metrics.cls.firstEntryTime > 5000 || entry.startTime - metrics.cls.prevEntryTime > 1000;\n\n if (shouldCreateNewSession) {\n metrics.cls.firstEntryTime = entry.startTime;\n metrics.cls.currentSessionScore = 0;\n }\n\n metrics.cls.prevEntryTime = entry.startTime;\n metrics.cls.currentSessionScore += entry.value;\n metrics.cls.score = Math.max(metrics.cls.score, metrics.cls.currentSessionScore);\n }\n });\n}\nexport function captureObserverEntries(list, _ref) {\n var isHardNavigation = _ref.isHardNavigation,\n trStart = _ref.trStart;\n var longtaskEntries = list.getEntriesByType(LONG_TASK).filter(function (entry) {\n return entry.startTime >= trStart;\n });\n var longTaskSpans = createLongTaskSpans(longtaskEntries, metrics.longtask);\n var result = {\n spans: longTaskSpans,\n marks: {}\n };\n\n if (!isHardNavigation) {\n return result;\n }\n\n var lcpEntries = list.getEntriesByType(LARGEST_CONTENTFUL_PAINT);\n var lastLcpEntry = lcpEntries[lcpEntries.length - 1];\n\n if (lastLcpEntry) {\n var lcp = parseInt(lastLcpEntry.startTime);\n metrics.lcp = lcp;\n result.marks.largestContentfulPaint = lcp;\n }\n\n var timing = PERF.timing;\n var unloadDiff = timing.fetchStart - timing.navigationStart;\n var fcpEntry = list.getEntriesByName(FIRST_CONTENTFUL_PAINT)[0];\n\n if (fcpEntry) {\n var fcp = parseInt(unloadDiff >= 0 ? fcpEntry.startTime - unloadDiff : fcpEntry.startTime);\n metrics.fcp = fcp;\n result.marks.firstContentfulPaint = fcp;\n }\n\n var fidEntries = list.getEntriesByType(FIRST_INPUT);\n var fidSpan = createFirstInputDelaySpan(fidEntries);\n\n if (fidSpan) {\n metrics.fid = fidSpan.duration();\n result.spans.push(fidSpan);\n }\n\n calculateTotalBlockingTime(longtaskEntries);\n var clsEntries = list.getEntriesByType(LAYOUT_SHIFT);\n calculateCumulativeLayoutShift(clsEntries);\n return result;\n}\nexport var PerfEntryRecorder = function () {\n function PerfEntryRecorder(callback) {\n this.po = {\n observe: noop,\n disconnect: noop\n };\n\n if (window.PerformanceObserver) {\n this.po = new PerformanceObserver(callback);\n }\n }\n\n var _proto = PerfEntryRecorder.prototype;\n\n _proto.start = function start(type) {\n try {\n this.po.observe({\n type: type,\n buffered: true\n });\n } catch (_) {}\n };\n\n _proto.stop = function stop() {\n this.po.disconnect();\n };\n\n return PerfEntryRecorder;\n}();","import { Promise } from '../common/polyfills';\nimport Transaction from './transaction';\nimport { PerfEntryRecorder, captureObserverEntries, metrics, createTotalBlockingTimeSpan } from './metrics';\nimport { extend, getEarliestSpan, getLatestNonXHRSpan, getLatestXHRSpan, isPerfTypeSupported, generateRandomId } from '../common/utils';\nimport { captureNavigation } from './capture-navigation';\nimport { PAGE_LOAD, NAME_UNKNOWN, TRANSACTION_START, TRANSACTION_END, TEMPORARY_TYPE, TRANSACTION_TYPE_ORDER, LARGEST_CONTENTFUL_PAINT, LONG_TASK, PAINT, TRUNCATED_TYPE, FIRST_INPUT, LAYOUT_SHIFT, SESSION_TIMEOUT, PAGE_LOAD_DELAY } from '../common/constants';\nimport { addTransactionContext } from '../common/context';\nimport { __DEV__, state } from '../state';\nimport { slugifyUrl } from '../common/url';\n\nvar TransactionService = function () {\n function TransactionService(logger, config) {\n var _this = this;\n\n this._config = config;\n this._logger = logger;\n this.currentTransaction = undefined;\n this.respIntervalId = undefined;\n this.recorder = new PerfEntryRecorder(function (list) {\n var tr = _this.getCurrentTransaction();\n\n if (tr && tr.captureTimings) {\n var _tr$spans;\n\n var isHardNavigation = tr.type === PAGE_LOAD;\n\n var _captureObserverEntri = captureObserverEntries(list, {\n isHardNavigation: isHardNavigation,\n trStart: isHardNavigation ? 0 : tr._start\n }),\n spans = _captureObserverEntri.spans,\n marks = _captureObserverEntri.marks;\n\n (_tr$spans = tr.spans).push.apply(_tr$spans, spans);\n\n tr.addMarks({\n agent: marks\n });\n }\n });\n }\n\n var _proto = TransactionService.prototype;\n\n _proto.createCurrentTransaction = function createCurrentTransaction(name, type, options) {\n var tr = new Transaction(name, type, options);\n this.currentTransaction = tr;\n return tr;\n };\n\n _proto.getCurrentTransaction = function getCurrentTransaction() {\n if (this.currentTransaction && !this.currentTransaction.ended) {\n return this.currentTransaction;\n }\n };\n\n _proto.createOptions = function createOptions(options) {\n var config = this._config.config;\n var presetOptions = {\n transactionSampleRate: config.transactionSampleRate\n };\n var perfOptions = extend(presetOptions, options);\n\n if (perfOptions.managed) {\n perfOptions = extend({\n pageLoadTraceId: config.pageLoadTraceId,\n pageLoadSampled: config.pageLoadSampled,\n pageLoadSpanId: config.pageLoadSpanId,\n pageLoadTransactionName: config.pageLoadTransactionName\n }, perfOptions);\n }\n\n return perfOptions;\n };\n\n _proto.startManagedTransaction = function startManagedTransaction(name, type, perfOptions) {\n var tr = this.getCurrentTransaction();\n var isRedefined = false;\n\n if (!tr) {\n tr = this.createCurrentTransaction(name, type, perfOptions);\n } else if (tr.canReuse() && perfOptions.canReuse) {\n var redefineType = tr.type;\n var currentTypeOrder = TRANSACTION_TYPE_ORDER.indexOf(tr.type);\n var redefineTypeOrder = TRANSACTION_TYPE_ORDER.indexOf(type);\n\n if (currentTypeOrder >= 0 && redefineTypeOrder < currentTypeOrder) {\n redefineType = type;\n }\n\n if (__DEV__) {\n this._logger.debug(\"redefining transaction(\" + tr.id + \", \" + tr.name + \", \" + tr.type + \")\", 'to', \"(\" + (name || tr.name) + \", \" + redefineType + \")\", tr);\n }\n\n tr.redefine(name, redefineType, perfOptions);\n isRedefined = true;\n } else {\n if (__DEV__) {\n this._logger.debug(\"ending previous transaction(\" + tr.id + \", \" + tr.name + \")\", tr);\n }\n\n tr.end();\n tr = this.createCurrentTransaction(name, type, perfOptions);\n }\n\n if (tr.type === PAGE_LOAD) {\n if (!isRedefined) {\n this.recorder.start(LARGEST_CONTENTFUL_PAINT);\n this.recorder.start(PAINT);\n this.recorder.start(FIRST_INPUT);\n this.recorder.start(LAYOUT_SHIFT);\n }\n\n if (perfOptions.pageLoadTraceId) {\n tr.traceId = perfOptions.pageLoadTraceId;\n }\n\n if (perfOptions.pageLoadSampled) {\n tr.sampled = perfOptions.pageLoadSampled;\n }\n\n if (tr.name === NAME_UNKNOWN && perfOptions.pageLoadTransactionName) {\n tr.name = perfOptions.pageLoadTransactionName;\n }\n }\n\n if (!isRedefined && this._config.get('monitorLongtasks')) {\n this.recorder.start(LONG_TASK);\n }\n\n if (tr.sampled) {\n tr.captureTimings = true;\n }\n\n return tr;\n };\n\n _proto.startTransaction = function startTransaction(name, type, options) {\n var _this2 = this;\n\n var perfOptions = this.createOptions(options);\n var tr;\n var fireOnstartHook = true;\n\n if (perfOptions.managed) {\n var current = this.currentTransaction;\n tr = this.startManagedTransaction(name, type, perfOptions);\n\n if (current === tr) {\n fireOnstartHook = false;\n }\n } else {\n tr = new Transaction(name, type, perfOptions);\n }\n\n tr.onEnd = function () {\n return _this2.handleTransactionEnd(tr);\n };\n\n if (fireOnstartHook) {\n if (__DEV__) {\n this._logger.debug(\"startTransaction(\" + tr.id + \", \" + tr.name + \", \" + tr.type + \")\");\n }\n\n this._config.events.send(TRANSACTION_START, [tr]);\n }\n\n return tr;\n };\n\n _proto.handleTransactionEnd = function handleTransactionEnd(tr) {\n var _this3 = this;\n\n this.recorder.stop();\n var currentUrl = window.location.href;\n return Promise.resolve().then(function () {\n var name = tr.name,\n type = tr.type;\n var lastHiddenStart = state.lastHiddenStart;\n\n if (lastHiddenStart >= tr._start) {\n if (__DEV__) {\n _this3._logger.debug(\"transaction(\" + tr.id + \", \" + name + \", \" + type + \") was discarded! The page was hidden during the transaction!\");\n }\n\n return;\n }\n\n if (_this3.shouldIgnoreTransaction(name) || type === TEMPORARY_TYPE) {\n if (__DEV__) {\n _this3._logger.debug(\"transaction(\" + tr.id + \", \" + name + \", \" + type + \") is ignored\");\n }\n\n return;\n }\n\n if (type === PAGE_LOAD) {\n var pageLoadTransactionName = _this3._config.get('pageLoadTransactionName');\n\n if (name === NAME_UNKNOWN && pageLoadTransactionName) {\n tr.name = pageLoadTransactionName;\n }\n\n if (tr.captureTimings) {\n var cls = metrics.cls,\n fid = metrics.fid,\n tbt = metrics.tbt,\n longtask = metrics.longtask;\n\n if (tbt.duration > 0) {\n tr.spans.push(createTotalBlockingTimeSpan(tbt));\n }\n\n tr.experience = {};\n\n if (isPerfTypeSupported(LONG_TASK)) {\n tr.experience.tbt = tbt.duration;\n }\n\n if (isPerfTypeSupported(LAYOUT_SHIFT)) {\n tr.experience.cls = cls.score;\n }\n\n if (fid > 0) {\n tr.experience.fid = fid;\n }\n\n if (longtask.count > 0) {\n tr.experience.longtask = {\n count: longtask.count,\n sum: longtask.duration,\n max: longtask.max\n };\n }\n }\n\n _this3.setSession(tr);\n }\n\n if (tr.name === NAME_UNKNOWN) {\n tr.name = slugifyUrl(currentUrl);\n }\n\n captureNavigation(tr);\n\n _this3.adjustTransactionTime(tr);\n\n var breakdownMetrics = _this3._config.get('breakdownMetrics');\n\n if (breakdownMetrics) {\n tr.captureBreakdown();\n }\n\n var configContext = _this3._config.get('context');\n\n addTransactionContext(tr, configContext);\n\n _this3._config.events.send(TRANSACTION_END, [tr]);\n\n if (__DEV__) {\n _this3._logger.debug(\"end transaction(\" + tr.id + \", \" + tr.name + \", \" + tr.type + \")\", tr);\n }\n }, function (err) {\n if (__DEV__) {\n _this3._logger.debug(\"error ending transaction(\" + tr.id + \", \" + tr.name + \")\", err);\n }\n });\n };\n\n _proto.setSession = function setSession(tr) {\n var session = this._config.get('session');\n\n if (session) {\n if (typeof session == 'boolean') {\n tr.session = {\n id: generateRandomId(16),\n sequence: 1\n };\n } else {\n if (session.timestamp && Date.now() - session.timestamp > SESSION_TIMEOUT) {\n tr.session = {\n id: generateRandomId(16),\n sequence: 1\n };\n } else {\n tr.session = {\n id: session.id,\n sequence: session.sequence ? session.sequence + 1 : 1\n };\n }\n }\n\n var sessionConfig = {\n session: {\n id: tr.session.id,\n sequence: tr.session.sequence,\n timestamp: Date.now()\n }\n };\n\n this._config.setConfig(sessionConfig);\n\n this._config.setLocalConfig(sessionConfig, true);\n }\n };\n\n _proto.adjustTransactionTime = function adjustTransactionTime(transaction) {\n var spans = transaction.spans;\n var earliestSpan = getEarliestSpan(spans);\n\n if (earliestSpan && earliestSpan._start < transaction._start) {\n transaction._start = earliestSpan._start;\n }\n\n var latestSpan = getLatestNonXHRSpan(spans) || {};\n var latestSpanEnd = latestSpan._end || 0;\n\n if (transaction.type === PAGE_LOAD) {\n var transactionEndWithoutDelay = transaction._end - PAGE_LOAD_DELAY;\n var lcp = metrics.lcp || 0;\n var latestXHRSpan = getLatestXHRSpan(spans) || {};\n var latestXHRSpanEnd = latestXHRSpan._end || 0;\n transaction._end = Math.max(latestSpanEnd, latestXHRSpanEnd, lcp, transactionEndWithoutDelay);\n } else if (latestSpanEnd > transaction._end) {\n transaction._end = latestSpanEnd;\n }\n\n this.truncateSpans(spans, transaction._end);\n };\n\n _proto.truncateSpans = function truncateSpans(spans, transactionEnd) {\n for (var i = 0; i < spans.length; i++) {\n var span = spans[i];\n\n if (span._end > transactionEnd) {\n span._end = transactionEnd;\n span.type += TRUNCATED_TYPE;\n }\n\n if (span._start > transactionEnd) {\n span._start = transactionEnd;\n }\n }\n };\n\n _proto.shouldIgnoreTransaction = function shouldIgnoreTransaction(transactionName) {\n var ignoreList = this._config.get('ignoreTransactions');\n\n if (ignoreList && ignoreList.length) {\n for (var i = 0; i < ignoreList.length; i++) {\n var element = ignoreList[i];\n\n if (typeof element.test === 'function') {\n if (element.test(transactionName)) {\n return true;\n }\n } else if (element === transactionName) {\n return true;\n }\n }\n }\n\n return false;\n };\n\n _proto.startSpan = function startSpan(name, type, options) {\n var tr = this.getCurrentTransaction();\n\n if (!tr) {\n tr = this.createCurrentTransaction(undefined, TEMPORARY_TYPE, this.createOptions({\n canReuse: true,\n managed: true\n }));\n }\n\n var span = tr.startSpan(name, type, options);\n\n if (__DEV__) {\n this._logger.debug(\"startSpan(\" + name + \", \" + span.type + \")\", \"on transaction(\" + tr.id + \", \" + tr.name + \")\");\n }\n\n return span;\n };\n\n _proto.endSpan = function endSpan(span, context) {\n if (!span) {\n return;\n }\n\n if (__DEV__) {\n var tr = this.getCurrentTransaction();\n tr && this._logger.debug(\"endSpan(\" + span.name + \", \" + span.type + \")\", \"on transaction(\" + tr.id + \", \" + tr.name + \")\");\n }\n\n span.end(null, context);\n };\n\n return TransactionService;\n}();\n\nexport default TransactionService;","import { registerServices as registerErrorServices } from './error-logging';\nimport { registerServices as registerPerfServices } from './performance-monitoring';\nimport { ServiceFactory } from './common/service-factory';\nimport { isPlatformSupported, scheduleMicroTask, scheduleMacroTask, isBrowser } from './common/utils';\nimport { patchAll, patchEventHandler } from './common/patching';\nimport { observePageVisibility, observePageClicks } from './common/observers';\nimport { PAGE_LOAD_DELAY, PAGE_LOAD, ERROR, CONFIG_SERVICE, LOGGING_SERVICE, TRANSACTION_SERVICE, APM_SERVER, PERFORMANCE_MONITORING, ERROR_LOGGING, EVENT_TARGET, CLICK } from './common/constants';\nimport { getInstrumentationFlags } from './common/instrument';\nimport afterFrame from './common/after-frame';\nimport { bootstrap } from './bootstrap';\nimport { createTracer } from './opentracing';\n\nfunction createServiceFactory() {\n registerPerfServices();\n registerErrorServices();\n var serviceFactory = new ServiceFactory();\n return serviceFactory;\n}\n\nexport { createServiceFactory, ServiceFactory, patchAll, patchEventHandler, isPlatformSupported, isBrowser, getInstrumentationFlags, createTracer, scheduleMicroTask, scheduleMacroTask, afterFrame, ERROR, PAGE_LOAD_DELAY, PAGE_LOAD, CONFIG_SERVICE, LOGGING_SERVICE, TRANSACTION_SERVICE, APM_SERVER, PERFORMANCE_MONITORING, ERROR_LOGGING, EVENT_TARGET, CLICK, bootstrap, observePageVisibility, observePageClicks };","import PerformanceMonitoring from './performance-monitoring';\nimport TransactionService from './transaction-service';\nimport { APM_SERVER, CONFIG_SERVICE, LOGGING_SERVICE, TRANSACTION_SERVICE, PERFORMANCE_MONITORING } from '../common/constants';\nimport { serviceCreators } from '../common/service-factory';\n\nfunction registerServices() {\n serviceCreators[TRANSACTION_SERVICE] = function (serviceFactory) {\n var _serviceFactory$getSe = serviceFactory.getService([LOGGING_SERVICE, CONFIG_SERVICE]),\n loggingService = _serviceFactory$getSe[0],\n configService = _serviceFactory$getSe[1];\n\n return new TransactionService(loggingService, configService);\n };\n\n serviceCreators[PERFORMANCE_MONITORING] = function (serviceFactory) {\n var _serviceFactory$getSe2 = serviceFactory.getService([APM_SERVER, CONFIG_SERVICE, LOGGING_SERVICE, TRANSACTION_SERVICE]),\n apmServer = _serviceFactory$getSe2[0],\n configService = _serviceFactory$getSe2[1],\n loggingService = _serviceFactory$getSe2[2],\n transactionService = _serviceFactory$getSe2[3];\n\n return new PerformanceMonitoring(apmServer, configService, loggingService, transactionService);\n };\n}\n\nexport { registerServices };","import ErrorLogging from './error-logging';\nimport { CONFIG_SERVICE, TRANSACTION_SERVICE, ERROR_LOGGING, APM_SERVER } from '../common/constants';\nimport { serviceCreators } from '../common/service-factory';\n\nfunction registerServices() {\n serviceCreators[ERROR_LOGGING] = function (serviceFactory) {\n var _serviceFactory$getSe = serviceFactory.getService([APM_SERVER, CONFIG_SERVICE, TRANSACTION_SERVICE]),\n apmServer = _serviceFactory$getSe[0],\n configService = _serviceFactory$getSe[1],\n transactionService = _serviceFactory$getSe[2];\n\n return new ErrorLogging(apmServer, configService, transactionService);\n };\n}\n\nexport { registerServices };","import { isPlatformSupported, isBrowser, now } from './common/utils';\nimport { patchAll } from './common/patching';\nimport { state } from './state';\nvar enabled = false;\nexport function bootstrap() {\n if (isPlatformSupported()) {\n patchAll();\n state.bootstrapTime = now();\n enabled = true;\n } else if (isBrowser) {\n console.log('[Elastic APM] platform is not supported!');\n }\n\n return enabled;\n}","import { QUEUE_ADD_TRANSACTION, QUEUE_FLUSH } from '../constants';\nimport { state } from '../../state';\nimport { now } from '../utils';\nexport function observePageVisibility(configService, transactionService) {\n if (document.visibilityState === 'hidden') {\n state.lastHiddenStart = 0;\n }\n\n var visibilityChangeHandler = function visibilityChangeHandler() {\n if (document.visibilityState === 'hidden') {\n onPageHidden(configService, transactionService);\n }\n };\n\n var pageHideHandler = function pageHideHandler() {\n return onPageHidden(configService, transactionService);\n };\n\n var useCapture = true;\n window.addEventListener('visibilitychange', visibilityChangeHandler, useCapture);\n window.addEventListener('pagehide', pageHideHandler, useCapture);\n return function () {\n window.removeEventListener('visibilitychange', visibilityChangeHandler, useCapture);\n window.removeEventListener('pagehide', pageHideHandler, useCapture);\n };\n}\n\nfunction onPageHidden(configService, transactionService) {\n var tr = transactionService.getCurrentTransaction();\n\n if (tr) {\n var unobserve = configService.observeEvent(QUEUE_ADD_TRANSACTION, function () {\n configService.dispatchEvent(QUEUE_FLUSH);\n state.lastHiddenStart = now();\n unobserve();\n });\n tr.end();\n } else {\n configService.dispatchEvent(QUEUE_FLUSH);\n state.lastHiddenStart = now();\n }\n}","import { USER_INTERACTION } from '../constants';\nexport function observePageClicks(transactionService) {\n var clickHandler = function clickHandler(event) {\n if (event.target instanceof Element) {\n createUserInteractionTransaction(transactionService, event.target);\n }\n };\n\n var eventName = 'click';\n var useCapture = true;\n window.addEventListener(eventName, clickHandler, useCapture);\n return function () {\n window.removeEventListener(eventName, clickHandler, useCapture);\n };\n}\n\nfunction createUserInteractionTransaction(transactionService, target) {\n var _getTransactionMetada = getTransactionMetadata(target),\n transactionName = _getTransactionMetada.transactionName,\n context = _getTransactionMetada.context;\n\n var tr = transactionService.startTransaction(\"Click - \" + transactionName, USER_INTERACTION, {\n managed: true,\n canReuse: true,\n reuseThreshold: 300\n });\n\n if (tr && context) {\n tr.addContext(context);\n }\n}\n\nfunction getTransactionMetadata(target) {\n var metadata = {\n transactionName: null,\n context: null\n };\n var tagName = target.tagName.toLowerCase();\n var transactionName = tagName;\n\n if (!!target.dataset.transactionName) {\n transactionName = target.dataset.transactionName;\n } else {\n var name = target.getAttribute('name');\n\n if (!!name) {\n transactionName = tagName + \"[\\\"\" + name + \"\\\"]\";\n }\n }\n\n metadata.transactionName = transactionName;\n var classes = target.getAttribute('class');\n\n if (classes) {\n metadata.context = {\n custom: {\n classes: classes\n }\n };\n }\n\n return metadata;\n}","/**\n * MIT License\n *\n * Copyright (c) 2017-present, Elasticsearch BV\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\nimport {\n getInstrumentationFlags,\n PAGE_LOAD_DELAY,\n PAGE_LOAD,\n ERROR,\n CONFIG_SERVICE,\n LOGGING_SERVICE,\n TRANSACTION_SERVICE,\n PERFORMANCE_MONITORING,\n ERROR_LOGGING,\n APM_SERVER,\n EVENT_TARGET,\n CLICK,\n observePageVisibility,\n observePageClicks\n} from '@elastic/apm-rum-core'\n\nexport default class ApmBase {\n constructor(serviceFactory, disable) {\n this._disable = disable\n this.serviceFactory = serviceFactory\n this._initialized = false\n }\n\n isEnabled() {\n return !this._disable\n }\n\n isActive() {\n const configService = this.serviceFactory.getService(CONFIG_SERVICE)\n return this.isEnabled() && this._initialized && configService.get('active')\n }\n\n init(config) {\n if (this.isEnabled() && !this._initialized) {\n this._initialized = true\n const [\n configService,\n loggingService,\n transactionService\n ] = this.serviceFactory.getService([\n CONFIG_SERVICE,\n LOGGING_SERVICE,\n TRANSACTION_SERVICE\n ])\n /**\n * Set Agent version to be sent as part of metadata to the APM Server\n */\n configService.setVersion('5.12.0')\n this.config(config)\n /**\n * Set level here to account for both active and inactive cases\n */\n const logLevel = configService.get('logLevel')\n loggingService.setLevel(logLevel)\n /**\n * Deactive agent when the active config flag is set to false\n */\n const isConfigActive = configService.get('active')\n if (isConfigActive) {\n this.serviceFactory.init()\n\n const flags = getInstrumentationFlags(\n configService.get('instrument'),\n configService.get('disableInstrumentations')\n )\n\n const performanceMonitoring = this.serviceFactory.getService(\n PERFORMANCE_MONITORING\n )\n performanceMonitoring.init(flags)\n\n if (flags[ERROR]) {\n const errorLogging = this.serviceFactory.getService(ERROR_LOGGING)\n errorLogging.registerListeners()\n }\n\n if (configService.get('session')) {\n let localConfig = configService.getLocalConfig()\n if (localConfig && localConfig.session) {\n configService.setConfig({\n session: localConfig.session\n })\n }\n }\n\n const sendPageLoad = () =>\n flags[PAGE_LOAD] && this._sendPageLoadMetrics()\n\n if (configService.get('centralConfig')) {\n /**\n * Waiting for the remote config before sending the page load transaction\n */\n this.fetchCentralConfig().then(sendPageLoad)\n } else {\n sendPageLoad()\n }\n\n observePageVisibility(configService, transactionService)\n if (flags[EVENT_TARGET] && flags[CLICK]) {\n observePageClicks(transactionService)\n }\n } else {\n this._disable = true\n loggingService.warn('RUM agent is inactive')\n }\n }\n return this\n }\n\n /**\n * `fetchCentralConfig` returns a promise that will always resolve\n * if the internal config fetch fails the the promise resolves to `undefined` otherwise\n * it resolves to the fetched config.\n */\n fetchCentralConfig() {\n const [\n apmServer,\n loggingService,\n configService\n ] = this.serviceFactory.getService([\n APM_SERVER,\n LOGGING_SERVICE,\n CONFIG_SERVICE\n ])\n\n return apmServer\n .fetchConfig(\n configService.get('serviceName'),\n configService.get('environment')\n )\n .then(config => {\n var transactionSampleRate = config['transaction_sample_rate']\n if (transactionSampleRate) {\n transactionSampleRate = Number(transactionSampleRate)\n const config = { transactionSampleRate }\n const { invalid } = configService.validate(config)\n if (invalid.length === 0) {\n configService.setConfig(config)\n } else {\n const { key, value, allowed } = invalid[0]\n loggingService.warn(\n `invalid value \"${value}\" for ${key}. Allowed: ${allowed}.`\n )\n }\n }\n return config\n })\n .catch(error => {\n loggingService.warn('failed fetching config:', error)\n })\n }\n\n _sendPageLoadMetrics() {\n /**\n * Name of the transaction is set in transaction service to\n * avoid duplicating the logic at multiple places\n */\n const tr = this.startTransaction(undefined, PAGE_LOAD, {\n managed: true,\n canReuse: true\n })\n\n if (!tr) {\n return\n }\n\n tr.addTask(PAGE_LOAD)\n const sendPageLoadMetrics = () => {\n // The reasons of this timeout are:\n // 1. to make sure PerformanceTiming.loadEventEnd has a value.\n // 2. to make sure the agent intercepts all the LCP entries triggered by the browser (adding a delay in the timeout).\n // The browser might need more time after the pageload event to render other elements (e.g. images).\n // That's important because a LCP is only triggered when the related element is completely rendered.\n // https://w3c.github.io/largest-contentful-paint/#sec-add-lcp-entry\n setTimeout(() => tr.removeTask(PAGE_LOAD), PAGE_LOAD_DELAY)\n }\n\n if (document.readyState === 'complete') {\n sendPageLoadMetrics()\n } else {\n window.addEventListener('load', sendPageLoadMetrics)\n }\n }\n\n observe(name, fn) {\n const configService = this.serviceFactory.getService(CONFIG_SERVICE)\n configService.events.observe(name, fn)\n }\n\n /**\n * When the required config keys are invalid, the agent is deactivated with\n * logging error to the console\n *\n * validation error format\n * {\n * missing: [ 'key1', 'key2'],\n * invalid: [{\n * key: 'a',\n * value: 'abcd',\n * allowed: 'string'\n * }],\n * unknown: ['key3', 'key4']\n * }\n */\n config(config) {\n const [configService, loggingService] = this.serviceFactory.getService([\n CONFIG_SERVICE,\n LOGGING_SERVICE\n ])\n const { missing, invalid, unknown } = configService.validate(config)\n if (unknown.length > 0) {\n const message =\n 'Unknown config options are specified for RUM agent: ' +\n unknown.join(', ')\n loggingService.warn(message)\n }\n\n if (missing.length === 0 && invalid.length === 0) {\n configService.setConfig(config)\n } else {\n const separator = ', '\n let message = \"RUM agent isn't correctly configured. \"\n\n if (missing.length > 0) {\n message += missing.join(separator) + ' is missing'\n if (invalid.length > 0) {\n message += separator\n }\n }\n\n invalid.forEach(({ key, value, allowed }, index) => {\n message +=\n `${key} \"${value}\" contains invalid characters! (allowed: ${allowed})` +\n (index !== invalid.length - 1 ? separator : '')\n })\n loggingService.error(message)\n configService.setConfig({ active: false })\n }\n }\n\n setUserContext(userContext) {\n var configService = this.serviceFactory.getService(CONFIG_SERVICE)\n configService.setUserContext(userContext)\n }\n\n setCustomContext(customContext) {\n var configService = this.serviceFactory.getService(CONFIG_SERVICE)\n configService.setCustomContext(customContext)\n }\n\n addLabels(labels) {\n var configService = this.serviceFactory.getService(CONFIG_SERVICE)\n configService.addLabels(labels)\n }\n\n // Should call this method before 'load' event on window is fired\n setInitialPageLoadName(name) {\n const configService = this.serviceFactory.getService(CONFIG_SERVICE)\n configService.setConfig({\n pageLoadTransactionName: name\n })\n }\n\n startTransaction(name, type, options) {\n if (this.isEnabled()) {\n var transactionService = this.serviceFactory.getService(\n TRANSACTION_SERVICE\n )\n return transactionService.startTransaction(name, type, options)\n }\n }\n\n startSpan(name, type, options) {\n if (this.isEnabled()) {\n var transactionService = this.serviceFactory.getService(\n TRANSACTION_SERVICE\n )\n return transactionService.startSpan(name, type, options)\n }\n }\n\n getCurrentTransaction() {\n if (this.isEnabled()) {\n var transactionService = this.serviceFactory.getService(\n TRANSACTION_SERVICE\n )\n return transactionService.getCurrentTransaction()\n }\n }\n\n captureError(error) {\n if (this.isEnabled()) {\n var errorLogging = this.serviceFactory.getService(ERROR_LOGGING)\n return errorLogging.logError(error)\n }\n }\n\n addFilter(fn) {\n var configService = this.serviceFactory.getService(CONFIG_SERVICE)\n configService.addFilter(fn)\n }\n}\n","import { XMLHTTPREQUEST, FETCH, HISTORY, PAGE_LOAD, ERROR, EVENT_TARGET, CLICK } from './constants';\nexport function getInstrumentationFlags(instrument, disabledInstrumentations) {\n var _flags;\n\n var flags = (_flags = {}, _flags[XMLHTTPREQUEST] = false, _flags[FETCH] = false, _flags[HISTORY] = false, _flags[PAGE_LOAD] = false, _flags[ERROR] = false, _flags[EVENT_TARGET] = false, _flags[CLICK] = false, _flags);\n\n if (!instrument) {\n return flags;\n }\n\n Object.keys(flags).forEach(function (key) {\n if (disabledInstrumentations.indexOf(key) === -1) {\n flags[key] = true;\n }\n });\n return flags;\n}","/**\n * MIT License\n *\n * Copyright (c) 2017-present, Elasticsearch BV\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\nimport {\n createServiceFactory,\n bootstrap,\n isBrowser\n} from '@elastic/apm-rum-core'\nimport ApmBase from './apm-base'\n\n/**\n * Use a single instance of ApmBase across all instance of the agent\n * including the instances used in framework specific integrations\n */\nfunction getApmBase() {\n if (isBrowser && window.elasticApm) {\n return window.elasticApm\n }\n const enabled = bootstrap()\n const serviceFactory = createServiceFactory()\n const apmBase = new ApmBase(serviceFactory, !enabled)\n\n if (isBrowser) {\n window.elasticApm = apmBase\n }\n\n return apmBase\n}\n\nconst apmBase = getApmBase()\n\nconst init = apmBase.init.bind(apmBase)\n\nexport default init\nexport { init, apmBase, ApmBase, apmBase as apm }\n"],"sourceRoot":""} \ No newline at end of file +{"version":3,"sources":["webpack://@elastic/apm-rum/../node_modules/error-stack-parser/error-stack-parser.js","webpack://@elastic/apm-rum/../node_modules/stackframe/stackframe.js","webpack://@elastic/apm-rum/webpack/bootstrap","webpack://@elastic/apm-rum/webpack/runtime/compat get default export","webpack://@elastic/apm-rum/webpack/runtime/define property getters","webpack://@elastic/apm-rum/webpack/runtime/hasOwnProperty shorthand","webpack://@elastic/apm-rum/../node_modules/promise-polyfill/src/finally.js","webpack://@elastic/apm-rum/../node_modules/promise-polyfill/src/index.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/polyfills.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/utils.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/patching/patch-utils.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/constants.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/patching/xhr-patch.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/http/response-status.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/http/fetch.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/event-handler.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/patching/index.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/patching/fetch-patch.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/patching/history-patch.js","webpack://@elastic/apm-rum/../rum-core/dist/es/state.js","webpack://@elastic/apm-rum/../rum-core/dist/es/bootstrap.js","webpack://@elastic/apm-rum/../rum-core/dist/es/error-logging/stack-trace.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/url.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/context.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/truncate.js","webpack://@elastic/apm-rum/../rum-core/dist/es/error-logging/error-logging.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/queue.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/ndjson.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/navigation/marks.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/compress.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/http/xhr.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/apm-server.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/throttle.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/config-service.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/service-factory.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/logging-service.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/performance-monitoring.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/span-base.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/span.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/breakdown.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/transaction.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/metrics/metrics.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/navigation/utils.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/navigation/navigation-timing.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/navigation/resource-timing.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/navigation/capture-navigation.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/navigation/user-timing.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/transaction-service.js","webpack://@elastic/apm-rum/../rum-core/dist/es/index.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/index.js","webpack://@elastic/apm-rum/../rum-core/dist/es/error-logging/index.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/metrics/inp/process.js","webpack://@elastic/apm-rum/../rum-core/dist/es/performance-monitoring/metrics/inp/report.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/observers/page-visibility.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/observers/page-clicks.js","webpack://@elastic/apm-rum/./src/apm-base.js","webpack://@elastic/apm-rum/../rum-core/dist/es/common/instrument.js","webpack://@elastic/apm-rum/./src/index.js"],"names":["StackFrame","FIREFOX_SAFARI_STACK_REGEXP","CHROME_IE_STACK_REGEXP","SAFARI_NATIVE_CODE_REGEXP","_map","array","fn","thisArg","Array","prototype","map","output","length","i","call","_filter","filter","push","parse","error","stacktrace","this","parseOpera","stack","match","parseV8OrIE","parseFFOrSafari","Error","extractLocation","urlLike","indexOf","parts","exec","replace","undefined","split","line","tokens","slice","locationParts","pop","functionName","join","fileName","target","_indexOf","e","message","parseOpera9","parseOpera11","parseOpera10","lineRE","lines","result","len","argsRaw","functionCall","shift","args","_isNumber","n","isNaN","parseFloat","isFinite","lineNumber","columnNumber","source","setFunctionName","setArgs","setFileName","setLineNumber","setColumnNumber","setSource","getFunctionName","v","String","getArgs","Object","toString","TypeError","getFileName","getLineNumber","Number","getColumnNumber","getSource","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","exports","module","__webpack_modules__","getter","__esModule","d","a","definition","key","o","defineProperty","enumerable","get","obj","prop","hasOwnProperty","callback","constructor","then","value","resolve","reason","reject","setTimeoutFunc","setTimeout","isArray","x","Boolean","noop","Promise","_state","_handled","_value","_deferreds","doResolve","handle","self","deferred","_immediateFn","cb","onFulfilled","onRejected","ret","promise","newValue","finale","apply","arguments","_unhandledRejectionFn","Handler","done","ex","prom","all","arr","remaining","res","val","race","setImmediate","err","console","warn","local","isBrowser","window","PromisePollyfill","PERF","performance","byteToHex","substr","destination","Uint8Array","generateRandomId","buffer","hexOctets","_i","bytesToHex","crypto","getRandomValues","msCrypto","setRequestHeader","name","headers","append","checkSameOrigin","isSame","test","forEach","t","isPlatformSupported","Set","JSON","stringify","now","XMLHttpRequest","setLabel","skey","removeInvalidChars","valueType","stripQueryStringFromUrl","url","isObject","baseExtend","dst","objs","deep","ii","keys","j","jj","src","getCurrentScript","document","currentScript","scripts","getElementsByTagName","l","sc","getElasticScript","extend","create","merge","isUndefined","getLatestSpan","spans","typeFilter","latestSpan","_i3","span","type","_end","getTime","time","getDuration","start","end","parseInt","scheduleMicroTask","isPerfTimelineSupported","getEntriesByType","isPerfTypeSupported","PerformanceObserver","supportedEntryTypes","isPerfInteractionCountSupported","isRedirectInfoAvailable","timing","redirectStart","globalState","fetchInProgress","apmSymbol","patchMethod","patchFn","proto","getPrototypeOf","delegate","patched","original","propertyDesc","delegateName","desc","getOwnPropertyDescriptor","writable","set","patchDelegate","XHR_IGNORE","XHR_SYNC","XHR_URL","XHR_METHOD","INVOKE","RESOURCE_INITIATOR_TYPES","PAGE_LOAD","TRANSACTION_TYPE_ORDER","patchXMLHttpRequest","XMLHttpRequestPrototype","openNative","sendNative","task","state","data","method","sync","status","addListener","_ref","readyState","invokeTask","scheduleTask","isResponseSuccessful","_extends","assign","shouldUseFetchWithKeepAlive","payload","isFetchSupported","Request","size","Blob","calculateSize","fetch","EventHandler","observers","_proto","observe","_this","index","splice","sendOnly","obs","log","send","patchEventHandler","alreadyPatched","patchAll","event","nativeFetch","input","init","request","fetchSelf","isURL","URL","aborted","response","clonedResponse","clone","body","readStream","handleResponseError","isAbortError","stream","reader","getReader","read","patchFetch","history","nativePushState","pushState","title","patchHistory","bootstrapTime","lastHiddenStart","MIN_SAFE_INTEGER","enabled","bootstrap","createStackTraces","stackParser","errorEvent","filename","lineno","colno","stackTraces","isValidStackTrace","frame","fnName","_stack$functionName","fileUrl","origin","filePath","cleanFilePath","cleanedFileName","location","protocol","hostname","port","href","isFileInline","abs_path","function","RULES","NaN","PROTOCOL_REGEX","Url","_this$extractProtocol","extractProtocol","address","slashes","relative","getLocation","instructions","instruction","instLength","newIndex","lastIndexOf","Math","max","toLowerCase","path","charAt","host","isDefaultPort","auth","userpass","query","hash","globalVar","_excluded","getResponseContext","perfTimingEntry","respContext","transfer_size","transferSize","encoded_body_size","encodedBodySize","decoded_body_size","decodedBodySize","serverTimingStr","serverTimingEntries","serverTimingInfo","_i2","_serverTimingEntries$","duration","description","timingValue","valueSeparator","getServerTimingInfo","serverTiming","getDestination","parsedUrl","portNumber","getPortNumber","ipv6Hostname","charCodeAt","service","resource","getPageContext","page","referer","referrer","addSpanContext","context","statusCode","http","status_code","getExternalContext","entry","getResourceContext","getNavigationContext","addContext","addTransactionContext","transaction","_temp","configContext","tags","excluded","sourceKeys","_objectWithoutPropertiesLoose","pageContext","responseContext","ensureContext","entries","METADATA_MODEL","version","agent","environment","labels","RESPONSE_MODEL","CONTEXT_MODEL","user","id","email","username","SPAN_MODEL","trace_id","parent_id","transaction_id","subtype","action","TRANSACTION_MODEL","span_count","started","ERROR_MODEL","culprit","exception","isEmpty","replaceValue","currModel","limit","required","placeholder","substring","truncate","truncateModel","model","childTarget","emptyArr","_loop","currKey","IGNORE_KEYS","ErrorLogging","apmServer","configService","transactionService","_apmServer","_configService","_transactionService","createErrorDataModel","filteredFrames","frames","filterInvalidFrames","lastFrame","errorMessage","errorType","errorContext","customProperties","propertyFound","properties","toISOString","getErrorProperties","custom","currentTransaction","getCurrentTransaction","transactionContext","_this$_configService$","errorObject","traceId","sampled","logErrorEvent","addError","registerListeners","addEventListener","promiseRejectionEvent","logPromiseEvent","_parseRejectReason","logError","messageOrError","Queue","onFlush","opts","items","queueLimit","flushInterval","timeoutId","_setTimer","flush","_clear","clearTimeout","add","item","NDJSON","object","NAVIGATION_TIMING_MARKS","COMPRESSED_NAV_TIMING_MARKS","getPageLoadMarks","marks","fetchStart","navigationStart","responseStart","responseEnd","timingKey","m","getNavigationTimingMarks","navigationTiming","timeToFirstByte","domInteractive","domComplete","compressResponse","ts","ebs","dbs","compressContext","compressed","p","rf","h","mt","r","compressHTTP","dt","se","rc","ad","po","u","un","em","cu","compressMarks","compressedNtMarks","ntMarks","mark","mapping","compressNavigationTimingMarks","nt","compressAgentMarks","agentMarks","fb","rs","di","dc","fp","firstContentfulPaint","lp","largestContentfulPaint","compressPayload","params","isCompressionStreamSupported","CompressionStream","flagName","sessionStorage","getItem","URLSearchParams","isFlagSet","searchParams","has","setItem","isBeaconInspectionEnabled","beforeSend","compressedStream","pipeThrough","Response","blob","sendXHR","_ref$timeout","timeout","HTTP_REQUEST_TIMEOUT","sendCredentials","xhr","open","withCredentials","header","onreadystatechange","responseText","onerror","canSend","ApmServer","loggingService","_loggingService","queue","throttleEvents","events","sendEvents","catch","_constructError","onThrottle","interval","counter","throttle","bind","observeEvent","_postJson","endPoint","_this2","_makeHttpRequest","_ref2","_ref2$timeout","fetchResponse","_ref$keepalive","keepalive","timeoutConfig","AbortController","controller","signal","abort","credentials","text","bodyResponse","sendFetchRequest","fetchConfig","serviceName","_this3","configEndpoint","getEndpoints","localConfig","getLocalConfig","etag","apmRequest","remoteConfig","getResponseHeader","setLocalConfig","createMetaData","cfg","metadata","language","_this$throttleEvents","addTransaction","_this$throttleEvents2","ndjsonErrors","errors","compress","_NDJSON$stringify","cl","mg","st","ap","f","li","co","c","tid","pid","xid","sm","compressError","ndjsonMetricsets","metricsets","metricset","ndjsonTransactions","transactions","_this4","tr","_NDJSON$stringify2","breakdowns","breakdown","spanData","s","outcome","sr","sample_rate","sy","su","ac","k","me","samples","y","sa","ysc","yss","yc","sd","experience","_transaction$experien","cls","fid","tbt","longtask","exp","lt","session","_transaction$session","sequence","ses","seq","compressTransaction","_payload","_NDJSON$stringify3","filteredPayload","applyFilters","ndjson","metadataKey","ve","la","en","compressMetadata","ndjsonPayload","concat","intakeEndpoint","serverUrl","apiVersion","_serviceCreators","Config","config","serviceVersion","serverUrlPrefix","active","instrument","disableInstrumentations","logLevel","breakdownMetrics","ignoreTransactions","eventsLimit","distributedTracing","distributedTracingOrigins","distributedTracingHeaderName","pageLoadTraceId","pageLoadSpanId","pageLoadSampled","pageLoadParentId","pageLoadTransactionName","propagateTracestate","transactionSampleRate","centralConfig","monitorLongtasks","filters","scriptData","node","dataAttrs","dataRegex","attrs","attributes","attr","nodeName","camelCasedkey","toUpperCase","nodeValue","getDataAttributesFromNode","setConfig","setVersion","addFilter","reduce","objKey","setUserContext","userContext","_userContext","setCustomContext","customContext","addLabels","_properties","round","validate","requiredKeys","allKeys","missing","invalid","unknown","allowed","sampleRate","storage","localStorage","dispatchEvent","LoggingService","spec","levels","level","prefix","resetLogMethods","shouldLog","setLevel","normalizedLevel","realMethod","serviceCreators","ConfigService","factory","_factory$getService","getService","ServiceFactory","instances","initialized","_this$getService","PerformanceMonitoring","_logginService","flags","TRANSACTION_END","createTransactionPayload","getHistorySub","getXHRSub","getFetchSub","startTransaction","managed","canReuse","processAPICalls","endpoints","some","endpoint","requestUrl","spanName","startSpan","blocking","isDtEnabled","dtOrigins","currentUrl","isSameOrigin","injectDtHeader","injectTSHeader","process","_data","_span","_target","endSpan","headerName","headerValue","parentId","dtVersion","getDtHeaderValue","getTSHeaderValue","extractDtHeader","parsed","parseDtHeaderValue","filterTransaction","isManaged","createTransactionDataModel","transactionStart","_start","transactionData","breakdownTimings","adjustedTransaction","filterdSpans","similarSpans","originalSpans","transDuration","threshold","sort","spanA","spanB","lastCount","lastSpan","isContinuouslySimilar","isLastSpan","groupSmallContinuouslySimilarSpans","resetFields","adjustTransaction","SpanBase","options","timestamp","startTime","ended","onEnd","ctx","_len","_key","endTime","callOnEnd","_setPrototypeOf","setPrototypeOf","__proto__","_SpanBase","subClass","superClass","Span","fields","pageLoadBreakdowns","getValue","getSpanBreakdown","transactionDetails","details","_ref$count","count","Transaction","_activeSpans","_activeTasks","blocked","captureTimings","random","addMarks","markTime","reuseThreshold","redefine","trc","_onSpanEnd","addTask","isFinished","detectFinish","sid","captureBreakdown","timings","current","spanMap","transactionSelfTime","span1","span2","spanEnd","spanStart","lastContinuousEnd","selfTime","calculateSelfTime","groupSpans","_key$split","_spanMap$key","_captureBreakdown","block","flag","taskId","removeTask","delete","metrics","fcp","Infinity","score","firstEntryTime","NEGATIVE_INFINITY","prevEntryTime","currentSessionScore","captureObserverEntries","list","isHardNavigation","trStart","longtaskEntries","longtasks","agg","_longtasks$i","attribution","_attribution$","_name","containerType","containerName","containerId","createLongTaskSpans","lcpEntries","lastLcpEntry","lcp","unloadDiff","fcpEntry","getEntriesByName","fidSpan","fidEntries","firstInput","processingStart","createFirstInputDelaySpan","min","blockingTime","calculateTotalBlockingTime","clsEntries","hadRecentInput","calculateCumulativeLayoutShift","PerfEntryRecorder","disconnect","buffered","_","stop","shouldCreateSpan","trEnd","baseTime","eventPairs","createResourceTimingSpan","resourceTimingEntry","initiatorType","kind","isCapturedByPatching","resourceStartTime","requestPatchTime","captureNavigation","customMarks","pageResponse","createNavigationTimingSpans","_trStart","_entries$i","createResourceTimingSpans","userTimingSpans","createUserTimingSpans","TransactionService","logger","_config","_logger","respIntervalId","recorder","_tr$spans","_captureObserverEntri","createCurrentTransaction","createOptions","perfOptions","startManagedTransaction","isRedefined","redefineType","currentTypeOrder","redefineTypeOrder","fireOnstartHook","handleTransactionEnd","shouldIgnoreTransaction","tbtObject","tbtSpan","sum","setSession","urlStr","depth","pathParts","specialCharsRegex","digitsRegex","lowerCaseRegex","upperCaseRegex","redactedParts","redactedBefore","part","numberOfDigits","numberofUpperCase","lowerCaseRate","upperCaseRate","slugifyUrl","adjustTransactionTime","Date","sessionConfig","earliestSpan","_i4","getEarliestSpan","latestSpanEnd","getLatestNonXHRSpan","transactionEndWithoutDelay","latestXHRSpanEnd","getLatestXHRSpan","truncateSpans","transactionEnd","transactionName","ignoreList","element","createServiceFactory","serviceFactory","_serviceFactory$getSe","_serviceFactory$getSe2","inpState","minInteractionId","maxInteractionId","interactionCount","longestInteractions","processUserInteractions","getEntries","interactionId","updateInteractionCount","leastSlow","filteredInteraction","interaction","foundInteraction","b","storeUserInteraction","reportInp","inp","interactionIndex","floor","calculateInp","inpTr","navigations","hardNavigationUrl","inp_value","onPageHidden","unobserve","endManagedTransaction","unobserveDiscard","unobserveQueueAdd","observePageClicks","clickHandler","Element","_getTransactionMetada","dtName","fallbackName","getAttribute","closest","findCustomTransactionName","tagName","buildTransactionName","classes","getTransactionMetadata","createUserInteractionTransaction","removeEventListener","ApmBase","disable","_disable","_initialized","isEnabled","isActive","disabledInstrumentations","_flags","getInstrumentationFlags","sendPageLoad","_sendPageLoadMetrics","fetchCentralConfig","visibilityState","visibilityChangeHandler","pageHideHandler","observePageVisibility","isPerfCountSupported","durationThreshold","observeUserInteractions","sendPageLoadMetrics","setInitialPageLoadName","captureError","apmBase","elasticApm","getApmBase"],"mappings":"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","file":"elastic-apm-rum.umd.min.js","sourcesContent":["(function(root, factory) {\n 'use strict';\n // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.\n\n /* istanbul ignore next */\n if (typeof define === 'function' && define.amd) {\n define('error-stack-parser', ['stackframe'], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory(require('stackframe'));\n } else {\n root.ErrorStackParser = factory(root.StackFrame);\n }\n}(this, function ErrorStackParser(StackFrame) {\n 'use strict';\n\n var FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+\\:\\d+/;\n var CHROME_IE_STACK_REGEXP = /^\\s*at .*(\\S+\\:\\d+|\\(native\\))/m;\n var SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code\\])?$/;\n\n function _map(array, fn, thisArg) {\n if (typeof Array.prototype.map === 'function') {\n return array.map(fn, thisArg);\n } else {\n var output = new Array(array.length);\n for (var i = 0; i < array.length; i++) {\n output[i] = fn.call(thisArg, array[i]);\n }\n return output;\n }\n }\n\n function _filter(array, fn, thisArg) {\n if (typeof Array.prototype.filter === 'function') {\n return array.filter(fn, thisArg);\n } else {\n var output = [];\n for (var i = 0; i < array.length; i++) {\n if (fn.call(thisArg, array[i])) {\n output.push(array[i]);\n }\n }\n return output;\n }\n }\n\n function _indexOf(array, target) {\n if (typeof Array.prototype.indexOf === 'function') {\n return array.indexOf(target);\n } else {\n for (var i = 0; i < array.length; i++) {\n if (array[i] === target) {\n return i;\n }\n }\n return -1;\n }\n }\n\n return {\n /**\n * Given an Error object, extract the most information from it.\n *\n * @param {Error} error object\n * @return {Array} of StackFrames\n */\n parse: function ErrorStackParser$$parse(error) {\n if (typeof error.stacktrace !== 'undefined' || typeof error['opera#sourceloc'] !== 'undefined') {\n return this.parseOpera(error);\n } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) {\n return this.parseV8OrIE(error);\n } else if (error.stack) {\n return this.parseFFOrSafari(error);\n } else {\n throw new Error('Cannot parse given Error object');\n }\n },\n\n // Separate line and column numbers from a string of the form: (URI:Line:Column)\n extractLocation: function ErrorStackParser$$extractLocation(urlLike) {\n // Fail-fast but return locations like \"(native)\"\n if (urlLike.indexOf(':') === -1) {\n return [urlLike];\n }\n\n var regExp = /(.+?)(?:\\:(\\d+))?(?:\\:(\\d+))?$/;\n var parts = regExp.exec(urlLike.replace(/[\\(\\)]/g, ''));\n return [parts[1], parts[2] || undefined, parts[3] || undefined];\n },\n\n parseV8OrIE: function ErrorStackParser$$parseV8OrIE(error) {\n var filtered = _filter(error.stack.split('\\n'), function(line) {\n return !!line.match(CHROME_IE_STACK_REGEXP);\n }, this);\n\n return _map(filtered, function(line) {\n if (line.indexOf('(eval ') > -1) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n line = line.replace(/eval code/g, 'eval').replace(/(\\(eval at [^\\()]*)|(\\)\\,.*$)/g, '');\n }\n var tokens = line.replace(/^\\s+/, '').replace(/\\(eval code/g, '(').split(/\\s+/).slice(1);\n var locationParts = this.extractLocation(tokens.pop());\n var functionName = tokens.join(' ') || undefined;\n var fileName = _indexOf(['eval', ''], locationParts[0]) > -1 ? undefined : locationParts[0];\n\n return new StackFrame(functionName, undefined, fileName, locationParts[1], locationParts[2], line);\n }, this);\n },\n\n parseFFOrSafari: function ErrorStackParser$$parseFFOrSafari(error) {\n var filtered = _filter(error.stack.split('\\n'), function(line) {\n return !line.match(SAFARI_NATIVE_CODE_REGEXP);\n }, this);\n\n return _map(filtered, function(line) {\n // Throw away eval information until we implement stacktrace.js/stackframe#8\n if (line.indexOf(' > eval') > -1) {\n line = line.replace(/ line (\\d+)(?: > eval line \\d+)* > eval\\:\\d+\\:\\d+/g, ':$1');\n }\n\n if (line.indexOf('@') === -1 && line.indexOf(':') === -1) {\n // Safari eval frames only have function names and nothing else\n return new StackFrame(line);\n } else {\n var tokens = line.split('@');\n var locationParts = this.extractLocation(tokens.pop());\n var functionName = tokens.join('@') || undefined;\n return new StackFrame(functionName,\n undefined,\n locationParts[0],\n locationParts[1],\n locationParts[2],\n line);\n }\n }, this);\n },\n\n parseOpera: function ErrorStackParser$$parseOpera(e) {\n if (!e.stacktrace || (e.message.indexOf('\\n') > -1 &&\n e.message.split('\\n').length > e.stacktrace.split('\\n').length)) {\n return this.parseOpera9(e);\n } else if (!e.stack) {\n return this.parseOpera10(e);\n } else {\n return this.parseOpera11(e);\n }\n },\n\n parseOpera9: function ErrorStackParser$$parseOpera9(e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)/i;\n var lines = e.message.split('\\n');\n var result = [];\n\n for (var i = 2, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n if (match) {\n result.push(new StackFrame(undefined, undefined, match[2], match[1], undefined, lines[i]));\n }\n }\n\n return result;\n },\n\n parseOpera10: function ErrorStackParser$$parseOpera10(e) {\n var lineRE = /Line (\\d+).*script (?:in )?(\\S+)(?:: In function (\\S+))?$/i;\n var lines = e.stacktrace.split('\\n');\n var result = [];\n\n for (var i = 0, len = lines.length; i < len; i += 2) {\n var match = lineRE.exec(lines[i]);\n if (match) {\n result.push(\n new StackFrame(\n match[3] || undefined,\n undefined,\n match[2],\n match[1],\n undefined,\n lines[i]\n )\n );\n }\n }\n\n return result;\n },\n\n // Opera 10.65+ Error.stack very similar to FF/Safari\n parseOpera11: function ErrorStackParser$$parseOpera11(error) {\n var filtered = _filter(error.stack.split('\\n'), function(line) {\n return !!line.match(FIREFOX_SAFARI_STACK_REGEXP) && !line.match(/^Error created at/);\n }, this);\n\n return _map(filtered, function(line) {\n var tokens = line.split('@');\n var locationParts = this.extractLocation(tokens.pop());\n var functionCall = (tokens.shift() || '');\n var functionName = functionCall\n .replace(//, '$2')\n .replace(/\\([^\\)]*\\)/g, '') || undefined;\n var argsRaw;\n if (functionCall.match(/\\(([^\\)]*)\\)/)) {\n argsRaw = functionCall.replace(/^[^\\(]+\\(([^\\)]*)\\)$/, '$1');\n }\n var args = (argsRaw === undefined || argsRaw === '[arguments not available]') ?\n undefined : argsRaw.split(',');\n return new StackFrame(\n functionName,\n args,\n locationParts[0],\n locationParts[1],\n locationParts[2],\n line);\n }, this);\n }\n };\n}));\n\n","(function (root, factory) {\n 'use strict';\n // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, Rhino, and browsers.\n\n /* istanbul ignore next */\n if (typeof define === 'function' && define.amd) {\n define('stackframe', [], factory);\n } else if (typeof exports === 'object') {\n module.exports = factory();\n } else {\n root.StackFrame = factory();\n }\n}(this, function () {\n 'use strict';\n function _isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n }\n\n function StackFrame(functionName, args, fileName, lineNumber, columnNumber, source) {\n if (functionName !== undefined) {\n this.setFunctionName(functionName);\n }\n if (args !== undefined) {\n this.setArgs(args);\n }\n if (fileName !== undefined) {\n this.setFileName(fileName);\n }\n if (lineNumber !== undefined) {\n this.setLineNumber(lineNumber);\n }\n if (columnNumber !== undefined) {\n this.setColumnNumber(columnNumber);\n }\n if (source !== undefined) {\n this.setSource(source);\n }\n }\n\n StackFrame.prototype = {\n getFunctionName: function () {\n return this.functionName;\n },\n setFunctionName: function (v) {\n this.functionName = String(v);\n },\n\n getArgs: function () {\n return this.args;\n },\n setArgs: function (v) {\n if (Object.prototype.toString.call(v) !== '[object Array]') {\n throw new TypeError('Args must be an Array');\n }\n this.args = v;\n },\n\n // NOTE: Property name may be misleading as it includes the path,\n // but it somewhat mirrors V8's JavaScriptStackTraceApi\n // https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi and Gecko's\n // http://mxr.mozilla.org/mozilla-central/source/xpcom/base/nsIException.idl#14\n getFileName: function () {\n return this.fileName;\n },\n setFileName: function (v) {\n this.fileName = String(v);\n },\n\n getLineNumber: function () {\n return this.lineNumber;\n },\n setLineNumber: function (v) {\n if (!_isNumber(v)) {\n throw new TypeError('Line Number must be a Number');\n }\n this.lineNumber = Number(v);\n },\n\n getColumnNumber: function () {\n return this.columnNumber;\n },\n setColumnNumber: function (v) {\n if (!_isNumber(v)) {\n throw new TypeError('Column Number must be a Number');\n }\n this.columnNumber = Number(v);\n },\n\n getSource: function () {\n return this.source;\n },\n setSource: function (v) {\n this.source = String(v);\n },\n\n toString: function() {\n var functionName = this.getFunctionName() || '{anonymous}';\n var args = '(' + (this.getArgs() || []).join(',') + ')';\n var fileName = this.getFileName() ? ('@' + this.getFileName()) : '';\n var lineNumber = _isNumber(this.getLineNumber()) ? (':' + this.getLineNumber()) : '';\n var columnNumber = _isNumber(this.getColumnNumber()) ? (':' + this.getColumnNumber()) : '';\n return functionName + args + fileName + lineNumber + columnNumber;\n }\n };\n\n return StackFrame;\n}));\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","/**\n * @this {Promise}\n */\nfunction finallyConstructor(callback) {\n var constructor = this.constructor;\n return this.then(\n function(value) {\n // @ts-ignore\n return constructor.resolve(callback()).then(function() {\n return value;\n });\n },\n function(reason) {\n // @ts-ignore\n return constructor.resolve(callback()).then(function() {\n // @ts-ignore\n return constructor.reject(reason);\n });\n }\n );\n}\n\nexport default finallyConstructor;\n","import promiseFinally from './finally';\n\n// Store setTimeout reference so promise-polyfill will be unaffected by\n// other code modifying setTimeout (like sinon.useFakeTimers())\nvar setTimeoutFunc = setTimeout;\n\nfunction isArray(x) {\n return Boolean(x && typeof x.length !== 'undefined');\n}\n\nfunction noop() {}\n\n// Polyfill for Function.prototype.bind\nfunction bind(fn, thisArg) {\n return function() {\n fn.apply(thisArg, arguments);\n };\n}\n\n/**\n * @constructor\n * @param {Function} fn\n */\nfunction Promise(fn) {\n if (!(this instanceof Promise))\n throw new TypeError('Promises must be constructed via new');\n if (typeof fn !== 'function') throw new TypeError('not a function');\n /** @type {!number} */\n this._state = 0;\n /** @type {!boolean} */\n this._handled = false;\n /** @type {Promise|undefined} */\n this._value = undefined;\n /** @type {!Array} */\n this._deferreds = [];\n\n doResolve(fn, this);\n}\n\nfunction handle(self, deferred) {\n while (self._state === 3) {\n self = self._value;\n }\n if (self._state === 0) {\n self._deferreds.push(deferred);\n return;\n }\n self._handled = true;\n Promise._immediateFn(function() {\n var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n (self._state === 1 ? resolve : reject)(deferred.promise, self._value);\n return;\n }\n var ret;\n try {\n ret = cb(self._value);\n } catch (e) {\n reject(deferred.promise, e);\n return;\n }\n resolve(deferred.promise, ret);\n });\n}\n\nfunction resolve(self, newValue) {\n try {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self)\n throw new TypeError('A promise cannot be resolved with itself.');\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = newValue.then;\n if (newValue instanceof Promise) {\n self._state = 3;\n self._value = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(bind(then, newValue), self);\n return;\n }\n }\n self._state = 1;\n self._value = newValue;\n finale(self);\n } catch (e) {\n reject(self, e);\n }\n}\n\nfunction reject(self, newValue) {\n self._state = 2;\n self._value = newValue;\n finale(self);\n}\n\nfunction finale(self) {\n if (self._state === 2 && self._deferreds.length === 0) {\n Promise._immediateFn(function() {\n if (!self._handled) {\n Promise._unhandledRejectionFn(self._value);\n }\n });\n }\n\n for (var i = 0, len = self._deferreds.length; i < len; i++) {\n handle(self, self._deferreds[i]);\n }\n self._deferreds = null;\n}\n\n/**\n * @constructor\n */\nfunction Handler(onFulfilled, onRejected, promise) {\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, self) {\n var done = false;\n try {\n fn(\n function(value) {\n if (done) return;\n done = true;\n resolve(self, value);\n },\n function(reason) {\n if (done) return;\n done = true;\n reject(self, reason);\n }\n );\n } catch (ex) {\n if (done) return;\n done = true;\n reject(self, ex);\n }\n}\n\nPromise.prototype['catch'] = function(onRejected) {\n return this.then(null, onRejected);\n};\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n // @ts-ignore\n var prom = new this.constructor(noop);\n\n handle(this, new Handler(onFulfilled, onRejected, prom));\n return prom;\n};\n\nPromise.prototype['finally'] = promiseFinally;\n\nPromise.all = function(arr) {\n return new Promise(function(resolve, reject) {\n if (!isArray(arr)) {\n return reject(new TypeError('Promise.all accepts an array'));\n }\n\n var args = Array.prototype.slice.call(arr);\n if (args.length === 0) return resolve([]);\n var remaining = args.length;\n\n function res(i, val) {\n try {\n if (val && (typeof val === 'object' || typeof val === 'function')) {\n var then = val.then;\n if (typeof then === 'function') {\n then.call(\n val,\n function(val) {\n res(i, val);\n },\n reject\n );\n return;\n }\n }\n args[i] = val;\n if (--remaining === 0) {\n resolve(args);\n }\n } catch (ex) {\n reject(ex);\n }\n }\n\n for (var i = 0; i < args.length; i++) {\n res(i, args[i]);\n }\n });\n};\n\nPromise.resolve = function(value) {\n if (value && typeof value === 'object' && value.constructor === Promise) {\n return value;\n }\n\n return new Promise(function(resolve) {\n resolve(value);\n });\n};\n\nPromise.reject = function(value) {\n return new Promise(function(resolve, reject) {\n reject(value);\n });\n};\n\nPromise.race = function(arr) {\n return new Promise(function(resolve, reject) {\n if (!isArray(arr)) {\n return reject(new TypeError('Promise.race accepts an array'));\n }\n\n for (var i = 0, len = arr.length; i < len; i++) {\n Promise.resolve(arr[i]).then(resolve, reject);\n }\n });\n};\n\n// Use polyfill for setImmediate for performance gains\nPromise._immediateFn =\n // @ts-ignore\n (typeof setImmediate === 'function' &&\n function(fn) {\n // @ts-ignore\n setImmediate(fn);\n }) ||\n function(fn) {\n setTimeoutFunc(fn, 0);\n };\n\nPromise._unhandledRejectionFn = function _unhandledRejectionFn(err) {\n if (typeof console !== 'undefined' && console) {\n console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console\n }\n};\n\nexport default Promise;\n","import PromisePollyfill from 'promise-polyfill';\nimport { isBrowser } from './utils';\nvar local = {};\n\nif (isBrowser) {\n local = window;\n} else if (typeof self !== 'undefined') {\n local = self;\n}\n\nvar Promise = 'Promise' in local ? local.Promise : PromisePollyfill;\nexport { Promise };","import { Promise } from './polyfills';\nvar slice = [].slice;\nvar isBrowser = typeof window !== 'undefined';\nvar PERF = isBrowser && typeof performance !== 'undefined' ? performance : {};\n\nfunction isCORSSupported() {\n var xhr = new window.XMLHttpRequest();\n return 'withCredentials' in xhr;\n}\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToHex(buffer) {\n var hexOctets = [];\n\n for (var _i = 0; _i < buffer.length; _i++) {\n hexOctets.push(byteToHex[buffer[_i]]);\n }\n\n return hexOctets.join('');\n}\n\nvar destination = new Uint8Array(16);\n\nfunction rng() {\n if (typeof crypto != 'undefined' && typeof crypto.getRandomValues == 'function') {\n return crypto.getRandomValues(destination);\n } else if (typeof msCrypto != 'undefined' && typeof msCrypto.getRandomValues == 'function') {\n return msCrypto.getRandomValues(destination);\n }\n\n return destination;\n}\n\nfunction generateRandomId(length) {\n var id = bytesToHex(rng());\n return id.substr(0, length);\n}\n\nfunction getDtHeaderValue(span) {\n var dtVersion = '00';\n var dtUnSampledFlags = '00';\n var dtSampledFlags = '01';\n\n if (span && span.traceId && span.id && span.parentId) {\n var flags = span.sampled ? dtSampledFlags : dtUnSampledFlags;\n var id = span.sampled ? span.id : span.parentId;\n return dtVersion + '-' + span.traceId + '-' + id + '-' + flags;\n }\n}\n\nfunction parseDtHeaderValue(value) {\n var parsed = /^([\\da-f]{2})-([\\da-f]{32})-([\\da-f]{16})-([\\da-f]{2})$/.exec(value);\n\n if (parsed) {\n var flags = parsed[4];\n var sampled = flags !== '00';\n return {\n traceId: parsed[2],\n id: parsed[3],\n sampled: sampled\n };\n }\n}\n\nfunction isDtHeaderValid(header) {\n return /^[\\da-f]{2}-[\\da-f]{32}-[\\da-f]{16}-[\\da-f]{2}$/.test(header) && header.slice(3, 35) !== '00000000000000000000000000000000' && header.slice(36, 52) !== '0000000000000000';\n}\n\nfunction getTSHeaderValue(_ref) {\n var sampleRate = _ref.sampleRate;\n\n if (typeof sampleRate !== 'number' || String(sampleRate).length > 256) {\n return;\n }\n\n var NAMESPACE = 'es';\n var SEPARATOR = '=';\n return \"\" + NAMESPACE + SEPARATOR + \"s:\" + sampleRate;\n}\n\nfunction setRequestHeader(target, name, value) {\n if (typeof target.setRequestHeader === 'function') {\n target.setRequestHeader(name, value);\n } else if (target.headers && typeof target.headers.append === 'function') {\n target.headers.append(name, value);\n } else {\n target[name] = value;\n }\n}\n\nfunction checkSameOrigin(source, target) {\n var isSame = false;\n\n if (typeof target === 'string') {\n isSame = source === target;\n } else if (target && typeof target.test === 'function') {\n isSame = target.test(source);\n } else if (Array.isArray(target)) {\n target.forEach(function (t) {\n if (!isSame) {\n isSame = checkSameOrigin(source, t);\n }\n });\n }\n\n return isSame;\n}\n\nfunction isPlatformSupported() {\n return isBrowser && typeof Set === 'function' && typeof JSON.stringify === 'function' && PERF && typeof PERF.now === 'function' && isCORSSupported();\n}\n\nfunction setLabel(key, value, obj) {\n if (!obj || !key) return;\n var skey = removeInvalidChars(key);\n var valueType = typeof value;\n\n if (value != undefined && valueType !== 'boolean' && valueType !== 'number') {\n value = String(value);\n }\n\n obj[skey] = value;\n return obj;\n}\n\nfunction getServerTimingInfo(serverTimingEntries) {\n if (serverTimingEntries === void 0) {\n serverTimingEntries = [];\n }\n\n var serverTimingInfo = [];\n var entrySeparator = ', ';\n var valueSeparator = ';';\n\n for (var _i2 = 0; _i2 < serverTimingEntries.length; _i2++) {\n var _serverTimingEntries$ = serverTimingEntries[_i2],\n name = _serverTimingEntries$.name,\n duration = _serverTimingEntries$.duration,\n description = _serverTimingEntries$.description;\n var timingValue = name;\n\n if (description) {\n timingValue += valueSeparator + 'desc=' + description;\n }\n\n if (duration) {\n timingValue += valueSeparator + 'dur=' + duration;\n }\n\n serverTimingInfo.push(timingValue);\n }\n\n return serverTimingInfo.join(entrySeparator);\n}\n\nfunction getTimeOrigin() {\n return PERF.timing.fetchStart;\n}\n\nfunction stripQueryStringFromUrl(url) {\n return url && url.split('?')[0];\n}\n\nfunction isObject(value) {\n return value !== null && typeof value === 'object';\n}\n\nfunction isFunction(value) {\n return typeof value === 'function';\n}\n\nfunction baseExtend(dst, objs, deep) {\n for (var i = 0, ii = objs.length; i < ii; ++i) {\n var obj = objs[i];\n if (!isObject(obj) && !isFunction(obj)) continue;\n var keys = Object.keys(obj);\n\n for (var j = 0, jj = keys.length; j < jj; j++) {\n var key = keys[j];\n var src = obj[key];\n\n if (deep && isObject(src)) {\n if (!isObject(dst[key])) dst[key] = Array.isArray(src) ? [] : {};\n baseExtend(dst[key], [src], false);\n } else {\n dst[key] = src;\n }\n }\n }\n\n return dst;\n}\n\nfunction getElasticScript() {\n if (typeof document !== 'undefined') {\n var scripts = document.getElementsByTagName('script');\n\n for (var i = 0, l = scripts.length; i < l; i++) {\n var sc = scripts[i];\n\n if (sc.src.indexOf('elastic') > 0) {\n return sc;\n }\n }\n }\n}\n\nfunction getCurrentScript() {\n if (typeof document !== 'undefined') {\n var currentScript = document.currentScript;\n\n if (!currentScript) {\n return getElasticScript();\n }\n\n return currentScript;\n }\n}\n\nfunction extend() {\n return baseExtend(Object.create(null), slice.call(arguments), false);\n}\n\nfunction merge() {\n return baseExtend(Object.create(null), slice.call(arguments), true);\n}\n\nfunction isUndefined(obj) {\n return typeof obj === 'undefined';\n}\n\nfunction noop() {}\n\nfunction find(array, predicate, thisArg) {\n if (array == null) {\n throw new TypeError('array is null or not defined');\n }\n\n var o = Object(array);\n var len = o.length >>> 0;\n\n if (typeof predicate !== 'function') {\n throw new TypeError('predicate must be a function');\n }\n\n var k = 0;\n\n while (k < len) {\n var kValue = o[k];\n\n if (predicate.call(thisArg, kValue, k, o)) {\n return kValue;\n }\n\n k++;\n }\n\n return undefined;\n}\n\nfunction removeInvalidChars(key) {\n return key.replace(/[.*\"]/g, '_');\n}\n\nfunction getLatestSpan(spans, typeFilter) {\n var latestSpan = null;\n\n for (var _i3 = 0; _i3 < spans.length; _i3++) {\n var span = spans[_i3];\n\n if (typeFilter && typeFilter(span.type) && (!latestSpan || latestSpan._end < span._end)) {\n latestSpan = span;\n }\n }\n\n return latestSpan;\n}\n\nfunction getLatestNonXHRSpan(spans) {\n return getLatestSpan(spans, function (type) {\n return String(type).indexOf('external') === -1;\n });\n}\n\nfunction getLatestXHRSpan(spans) {\n return getLatestSpan(spans, function (type) {\n return String(type).indexOf('external') !== -1;\n });\n}\n\nfunction getEarliestSpan(spans) {\n var earliestSpan = spans[0];\n\n for (var _i4 = 1; _i4 < spans.length; _i4++) {\n var span = spans[_i4];\n\n if (earliestSpan._start > span._start) {\n earliestSpan = span;\n }\n }\n\n return earliestSpan;\n}\n\nfunction now() {\n return PERF.now();\n}\n\nfunction getTime(time) {\n return typeof time === 'number' && time >= 0 ? time : now();\n}\n\nfunction getDuration(start, end) {\n if (isUndefined(end) || isUndefined(start)) {\n return null;\n }\n\n return parseInt(end - start);\n}\n\nfunction scheduleMacroTask(callback) {\n setTimeout(callback, 0);\n}\n\nfunction scheduleMicroTask(callback) {\n Promise.resolve().then(callback);\n}\n\nfunction isPerfTimelineSupported() {\n return typeof PERF.getEntriesByType === 'function';\n}\n\nfunction isPerfTypeSupported(type) {\n return typeof PerformanceObserver !== 'undefined' && PerformanceObserver.supportedEntryTypes && PerformanceObserver.supportedEntryTypes.indexOf(type) >= 0;\n}\n\nfunction isPerfInteractionCountSupported() {\n return 'interactionCount' in performance;\n}\n\nfunction isBeaconInspectionEnabled() {\n var flagName = '_elastic_inspect_beacon_';\n\n if (sessionStorage.getItem(flagName) != null) {\n return true;\n }\n\n if (!window.URL || !window.URLSearchParams) {\n return false;\n }\n\n try {\n var parsedUrl = new URL(window.location.href);\n var isFlagSet = parsedUrl.searchParams.has(flagName);\n\n if (isFlagSet) {\n sessionStorage.setItem(flagName, true);\n }\n\n return isFlagSet;\n } catch (e) {}\n\n return false;\n}\n\nfunction isRedirectInfoAvailable(timing) {\n return timing.redirectStart > 0;\n}\n\nexport { extend, merge, isUndefined, noop, baseExtend, bytesToHex, isCORSSupported, isObject, isFunction, isPlatformSupported, isDtHeaderValid, parseDtHeaderValue, getServerTimingInfo, getDtHeaderValue, getTSHeaderValue, getCurrentScript, getElasticScript, getTimeOrigin, generateRandomId, getEarliestSpan, getLatestNonXHRSpan, getLatestXHRSpan, getDuration, getTime, now, rng, checkSameOrigin, scheduleMacroTask, scheduleMicroTask, setLabel, setRequestHeader, stripQueryStringFromUrl, find, removeInvalidChars, PERF, isPerfTimelineSupported, isBrowser, isPerfTypeSupported, isPerfInteractionCountSupported, isBeaconInspectionEnabled, isRedirectInfoAvailable };","export var globalState = {\n fetchInProgress: false\n};\nexport function apmSymbol(name) {\n return '__apm_symbol__' + name;\n}\n\nfunction isPropertyWritable(propertyDesc) {\n if (!propertyDesc) {\n return true;\n }\n\n if (propertyDesc.writable === false) {\n return false;\n }\n\n return !(typeof propertyDesc.get === 'function' && typeof propertyDesc.set === 'undefined');\n}\n\nfunction attachOriginToPatched(patched, original) {\n patched[apmSymbol('OriginalDelegate')] = original;\n}\n\nexport function patchMethod(target, name, patchFn) {\n var proto = target;\n\n while (proto && !proto.hasOwnProperty(name)) {\n proto = Object.getPrototypeOf(proto);\n }\n\n if (!proto && target[name]) {\n proto = target;\n }\n\n var delegateName = apmSymbol(name);\n var delegate;\n\n if (proto && !(delegate = proto[delegateName])) {\n delegate = proto[delegateName] = proto[name];\n var desc = proto && Object.getOwnPropertyDescriptor(proto, name);\n\n if (isPropertyWritable(desc)) {\n var patchDelegate = patchFn(delegate, delegateName, name);\n\n proto[name] = function () {\n return patchDelegate(this, arguments);\n };\n\n attachOriginToPatched(proto[name], delegate);\n }\n }\n\n return delegate;\n}\nexport var XHR_IGNORE = apmSymbol('xhrIgnore');\nexport var XHR_SYNC = apmSymbol('xhrSync');\nexport var XHR_URL = apmSymbol('xhrURL');\nexport var XHR_METHOD = apmSymbol('xhrMethod');","var SCHEDULE = 'schedule';\nvar INVOKE = 'invoke';\nvar ADD_EVENT_LISTENER_STR = 'addEventListener';\nvar REMOVE_EVENT_LISTENER_STR = 'removeEventListener';\nvar RESOURCE_INITIATOR_TYPES = ['link', 'css', 'script', 'img', 'xmlhttprequest', 'fetch', 'beacon', 'iframe'];\nvar REUSABILITY_THRESHOLD = 5000;\nvar MAX_SPAN_DURATION = 5 * 60 * 1000;\nvar PAGE_LOAD_DELAY = 1000;\nvar PAGE_LOAD = 'page-load';\nvar ROUTE_CHANGE = 'route-change';\nvar TYPE_CUSTOM = 'custom';\nvar USER_INTERACTION = 'user-interaction';\nvar HTTP_REQUEST_TYPE = 'http-request';\nvar TEMPORARY_TYPE = 'temporary';\nvar NAME_UNKNOWN = 'Unknown';\nvar PAGE_EXIT = 'page-exit';\nvar TRANSACTION_TYPE_ORDER = [PAGE_LOAD, ROUTE_CHANGE, USER_INTERACTION, HTTP_REQUEST_TYPE, TYPE_CUSTOM, TEMPORARY_TYPE];\nvar OUTCOME_SUCCESS = 'success';\nvar OUTCOME_FAILURE = 'failure';\nvar OUTCOME_UNKNOWN = 'unknown';\nvar USER_TIMING_THRESHOLD = 60;\nvar TRANSACTION_START = 'transaction:start';\nvar TRANSACTION_END = 'transaction:end';\nvar CONFIG_CHANGE = 'config:change';\nvar QUEUE_FLUSH = 'queue:flush';\nvar QUEUE_ADD_TRANSACTION = 'queue:add_transaction';\nvar TRANSACTION_IGNORE = 'transaction:ignore';\nvar XMLHTTPREQUEST = 'xmlhttprequest';\nvar FETCH = 'fetch';\nvar HISTORY = 'history';\nvar EVENT_TARGET = 'eventtarget';\nvar CLICK = 'click';\nvar ERROR = 'error';\nvar BEFORE_EVENT = ':before';\nvar AFTER_EVENT = ':after';\nvar LOCAL_CONFIG_KEY = 'elastic_apm_config';\nvar LONG_TASK = 'longtask';\nvar PAINT = 'paint';\nvar MEASURE = 'measure';\nvar NAVIGATION = 'navigation';\nvar RESOURCE = 'resource';\nvar FIRST_CONTENTFUL_PAINT = 'first-contentful-paint';\nvar LARGEST_CONTENTFUL_PAINT = 'largest-contentful-paint';\nvar FIRST_INPUT = 'first-input';\nvar LAYOUT_SHIFT = 'layout-shift';\nvar EVENT = 'event';\nvar ERRORS = 'errors';\nvar TRANSACTIONS = 'transactions';\nvar CONFIG_SERVICE = 'ConfigService';\nvar LOGGING_SERVICE = 'LoggingService';\nvar TRANSACTION_SERVICE = 'TransactionService';\nvar APM_SERVER = 'ApmServer';\nvar PERFORMANCE_MONITORING = 'PerformanceMonitoring';\nvar ERROR_LOGGING = 'ErrorLogging';\nvar TRUNCATED_TYPE = '.truncated';\nvar KEYWORD_LIMIT = 1024;\nvar SESSION_TIMEOUT = 30 * 60000;\nvar HTTP_REQUEST_TIMEOUT = 10000;\nexport { SCHEDULE, INVOKE, ADD_EVENT_LISTENER_STR, REMOVE_EVENT_LISTENER_STR, RESOURCE_INITIATOR_TYPES, REUSABILITY_THRESHOLD, MAX_SPAN_DURATION, PAGE_LOAD_DELAY, PAGE_LOAD, ROUTE_CHANGE, NAME_UNKNOWN, PAGE_EXIT, TYPE_CUSTOM, USER_TIMING_THRESHOLD, TRANSACTION_START, TRANSACTION_END, CONFIG_CHANGE, QUEUE_FLUSH, QUEUE_ADD_TRANSACTION, TRANSACTION_IGNORE, XMLHTTPREQUEST, FETCH, HISTORY, EVENT_TARGET, CLICK, ERROR, BEFORE_EVENT, AFTER_EVENT, LOCAL_CONFIG_KEY, HTTP_REQUEST_TYPE, LONG_TASK, PAINT, MEASURE, NAVIGATION, RESOURCE, FIRST_CONTENTFUL_PAINT, LARGEST_CONTENTFUL_PAINT, KEYWORD_LIMIT, TEMPORARY_TYPE, USER_INTERACTION, TRANSACTION_TYPE_ORDER, ERRORS, TRANSACTIONS, CONFIG_SERVICE, LOGGING_SERVICE, TRANSACTION_SERVICE, APM_SERVER, PERFORMANCE_MONITORING, ERROR_LOGGING, TRUNCATED_TYPE, FIRST_INPUT, LAYOUT_SHIFT, EVENT, OUTCOME_SUCCESS, OUTCOME_FAILURE, OUTCOME_UNKNOWN, SESSION_TIMEOUT, HTTP_REQUEST_TIMEOUT };","import { patchMethod, XHR_SYNC, XHR_URL, XHR_METHOD, XHR_IGNORE } from './patch-utils';\nimport { SCHEDULE, INVOKE, XMLHTTPREQUEST, ADD_EVENT_LISTENER_STR } from '../constants';\nexport function patchXMLHttpRequest(callback) {\n var XMLHttpRequestPrototype = XMLHttpRequest.prototype;\n\n if (!XMLHttpRequestPrototype || !XMLHttpRequestPrototype[ADD_EVENT_LISTENER_STR]) {\n return;\n }\n\n var READY_STATE_CHANGE = 'readystatechange';\n var LOAD = 'load';\n var ERROR = 'error';\n var TIMEOUT = 'timeout';\n var ABORT = 'abort';\n\n function invokeTask(task, status) {\n if (task.state !== INVOKE) {\n task.state = INVOKE;\n task.data.status = status;\n callback(INVOKE, task);\n }\n }\n\n function scheduleTask(task) {\n if (task.state === SCHEDULE) {\n return;\n }\n\n task.state = SCHEDULE;\n callback(SCHEDULE, task);\n var target = task.data.target;\n\n function addListener(name) {\n target[ADD_EVENT_LISTENER_STR](name, function (_ref) {\n var type = _ref.type;\n\n if (type === READY_STATE_CHANGE) {\n if (target.readyState === 4 && target.status !== 0) {\n invokeTask(task, 'success');\n }\n } else {\n var status = type === LOAD ? 'success' : type;\n invokeTask(task, status);\n }\n });\n }\n\n addListener(READY_STATE_CHANGE);\n addListener(LOAD);\n addListener(TIMEOUT);\n addListener(ERROR);\n addListener(ABORT);\n }\n\n var openNative = patchMethod(XMLHttpRequestPrototype, 'open', function () {\n return function (self, args) {\n if (!self[XHR_IGNORE]) {\n self[XHR_METHOD] = args[0];\n self[XHR_URL] = args[1];\n self[XHR_SYNC] = args[2] === false;\n }\n\n return openNative.apply(self, args);\n };\n });\n var sendNative = patchMethod(XMLHttpRequestPrototype, 'send', function () {\n return function (self, args) {\n if (self[XHR_IGNORE]) {\n return sendNative.apply(self, args);\n }\n\n var task = {\n source: XMLHTTPREQUEST,\n state: '',\n type: 'macroTask',\n data: {\n target: self,\n method: self[XHR_METHOD],\n sync: self[XHR_SYNC],\n url: self[XHR_URL],\n status: ''\n }\n };\n\n try {\n scheduleTask(task);\n return sendNative.apply(self, args);\n } catch (e) {\n invokeTask(task, ERROR);\n throw e;\n }\n };\n });\n}","export function isResponseSuccessful(status) {\n if (status === 0 || status > 399 && status < 600) {\n return false;\n }\n\n return true;\n}","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport { HTTP_REQUEST_TIMEOUT } from '../constants';\nimport { isResponseSuccessful } from './response-status';\nexport var BYTE_LIMIT = 60 * 1000;\nexport function shouldUseFetchWithKeepAlive(method, payload) {\n if (!isFetchSupported()) {\n return false;\n }\n\n var isKeepAliveSupported = ('keepalive' in new Request(''));\n\n if (!isKeepAliveSupported) {\n return false;\n }\n\n var size = calculateSize(payload);\n return method === 'POST' && size < BYTE_LIMIT;\n}\nexport function sendFetchRequest(method, url, _ref) {\n var _ref$keepalive = _ref.keepalive,\n keepalive = _ref$keepalive === void 0 ? false : _ref$keepalive,\n _ref$timeout = _ref.timeout,\n timeout = _ref$timeout === void 0 ? HTTP_REQUEST_TIMEOUT : _ref$timeout,\n payload = _ref.payload,\n headers = _ref.headers,\n sendCredentials = _ref.sendCredentials;\n var timeoutConfig = {};\n\n if (typeof AbortController === 'function') {\n var controller = new AbortController();\n timeoutConfig.signal = controller.signal;\n setTimeout(function () {\n return controller.abort();\n }, timeout);\n }\n\n var fetchResponse;\n return window.fetch(url, _extends({\n body: payload,\n headers: headers,\n method: method,\n keepalive: keepalive,\n credentials: sendCredentials ? 'include' : 'omit'\n }, timeoutConfig)).then(function (response) {\n fetchResponse = response;\n return fetchResponse.text();\n }).then(function (responseText) {\n var bodyResponse = {\n url: url,\n status: fetchResponse.status,\n responseText: responseText\n };\n\n if (!isResponseSuccessful(fetchResponse.status)) {\n throw bodyResponse;\n }\n\n return bodyResponse;\n });\n}\nexport function isFetchSupported() {\n return typeof window.fetch === 'function' && typeof window.Request === 'function';\n}\n\nfunction calculateSize(payload) {\n if (!payload) {\n return 0;\n }\n\n if (payload instanceof Blob) {\n return payload.size;\n }\n\n return new Blob([payload]).size;\n}","import { BEFORE_EVENT, AFTER_EVENT } from './constants';\n\nvar EventHandler = function () {\n function EventHandler() {\n this.observers = {};\n }\n\n var _proto = EventHandler.prototype;\n\n _proto.observe = function observe(name, fn) {\n var _this = this;\n\n if (typeof fn === 'function') {\n if (!this.observers[name]) {\n this.observers[name] = [];\n }\n\n this.observers[name].push(fn);\n return function () {\n var index = _this.observers[name].indexOf(fn);\n\n if (index > -1) {\n _this.observers[name].splice(index, 1);\n }\n };\n }\n };\n\n _proto.sendOnly = function sendOnly(name, args) {\n var obs = this.observers[name];\n\n if (obs) {\n obs.forEach(function (fn) {\n try {\n fn.apply(undefined, args);\n } catch (error) {\n console.log(error, error.stack);\n }\n });\n }\n };\n\n _proto.send = function send(name, args) {\n this.sendOnly(name + BEFORE_EVENT, args);\n this.sendOnly(name, args);\n this.sendOnly(name + AFTER_EVENT, args);\n };\n\n return EventHandler;\n}();\n\nexport default EventHandler;","import { patchXMLHttpRequest } from './xhr-patch';\nimport { patchFetch } from './fetch-patch';\nimport { patchHistory } from './history-patch';\nimport EventHandler from '../event-handler';\nimport { HISTORY, FETCH, XMLHTTPREQUEST } from '../constants';\nvar patchEventHandler = new EventHandler();\nvar alreadyPatched = false;\n\nfunction patchAll() {\n if (!alreadyPatched) {\n alreadyPatched = true;\n patchXMLHttpRequest(function (event, task) {\n patchEventHandler.send(XMLHTTPREQUEST, [event, task]);\n });\n patchFetch(function (event, task) {\n patchEventHandler.send(FETCH, [event, task]);\n });\n patchHistory(function (event, task) {\n patchEventHandler.send(HISTORY, [event, task]);\n });\n }\n\n return patchEventHandler;\n}\n\nexport { patchAll, patchEventHandler };","import { Promise } from '../polyfills';\nimport { globalState } from './patch-utils';\nimport { SCHEDULE, INVOKE, FETCH } from '../constants';\nimport { scheduleMicroTask } from '../utils';\nimport { isFetchSupported } from '../http/fetch';\nexport function patchFetch(callback) {\n if (!isFetchSupported()) {\n return;\n }\n\n function scheduleTask(task) {\n task.state = SCHEDULE;\n callback(SCHEDULE, task);\n }\n\n function invokeTask(task) {\n task.state = INVOKE;\n callback(INVOKE, task);\n }\n\n function handleResponseError(task, error) {\n task.data.aborted = isAbortError(error);\n task.data.error = error;\n invokeTask(task);\n }\n\n function readStream(stream, task) {\n var reader = stream.getReader();\n\n var read = function read() {\n reader.read().then(function (_ref) {\n var done = _ref.done;\n\n if (done) {\n invokeTask(task);\n } else {\n read();\n }\n }, function (error) {\n handleResponseError(task, error);\n });\n };\n\n read();\n }\n\n var nativeFetch = window.fetch;\n\n window.fetch = function (input, init) {\n var fetchSelf = this;\n var args = arguments;\n var request, url;\n var isURL = input instanceof URL;\n\n if (typeof input === 'string' || isURL) {\n request = new Request(input, init);\n\n if (isURL) {\n url = request.url;\n } else {\n url = input;\n }\n } else if (input) {\n request = input;\n url = request.url;\n } else {\n return nativeFetch.apply(fetchSelf, args);\n }\n\n var task = {\n source: FETCH,\n state: '',\n type: 'macroTask',\n data: {\n target: request,\n method: request.method,\n url: url,\n aborted: false\n }\n };\n return new Promise(function (resolve, reject) {\n globalState.fetchInProgress = true;\n scheduleTask(task);\n var promise;\n\n try {\n promise = nativeFetch.apply(fetchSelf, [request]);\n } catch (error) {\n reject(error);\n task.data.error = error;\n invokeTask(task);\n globalState.fetchInProgress = false;\n return;\n }\n\n promise.then(function (response) {\n var clonedResponse = response.clone ? response.clone() : {};\n resolve(response);\n scheduleMicroTask(function () {\n task.data.response = response;\n var body = clonedResponse.body;\n\n if (body) {\n readStream(body, task);\n } else {\n invokeTask(task);\n }\n });\n }, function (error) {\n reject(error);\n scheduleMicroTask(function () {\n handleResponseError(task, error);\n });\n });\n globalState.fetchInProgress = false;\n });\n };\n}\n\nfunction isAbortError(error) {\n return error && error.name === 'AbortError';\n}","import { INVOKE, HISTORY } from '../constants';\nexport function patchHistory(callback) {\n if (!window.history) {\n return;\n }\n\n var nativePushState = history.pushState;\n\n if (typeof nativePushState === 'function') {\n history.pushState = function (state, title, url) {\n var task = {\n source: HISTORY,\n data: {\n state: state,\n title: title,\n url: url\n }\n };\n callback(INVOKE, task);\n nativePushState.apply(this, arguments);\n };\n }\n}","var __DEV__ = process.env.NODE_ENV !== 'production';\n\nvar state = {\n bootstrapTime: null,\n lastHiddenStart: Number.MIN_SAFE_INTEGER\n};\nexport { __DEV__, state };","import { isPlatformSupported, isBrowser, now } from './common/utils';\nimport { patchAll } from './common/patching';\nimport { state } from './state';\nvar enabled = false;\nexport function bootstrap() {\n if (isPlatformSupported()) {\n patchAll();\n state.bootstrapTime = now();\n enabled = true;\n } else if (isBrowser) {\n console.log('[Elastic APM] platform is not supported!');\n }\n\n return enabled;\n}","function filePathToFileName(fileUrl) {\n var origin = window.location.origin || window.location.protocol + '//' + window.location.hostname + (window.location.port ? ':' + window.location.port : '');\n\n if (fileUrl.indexOf(origin) > -1) {\n fileUrl = fileUrl.replace(origin + '/', '');\n }\n\n return fileUrl;\n}\n\nfunction cleanFilePath(filePath) {\n if (filePath === void 0) {\n filePath = '';\n }\n\n if (filePath === '') {\n filePath = '';\n }\n\n return filePath;\n}\n\nfunction isFileInline(fileUrl) {\n if (fileUrl) {\n return window.location.href.indexOf(fileUrl) === 0;\n }\n\n return false;\n}\n\nfunction normalizeStackFrames(stackFrames) {\n return stackFrames.map(function (frame) {\n if (frame.functionName) {\n frame.functionName = normalizeFunctionName(frame.functionName);\n }\n\n return frame;\n });\n}\n\nfunction normalizeFunctionName(fnName) {\n var parts = fnName.split('/');\n\n if (parts.length > 1) {\n fnName = ['Object', parts[parts.length - 1]].join('.');\n } else {\n fnName = parts[0];\n }\n\n fnName = fnName.replace(/.<$/gi, '.');\n fnName = fnName.replace(/^Anonymous function$/, '');\n parts = fnName.split('.');\n\n if (parts.length > 1) {\n fnName = parts[parts.length - 1];\n } else {\n fnName = parts[0];\n }\n\n return fnName;\n}\n\nfunction isValidStackTrace(stackTraces) {\n if (stackTraces.length === 0) {\n return false;\n }\n\n if (stackTraces.length === 1) {\n var stackTrace = stackTraces[0];\n return 'lineNumber' in stackTrace;\n }\n\n return true;\n}\n\nexport function createStackTraces(stackParser, errorEvent) {\n var error = errorEvent.error,\n filename = errorEvent.filename,\n lineno = errorEvent.lineno,\n colno = errorEvent.colno;\n var stackTraces = [];\n\n if (error) {\n try {\n stackTraces = stackParser.parse(error);\n } catch (e) {}\n }\n\n if (!isValidStackTrace(stackTraces)) {\n stackTraces = [{\n fileName: filename,\n lineNumber: lineno,\n columnNumber: colno\n }];\n }\n\n var normalizedStackTraces = normalizeStackFrames(stackTraces);\n return normalizedStackTraces.map(function (stack) {\n var fileName = stack.fileName,\n lineNumber = stack.lineNumber,\n columnNumber = stack.columnNumber,\n _stack$functionName = stack.functionName,\n functionName = _stack$functionName === void 0 ? '' : _stack$functionName;\n\n if (!fileName && !lineNumber) {\n return {};\n }\n\n if (!columnNumber && !lineNumber) {\n return {};\n }\n\n var filePath = cleanFilePath(fileName);\n var cleanedFileName = filePathToFileName(filePath);\n\n if (isFileInline(filePath)) {\n cleanedFileName = '(inline script)';\n }\n\n return {\n abs_path: fileName,\n filename: cleanedFileName,\n function: functionName,\n lineno: lineNumber,\n colno: columnNumber\n };\n });\n}\nexport function filterInvalidFrames(frames) {\n return frames.filter(function (_ref) {\n var filename = _ref.filename,\n lineno = _ref.lineno;\n return typeof filename !== 'undefined' && typeof lineno !== 'undefined';\n });\n}","import { isBrowser } from './utils';\n\nfunction isDefaultPort(port, protocol) {\n switch (protocol) {\n case 'http:':\n return port === '80';\n\n case 'https:':\n return port === '443';\n }\n\n return true;\n}\n\nvar RULES = [['#', 'hash'], ['?', 'query'], ['/', 'path'], ['@', 'auth', 1], [NaN, 'host', undefined, 1]];\nvar PROTOCOL_REGEX = /^([a-z][a-z0-9.+-]*:)?(\\/\\/)?([\\S\\s]*)/i;\nexport var Url = function () {\n function Url(url) {\n var _this$extractProtocol = this.extractProtocol(url || ''),\n protocol = _this$extractProtocol.protocol,\n address = _this$extractProtocol.address,\n slashes = _this$extractProtocol.slashes;\n\n var relative = !protocol && !slashes;\n var location = this.getLocation();\n var instructions = RULES.slice();\n address = address.replace('\\\\', '/');\n\n if (!slashes) {\n instructions[2] = [NaN, 'path'];\n }\n\n var index;\n\n for (var i = 0; i < instructions.length; i++) {\n var instruction = instructions[i];\n var parse = instruction[0];\n var key = instruction[1];\n\n if (typeof parse === 'string') {\n index = address.indexOf(parse);\n\n if (~index) {\n var instLength = instruction[2];\n\n if (instLength) {\n var newIndex = address.lastIndexOf(parse);\n index = Math.max(index, newIndex);\n this[key] = address.slice(0, index);\n address = address.slice(index + instLength);\n } else {\n this[key] = address.slice(index);\n address = address.slice(0, index);\n }\n }\n } else {\n this[key] = address;\n address = '';\n }\n\n this[key] = this[key] || (relative && instruction[3] ? location[key] || '' : '');\n if (instruction[3]) this[key] = this[key].toLowerCase();\n }\n\n if (relative && this.path.charAt(0) !== '/') {\n this.path = '/' + this.path;\n }\n\n this.relative = relative;\n this.protocol = protocol || location.protocol;\n this.hostname = this.host;\n this.port = '';\n\n if (/:\\d+$/.test(this.host)) {\n var value = this.host.split(':');\n var port = value.pop();\n var hostname = value.join(':');\n\n if (isDefaultPort(port, this.protocol)) {\n this.host = hostname;\n } else {\n this.port = port;\n }\n\n this.hostname = hostname;\n }\n\n this.origin = this.protocol && this.host && this.protocol !== 'file:' ? this.protocol + '//' + this.host : 'null';\n this.href = this.toString();\n }\n\n var _proto = Url.prototype;\n\n _proto.toString = function toString() {\n var result = this.protocol;\n result += '//';\n\n if (this.auth) {\n var REDACTED = '[REDACTED]';\n var userpass = this.auth.split(':');\n var username = userpass[0] ? REDACTED : '';\n var password = userpass[1] ? ':' + REDACTED : '';\n result += username + password + '@';\n }\n\n result += this.host;\n result += this.path;\n result += this.query;\n result += this.hash;\n return result;\n };\n\n _proto.getLocation = function getLocation() {\n var globalVar = {};\n\n if (isBrowser) {\n globalVar = window;\n }\n\n return globalVar.location;\n };\n\n _proto.extractProtocol = function extractProtocol(url) {\n var match = PROTOCOL_REGEX.exec(url);\n return {\n protocol: match[1] ? match[1].toLowerCase() : '',\n slashes: !!match[2],\n address: match[3]\n };\n };\n\n return Url;\n}();\nexport function slugifyUrl(urlStr, depth) {\n if (depth === void 0) {\n depth = 2;\n }\n\n var parsedUrl = new Url(urlStr);\n var query = parsedUrl.query,\n path = parsedUrl.path;\n var pathParts = path.substring(1).split('/');\n var redactString = ':id';\n var wildcard = '*';\n var specialCharsRegex = /\\W|_/g;\n var digitsRegex = /[0-9]/g;\n var lowerCaseRegex = /[a-z]/g;\n var upperCaseRegex = /[A-Z]/g;\n var redactedParts = [];\n var redactedBefore = false;\n\n for (var index = 0; index < pathParts.length; index++) {\n var part = pathParts[index];\n\n if (redactedBefore || index > depth - 1) {\n if (part) {\n redactedParts.push(wildcard);\n }\n\n break;\n }\n\n var numberOfSpecialChars = (part.match(specialCharsRegex) || []).length;\n\n if (numberOfSpecialChars >= 2) {\n redactedParts.push(redactString);\n redactedBefore = true;\n continue;\n }\n\n var numberOfDigits = (part.match(digitsRegex) || []).length;\n\n if (numberOfDigits > 3 || part.length > 3 && numberOfDigits / part.length >= 0.3) {\n redactedParts.push(redactString);\n redactedBefore = true;\n continue;\n }\n\n var numberofUpperCase = (part.match(upperCaseRegex) || []).length;\n var numberofLowerCase = (part.match(lowerCaseRegex) || []).length;\n var lowerCaseRate = numberofLowerCase / part.length;\n var upperCaseRate = numberofUpperCase / part.length;\n\n if (part.length > 5 && (upperCaseRate > 0.3 && upperCaseRate < 0.6 || lowerCaseRate > 0.3 && lowerCaseRate < 0.6)) {\n redactedParts.push(redactString);\n redactedBefore = true;\n continue;\n }\n\n part && redactedParts.push(part);\n }\n\n var redacted = '/' + (redactedParts.length >= 2 ? redactedParts.join('/') : redactedParts.join('')) + (query ? '?{query}' : '');\n return redacted;\n}","var _excluded = [\"tags\"];\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport { Url } from './url';\nimport { PAGE_LOAD, PAGE_EXIT, NAVIGATION } from './constants';\nimport { getServerTimingInfo, PERF, isPerfTimelineSupported } from './utils';\nvar LEFT_SQUARE_BRACKET = 91;\nvar RIGHT_SQUARE_BRACKET = 93;\nvar EXTERNAL = 'external';\nvar RESOURCE = 'resource';\nvar HARD_NAVIGATION = 'hard-navigation';\n\nfunction getPortNumber(port, protocol) {\n if (port === '') {\n port = protocol === 'http:' ? '80' : protocol === 'https:' ? '443' : '';\n }\n\n return port;\n}\n\nfunction getResponseContext(perfTimingEntry) {\n var transferSize = perfTimingEntry.transferSize,\n encodedBodySize = perfTimingEntry.encodedBodySize,\n decodedBodySize = perfTimingEntry.decodedBodySize,\n serverTiming = perfTimingEntry.serverTiming;\n var respContext = {\n transfer_size: transferSize,\n encoded_body_size: encodedBodySize,\n decoded_body_size: decodedBodySize\n };\n var serverTimingStr = getServerTimingInfo(serverTiming);\n\n if (serverTimingStr) {\n respContext.headers = {\n 'server-timing': serverTimingStr\n };\n }\n\n return respContext;\n}\n\nfunction getDestination(parsedUrl) {\n var port = parsedUrl.port,\n protocol = parsedUrl.protocol,\n hostname = parsedUrl.hostname;\n var portNumber = getPortNumber(port, protocol);\n var ipv6Hostname = hostname.charCodeAt(0) === LEFT_SQUARE_BRACKET && hostname.charCodeAt(hostname.length - 1) === RIGHT_SQUARE_BRACKET;\n var address = hostname;\n\n if (ipv6Hostname) {\n address = hostname.slice(1, -1);\n }\n\n return {\n service: {\n resource: hostname + ':' + portNumber,\n name: '',\n type: ''\n },\n address: address,\n port: Number(portNumber)\n };\n}\n\nfunction getResourceContext(data) {\n var entry = data.entry,\n url = data.url;\n var parsedUrl = new Url(url);\n var destination = getDestination(parsedUrl);\n return {\n http: {\n url: url,\n response: getResponseContext(entry)\n },\n destination: destination\n };\n}\n\nfunction getExternalContext(data) {\n var url = data.url,\n method = data.method,\n target = data.target,\n response = data.response;\n var parsedUrl = new Url(url);\n var destination = getDestination(parsedUrl);\n var context = {\n http: {\n method: method,\n url: parsedUrl.href\n },\n destination: destination\n };\n var statusCode;\n\n if (target && typeof target.status !== 'undefined') {\n statusCode = target.status;\n } else if (response) {\n statusCode = response.status;\n }\n\n context.http.status_code = statusCode;\n return context;\n}\n\nfunction getNavigationContext(data) {\n var url = data.url;\n var parsedUrl = new Url(url);\n var destination = getDestination(parsedUrl);\n return {\n destination: destination\n };\n}\n\nexport function getPageContext() {\n return {\n page: {\n referer: document.referrer,\n url: location.href\n }\n };\n}\nexport function addSpanContext(span, data) {\n if (!data) {\n return;\n }\n\n var type = span.type;\n var context;\n\n switch (type) {\n case EXTERNAL:\n context = getExternalContext(data);\n break;\n\n case RESOURCE:\n context = getResourceContext(data);\n break;\n\n case HARD_NAVIGATION:\n context = getNavigationContext(data);\n break;\n }\n\n span.addContext(context);\n}\nexport function addTransactionContext(transaction, _temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n tags = _ref.tags,\n configContext = _objectWithoutPropertiesLoose(_ref, _excluded);\n\n var pageContext = getPageContext();\n var responseContext = {};\n\n if (transaction.type === PAGE_EXIT) {\n transaction.ensureContext();\n\n if (transaction.context.page && transaction.context.page.url) {\n pageContext.page.url = transaction.context.page.url;\n }\n } else if (transaction.type === PAGE_LOAD && isPerfTimelineSupported()) {\n var entries = PERF.getEntriesByType(NAVIGATION);\n\n if (entries && entries.length > 0) {\n responseContext = {\n response: getResponseContext(entries[0])\n };\n }\n }\n\n transaction.addContext(pageContext, responseContext, configContext);\n}","import { KEYWORD_LIMIT } from './constants';\nvar METADATA_MODEL = {\n service: {\n name: [KEYWORD_LIMIT, true],\n version: true,\n agent: {\n version: [KEYWORD_LIMIT, true]\n },\n environment: true\n },\n labels: {\n '*': true\n }\n};\nvar RESPONSE_MODEL = {\n '*': true,\n headers: {\n '*': true\n }\n};\nvar DESTINATION_MODEL = {\n address: [KEYWORD_LIMIT],\n service: {\n '*': [KEYWORD_LIMIT, true]\n }\n};\nvar CONTEXT_MODEL = {\n user: {\n id: true,\n email: true,\n username: true\n },\n tags: {\n '*': true\n },\n http: {\n response: RESPONSE_MODEL\n },\n destination: DESTINATION_MODEL,\n response: RESPONSE_MODEL\n};\nvar SPAN_MODEL = {\n name: [KEYWORD_LIMIT, true],\n type: [KEYWORD_LIMIT, true],\n id: [KEYWORD_LIMIT, true],\n trace_id: [KEYWORD_LIMIT, true],\n parent_id: [KEYWORD_LIMIT, true],\n transaction_id: [KEYWORD_LIMIT, true],\n subtype: true,\n action: true,\n context: CONTEXT_MODEL\n};\nvar TRANSACTION_MODEL = {\n name: true,\n parent_id: true,\n type: [KEYWORD_LIMIT, true],\n id: [KEYWORD_LIMIT, true],\n trace_id: [KEYWORD_LIMIT, true],\n span_count: {\n started: [KEYWORD_LIMIT, true]\n },\n context: CONTEXT_MODEL\n};\nvar ERROR_MODEL = {\n id: [KEYWORD_LIMIT, true],\n trace_id: true,\n transaction_id: true,\n parent_id: true,\n culprit: true,\n exception: {\n type: true\n },\n transaction: {\n type: true\n },\n context: CONTEXT_MODEL\n};\n\nfunction truncate(value, limit, required, placeholder) {\n if (limit === void 0) {\n limit = KEYWORD_LIMIT;\n }\n\n if (required === void 0) {\n required = false;\n }\n\n if (placeholder === void 0) {\n placeholder = 'N/A';\n }\n\n if (required && isEmpty(value)) {\n value = placeholder;\n }\n\n if (typeof value === 'string') {\n return value.substring(0, limit);\n }\n\n return value;\n}\n\nfunction isEmpty(value) {\n return value == null || value === '' || typeof value === 'undefined';\n}\n\nfunction replaceValue(target, key, currModel) {\n var value = truncate(target[key], currModel[0], currModel[1]);\n\n if (isEmpty(value)) {\n delete target[key];\n return;\n }\n\n target[key] = value;\n}\n\nfunction truncateModel(model, target, childTarget) {\n if (model === void 0) {\n model = {};\n }\n\n if (childTarget === void 0) {\n childTarget = target;\n }\n\n var keys = Object.keys(model);\n var emptyArr = [];\n\n var _loop = function _loop(i) {\n var currKey = keys[i];\n var currModel = model[currKey] === true ? emptyArr : model[currKey];\n\n if (!Array.isArray(currModel)) {\n truncateModel(currModel, target, childTarget[currKey]);\n } else {\n if (currKey === '*') {\n Object.keys(childTarget).forEach(function (key) {\n return replaceValue(childTarget, key, currModel);\n });\n } else {\n replaceValue(childTarget, currKey, currModel);\n }\n }\n };\n\n for (var i = 0; i < keys.length; i++) {\n _loop(i);\n }\n\n return target;\n}\n\nexport { truncate, truncateModel, SPAN_MODEL, TRANSACTION_MODEL, ERROR_MODEL, METADATA_MODEL, RESPONSE_MODEL };","var _excluded = [\"tags\"];\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nimport { createStackTraces, filterInvalidFrames } from './stack-trace';\nimport { generateRandomId, merge, extend } from '../common/utils';\nimport { getPageContext } from '../common/context';\nimport { truncateModel, ERROR_MODEL } from '../common/truncate';\nimport stackParser from 'error-stack-parser';\nvar IGNORE_KEYS = ['stack', 'message'];\nvar PROMISE_REJECTION_PREFIX = 'Unhandled promise rejection: ';\n\nfunction getErrorProperties(error) {\n var propertyFound = false;\n var properties = {};\n Object.keys(error).forEach(function (key) {\n if (IGNORE_KEYS.indexOf(key) >= 0) {\n return;\n }\n\n var val = error[key];\n\n if (val == null || typeof val === 'function') {\n return;\n }\n\n if (typeof val === 'object') {\n if (typeof val.toISOString !== 'function') return;\n val = val.toISOString();\n }\n\n properties[key] = val;\n propertyFound = true;\n });\n\n if (propertyFound) {\n return properties;\n }\n}\n\nvar ErrorLogging = function () {\n function ErrorLogging(apmServer, configService, transactionService) {\n this._apmServer = apmServer;\n this._configService = configService;\n this._transactionService = transactionService;\n }\n\n var _proto = ErrorLogging.prototype;\n\n _proto.createErrorDataModel = function createErrorDataModel(errorEvent) {\n var frames = createStackTraces(stackParser, errorEvent);\n var filteredFrames = filterInvalidFrames(frames);\n var culprit = '(inline script)';\n var lastFrame = filteredFrames[filteredFrames.length - 1];\n\n if (lastFrame && lastFrame.filename) {\n culprit = lastFrame.filename;\n }\n\n var message = errorEvent.message,\n error = errorEvent.error;\n var errorMessage = message;\n var errorType = '';\n var errorContext = {};\n\n if (error && typeof error === 'object') {\n errorMessage = errorMessage || error.message;\n errorType = error.name;\n var customProperties = getErrorProperties(error);\n\n if (customProperties) {\n errorContext.custom = customProperties;\n }\n }\n\n if (!errorType) {\n if (errorMessage && errorMessage.indexOf(':') > -1) {\n errorType = errorMessage.split(':')[0];\n }\n }\n\n var currentTransaction = this._transactionService.getCurrentTransaction();\n\n var transactionContext = currentTransaction ? currentTransaction.context : {};\n\n var _this$_configService$ = this._configService.get('context'),\n tags = _this$_configService$.tags,\n configContext = _objectWithoutPropertiesLoose(_this$_configService$, _excluded);\n\n var pageContext = getPageContext();\n var context = merge({}, pageContext, transactionContext, configContext, errorContext);\n var errorObject = {\n id: generateRandomId(),\n culprit: culprit,\n exception: {\n message: errorMessage,\n stacktrace: filteredFrames,\n type: errorType\n },\n context: context\n };\n\n if (currentTransaction) {\n errorObject = extend(errorObject, {\n trace_id: currentTransaction.traceId,\n parent_id: currentTransaction.id,\n transaction_id: currentTransaction.id,\n transaction: {\n type: currentTransaction.type,\n sampled: currentTransaction.sampled\n }\n });\n }\n\n return truncateModel(ERROR_MODEL, errorObject);\n };\n\n _proto.logErrorEvent = function logErrorEvent(errorEvent) {\n if (typeof errorEvent === 'undefined') {\n return;\n }\n\n var errorObject = this.createErrorDataModel(errorEvent);\n\n if (typeof errorObject.exception.message === 'undefined') {\n return;\n }\n\n this._apmServer.addError(errorObject);\n };\n\n _proto.registerListeners = function registerListeners() {\n var _this = this;\n\n window.addEventListener('error', function (errorEvent) {\n return _this.logErrorEvent(errorEvent);\n });\n window.addEventListener('unhandledrejection', function (promiseRejectionEvent) {\n return _this.logPromiseEvent(promiseRejectionEvent);\n });\n };\n\n _proto.logPromiseEvent = function logPromiseEvent(promiseRejectionEvent) {\n var reason = promiseRejectionEvent.reason;\n\n if (reason == null) {\n reason = '';\n }\n\n var errorEvent;\n\n if (typeof reason.message === 'string') {\n var name = reason.name ? reason.name + ': ' : '';\n errorEvent = {\n error: reason,\n message: PROMISE_REJECTION_PREFIX + name + reason.message\n };\n } else {\n errorEvent = this._parseRejectReason(reason);\n }\n\n this.logErrorEvent(errorEvent);\n };\n\n _proto.logError = function logError(messageOrError) {\n var errorEvent = {};\n\n if (typeof messageOrError === 'string') {\n errorEvent.message = messageOrError;\n } else {\n errorEvent.error = messageOrError;\n }\n\n return this.logErrorEvent(errorEvent);\n };\n\n _proto._parseRejectReason = function _parseRejectReason(reason) {\n var errorEvent = {\n message: PROMISE_REJECTION_PREFIX\n };\n\n if (Array.isArray(reason)) {\n errorEvent.message += '';\n } else if (typeof reason === 'object') {\n try {\n errorEvent.message += JSON.stringify(reason);\n errorEvent.error = reason;\n } catch (error) {\n errorEvent.message += '';\n }\n } else if (typeof reason === 'function') {\n errorEvent.message += '';\n } else {\n errorEvent.message += reason;\n }\n\n return errorEvent;\n };\n\n return ErrorLogging;\n}();\n\nexport default ErrorLogging;","var Queue = function () {\n function Queue(onFlush, opts) {\n if (opts === void 0) {\n opts = {};\n }\n\n this.onFlush = onFlush;\n this.items = [];\n this.queueLimit = opts.queueLimit || -1;\n this.flushInterval = opts.flushInterval || 0;\n this.timeoutId = undefined;\n }\n\n var _proto = Queue.prototype;\n\n _proto._setTimer = function _setTimer() {\n var _this = this;\n\n this.timeoutId = setTimeout(function () {\n return _this.flush();\n }, this.flushInterval);\n };\n\n _proto._clear = function _clear() {\n if (typeof this.timeoutId !== 'undefined') {\n clearTimeout(this.timeoutId);\n this.timeoutId = undefined;\n }\n\n this.items = [];\n };\n\n _proto.flush = function flush() {\n this.onFlush(this.items);\n\n this._clear();\n };\n\n _proto.add = function add(item) {\n this.items.push(item);\n\n if (this.queueLimit !== -1 && this.items.length >= this.queueLimit) {\n this.flush();\n } else {\n if (typeof this.timeoutId === 'undefined') {\n this._setTimer();\n }\n }\n };\n\n return Queue;\n}();\n\nexport default Queue;","var NDJSON = function () {\n function NDJSON() {}\n\n NDJSON.stringify = function stringify(object) {\n return JSON.stringify(object) + '\\n';\n };\n\n return NDJSON;\n}();\n\nexport default NDJSON;","import { isRedirectInfoAvailable } from '../../common/utils';\nvar NAVIGATION_TIMING_MARKS = ['fetchStart', 'domainLookupStart', 'domainLookupEnd', 'connectStart', 'connectEnd', 'requestStart', 'responseStart', 'responseEnd', 'domLoading', 'domInteractive', 'domContentLoadedEventStart', 'domContentLoadedEventEnd', 'domComplete', 'loadEventStart', 'loadEventEnd'];\nvar COMPRESSED_NAV_TIMING_MARKS = ['fs', 'ls', 'le', 'cs', 'ce', 'qs', 'rs', 're', 'dl', 'di', 'ds', 'de', 'dc', 'es', 'ee'];\n\nfunction getPageLoadMarks(timing) {\n var marks = getNavigationTimingMarks(timing);\n\n if (marks == null) {\n return null;\n }\n\n return {\n navigationTiming: marks,\n agent: {\n timeToFirstByte: marks.responseStart,\n domInteractive: marks.domInteractive,\n domComplete: marks.domComplete\n }\n };\n}\n\nfunction getNavigationTimingMarks(timing) {\n var redirectStart = timing.redirectStart,\n fetchStart = timing.fetchStart,\n navigationStart = timing.navigationStart,\n responseStart = timing.responseStart,\n responseEnd = timing.responseEnd;\n\n if (fetchStart >= navigationStart && responseStart >= fetchStart && responseEnd >= responseStart) {\n var marks = {};\n NAVIGATION_TIMING_MARKS.forEach(function (timingKey) {\n var m = timing[timingKey];\n\n if (m && m >= fetchStart) {\n if (isRedirectInfoAvailable(timing)) {\n marks[timingKey] = parseInt(m - redirectStart);\n } else {\n marks[timingKey] = parseInt(m - fetchStart);\n }\n }\n });\n return marks;\n }\n\n return null;\n}\n\nexport { getPageLoadMarks, NAVIGATION_TIMING_MARKS, COMPRESSED_NAV_TIMING_MARKS };","import { Promise } from './polyfills';\nimport { NAVIGATION_TIMING_MARKS, COMPRESSED_NAV_TIMING_MARKS } from '../performance-monitoring/navigation/marks';\nimport { isBeaconInspectionEnabled } from './utils';\n\nfunction compressStackFrames(frames) {\n return frames.map(function (frame) {\n return {\n ap: frame.abs_path,\n f: frame.filename,\n fn: frame.function,\n li: frame.lineno,\n co: frame.colno\n };\n });\n}\n\nfunction compressResponse(response) {\n return {\n ts: response.transfer_size,\n ebs: response.encoded_body_size,\n dbs: response.decoded_body_size\n };\n}\n\nfunction compressHTTP(http) {\n var compressed = {};\n var method = http.method,\n status_code = http.status_code,\n url = http.url,\n response = http.response;\n compressed.url = url;\n\n if (method) {\n compressed.mt = method;\n }\n\n if (status_code) {\n compressed.sc = status_code;\n }\n\n if (response) {\n compressed.r = compressResponse(response);\n }\n\n return compressed;\n}\n\nfunction compressContext(context) {\n if (!context) {\n return null;\n }\n\n var compressed = {};\n var page = context.page,\n http = context.http,\n response = context.response,\n destination = context.destination,\n user = context.user,\n custom = context.custom;\n\n if (page) {\n compressed.p = {\n rf: page.referer,\n url: page.url\n };\n }\n\n if (http) {\n compressed.h = compressHTTP(http);\n }\n\n if (response) {\n compressed.r = compressResponse(response);\n }\n\n if (destination) {\n var service = destination.service;\n compressed.dt = {\n se: {\n n: service.name,\n t: service.type,\n rc: service.resource\n },\n ad: destination.address,\n po: destination.port\n };\n }\n\n if (user) {\n compressed.u = {\n id: user.id,\n un: user.username,\n em: user.email\n };\n }\n\n if (custom) {\n compressed.cu = custom;\n }\n\n return compressed;\n}\n\nfunction compressMarks(marks) {\n if (!marks) {\n return null;\n }\n\n var compressedNtMarks = compressNavigationTimingMarks(marks.navigationTiming);\n var compressed = {\n nt: compressedNtMarks,\n a: compressAgentMarks(compressedNtMarks, marks.agent)\n };\n return compressed;\n}\n\nfunction compressNavigationTimingMarks(ntMarks) {\n if (!ntMarks) {\n return null;\n }\n\n var compressed = {};\n COMPRESSED_NAV_TIMING_MARKS.forEach(function (mark, index) {\n var mapping = NAVIGATION_TIMING_MARKS[index];\n compressed[mark] = ntMarks[mapping];\n });\n return compressed;\n}\n\nfunction compressAgentMarks(compressedNtMarks, agentMarks) {\n var compressed = {};\n\n if (compressedNtMarks) {\n compressed = {\n fb: compressedNtMarks.rs,\n di: compressedNtMarks.di,\n dc: compressedNtMarks.dc\n };\n }\n\n if (agentMarks) {\n var fp = agentMarks.firstContentfulPaint;\n var lp = agentMarks.largestContentfulPaint;\n\n if (fp) {\n compressed.fp = fp;\n }\n\n if (lp) {\n compressed.lp = lp;\n }\n }\n\n if (Object.keys(compressed).length === 0) {\n return null;\n }\n\n return compressed;\n}\n\nexport function compressMetadata(metadata) {\n var service = metadata.service,\n labels = metadata.labels;\n var agent = service.agent,\n language = service.language;\n return {\n se: {\n n: service.name,\n ve: service.version,\n a: {\n n: agent.name,\n ve: agent.version\n },\n la: {\n n: language.name\n },\n en: service.environment\n },\n l: labels\n };\n}\nexport function compressTransaction(transaction) {\n var spans = transaction.spans.map(function (span) {\n var spanData = {\n id: span.id,\n n: span.name,\n t: span.type,\n s: span.start,\n d: span.duration,\n c: compressContext(span.context),\n o: span.outcome,\n sr: span.sample_rate\n };\n\n if (span.parent_id !== transaction.id) {\n spanData.pid = span.parent_id;\n }\n\n if (span.sync === true) {\n spanData.sy = true;\n }\n\n if (span.subtype) {\n spanData.su = span.subtype;\n }\n\n if (span.action) {\n spanData.ac = span.action;\n }\n\n return spanData;\n });\n var tr = {\n id: transaction.id,\n pid: transaction.parent_id,\n tid: transaction.trace_id,\n n: transaction.name,\n t: transaction.type,\n d: transaction.duration,\n c: compressContext(transaction.context),\n k: compressMarks(transaction.marks),\n me: compressMetricsets(transaction.breakdown),\n y: spans,\n yc: {\n sd: spans.length\n },\n sm: transaction.sampled,\n sr: transaction.sample_rate,\n o: transaction.outcome\n };\n\n if (transaction.experience) {\n var _transaction$experien = transaction.experience,\n cls = _transaction$experien.cls,\n fid = _transaction$experien.fid,\n tbt = _transaction$experien.tbt,\n longtask = _transaction$experien.longtask;\n tr.exp = {\n cls: cls,\n fid: fid,\n tbt: tbt,\n lt: longtask\n };\n }\n\n if (transaction.session) {\n var _transaction$session = transaction.session,\n id = _transaction$session.id,\n sequence = _transaction$session.sequence;\n tr.ses = {\n id: id,\n seq: sequence\n };\n }\n\n return tr;\n}\nexport function compressError(error) {\n var exception = error.exception;\n var compressed = {\n id: error.id,\n cl: error.culprit,\n ex: {\n mg: exception.message,\n st: compressStackFrames(exception.stacktrace),\n t: error.type\n },\n c: compressContext(error.context)\n };\n var transaction = error.transaction;\n\n if (transaction) {\n compressed.tid = error.trace_id;\n compressed.pid = error.parent_id;\n compressed.xid = error.transaction_id;\n compressed.x = {\n t: transaction.type,\n sm: transaction.sampled\n };\n }\n\n return compressed;\n}\nexport function compressMetricsets(breakdowns) {\n return breakdowns.map(function (_ref) {\n var span = _ref.span,\n samples = _ref.samples;\n return {\n y: {\n t: span.type\n },\n sa: {\n ysc: {\n v: samples['span.self_time.count'].value\n },\n yss: {\n v: samples['span.self_time.sum.us'].value\n }\n }\n };\n });\n}\nexport function compressPayload(params, type) {\n if (type === void 0) {\n type = 'gzip';\n }\n\n var isCompressionStreamSupported = typeof CompressionStream === 'function';\n return new Promise(function (resolve) {\n if (!isCompressionStreamSupported) {\n return resolve(params);\n }\n\n if (isBeaconInspectionEnabled()) {\n return resolve(params);\n }\n\n var payload = params.payload,\n headers = params.headers,\n beforeSend = params.beforeSend;\n var payloadStream = new Blob([payload]).stream();\n var compressedStream = payloadStream.pipeThrough(new CompressionStream(type));\n return new Response(compressedStream).blob().then(function (payload) {\n headers['Content-Encoding'] = type;\n return resolve({\n payload: payload,\n headers: headers,\n beforeSend: beforeSend\n });\n });\n });\n}","import { XHR_IGNORE } from '../patching/patch-utils';\nimport { isResponseSuccessful } from './response-status';\nimport { Promise } from '../polyfills';\nexport function sendXHR(method, url, _ref) {\n var _ref$timeout = _ref.timeout,\n timeout = _ref$timeout === void 0 ? HTTP_REQUEST_TIMEOUT : _ref$timeout,\n payload = _ref.payload,\n headers = _ref.headers,\n beforeSend = _ref.beforeSend,\n sendCredentials = _ref.sendCredentials;\n return new Promise(function (resolve, reject) {\n var xhr = new window.XMLHttpRequest();\n xhr[XHR_IGNORE] = true;\n xhr.open(method, url, true);\n xhr.timeout = timeout;\n xhr.withCredentials = sendCredentials;\n\n if (headers) {\n for (var header in headers) {\n if (headers.hasOwnProperty(header)) {\n xhr.setRequestHeader(header, headers[header]);\n }\n }\n }\n\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n var status = xhr.status,\n responseText = xhr.responseText;\n\n if (isResponseSuccessful(status)) {\n resolve(xhr);\n } else {\n reject({\n url: url,\n status: status,\n responseText: responseText\n });\n }\n }\n };\n\n xhr.onerror = function () {\n var status = xhr.status,\n responseText = xhr.responseText;\n reject({\n url: url,\n status: status,\n responseText: responseText\n });\n };\n\n var canSend = true;\n\n if (typeof beforeSend === 'function') {\n canSend = beforeSend({\n url: url,\n method: method,\n headers: headers,\n payload: payload,\n xhr: xhr\n });\n }\n\n if (canSend) {\n xhr.send(payload);\n } else {\n reject({\n url: url,\n status: 0,\n responseText: 'Request rejected by user configuration.'\n });\n }\n });\n}","import Queue from './queue';\nimport throttle from './throttle';\nimport NDJSON from './ndjson';\nimport { truncateModel, METADATA_MODEL } from './truncate';\nimport { ERRORS, HTTP_REQUEST_TIMEOUT, QUEUE_FLUSH, TRANSACTIONS } from './constants';\nimport { noop } from './utils';\nimport { Promise } from './polyfills';\nimport { compressMetadata, compressTransaction, compressError, compressPayload } from './compress';\nimport { __DEV__ } from '../state';\nimport { sendFetchRequest, shouldUseFetchWithKeepAlive } from './http/fetch';\nimport { sendXHR } from './http/xhr';\nvar THROTTLE_INTERVAL = 60000;\n\nvar ApmServer = function () {\n function ApmServer(configService, loggingService) {\n this._configService = configService;\n this._loggingService = loggingService;\n this.queue = undefined;\n this.throttleEvents = noop;\n }\n\n var _proto = ApmServer.prototype;\n\n _proto.init = function init() {\n var _this = this;\n\n var queueLimit = this._configService.get('queueLimit');\n\n var flushInterval = this._configService.get('flushInterval');\n\n var limit = this._configService.get('eventsLimit');\n\n var onFlush = function onFlush(events) {\n var promise = _this.sendEvents(events);\n\n if (promise) {\n promise.catch(function (reason) {\n _this._loggingService.warn('Failed sending events!', _this._constructError(reason));\n });\n }\n };\n\n this.queue = new Queue(onFlush, {\n queueLimit: queueLimit,\n flushInterval: flushInterval\n });\n this.throttleEvents = throttle(this.queue.add.bind(this.queue), function () {\n return _this._loggingService.warn('Dropped events due to throttling!');\n }, {\n limit: limit,\n interval: THROTTLE_INTERVAL\n });\n\n this._configService.observeEvent(QUEUE_FLUSH, function () {\n _this.queue.flush();\n });\n };\n\n _proto._postJson = function _postJson(endPoint, payload) {\n var _this2 = this;\n\n var headers = {\n 'Content-Type': 'application/x-ndjson'\n };\n\n var apmRequest = this._configService.get('apmRequest');\n\n var params = {\n payload: payload,\n headers: headers,\n beforeSend: apmRequest\n };\n return compressPayload(params).catch(function (error) {\n if (__DEV__) {\n _this2._loggingService.debug('Compressing the payload using CompressionStream API failed', error.message);\n }\n\n return params;\n }).then(function (result) {\n return _this2._makeHttpRequest('POST', endPoint, result);\n }).then(function (_ref) {\n var responseText = _ref.responseText;\n return responseText;\n });\n };\n\n _proto._constructError = function _constructError(reason) {\n var url = reason.url,\n status = reason.status,\n responseText = reason.responseText;\n\n if (typeof status == 'undefined') {\n return reason;\n }\n\n var message = url + ' HTTP status: ' + status;\n\n if (__DEV__ && responseText) {\n try {\n var serverErrors = [];\n var response = JSON.parse(responseText);\n\n if (response.errors && response.errors.length > 0) {\n response.errors.forEach(function (err) {\n return serverErrors.push(err.message);\n });\n message += ' ' + serverErrors.join(',');\n }\n } catch (e) {\n this._loggingService.debug('Error parsing response from APM server', e);\n }\n }\n\n return new Error(message);\n };\n\n _proto._makeHttpRequest = function _makeHttpRequest(method, url, _temp) {\n var _ref2 = _temp === void 0 ? {} : _temp,\n _ref2$timeout = _ref2.timeout,\n timeout = _ref2$timeout === void 0 ? HTTP_REQUEST_TIMEOUT : _ref2$timeout,\n payload = _ref2.payload,\n headers = _ref2.headers,\n beforeSend = _ref2.beforeSend;\n\n var sendCredentials = this._configService.get('sendCredentials');\n\n if (!beforeSend && shouldUseFetchWithKeepAlive(method, payload)) {\n return sendFetchRequest(method, url, {\n keepalive: true,\n timeout: timeout,\n payload: payload,\n headers: headers,\n sendCredentials: sendCredentials\n }).catch(function (reason) {\n if (reason instanceof TypeError) {\n return sendXHR(method, url, {\n timeout: timeout,\n payload: payload,\n headers: headers,\n beforeSend: beforeSend,\n sendCredentials: sendCredentials\n });\n }\n\n throw reason;\n });\n }\n\n return sendXHR(method, url, {\n timeout: timeout,\n payload: payload,\n headers: headers,\n beforeSend: beforeSend,\n sendCredentials: sendCredentials\n });\n };\n\n _proto.fetchConfig = function fetchConfig(serviceName, environment) {\n var _this3 = this;\n\n var _this$getEndpoints = this.getEndpoints(),\n configEndpoint = _this$getEndpoints.configEndpoint;\n\n if (!serviceName) {\n return Promise.reject('serviceName is required for fetching central config.');\n }\n\n configEndpoint += \"?service.name=\" + serviceName;\n\n if (environment) {\n configEndpoint += \"&service.environment=\" + environment;\n }\n\n var localConfig = this._configService.getLocalConfig();\n\n if (localConfig) {\n configEndpoint += \"&ifnonematch=\" + localConfig.etag;\n }\n\n var apmRequest = this._configService.get('apmRequest');\n\n return this._makeHttpRequest('GET', configEndpoint, {\n timeout: 5000,\n beforeSend: apmRequest\n }).then(function (xhr) {\n var status = xhr.status,\n responseText = xhr.responseText;\n\n if (status === 304) {\n return localConfig;\n } else {\n var remoteConfig = JSON.parse(responseText);\n var etag = xhr.getResponseHeader('etag');\n\n if (etag) {\n remoteConfig.etag = etag.replace(/[\"]/g, '');\n\n _this3._configService.setLocalConfig(remoteConfig, true);\n }\n\n return remoteConfig;\n }\n }).catch(function (reason) {\n var error = _this3._constructError(reason);\n\n return Promise.reject(error);\n });\n };\n\n _proto.createMetaData = function createMetaData() {\n var cfg = this._configService;\n var metadata = {\n service: {\n name: cfg.get('serviceName'),\n version: cfg.get('serviceVersion'),\n agent: {\n name: 'rum-js',\n version: cfg.version\n },\n language: {\n name: 'javascript'\n },\n environment: cfg.get('environment')\n },\n labels: cfg.get('context.tags')\n };\n return truncateModel(METADATA_MODEL, metadata);\n };\n\n _proto.addError = function addError(error) {\n var _this$throttleEvents;\n\n this.throttleEvents((_this$throttleEvents = {}, _this$throttleEvents[ERRORS] = error, _this$throttleEvents));\n };\n\n _proto.addTransaction = function addTransaction(transaction) {\n var _this$throttleEvents2;\n\n this.throttleEvents((_this$throttleEvents2 = {}, _this$throttleEvents2[TRANSACTIONS] = transaction, _this$throttleEvents2));\n };\n\n _proto.ndjsonErrors = function ndjsonErrors(errors, compress) {\n var key = compress ? 'e' : 'error';\n return errors.map(function (error) {\n var _NDJSON$stringify;\n\n return NDJSON.stringify((_NDJSON$stringify = {}, _NDJSON$stringify[key] = compress ? compressError(error) : error, _NDJSON$stringify));\n });\n };\n\n _proto.ndjsonMetricsets = function ndjsonMetricsets(metricsets) {\n return metricsets.map(function (metricset) {\n return NDJSON.stringify({\n metricset: metricset\n });\n }).join('');\n };\n\n _proto.ndjsonTransactions = function ndjsonTransactions(transactions, compress) {\n var _this4 = this;\n\n var key = compress ? 'x' : 'transaction';\n return transactions.map(function (tr) {\n var _NDJSON$stringify2;\n\n var spans = '',\n breakdowns = '';\n\n if (!compress) {\n if (tr.spans) {\n spans = tr.spans.map(function (span) {\n return NDJSON.stringify({\n span: span\n });\n }).join('');\n delete tr.spans;\n }\n\n if (tr.breakdown) {\n breakdowns = _this4.ndjsonMetricsets(tr.breakdown);\n delete tr.breakdown;\n }\n }\n\n return NDJSON.stringify((_NDJSON$stringify2 = {}, _NDJSON$stringify2[key] = compress ? compressTransaction(tr) : tr, _NDJSON$stringify2)) + spans + breakdowns;\n });\n };\n\n _proto.sendEvents = function sendEvents(events) {\n var _payload, _NDJSON$stringify3;\n\n if (events.length === 0) {\n return;\n }\n\n var transactions = [];\n var errors = [];\n\n for (var i = 0; i < events.length; i++) {\n var event = events[i];\n\n if (event[TRANSACTIONS]) {\n transactions.push(event[TRANSACTIONS]);\n }\n\n if (event[ERRORS]) {\n errors.push(event[ERRORS]);\n }\n }\n\n if (transactions.length === 0 && errors.length === 0) {\n return;\n }\n\n var cfg = this._configService;\n var payload = (_payload = {}, _payload[TRANSACTIONS] = transactions, _payload[ERRORS] = errors, _payload);\n var filteredPayload = cfg.applyFilters(payload);\n\n if (!filteredPayload) {\n this._loggingService.warn('Dropped payload due to filtering!');\n\n return;\n }\n\n var apiVersion = cfg.get('apiVersion');\n var compress = apiVersion > 2;\n var ndjson = [];\n var metadata = this.createMetaData();\n var metadataKey = compress ? 'm' : 'metadata';\n ndjson.push(NDJSON.stringify((_NDJSON$stringify3 = {}, _NDJSON$stringify3[metadataKey] = compress ? compressMetadata(metadata) : metadata, _NDJSON$stringify3)));\n ndjson = ndjson.concat(this.ndjsonErrors(filteredPayload[ERRORS], compress), this.ndjsonTransactions(filteredPayload[TRANSACTIONS], compress));\n var ndjsonPayload = ndjson.join('');\n\n var _this$getEndpoints2 = this.getEndpoints(),\n intakeEndpoint = _this$getEndpoints2.intakeEndpoint;\n\n return this._postJson(intakeEndpoint, ndjsonPayload);\n };\n\n _proto.getEndpoints = function getEndpoints() {\n var serverUrl = this._configService.get('serverUrl');\n\n var apiVersion = this._configService.get('apiVersion');\n\n var serverUrlPrefix = this._configService.get('serverUrlPrefix') || \"/intake/v\" + apiVersion + \"/rum/events\";\n var intakeEndpoint = serverUrl + serverUrlPrefix;\n var configEndpoint = serverUrl + \"/config/v1/rum/agents\";\n return {\n intakeEndpoint: intakeEndpoint,\n configEndpoint: configEndpoint\n };\n };\n\n return ApmServer;\n}();\n\nexport default ApmServer;","export default function throttle(fn, onThrottle, opts) {\n var context = this;\n var limit = opts.limit;\n var interval = opts.interval;\n var counter = 0;\n var timeoutId;\n return function () {\n counter++;\n\n if (typeof timeoutId === 'undefined') {\n timeoutId = setTimeout(function () {\n counter = 0;\n timeoutId = undefined;\n }, interval);\n }\n\n if (counter > limit && typeof onThrottle === 'function') {\n return onThrottle.apply(context, arguments);\n } else {\n return fn.apply(context, arguments);\n }\n };\n}","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport { getCurrentScript, setLabel, merge, extend, isUndefined } from './utils';\nimport EventHandler from './event-handler';\nimport { CONFIG_CHANGE, LOCAL_CONFIG_KEY } from './constants';\n\nfunction getConfigFromScript() {\n var script = getCurrentScript();\n var config = getDataAttributesFromNode(script);\n return config;\n}\n\nfunction getDataAttributesFromNode(node) {\n if (!node) {\n return {};\n }\n\n var dataAttrs = {};\n var dataRegex = /^data-([\\w-]+)$/;\n var attrs = node.attributes;\n\n for (var i = 0; i < attrs.length; i++) {\n var attr = attrs[i];\n\n if (dataRegex.test(attr.nodeName)) {\n var key = attr.nodeName.match(dataRegex)[1];\n var camelCasedkey = key.split('-').map(function (value, index) {\n return index > 0 ? value.charAt(0).toUpperCase() + value.substring(1) : value;\n }).join('');\n dataAttrs[camelCasedkey] = attr.value || attr.nodeValue;\n }\n }\n\n return dataAttrs;\n}\n\nvar Config = function () {\n function Config() {\n this.config = {\n serviceName: '',\n serviceVersion: '',\n environment: '',\n serverUrl: 'http://localhost:8200',\n serverUrlPrefix: '',\n active: true,\n instrument: true,\n disableInstrumentations: [],\n logLevel: 'warn',\n breakdownMetrics: false,\n ignoreTransactions: [],\n eventsLimit: 80,\n queueLimit: -1,\n flushInterval: 500,\n distributedTracing: true,\n distributedTracingOrigins: [],\n distributedTracingHeaderName: 'traceparent',\n pageLoadTraceId: '',\n pageLoadSpanId: '',\n pageLoadSampled: false,\n pageLoadParentId: '',\n pageLoadTransactionName: '',\n propagateTracestate: false,\n transactionSampleRate: 1.0,\n centralConfig: false,\n monitorLongtasks: true,\n apiVersion: 2,\n context: {},\n session: false,\n apmRequest: null,\n sendCredentials: false\n };\n this.events = new EventHandler();\n this.filters = [];\n this.version = '';\n }\n\n var _proto = Config.prototype;\n\n _proto.init = function init() {\n var scriptData = getConfigFromScript();\n this.setConfig(scriptData);\n };\n\n _proto.setVersion = function setVersion(version) {\n this.version = version;\n };\n\n _proto.addFilter = function addFilter(cb) {\n if (typeof cb !== 'function') {\n throw new Error('Argument to must be function');\n }\n\n this.filters.push(cb);\n };\n\n _proto.applyFilters = function applyFilters(data) {\n for (var i = 0; i < this.filters.length; i++) {\n data = this.filters[i](data);\n\n if (!data) {\n return;\n }\n }\n\n return data;\n };\n\n _proto.get = function get(key) {\n return key.split('.').reduce(function (obj, objKey) {\n return obj && obj[objKey];\n }, this.config);\n };\n\n _proto.setUserContext = function setUserContext(userContext) {\n if (userContext === void 0) {\n userContext = {};\n }\n\n var context = {};\n var _userContext = userContext,\n id = _userContext.id,\n username = _userContext.username,\n email = _userContext.email;\n\n if (typeof id === 'number' || typeof id === 'string') {\n context.id = id;\n }\n\n if (typeof username === 'string') {\n context.username = username;\n }\n\n if (typeof email === 'string') {\n context.email = email;\n }\n\n this.config.context.user = extend(this.config.context.user || {}, context);\n };\n\n _proto.setCustomContext = function setCustomContext(customContext) {\n if (customContext === void 0) {\n customContext = {};\n }\n\n this.config.context.custom = extend(this.config.context.custom || {}, customContext);\n };\n\n _proto.addLabels = function addLabels(tags) {\n var _this = this;\n\n if (!this.config.context.tags) {\n this.config.context.tags = {};\n }\n\n var keys = Object.keys(tags);\n keys.forEach(function (k) {\n return setLabel(k, tags[k], _this.config.context.tags);\n });\n };\n\n _proto.setConfig = function setConfig(properties) {\n if (properties === void 0) {\n properties = {};\n }\n\n var _properties = properties,\n transactionSampleRate = _properties.transactionSampleRate,\n serverUrl = _properties.serverUrl;\n\n if (serverUrl) {\n properties.serverUrl = serverUrl.replace(/\\/+$/, '');\n }\n\n if (!isUndefined(transactionSampleRate)) {\n if (transactionSampleRate < 0.0001 && transactionSampleRate > 0) {\n transactionSampleRate = 0.0001;\n }\n\n properties.transactionSampleRate = Math.round(transactionSampleRate * 10000) / 10000;\n }\n\n this.config = merge(this.config, properties);\n this.events.send(CONFIG_CHANGE, [this.config]);\n };\n\n _proto.validate = function validate(properties) {\n if (properties === void 0) {\n properties = {};\n }\n\n var requiredKeys = ['serviceName', 'serverUrl'];\n var allKeys = Object.keys(this.config);\n var errors = {\n missing: [],\n invalid: [],\n unknown: []\n };\n Object.keys(properties).forEach(function (key) {\n if (requiredKeys.indexOf(key) !== -1 && !properties[key]) {\n errors.missing.push(key);\n }\n\n if (allKeys.indexOf(key) === -1) {\n errors.unknown.push(key);\n }\n });\n\n if (properties.serviceName && !/^[a-zA-Z0-9 _-]+$/.test(properties.serviceName)) {\n errors.invalid.push({\n key: 'serviceName',\n value: properties.serviceName,\n allowed: 'a-z, A-Z, 0-9, _, -, '\n });\n }\n\n var sampleRate = properties.transactionSampleRate;\n\n if (typeof sampleRate !== 'undefined' && (typeof sampleRate !== 'number' || isNaN(sampleRate) || sampleRate < 0 || sampleRate > 1)) {\n errors.invalid.push({\n key: 'transactionSampleRate',\n value: sampleRate,\n allowed: 'Number between 0 and 1'\n });\n }\n\n return errors;\n };\n\n _proto.getLocalConfig = function getLocalConfig() {\n var storage = sessionStorage;\n\n if (this.config.session) {\n storage = localStorage;\n }\n\n var config = storage.getItem(LOCAL_CONFIG_KEY);\n\n if (config) {\n return JSON.parse(config);\n }\n };\n\n _proto.setLocalConfig = function setLocalConfig(config, merge) {\n if (config) {\n if (merge) {\n var prevConfig = this.getLocalConfig();\n config = _extends({}, prevConfig, config);\n }\n\n var storage = sessionStorage;\n\n if (this.config.session) {\n storage = localStorage;\n }\n\n storage.setItem(LOCAL_CONFIG_KEY, JSON.stringify(config));\n }\n };\n\n _proto.dispatchEvent = function dispatchEvent(name, args) {\n this.events.send(name, args);\n };\n\n _proto.observeEvent = function observeEvent(name, fn) {\n return this.events.observe(name, fn);\n };\n\n return Config;\n}();\n\nexport default Config;","var _serviceCreators;\n\nimport ApmServer from './apm-server';\nimport ConfigService from './config-service';\nimport LoggingService from './logging-service';\nimport { CONFIG_CHANGE, CONFIG_SERVICE, LOGGING_SERVICE, APM_SERVER } from './constants';\nimport { __DEV__ } from '../state';\nvar serviceCreators = (_serviceCreators = {}, _serviceCreators[CONFIG_SERVICE] = function () {\n return new ConfigService();\n}, _serviceCreators[LOGGING_SERVICE] = function () {\n return new LoggingService({\n prefix: '[Elastic APM] '\n });\n}, _serviceCreators[APM_SERVER] = function (factory) {\n var _factory$getService = factory.getService([CONFIG_SERVICE, LOGGING_SERVICE]),\n configService = _factory$getService[0],\n loggingService = _factory$getService[1];\n\n return new ApmServer(configService, loggingService);\n}, _serviceCreators);\n\nvar ServiceFactory = function () {\n function ServiceFactory() {\n this.instances = {};\n this.initialized = false;\n }\n\n var _proto = ServiceFactory.prototype;\n\n _proto.init = function init() {\n if (this.initialized) {\n return;\n }\n\n this.initialized = true;\n var configService = this.getService(CONFIG_SERVICE);\n configService.init();\n\n var _this$getService = this.getService([LOGGING_SERVICE, APM_SERVER]),\n loggingService = _this$getService[0],\n apmServer = _this$getService[1];\n\n configService.events.observe(CONFIG_CHANGE, function () {\n var logLevel = configService.get('logLevel');\n loggingService.setLevel(logLevel);\n });\n apmServer.init();\n };\n\n _proto.getService = function getService(name) {\n var _this = this;\n\n if (typeof name === 'string') {\n if (!this.instances[name]) {\n if (typeof serviceCreators[name] === 'function') {\n this.instances[name] = serviceCreators[name](this);\n } else if (__DEV__) {\n console.log('Cannot get service, No creator for: ' + name);\n }\n }\n\n return this.instances[name];\n } else if (Array.isArray(name)) {\n return name.map(function (n) {\n return _this.getService(n);\n });\n }\n };\n\n return ServiceFactory;\n}();\n\nexport { serviceCreators, ServiceFactory };","import { noop } from './utils';\n\nvar LoggingService = function () {\n function LoggingService(spec) {\n if (spec === void 0) {\n spec = {};\n }\n\n this.levels = ['trace', 'debug', 'info', 'warn', 'error'];\n this.level = spec.level || 'warn';\n this.prefix = spec.prefix || '';\n this.resetLogMethods();\n }\n\n var _proto = LoggingService.prototype;\n\n _proto.shouldLog = function shouldLog(level) {\n return this.levels.indexOf(level) >= this.levels.indexOf(this.level);\n };\n\n _proto.setLevel = function setLevel(level) {\n if (level === this.level) {\n return;\n }\n\n this.level = level;\n this.resetLogMethods();\n };\n\n _proto.resetLogMethods = function resetLogMethods() {\n var _this = this;\n\n this.levels.forEach(function (level) {\n _this[level] = _this.shouldLog(level) ? log : noop;\n\n function log() {\n var normalizedLevel = level;\n\n if (level === 'trace' || level === 'debug') {\n normalizedLevel = 'info';\n }\n\n var args = arguments;\n args[0] = this.prefix + args[0];\n\n if (console) {\n var realMethod = console[normalizedLevel] || console.log;\n\n if (typeof realMethod === 'function') {\n realMethod.apply(console, args);\n }\n }\n }\n });\n };\n\n return LoggingService;\n}();\n\nexport default LoggingService;","import { checkSameOrigin, isDtHeaderValid, parseDtHeaderValue, getDtHeaderValue, getTSHeaderValue, stripQueryStringFromUrl, setRequestHeader } from '../common/utils';\nimport { Url } from '../common/url';\nimport { patchEventHandler } from '../common/patching';\nimport { globalState } from '../common/patching/patch-utils';\nimport { SCHEDULE, INVOKE, TRANSACTION_END, AFTER_EVENT, FETCH, HISTORY, XMLHTTPREQUEST, HTTP_REQUEST_TYPE, OUTCOME_FAILURE, OUTCOME_SUCCESS, OUTCOME_UNKNOWN, QUEUE_ADD_TRANSACTION, TRANSACTION_IGNORE } from '../common/constants';\nimport { truncateModel, SPAN_MODEL, TRANSACTION_MODEL } from '../common/truncate';\nimport { __DEV__ } from '../state';\nvar SIMILAR_SPAN_TO_TRANSACTION_RATIO = 0.05;\nvar TRANSACTION_DURATION_THRESHOLD = 60000;\nexport function groupSmallContinuouslySimilarSpans(originalSpans, transDuration, threshold) {\n originalSpans.sort(function (spanA, spanB) {\n return spanA._start - spanB._start;\n });\n var spans = [];\n var lastCount = 1;\n originalSpans.forEach(function (span, index) {\n if (spans.length === 0) {\n spans.push(span);\n } else {\n var lastSpan = spans[spans.length - 1];\n var isContinuouslySimilar = lastSpan.type === span.type && lastSpan.subtype === span.subtype && lastSpan.action === span.action && lastSpan.name === span.name && span.duration() / transDuration < threshold && (span._start - lastSpan._end) / transDuration < threshold;\n var isLastSpan = originalSpans.length === index + 1;\n\n if (isContinuouslySimilar) {\n lastCount++;\n lastSpan._end = span._end;\n }\n\n if (lastCount > 1 && (!isContinuouslySimilar || isLastSpan)) {\n lastSpan.name = lastCount + 'x ' + lastSpan.name;\n lastCount = 1;\n }\n\n if (!isContinuouslySimilar) {\n spans.push(span);\n }\n }\n });\n return spans;\n}\nexport function adjustTransaction(transaction) {\n if (transaction.sampled) {\n var filterdSpans = transaction.spans.filter(function (span) {\n return span.duration() > 0 && span._start >= transaction._start && span._end <= transaction._end;\n });\n\n if (transaction.isManaged()) {\n var duration = transaction.duration();\n var similarSpans = groupSmallContinuouslySimilarSpans(filterdSpans, duration, SIMILAR_SPAN_TO_TRANSACTION_RATIO);\n transaction.spans = similarSpans;\n } else {\n transaction.spans = filterdSpans;\n }\n } else {\n transaction.resetFields();\n }\n\n return transaction;\n}\n\nvar PerformanceMonitoring = function () {\n function PerformanceMonitoring(apmServer, configService, loggingService, transactionService) {\n this._apmServer = apmServer;\n this._configService = configService;\n this._logginService = loggingService;\n this._transactionService = transactionService;\n }\n\n var _proto = PerformanceMonitoring.prototype;\n\n _proto.init = function init(flags) {\n var _this = this;\n\n if (flags === void 0) {\n flags = {};\n }\n\n this._configService.events.observe(TRANSACTION_END + AFTER_EVENT, function (tr) {\n var payload = _this.createTransactionPayload(tr);\n\n if (payload) {\n _this._apmServer.addTransaction(payload);\n\n _this._configService.dispatchEvent(QUEUE_ADD_TRANSACTION);\n }\n });\n\n if (flags[HISTORY]) {\n patchEventHandler.observe(HISTORY, this.getHistorySub());\n }\n\n if (flags[XMLHTTPREQUEST]) {\n patchEventHandler.observe(XMLHTTPREQUEST, this.getXHRSub());\n }\n\n if (flags[FETCH]) {\n patchEventHandler.observe(FETCH, this.getFetchSub());\n }\n };\n\n _proto.getHistorySub = function getHistorySub() {\n var transactionService = this._transactionService;\n return function (event, task) {\n if (task.source === HISTORY && event === INVOKE) {\n transactionService.startTransaction(task.data.title, 'route-change', {\n managed: true,\n canReuse: true\n });\n }\n };\n };\n\n _proto.getXHRSub = function getXHRSub() {\n var _this2 = this;\n\n return function (event, task) {\n if (task.source === XMLHTTPREQUEST && !globalState.fetchInProgress) {\n _this2.processAPICalls(event, task);\n }\n };\n };\n\n _proto.getFetchSub = function getFetchSub() {\n var _this3 = this;\n\n return function (event, task) {\n if (task.source === FETCH) {\n _this3.processAPICalls(event, task);\n }\n };\n };\n\n _proto.processAPICalls = function processAPICalls(event, task) {\n var configService = this._configService;\n var transactionService = this._transactionService;\n\n if (task.data && task.data.url) {\n var endpoints = this._apmServer.getEndpoints();\n\n var isOwnEndpoint = Object.keys(endpoints).some(function (endpoint) {\n return task.data.url.indexOf(endpoints[endpoint]) !== -1;\n });\n\n if (isOwnEndpoint) {\n return;\n }\n }\n\n if (event === SCHEDULE && task.data) {\n var data = task.data;\n var requestUrl = new Url(data.url);\n var spanName = data.method + ' ' + (requestUrl.relative ? requestUrl.path : stripQueryStringFromUrl(requestUrl.href));\n\n if (!transactionService.getCurrentTransaction()) {\n transactionService.startTransaction(spanName, HTTP_REQUEST_TYPE, {\n managed: true\n });\n }\n\n var span = transactionService.startSpan(spanName, 'external.http', {\n blocking: true\n });\n\n if (!span) {\n return;\n }\n\n var isDtEnabled = configService.get('distributedTracing');\n var dtOrigins = configService.get('distributedTracingOrigins');\n var currentUrl = new Url(window.location.href);\n var isSameOrigin = checkSameOrigin(requestUrl.origin, currentUrl.origin) || checkSameOrigin(requestUrl.origin, dtOrigins);\n var target = data.target;\n\n if (isDtEnabled && isSameOrigin && target) {\n this.injectDtHeader(span, target);\n var propagateTracestate = configService.get('propagateTracestate');\n\n if (propagateTracestate) {\n this.injectTSHeader(span, target);\n }\n } else if (__DEV__) {\n this._logginService.debug(\"Could not inject distributed tracing header to the request origin ('\" + requestUrl.origin + \"') from the current origin ('\" + currentUrl.origin + \"')\");\n }\n\n if (data.sync) {\n span.sync = data.sync;\n }\n\n data.span = span;\n } else if (event === INVOKE) {\n var _data = task.data;\n\n if (_data && _data.span) {\n var _span = _data.span,\n response = _data.response,\n _target = _data.target;\n var status;\n\n if (response) {\n status = response.status;\n } else {\n status = _target.status;\n }\n\n var outcome;\n\n if (_data.status != 'abort' && !_data.aborted) {\n if (status >= 400 || status == 0) {\n outcome = OUTCOME_FAILURE;\n } else {\n outcome = OUTCOME_SUCCESS;\n }\n } else {\n outcome = OUTCOME_UNKNOWN;\n }\n\n _span.outcome = outcome;\n var tr = transactionService.getCurrentTransaction();\n\n if (tr && tr.type === HTTP_REQUEST_TYPE) {\n tr.outcome = outcome;\n }\n\n transactionService.endSpan(_span, _data);\n }\n }\n };\n\n _proto.injectDtHeader = function injectDtHeader(span, target) {\n var headerName = this._configService.get('distributedTracingHeaderName');\n\n var headerValue = getDtHeaderValue(span);\n var isHeaderValid = isDtHeaderValid(headerValue);\n\n if (isHeaderValid && headerValue && headerName) {\n setRequestHeader(target, headerName, headerValue);\n }\n };\n\n _proto.injectTSHeader = function injectTSHeader(span, target) {\n var headerValue = getTSHeaderValue(span);\n\n if (headerValue) {\n setRequestHeader(target, 'tracestate', headerValue);\n }\n };\n\n _proto.extractDtHeader = function extractDtHeader(target) {\n var configService = this._configService;\n var headerName = configService.get('distributedTracingHeaderName');\n\n if (target) {\n return parseDtHeaderValue(target[headerName]);\n }\n };\n\n _proto.filterTransaction = function filterTransaction(tr) {\n var duration = tr.duration();\n\n if (!duration) {\n if (__DEV__) {\n var message = \"transaction(\" + tr.id + \", \" + tr.name + \") was discarded! \";\n\n if (duration === 0) {\n message += \"Transaction duration is 0\";\n } else {\n message += \"Transaction wasn't ended\";\n }\n\n this._logginService.debug(message);\n }\n\n return false;\n }\n\n if (tr.isManaged()) {\n if (duration > TRANSACTION_DURATION_THRESHOLD) {\n if (__DEV__) {\n this._logginService.debug(\"transaction(\" + tr.id + \", \" + tr.name + \") was discarded! Transaction duration (\" + duration + \") is greater than managed transaction threshold (\" + TRANSACTION_DURATION_THRESHOLD + \")\");\n }\n\n return false;\n }\n\n if (tr.sampled && tr.spans.length === 0) {\n if (__DEV__) {\n this._logginService.debug(\"transaction(\" + tr.id + \", \" + tr.name + \") was discarded! Transaction does not have any spans\");\n }\n\n return false;\n }\n }\n\n return true;\n };\n\n _proto.createTransactionDataModel = function createTransactionDataModel(transaction) {\n var transactionStart = transaction._start;\n var spans = transaction.spans.map(function (span) {\n var spanData = {\n id: span.id,\n transaction_id: transaction.id,\n parent_id: span.parentId || transaction.id,\n trace_id: transaction.traceId,\n name: span.name,\n type: span.type,\n subtype: span.subtype,\n action: span.action,\n sync: span.sync,\n start: parseInt(span._start - transactionStart),\n duration: span.duration(),\n context: span.context,\n outcome: span.outcome,\n sample_rate: span.sampleRate\n };\n return truncateModel(SPAN_MODEL, spanData);\n });\n var transactionData = {\n id: transaction.id,\n parent_id: transaction.parentId,\n trace_id: transaction.traceId,\n session: transaction.session,\n name: transaction.name,\n type: transaction.type,\n duration: transaction.duration(),\n spans: spans,\n context: transaction.context,\n marks: transaction.marks,\n breakdown: transaction.breakdownTimings,\n span_count: {\n started: spans.length\n },\n sampled: transaction.sampled,\n sample_rate: transaction.sampleRate,\n experience: transaction.experience,\n outcome: transaction.outcome\n };\n return truncateModel(TRANSACTION_MODEL, transactionData);\n };\n\n _proto.createTransactionPayload = function createTransactionPayload(transaction) {\n var adjustedTransaction = adjustTransaction(transaction);\n var filtered = this.filterTransaction(adjustedTransaction);\n\n if (filtered) {\n return this.createTransactionDataModel(transaction);\n }\n\n this._configService.dispatchEvent(TRANSACTION_IGNORE);\n };\n\n return PerformanceMonitoring;\n}();\n\nexport { PerformanceMonitoring as default };","import { generateRandomId, setLabel, merge, getDuration, getTime } from '../common/utils';\nimport { NAME_UNKNOWN, TYPE_CUSTOM } from '../common/constants';\n\nvar SpanBase = function () {\n function SpanBase(name, type, options) {\n if (options === void 0) {\n options = {};\n }\n\n if (!name) {\n name = NAME_UNKNOWN;\n }\n\n if (!type) {\n type = TYPE_CUSTOM;\n }\n\n this.name = name;\n this.type = type;\n this.options = options;\n this.id = options.id || generateRandomId(16);\n this.traceId = options.traceId;\n this.sampled = options.sampled;\n this.sampleRate = options.sampleRate;\n this.timestamp = options.timestamp;\n this._start = getTime(options.startTime);\n this._end = undefined;\n this.ended = false;\n this.outcome = undefined;\n this.onEnd = options.onEnd;\n }\n\n var _proto = SpanBase.prototype;\n\n _proto.ensureContext = function ensureContext() {\n if (!this.context) {\n this.context = {};\n }\n };\n\n _proto.addLabels = function addLabels(tags) {\n this.ensureContext();\n var ctx = this.context;\n\n if (!ctx.tags) {\n ctx.tags = {};\n }\n\n var keys = Object.keys(tags);\n keys.forEach(function (k) {\n return setLabel(k, tags[k], ctx.tags);\n });\n };\n\n _proto.addContext = function addContext() {\n for (var _len = arguments.length, context = new Array(_len), _key = 0; _key < _len; _key++) {\n context[_key] = arguments[_key];\n }\n\n if (context.length === 0) return;\n this.ensureContext();\n this.context = merge.apply(void 0, [this.context].concat(context));\n };\n\n _proto.end = function end(endTime) {\n if (this.ended) {\n return;\n }\n\n this.ended = true;\n this._end = getTime(endTime);\n this.callOnEnd();\n };\n\n _proto.callOnEnd = function callOnEnd() {\n if (typeof this.onEnd === 'function') {\n this.onEnd(this);\n }\n };\n\n _proto.duration = function duration() {\n return getDuration(this._start, this._end);\n };\n\n return SpanBase;\n}();\n\nexport default SpanBase;","function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nimport SpanBase from './span-base';\nimport { addSpanContext } from '../common/context';\n\nvar Span = function (_SpanBase) {\n _inheritsLoose(Span, _SpanBase);\n\n function Span(name, type, options) {\n var _this;\n\n _this = _SpanBase.call(this, name, type, options) || this;\n _this.parentId = _this.options.parentId;\n _this.subtype = undefined;\n _this.action = undefined;\n\n if (_this.type.indexOf('.') !== -1) {\n var fields = _this.type.split('.', 3);\n\n _this.type = fields[0];\n _this.subtype = fields[1];\n _this.action = fields[2];\n }\n\n _this.sync = _this.options.sync;\n return _this;\n }\n\n var _proto = Span.prototype;\n\n _proto.end = function end(endTime, data) {\n _SpanBase.prototype.end.call(this, endTime);\n\n addSpanContext(this, data);\n };\n\n return Span;\n}(SpanBase);\n\nexport default Span;","import { getDuration, PERF } from '../common/utils';\nimport { PAGE_LOAD, TRUNCATED_TYPE } from '../common/constants';\nvar pageLoadBreakdowns = [['domainLookupStart', 'domainLookupEnd', 'DNS'], ['connectStart', 'connectEnd', 'TCP'], ['requestStart', 'responseStart', 'Request'], ['responseStart', 'responseEnd', 'Response'], ['domLoading', 'domComplete', 'Processing'], ['loadEventStart', 'loadEventEnd', 'Load']];\n\nfunction getValue(value) {\n return {\n value: value\n };\n}\n\nfunction calculateSelfTime(transaction) {\n var spans = transaction.spans,\n _start = transaction._start,\n _end = transaction._end;\n\n if (spans.length === 0) {\n return transaction.duration();\n }\n\n spans.sort(function (span1, span2) {\n return span1._start - span2._start;\n });\n var span = spans[0];\n var spanEnd = span._end;\n var spanStart = span._start;\n var lastContinuousEnd = spanEnd;\n var selfTime = spanStart - _start;\n\n for (var i = 1; i < spans.length; i++) {\n span = spans[i];\n spanStart = span._start;\n spanEnd = span._end;\n\n if (spanStart > lastContinuousEnd) {\n selfTime += spanStart - lastContinuousEnd;\n lastContinuousEnd = spanEnd;\n } else if (spanEnd > lastContinuousEnd) {\n lastContinuousEnd = spanEnd;\n }\n }\n\n if (lastContinuousEnd < _end) {\n selfTime += _end - lastContinuousEnd;\n }\n\n return selfTime;\n}\n\nfunction groupSpans(transaction) {\n var spanMap = {};\n var transactionSelfTime = calculateSelfTime(transaction);\n spanMap['app'] = {\n count: 1,\n duration: transactionSelfTime\n };\n var spans = transaction.spans;\n\n for (var i = 0; i < spans.length; i++) {\n var span = spans[i];\n var duration = span.duration();\n\n if (duration === 0 || duration == null) {\n continue;\n }\n\n var type = span.type,\n subtype = span.subtype;\n var key = type.replace(TRUNCATED_TYPE, '');\n\n if (subtype) {\n key += '.' + subtype;\n }\n\n if (!spanMap[key]) {\n spanMap[key] = {\n duration: 0,\n count: 0\n };\n }\n\n spanMap[key].count++;\n spanMap[key].duration += duration;\n }\n\n return spanMap;\n}\n\nfunction getSpanBreakdown(transactionDetails, _ref) {\n var details = _ref.details,\n _ref$count = _ref.count,\n count = _ref$count === void 0 ? 1 : _ref$count,\n duration = _ref.duration;\n return {\n transaction: transactionDetails,\n span: details,\n samples: {\n 'span.self_time.count': getValue(count),\n 'span.self_time.sum.us': getValue(duration * 1000)\n }\n };\n}\n\nexport function captureBreakdown(transaction, timings) {\n if (timings === void 0) {\n timings = PERF.timing;\n }\n\n var breakdowns = [];\n var name = transaction.name,\n type = transaction.type,\n sampled = transaction.sampled;\n var transactionDetails = {\n name: name,\n type: type\n };\n\n if (!sampled) {\n return breakdowns;\n }\n\n if (type === PAGE_LOAD && timings) {\n for (var i = 0; i < pageLoadBreakdowns.length; i++) {\n var current = pageLoadBreakdowns[i];\n var start = timings[current[0]];\n var end = timings[current[1]];\n var duration = getDuration(start, end);\n\n if (duration === 0 || duration == null) {\n continue;\n }\n\n breakdowns.push(getSpanBreakdown(transactionDetails, {\n details: {\n type: current[2]\n },\n duration: duration\n }));\n }\n } else {\n var spanMap = groupSpans(transaction);\n Object.keys(spanMap).forEach(function (key) {\n var _key$split = key.split('.'),\n type = _key$split[0],\n subtype = _key$split[1];\n\n var _spanMap$key = spanMap[key],\n duration = _spanMap$key.duration,\n count = _spanMap$key.count;\n breakdowns.push(getSpanBreakdown(transactionDetails, {\n details: {\n type: type,\n subtype: subtype\n },\n duration: duration,\n count: count\n }));\n });\n }\n\n return breakdowns;\n}","function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nimport Span from './span';\nimport SpanBase from './span-base';\nimport { generateRandomId, merge, now, getTime, extend, removeInvalidChars } from '../common/utils';\nimport { REUSABILITY_THRESHOLD, TRUNCATED_TYPE } from '../common/constants';\nimport { captureBreakdown as _captureBreakdown } from './breakdown';\n\nvar Transaction = function (_SpanBase) {\n _inheritsLoose(Transaction, _SpanBase);\n\n function Transaction(name, type, options) {\n var _this;\n\n _this = _SpanBase.call(this, name, type, options) || this;\n _this.traceId = generateRandomId();\n _this.marks = undefined;\n _this.spans = [];\n _this._activeSpans = {};\n _this._activeTasks = new Set();\n _this.blocked = false;\n _this.captureTimings = false;\n _this.breakdownTimings = [];\n _this.sampleRate = _this.options.transactionSampleRate;\n _this.sampled = Math.random() <= _this.sampleRate;\n return _this;\n }\n\n var _proto = Transaction.prototype;\n\n _proto.addMarks = function addMarks(obj) {\n this.marks = merge(this.marks || {}, obj);\n };\n\n _proto.mark = function mark(key) {\n var skey = removeInvalidChars(key);\n\n var markTime = now() - this._start;\n\n var custom = {};\n custom[skey] = markTime;\n this.addMarks({\n custom: custom\n });\n };\n\n _proto.canReuse = function canReuse() {\n var threshold = this.options.reuseThreshold || REUSABILITY_THRESHOLD;\n return !!this.options.canReuse && !this.ended && now() - this._start < threshold;\n };\n\n _proto.redefine = function redefine(name, type, options) {\n if (name) {\n this.name = name;\n }\n\n if (type) {\n this.type = type;\n }\n\n if (options) {\n this.options.reuseThreshold = options.reuseThreshold;\n this.options = extend(this.options, options);\n }\n };\n\n _proto.startSpan = function startSpan(name, type, options) {\n var _this2 = this;\n\n if (this.ended) {\n return;\n }\n\n var opts = extend({}, options);\n\n opts.onEnd = function (trc) {\n _this2._onSpanEnd(trc);\n };\n\n opts.traceId = this.traceId;\n opts.sampled = this.sampled;\n opts.sampleRate = this.sampleRate;\n\n if (!opts.parentId) {\n opts.parentId = this.id;\n }\n\n var span = new Span(name, type, opts);\n this._activeSpans[span.id] = span;\n\n if (opts.blocking) {\n this.addTask(span.id);\n }\n\n return span;\n };\n\n _proto.isFinished = function isFinished() {\n return !this.blocked && this._activeTasks.size === 0;\n };\n\n _proto.detectFinish = function detectFinish() {\n if (this.isFinished()) this.end();\n };\n\n _proto.end = function end(endTime) {\n if (this.ended) {\n return;\n }\n\n this.ended = true;\n this._end = getTime(endTime);\n\n for (var sid in this._activeSpans) {\n var span = this._activeSpans[sid];\n span.type = span.type + TRUNCATED_TYPE;\n span.end(endTime);\n }\n\n this.callOnEnd();\n };\n\n _proto.captureBreakdown = function captureBreakdown() {\n this.breakdownTimings = _captureBreakdown(this);\n };\n\n _proto.block = function block(flag) {\n this.blocked = flag;\n\n if (!this.blocked) {\n this.detectFinish();\n }\n };\n\n _proto.addTask = function addTask(taskId) {\n if (!taskId) {\n taskId = 'task-' + generateRandomId(16);\n }\n\n this._activeTasks.add(taskId);\n\n return taskId;\n };\n\n _proto.removeTask = function removeTask(taskId) {\n var deleted = this._activeTasks.delete(taskId);\n\n deleted && this.detectFinish();\n };\n\n _proto.resetFields = function resetFields() {\n this.spans = [];\n this.sampleRate = 0;\n };\n\n _proto._onSpanEnd = function _onSpanEnd(span) {\n this.spans.push(span);\n delete this._activeSpans[span.id];\n this.removeTask(span.id);\n };\n\n _proto.isManaged = function isManaged() {\n return !!this.options.managed;\n };\n\n return Transaction;\n}(SpanBase);\n\nexport default Transaction;","function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nimport { LONG_TASK, LARGEST_CONTENTFUL_PAINT, FIRST_CONTENTFUL_PAINT, FIRST_INPUT, LAYOUT_SHIFT } from '../../common/constants';\nimport { noop, PERF, isPerfTypeSupported, isRedirectInfoAvailable } from '../../common/utils';\nimport Span from '../span';\nexport var metrics = {\n fid: 0,\n fcp: 0,\n tbt: {\n start: Infinity,\n duration: 0\n },\n cls: {\n score: 0,\n firstEntryTime: Number.NEGATIVE_INFINITY,\n prevEntryTime: Number.NEGATIVE_INFINITY,\n currentSessionScore: 0\n },\n longtask: {\n count: 0,\n duration: 0,\n max: 0\n }\n};\nvar LONG_TASK_THRESHOLD = 50;\nexport function createLongTaskSpans(longtasks, agg) {\n var spans = [];\n\n for (var i = 0; i < longtasks.length; i++) {\n var _longtasks$i = longtasks[i],\n name = _longtasks$i.name,\n startTime = _longtasks$i.startTime,\n duration = _longtasks$i.duration,\n attribution = _longtasks$i.attribution;\n var end = startTime + duration;\n var span = new Span(\"Longtask(\" + name + \")\", LONG_TASK, {\n startTime: startTime\n });\n agg.count++;\n agg.duration += duration;\n agg.max = Math.max(duration, agg.max);\n\n if (attribution.length > 0) {\n var _attribution$ = attribution[0],\n _name = _attribution$.name,\n containerType = _attribution$.containerType,\n containerName = _attribution$.containerName,\n containerId = _attribution$.containerId;\n var customContext = {\n attribution: _name,\n type: containerType\n };\n\n if (containerName) {\n customContext.name = containerName;\n }\n\n if (containerId) {\n customContext.id = containerId;\n }\n\n span.addContext({\n custom: customContext\n });\n }\n\n span.end(end);\n spans.push(span);\n }\n\n return spans;\n}\nexport function createFirstInputDelaySpan(fidEntries) {\n var firstInput = fidEntries[0];\n\n if (firstInput) {\n var startTime = firstInput.startTime,\n processingStart = firstInput.processingStart;\n var span = new Span('First Input Delay', FIRST_INPUT, {\n startTime: startTime\n });\n span.end(processingStart);\n return span;\n }\n}\nexport function createTotalBlockingTimeSpan(tbtObject) {\n var start = tbtObject.start,\n duration = tbtObject.duration;\n var tbtSpan = new Span('Total Blocking Time', LONG_TASK, {\n startTime: start\n });\n tbtSpan.end(start + duration);\n return tbtSpan;\n}\nexport function calculateTotalBlockingTime(longtaskEntries) {\n longtaskEntries.forEach(function (entry) {\n var name = entry.name,\n startTime = entry.startTime,\n duration = entry.duration;\n\n if (startTime < metrics.fcp) {\n return;\n }\n\n if (name !== 'self' && name.indexOf('same-origin') === -1) {\n return;\n }\n\n metrics.tbt.start = Math.min(metrics.tbt.start, startTime);\n var blockingTime = duration - LONG_TASK_THRESHOLD;\n\n if (blockingTime > 0) {\n metrics.tbt.duration += blockingTime;\n }\n });\n}\nexport function calculateCumulativeLayoutShift(clsEntries) {\n clsEntries.forEach(function (entry) {\n if (!entry.hadRecentInput && entry.value) {\n var shouldCreateNewSession = entry.startTime - metrics.cls.firstEntryTime > 5000 || entry.startTime - metrics.cls.prevEntryTime > 1000;\n\n if (shouldCreateNewSession) {\n metrics.cls.firstEntryTime = entry.startTime;\n metrics.cls.currentSessionScore = 0;\n }\n\n metrics.cls.prevEntryTime = entry.startTime;\n metrics.cls.currentSessionScore += entry.value;\n metrics.cls.score = Math.max(metrics.cls.score, metrics.cls.currentSessionScore);\n }\n });\n}\nexport function captureObserverEntries(list, _ref) {\n var isHardNavigation = _ref.isHardNavigation,\n trStart = _ref.trStart;\n var longtaskEntries = list.getEntriesByType(LONG_TASK).filter(function (entry) {\n return entry.startTime >= trStart;\n });\n var longTaskSpans = createLongTaskSpans(longtaskEntries, metrics.longtask);\n var result = {\n spans: longTaskSpans,\n marks: {}\n };\n\n if (!isHardNavigation) {\n return result;\n }\n\n var lcpEntries = list.getEntriesByType(LARGEST_CONTENTFUL_PAINT);\n var lastLcpEntry = lcpEntries[lcpEntries.length - 1];\n\n if (lastLcpEntry) {\n var lcp = parseInt(lastLcpEntry.startTime);\n metrics.lcp = lcp;\n result.marks.largestContentfulPaint = lcp;\n }\n\n var timing = PERF.timing;\n var unloadDiff = timing.fetchStart - timing.navigationStart;\n\n if (isRedirectInfoAvailable(timing)) {\n unloadDiff = 0;\n }\n\n var fcpEntry = list.getEntriesByName(FIRST_CONTENTFUL_PAINT)[0];\n\n if (fcpEntry) {\n var fcp = parseInt(unloadDiff >= 0 ? fcpEntry.startTime - unloadDiff : fcpEntry.startTime);\n metrics.fcp = fcp;\n result.marks.firstContentfulPaint = fcp;\n }\n\n var fidEntries = list.getEntriesByType(FIRST_INPUT);\n var fidSpan = createFirstInputDelaySpan(fidEntries);\n\n if (fidSpan) {\n metrics.fid = fidSpan.duration();\n result.spans.push(fidSpan);\n }\n\n calculateTotalBlockingTime(longtaskEntries);\n var clsEntries = list.getEntriesByType(LAYOUT_SHIFT);\n calculateCumulativeLayoutShift(clsEntries);\n return result;\n}\nexport var PerfEntryRecorder = function () {\n function PerfEntryRecorder(callback) {\n this.po = {\n observe: noop,\n disconnect: noop\n };\n\n if (window.PerformanceObserver) {\n this.po = new PerformanceObserver(callback);\n }\n }\n\n var _proto = PerfEntryRecorder.prototype;\n\n _proto.start = function start(type, options) {\n if (options === void 0) {\n options = {\n buffered: true\n };\n }\n\n try {\n if (!isPerfTypeSupported(type)) {\n return;\n }\n\n this.po.observe(_extends({\n type: type\n }, options));\n } catch (_) {}\n };\n\n _proto.stop = function stop() {\n this.po.disconnect();\n };\n\n return PerfEntryRecorder;\n}();","import { MAX_SPAN_DURATION } from '../../common/constants';\n\nfunction shouldCreateSpan(start, end, trStart, trEnd, baseTime) {\n if (baseTime === void 0) {\n baseTime = 0;\n }\n\n return typeof start === 'number' && typeof end === 'number' && start >= baseTime && end > start && start - baseTime >= trStart && end - baseTime <= trEnd && end - start < MAX_SPAN_DURATION && start - baseTime < MAX_SPAN_DURATION && end - baseTime < MAX_SPAN_DURATION;\n}\n\nexport { shouldCreateSpan };","import { shouldCreateSpan } from './utils';\nimport Span from '../span';\nvar eventPairs = [['redirectStart', 'redirectEnd', 'Redirect'], ['domainLookupStart', 'domainLookupEnd', 'Domain lookup'], ['connectStart', 'connectEnd', 'Making a connection to the server'], ['requestStart', 'responseEnd', 'Requesting and receiving the document'], ['domLoading', 'domInteractive', 'Parsing the document, executing sync. scripts'], ['domContentLoadedEventStart', 'domContentLoadedEventEnd', 'Fire \"DOMContentLoaded\" event'], ['loadEventStart', 'loadEventEnd', 'Fire \"load\" event']];\n\nfunction createNavigationTimingSpans(timings, baseTime, trStart, trEnd) {\n var spans = [];\n\n for (var i = 0; i < eventPairs.length; i++) {\n var start = timings[eventPairs[i][0]];\n var end = timings[eventPairs[i][1]];\n\n if (!shouldCreateSpan(start, end, trStart, trEnd, baseTime)) {\n continue;\n }\n\n var span = new Span(eventPairs[i][2], 'hard-navigation.browser-timing');\n var data = null;\n\n if (eventPairs[i][0] === 'requestStart') {\n span.pageResponse = true;\n data = {\n url: location.origin\n };\n }\n\n span._start = start - baseTime;\n span.end(end - baseTime, data);\n spans.push(span);\n }\n\n return spans;\n}\n\nexport { createNavigationTimingSpans };","import { stripQueryStringFromUrl } from '../../common/utils';\nimport { shouldCreateSpan } from './utils';\nimport { RESOURCE_INITIATOR_TYPES } from '../../common/constants';\nimport Span from '../span';\n\nfunction createResourceTimingSpan(resourceTimingEntry) {\n var name = resourceTimingEntry.name,\n initiatorType = resourceTimingEntry.initiatorType,\n startTime = resourceTimingEntry.startTime,\n responseEnd = resourceTimingEntry.responseEnd;\n var kind = 'resource';\n\n if (initiatorType) {\n kind += '.' + initiatorType;\n }\n\n var spanName = stripQueryStringFromUrl(name);\n var span = new Span(spanName, kind);\n span._start = startTime;\n span.end(responseEnd, {\n url: name,\n entry: resourceTimingEntry\n });\n return span;\n}\n\nfunction isCapturedByPatching(resourceStartTime, requestPatchTime) {\n return requestPatchTime != null && resourceStartTime > requestPatchTime;\n}\n\nfunction isIntakeAPIEndpoint(url) {\n return /intake\\/v\\d+\\/rum\\/events/.test(url);\n}\n\nfunction createResourceTimingSpans(entries, requestPatchTime, trStart, trEnd) {\n var spans = [];\n\n for (var i = 0; i < entries.length; i++) {\n var _entries$i = entries[i],\n initiatorType = _entries$i.initiatorType,\n name = _entries$i.name,\n startTime = _entries$i.startTime,\n responseEnd = _entries$i.responseEnd;\n\n if (RESOURCE_INITIATOR_TYPES.indexOf(initiatorType) === -1 || name == null) {\n continue;\n }\n\n if ((initiatorType === 'xmlhttprequest' || initiatorType === 'fetch') && (isIntakeAPIEndpoint(name) || isCapturedByPatching(startTime, requestPatchTime))) {\n continue;\n }\n\n if (shouldCreateSpan(startTime, responseEnd, trStart, trEnd)) {\n spans.push(createResourceTimingSpan(entries[i]));\n }\n }\n\n return spans;\n}\n\nexport { createResourceTimingSpans };","import { PERF, isPerfTimelineSupported, isRedirectInfoAvailable } from '../../common/utils';\nimport { PAGE_LOAD, RESOURCE, MEASURE } from '../../common/constants';\nimport { state } from '../../state';\nimport { createNavigationTimingSpans } from './navigation-timing';\nimport { createUserTimingSpans } from './user-timing';\nimport { createResourceTimingSpans } from './resource-timing';\nimport { getPageLoadMarks } from './marks';\n\nfunction captureNavigation(transaction) {\n if (!transaction.captureTimings) {\n if (transaction.type === PAGE_LOAD) {\n transaction._start = 0;\n }\n\n return;\n }\n\n var trEnd = transaction._end;\n\n if (transaction.type === PAGE_LOAD) {\n if (transaction.marks && transaction.marks.custom) {\n var customMarks = transaction.marks.custom;\n Object.keys(customMarks).forEach(function (key) {\n customMarks[key] += transaction._start;\n });\n }\n\n var trStart = 0;\n transaction._start = trStart;\n var timings = PERF.timing;\n var baseTime = isRedirectInfoAvailable(timings) ? timings.redirectStart : timings.fetchStart;\n createNavigationTimingSpans(timings, baseTime, trStart, trEnd).forEach(function (span) {\n span.traceId = transaction.traceId;\n span.sampled = transaction.sampled;\n\n if (span.pageResponse && transaction.options.pageLoadSpanId) {\n span.id = transaction.options.pageLoadSpanId;\n }\n\n transaction.spans.push(span);\n });\n\n if (transaction.options.pageLoadParentId) {\n transaction.parentId = transaction.options.pageLoadParentId;\n }\n\n transaction.addMarks(getPageLoadMarks(timings));\n }\n\n if (isPerfTimelineSupported()) {\n var _trStart = transaction._start;\n var resourceEntries = PERF.getEntriesByType(RESOURCE);\n createResourceTimingSpans(resourceEntries, state.bootstrapTime, _trStart, trEnd).forEach(function (span) {\n return transaction.spans.push(span);\n });\n var userEntries = PERF.getEntriesByType(MEASURE);\n createUserTimingSpans(userEntries, _trStart, trEnd).forEach(function (span) {\n return transaction.spans.push(span);\n });\n }\n}\n\nexport { captureNavigation, createNavigationTimingSpans, createResourceTimingSpans, createUserTimingSpans, getPageLoadMarks };","import { USER_TIMING_THRESHOLD } from '../../common/constants';\nimport { shouldCreateSpan } from './utils';\nimport Span from '../span';\n\nfunction createUserTimingSpans(entries, trStart, trEnd) {\n var userTimingSpans = [];\n\n for (var i = 0; i < entries.length; i++) {\n var _entries$i = entries[i],\n name = _entries$i.name,\n startTime = _entries$i.startTime,\n duration = _entries$i.duration;\n var end = startTime + duration;\n\n if (duration <= USER_TIMING_THRESHOLD || !shouldCreateSpan(startTime, end, trStart, trEnd)) {\n continue;\n }\n\n var kind = 'app';\n var span = new Span(name, kind);\n span._start = startTime;\n span.end(end);\n userTimingSpans.push(span);\n }\n\n return userTimingSpans;\n}\n\nexport { createUserTimingSpans };","import { Promise } from '../common/polyfills';\nimport Transaction from './transaction';\nimport { PerfEntryRecorder, captureObserverEntries, metrics, createTotalBlockingTimeSpan } from './metrics/metrics';\nimport { extend, getEarliestSpan, getLatestNonXHRSpan, getLatestXHRSpan, isPerfTypeSupported, generateRandomId } from '../common/utils';\nimport { captureNavigation } from './navigation/capture-navigation';\nimport { PAGE_LOAD, NAME_UNKNOWN, TRANSACTION_START, TRANSACTION_END, TRANSACTION_IGNORE, TEMPORARY_TYPE, TRANSACTION_TYPE_ORDER, LARGEST_CONTENTFUL_PAINT, LONG_TASK, PAINT, TRUNCATED_TYPE, FIRST_INPUT, LAYOUT_SHIFT, SESSION_TIMEOUT, PAGE_LOAD_DELAY } from '../common/constants';\nimport { addTransactionContext } from '../common/context';\nimport { __DEV__, state } from '../state';\nimport { slugifyUrl } from '../common/url';\n\nvar TransactionService = function () {\n function TransactionService(logger, config) {\n var _this = this;\n\n this._config = config;\n this._logger = logger;\n this.currentTransaction = undefined;\n this.respIntervalId = undefined;\n this.recorder = new PerfEntryRecorder(function (list) {\n var tr = _this.getCurrentTransaction();\n\n if (tr && tr.captureTimings) {\n var _tr$spans;\n\n var isHardNavigation = tr.type === PAGE_LOAD;\n\n var _captureObserverEntri = captureObserverEntries(list, {\n isHardNavigation: isHardNavigation,\n trStart: isHardNavigation ? 0 : tr._start\n }),\n spans = _captureObserverEntri.spans,\n marks = _captureObserverEntri.marks;\n\n (_tr$spans = tr.spans).push.apply(_tr$spans, spans);\n\n tr.addMarks({\n agent: marks\n });\n }\n });\n }\n\n var _proto = TransactionService.prototype;\n\n _proto.createCurrentTransaction = function createCurrentTransaction(name, type, options) {\n var tr = new Transaction(name, type, options);\n this.currentTransaction = tr;\n return tr;\n };\n\n _proto.getCurrentTransaction = function getCurrentTransaction() {\n if (this.currentTransaction && !this.currentTransaction.ended) {\n return this.currentTransaction;\n }\n };\n\n _proto.createOptions = function createOptions(options) {\n var config = this._config.config;\n var presetOptions = {\n transactionSampleRate: config.transactionSampleRate\n };\n var perfOptions = extend(presetOptions, options);\n\n if (perfOptions.managed) {\n perfOptions = extend({\n pageLoadTraceId: config.pageLoadTraceId,\n pageLoadSampled: config.pageLoadSampled,\n pageLoadSpanId: config.pageLoadSpanId,\n pageLoadTransactionName: config.pageLoadTransactionName,\n pageLoadParentId: config.pageLoadParentId\n }, perfOptions);\n }\n\n return perfOptions;\n };\n\n _proto.startManagedTransaction = function startManagedTransaction(name, type, perfOptions) {\n var tr = this.getCurrentTransaction();\n var isRedefined = false;\n\n if (!tr) {\n tr = this.createCurrentTransaction(name, type, perfOptions);\n } else if (tr.canReuse() && perfOptions.canReuse) {\n var redefineType = tr.type;\n var currentTypeOrder = TRANSACTION_TYPE_ORDER.indexOf(tr.type);\n var redefineTypeOrder = TRANSACTION_TYPE_ORDER.indexOf(type);\n\n if (currentTypeOrder >= 0 && redefineTypeOrder < currentTypeOrder) {\n redefineType = type;\n }\n\n if (__DEV__) {\n this._logger.debug(\"redefining transaction(\" + tr.id + \", \" + tr.name + \", \" + tr.type + \")\", 'to', \"(\" + (name || tr.name) + \", \" + redefineType + \")\", tr);\n }\n\n tr.redefine(name, redefineType, perfOptions);\n isRedefined = true;\n } else {\n if (__DEV__) {\n this._logger.debug(\"ending previous transaction(\" + tr.id + \", \" + tr.name + \")\", tr);\n }\n\n tr.end();\n tr = this.createCurrentTransaction(name, type, perfOptions);\n }\n\n if (tr.type === PAGE_LOAD) {\n if (!isRedefined) {\n this.recorder.start(LARGEST_CONTENTFUL_PAINT);\n this.recorder.start(PAINT);\n this.recorder.start(FIRST_INPUT);\n this.recorder.start(LAYOUT_SHIFT);\n }\n\n if (perfOptions.pageLoadTraceId) {\n tr.traceId = perfOptions.pageLoadTraceId;\n }\n\n if (perfOptions.pageLoadSampled) {\n tr.sampled = perfOptions.pageLoadSampled;\n }\n\n if (tr.name === NAME_UNKNOWN && perfOptions.pageLoadTransactionName) {\n tr.name = perfOptions.pageLoadTransactionName;\n }\n }\n\n if (!isRedefined && this._config.get('monitorLongtasks')) {\n this.recorder.start(LONG_TASK);\n }\n\n if (tr.sampled) {\n tr.captureTimings = true;\n }\n\n return tr;\n };\n\n _proto.startTransaction = function startTransaction(name, type, options) {\n var _this2 = this;\n\n var perfOptions = this.createOptions(options);\n var tr;\n var fireOnstartHook = true;\n\n if (perfOptions.managed) {\n var current = this.currentTransaction;\n tr = this.startManagedTransaction(name, type, perfOptions);\n\n if (current === tr) {\n fireOnstartHook = false;\n }\n } else {\n tr = new Transaction(name, type, perfOptions);\n }\n\n tr.onEnd = function () {\n return _this2.handleTransactionEnd(tr);\n };\n\n if (fireOnstartHook) {\n if (__DEV__) {\n this._logger.debug(\"startTransaction(\" + tr.id + \", \" + tr.name + \", \" + tr.type + \")\");\n }\n\n this._config.events.send(TRANSACTION_START, [tr]);\n }\n\n return tr;\n };\n\n _proto.handleTransactionEnd = function handleTransactionEnd(tr) {\n var _this3 = this;\n\n this.recorder.stop();\n var currentUrl = window.location.href;\n return Promise.resolve().then(function () {\n var name = tr.name,\n type = tr.type;\n var lastHiddenStart = state.lastHiddenStart;\n\n if (lastHiddenStart >= tr._start) {\n if (__DEV__) {\n _this3._logger.debug(\"transaction(\" + tr.id + \", \" + name + \", \" + type + \") was discarded! The page was hidden during the transaction!\");\n }\n\n _this3._config.dispatchEvent(TRANSACTION_IGNORE);\n\n return;\n }\n\n if (_this3.shouldIgnoreTransaction(name) || type === TEMPORARY_TYPE) {\n if (__DEV__) {\n _this3._logger.debug(\"transaction(\" + tr.id + \", \" + name + \", \" + type + \") is ignored\");\n }\n\n _this3._config.dispatchEvent(TRANSACTION_IGNORE);\n\n return;\n }\n\n if (type === PAGE_LOAD) {\n var pageLoadTransactionName = _this3._config.get('pageLoadTransactionName');\n\n if (name === NAME_UNKNOWN && pageLoadTransactionName) {\n tr.name = pageLoadTransactionName;\n }\n\n if (tr.captureTimings) {\n var cls = metrics.cls,\n fid = metrics.fid,\n tbt = metrics.tbt,\n longtask = metrics.longtask;\n\n if (tbt.duration > 0) {\n tr.spans.push(createTotalBlockingTimeSpan(tbt));\n }\n\n tr.experience = {};\n\n if (isPerfTypeSupported(LONG_TASK)) {\n tr.experience.tbt = tbt.duration;\n }\n\n if (isPerfTypeSupported(LAYOUT_SHIFT)) {\n tr.experience.cls = cls.score;\n }\n\n if (fid > 0) {\n tr.experience.fid = fid;\n }\n\n if (longtask.count > 0) {\n tr.experience.longtask = {\n count: longtask.count,\n sum: longtask.duration,\n max: longtask.max\n };\n }\n }\n\n _this3.setSession(tr);\n }\n\n if (tr.name === NAME_UNKNOWN) {\n tr.name = slugifyUrl(currentUrl);\n }\n\n captureNavigation(tr);\n\n _this3.adjustTransactionTime(tr);\n\n var breakdownMetrics = _this3._config.get('breakdownMetrics');\n\n if (breakdownMetrics) {\n tr.captureBreakdown();\n }\n\n var configContext = _this3._config.get('context');\n\n addTransactionContext(tr, configContext);\n\n _this3._config.events.send(TRANSACTION_END, [tr]);\n\n if (__DEV__) {\n _this3._logger.debug(\"end transaction(\" + tr.id + \", \" + tr.name + \", \" + tr.type + \")\", tr);\n }\n }, function (err) {\n if (__DEV__) {\n _this3._logger.debug(\"error ending transaction(\" + tr.id + \", \" + tr.name + \")\", err);\n }\n });\n };\n\n _proto.setSession = function setSession(tr) {\n var session = this._config.get('session');\n\n if (session) {\n if (typeof session == 'boolean') {\n tr.session = {\n id: generateRandomId(16),\n sequence: 1\n };\n } else {\n if (session.timestamp && Date.now() - session.timestamp > SESSION_TIMEOUT) {\n tr.session = {\n id: generateRandomId(16),\n sequence: 1\n };\n } else {\n tr.session = {\n id: session.id,\n sequence: session.sequence ? session.sequence + 1 : 1\n };\n }\n }\n\n var sessionConfig = {\n session: {\n id: tr.session.id,\n sequence: tr.session.sequence,\n timestamp: Date.now()\n }\n };\n\n this._config.setConfig(sessionConfig);\n\n this._config.setLocalConfig(sessionConfig, true);\n }\n };\n\n _proto.adjustTransactionTime = function adjustTransactionTime(transaction) {\n var spans = transaction.spans;\n var earliestSpan = getEarliestSpan(spans);\n\n if (earliestSpan && earliestSpan._start < transaction._start) {\n transaction._start = earliestSpan._start;\n }\n\n var latestSpan = getLatestNonXHRSpan(spans) || {};\n var latestSpanEnd = latestSpan._end || 0;\n\n if (transaction.type === PAGE_LOAD) {\n var transactionEndWithoutDelay = transaction._end - PAGE_LOAD_DELAY;\n var lcp = metrics.lcp || 0;\n var latestXHRSpan = getLatestXHRSpan(spans) || {};\n var latestXHRSpanEnd = latestXHRSpan._end || 0;\n transaction._end = Math.max(latestSpanEnd, latestXHRSpanEnd, lcp, transactionEndWithoutDelay);\n } else if (latestSpanEnd > transaction._end) {\n transaction._end = latestSpanEnd;\n }\n\n this.truncateSpans(spans, transaction._end);\n };\n\n _proto.truncateSpans = function truncateSpans(spans, transactionEnd) {\n for (var i = 0; i < spans.length; i++) {\n var span = spans[i];\n\n if (span._end > transactionEnd) {\n span._end = transactionEnd;\n span.type += TRUNCATED_TYPE;\n }\n\n if (span._start > transactionEnd) {\n span._start = transactionEnd;\n }\n }\n };\n\n _proto.shouldIgnoreTransaction = function shouldIgnoreTransaction(transactionName) {\n var ignoreList = this._config.get('ignoreTransactions');\n\n if (ignoreList && ignoreList.length) {\n for (var i = 0; i < ignoreList.length; i++) {\n var element = ignoreList[i];\n\n if (typeof element.test === 'function') {\n if (element.test(transactionName)) {\n return true;\n }\n } else if (element === transactionName) {\n return true;\n }\n }\n }\n\n return false;\n };\n\n _proto.startSpan = function startSpan(name, type, options) {\n var tr = this.getCurrentTransaction();\n\n if (!tr) {\n tr = this.createCurrentTransaction(undefined, TEMPORARY_TYPE, this.createOptions({\n canReuse: true,\n managed: true\n }));\n }\n\n var span = tr.startSpan(name, type, options);\n\n if (__DEV__) {\n this._logger.debug(\"startSpan(\" + name + \", \" + span.type + \")\", \"on transaction(\" + tr.id + \", \" + tr.name + \")\");\n }\n\n return span;\n };\n\n _proto.endSpan = function endSpan(span, context) {\n if (!span) {\n return;\n }\n\n if (__DEV__) {\n var tr = this.getCurrentTransaction();\n tr && this._logger.debug(\"endSpan(\" + span.name + \", \" + span.type + \")\", \"on transaction(\" + tr.id + \", \" + tr.name + \")\");\n }\n\n span.end(null, context);\n };\n\n return TransactionService;\n}();\n\nexport default TransactionService;","import { registerServices as registerErrorServices } from './error-logging';\nimport { registerServices as registerPerfServices, observeUserInteractions } from './performance-monitoring';\nimport { ServiceFactory } from './common/service-factory';\nimport { isPlatformSupported, scheduleMicroTask, scheduleMacroTask, isBrowser } from './common/utils';\nimport { patchAll, patchEventHandler } from './common/patching';\nimport { observePageVisibility, observePageClicks } from './common/observers';\nimport { PAGE_LOAD_DELAY, PAGE_LOAD, ERROR, CONFIG_SERVICE, LOGGING_SERVICE, TRANSACTION_SERVICE, APM_SERVER, PERFORMANCE_MONITORING, ERROR_LOGGING, EVENT_TARGET, CLICK } from './common/constants';\nimport { getInstrumentationFlags } from './common/instrument';\nimport afterFrame from './common/after-frame';\nimport { bootstrap } from './bootstrap';\nimport { createTracer } from './opentracing';\n\nfunction createServiceFactory() {\n registerPerfServices();\n registerErrorServices();\n var serviceFactory = new ServiceFactory();\n return serviceFactory;\n}\n\nexport { createServiceFactory, ServiceFactory, patchAll, patchEventHandler, isPlatformSupported, isBrowser, getInstrumentationFlags, createTracer, scheduleMicroTask, scheduleMacroTask, afterFrame, ERROR, PAGE_LOAD_DELAY, PAGE_LOAD, CONFIG_SERVICE, LOGGING_SERVICE, TRANSACTION_SERVICE, APM_SERVER, PERFORMANCE_MONITORING, ERROR_LOGGING, EVENT_TARGET, CLICK, observeUserInteractions, bootstrap, observePageVisibility, observePageClicks };","import PerformanceMonitoring from './performance-monitoring';\nimport TransactionService from './transaction-service';\nimport { APM_SERVER, CONFIG_SERVICE, LOGGING_SERVICE, TRANSACTION_SERVICE, PERFORMANCE_MONITORING } from '../common/constants';\nimport { serviceCreators } from '../common/service-factory';\nimport { observeUserInteractions } from './metrics/inp/process';\nimport { reportInp } from './metrics/inp/report';\n\nfunction registerServices() {\n serviceCreators[TRANSACTION_SERVICE] = function (serviceFactory) {\n var _serviceFactory$getSe = serviceFactory.getService([LOGGING_SERVICE, CONFIG_SERVICE]),\n loggingService = _serviceFactory$getSe[0],\n configService = _serviceFactory$getSe[1];\n\n return new TransactionService(loggingService, configService);\n };\n\n serviceCreators[PERFORMANCE_MONITORING] = function (serviceFactory) {\n var _serviceFactory$getSe2 = serviceFactory.getService([APM_SERVER, CONFIG_SERVICE, LOGGING_SERVICE, TRANSACTION_SERVICE]),\n apmServer = _serviceFactory$getSe2[0],\n configService = _serviceFactory$getSe2[1],\n loggingService = _serviceFactory$getSe2[2],\n transactionService = _serviceFactory$getSe2[3];\n\n return new PerformanceMonitoring(apmServer, configService, loggingService, transactionService);\n };\n}\n\nexport { registerServices, observeUserInteractions, reportInp };","import ErrorLogging from './error-logging';\nimport { CONFIG_SERVICE, TRANSACTION_SERVICE, ERROR_LOGGING, APM_SERVER } from '../common/constants';\nimport { serviceCreators } from '../common/service-factory';\n\nfunction registerServices() {\n serviceCreators[ERROR_LOGGING] = function (serviceFactory) {\n var _serviceFactory$getSe = serviceFactory.getService([APM_SERVER, CONFIG_SERVICE, TRANSACTION_SERVICE]),\n apmServer = _serviceFactory$getSe[0],\n configService = _serviceFactory$getSe[1],\n transactionService = _serviceFactory$getSe[2];\n\n return new ErrorLogging(apmServer, configService, transactionService);\n };\n}\n\nexport { registerServices };","import { EVENT, FIRST_INPUT } from '../../../common/constants';\nimport { isPerfInteractionCountSupported } from '../../../common/utils';\nimport { PerfEntryRecorder } from '../metrics';\nvar INP_THRESHOLD = 40;\nvar MAX_INTERACTIONS_TO_CONSIDER = 10;\nexport var inpState = {\n minInteractionId: Infinity,\n maxInteractionId: 0,\n interactionCount: 0,\n longestInteractions: []\n};\nexport function observeUserInteractions(recorder) {\n if (recorder === void 0) {\n recorder = new PerfEntryRecorder(processUserInteractions);\n }\n\n var isPerfCountSupported = isPerfInteractionCountSupported();\n var durationThreshold = isPerfCountSupported ? INP_THRESHOLD : 16;\n recorder.start(EVENT, {\n buffered: true,\n durationThreshold: durationThreshold\n });\n\n if (!isPerfCountSupported) {\n recorder.start(FIRST_INPUT);\n }\n}\nexport function processUserInteractions(list) {\n var entries = list.getEntries();\n entries.forEach(function (entry) {\n if (!entry.interactionId) {\n return;\n }\n\n updateInteractionCount(entry);\n\n if (entry.duration < INP_THRESHOLD) {\n return;\n }\n\n storeUserInteraction(entry);\n });\n}\nexport function calculateInp() {\n if (inpState.longestInteractions.length === 0) {\n if (interactionCount() > 0) {\n return 0;\n }\n\n return;\n }\n\n var interactionIndex = Math.min(inpState.longestInteractions.length - 1, Math.floor(interactionCount() / 50));\n var inp = inpState.longestInteractions[interactionIndex].duration;\n return inp;\n}\nexport function interactionCount() {\n return performance.interactionCount || inpState.interactionCount;\n}\nexport function restoreINPState() {\n inpState.minInteractionId = Infinity;\n inpState.maxInteractionId = 0;\n inpState.interactionCount = 0;\n inpState.longestInteractions = [];\n}\n\nfunction storeUserInteraction(entry) {\n var leastSlow = inpState.longestInteractions[inpState.longestInteractions.length - 1];\n\n if (typeof leastSlow !== 'undefined' && entry.duration <= leastSlow.duration && entry.interactionId != leastSlow.id) {\n return;\n }\n\n var filteredInteraction = inpState.longestInteractions.filter(function (interaction) {\n return interaction.id === entry.interactionId;\n });\n\n if (filteredInteraction.length > 0) {\n var foundInteraction = filteredInteraction[0];\n foundInteraction.duration = Math.max(foundInteraction.duration, entry.duration);\n } else {\n inpState.longestInteractions.push({\n id: entry.interactionId,\n duration: entry.duration\n });\n }\n\n inpState.longestInteractions.sort(function (a, b) {\n return b.duration - a.duration;\n });\n inpState.longestInteractions.splice(MAX_INTERACTIONS_TO_CONSIDER);\n}\n\nfunction updateInteractionCount(entry) {\n if (isPerfInteractionCountSupported()) {\n return;\n }\n\n inpState.minInteractionId = Math.min(inpState.minInteractionId, entry.interactionId);\n inpState.maxInteractionId = Math.max(inpState.maxInteractionId, entry.interactionId);\n inpState.interactionCount = (inpState.maxInteractionId - inpState.minInteractionId) / 7 + 1;\n}","import { calculateInp, restoreINPState } from './process';\nimport { now } from '../../../common/utils';\nimport { PAGE_EXIT } from '../../../common/constants';\nexport function reportInp(transactionService) {\n var inp = calculateInp();\n\n if (inp >= 0) {\n var startTime = now();\n var inpTr = transactionService.startTransaction(PAGE_EXIT, PAGE_EXIT, {\n startTime: startTime\n });\n var navigations = performance.getEntriesByType('navigation');\n\n if (navigations.length > 0) {\n var hardNavigationUrl = navigations[0].name;\n inpTr.addContext({\n page: {\n url: hardNavigationUrl\n }\n });\n }\n\n inpTr.addLabels({\n inp_value: inp\n });\n var endTime = startTime + inp + 1;\n inpTr.end(endTime);\n restoreINPState();\n return inpTr;\n }\n}","import { QUEUE_ADD_TRANSACTION, QUEUE_FLUSH, TRANSACTION_IGNORE } from '../constants';\nimport { state } from '../../state';\nimport { now } from '../utils';\nimport { reportInp } from '../../performance-monitoring/metrics/inp/report';\nexport function observePageVisibility(configService, transactionService) {\n if (document.visibilityState === 'hidden') {\n state.lastHiddenStart = 0;\n }\n\n var visibilityChangeHandler = function visibilityChangeHandler() {\n if (document.visibilityState === 'hidden') {\n onPageHidden(configService, transactionService);\n }\n };\n\n var pageHideHandler = function pageHideHandler() {\n return onPageHidden(configService, transactionService);\n };\n\n var useCapture = true;\n window.addEventListener('visibilitychange', visibilityChangeHandler, useCapture);\n window.addEventListener('pagehide', pageHideHandler, useCapture);\n return function () {\n window.removeEventListener('visibilitychange', visibilityChangeHandler, useCapture);\n window.removeEventListener('pagehide', pageHideHandler, useCapture);\n };\n}\n\nfunction onPageHidden(configService, transactionService) {\n var inpTr = reportInp(transactionService);\n\n if (inpTr) {\n var unobserve = configService.observeEvent(QUEUE_ADD_TRANSACTION, function () {\n endManagedTransaction(configService, transactionService);\n unobserve();\n });\n } else {\n endManagedTransaction(configService, transactionService);\n }\n}\n\nfunction endManagedTransaction(configService, transactionService) {\n var tr = transactionService.getCurrentTransaction();\n\n if (tr) {\n var unobserveDiscard = configService.observeEvent(TRANSACTION_IGNORE, function () {\n state.lastHiddenStart = now();\n unobserveDiscard();\n unobserveQueueAdd();\n });\n var unobserveQueueAdd = configService.observeEvent(QUEUE_ADD_TRANSACTION, function () {\n configService.dispatchEvent(QUEUE_FLUSH);\n state.lastHiddenStart = now();\n unobserveQueueAdd();\n unobserveDiscard();\n });\n tr.end();\n } else {\n configService.dispatchEvent(QUEUE_FLUSH);\n state.lastHiddenStart = now();\n }\n}","import { USER_INTERACTION } from '../constants';\nvar INTERACTIVE_SELECTOR = 'a[data-transaction-name], button[data-transaction-name]';\nexport function observePageClicks(transactionService) {\n var clickHandler = function clickHandler(event) {\n if (event.target instanceof Element) {\n createUserInteractionTransaction(transactionService, event.target);\n }\n };\n\n var eventName = 'click';\n var useCapture = true;\n window.addEventListener(eventName, clickHandler, useCapture);\n return function () {\n window.removeEventListener(eventName, clickHandler, useCapture);\n };\n}\n\nfunction createUserInteractionTransaction(transactionService, target) {\n var _getTransactionMetada = getTransactionMetadata(target),\n transactionName = _getTransactionMetada.transactionName,\n context = _getTransactionMetada.context;\n\n var tr = transactionService.startTransaction(\"Click - \" + transactionName, USER_INTERACTION, {\n managed: true,\n canReuse: true,\n reuseThreshold: 300\n });\n\n if (tr && context) {\n tr.addContext(context);\n }\n}\n\nfunction getTransactionMetadata(target) {\n var metadata = {\n transactionName: null,\n context: null\n };\n metadata.transactionName = buildTransactionName(target);\n var classes = target.getAttribute('class');\n\n if (classes) {\n metadata.context = {\n custom: {\n classes: classes\n }\n };\n }\n\n return metadata;\n}\n\nfunction buildTransactionName(target) {\n var dtName = findCustomTransactionName(target);\n\n if (dtName) {\n return dtName;\n }\n\n var tagName = target.tagName.toLowerCase();\n var name = target.getAttribute('name');\n\n if (!!name) {\n return tagName + \"[\\\"\" + name + \"\\\"]\";\n }\n\n return tagName;\n}\n\nfunction findCustomTransactionName(target) {\n var trCustomNameAttribute = 'data-transaction-name';\n var fallbackName = target.getAttribute(trCustomNameAttribute);\n\n if (target.closest) {\n var element = target.closest(INTERACTIVE_SELECTOR);\n return element ? element.getAttribute(trCustomNameAttribute) : fallbackName;\n }\n\n return fallbackName;\n}","/**\n * MIT License\n *\n * Copyright (c) 2017-present, Elasticsearch BV\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\nimport {\n getInstrumentationFlags,\n PAGE_LOAD_DELAY,\n PAGE_LOAD,\n ERROR,\n CONFIG_SERVICE,\n LOGGING_SERVICE,\n TRANSACTION_SERVICE,\n PERFORMANCE_MONITORING,\n ERROR_LOGGING,\n APM_SERVER,\n EVENT_TARGET,\n CLICK,\n observePageVisibility,\n observePageClicks,\n observeUserInteractions\n} from '@elastic/apm-rum-core'\n\nexport default class ApmBase {\n constructor(serviceFactory, disable) {\n this._disable = disable\n this.serviceFactory = serviceFactory\n this._initialized = false\n }\n\n isEnabled() {\n return !this._disable\n }\n\n isActive() {\n const configService = this.serviceFactory.getService(CONFIG_SERVICE)\n return this.isEnabled() && this._initialized && configService.get('active')\n }\n\n init(config) {\n if (this.isEnabled() && !this._initialized) {\n this._initialized = true\n const [\n configService,\n loggingService,\n transactionService\n ] = this.serviceFactory.getService([\n CONFIG_SERVICE,\n LOGGING_SERVICE,\n TRANSACTION_SERVICE\n ])\n /**\n * Set Agent version to be sent as part of metadata to the APM Server\n */\n configService.setVersion('5.16.3')\n this.config(config)\n /**\n * Set level here to account for both active and inactive cases\n */\n const logLevel = configService.get('logLevel')\n loggingService.setLevel(logLevel)\n /**\n * Deactive agent when the active config flag is set to false\n */\n const isConfigActive = configService.get('active')\n if (isConfigActive) {\n this.serviceFactory.init()\n\n const flags = getInstrumentationFlags(\n configService.get('instrument'),\n configService.get('disableInstrumentations')\n )\n\n const performanceMonitoring = this.serviceFactory.getService(\n PERFORMANCE_MONITORING\n )\n performanceMonitoring.init(flags)\n\n if (flags[ERROR]) {\n const errorLogging = this.serviceFactory.getService(ERROR_LOGGING)\n errorLogging.registerListeners()\n }\n\n if (configService.get('session')) {\n let localConfig = configService.getLocalConfig()\n if (localConfig && localConfig.session) {\n configService.setConfig({\n session: localConfig.session\n })\n }\n }\n\n const sendPageLoad = () =>\n flags[PAGE_LOAD] && this._sendPageLoadMetrics()\n\n if (configService.get('centralConfig')) {\n /**\n * Waiting for the remote config before sending the page load transaction\n */\n this.fetchCentralConfig().then(sendPageLoad)\n } else {\n sendPageLoad()\n }\n\n observePageVisibility(configService, transactionService)\n if (flags[EVENT_TARGET] && flags[CLICK]) {\n observePageClicks(transactionService)\n }\n observeUserInteractions()\n } else {\n this._disable = true\n loggingService.warn('RUM agent is inactive')\n }\n }\n return this\n }\n\n /**\n * `fetchCentralConfig` returns a promise that will always resolve\n * if the internal config fetch fails the the promise resolves to `undefined` otherwise\n * it resolves to the fetched config.\n */\n fetchCentralConfig() {\n const [\n apmServer,\n loggingService,\n configService\n ] = this.serviceFactory.getService([\n APM_SERVER,\n LOGGING_SERVICE,\n CONFIG_SERVICE\n ])\n\n return apmServer\n .fetchConfig(\n configService.get('serviceName'),\n configService.get('environment')\n )\n .then(config => {\n var transactionSampleRate = config['transaction_sample_rate']\n if (transactionSampleRate) {\n transactionSampleRate = Number(transactionSampleRate)\n const config = { transactionSampleRate }\n const { invalid } = configService.validate(config)\n if (invalid.length === 0) {\n configService.setConfig(config)\n } else {\n const { key, value, allowed } = invalid[0]\n loggingService.warn(\n `invalid value \"${value}\" for ${key}. Allowed: ${allowed}.`\n )\n }\n }\n return config\n })\n .catch(error => {\n loggingService.warn('failed fetching config:', error)\n })\n }\n\n _sendPageLoadMetrics() {\n /**\n * Name of the transaction is set in transaction service to\n * avoid duplicating the logic at multiple places\n */\n const tr = this.startTransaction(undefined, PAGE_LOAD, {\n managed: true,\n canReuse: true\n })\n\n if (!tr) {\n return\n }\n\n tr.addTask(PAGE_LOAD)\n const sendPageLoadMetrics = () => {\n // The reasons of this timeout are:\n // 1. to make sure PerformanceTiming.loadEventEnd has a value.\n // 2. to make sure the agent intercepts all the LCP entries triggered by the browser (adding a delay in the timeout).\n // The browser might need more time after the pageload event to render other elements (e.g. images).\n // That's important because a LCP is only triggered when the related element is completely rendered.\n // https://w3c.github.io/largest-contentful-paint/#sec-add-lcp-entry\n setTimeout(() => tr.removeTask(PAGE_LOAD), PAGE_LOAD_DELAY)\n }\n\n if (document.readyState === 'complete') {\n sendPageLoadMetrics()\n } else {\n window.addEventListener('load', sendPageLoadMetrics)\n }\n }\n\n observe(name, fn) {\n const configService = this.serviceFactory.getService(CONFIG_SERVICE)\n configService.events.observe(name, fn)\n }\n\n /**\n * When the required config keys are invalid, the agent is deactivated with\n * logging error to the console\n *\n * validation error format\n * {\n * missing: [ 'key1', 'key2'],\n * invalid: [{\n * key: 'a',\n * value: 'abcd',\n * allowed: 'string'\n * }],\n * unknown: ['key3', 'key4']\n * }\n */\n config(config) {\n const [configService, loggingService] = this.serviceFactory.getService([\n CONFIG_SERVICE,\n LOGGING_SERVICE\n ])\n const { missing, invalid, unknown } = configService.validate(config)\n if (unknown.length > 0) {\n const message =\n 'Unknown config options are specified for RUM agent: ' +\n unknown.join(', ')\n loggingService.warn(message)\n }\n\n if (missing.length === 0 && invalid.length === 0) {\n configService.setConfig(config)\n } else {\n const separator = ', '\n let message = \"RUM agent isn't correctly configured. \"\n\n if (missing.length > 0) {\n message += missing.join(separator) + ' is missing'\n if (invalid.length > 0) {\n message += separator\n }\n }\n\n invalid.forEach(({ key, value, allowed }, index) => {\n message +=\n `${key} \"${value}\" contains invalid characters! (allowed: ${allowed})` +\n (index !== invalid.length - 1 ? separator : '')\n })\n loggingService.error(message)\n configService.setConfig({ active: false })\n }\n }\n\n setUserContext(userContext) {\n var configService = this.serviceFactory.getService(CONFIG_SERVICE)\n configService.setUserContext(userContext)\n }\n\n setCustomContext(customContext) {\n var configService = this.serviceFactory.getService(CONFIG_SERVICE)\n configService.setCustomContext(customContext)\n }\n\n addLabels(labels) {\n var configService = this.serviceFactory.getService(CONFIG_SERVICE)\n configService.addLabels(labels)\n }\n\n // Should call this method before 'load' event on window is fired\n setInitialPageLoadName(name) {\n const configService = this.serviceFactory.getService(CONFIG_SERVICE)\n configService.setConfig({\n pageLoadTransactionName: name\n })\n }\n\n startTransaction(name, type, options) {\n if (this.isEnabled()) {\n var transactionService = this.serviceFactory.getService(\n TRANSACTION_SERVICE\n )\n return transactionService.startTransaction(name, type, options)\n }\n }\n\n startSpan(name, type, options) {\n if (this.isEnabled()) {\n var transactionService = this.serviceFactory.getService(\n TRANSACTION_SERVICE\n )\n return transactionService.startSpan(name, type, options)\n }\n }\n\n getCurrentTransaction() {\n if (this.isEnabled()) {\n var transactionService = this.serviceFactory.getService(\n TRANSACTION_SERVICE\n )\n return transactionService.getCurrentTransaction()\n }\n }\n\n captureError(error) {\n if (this.isEnabled()) {\n var errorLogging = this.serviceFactory.getService(ERROR_LOGGING)\n return errorLogging.logError(error)\n }\n }\n\n addFilter(fn) {\n var configService = this.serviceFactory.getService(CONFIG_SERVICE)\n configService.addFilter(fn)\n }\n}\n","import { XMLHTTPREQUEST, FETCH, HISTORY, PAGE_LOAD, ERROR, EVENT_TARGET, CLICK } from './constants';\nexport function getInstrumentationFlags(instrument, disabledInstrumentations) {\n var _flags;\n\n var flags = (_flags = {}, _flags[XMLHTTPREQUEST] = false, _flags[FETCH] = false, _flags[HISTORY] = false, _flags[PAGE_LOAD] = false, _flags[ERROR] = false, _flags[EVENT_TARGET] = false, _flags[CLICK] = false, _flags);\n\n if (!instrument) {\n return flags;\n }\n\n Object.keys(flags).forEach(function (key) {\n if (disabledInstrumentations.indexOf(key) === -1) {\n flags[key] = true;\n }\n });\n return flags;\n}","/**\n * MIT License\n *\n * Copyright (c) 2017-present, Elasticsearch BV\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\nimport {\n createServiceFactory,\n bootstrap,\n isBrowser\n} from '@elastic/apm-rum-core'\nimport ApmBase from './apm-base'\n\n/**\n * Use a single instance of ApmBase across all instance of the agent\n * including the instances used in framework specific integrations\n */\nfunction getApmBase() {\n if (isBrowser && window.elasticApm) {\n return window.elasticApm\n }\n const enabled = bootstrap()\n const serviceFactory = createServiceFactory()\n const apmBase = new ApmBase(serviceFactory, !enabled)\n\n if (isBrowser) {\n window.elasticApm = apmBase\n }\n\n return apmBase\n}\n\nconst apmBase = getApmBase()\n\nconst init = apmBase.init.bind(apmBase)\n\nexport default init\nexport { init, apmBase, ApmBase, apmBase as apm }\n"],"sourceRoot":""} \ No newline at end of file diff --git a/bun.lock b/bun.lock new file mode 100644 index 000000000..11467f511 --- /dev/null +++ b/bun.lock @@ -0,0 +1,1646 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "devDependencies": { + "@core-js/builder": "4.0.0-alpha.0", + "@core-js/compat": "4.0.0-alpha.0", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "^8.57.1", + "@pnpm/types": "^1000.1.1", + "@std/cli": "npm:@jsr/std__cli@^1.0.12", + "@tsconfig/node18": "^18.2.4", + "@tsconfig/strictest": "^2.0.5", + "@types/eslint__eslintrc": "^2.1.2", + "@types/eslint__js": "^8.42.3", + "@types/node": "^18.19.74", + "@typescript-eslint/eslint-plugin": "^8.22.0", + "@typescript-eslint/parser": "^8.22.0", + "browserslist": "4.24.4", + "browserslist-to-esbuild": "^2.1.1", + "caniuse-lite": "1.0.30001690", + "core-js-builder": "3.40.0", + "core-js-compat": "3.40.0", + "dax-sh": "^0.42.0", + "doiuse": "^6.0.5", + "electron-to-chromium": "1.5.76", + "esbuild": "^0.24.2", + "eslint": "^8.57.1", + "eslint-formatter-codeframe": "^7.32.1", + "eslint-formatter-table": "^7.32.1", + "eslint-plugin-compat": "^6.0.2", + "eslint-plugin-deprecation": "^3.0.0", + "gzip-size": "^7.0.0", + "postcss": "^8.5.1", + "prettier": "^3.4.2", + "stylelint": "^16.14.1", + "stylelint-config-idiomatic-order": "^10.0.0", + "stylelint-config-standard-scss": "^14.0.0", + "stylelint-no-unsupported-browser-features": "^8.0.4", + "stylelint-prettier": "^5.0.3", + "ts-node": "https://asozial.beer/ts-node-241116.tgz", + "type-fest": "^4.33.0", + "typescript": "5.8.0-beta", + "typescript-eslint": "^8.22.0", + "typescript-eslint-language-service": "^5.0.5", + }, + }, + }, + "packages": { + "@babel/code-frame": ["@babel/code-frame@7.12.11", "", { "dependencies": { "@babel/highlight": "^7.10.4" } }, "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.25.9", "", {}, "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ=="], + + "@babel/highlight": ["@babel/highlight@7.25.9", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw=="], + + "@core-js/builder": ["@core-js/builder@4.0.0-alpha.0", "", { "dependencies": { "@core-js/compat": "4.0.0-alpha.0", "core-js": "4.0.0-alpha.0", "webpack": "^5.89.0" } }, "sha512-IeDwGcY4HKcAXUwvLmziR/oDVWb52ZTnsMSvYtRM0yve1xLKBdupnop8H73HP1vjyS9ugIRjJRlkWF8xUD6Trw=="], + + "@core-js/compat": ["@core-js/compat@4.0.0-alpha.0", "", { "dependencies": { "browserslist": "^4.22.3" } }, "sha512-cuGfF/xkycP8VLia+VtlT9T/pF484TJntKFAVaJW4B3DWqd+C0GD93ou0TpviUTVXEKlfsEzJjHJlSFQ5zG24Q=="], + + "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], + + "@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@3.0.4", "", { "peerDependencies": { "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A=="], + + "@csstools/css-tokenizer": ["@csstools/css-tokenizer@3.0.3", "", {}, "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw=="], + + "@csstools/media-query-list-parser": ["@csstools/media-query-list-parser@4.0.2", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3" } }, "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A=="], + + "@csstools/selector-specificity": ["@csstools/selector-specificity@5.0.0", "", { "peerDependencies": { "postcss-selector-parser": "^7.0.0" } }, "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw=="], + + "@deno/shim-deno": ["@deno/shim-deno@0.19.2", "", { "dependencies": { "@deno/shim-deno-test": "^0.5.0", "which": "^4.0.0" } }, "sha512-q3VTHl44ad8T2Tw2SpeAvghdGOjlnLPDNO2cpOxwMrBE/PVas6geWpbpIgrM+czOCH0yejp0yi8OaTuB+NU40Q=="], + + "@deno/shim-deno-test": ["@deno/shim-deno-test@0.5.0", "", {}, "sha512-4nMhecpGlPi0cSzT67L+Tm+GOJqvuk8gqHBziqcUQOarnuIax1z96/gJHCSIz2Z0zhxE6Rzwb3IZXPtFh51j+w=="], + + "@dual-bundle/import-meta-resolve": ["@dual-bundle/import-meta-resolve@4.1.0", "", {}, "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.24.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.24.2", "", { "os": "android", "cpu": "arm" }, "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.24.2", "", { "os": "android", "cpu": "arm64" }, "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.24.2", "", { "os": "android", "cpu": "x64" }, "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.24.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.24.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.24.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.24.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.24.2", "", { "os": "linux", "cpu": "arm" }, "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.24.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.24.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.24.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.24.2", "", { "os": "linux", "cpu": "none" }, "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.24.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.24.2", "", { "os": "linux", "cpu": "x64" }, "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.24.2", "", { "os": "none", "cpu": "arm64" }, "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.24.2", "", { "os": "none", "cpu": "x64" }, "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.24.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.24.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.24.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.24.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.24.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.24.2", "", { "os": "win32", "cpu": "x64" }, "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.4.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], + + "@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="], + + "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.13.0", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.3", "", {}, "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="], + + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], + + "@jridgewell/source-map": ["@jridgewell/source-map@0.3.6", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + + "@keyv/serialize": ["@keyv/serialize@1.0.2", "", { "dependencies": { "buffer": "^6.0.3" } }, "sha512-+E/LyaAeuABniD/RvUezWVXKpeuvwLEA9//nE9952zBaOdBd2mQ3pPoM8cUe2X6IcMByfuSLzmYqnYshG60+HQ=="], + + "@mdn/browser-compat-data": ["@mdn/browser-compat-data@5.6.35", "", {}, "sha512-ag7tX/vba+g1OVelqrcdUPnao+Fio0YgcIUYs07qoV3escMAqF7sNKSHH8JxXQ0psY3u8l8jqmmGx0vFPtIrtw=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@pnpm/types": ["@pnpm/types@1000.1.1", "", {}, "sha512-5zrv7B+4mW/6iiYS/BrFZWbMqLHjKmaBrMcw+F8LcuMQ7p4SQX4ANoycpr1VIQpn4+xQ0ckyuadfxBttpzicbg=="], + + "@std/cli": ["@jsr/std__cli@1.0.12", "https://npm.jsr.io/~/11/@jsr/std__cli/1.0.12.tgz", {}, "sha512-7wCyE0e26CPhC6rLwGk/+bZ9aoOkXFIJIm6Em658g0l8UrySXQU2uGtqHvXlaaREELZU3cXGuQGKsa/JdqhGHg=="], + + "@tsconfig/node14": ["@tsconfig/node14@14.1.2", "", {}, "sha512-1vncsbfCZ3TBLPxesRYz02Rn7SNJfbLoDVkcZ7F/ixOV6nwxwgdhD1mdPcc5YQ413qBJ8CvMxXMFfJ7oawjo7Q=="], + + "@tsconfig/node16": ["@tsconfig/node16@16.1.3", "", {}, "sha512-9nTOUBn+EMKO6rtSZJk+DcqsfgtlERGT9XPJ5PRj/HNENPCBY1yu/JEj5wT6GLtbCLBO2k46SeXDaY0pjMqypw=="], + + "@tsconfig/node18": ["@tsconfig/node18@18.2.4", "", {}, "sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ=="], + + "@tsconfig/node20": ["@tsconfig/node20@20.1.4", "", {}, "sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg=="], + + "@tsconfig/strictest": ["@tsconfig/strictest@2.0.5", "", {}, "sha512-ec4tjL2Rr0pkZ5hww65c+EEPYwxOi4Ryv+0MtjeaSQRJyq322Q27eOQiFbuNgw2hpL4hB1/W/HBGk3VKS43osg=="], + + "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="], + + "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="], + + "@types/eslint__eslintrc": ["@types/eslint__eslintrc@2.1.2", "", { "dependencies": { "@types/eslint": "*" } }, "sha512-qXvzPFY7Rz05xD8ZApXJ3S8xStQD2Ibzu3EFIF0UMNOAfLY5xUu3H61q0JrHo2OXD6rcFG75yUxNQbkKtFKBSw=="], + + "@types/eslint__js": ["@types/eslint__js@8.42.3", "", { "dependencies": { "@types/eslint": "*" } }, "sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw=="], + + "@types/estree": ["@types/estree@1.0.6", "", {}, "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/minimatch": ["@types/minimatch@3.0.5", "", {}, "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ=="], + + "@types/node": ["@types/node@18.19.74", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.22.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.22.0", "@typescript-eslint/type-utils": "8.22.0", "@typescript-eslint/utils": "8.22.0", "@typescript-eslint/visitor-keys": "8.22.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.0.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.22.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.22.0", "@typescript-eslint/types": "8.22.0", "@typescript-eslint/typescript-estree": "8.22.0", "@typescript-eslint/visitor-keys": "8.22.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.22.0", "", { "dependencies": { "@typescript-eslint/types": "8.22.0", "@typescript-eslint/visitor-keys": "8.22.0" } }, "sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.22.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.22.0", "@typescript-eslint/utils": "8.22.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.22.0", "", {}, "sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.22.0", "", { "dependencies": { "@typescript-eslint/types": "8.22.0", "@typescript-eslint/visitor-keys": "8.22.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.8.0" } }, "sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.22.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.22.0", "@typescript-eslint/types": "8.22.0", "@typescript-eslint/typescript-estree": "8.22.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.22.0", "", { "dependencies": { "@typescript-eslint/types": "8.22.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="], + + "@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="], + + "@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.13.2", "", {}, "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="], + + "@webassemblyjs/helper-buffer": ["@webassemblyjs/helper-buffer@1.14.1", "", {}, "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="], + + "@webassemblyjs/helper-code-frame": ["@webassemblyjs/helper-code-frame@1.9.0", "", { "dependencies": { "@webassemblyjs/wast-printer": "1.9.0" } }, "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA=="], + + "@webassemblyjs/helper-fsm": ["@webassemblyjs/helper-fsm@1.9.0", "", {}, "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw=="], + + "@webassemblyjs/helper-module-context": ["@webassemblyjs/helper-module-context@1.9.0", "", { "dependencies": { "@webassemblyjs/ast": "1.9.0" } }, "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g=="], + + "@webassemblyjs/helper-numbers": ["@webassemblyjs/helper-numbers@1.13.2", "", { "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.13.2", "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA=="], + + "@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.13.2", "", {}, "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="], + + "@webassemblyjs/helper-wasm-section": ["@webassemblyjs/helper-wasm-section@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/wasm-gen": "1.14.1" } }, "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw=="], + + "@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.13.2", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw=="], + + "@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.13.2", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw=="], + + "@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.13.2", "", {}, "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="], + + "@webassemblyjs/wasm-edit": ["@webassemblyjs/wasm-edit@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/helper-wasm-section": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-opt": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1", "@webassemblyjs/wast-printer": "1.14.1" } }, "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ=="], + + "@webassemblyjs/wasm-gen": ["@webassemblyjs/wasm-gen@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg=="], + + "@webassemblyjs/wasm-opt": ["@webassemblyjs/wasm-opt@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-buffer": "1.14.1", "@webassemblyjs/wasm-gen": "1.14.1", "@webassemblyjs/wasm-parser": "1.14.1" } }, "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw=="], + + "@webassemblyjs/wasm-parser": ["@webassemblyjs/wasm-parser@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@webassemblyjs/helper-api-error": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2", "@webassemblyjs/ieee754": "1.13.2", "@webassemblyjs/leb128": "1.13.2", "@webassemblyjs/utf8": "1.13.2" } }, "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ=="], + + "@webassemblyjs/wast-parser": ["@webassemblyjs/wast-parser@1.9.0", "", { "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/floating-point-hex-parser": "1.9.0", "@webassemblyjs/helper-api-error": "1.9.0", "@webassemblyjs/helper-code-frame": "1.9.0", "@webassemblyjs/helper-fsm": "1.9.0", "@xtuc/long": "4.2.2" } }, "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw=="], + + "@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw=="], + + "@xtuc/ieee754": ["@xtuc/ieee754@1.2.0", "", {}, "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="], + + "@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="], + + "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ajv-errors": ["ajv-errors@1.0.1", "", { "peerDependencies": { "ajv": ">=5.0.0" } }, "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ=="], + + "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="], + + "ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "aproba": ["aproba@1.2.0", "", {}, "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="], + + "arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "arr-diff": ["arr-diff@4.0.0", "", {}, "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA=="], + + "arr-flatten": ["arr-flatten@1.1.0", "", {}, "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="], + + "arr-union": ["arr-union@3.1.0", "", {}, "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q=="], + + "array-differ": ["array-differ@3.0.0", "", {}, "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg=="], + + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + + "array-unique": ["array-unique@0.3.2", "", {}, "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ=="], + + "arrify": ["arrify@2.0.1", "", {}, "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug=="], + + "asn1.js": ["asn1.js@4.10.1", "", { "dependencies": { "bn.js": "^4.0.0", "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw=="], + + "assert": ["assert@1.5.1", "", { "dependencies": { "object.assign": "^4.1.4", "util": "^0.10.4" } }, "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A=="], + + "assign-symbols": ["assign-symbols@1.0.0", "", {}, "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw=="], + + "ast-metadata-inferer": ["ast-metadata-inferer@0.8.1", "", { "dependencies": { "@mdn/browser-compat-data": "^5.6.19" } }, "sha512-ht3Dm6Zr7SXv6t1Ra6gFo0+kLDglHGrEbYihTkcycrbHw7WCcuhBzPlJYHEsIpycaUwzsJHje+vUcxXUX4ztTA=="], + + "astral-regex": ["astral-regex@2.0.0", "", {}, "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ=="], + + "async-each": ["async-each@1.0.6", "", {}, "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg=="], + + "atob": ["atob@2.1.2", "", { "bin": { "atob": "bin/atob.js" } }, "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="], + + "balanced-match": ["balanced-match@2.0.0", "", {}, "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA=="], + + "base": ["base@0.11.2", "", { "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", "component-emitter": "^1.2.1", "define-property": "^1.0.0", "isobject": "^3.0.1", "mixin-deep": "^1.2.0", "pascalcase": "^0.1.1" } }, "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "big.js": ["big.js@5.2.2", "", {}, "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ=="], + + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], + + "bn.js": ["bn.js@5.2.1", "", {}, "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="], + + "brace-expansion": ["brace-expansion@1.1.11", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "brorand": ["brorand@1.1.0", "", {}, "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w=="], + + "browserify-aes": ["browserify-aes@1.2.0", "", { "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.3", "inherits": "^2.0.1", "safe-buffer": "^5.0.1" } }, "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA=="], + + "browserify-cipher": ["browserify-cipher@1.0.1", "", { "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", "evp_bytestokey": "^1.0.0" } }, "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w=="], + + "browserify-des": ["browserify-des@1.0.2", "", { "dependencies": { "cipher-base": "^1.0.1", "des.js": "^1.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A=="], + + "browserify-rsa": ["browserify-rsa@4.1.1", "", { "dependencies": { "bn.js": "^5.2.1", "randombytes": "^2.1.0", "safe-buffer": "^5.2.1" } }, "sha512-YBjSAiTqM04ZVei6sXighu679a3SqWORA3qZTEqZImnlkDIFtKc6pNutpjyZ8RJTjQtuYfeetkxM11GwoYXMIQ=="], + + "browserify-sign": ["browserify-sign@4.2.3", "", { "dependencies": { "bn.js": "^5.2.1", "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "elliptic": "^6.5.5", "hash-base": "~3.0", "inherits": "^2.0.4", "parse-asn1": "^5.1.7", "readable-stream": "^2.3.8", "safe-buffer": "^5.2.1" } }, "sha512-JWCZW6SKhfhjJxO8Tyiiy+XYB7cqd2S5/+WeYHsKdNKFlCBhKbblba1A/HN/90YwtxKc8tCErjffZl++UNmGiw=="], + + "browserify-zlib": ["browserify-zlib@0.2.0", "", { "dependencies": { "pako": "~1.0.5" } }, "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA=="], + + "browserslist": ["browserslist@4.24.4", "", { "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" } }, "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A=="], + + "browserslist-to-esbuild": ["browserslist-to-esbuild@2.1.1", "", { "dependencies": { "meow": "^13.0.0" }, "peerDependencies": { "browserslist": "*" }, "bin": { "browserslist-to-esbuild": "cli/index.js" } }, "sha512-KN+mty6C3e9AN8Z5dI1xeN15ExcRNeISoC3g7V0Kax/MMF9MSoYA2G7lkTTcVUFntiEjkpI0HNgqJC1NjdyNUw=="], + + "buffer": ["buffer@4.9.2", "", { "dependencies": { "base64-js": "^1.0.2", "ieee754": "^1.1.4", "isarray": "^1.0.0" } }, "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg=="], + + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + + "buffer-xor": ["buffer-xor@1.0.3", "", {}, "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ=="], + + "builtin-status-codes": ["builtin-status-codes@3.0.0", "", {}, "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ=="], + + "cacache": ["cacache@12.0.4", "", { "dependencies": { "bluebird": "^3.5.5", "chownr": "^1.1.1", "figgy-pudding": "^3.5.1", "glob": "^7.1.4", "graceful-fs": "^4.1.15", "infer-owner": "^1.0.3", "lru-cache": "^5.1.1", "mississippi": "^3.0.0", "mkdirp": "^0.5.1", "move-concurrently": "^1.0.1", "promise-inflight": "^1.0.1", "rimraf": "^2.6.3", "ssri": "^6.0.1", "unique-filename": "^1.1.1", "y18n": "^4.0.0" } }, "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ=="], + + "cache-base": ["cache-base@1.0.1", "", { "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", "get-value": "^2.0.6", "has-value": "^1.0.0", "isobject": "^3.0.1", "set-value": "^2.0.0", "to-object-path": "^0.3.0", "union-value": "^1.0.0", "unset-value": "^1.0.0" } }, "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ=="], + + "cacheable": ["cacheable@1.8.8", "", { "dependencies": { "hookified": "^1.7.0", "keyv": "^5.2.3" } }, "sha512-OE1/jlarWxROUIpd0qGBSKFLkNsotY8pt4GeiVErUYh/NUeTNrT+SBksUgllQv4m6a0W/VZsLuiHb88maavqEw=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g=="], + + "call-bound": ["call-bound@1.0.3", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "get-intrinsic": "^1.2.6" } }, "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001690", "", {}, "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], + + "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="], + + "cipher-base": ["cipher-base@1.0.6", "", { "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1" } }, "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw=="], + + "class-utils": ["class-utils@0.3.6", "", { "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", "isobject": "^3.0.0", "static-extend": "^0.1.1" } }, "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "collection-visit": ["collection-visit@1.0.0", "", { "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" } }, "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "colord": ["colord@2.9.3", "", {}, "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="], + + "commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "commondir": ["commondir@1.0.1", "", {}, "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="], + + "component-emitter": ["component-emitter@1.3.1", "", {}, "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "concat-stream": ["concat-stream@1.6.2", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="], + + "console-browserify": ["console-browserify@1.2.0", "", {}, "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA=="], + + "constants-browserify": ["constants-browserify@1.0.0", "", {}, "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ=="], + + "copy-concurrently": ["copy-concurrently@1.0.5", "", { "dependencies": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", "iferr": "^0.1.5", "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.0" } }, "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A=="], + + "copy-descriptor": ["copy-descriptor@0.1.1", "", {}, "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw=="], + + "core-js": ["core-js@4.0.0-alpha.0", "", {}, "sha512-5VfbzstCfaRX4LNrX94uP6AQmbx3sX757+xeGZU2J8+VMSfu5INfhxCFpy8fIV6B54WadTAFOUa2XgyvOEQPSg=="], + + "core-js-builder": ["core-js-builder@3.40.0", "", { "dependencies": { "core-js": "3.40.0", "core-js-compat": "3.40.0", "mkdirp": ">=0.5.6 <1", "webpack": ">=4.47.0 <5" } }, "sha512-gmrK3+De6/uTa/nfh+VMRolS9+lOq8FPxGEGgYeKDMtDTBuWjJYQ3GcG6HF16lwaLLwOOjKZ836PbMgqWzcxNw=="], + + "core-js-compat": ["core-js-compat@3.40.0", "", { "dependencies": { "browserslist": "^4.24.3" } }, "sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ=="], + + "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], + + "cosmiconfig": ["cosmiconfig@9.0.0", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg=="], + + "create-ecdh": ["create-ecdh@4.0.4", "", { "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" } }, "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A=="], + + "create-hash": ["create-hash@1.2.0", "", { "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", "md5.js": "^1.3.4", "ripemd160": "^2.0.1", "sha.js": "^2.4.0" } }, "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg=="], + + "create-hmac": ["create-hmac@1.1.7", "", { "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", "inherits": "^2.0.1", "ripemd160": "^2.0.0", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "crypto-browserify": ["crypto-browserify@3.12.1", "", { "dependencies": { "browserify-cipher": "^1.0.1", "browserify-sign": "^4.2.3", "create-ecdh": "^4.0.4", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", "diffie-hellman": "^5.0.3", "hash-base": "~3.0.4", "inherits": "^2.0.4", "pbkdf2": "^3.1.2", "public-encrypt": "^4.0.3", "randombytes": "^2.1.0", "randomfill": "^1.0.4" } }, "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ=="], + + "css-functions-list": ["css-functions-list@3.2.3", "", {}, "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA=="], + + "css-tokenize": ["css-tokenize@1.0.1", "", { "dependencies": { "inherits": "^2.0.1", "readable-stream": "^1.0.33" } }, "sha512-gLmmbJdwH9HLY4bcA17lnZ8GgPwEXRbvxBJGHnkiB6gLhRpTzjkjtMIvz7YORGW/Ptv2oMk8b5g+u7mRD6Dd7A=="], + + "css-tree": ["css-tree@3.1.0", "", { "dependencies": { "mdn-data": "2.12.2", "source-map-js": "^1.0.1" } }, "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w=="], + + "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "cyclist": ["cyclist@1.0.2", "", {}, "sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA=="], + + "dax-sh": ["dax-sh@0.42.0", "", { "dependencies": { "@deno/shim-deno": "~0.19.0", "undici-types": "^5.26" } }, "sha512-VxTiRJPYJWRw7XIP67w+iFx0DETNaYYYacWBm8c1zibHsliPXgzVAw7NiGTRum2+KIAEA1MBkiP1308NQoIgUA=="], + + "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA=="], + + "decode-uri-component": ["decode-uri-component@0.2.2", "", {}, "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "define-property": ["define-property@2.0.2", "", { "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" } }, "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ=="], + + "des.js": ["des.js@1.1.0", "", { "dependencies": { "inherits": "^2.0.1", "minimalistic-assert": "^1.0.0" } }, "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg=="], + + "diff": ["diff@4.0.2", "", {}, "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="], + + "diffie-hellman": ["diffie-hellman@5.0.3", "", { "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", "randombytes": "^2.0.0" } }, "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], + + "doiuse": ["doiuse@6.0.5", "", { "dependencies": { "browserslist": "^4.24.0", "caniuse-lite": "^1.0.30001669", "css-tokenize": "^1.0.1", "duplexify": "^4.1.3", "multimatch": "^5.0.0", "postcss": "^8.4.47", "source-map": "^0.7.4", "yargs": "^17.7.2" }, "bin": { "doiuse": "bin/cli.js" } }, "sha512-ljuf9ndGqKST0GlPAYyCg04hbQAeR1xIIWVDjQaDDkoTY/Y1Vb+8FNoy6NuVuJIEEKe/nKUH8NRWjG7JJxZ9Eg=="], + + "domain-browser": ["domain-browser@1.2.0", "", {}, "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], + + "duplexify": ["duplexify@4.1.3", "", { "dependencies": { "end-of-stream": "^1.4.1", "inherits": "^2.0.3", "readable-stream": "^3.1.1", "stream-shift": "^1.0.2" } }, "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.76", "", {}, "sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ=="], + + "elliptic": ["elliptic@6.6.1", "", { "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", "hash.js": "^1.0.0", "hmac-drbg": "^1.0.1", "inherits": "^2.0.4", "minimalistic-assert": "^1.0.1", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "emojis-list": ["emojis-list@3.0.0", "", {}, "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q=="], + + "end-of-stream": ["end-of-stream@1.4.4", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="], + + "enhanced-resolve": ["enhanced-resolve@5.18.0", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ=="], + + "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="], + + "errno": ["errno@0.1.8", "", { "dependencies": { "prr": "~1.0.1" }, "bin": { "errno": "cli.js" } }, "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A=="], + + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-module-lexer": ["es-module-lexer@1.6.0", "", {}, "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "esbuild": ["esbuild@0.24.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.24.2", "@esbuild/android-arm": "0.24.2", "@esbuild/android-arm64": "0.24.2", "@esbuild/android-x64": "0.24.2", "@esbuild/darwin-arm64": "0.24.2", "@esbuild/darwin-x64": "0.24.2", "@esbuild/freebsd-arm64": "0.24.2", "@esbuild/freebsd-x64": "0.24.2", "@esbuild/linux-arm": "0.24.2", "@esbuild/linux-arm64": "0.24.2", "@esbuild/linux-ia32": "0.24.2", "@esbuild/linux-loong64": "0.24.2", "@esbuild/linux-mips64el": "0.24.2", "@esbuild/linux-ppc64": "0.24.2", "@esbuild/linux-riscv64": "0.24.2", "@esbuild/linux-s390x": "0.24.2", "@esbuild/linux-x64": "0.24.2", "@esbuild/netbsd-arm64": "0.24.2", "@esbuild/netbsd-x64": "0.24.2", "@esbuild/openbsd-arm64": "0.24.2", "@esbuild/openbsd-x64": "0.24.2", "@esbuild/sunos-x64": "0.24.2", "@esbuild/win32-arm64": "0.24.2", "@esbuild/win32-ia32": "0.24.2", "@esbuild/win32-x64": "0.24.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="], + + "eslint-formatter-codeframe": ["eslint-formatter-codeframe@7.32.1", "", { "dependencies": { "@babel/code-frame": "7.12.11", "chalk": "^4.0.0" } }, "sha512-DK/3Q3+zVKq/7PdSYiCxPrsDF8H/TRMK5n8Hziwr4IMkMy+XiKSwbpj25AdajS63I/B61Snetq4uVvX9fOLyAg=="], + + "eslint-formatter-table": ["eslint-formatter-table@7.32.1", "", { "dependencies": { "chalk": "^4.0.0", "table": "^6.0.9" } }, "sha512-JYC49hAJMNjLfbgXVeQHU6ngP0M8ThgXCHLGrncYB+R/RHEhRPnLxHjolTJdb7RdQ8zcCt2F7Mrt6Ou3PwMOHw=="], + + "eslint-plugin-compat": ["eslint-plugin-compat@6.0.2", "", { "dependencies": { "@mdn/browser-compat-data": "^5.5.35", "ast-metadata-inferer": "^0.8.1", "browserslist": "^4.24.2", "caniuse-lite": "^1.0.30001687", "find-up": "^5.0.0", "globals": "^15.7.0", "lodash.memoize": "^4.1.2", "semver": "^7.6.2" }, "peerDependencies": { "eslint": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-1ME+YfJjmOz1blH0nPZpHgjMGK4kjgEeoYqGCqoBPQ/mGu/dJzdoP0f1C8H2jcWZjzhZjAMccbM/VdXhPORIfA=="], + + "eslint-plugin-deprecation": ["eslint-plugin-deprecation@3.0.0", "", { "dependencies": { "@typescript-eslint/utils": "^7.0.0", "ts-api-utils": "^1.3.0", "tslib": "^2.3.1" }, "peerDependencies": { "eslint": "^8.0.0", "typescript": "^4.2.4 || ^5.0.0" } }, "sha512-JuVLdNg/uf0Adjg2tpTyYoYaMbwQNn/c78P1HcccokvhtRphgnRjZDKmhlxbxYptppex03zO76f97DD/yQHv7A=="], + + "eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="], + + "evp_bytestokey": ["evp_bytestokey@1.0.3", "", { "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA=="], + + "expand-brackets": ["expand-brackets@2.1.4", "", { "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "posix-character-classes": "^0.1.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" } }, "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA=="], + + "extend-shallow": ["extend-shallow@3.0.2", "", { "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" } }, "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q=="], + + "extglob": ["extglob@2.0.4", "", { "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", "expand-brackets": "^2.1.4", "extend-shallow": "^2.0.1", "fragment-cache": "^0.2.1", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" } }, "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="], + + "fastest-levenshtein": ["fastest-levenshtein@1.0.16", "", {}, "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg=="], + + "fastq": ["fastq@1.19.0", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA=="], + + "figgy-pudding": ["figgy-pudding@3.5.2", "", {}, "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw=="], + + "file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], + + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-cache-dir": ["find-cache-dir@2.1.0", "", { "dependencies": { "commondir": "^1.0.1", "make-dir": "^2.0.0", "pkg-dir": "^3.0.0" } }, "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], + + "flatted": ["flatted@3.3.2", "", {}, "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA=="], + + "flush-write-stream": ["flush-write-stream@1.1.1", "", { "dependencies": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" } }, "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w=="], + + "for-in": ["for-in@1.0.2", "", {}, "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ=="], + + "fragment-cache": ["fragment-cache@0.2.1", "", { "dependencies": { "map-cache": "^0.2.2" } }, "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA=="], + + "from2": ["from2@2.3.0", "", { "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" } }, "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g=="], + + "fs-write-stream-atomic": ["fs-write-stream-atomic@1.0.10", "", { "dependencies": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", "imurmurhash": "^0.1.4", "readable-stream": "1 || 2" } }, "sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.2.7", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "function-bind": "^1.1.2", "get-proto": "^1.0.0", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-value": ["get-value@2.0.6", "", {}, "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], + + "global-modules": ["global-modules@2.0.0", "", { "dependencies": { "global-prefix": "^3.0.0" } }, "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A=="], + + "global-prefix": ["global-prefix@3.0.0", "", { "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", "which": "^1.3.1" } }, "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg=="], + + "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], + + "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "globjoin": ["globjoin@0.1.4", "", {}, "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "gzip-size": ["gzip-size@7.0.0", "", { "dependencies": { "duplexer": "^0.1.2" } }, "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-value": ["has-value@1.0.0", "", { "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", "isobject": "^3.0.0" } }, "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw=="], + + "has-values": ["has-values@1.0.0", "", { "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" } }, "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ=="], + + "hash-base": ["hash-base@3.0.5", "", { "dependencies": { "inherits": "^2.0.4", "safe-buffer": "^5.2.1" } }, "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg=="], + + "hash.js": ["hash.js@1.1.7", "", { "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "hmac-drbg": ["hmac-drbg@1.0.1", "", { "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", "minimalistic-crypto-utils": "^1.0.1" } }, "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg=="], + + "hookified": ["hookified@1.7.0", "", {}, "sha512-XQdMjqC1AyeOzfs+17cnIk7Wdfu1hh2JtcyNfBf5u9jHrT3iZUlGHxLTntFBuk5lwkqJ6l3+daeQdHK5yByHVA=="], + + "html-tags": ["html-tags@3.3.1", "", {}, "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ=="], + + "https-browserify": ["https-browserify@1.0.0", "", {}, "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "iferr": ["iferr@0.1.5", "", {}, "sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "import-fresh": ["import-fresh@3.3.0", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "infer-owner": ["infer-owner@1.0.4", "", {}, "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + + "is-accessor-descriptor": ["is-accessor-descriptor@1.0.1", "", { "dependencies": { "hasown": "^2.0.0" } }, "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA=="], + + "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="], + + "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-buffer": ["is-buffer@1.1.6", "", {}, "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="], + + "is-data-descriptor": ["is-data-descriptor@1.0.1", "", { "dependencies": { "hasown": "^2.0.0" } }, "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw=="], + + "is-descriptor": ["is-descriptor@1.0.3", "", { "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" } }, "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw=="], + + "is-extendable": ["is-extendable@1.0.1", "", { "dependencies": { "is-plain-object": "^2.0.4" } }, "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@3.0.0", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg=="], + + "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], + + "is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="], + + "is-windows": ["is-windows@1.0.2", "", {}, "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="], + + "is-wsl": ["is-wsl@1.1.0", "", {}, "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw=="], + + "isarray": ["isarray@0.0.1", "", {}, "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="], + + "isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + + "isobject": ["isobject@3.0.1", "", {}, "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg=="], + + "jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="], + + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-better-errors": ["json-parse-better-errors@1.0.2", "", {}, "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], + + "known-css-properties": ["known-css-properties@0.35.0", "", {}, "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="], + + "loader-runner": ["loader-runner@4.3.0", "", {}, "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg=="], + + "loader-utils": ["loader-utils@1.4.2", "", { "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", "json5": "^1.0.1" } }, "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "lodash.truncate": ["lodash.truncate@4.4.2", "", {}, "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw=="], + + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "make-dir": ["make-dir@2.1.0", "", { "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" } }, "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA=="], + + "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], + + "map-cache": ["map-cache@0.2.2", "", {}, "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg=="], + + "map-visit": ["map-visit@1.0.0", "", { "dependencies": { "object-visit": "^1.0.0" } }, "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "mathml-tag-names": ["mathml-tag-names@2.1.3", "", {}, "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg=="], + + "md5.js": ["md5.js@1.3.5", "", { "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg=="], + + "mdn-data": ["mdn-data@2.12.2", "", {}, "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA=="], + + "memory-fs": ["memory-fs@0.4.1", "", { "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" } }, "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ=="], + + "meow": ["meow@13.2.0", "", {}, "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA=="], + + "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "miller-rabin": ["miller-rabin@4.0.1", "", { "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" }, "bin": { "miller-rabin": "bin/miller-rabin" } }, "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], + + "minimalistic-crypto-utils": ["minimalistic-crypto-utils@1.0.1", "", {}, "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], + + "mississippi": ["mississippi@3.0.0", "", { "dependencies": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", "end-of-stream": "^1.1.0", "flush-write-stream": "^1.0.0", "from2": "^2.1.0", "parallel-transform": "^1.1.0", "pump": "^3.0.0", "pumpify": "^1.3.3", "stream-each": "^1.1.0", "through2": "^2.0.0" } }, "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA=="], + + "mixin-deep": ["mixin-deep@1.3.2", "", { "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" } }, "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA=="], + + "mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + + "move-concurrently": ["move-concurrently@1.0.1", "", { "dependencies": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", "fs-write-stream-atomic": "^1.0.8", "mkdirp": "^0.5.1", "rimraf": "^2.5.4", "run-queue": "^1.0.3" } }, "sha512-hdrFxZOycD/g6A6SoI2bB5NA/5NEqD0569+S47WZhPvm46sD50ZHdYaFmnua5lndde9rCHGjmfK7Z8BuCt/PcQ=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "multimatch": ["multimatch@5.0.0", "", { "dependencies": { "@types/minimatch": "^3.0.3", "array-differ": "^3.0.0", "array-union": "^2.1.0", "arrify": "^2.0.1", "minimatch": "^3.0.4" } }, "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA=="], + + "nan": ["nan@2.22.0", "", {}, "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw=="], + + "nanoid": ["nanoid@3.3.8", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="], + + "nanomatch": ["nanomatch@1.2.13", "", { "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "fragment-cache": "^0.2.1", "is-windows": "^1.0.2", "kind-of": "^6.0.2", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" } }, "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="], + + "node-libs-browser": ["node-libs-browser@2.2.1", "", { "dependencies": { "assert": "^1.1.1", "browserify-zlib": "^0.2.0", "buffer": "^4.3.0", "console-browserify": "^1.1.0", "constants-browserify": "^1.0.0", "crypto-browserify": "^3.11.0", "domain-browser": "^1.1.1", "events": "^3.0.0", "https-browserify": "^1.0.0", "os-browserify": "^0.3.0", "path-browserify": "0.0.1", "process": "^0.11.10", "punycode": "^1.2.4", "querystring-es3": "^0.2.0", "readable-stream": "^2.3.3", "stream-browserify": "^2.0.1", "stream-http": "^2.7.2", "string_decoder": "^1.0.0", "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", "url": "^0.11.0", "util": "^0.11.0", "vm-browserify": "^1.0.1" } }, "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q=="], + + "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + + "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "object-copy": ["object-copy@0.1.0", "", { "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", "kind-of": "^3.0.3" } }, "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ=="], + + "object-inspect": ["object-inspect@1.13.3", "", {}, "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object-visit": ["object-visit@1.0.1", "", { "dependencies": { "isobject": "^3.0.0" } }, "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "object.pick": ["object.pick@1.3.0", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "os-browserify": ["os-browserify@0.3.0", "", {}, "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="], + + "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], + + "parallel-transform": ["parallel-transform@1.2.0", "", { "dependencies": { "cyclist": "^1.0.1", "inherits": "^2.0.3", "readable-stream": "^2.1.5" } }, "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-asn1": ["parse-asn1@5.1.7", "", { "dependencies": { "asn1.js": "^4.10.1", "browserify-aes": "^1.2.0", "evp_bytestokey": "^1.0.3", "hash-base": "~3.0", "pbkdf2": "^3.1.2", "safe-buffer": "^5.2.1" } }, "sha512-CTM5kuWR3sx9IFamcl5ErfPl6ea/N8IYwiJ+vpeB2g+1iknv7zBl5uPwbMbRVznRVbrNY6lGuDoE5b30grmbqg=="], + + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + + "pascalcase": ["pascalcase@0.1.1", "", {}, "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw=="], + + "path-browserify": ["path-browserify@0.0.1", "", {}, "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="], + + "path-dirname": ["path-dirname@1.0.2", "", {}, "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pbkdf2": ["pbkdf2@3.1.2", "", { "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", "ripemd160": "^2.0.1", "safe-buffer": "^5.0.1", "sha.js": "^2.4.8" } }, "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "pify": ["pify@4.0.1", "", {}, "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g=="], + + "pkg-dir": ["pkg-dir@3.0.0", "", { "dependencies": { "find-up": "^3.0.0" } }, "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw=="], + + "posix-character-classes": ["posix-character-classes@0.1.1", "", {}, "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg=="], + + "postcss": ["postcss@8.5.1", "", { "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ=="], + + "postcss-media-query-parser": ["postcss-media-query-parser@0.2.3", "", {}, "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig=="], + + "postcss-resolve-nested-selector": ["postcss-resolve-nested-selector@0.1.6", "", {}, "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw=="], + + "postcss-safe-parser": ["postcss-safe-parser@7.0.1", "", { "peerDependencies": { "postcss": "^8.4.31" } }, "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A=="], + + "postcss-scss": ["postcss-scss@4.0.9", "", { "peerDependencies": { "postcss": "^8.4.29" } }, "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A=="], + + "postcss-selector-parser": ["postcss-selector-parser@7.0.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ=="], + + "postcss-sorting": ["postcss-sorting@8.0.2", "", { "peerDependencies": { "postcss": "^8.4.20" } }, "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q=="], + + "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.4.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ=="], + + "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], + + "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="], + + "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + + "promise-inflight": ["promise-inflight@1.0.1", "", {}, "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="], + + "prr": ["prr@1.0.1", "", {}, "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw=="], + + "public-encrypt": ["public-encrypt@4.0.3", "", { "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" } }, "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q=="], + + "pump": ["pump@3.0.2", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw=="], + + "pumpify": ["pumpify@1.5.1", "", { "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" } }, "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + + "querystring-es3": ["querystring-es3@0.2.1", "", {}, "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="], + + "randomfill": ["randomfill@1.0.4", "", { "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw=="], + + "readable-stream": ["readable-stream@1.1.14", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", "isarray": "0.0.1", "string_decoder": "~0.10.x" } }, "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ=="], + + "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "regex-not": ["regex-not@1.0.2", "", { "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" } }, "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A=="], + + "remove-trailing-separator": ["remove-trailing-separator@1.1.0", "", {}, "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw=="], + + "repeat-element": ["repeat-element@1.1.4", "", {}, "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ=="], + + "repeat-string": ["repeat-string@1.6.1", "", {}, "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], + + "resolve-url": ["resolve-url@0.2.1", "", {}, "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg=="], + + "ret": ["ret@0.1.15", "", {}, "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="], + + "reusify": ["reusify@1.0.4", "", {}, "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="], + + "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "ripemd160": ["ripemd160@2.0.2", "", { "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "run-queue": ["run-queue@1.0.3", "", { "dependencies": { "aproba": "^1.1.1" } }, "sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg=="], + + "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "safe-regex": ["safe-regex@1.1.0", "", { "dependencies": { "ret": "~0.1.10" } }, "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg=="], + + "schema-utils": ["schema-utils@3.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg=="], + + "semver": ["semver@7.7.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ=="], + + "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "set-value": ["set-value@2.0.1", "", { "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" } }, "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw=="], + + "setimmediate": ["setimmediate@1.0.5", "", {}, "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA=="], + + "sha.js": ["sha.js@2.4.11", "", { "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" }, "bin": { "sha.js": "./bin.js" } }, "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + + "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + + "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], + + "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "slice-ansi": ["slice-ansi@4.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" } }, "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ=="], + + "snapdragon": ["snapdragon@0.8.2", "", { "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", "extend-shallow": "^2.0.1", "map-cache": "^0.2.2", "source-map": "^0.5.6", "source-map-resolve": "^0.5.0", "use": "^3.1.0" } }, "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg=="], + + "snapdragon-node": ["snapdragon-node@2.1.1", "", { "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" } }, "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw=="], + + "snapdragon-util": ["snapdragon-util@3.0.1", "", { "dependencies": { "kind-of": "^3.2.0" } }, "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ=="], + + "source-list-map": ["source-list-map@2.0.1", "", {}, "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw=="], + + "source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "source-map-resolve": ["source-map-resolve@0.5.3", "", { "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", "source-map-url": "^0.4.0", "urix": "^0.1.0" } }, "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw=="], + + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + + "source-map-url": ["source-map-url@0.4.1", "", {}, "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw=="], + + "split-string": ["split-string@3.1.0", "", { "dependencies": { "extend-shallow": "^3.0.0" } }, "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw=="], + + "ssri": ["ssri@6.0.2", "", { "dependencies": { "figgy-pudding": "^3.5.1" } }, "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q=="], + + "static-extend": ["static-extend@0.1.2", "", { "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" } }, "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g=="], + + "stream-browserify": ["stream-browserify@2.0.2", "", { "dependencies": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" } }, "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg=="], + + "stream-each": ["stream-each@1.2.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" } }, "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw=="], + + "stream-http": ["stream-http@2.8.3", "", { "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.1", "readable-stream": "^2.3.6", "to-arraybuffer": "^1.0.0", "xtend": "^4.0.0" } }, "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw=="], + + "stream-shift": ["stream-shift@1.0.3", "", {}, "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "stylelint": ["stylelint@16.14.1", "", { "dependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", "@csstools/media-query-list-parser": "^4.0.2", "@csstools/selector-specificity": "^5.0.0", "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", "cosmiconfig": "^9.0.0", "css-functions-list": "^3.2.3", "css-tree": "^3.1.0", "debug": "^4.3.7", "fast-glob": "^3.3.3", "fastest-levenshtein": "^1.0.16", "file-entry-cache": "^10.0.5", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", "html-tags": "^3.3.1", "ignore": "^7.0.3", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", "known-css-properties": "^0.35.0", "mathml-tag-names": "^2.1.3", "meow": "^13.2.0", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.5.1", "postcss-resolve-nested-selector": "^0.1.6", "postcss-safe-parser": "^7.0.1", "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", "supports-hyperlinks": "^3.1.0", "svg-tags": "^1.0.0", "table": "^6.9.0", "write-file-atomic": "^5.0.1" }, "bin": { "stylelint": "bin/stylelint.mjs" } }, "sha512-oqCL7AC3786oTax35T/nuLL8p2C3k/8rHKAooezrPGRvUX0wX+qqs5kMWh5YYT4PHQgVDobHT4tw55WgpYG6Sw=="], + + "stylelint-config-idiomatic-order": ["stylelint-config-idiomatic-order@10.0.0", "", { "dependencies": { "stylelint-order": "^6.0.2" }, "peerDependencies": { "stylelint": ">=11" } }, "sha512-gJjT1nwhgnHS52+mRn+5Iw6keZIPRN4W+vbzct9Elb+tWOo61jC/CzXzAJHvvOYQZqUYItfs2aQ8fU5hnCvuGg=="], + + "stylelint-config-recommended": ["stylelint-config-recommended@14.0.1", "", { "peerDependencies": { "stylelint": "^16.1.0" } }, "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg=="], + + "stylelint-config-recommended-scss": ["stylelint-config-recommended-scss@14.1.0", "", { "dependencies": { "postcss-scss": "^4.0.9", "stylelint-config-recommended": "^14.0.1", "stylelint-scss": "^6.4.0" }, "peerDependencies": { "postcss": "^8.3.3", "stylelint": "^16.6.1" }, "optionalPeers": ["postcss"] }, "sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg=="], + + "stylelint-config-standard": ["stylelint-config-standard@36.0.1", "", { "dependencies": { "stylelint-config-recommended": "^14.0.1" }, "peerDependencies": { "stylelint": "^16.1.0" } }, "sha512-8aX8mTzJ6cuO8mmD5yon61CWuIM4UD8Q5aBcWKGSf6kg+EC3uhB+iOywpTK4ca6ZL7B49en8yanOFtUW0qNzyw=="], + + "stylelint-config-standard-scss": ["stylelint-config-standard-scss@14.0.0", "", { "dependencies": { "stylelint-config-recommended-scss": "^14.1.0", "stylelint-config-standard": "^36.0.1" }, "peerDependencies": { "postcss": "^8.3.3", "stylelint": "^16.11.0" }, "optionalPeers": ["postcss"] }, "sha512-6Pa26D9mHyi4LauJ83ls3ELqCglU6VfCXchovbEqQUiEkezvKdv6VgsIoMy58i00c854wVmOw0k8W5FTpuaVqg=="], + + "stylelint-no-unsupported-browser-features": ["stylelint-no-unsupported-browser-features@8.0.4", "", { "dependencies": { "doiuse": "^6.0.5", "postcss": "^8.4.32" }, "peerDependencies": { "stylelint": "^16.0.2" } }, "sha512-MNdjegsgfTu1iDBsJM+1uBVZsIt0EWzqAX5qgUBAGavXkddwRqh+S1KD2VnWqUhiEuyddVrWJH8vKsNI40orxA=="], + + "stylelint-order": ["stylelint-order@6.0.4", "", { "dependencies": { "postcss": "^8.4.32", "postcss-sorting": "^8.0.2" }, "peerDependencies": { "stylelint": "^14.0.0 || ^15.0.0 || ^16.0.1" } }, "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA=="], + + "stylelint-prettier": ["stylelint-prettier@5.0.3", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0" }, "peerDependencies": { "prettier": ">=3.0.0", "stylelint": ">=16.0.0" } }, "sha512-B6V0oa35ekRrKZlf+6+jA+i50C4GXJ7X1PPmoCqSUoXN6BrNF6NhqqhanvkLjqw2qgvrS0wjdpeC+Tn06KN3jw=="], + + "stylelint-scss": ["stylelint-scss@6.11.0", "", { "dependencies": { "css-tree": "^3.0.1", "is-plain-object": "^5.0.0", "known-css-properties": "^0.35.0", "mdn-data": "^2.15.0", "postcss-media-query-parser": "^0.2.3", "postcss-resolve-nested-selector": "^0.1.6", "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "stylelint": "^16.0.2" } }, "sha512-AvJ6LVzz2iXHxPlPTR9WVy73FC/vmohH54VySNlCKX1NIXNAeuzy/VbIkMJLMyw/xKYqkgY4kAgB+qy5BfCaCg=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-hyperlinks": ["supports-hyperlinks@3.1.0", "", { "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" } }, "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A=="], + + "svg-tags": ["svg-tags@1.0.0", "", {}, "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA=="], + + "table": ["table@6.9.0", "", { "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", "slice-ansi": "^4.0.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1" } }, "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A=="], + + "tapable": ["tapable@2.2.1", "", {}, "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ=="], + + "terser": ["terser@5.37.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA=="], + + "terser-webpack-plugin": ["terser-webpack-plugin@5.3.11", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ=="], + + "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], + + "through2": ["through2@2.0.5", "", { "dependencies": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ=="], + + "timers-browserify": ["timers-browserify@2.0.12", "", { "dependencies": { "setimmediate": "^1.0.4" } }, "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ=="], + + "to-arraybuffer": ["to-arraybuffer@1.0.1", "", {}, "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA=="], + + "to-object-path": ["to-object-path@0.3.0", "", { "dependencies": { "kind-of": "^3.0.2" } }, "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg=="], + + "to-regex": ["to-regex@3.0.2", "", { "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" } }, "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "ts-api-utils": ["ts-api-utils@2.0.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ=="], + + "ts-node": ["ts-node@https://asozial.beer/ts-node-241116.tgz", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node14": "*", "@tsconfig/node16": "*", "@tsconfig/node18": "*", "@tsconfig/node20": "*", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1" }, "peerDependencies": { "@swc/core": ">=1.3.85", "@swc/wasm": ">=1.3.85", "@types/node": "*", "typescript": ">=4.4" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" } }], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "tty-browserify": ["tty-browserify@0.0.0", "", {}, "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-fest": ["type-fest@4.33.0", "", {}, "sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g=="], + + "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="], + + "typescript": ["typescript@5.8.0-beta", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-7VGUiBOGi+BYhiuy3iITIgu6m2wVW2Vb4CW+OJsW6OJS/TgvezKbAN3WBfiSErE8QOLdce0ilm6VANMkzNWW1A=="], + + "typescript-eslint": ["typescript-eslint@8.22.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.22.0", "@typescript-eslint/parser": "8.22.0", "@typescript-eslint/utils": "8.22.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.8.0" } }, "sha512-Y2rj210FW1Wb6TWXzQc5+P+EWI9/zdS57hLEc0gnyuvdzWo8+Y8brKlbj0muejonhMI/xAZCnZZwjbIfv1CkOw=="], + + "typescript-eslint-language-service": ["typescript-eslint-language-service@5.0.5", "", { "peerDependencies": { "@typescript-eslint/parser": ">= 5.0.0", "eslint": ">= 8.0.0", "typescript": ">= 4.0.0" } }, "sha512-b7gWXpwSTqMVKpPX3WttNZEyVAMKs/2jsHKF79H+qaD6mjzCyU5jboJe/lOZgLJD+QRsXCr0GjIVxvl5kI1NMw=="], + + "undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "union-value": ["union-value@1.0.1", "", { "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" } }, "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg=="], + + "unique-filename": ["unique-filename@1.1.1", "", { "dependencies": { "unique-slug": "^2.0.0" } }, "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ=="], + + "unique-slug": ["unique-slug@2.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w=="], + + "unset-value": ["unset-value@1.0.0", "", { "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" } }, "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ=="], + + "upath": ["upath@1.2.0", "", {}, "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.2", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "urix": ["urix@0.1.0", "", {}, "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg=="], + + "url": ["url@0.11.4", "", { "dependencies": { "punycode": "^1.4.1", "qs": "^6.12.3" } }, "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg=="], + + "use": ["use@3.1.1", "", {}, "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="], + + "util": ["util@0.11.1", "", { "dependencies": { "inherits": "2.0.3" } }, "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ=="], + + "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="], + + "vm-browserify": ["vm-browserify@1.1.2", "", {}, "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ=="], + + "watchpack": ["watchpack@2.4.2", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw=="], + + "watchpack-chokidar2": ["watchpack-chokidar2@2.0.1", "", { "dependencies": { "chokidar": "^2.1.8" } }, "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww=="], + + "webpack": ["webpack@5.97.1", "", { "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.6", "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", "acorn": "^8.14.0", "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg=="], + + "webpack-sources": ["webpack-sources@3.2.3", "", {}, "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w=="], + + "which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "worker-farm": ["worker-farm@1.7.0", "", { "dependencies": { "errno": "~0.1.7" } }, "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "write-file-atomic": ["write-file-atomic@5.0.1", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw=="], + + "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "@babel/highlight/chalk": ["chalk@2.4.2", "", { "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ=="], + + "@jridgewell/gen-mapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@jridgewell/source-map/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "@keyv/serialize/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@4.2.0", "", {}, "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw=="], + + "@webassemblyjs/helper-code-frame/@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.9.0", "", { "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0", "@xtuc/long": "4.2.2" } }, "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA=="], + + "@webassemblyjs/helper-module-context/@webassemblyjs/ast": ["@webassemblyjs/ast@1.9.0", "", { "dependencies": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0" } }, "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA=="], + + "@webassemblyjs/wast-parser/@webassemblyjs/ast": ["@webassemblyjs/ast@1.9.0", "", { "dependencies": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0" } }, "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA=="], + + "@webassemblyjs/wast-parser/@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.9.0", "", {}, "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA=="], + + "@webassemblyjs/wast-parser/@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.9.0", "", {}, "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw=="], + + "ajv-formats/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "asn1.js/bn.js": ["bn.js@4.12.1", "", {}, "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg=="], + + "assert/util": ["util@0.10.4", "", { "dependencies": { "inherits": "2.0.3" } }, "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A=="], + + "base/define-property": ["define-property@1.0.0", "", { "dependencies": { "is-descriptor": "^1.0.0" } }, "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA=="], + + "brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "browserify-aes/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "browserify-des/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "browserify-rsa/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "browserify-sign/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "browserify-sign/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "buffer/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "cacache/rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="], + + "cacache/y18n": ["y18n@4.0.3", "", {}, "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="], + + "cacheable/keyv": ["keyv@5.2.3", "", { "dependencies": { "@keyv/serialize": "^1.0.2" } }, "sha512-AGKecUfzrowabUv0bH1RIR5Vf7w+l4S3xtQAypKaUpTdIR1EbrAcTxHCrpo9Q+IWeUlFE2palRtgIQcgm+PQJw=="], + + "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "cipher-base/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "class-utils/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="], + + "concat-stream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "copy-concurrently/rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="], + + "core-js-builder/core-js": ["core-js@3.40.0", "", {}, "sha512-7vsMc/Lty6AGnn7uFpYT56QesI5D2Y/UkgKounk87OP9Z2H9Z8kj6jzcSGAxFmUtDOS0ntK6lbQz+Nsa0Jj6mQ=="], + + "core-js-builder/webpack": ["webpack@4.47.0", "", { "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/wasm-edit": "1.9.0", "@webassemblyjs/wasm-parser": "1.9.0", "acorn": "^6.4.1", "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^4.5.0", "eslint-scope": "^4.0.3", "json-parse-better-errors": "^1.0.2", "loader-runner": "^2.4.0", "loader-utils": "^1.2.3", "memory-fs": "^0.4.1", "micromatch": "^3.1.10", "mkdirp": "^0.5.3", "neo-async": "^2.6.1", "node-libs-browser": "^2.2.1", "schema-utils": "^1.0.0", "tapable": "^1.1.3", "terser-webpack-plugin": "^1.4.3", "watchpack": "^1.7.4", "webpack-sources": "^1.4.1" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ=="], + + "create-ecdh/bn.js": ["bn.js@4.12.1", "", {}, "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg=="], + + "create-hmac/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "dax-sh/undici-types": ["undici-types@5.28.4", "", {}, "sha512-3OeMF5Lyowe8VW0skf5qaIE7Or3yS9LS7fvMUI0gg4YxpIBVg0L8BxCmROw2CcYhSkpR68Epz7CGc8MPj94Uww=="], + + "diffie-hellman/bn.js": ["bn.js@4.12.1", "", {}, "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg=="], + + "duplexify/readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="], + + "elliptic/bn.js": ["bn.js@4.12.1", "", {}, "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg=="], + + "eslint-plugin-compat/globals": ["globals@15.14.0", "", {}, "sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig=="], + + "eslint-plugin-deprecation/@typescript-eslint/utils": ["@typescript-eslint/utils@7.18.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "7.18.0", "@typescript-eslint/types": "7.18.0", "@typescript-eslint/typescript-estree": "7.18.0" }, "peerDependencies": { "eslint": "^8.56.0" } }, "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw=="], + + "eslint-plugin-deprecation/ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], + + "evp_bytestokey/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "expand-brackets/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "expand-brackets/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="], + + "expand-brackets/extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "extglob/define-property": ["define-property@1.0.0", "", { "dependencies": { "is-descriptor": "^1.0.0" } }, "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA=="], + + "extglob/extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "flush-write-stream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "from2/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "fs-write-stream-atomic/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "global-prefix/which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="], + + "globals/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], + + "has-values/kind-of": ["kind-of@4.0.0", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw=="], + + "hash-base/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "import-fresh/resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "is-extendable/is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="], + + "is-number/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "make-dir/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "md5.js/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "memory-fs/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "miller-rabin/bn.js": ["bn.js@4.12.1", "", {}, "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg=="], + + "mississippi/duplexify": ["duplexify@3.7.1", "", { "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" } }, "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g=="], + + "move-concurrently/rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="], + + "node-libs-browser/punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], + + "node-libs-browser/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "object-copy/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="], + + "object-copy/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "parallel-transform/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "parse-asn1/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "pbkdf2/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "pkg-dir/find-up": ["find-up@3.0.0", "", { "dependencies": { "locate-path": "^3.0.0" } }, "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg=="], + + "public-encrypt/bn.js": ["bn.js@4.12.1", "", {}, "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg=="], + + "public-encrypt/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "pumpify/duplexify": ["duplexify@3.7.1", "", { "dependencies": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" } }, "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g=="], + + "pumpify/pump": ["pump@2.0.1", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA=="], + + "randombytes/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "randomfill/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "readable-stream/string_decoder": ["string_decoder@0.10.31", "", {}, "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ=="], + + "set-value/extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "set-value/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "set-value/is-plain-object": ["is-plain-object@2.0.4", "", { "dependencies": { "isobject": "^3.0.1" } }, "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og=="], + + "sha.js/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "snapdragon/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], + + "snapdragon/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="], + + "snapdragon/extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "snapdragon/source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], + + "snapdragon-node/define-property": ["define-property@1.0.0", "", { "dependencies": { "is-descriptor": "^1.0.0" } }, "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA=="], + + "snapdragon-util/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "static-extend/define-property": ["define-property@0.2.5", "", { "dependencies": { "is-descriptor": "^0.1.0" } }, "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA=="], + + "stream-browserify/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "stream-http/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "stylelint/file-entry-cache": ["file-entry-cache@10.0.6", "", { "dependencies": { "flat-cache": "^6.1.6" } }, "sha512-0wvv16mVo9nN0Md3k7DMjgAPKG/TY4F/gYMBVb/wMThFRJvzrpaqBFqF6km9wf8QfYTN+mNg5aeaBLfy8k35uA=="], + + "stylelint/ignore": ["ignore@7.0.3", "", {}, "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA=="], + + "stylelint-scss/mdn-data": ["mdn-data@2.15.0", "", {}, "sha512-KIrS0lFPOqA4DgeO16vI5fkAsy8p++WBlbXtB5P1EQs8ubBgguAInNd1DnrCeTRfGchY0kgThgDOOIPyOLH2dQ=="], + + "table/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "terser-webpack-plugin/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + + "terser-webpack-plugin/schema-utils": ["schema-utils@4.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g=="], + + "through2/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "to-object-path/kind-of": ["kind-of@3.2.2", "", { "dependencies": { "is-buffer": "^1.1.5" } }, "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ=="], + + "to-regex-range/is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "union-value/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "unset-value/has-value": ["has-value@0.3.1", "", { "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", "isobject": "^2.0.0" } }, "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q=="], + + "url/punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="], + + "util/inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="], + + "watchpack-chokidar2/chokidar": ["chokidar@2.1.8", "", { "dependencies": { "anymatch": "^2.0.0", "async-each": "^1.0.1", "braces": "^2.3.2", "glob-parent": "^3.1.0", "inherits": "^2.0.3", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", "upath": "^1.1.1" }, "optionalDependencies": { "fsevents": "^1.2.7" } }, "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg=="], + + "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], + + "@babel/highlight/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="], + + "@babel/highlight/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "@babel/highlight/chalk/supports-color": ["supports-color@5.5.0", "", { "dependencies": { "has-flag": "^3.0.0" } }, "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "@webassemblyjs/helper-code-frame/@webassemblyjs/wast-printer/@webassemblyjs/ast": ["@webassemblyjs/ast@1.9.0", "", { "dependencies": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0" } }, "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA=="], + + "@webassemblyjs/helper-module-context/@webassemblyjs/ast/@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.9.0", "", {}, "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw=="], + + "@webassemblyjs/wast-parser/@webassemblyjs/ast/@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.9.0", "", {}, "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw=="], + + "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "assert/util/inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="], + + "browserify-sign/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "browserify-sign/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], + + "browserify-sign/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "class-utils/define-property/is-descriptor": ["is-descriptor@0.1.7", "", { "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" } }, "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg=="], + + "concat-stream/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "concat-stream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "core-js-builder/webpack/@webassemblyjs/ast": ["@webassemblyjs/ast@1.9.0", "", { "dependencies": { "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0" } }, "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-edit": ["@webassemblyjs/wasm-edit@1.9.0", "", { "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", "@webassemblyjs/helper-wasm-section": "1.9.0", "@webassemblyjs/wasm-gen": "1.9.0", "@webassemblyjs/wasm-opt": "1.9.0", "@webassemblyjs/wasm-parser": "1.9.0", "@webassemblyjs/wast-printer": "1.9.0" } }, "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-parser": ["@webassemblyjs/wasm-parser@1.9.0", "", { "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-api-error": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", "@webassemblyjs/ieee754": "1.9.0", "@webassemblyjs/leb128": "1.9.0", "@webassemblyjs/utf8": "1.9.0" } }, "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA=="], + + "core-js-builder/webpack/acorn": ["acorn@6.4.2", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ=="], + + "core-js-builder/webpack/enhanced-resolve": ["enhanced-resolve@4.5.0", "", { "dependencies": { "graceful-fs": "^4.1.2", "memory-fs": "^0.5.0", "tapable": "^1.0.0" } }, "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg=="], + + "core-js-builder/webpack/eslint-scope": ["eslint-scope@4.0.3", "", { "dependencies": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" } }, "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg=="], + + "core-js-builder/webpack/loader-runner": ["loader-runner@2.4.0", "", {}, "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw=="], + + "core-js-builder/webpack/micromatch": ["micromatch@3.1.10", "", { "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "extglob": "^2.0.4", "fragment-cache": "^0.2.1", "kind-of": "^6.0.2", "nanomatch": "^1.2.9", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } }, "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg=="], + + "core-js-builder/webpack/schema-utils": ["schema-utils@1.0.0", "", { "dependencies": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } }, "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g=="], + + "core-js-builder/webpack/tapable": ["tapable@1.1.3", "", {}, "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA=="], + + "core-js-builder/webpack/terser-webpack-plugin": ["terser-webpack-plugin@1.4.6", "", { "dependencies": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", "serialize-javascript": "^4.0.0", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", "worker-farm": "^1.7.0" }, "peerDependencies": { "webpack": "^4.0.0" } }, "sha512-2lBVf/VMVIddjSn3GqbT90GvIJ/eYXJkt8cTzU7NbjKqK8fwv18Ftr4PlbF46b/e88743iZFL5Dtr/rC4hjIeA=="], + + "core-js-builder/webpack/watchpack": ["watchpack@1.7.5", "", { "dependencies": { "graceful-fs": "^4.1.2", "neo-async": "^2.5.0" }, "optionalDependencies": { "chokidar": "^3.4.1", "watchpack-chokidar2": "^2.0.1" } }, "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ=="], + + "core-js-builder/webpack/webpack-sources": ["webpack-sources@1.4.3", "", { "dependencies": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" } }, "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ=="], + + "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0" } }, "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA=="], + + "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@7.18.0", "", {}, "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ=="], + + "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "@typescript-eslint/visitor-keys": "7.18.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^1.3.0" } }, "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA=="], + + "expand-brackets/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "expand-brackets/define-property/is-descriptor": ["is-descriptor@0.1.7", "", { "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" } }, "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg=="], + + "expand-brackets/extend-shallow/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "extglob/extend-shallow/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "flush-write-stream/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "flush-write-stream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "from2/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "from2/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "fs-write-stream-atomic/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "fs-write-stream-atomic/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "global-prefix/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "memory-fs/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "memory-fs/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "mississippi/duplexify/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "node-libs-browser/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "node-libs-browser/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "object-copy/define-property/is-descriptor": ["is-descriptor@0.1.7", "", { "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" } }, "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg=="], + + "parallel-transform/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "parallel-transform/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "pkg-dir/find-up/locate-path": ["locate-path@3.0.0", "", { "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A=="], + + "pumpify/duplexify/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "snapdragon/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + + "snapdragon/define-property/is-descriptor": ["is-descriptor@0.1.7", "", { "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" } }, "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg=="], + + "snapdragon/extend-shallow/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "static-extend/define-property/is-descriptor": ["is-descriptor@0.1.7", "", { "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" } }, "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg=="], + + "stream-browserify/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "stream-browserify/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "stream-http/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "stream-http/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "stylelint/file-entry-cache/flat-cache": ["flat-cache@6.1.6", "", { "dependencies": { "cacheable": "^1.8.8", "flatted": "^3.3.2", "hookified": "^1.7.0" } }, "sha512-F+CKgSwp0pzLx67u+Zy1aCueVWFAHWbXepvXlZ+bWVTaASbm5SyCnSJ80Fp1ePEmS57wU+Bf6cx6525qtMZ4lQ=="], + + "table/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "terser-webpack-plugin/schema-utils/ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], + + "terser-webpack-plugin/schema-utils/ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], + + "through2/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "through2/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "unset-value/has-value/has-values": ["has-values@0.1.4", "", {}, "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ=="], + + "unset-value/has-value/isobject": ["isobject@2.1.0", "", { "dependencies": { "isarray": "1.0.0" } }, "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA=="], + + "watchpack-chokidar2/chokidar/anymatch": ["anymatch@2.0.0", "", { "dependencies": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" } }, "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw=="], + + "watchpack-chokidar2/chokidar/braces": ["braces@2.3.2", "", { "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", "extend-shallow": "^2.0.1", "fill-range": "^4.0.0", "isobject": "^3.0.1", "repeat-element": "^1.1.2", "snapdragon": "^0.8.1", "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" } }, "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w=="], + + "watchpack-chokidar2/chokidar/fsevents": ["fsevents@1.2.13", "", { "dependencies": { "bindings": "^1.5.0", "nan": "^2.12.1" }, "os": "darwin" }, "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw=="], + + "watchpack-chokidar2/chokidar/glob-parent": ["glob-parent@3.1.0", "", { "dependencies": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" } }, "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA=="], + + "watchpack-chokidar2/chokidar/is-binary-path": ["is-binary-path@1.0.1", "", { "dependencies": { "binary-extensions": "^1.0.0" } }, "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q=="], + + "watchpack-chokidar2/chokidar/readdirp": ["readdirp@2.2.1", "", { "dependencies": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", "readable-stream": "^2.0.2" } }, "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ=="], + + "webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], + + "@babel/highlight/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="], + + "@babel/highlight/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "@webassemblyjs/helper-code-frame/@webassemblyjs/wast-printer/@webassemblyjs/ast/@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.9.0", "", {}, "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw=="], + + "core-js-builder/webpack/@webassemblyjs/ast/@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.9.0", "", {}, "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-edit/@webassemblyjs/helper-buffer": ["@webassemblyjs/helper-buffer@1.9.0", "", {}, "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-edit/@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.9.0", "", {}, "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-edit/@webassemblyjs/helper-wasm-section": ["@webassemblyjs/helper-wasm-section@1.9.0", "", { "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", "@webassemblyjs/wasm-gen": "1.9.0" } }, "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-edit/@webassemblyjs/wasm-gen": ["@webassemblyjs/wasm-gen@1.9.0", "", { "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-wasm-bytecode": "1.9.0", "@webassemblyjs/ieee754": "1.9.0", "@webassemblyjs/leb128": "1.9.0", "@webassemblyjs/utf8": "1.9.0" } }, "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-edit/@webassemblyjs/wasm-opt": ["@webassemblyjs/wasm-opt@1.9.0", "", { "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-buffer": "1.9.0", "@webassemblyjs/wasm-gen": "1.9.0", "@webassemblyjs/wasm-parser": "1.9.0" } }, "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-edit/@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.9.0", "", { "dependencies": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/wast-parser": "1.9.0", "@xtuc/long": "4.2.2" } }, "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-parser/@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.9.0", "", {}, "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-parser/@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.9.0", "", {}, "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-parser/@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.9.0", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-parser/@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.9.0", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-parser/@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.9.0", "", {}, "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w=="], + + "core-js-builder/webpack/enhanced-resolve/memory-fs": ["memory-fs@0.5.0", "", { "dependencies": { "errno": "^0.1.3", "readable-stream": "^2.0.1" } }, "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA=="], + + "core-js-builder/webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="], + + "core-js-builder/webpack/micromatch/braces": ["braces@2.3.2", "", { "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", "extend-shallow": "^2.0.1", "fill-range": "^4.0.0", "isobject": "^3.0.1", "repeat-element": "^1.1.2", "snapdragon": "^0.8.1", "snapdragon-node": "^2.0.1", "split-string": "^3.0.2", "to-regex": "^3.0.1" } }, "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w=="], + + "core-js-builder/webpack/terser-webpack-plugin/serialize-javascript": ["serialize-javascript@4.0.0", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw=="], + + "core-js-builder/webpack/terser-webpack-plugin/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "core-js-builder/webpack/terser-webpack-plugin/terser": ["terser@4.8.1", "", { "dependencies": { "commander": "^2.20.0", "source-map": "~0.6.1", "source-map-support": "~0.5.12" }, "bin": { "terser": "bin/terser" } }, "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw=="], + + "core-js-builder/webpack/webpack-sources/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + + "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "eslint-visitor-keys": "^3.4.3" } }, "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg=="], + + "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@7.18.0", "", { "dependencies": { "@typescript-eslint/types": "7.18.0", "eslint-visitor-keys": "^3.4.3" } }, "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg=="], + + "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "mississippi/duplexify/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "mississippi/duplexify/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "pkg-dir/find-up/locate-path/p-locate": ["p-locate@3.0.0", "", { "dependencies": { "p-limit": "^2.0.0" } }, "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ=="], + + "pkg-dir/find-up/locate-path/path-exists": ["path-exists@3.0.0", "", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="], + + "pumpify/duplexify/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "pumpify/duplexify/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "terser-webpack-plugin/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], + + "unset-value/has-value/isobject/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "watchpack-chokidar2/chokidar/anymatch/micromatch": ["micromatch@3.1.10", "", { "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "extglob": "^2.0.4", "fragment-cache": "^0.2.1", "kind-of": "^6.0.2", "nanomatch": "^1.2.9", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } }, "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg=="], + + "watchpack-chokidar2/chokidar/anymatch/normalize-path": ["normalize-path@2.1.1", "", { "dependencies": { "remove-trailing-separator": "^1.0.1" } }, "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w=="], + + "watchpack-chokidar2/chokidar/braces/extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "watchpack-chokidar2/chokidar/braces/fill-range": ["fill-range@4.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" } }, "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ=="], + + "watchpack-chokidar2/chokidar/glob-parent/is-glob": ["is-glob@3.1.0", "", { "dependencies": { "is-extglob": "^2.1.0" } }, "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw=="], + + "watchpack-chokidar2/chokidar/is-binary-path/binary-extensions": ["binary-extensions@1.13.1", "", {}, "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw=="], + + "watchpack-chokidar2/chokidar/readdirp/micromatch": ["micromatch@3.1.10", "", { "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", "braces": "^2.3.1", "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "extglob": "^2.0.4", "fragment-cache": "^0.2.1", "kind-of": "^6.0.2", "nanomatch": "^1.2.9", "object.pick": "^1.3.0", "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" } }, "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg=="], + + "watchpack-chokidar2/chokidar/readdirp/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "@babel/highlight/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-edit/@webassemblyjs/wasm-gen/@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.9.0", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-edit/@webassemblyjs/wasm-gen/@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.9.0", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw=="], + + "core-js-builder/webpack/@webassemblyjs/wasm-edit/@webassemblyjs/wasm-gen/@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.9.0", "", {}, "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w=="], + + "core-js-builder/webpack/enhanced-resolve/memory-fs/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + + "core-js-builder/webpack/micromatch/braces/extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], + + "core-js-builder/webpack/micromatch/braces/fill-range": ["fill-range@4.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", "repeat-string": "^1.6.1", "to-regex-range": "^2.1.0" } }, "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ=="], + + "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + + "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="], + + "watchpack-chokidar2/chokidar/braces/extend-shallow/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "watchpack-chokidar2/chokidar/braces/fill-range/to-regex-range": ["to-regex-range@2.1.1", "", { "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" } }, "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg=="], + + "watchpack-chokidar2/chokidar/readdirp/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "watchpack-chokidar2/chokidar/readdirp/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "core-js-builder/webpack/enhanced-resolve/memory-fs/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="], + + "core-js-builder/webpack/enhanced-resolve/memory-fs/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + + "core-js-builder/webpack/micromatch/braces/extend-shallow/is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="], + + "core-js-builder/webpack/micromatch/braces/fill-range/to-regex-range": ["to-regex-range@2.1.1", "", { "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" } }, "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg=="], + + "eslint-plugin-deprecation/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + } +} diff --git a/dprint.json b/dprint.json index f1942ec62..3d8fdc035 100644 --- a/dprint.json +++ b/dprint.json @@ -28,7 +28,7 @@ "https://plugins.dprint.dev/typescript-0.93.3.wasm", "https://plugins.dprint.dev/json-0.19.4.wasm", "https://plugins.dprint.dev/markdown-0.17.8.wasm", - "https://plugins.dprint.dev/toml-0.6.3.wasm", + "https://plugins.dprint.dev/toml-0.6.4.wasm", "https://plugins.dprint.dev/dockerfile-0.3.2.wasm" // "https://plugins.dprint.dev/g-plane/malva-v0.11.1.wasm" // "https://plugins.dprint.dev/g-plane/markup_fmt-v0.18.0.wasm" diff --git a/package.json b/package.json index 5281c2b98..77ad6a520 100644 --- a/package.json +++ b/package.json @@ -6,15 +6,15 @@ "@core-js/compat": "4.0.0-alpha.0", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "^8.57.1", - "@pnpm/types": "^1000.1.0", - "@std/cli": "npm:@jsr/std__cli@^1.0.11", + "@pnpm/types": "^1000.1.1", + "@std/cli": "npm:@jsr/std__cli@^1.0.12", "@tsconfig/node18": "^18.2.4", "@tsconfig/strictest": "^2.0.5", "@types/eslint__eslintrc": "^2.1.2", "@types/eslint__js": "^8.42.3", - "@types/node": "^18.19.71", - "@typescript-eslint/eslint-plugin": "^8.21.0", - "@typescript-eslint/parser": "^8.21.0", + "@types/node": "^18.19.74", + "@typescript-eslint/eslint-plugin": "^8.22.0", + "@typescript-eslint/parser": "^8.22.0", "browserslist": "4.24.4", "browserslist-to-esbuild": "^2.1.1", "caniuse-lite": "1.0.30001690", @@ -32,15 +32,15 @@ "gzip-size": "^7.0.0", "postcss": "^8.5.1", "prettier": "^3.4.2", - "stylelint": "^16.13.2", + "stylelint": "^16.14.1", "stylelint-config-idiomatic-order": "^10.0.0", "stylelint-config-standard-scss": "^14.0.0", - "stylelint-no-unsupported-browser-features": "^8.0.2", - "stylelint-prettier": "^5.0.2", + "stylelint-no-unsupported-browser-features": "^8.0.4", + "stylelint-prettier": "^5.0.3", "ts-node": "https://asozial.beer/ts-node-241116.tgz", "type-fest": "^4.33.0", - "typescript": "~5.7.3", - "typescript-eslint": "^8.21.0", + "typescript": "5.8.0-beta", + "typescript-eslint": "^8.22.0", "typescript-eslint-language-service": "^5.0.5" }, "packageManager": "pnpm@10.1.0+sha512.c89847b0667ddab50396bbbd008a2a43cf3b581efd59cf5d9aa8923ea1fb4b8106c041d540d08acb095037594d73ebc51e1ec89ee40c88b30b8a66c0fae0ac1b", diff --git a/pip-constraints.txt b/pip-constraints.txt index 16456b4b0..3cae771cb 100644 --- a/pip-constraints.txt +++ b/pip-constraints.txt @@ -148,7 +148,7 @@ pysocks==1.7.1 python-geoip-geolite2-yplan==2019.1224 python-geoip-yplan==1.2 pytz==2024.2 -rapidfuzz==3.11.0 +rapidfuzz==3.12.1 redis==5.2.1 regex==2024.11.6 setproctitle==1.3.4 diff --git a/pip-dev-requirements.txt b/pip-dev-requirements.txt index a38eb5710..4f4cae9aa 100644 --- a/pip-dev-requirements.txt +++ b/pip-dev-requirements.txt @@ -148,7 +148,7 @@ pysocks==1.7.1; python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2 python-geoip-geolite2-yplan==2019.1224 python-geoip-yplan==1.2 pytz==2024.2 -rapidfuzz==3.11.0; python_version >= '3.9' +rapidfuzz==3.12.1; python_version >= '3.9' redis[hiredis]==5.2.1; python_version >= '3.8' regex==2024.11.6; python_version >= '3.8' setproctitle==1.3.4; python_version >= '3.8' diff --git a/pip-requirements.txt b/pip-requirements.txt index fc8eba320..991c8ed49 100644 --- a/pip-requirements.txt +++ b/pip-requirements.txt @@ -49,7 +49,7 @@ python-geoip-geolite2-yplan==2019.1224 python-geoip-yplan==1.2 pytz==2024.2 pyyaml==6.0.2; python_version >= '3.8' -rapidfuzz==3.11.0; python_version >= '3.9' +rapidfuzz==3.12.1; python_version >= '3.9' redis[hiredis]==5.2.1; python_version >= '3.8' regex==2024.11.6; python_version >= '3.8' setproctitle==1.3.4; python_version >= '3.8' diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 23af14836..ebdaff9e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,7 +20,7 @@ importers: devDependencies: '@core-js/builder': specifier: 4.0.0-alpha.0 - version: 4.0.0-alpha.0(@types/node@18.19.71)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2) + version: 4.0.0-alpha.0(@types/node@18.19.74)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2) '@core-js/compat': specifier: 4.0.0-alpha.0 version: 4.0.0-alpha.0(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76)) @@ -31,11 +31,11 @@ importers: specifier: ^8.57.1 version: 8.57.1 '@pnpm/types': - specifier: ^1000.1.0 - version: 1000.1.0 + specifier: ^1000.1.1 + version: 1000.1.1 '@std/cli': - specifier: npm:@jsr/std__cli@^1.0.11 - version: '@jsr/std__cli@1.0.11' + specifier: npm:@jsr/std__cli@^1.0.12 + version: '@jsr/std__cli@1.0.12' '@tsconfig/node18': specifier: ^18.2.4 version: 18.2.4 @@ -49,14 +49,14 @@ importers: specifier: ^8.42.3 version: 8.42.3 '@types/node': - specifier: ^18.19.71 - version: 18.19.71 + specifier: ^18.19.74 + version: 18.19.74 '@typescript-eslint/eslint-plugin': - specifier: ^8.21.0 - version: 8.21.0(@typescript-eslint/parser@8.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) + specifier: ^8.22.0 + version: 8.22.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.8.0-beta))(eslint@8.57.1)(typescript@5.8.0-beta) '@typescript-eslint/parser': - specifier: ^8.21.0 - version: 8.21.0(eslint@8.57.1)(typescript@5.7.3) + specifier: ^8.22.0 + version: 8.22.0(eslint@8.57.1)(typescript@5.8.0-beta) browserslist: specifier: 4.24.4 version: 4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76) @@ -68,7 +68,7 @@ importers: version: 1.0.30001690 core-js-builder: specifier: 3.40.0 - version: 3.40.0(patch_hash=bb37b972354a99b27b3a0543624dea87d3cab420b099b8252bb629e983ae5e63)(@types/node@18.19.71)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2) + version: 3.40.0(patch_hash=bb37b972354a99b27b3a0543624dea87d3cab420b099b8252bb629e983ae5e63)(@types/node@18.19.74)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2) core-js-compat: specifier: 3.40.0 version: 3.40.0(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76)) @@ -98,7 +98,7 @@ importers: version: 6.0.2(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(caniuse-lite@1.0.30001690)(eslint@8.57.1) eslint-plugin-deprecation: specifier: ^3.0.0 - version: 3.0.0(eslint@8.57.1)(typescript@5.7.3) + version: 3.0.0(eslint@8.57.1)(typescript@5.8.0-beta) gzip-size: specifier: ^7.0.0 version: 7.0.0 @@ -109,35 +109,35 @@ importers: specifier: ^3.4.2 version: 3.4.2 stylelint: - specifier: ^16.13.2 - version: 16.13.2(typescript@5.7.3) + specifier: ^16.14.1 + version: 16.14.1(typescript@5.8.0-beta) stylelint-config-idiomatic-order: specifier: ^10.0.0 - version: 10.0.0(stylelint@16.13.2(typescript@5.7.3)) + version: 10.0.0(stylelint@16.14.1(typescript@5.8.0-beta)) stylelint-config-standard-scss: specifier: ^14.0.0 - version: 14.0.0(postcss@8.5.1)(stylelint@16.13.2(typescript@5.7.3)) + version: 14.0.0(postcss@8.5.1)(stylelint@16.14.1(typescript@5.8.0-beta)) stylelint-no-unsupported-browser-features: - specifier: ^8.0.2 - version: 8.0.2(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(caniuse-lite@1.0.30001690)(stylelint@16.13.2(typescript@5.7.3)) + specifier: ^8.0.4 + version: 8.0.4(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(caniuse-lite@1.0.30001690)(stylelint@16.14.1(typescript@5.8.0-beta)) stylelint-prettier: - specifier: ^5.0.2 - version: 5.0.2(prettier@3.4.2)(stylelint@16.13.2(typescript@5.7.3)) + specifier: ^5.0.3 + version: 5.0.3(prettier@3.4.2)(stylelint@16.14.1(typescript@5.8.0-beta)) ts-node: specifier: https://asozial.beer/ts-node-241116.tgz - version: https://asozial.beer/ts-node-241116.tgz(@types/node@18.19.71)(typescript@5.7.3) + version: https://asozial.beer/ts-node-241116.tgz(@types/node@18.19.74)(typescript@5.8.0-beta) type-fest: specifier: ^4.33.0 version: 4.33.0 typescript: - specifier: ~5.7.3 - version: 5.7.3 + specifier: 5.8.0-beta + version: 5.8.0-beta typescript-eslint: - specifier: ^8.21.0 - version: 8.21.0(eslint@8.57.1)(typescript@5.7.3) + specifier: ^8.22.0 + version: 8.22.0(eslint@8.57.1)(typescript@5.8.0-beta) typescript-eslint-language-service: specifier: ^5.0.5 - version: 5.0.5(@typescript-eslint/parser@8.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) + version: 5.0.5(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.8.0-beta))(eslint@8.57.1)(typescript@5.8.0-beta) packages: @@ -407,14 +407,14 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@jsr/std__cli@1.0.11': - resolution: {integrity: sha512-XrSHq0Y6dt9Fc+uDxSLfiPW/e1A+naa6YbAqasHDIWKu34bS5SyjJmaO+Sd/j1fB9vaj/ZN2Fhv7adFA3QL1zA==, tarball: https://npm.jsr.io/~/11/@jsr/std__cli/1.0.11.tgz} + '@jsr/std__cli@1.0.12': + resolution: {integrity: sha512-7wCyE0e26CPhC6rLwGk/+bZ9aoOkXFIJIm6Em658g0l8UrySXQU2uGtqHvXlaaREELZU3cXGuQGKsa/JdqhGHg==, tarball: https://npm.jsr.io/~/11/@jsr/std__cli/1.0.12.tgz} '@keyv/serialize@1.0.2': resolution: {integrity: sha512-+E/LyaAeuABniD/RvUezWVXKpeuvwLEA9//nE9952zBaOdBd2mQ3pPoM8cUe2X6IcMByfuSLzmYqnYshG60+HQ==} - '@mdn/browser-compat-data@5.6.32': - resolution: {integrity: sha512-z5ygobHDF+1XrBK5opSziQT6uY76tpEb6JStUpFppnwgwmBslfsSuZDzHTl2SzqYX69Ge3kM//zNO0u8btcdow==} + '@mdn/browser-compat-data@5.6.35': + resolution: {integrity: sha512-ag7tX/vba+g1OVelqrcdUPnao+Fio0YgcIUYs07qoV3escMAqF7sNKSHH8JxXQ0psY3u8l8jqmmGx0vFPtIrtw==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -428,8 +428,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pnpm/types@1000.1.0': - resolution: {integrity: sha512-+F58+ZHk9vJS4NKeVIzvPGCdU9tiPs7p1egqZRBiMN6Sc55LdDUEd/ArvyuooesY1hqmapUcDsgpU2krmNFMRQ==} + '@pnpm/types@1000.1.1': + resolution: {integrity: sha512-5zrv7B+4mW/6iiYS/BrFZWbMqLHjKmaBrMcw+F8LcuMQ7p4SQX4ANoycpr1VIQpn4+xQ0ckyuadfxBttpzicbg==} engines: {node: '>=18.12'} '@tsconfig/node14@14.1.2': @@ -468,19 +468,19 @@ packages: '@types/minimatch@3.0.5': resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - '@types/node@18.19.71': - resolution: {integrity: sha512-evXpcgtZm8FY4jqBSN8+DmOTcVkkvTmAayeo4Wf3m1xAruyVGzGuDh/Fb/WWX2yLItUiho42ozyJjB0dw//Tkw==} + '@types/node@18.19.74': + resolution: {integrity: sha512-HMwEkkifei3L605gFdV+/UwtpxP6JSzM+xFk2Ia6DNFSwSVBRh9qp5Tgf4lNFOMfPVuU0WnkcWpXZpgn5ufO4A==} - '@typescript-eslint/eslint-plugin@8.21.0': - resolution: {integrity: sha512-eTH+UOR4I7WbdQnG4Z48ebIA6Bgi7WO8HvFEneeYBxG8qCOYgTOFPSg6ek9ITIDvGjDQzWHcoWHCDO2biByNzA==} + '@typescript-eslint/eslint-plugin@8.22.0': + resolution: {integrity: sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.21.0': - resolution: {integrity: sha512-Wy+/sdEH9kI3w9civgACwabHbKl+qIOu0uFZ9IMKzX3Jpv9og0ZBJrZExGrPpFAY7rWsXuxs5e7CPPP17A4eYA==} + '@typescript-eslint/parser@8.22.0': + resolution: {integrity: sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -490,12 +490,12 @@ packages: resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.21.0': - resolution: {integrity: sha512-G3IBKz0/0IPfdeGRMbp+4rbjfSSdnGkXsM/pFZA8zM9t9klXDnB/YnKOBQ0GoPmoROa4bCq2NeHgJa5ydsQ4mA==} + '@typescript-eslint/scope-manager@8.22.0': + resolution: {integrity: sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.21.0': - resolution: {integrity: sha512-95OsL6J2BtzoBxHicoXHxgk3z+9P3BEcQTpBKriqiYzLKnM2DeSqs+sndMKdamU8FosiadQFT3D+BSL9EKnAJQ==} + '@typescript-eslint/type-utils@8.22.0': + resolution: {integrity: sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -505,8 +505,8 @@ packages: resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.21.0': - resolution: {integrity: sha512-PAL6LUuQwotLW2a8VsySDBwYMm129vFm4tMVlylzdoTybTHaAi0oBp7Ac6LhSrHHOdLM3efH+nAR6hAWoMF89A==} + '@typescript-eslint/types@8.22.0': + resolution: {integrity: sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@7.18.0': @@ -518,8 +518,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.21.0': - resolution: {integrity: sha512-x+aeKh/AjAArSauz0GiQZsjT8ciadNMHdkUSwBB9Z6PrKc/4knM4g3UfHml6oDJmKC88a6//cdxnO/+P2LkMcg==} + '@typescript-eslint/typescript-estree@8.22.0': + resolution: {integrity: sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' @@ -530,8 +530,8 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.21.0': - resolution: {integrity: sha512-xcXBfcq0Kaxgj7dwejMbFyq7IOHgpNMtVuDveK7w3ZGwG9owKzhALVwKpTF2yrZmEwl9SWdetf3fxNzJQaVuxw==} + '@typescript-eslint/utils@8.22.0': + resolution: {integrity: sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -541,12 +541,12 @@ packages: resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.21.0': - resolution: {integrity: sha512-BkLMNpdV6prozk8LlyK/SOoWLmUFi+ZD+pcqti9ILCbVvHGk1ui1g4jJOc2WDLaeExz2qWwojxlPce5PljcT3w==} + '@typescript-eslint/visitor-keys@8.22.0': + resolution: {integrity: sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.2.1': - resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + '@ungap/structured-clone@1.3.0': + resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} '@webassemblyjs/ast@1.14.1': resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} @@ -709,8 +709,8 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - cacheable@1.8.7: - resolution: {integrity: sha512-AbfG7dAuYNjYxFUtL1lAqmlWdxczCJ47w7cFjhGcnGnUdwSo6VgmSojfoW3tUI12HUkgTJ5kqj78yyq6TsFtlg==} + cacheable@1.8.8: + resolution: {integrity: sha512-OE1/jlarWxROUIpd0qGBSKFLkNsotY8pt4GeiVErUYh/NUeTNrT+SBksUgllQv4m6a0W/VZsLuiHb88maavqEw==} callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} @@ -980,11 +980,11 @@ packages: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - fastq@1.18.0: - resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} + fastq@1.19.0: + resolution: {integrity: sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==} - file-entry-cache@10.0.5: - resolution: {integrity: sha512-umpQsJrBNsdMDgreSryMEXvJh66XeLtZUwA8Gj7rHGearGufUFv6rB/bcXRFsiGWw/VeSUgUofF4Rf2UKEOrTA==} + file-entry-cache@10.0.6: + resolution: {integrity: sha512-0wvv16mVo9nN0Md3k7DMjgAPKG/TY4F/gYMBVb/wMThFRJvzrpaqBFqF6km9wf8QfYTN+mNg5aeaBLfy8k35uA==} file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} @@ -1002,8 +1002,8 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flat-cache@6.1.5: - resolution: {integrity: sha512-QR+2kN38f8nMfiIQ1LHYjuDEmZNZVjxuxY+HufbS3BW0EX01Q5OnH7iduOYRutmgiXb797HAKcXUeXrvRjjgSQ==} + flat-cache@6.1.6: + resolution: {integrity: sha512-F+CKgSwp0pzLx67u+Zy1aCueVWFAHWbXepvXlZ+bWVTaASbm5SyCnSJ80Fp1ePEmS57wU+Bf6cx6525qtMZ4lQ==} flatted@3.3.2: resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} @@ -1432,8 +1432,8 @@ packages: resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} engines: {node: '>= 10.13.0'} - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + semver@7.7.0: + resolution: {integrity: sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==} engines: {node: '>=10'} hasBin: true @@ -1534,8 +1534,8 @@ packages: peerDependencies: stylelint: ^16.1.0 - stylelint-no-unsupported-browser-features@8.0.2: - resolution: {integrity: sha512-4PY2qJ3ZTEje9RgGfaQ82eJoPioXxs6hazeKpji/wzLNVzTX2wd4b0Ds3ewdLkH3ID+o63IInuTquU2MNJO3YQ==} + stylelint-no-unsupported-browser-features@8.0.4: + resolution: {integrity: sha512-MNdjegsgfTu1iDBsJM+1uBVZsIt0EWzqAX5qgUBAGavXkddwRqh+S1KD2VnWqUhiEuyddVrWJH8vKsNI40orxA==} engines: {node: '>=18.12.0'} peerDependencies: stylelint: ^16.0.2 @@ -1545,21 +1545,21 @@ packages: peerDependencies: stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1 - stylelint-prettier@5.0.2: - resolution: {integrity: sha512-qJ+BN+1T2ZcKz9WIrv0x+eFGHzSUnXfXd5gL///T6XoJvr3D8/ztzz2fhtmXef7Vb8P33zBXmLTTveByr0nwBw==} + stylelint-prettier@5.0.3: + resolution: {integrity: sha512-B6V0oa35ekRrKZlf+6+jA+i50C4GXJ7X1PPmoCqSUoXN6BrNF6NhqqhanvkLjqw2qgvrS0wjdpeC+Tn06KN3jw==} engines: {node: '>=18.12.0'} peerDependencies: prettier: '>=3.0.0' stylelint: '>=16.0.0' - stylelint-scss@6.10.1: - resolution: {integrity: sha512-CBqs0jecftIyhic6xba+4OvZUp4B0wNbX19w6Rq1fPo+lBDmTevk+olo8H7u/WQpTSDCDbBN4f3oocQurvXLTQ==} + stylelint-scss@6.11.0: + resolution: {integrity: sha512-AvJ6LVzz2iXHxPlPTR9WVy73FC/vmohH54VySNlCKX1NIXNAeuzy/VbIkMJLMyw/xKYqkgY4kAgB+qy5BfCaCg==} engines: {node: '>=18.12.0'} peerDependencies: stylelint: ^16.0.2 - stylelint@16.13.2: - resolution: {integrity: sha512-wDlgh0mRO9RtSa3TdidqHd0nOG8MmUyVKl+dxA6C1j8aZRzpNeEgdhFmU5y4sZx4Fc6r46p0fI7p1vR5O2DZqA==} + stylelint@16.14.1: + resolution: {integrity: sha512-oqCL7AC3786oTax35T/nuLL8p2C3k/8rHKAooezrPGRvUX0wX+qqs5kMWh5YYT4PHQgVDobHT4tw55WgpYG6Sw==} engines: {node: '>=18.12.0'} hasBin: true @@ -1667,15 +1667,15 @@ packages: eslint: '>= 8.0.0' typescript: '>= 4.0.0' - typescript-eslint@8.21.0: - resolution: {integrity: sha512-txEKYY4XMKwPXxNkN8+AxAdX6iIJAPiJbHE/FpQccs/sxw8Lf26kqwC3cn0xkHlW8kEbLhkhCsjWuMveaY9Rxw==} + typescript-eslint@8.22.0: + resolution: {integrity: sha512-Y2rj210FW1Wb6TWXzQc5+P+EWI9/zdS57hLEc0gnyuvdzWo8+Y8brKlbj0muejonhMI/xAZCnZZwjbIfv1CkOw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + typescript@5.8.0-beta: + resolution: {integrity: sha512-7VGUiBOGi+BYhiuy3iITIgu6m2wVW2Vb4CW+OJsW6OJS/TgvezKbAN3WBfiSErE8QOLdce0ilm6VANMkzNWW1A==} engines: {node: '>=14.17'} hasBin: true @@ -1785,11 +1785,11 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@core-js/builder@4.0.0-alpha.0(@types/node@18.19.71)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2)': + '@core-js/builder@4.0.0-alpha.0(@types/node@18.19.74)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2)': dependencies: '@core-js/compat': 4.0.0-alpha.0(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76)) core-js: 4.0.0-alpha.0 - webpack: 5.97.1(@types/node@18.19.71)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2) + webpack: 5.97.1(@types/node@18.19.74)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2) transitivePeerDependencies: - '@swc/core' - '@types/node' @@ -1967,13 +1967,13 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@jsr/std__cli@1.0.11': {} + '@jsr/std__cli@1.0.12': {} '@keyv/serialize@1.0.2': dependencies: buffer: 6.0.3 - '@mdn/browser-compat-data@5.6.32': {} + '@mdn/browser-compat-data@5.6.35': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -1985,9 +1985,9 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 + fastq: 1.19.0 - '@pnpm/types@1000.1.0': {} + '@pnpm/types@1000.1.1': {} '@tsconfig/node14@14.1.2': {} @@ -2023,36 +2023,36 @@ snapshots: '@types/minimatch@3.0.5': {} - '@types/node@18.19.71': + '@types/node@18.19.74': dependencies: undici-types: 5.26.5 - '@typescript-eslint/eslint-plugin@8.21.0(@typescript-eslint/parser@8.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.22.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.8.0-beta))(eslint@8.57.1)(typescript@5.8.0-beta)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.21.0(eslint@8.57.1)(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/type-utils': 8.21.0(eslint@8.57.1)(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@8.57.1)(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/parser': 8.22.0(eslint@8.57.1)(typescript@5.8.0-beta) + '@typescript-eslint/scope-manager': 8.22.0 + '@typescript-eslint/type-utils': 8.22.0(eslint@8.57.1)(typescript@5.8.0-beta) + '@typescript-eslint/utils': 8.22.0(eslint@8.57.1)(typescript@5.8.0-beta) + '@typescript-eslint/visitor-keys': 8.22.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.0.0(typescript@5.8.0-beta) + typescript: 5.8.0-beta transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.21.0(eslint@8.57.1)(typescript@5.7.3)': + '@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.8.0-beta)': dependencies: - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/scope-manager': 8.22.0 + '@typescript-eslint/types': 8.22.0 + '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.8.0-beta) + '@typescript-eslint/visitor-keys': 8.22.0 debug: 4.4.0 eslint: 8.57.1 - typescript: 5.7.3 + typescript: 5.8.0-beta transitivePeerDependencies: - supports-color @@ -2061,27 +2061,27 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.21.0': + '@typescript-eslint/scope-manager@8.22.0': dependencies: - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/types': 8.22.0 + '@typescript-eslint/visitor-keys': 8.22.0 - '@typescript-eslint/type-utils@8.21.0(eslint@8.57.1)(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.22.0(eslint@8.57.1)(typescript@5.8.0-beta)': dependencies: - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.8.0-beta) + '@typescript-eslint/utils': 8.22.0(eslint@8.57.1)(typescript@5.8.0-beta) debug: 4.4.0 eslint: 8.57.1 - ts-api-utils: 2.0.0(typescript@5.7.3) - typescript: 5.7.3 + ts-api-utils: 2.0.0(typescript@5.8.0-beta) + typescript: 5.8.0-beta transitivePeerDependencies: - supports-color '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.21.0': {} + '@typescript-eslint/types@8.22.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.8.0-beta)': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 @@ -2089,46 +2089,46 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.3(typescript@5.7.3) + semver: 7.7.0 + ts-api-utils: 1.4.3(typescript@5.8.0-beta) optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.0-beta transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.21.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.22.0(typescript@5.8.0-beta)': dependencies: - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/visitor-keys': 8.21.0 + '@typescript-eslint/types': 8.22.0 + '@typescript-eslint/visitor-keys': 8.22.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 2.0.0(typescript@5.7.3) - typescript: 5.7.3 + semver: 7.7.0 + ts-api-utils: 2.0.0(typescript@5.8.0-beta) + typescript: 5.8.0-beta transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.3)': + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.8.0-beta)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) '@typescript-eslint/scope-manager': 7.18.0 '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.8.0-beta) eslint: 8.57.1 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.21.0(eslint@8.57.1)(typescript@5.7.3)': + '@typescript-eslint/utils@8.22.0(eslint@8.57.1)(typescript@5.8.0-beta)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 8.21.0 - '@typescript-eslint/types': 8.21.0 - '@typescript-eslint/typescript-estree': 8.21.0(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.22.0 + '@typescript-eslint/types': 8.22.0 + '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.8.0-beta) eslint: 8.57.1 - typescript: 5.7.3 + typescript: 5.8.0-beta transitivePeerDependencies: - supports-color @@ -2137,12 +2137,12 @@ snapshots: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.21.0': + '@typescript-eslint/visitor-keys@8.22.0': dependencies: - '@typescript-eslint/types': 8.21.0 + '@typescript-eslint/types': 8.22.0 eslint-visitor-keys: 4.2.0 - '@ungap/structured-clone@1.2.1': {} + '@ungap/structured-clone@1.3.0': {} '@webassemblyjs/ast@1.14.1': dependencies: @@ -2283,7 +2283,7 @@ snapshots: ast-metadata-inferer@0.8.1: dependencies: - '@mdn/browser-compat-data': 5.6.32 + '@mdn/browser-compat-data': 5.6.35 astral-regex@2.0.0: {} @@ -2325,7 +2325,7 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - cacheable@1.8.7: + cacheable@1.8.8: dependencies: hookified: 1.7.0 keyv: 5.2.3 @@ -2371,12 +2371,12 @@ snapshots: concat-map@0.0.1: {} - core-js-builder@3.40.0(patch_hash=bb37b972354a99b27b3a0543624dea87d3cab420b099b8252bb629e983ae5e63)(@types/node@18.19.71)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2): + core-js-builder@3.40.0(patch_hash=bb37b972354a99b27b3a0543624dea87d3cab420b099b8252bb629e983ae5e63)(@types/node@18.19.74)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2): dependencies: core-js: 3.40.0 core-js-compat: 3.40.0(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76)) mkdirp: 0.5.6 - webpack: 5.97.1(@types/node@18.19.71)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2) + webpack: 5.97.1(@types/node@18.19.74)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2) transitivePeerDependencies: - '@swc/core' - '@types/node' @@ -2395,14 +2395,14 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig@9.0.0(typescript@5.7.3): + cosmiconfig@9.0.0(typescript@5.8.0-beta): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: - typescript: 5.7.3 + typescript: 5.8.0-beta cross-spawn@7.0.6: dependencies: @@ -2532,7 +2532,7 @@ snapshots: eslint-plugin-compat@6.0.2(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(caniuse-lite@1.0.30001690)(eslint@8.57.1): dependencies: - '@mdn/browser-compat-data': 5.6.32 + '@mdn/browser-compat-data': 5.6.35 ast-metadata-inferer: 0.8.1 browserslist: 4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76) caniuse-lite: 1.0.30001690 @@ -2540,15 +2540,15 @@ snapshots: find-up: 5.0.0 globals: 15.14.0 lodash.memoize: 4.1.2 - semver: 7.6.3 + semver: 7.7.0 - eslint-plugin-deprecation@3.0.0(eslint@8.57.1)(typescript@5.7.3): + eslint-plugin-deprecation@3.0.0(eslint@8.57.1)(typescript@5.8.0-beta): dependencies: - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.8.0-beta) eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.7.3) + ts-api-utils: 1.4.3(typescript@5.8.0-beta) tslib: 2.8.1 - typescript: 5.7.3 + typescript: 5.8.0-beta transitivePeerDependencies: - supports-color @@ -2575,7 +2575,7 @@ snapshots: '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.1 + '@ungap/structured-clone': 1.3.0 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -2651,13 +2651,13 @@ snapshots: fastest-levenshtein@1.0.16: {} - fastq@1.18.0: + fastq@1.19.0: dependencies: reusify: 1.0.4 - file-entry-cache@10.0.5: + file-entry-cache@10.0.6: dependencies: - flat-cache: 6.1.5 + flat-cache: 6.1.6 file-entry-cache@6.0.1: dependencies: @@ -2678,9 +2678,9 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 - flat-cache@6.1.5: + flat-cache@6.1.6: dependencies: - cacheable: 1.8.7 + cacheable: 1.8.8 flatted: 3.3.2 hookified: 1.7.0 @@ -2796,9 +2796,9 @@ snapshots: isexe@3.1.1: {} - jest-worker@27.5.1(@types/node@18.19.71): + jest-worker@27.5.1(@types/node@18.19.74): dependencies: - '@types/node': 18.19.71 + '@types/node': 18.19.74 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -3043,7 +3043,7 @@ snapshots: ajv-formats: 2.1.1 ajv-keywords: 5.1.0(ajv@8.17.1) - semver@7.6.3: {} + semver@7.7.0: {} serialize-javascript@6.0.2: dependencies: @@ -3096,59 +3096,59 @@ snapshots: strip-json-comments@3.1.1: {} - stylelint-config-idiomatic-order@10.0.0(stylelint@16.13.2(typescript@5.7.3)): + stylelint-config-idiomatic-order@10.0.0(stylelint@16.14.1(typescript@5.8.0-beta)): dependencies: - stylelint: 16.13.2(typescript@5.7.3) - stylelint-order: 6.0.4(stylelint@16.13.2(typescript@5.7.3)) + stylelint: 16.14.1(typescript@5.8.0-beta) + stylelint-order: 6.0.4(stylelint@16.14.1(typescript@5.8.0-beta)) - stylelint-config-recommended-scss@14.1.0(postcss@8.5.1)(stylelint@16.13.2(typescript@5.7.3)): + stylelint-config-recommended-scss@14.1.0(postcss@8.5.1)(stylelint@16.14.1(typescript@5.8.0-beta)): dependencies: postcss-scss: 4.0.9(postcss@8.5.1) - stylelint: 16.13.2(typescript@5.7.3) - stylelint-config-recommended: 14.0.1(stylelint@16.13.2(typescript@5.7.3)) - stylelint-scss: 6.10.1(stylelint@16.13.2(typescript@5.7.3)) + stylelint: 16.14.1(typescript@5.8.0-beta) + stylelint-config-recommended: 14.0.1(stylelint@16.14.1(typescript@5.8.0-beta)) + stylelint-scss: 6.11.0(stylelint@16.14.1(typescript@5.8.0-beta)) optionalDependencies: postcss: 8.5.1 - stylelint-config-recommended@14.0.1(stylelint@16.13.2(typescript@5.7.3)): + stylelint-config-recommended@14.0.1(stylelint@16.14.1(typescript@5.8.0-beta)): dependencies: - stylelint: 16.13.2(typescript@5.7.3) + stylelint: 16.14.1(typescript@5.8.0-beta) - stylelint-config-standard-scss@14.0.0(postcss@8.5.1)(stylelint@16.13.2(typescript@5.7.3)): + stylelint-config-standard-scss@14.0.0(postcss@8.5.1)(stylelint@16.14.1(typescript@5.8.0-beta)): dependencies: - stylelint: 16.13.2(typescript@5.7.3) - stylelint-config-recommended-scss: 14.1.0(postcss@8.5.1)(stylelint@16.13.2(typescript@5.7.3)) - stylelint-config-standard: 36.0.1(stylelint@16.13.2(typescript@5.7.3)) + stylelint: 16.14.1(typescript@5.8.0-beta) + stylelint-config-recommended-scss: 14.1.0(postcss@8.5.1)(stylelint@16.14.1(typescript@5.8.0-beta)) + stylelint-config-standard: 36.0.1(stylelint@16.14.1(typescript@5.8.0-beta)) optionalDependencies: postcss: 8.5.1 - stylelint-config-standard@36.0.1(stylelint@16.13.2(typescript@5.7.3)): + stylelint-config-standard@36.0.1(stylelint@16.14.1(typescript@5.8.0-beta)): dependencies: - stylelint: 16.13.2(typescript@5.7.3) - stylelint-config-recommended: 14.0.1(stylelint@16.13.2(typescript@5.7.3)) + stylelint: 16.14.1(typescript@5.8.0-beta) + stylelint-config-recommended: 14.0.1(stylelint@16.14.1(typescript@5.8.0-beta)) - stylelint-no-unsupported-browser-features@8.0.2(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(caniuse-lite@1.0.30001690)(stylelint@16.13.2(typescript@5.7.3)): + stylelint-no-unsupported-browser-features@8.0.4(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(caniuse-lite@1.0.30001690)(stylelint@16.14.1(typescript@5.8.0-beta)): dependencies: doiuse: 6.0.5(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(caniuse-lite@1.0.30001690) postcss: 8.5.1 - stylelint: 16.13.2(typescript@5.7.3) + stylelint: 16.14.1(typescript@5.8.0-beta) transitivePeerDependencies: - browserslist - caniuse-lite - stylelint-order@6.0.4(stylelint@16.13.2(typescript@5.7.3)): + stylelint-order@6.0.4(stylelint@16.14.1(typescript@5.8.0-beta)): dependencies: postcss: 8.5.1 postcss-sorting: 8.0.2(postcss@8.5.1) - stylelint: 16.13.2(typescript@5.7.3) + stylelint: 16.14.1(typescript@5.8.0-beta) - stylelint-prettier@5.0.2(prettier@3.4.2)(stylelint@16.13.2(typescript@5.7.3)): + stylelint-prettier@5.0.3(prettier@3.4.2)(stylelint@16.14.1(typescript@5.8.0-beta)): dependencies: prettier: 3.4.2 prettier-linter-helpers: 1.0.0 - stylelint: 16.13.2(typescript@5.7.3) + stylelint: 16.14.1(typescript@5.8.0-beta) - stylelint-scss@6.10.1(stylelint@16.13.2(typescript@5.7.3)): + stylelint-scss@6.11.0(stylelint@16.14.1(typescript@5.8.0-beta)): dependencies: css-tree: 3.1.0 is-plain-object: 5.0.0 @@ -3158,9 +3158,9 @@ snapshots: postcss-resolve-nested-selector: 0.1.6 postcss-selector-parser: 7.0.0 postcss-value-parser: 4.2.0 - stylelint: 16.13.2(typescript@5.7.3) + stylelint: 16.14.1(typescript@5.8.0-beta) - stylelint@16.13.2(typescript@5.7.3): + stylelint@16.14.1(typescript@5.8.0-beta): dependencies: '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) '@csstools/css-tokenizer': 3.0.3 @@ -3169,13 +3169,13 @@ snapshots: '@dual-bundle/import-meta-resolve': 4.1.0 balanced-match: 2.0.0 colord: 2.9.3 - cosmiconfig: 9.0.0(typescript@5.7.3) + cosmiconfig: 9.0.0(typescript@5.8.0-beta) css-functions-list: 3.2.3 css-tree: 3.1.0 debug: 4.4.0 fast-glob: 3.3.3 fastest-levenshtein: 1.0.16 - file-entry-cache: 10.0.5 + file-entry-cache: 10.0.6 global-modules: 2.0.0 globby: 11.1.0 globjoin: 0.1.4 @@ -3233,14 +3233,14 @@ snapshots: tapable@2.2.1: {} - terser-webpack-plugin@5.3.11(@types/node@18.19.71)(esbuild@0.24.2)(webpack@5.97.1(@types/node@18.19.71)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2)): + terser-webpack-plugin@5.3.11(@types/node@18.19.74)(esbuild@0.24.2)(webpack@5.97.1(@types/node@18.19.74)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2)): dependencies: '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1(@types/node@18.19.71) + jest-worker: 27.5.1(@types/node@18.19.74) schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.37.0 - webpack: 5.97.1(@types/node@18.19.71)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2) + webpack: 5.97.1(@types/node@18.19.74)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2) optionalDependencies: esbuild: 0.24.2 transitivePeerDependencies: @@ -3259,28 +3259,28 @@ snapshots: dependencies: is-number: 7.0.0 - ts-api-utils@1.4.3(typescript@5.7.3): + ts-api-utils@1.4.3(typescript@5.8.0-beta): dependencies: - typescript: 5.7.3 + typescript: 5.8.0-beta - ts-api-utils@2.0.0(typescript@5.7.3): + ts-api-utils@2.0.0(typescript@5.8.0-beta): dependencies: - typescript: 5.7.3 + typescript: 5.8.0-beta - ts-node@https://asozial.beer/ts-node-241116.tgz(@types/node@18.19.71)(typescript@5.7.3): + ts-node@https://asozial.beer/ts-node-241116.tgz(@types/node@18.19.74)(typescript@5.8.0-beta): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node14': 14.1.2 '@tsconfig/node16': 16.1.3 '@tsconfig/node18': 18.2.4 '@tsconfig/node20': 20.1.4 - '@types/node': 18.19.71 + '@types/node': 18.19.74 acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.7.3 + typescript: 5.8.0-beta v8-compile-cache-lib: 3.0.1 tslib@2.8.1: {} @@ -3293,23 +3293,23 @@ snapshots: type-fest@4.33.0: {} - typescript-eslint-language-service@5.0.5(@typescript-eslint/parser@8.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3): + typescript-eslint-language-service@5.0.5(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.8.0-beta))(eslint@8.57.1)(typescript@5.8.0-beta): dependencies: - '@typescript-eslint/parser': 8.21.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/parser': 8.22.0(eslint@8.57.1)(typescript@5.8.0-beta) eslint: 8.57.1 - typescript: 5.7.3 + typescript: 5.8.0-beta - typescript-eslint@8.21.0(eslint@8.57.1)(typescript@5.7.3): + typescript-eslint@8.22.0(eslint@8.57.1)(typescript@5.8.0-beta): dependencies: - '@typescript-eslint/eslint-plugin': 8.21.0(@typescript-eslint/parser@8.21.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3) - '@typescript-eslint/parser': 8.21.0(eslint@8.57.1)(typescript@5.7.3) - '@typescript-eslint/utils': 8.21.0(eslint@8.57.1)(typescript@5.7.3) + '@typescript-eslint/eslint-plugin': 8.22.0(@typescript-eslint/parser@8.22.0(eslint@8.57.1)(typescript@5.8.0-beta))(eslint@8.57.1)(typescript@5.8.0-beta) + '@typescript-eslint/parser': 8.22.0(eslint@8.57.1)(typescript@5.8.0-beta) + '@typescript-eslint/utils': 8.22.0(eslint@8.57.1)(typescript@5.8.0-beta) eslint: 8.57.1 - typescript: 5.7.3 + typescript: 5.8.0-beta transitivePeerDependencies: - supports-color - typescript@5.7.3: {} + typescript@5.8.0-beta: {} undici-types@5.26.5: {} @@ -3336,7 +3336,7 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.97.1(@types/node@18.19.71)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2): + webpack@5.97.1(@types/node@18.19.74)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -3358,7 +3358,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.11(@types/node@18.19.71)(esbuild@0.24.2)(webpack@5.97.1(@types/node@18.19.71)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2)) + terser-webpack-plugin: 5.3.11(@types/node@18.19.74)(esbuild@0.24.2)(webpack@5.97.1(@types/node@18.19.74)(browserslist@4.24.4(caniuse-lite@1.0.30001690)(electron-to-chromium@1.5.76))(esbuild@0.24.2)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: diff --git a/setup.py b/setup.py index 7010924ad..364b6ffa9 100755 --- a/setup.py +++ b/setup.py @@ -104,8 +104,8 @@ def path(path: str | PathLike[str]) -> Path: # -install_requires=path("pip-requirements.txt").read_text("UTF-8").split("\n") -long_description=path("README.md").read_text("UTF-8") +install_requires = path("pip-requirements.txt").read_text("UTF-8").split("\n") +long_description = path("README.md").read_text("UTF-8") setup( author="Das Asoziale Netzwerk",