obsidian-integration-testing 9.1.1 → 9.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +223 -18
- package/dist/lib/cjs/connect-to-cdp.cjs +23 -2
- package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
- package/dist/lib/cjs/eval-in-obsidian.d.cts +44 -1
- package/dist/lib/cjs/global-setup-core.cjs +28 -1
- package/dist/lib/cjs/index.cjs +12 -1
- package/dist/lib/cjs/index.d.cts +5 -0
- package/dist/lib/cjs/leftover-cleanup.cjs +134 -0
- package/dist/lib/cjs/leftover-cleanup.d.cts +216 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/namespace-bootstrap.cjs +20 -2
- package/dist/lib/cjs/obsidian-metadata.cjs +18 -1
- package/dist/lib/cjs/run-version-matrix.cjs +64 -0
- package/dist/lib/cjs/run-version-matrix.d.cts +49 -0
- package/dist/lib/cjs/setup-lock.cjs +145 -32
- package/dist/lib/cjs/setup-lock.d.cts +9 -3
- package/dist/lib/cjs/temp-vault.cjs +3 -2
- package/dist/lib/cjs/transport-appium.cjs +102 -30
- package/dist/lib/cjs/transport-appium.d.cts +50 -3
- package/dist/lib/cjs/transport-factory.cjs +66 -4
- package/dist/lib/cjs/transport-options.cjs +1 -1
- package/dist/lib/cjs/transport-options.d.cts +57 -0
- package/dist/lib/cjs/version-matrix.cjs +175 -0
- package/dist/lib/cjs/version-matrix.d.cts +224 -0
- package/dist/lib/esm/connect-to-cdp.mjs +27 -2
- package/dist/lib/esm/eval-in-obsidian.d.mts +44 -1
- package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
- package/dist/lib/esm/global-setup-core.mjs +36 -2
- package/dist/lib/esm/index.d.mts +5 -0
- package/dist/lib/esm/index.mjs +11 -1
- package/dist/lib/esm/leftover-cleanup.d.mts +216 -0
- package/dist/lib/esm/leftover-cleanup.mjs +105 -0
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/namespace-bootstrap.mjs +20 -2
- package/dist/lib/esm/obsidian-metadata.mjs +18 -1
- package/dist/lib/esm/run-version-matrix.d.mts +49 -0
- package/dist/lib/esm/run-version-matrix.mjs +48 -0
- package/dist/lib/esm/setup-lock.d.mts +9 -3
- package/dist/lib/esm/setup-lock.mjs +145 -32
- package/dist/lib/esm/temp-vault.mjs +3 -2
- package/dist/lib/esm/transport-appium.d.mts +50 -3
- package/dist/lib/esm/transport-appium.mjs +100 -29
- package/dist/lib/esm/transport-factory.mjs +75 -5
- package/dist/lib/esm/transport-options.d.mts +57 -0
- package/dist/lib/esm/version-matrix.d.mts +224 -0
- package/dist/lib/esm/version-matrix.mjs +147 -0
- package/dist/obsidian-integration-testing-9.2.1.tgz +0 -0
- package/package.json +18 -25
- package/dist/obsidian-integration-testing-9.1.1.tgz +0 -0
package/README.md
CHANGED
|
@@ -213,6 +213,56 @@ const value = await evalInObsidian({
|
|
|
213
213
|
});
|
|
214
214
|
```
|
|
215
215
|
|
|
216
|
+
### Create a note that is actually written (`createNote`)
|
|
217
|
+
|
|
218
|
+
**Use `lib.createNote({ content, path })` instead of `app.vault.create` in any suite that may run
|
|
219
|
+
on Android.** The emulator transport loses roughly **0.9 %** of `vault.create` writes — measured at
|
|
220
|
+
7 lost in 800 creates, over two runs of a 400-create stress harness.
|
|
221
|
+
|
|
222
|
+
What a lost write looks like, captured at the moment of failure and before any repair:
|
|
223
|
+
|
|
224
|
+
| Probe | Value |
|
|
225
|
+
| ------------------------------------- | ------------------------- |
|
|
226
|
+
| `adapter.stat(path).size` | `0` |
|
|
227
|
+
| `adapter.stat(path).size` + 500 ms | `0` |
|
|
228
|
+
| `vault.read(file).length` | `0` |
|
|
229
|
+
| `vault.cachedRead(file).length` | `0` |
|
|
230
|
+
| `file.stat.size` (Obsidian's `TFile`) | `38` — the full content |
|
|
231
|
+
|
|
232
|
+
So the write is lost **below** Obsidian: `TFile.stat` says it wrote the content, the filesystem
|
|
233
|
+
holds zero bytes, and it does not heal on its own. It is not a trash/recreate race — creating a
|
|
234
|
+
fresh never-used path fails at the same rate as recreating a just-trashed one.
|
|
235
|
+
|
|
236
|
+
The consequence for a suite is worse than the rate suggests: at ~34 creates per run there is a
|
|
237
|
+
**~26 %** chance of at least one lost write, and whichever test loses that lottery is the one that
|
|
238
|
+
fails — on a `waitUntil` for content that was never written. It moves between tests run to run,
|
|
239
|
+
which is exactly why it reads as a per-test flake rather than one shared cause.
|
|
240
|
+
|
|
241
|
+
`createNote` creates the note, **reads it back**, and rewrites it through `vault.modify` (which
|
|
242
|
+
lands correctly) until the content matches, up to three repairs. Verification is by read-back and
|
|
243
|
+
never by `TFile.stat` — `stat` is precisely the field that lies here. If the content still has not
|
|
244
|
+
landed, it throws naming the path and both lengths, so a genuinely broken write fails loudly
|
|
245
|
+
instead of being retried forever. On a transport that does not lose writes the first read matches
|
|
246
|
+
and nothing is rewritten, so it is safe to use everywhere.
|
|
247
|
+
|
|
248
|
+
```ts
|
|
249
|
+
const heading = await evalInObsidian({
|
|
250
|
+
fn: async ({ app, lib: { createNote, waitUntil }, obsidianModule }) => {
|
|
251
|
+
// Guaranteed on disk before the wait below can depend on it.
|
|
252
|
+
const file = await createNote({ content: '# Title\n', path: 'note.md' });
|
|
253
|
+
await app.workspace.getLeaf().openFile(file);
|
|
254
|
+
await waitUntil({
|
|
255
|
+
message: 'the rendered heading did not appear',
|
|
256
|
+
predicate: () => Boolean(document.querySelector('.markdown-preview-view h1'))
|
|
257
|
+
});
|
|
258
|
+
return document.querySelector('.markdown-preview-view h1')?.textContent ?? null;
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
Whether `modify` / `process` writes can be lost the same way is **not** measured — only `create`
|
|
264
|
+
was stressed — so a content assertion that fails elsewhere may share this cause.
|
|
265
|
+
|
|
216
266
|
### Inject a shared library (`lib`)
|
|
217
267
|
|
|
218
268
|
Because a callback is serialized via `toString()` and **cannot import modules**, it can't reuse
|
|
@@ -667,6 +717,63 @@ environmentOptions: {
|
|
|
667
717
|
- **`obsidianVersion`** pins the app code (asar). When omitted, the owned instance runs the same version your installed Obsidian currently runs.
|
|
668
718
|
- **`obsidianInstallerVersion`** pins the Electron shell (installer build), downloaded and extracted from the matching GitHub release (Windows installers require [7-Zip](https://www.7-zip.org/) on `PATH`). Public releases only — catalyst/beta builds have no public installer, so a catalyst version can only be pinned at the asar level.
|
|
669
719
|
|
|
720
|
+
##### Running against every supported version (`runObsidianVersionMatrix`)
|
|
721
|
+
|
|
722
|
+
Obsidian support is a **range** — `[latest public, latest catalyst]` — and both ends are expected to work. The two ends periodically **coincide**: when public catches up to catalyst, `public-latest` and `catalyst-latest` provision the same build, so running the suites twice re-runs the same build and verifies nothing extra. Worse, a project that runs both still reports "green on public **and** catalyst" — a two-end claim it never actually verified.
|
|
723
|
+
|
|
724
|
+
`runObsidianVersionMatrix` makes that decision once, in the harness:
|
|
725
|
+
|
|
726
|
+
```ts
|
|
727
|
+
// scripts/test-integration-desktop.ts
|
|
728
|
+
import { runObsidianVersionMatrix } from 'obsidian-integration-testing';
|
|
729
|
+
|
|
730
|
+
await runObsidianVersionMatrix({
|
|
731
|
+
// Defaults to ['public-latest', 'catalyst-latest'].
|
|
732
|
+
// Accepts an array or a comma-separated string, so an env var passes straight through.
|
|
733
|
+
versions: process.env.OBSIDIAN_VERSION,
|
|
734
|
+
run: ({ version }) => {
|
|
735
|
+
const result = spawnSync('npx', ['vitest', 'run', '--project=integration-tests:desktop'], {
|
|
736
|
+
env: { ...process.env, OBSIDIAN_VERSION: version },
|
|
737
|
+
shell: true,
|
|
738
|
+
stdio: 'inherit',
|
|
739
|
+
});
|
|
740
|
+
if (result.status !== 0) {
|
|
741
|
+
throw new Error(`Exit code ${String(result.status)}`);
|
|
742
|
+
}
|
|
743
|
+
},
|
|
744
|
+
});
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
Your test config keeps reading the version the same way it always did — the runner just decides how many times to invoke it:
|
|
748
|
+
|
|
749
|
+
```ts
|
|
750
|
+
environmentOptions: {
|
|
751
|
+
obsidianTransport: {
|
|
752
|
+
type: 'obsidian-cdp',
|
|
753
|
+
obsidianVersion: process.env.OBSIDIAN_VERSION ?? 'public-latest',
|
|
754
|
+
},
|
|
755
|
+
}
|
|
756
|
+
```
|
|
757
|
+
|
|
758
|
+
- **De-duplication is keyed on the *resolved* version, never the specifier string.** `['1.13.4', 'catalyst-latest']` collapses to a single run when catalyst *is* `1.13.4`, exactly as `['public-latest', 'catalyst-latest']` does when the channels converge.
|
|
759
|
+
- **The decision is always stated in the log**, so one run where you expected two is never ambiguous:
|
|
760
|
+
|
|
761
|
+
```text
|
|
762
|
+
[version-matrix] public-latest -> 1.13.4
|
|
763
|
+
[version-matrix] catalyst-latest -> 1.13.4
|
|
764
|
+
[version-matrix] 2 requested specifiers resolve to 1 distinct version: 1.13.4 (public-latest, catalyst-latest). Running the suites once.
|
|
765
|
+
[version-matrix] Run 1 of 1: 1.13.4 (public-latest, catalyst-latest)
|
|
766
|
+
```
|
|
767
|
+
|
|
768
|
+
- **Every version runs before anything is reported.** A failing end never hides the other: the summary names which concrete versions failed and which passed, and the thrown `AggregateError` carries each underlying failure.
|
|
769
|
+
|
|
770
|
+
```text
|
|
771
|
+
AggregateError: Obsidian version matrix failed on 1 of 2 versions: 1.12.7 (public-latest). Passed: 1.13.4 (catalyst-latest).
|
|
772
|
+
```
|
|
773
|
+
|
|
774
|
+
- **Only this runner defaults to both ends.** `obsidianVersion` with no explicit pin still means "whatever your installed Obsidian runs", so `connectToCdp()`, the CLI, and any suite not using the runner are unaffected.
|
|
775
|
+
- The runner never launches Obsidian itself — your `run` callback does — so it stays framework-agnostic and works for Vitest, Jest, and manual consumers alike.
|
|
776
|
+
|
|
670
777
|
##### Dead-boot fast-fail
|
|
671
778
|
|
|
672
779
|
If you pin an app version that cannot run on the launched Electron shell — an `obsidianInstallerVersion` too old for the `obsidianVersion` — Obsidian loads a black screen: the renderer finishes loading but the app never bootstraps (empty `<body>`, no `window.app`). Rather than waiting out the full readiness timeout, the harness detects this terminal state and throws a **`RendererFailedToInitializeError`** as soon as it has held for a short grace window:
|
|
@@ -741,6 +848,8 @@ Runs tests against Obsidian Mobile on an Android emulator or real device via App
|
|
|
741
848
|
- Open Android Studio → Device Manager → Create Virtual Device
|
|
742
849
|
- Select a phone profile (e.g. Pixel 7) and a system image (e.g. API 34)
|
|
743
850
|
- Give the AVD a name (e.g. `obsidian_test`) — this is the value you pass as `avdName`
|
|
851
|
+
- **Provision it deliberately — Android Studio's defaults are not enough.** See
|
|
852
|
+
[AVD provisioning](#avd-provisioning) below and set these before you start using the device.
|
|
744
853
|
- You do **not** need to start the emulator manually — the test framework auto-starts it
|
|
745
854
|
|
|
746
855
|
To list existing AVD names:
|
|
@@ -749,6 +858,50 @@ Runs tests against Obsidian Mobile on an Android emulator or real device via App
|
|
|
749
858
|
emulator -list-avds
|
|
750
859
|
```
|
|
751
860
|
|
|
861
|
+
#### AVD provisioning
|
|
862
|
+
|
|
863
|
+
These are minimums, not suggestions. Following the steps above with Android Studio's defaults
|
|
864
|
+
produces a device that fails — and it fails in ways that look like plugin bugs, so the cost of
|
|
865
|
+
getting this wrong is paid in debugging, not in an obvious error.
|
|
866
|
+
|
|
867
|
+
| Setting | Minimum | Android Studio's default | Why |
|
|
868
|
+
| -------------------------- | ------- | ------------------------ | -------------------------------------------------------------------------- |
|
|
869
|
+
| `disk.dataPartition.size` | `16G` | `6G` | This is the one that actually bites — see below. |
|
|
870
|
+
| `hw.ramSize` | `4096` | `2048` | The WebView has to become ready inside a fixed budget. |
|
|
871
|
+
| `vm.heapSize` | `512` | `256` | Obsidian is a large WebView app. |
|
|
872
|
+
| `hw.cpu.ncore` | `4`+ | `4` | Raise it if the host has cores to spare; emulator startup is CPU-bound. |
|
|
873
|
+
|
|
874
|
+
Edit them in Device Manager → *Edit* → *Show Advanced Settings*, or directly in the AVD's
|
|
875
|
+
`config.ini` (`~/.android/avd/<name>.avd/config.ini`); a size change needs a wipe of user data.
|
|
876
|
+
|
|
877
|
+
**Why disk is the setting that matters.** Every failed run leaks a `temp-vault-*` directory, and
|
|
878
|
+
every leaked vault stays **registered** for Obsidian to enumerate at startup — inside the same
|
|
879
|
+
WebView-readiness budget the run is already straining (see [Leftover cleanup](#leftover-cleanup)).
|
|
880
|
+
A full `/data` then produces failures that look like anything but a full disk:
|
|
881
|
+
|
|
882
|
+
- `/data` at 92 % with 103 leftover vaults: runs failed in global setup with `WEBVIEW_md.obsidian`
|
|
883
|
+
timing out at the full 60 s. After a sweep the same context was found in **0.3 s**.
|
|
884
|
+
- `/data` at 91 % with only **8** leftover vaults — the count alone is not the signal. The four
|
|
885
|
+
disk-bound cases (the only ones creating folders and renaming files) timed out at webdriver's
|
|
886
|
+
30 s wall, and the same four passed **6/6 in isolation on the same device**.
|
|
887
|
+
|
|
888
|
+
**Prefer a `google_apis` image over `google_apis_playstore`.** A Play-Store image consumes most of a
|
|
889
|
+
default data partition on its own, and it blocks `adb root` (`adbd cannot run as root in production
|
|
890
|
+
builds`) — so when `/data` does fill, you cannot inspect it to find out what is using the space.
|
|
891
|
+
`pm trim-caches 5G` recovers on the order of tens of megabytes and is the only lever left without
|
|
892
|
+
root. `google_apis` is smaller and does allow `adb root`; nothing in this harness needs the Play
|
|
893
|
+
Store.
|
|
894
|
+
|
|
895
|
+
**Health check — run this before blaming the plugin:**
|
|
896
|
+
|
|
897
|
+
```bash
|
|
898
|
+
adb shell df -h /data
|
|
899
|
+
adb shell ls -d /sdcard/Documents/temp-vault-* | wc -l
|
|
900
|
+
```
|
|
901
|
+
|
|
902
|
+
And apply the isolation rule: **a suite that fails in the aggregate and passes alone is the device**,
|
|
903
|
+
not the code.
|
|
904
|
+
|
|
752
905
|
3. Install [Obsidian](https://obsidian.md/download) on the emulator (via Play Store or APK sideload) and grant storage permission — either via the app's permission prompt or via `adb`:
|
|
753
906
|
|
|
754
907
|
```bash
|
|
@@ -787,19 +940,21 @@ Runs tests against Obsidian Mobile on an Android emulator or real device via App
|
|
|
787
940
|
|
|
788
941
|
Besides the required `appiumUrl` and `avdName`, the transport accepts these optional knobs (all with sensible defaults):
|
|
789
942
|
|
|
790
|
-
| Option | Purpose
|
|
791
|
-
| --------------------------------------------- |
|
|
792
|
-
| `appId` | App package (Android) or bundle ID (iOS).
|
|
793
|
-
| `appiumStartTimeoutInMilliseconds` | Max wait for the auto-started Appium server to become ready; only when the harness auto-starts it.
|
|
794
|
-
| `deviceIdleTimeoutInMilliseconds` | Max wait after boot for a started emulator to go idle before the session; avoids inflated cold setup. 0 skips.
|
|
795
|
-
| `isAppiumConsoleVisible` | Show the auto-started Appium server console window and live output. Hidden and quiet by default.
|
|
796
|
-
| `isEmulatorVisible` | Show the auto-started emulator window. Hidden (`-no-window`, headless) by default so it never steals focus.
|
|
797
|
-
| `layoutReadyTimeoutInMilliseconds` | Max wait for `app.workspace.layoutReady` after the vault (re)opens; raise on slow emulators.
|
|
798
|
-
| `
|
|
799
|
-
| `
|
|
800
|
-
| `
|
|
801
|
-
| `
|
|
802
|
-
| `
|
|
943
|
+
| Option | Purpose | Default |
|
|
944
|
+
| --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | ---------------------- |
|
|
945
|
+
| `appId` | App package (Android) or bundle ID (iOS). | `'md.obsidian'` |
|
|
946
|
+
| `appiumStartTimeoutInMilliseconds` | Max wait for the auto-started Appium server to become ready; only when the harness auto-starts it. | `180000` |
|
|
947
|
+
| `deviceIdleTimeoutInMilliseconds` | Max wait after boot for a started emulator to go idle before the session; avoids inflated cold setup. 0 skips. | `60000` |
|
|
948
|
+
| `isAppiumConsoleVisible` | Show the auto-started Appium server console window and live output. Hidden and quiet by default. | `false` |
|
|
949
|
+
| `isEmulatorVisible` | Show the auto-started emulator window. Hidden (`-no-window`, headless) by default so it never steals focus. | `false` |
|
|
950
|
+
| `layoutReadyTimeoutInMilliseconds` | Max wait for `app.workspace.layoutReady` after the vault (re)opens; raise on slow emulators. | `90000` |
|
|
951
|
+
| `leftoverMaxAgeInMilliseconds` | Age gate for the **host** leftover sweep; the device sweep is unconditional. See [Leftover cleanup](#leftover-cleanup). | `7200000` |
|
|
952
|
+
| `sessionConnectionRetryTimeoutInMilliseconds` | Max wait to establish the Appium session (UiAutomator2 install + app launch); the dominant startup cost. | `180000` |
|
|
953
|
+
| `shouldAutoInstallAppiumDependencies` | Auto-install missing Appium + the UiAutomator2 driver before auto-starting the server (global `npm install -g`). | `true` |
|
|
954
|
+
| `shouldAutoStartAppium` | Auto-start the Appium server when it is not already reachable. | `true` |
|
|
955
|
+
| `shouldSweepLeftovers` | Remove the temp vaults / instance profiles earlier runs leaked. See [Leftover cleanup](#leftover-cleanup). | `true` |
|
|
956
|
+
| `vaultBasePath` | Base device path where Obsidian stores vaults. | `'/sdcard/Documents/'` |
|
|
957
|
+
| `webviewTimeoutInMilliseconds` | Max wait for the WebView context after the Appium session starts. | `60000` |
|
|
803
958
|
|
|
804
959
|
> [!NOTE]
|
|
805
960
|
>
|
|
@@ -814,8 +969,8 @@ as the device reports `sys.boot_completed`, the harness runs
|
|
|
814
969
|
This narrows but cannot fully close the race — an ANR that fires between boot completing and that
|
|
815
970
|
command still slips through. To eliminate it entirely, boot the AVD once, run the command yourself,
|
|
816
971
|
save a snapshot, and always boot from that snapshot. Either way, an ANR signals the emulator is
|
|
817
|
-
under-provisioned, so
|
|
818
|
-
(`emulator -accel-check`).
|
|
972
|
+
under-provisioned, so check it against [AVD provisioning](#avd-provisioning) and confirm hardware
|
|
973
|
+
acceleration (`emulator -accel-check`).
|
|
819
974
|
|
|
820
975
|
#### Troubleshooting: "Android AVD ... not found" / "Appium server ... exited during startup"
|
|
821
976
|
|
|
@@ -841,9 +996,59 @@ up, naming what is missing:
|
|
|
841
996
|
Registering a vault reloads the page, triggering a full Obsidian re-init (reopen the vault and
|
|
842
997
|
reload every plugin — the heaviest startup step). On a cold-booted or under-provisioned emulator
|
|
843
998
|
that can exceed the default `90000`ms budget and fail setup with
|
|
844
|
-
`Obsidian layout did not become ready within 90000ms`.
|
|
845
|
-
|
|
846
|
-
|
|
999
|
+
`Obsidian layout did not become ready within 90000ms`. Run the health check in
|
|
1000
|
+
[AVD provisioning](#avd-provisioning) first — a full `/data` presents exactly like this — then bring the
|
|
1001
|
+
AVD up to the minimums there and, if still needed, raise the budget via
|
|
1002
|
+
`layoutReadyTimeoutInMilliseconds` in the transport options. It is headroom, not a substitute for
|
|
1003
|
+
adequate provisioning.
|
|
1004
|
+
|
|
1005
|
+
### Leftover cleanup
|
|
1006
|
+
|
|
1007
|
+
A run that dies mid-flight cannot clean up after itself. On Android that is the normal case, not the
|
|
1008
|
+
exception: teardown removes the vault through the WebView, and a dead WebView is exactly what most
|
|
1009
|
+
failures are (`Vault cleanup error (non-fatal): no such window`). So every failure leaves a
|
|
1010
|
+
`temp-vault-*` directory behind — and, worse, leaves it **registered**, which is work Obsidian has to
|
|
1011
|
+
redo at every startup, inside the same WebView-readiness budget the run is already straining. Failures
|
|
1012
|
+
therefore make the next failure likelier. One real emulator had accumulated **103 leftover vaults**.
|
|
1013
|
+
|
|
1014
|
+
Every run now sweeps at **both ends**, and the start sweep is the one that matters, because it runs
|
|
1015
|
+
before anything that can die:
|
|
1016
|
+
|
|
1017
|
+
- **On the device (Android)** — before the Appium session launches Obsidian, every `temp-vault-*`
|
|
1018
|
+
directory under `vaultBasePath` is removed over `adb`, and their stale entries are pruned from
|
|
1019
|
+
Obsidian Mobile's `localStorage` vault registry when the run registers its own vault. Unregistering
|
|
1020
|
+
a vault now removes its device directory over `adb` **whether or not the WebView answered**.
|
|
1021
|
+
- **On the host** — leftover `temp-vault-*` staging directories and owned `userdata-*` instance
|
|
1022
|
+
profiles in the system temp directory are removed.
|
|
1023
|
+
|
|
1024
|
+
The two halves gate differently, on purpose:
|
|
1025
|
+
|
|
1026
|
+
| Sweep | Gate | Why |
|
|
1027
|
+
| ---------- | ---------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
1028
|
+
| **Device** | Unconditional | Android runs hold an exclusive lock, so no concurrent run can own a device vault — and an age gate would let a vault leaked minutes ago poison a rerun. |
|
|
1029
|
+
| **Host** | Only older than `leftoverMaxAgeInMilliseconds` | Desktop runs are deliberately not serialized, and every project on the machine shares one temp directory, so a young directory may belong to a live run. |
|
|
1030
|
+
|
|
1031
|
+
Both knobs are available on either transport:
|
|
1032
|
+
|
|
1033
|
+
- **`shouldSweepLeftovers`** (default `true`) — set `false` to disable both sweeps entirely.
|
|
1034
|
+
- **`leftoverMaxAgeInMilliseconds`** (default `7200000`, i.e. two hours) — the host age gate. Raise it
|
|
1035
|
+
if a run of yours can outlive the default; `0` removes every host match regardless of age.
|
|
1036
|
+
|
|
1037
|
+
Sweeping is best-effort throughout: a directory another process still holds is skipped, never thrown.
|
|
1038
|
+
|
|
1039
|
+
**One directory at a time, and the result is measured.** The device sweep removes each vault with its own
|
|
1040
|
+
`rm -rf` and then re-lists what is left, so the count it reports is what actually went away rather than
|
|
1041
|
+
what it asked for. Both halves of that matter, and both come from the same measured failure:
|
|
1042
|
+
|
|
1043
|
+
- An Android emulator can end up holding a directory whose name the FUSE layer cannot express — `rm -rf`,
|
|
1044
|
+
`find -delete` and force-stopping Obsidian first all answer `Operation not permitted`, and it is
|
|
1045
|
+
permanent. Removing the whole set in one command let that single entry decide the fate of every other:
|
|
1046
|
+
one device was found carrying **26** leftover vaults that the sweep had been "removing" every run.
|
|
1047
|
+
Per-directory, it costs one warning per run instead of the whole sweep.
|
|
1048
|
+
- A removal that leaves the directory behind is otherwise invisible, because `rm -rf` runs with its exit
|
|
1049
|
+
code ignored. A run that passed end to end was still leaking a vault apiece, silently. Anything that
|
|
1050
|
+
survives is now named in the log, at both ends — the start-of-run sweep and the teardown — and is
|
|
1051
|
+
retried by the next run's sweep.
|
|
847
1052
|
|
|
848
1053
|
### Running multiple platforms
|
|
849
1054
|
|
|
@@ -22,13 +22,17 @@ __export(connect_to_cdp_exports, {
|
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(connect_to_cdp_exports);
|
|
24
24
|
var import_eval_in_obsidian = require("./eval-in-obsidian.cjs");
|
|
25
|
+
var import_leftover_cleanup = require("./leftover-cleanup.cjs");
|
|
26
|
+
var import_log = require("./log.cjs");
|
|
25
27
|
var import_normalize_optional_properties = require("./normalize-optional-properties.cjs");
|
|
26
28
|
var import_temp_vault = require("./temp-vault.cjs");
|
|
27
29
|
var import_transport_desktop_cdp = require("./transport-desktop-cdp.cjs");
|
|
28
30
|
var import_transport_factory = require("./transport-factory.cjs");
|
|
29
31
|
const DEFAULT_CDP_HOST = "localhost";
|
|
30
32
|
async function connectToCdp(options) {
|
|
31
|
-
const
|
|
33
|
+
const transportOptions = buildCdpTransportOptions(options);
|
|
34
|
+
await sweepLeftovers(transportOptions);
|
|
35
|
+
const transport = await (0, import_transport_factory.createTransportFromOptions)(transportOptions);
|
|
32
36
|
const vault = new import_temp_vault.TempVault(options?.vault);
|
|
33
37
|
const shouldRemoveVaultOnDispose = options?.shouldRemoveVaultOnDispose ?? options?.vault === void 0;
|
|
34
38
|
await vault.register(transport);
|
|
@@ -95,8 +99,25 @@ function resolveEndpoint(transport, options) {
|
|
|
95
99
|
}
|
|
96
100
|
throw new Error("connectToCdp: could not determine the CDP port.");
|
|
97
101
|
}
|
|
102
|
+
async function sweepLeftovers(transportOptions) {
|
|
103
|
+
if (!(0, import_leftover_cleanup.resolveShouldSweepLeftovers)(transportOptions)) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const result = await (0, import_leftover_cleanup.sweepHostLeftovers)({
|
|
108
|
+
maxAgeInMilliseconds: (0, import_leftover_cleanup.resolveLeftoverMaxAgeInMilliseconds)(transportOptions)
|
|
109
|
+
});
|
|
110
|
+
if (result.removedCount > 0 || result.failedCount > 0) {
|
|
111
|
+
(0, import_log.log)(
|
|
112
|
+
`[connect-to-cdp] Swept ${String(result.removedCount)} leftover temp director(ies) from earlier runs (${String(result.failedCount)} still in use).`
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
} catch (error) {
|
|
116
|
+
(0, import_log.log)(`[connect-to-cdp] Leftover sweep error (non-fatal): ${String(error)}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
98
119
|
// Annotate the CommonJS export names for ESM import in node:
|
|
99
120
|
0 && (module.exports = {
|
|
100
121
|
connectToCdp
|
|
101
122
|
});
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Nvbm5lY3QtdG8tY2RwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHJvZ3JhbW1hdGljIGhlbHBlciB0byBsYXVuY2ggKG9yIGF0dGFjaCB0bykgYSBDRFAtZW5hYmxlZCBPYnNpZGlhbiBpbnN0YW5jZVxuICogd2l0aCB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlIGJvb3RzdHJhcHBlZCwgZm9yIGFkLWhvYyByZWFsLWFwcCBkZWJ1Z2dpbmcuXG4gKlxuICogQSBzaW5nbGUge0BsaW5rIGNvbm5lY3RUb0NkcH0gY2FsbCByZXNvbHZlcyB0aGUgb3duZWQtaW5zdGFuY2UgY29uZmlnLCBvcGVucyBhXG4gKiB2YXVsdCwgYW5kIGJvb3RzdHJhcHMgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCAoc28gYGV2YWxXcmFwcGVyYCxcbiAqIHRoZSBiYXNlIGBsaWJgIGhlbHBlcnMsIGBlcnJvclRvU3RyaW5nYCwgYGdldE9ic2lkaWFuTW9kdWxlYCwgXHUyMDI2IGFyZSBhdmFpbGFibGUpLCB0aGVuXG4gKiBoYW5kcyBiYWNrIGEgZGlzcG9zYWJsZSB7QGxpbmsgQ2RwQ29ubmVjdGlvbn0gZXhwb3NpbmcgdGhlIGNob3NlbiBDRFAgcG9ydCwgYVxuICogcmF3IHtAbGluayBDZHBDb25uZWN0aW9uLmludm9rZX0gYW5kIHRoZSByaWNoIHtAbGluayBDZHBDb25uZWN0aW9uLmV2YWxJbk9ic2lkaWFufS5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChsYXVuY2hlcyBPYnNpZGlhbiAvIENEUCkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgRXhjZXB0IH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBBc2FyRmFsbGJhY2sgfSBmcm9tICcuL2FzYXItZmFsbGJhY2stZGV0ZWN0aW9uLmNqcyc7XG5pbXBvcnQgdHlwZSB7IENvbnRleHRJZCB9IGZyb20gJy4vY29udGV4dC1pZC5janMnO1xuaW1wb3J0IHR5cGUgeyBFbGVjdHJvbkNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2VsZWN0cm9uLWNvbXBhdGliaWxpdHkuY2pzJztcbmltcG9ydCB0eXBlIHtcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIEdlbmVyaWNPYmplY3Rcbn0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLmNqcyc7XG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcblxuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB7IG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyB9IGZyb20gJy4vbm9ybWFsaXplLW9wdGlvbmFsLXByb3BlcnRpZXMuY2pzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5janMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLmNqcyc7XG5pbXBvcnQgeyBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LWZhY3RvcnkuY2pzJztcblxuY29uc3QgREVGQVVMVF9DRFBfSE9TVCA9ICdsb2NhbGhvc3QnO1xuXG4vKipcbiAqIEEgbGl2ZSBjb25uZWN0aW9uIHRvIGEgQ0RQLWVuYWJsZWQgT2JzaWRpYW4gaW5zdGFuY2Ugd2l0aCB0aGUgcnVudGltZSBoZWxwZXJcbiAqIG5hbWVzcGFjZSBib290c3RyYXBwZWQuXG4gKlxuICogSW1wbGVtZW50cyBgQXN5bmNEaXNwb3NhYmxlYCwgc28gYGF3YWl0IHVzaW5nIGNvbm4gPSBhd2FpdCBjb25uZWN0VG9DZHAoXHUyMDI2KWBcbiAqIGRpc3Bvc2VzIGl0IChraWxsaW5nIGFuIG93bmVkIGluc3RhbmNlIGFuZCBcdTIwMTQgZm9yIGEgdGhyb3ctYXdheSB0ZW1wIHZhdWx0IFx1MjAxNFxuICogcmVtb3ZpbmcgaXRzIGRpcmVjdG9yeSkgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZHBDb25uZWN0aW9uIGV4dGVuZHMgQXN5bmNEaXNwb3NhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSBzaWxlbnQtYXNhci1mYWxsYmFjayB2ZXJkaWN0IGZvciBhbiBvd25lZCBpbnN0YW5jZSwgcmVhZCBsaXZlIGFmdGVyIGJvb3Q6XG4gICAqIHdoZXRoZXIgdGhlIGFwcCB2ZXJzaW9uIGl0IGlzIGFjdHVhbGx5IHJ1bm5pbmcgbWF0Y2hlcyB0aGUgc3dhcHBlZC1pbiBwaW4sIG9yXG4gICAqIHRoZSBpbnN0YWxsZXIgc2lsZW50bHkgcmV2ZXJ0ZWQgdG8gaXRzIG93biBidW5kbGVkIGFzYXIuIGB1bmRlZmluZWRgIGluIGF0dGFjaFxuICAgKiBtb2RlLCB3aGVuIG5vIGFzYXIgd2FzIHN3YXBwZWQsIG9yIHdoZW4gdGhlIHJ1bm5pbmcgdmVyc2lvbiB3YXMgdW5yZWFkYWJsZS4gQVxuICAgKiBgJ2ZhbGxiYWNrJ2AgdmVyZGljdCByZWFjaGVzIGhlcmUgb25seSB3aGVuIHRoZSB0aHJvdyBpcyBkaXNhYmxlZFxuICAgKiAoe0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMuc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFja30gYGZhbHNlYCk7XG4gICAqIG90aGVyd2lzZSBpdCB0aHJvd3MgYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYCBiZWZvcmUgdGhlIGNvbm5lY3Rpb24gaXMgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFzYXJGYWxsYmFjaz86IEFzYXJGYWxsYmFjayB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGJhc2UgQ0RQIFVSTCwgZS5nLiBgaHR0cDovL2xvY2FsaG9zdDo1MTg4OGAuXG4gICAqL1xuICByZWFkb25seSBjZHBVcmw6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlc29sdmVkIGluc3RhbGxlclx1MjE5NGFwcCBjb21wYXRpYmlsaXR5IHZlcmRpY3QgZm9yIGFuIG93bmVkIGluc3RhbmNlLCB3aGVuXG4gICAqIGl0IGNvdWxkIGJlIGRldGVybWluZWQuIGB1bmRlZmluZWRgIGluIGF0dGFjaCBtb2RlLCBvciB3aGVuIHRoZSB2ZXJkaWN0IGlzXG4gICAqIHVua25vd24gKHVuZGV0ZWN0YWJsZSBzaGVsbCB2ZXJzaW9uLCBvciB0aGUgYXBwIHZlcnNpb24gaXMgYWJzZW50IGZyb20gdGhlXG4gICAqIHRhYmxlKS4gQW4gYCd1bnJ1bm5hYmxlJ2AgdmVyZGljdCByZWFjaGVzIGhlcmUgb25seSB3aGVuIHRoZSBwcm9hY3RpdmUgdGhyb3dcbiAgICogaXMgZGlzYWJsZWQgKHtAbGluayBDb25uZWN0VG9DZHBPcHRpb25zLnNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXJ9XG4gICAqIGBmYWxzZWApOyBvdGhlcndpc2UgaXQgdGhyb3dzIGBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3JgIGJlZm9yZSB0aGVcbiAgICogY29ubmVjdGlvbiBpcyBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tcGF0aWJpbGl0eT86IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBjb25uZWN0aW9uOiBraWxscyBhbiBvd25lZCBpbnN0YW5jZSBhbmQgcmVtb3ZlcyBpdHMgaXNvbGF0ZWRcbiAgICogdXNlci1kYXRhIGRpci4gVGhlIHZhdWx0IGRpcmVjdG9yeSBpcyByZW1vdmVkIG9ubHkgd2hlbiBpdCBpcyBhIHRocm93LWF3YXlcbiAgICogdGVtcCB2YXVsdCAoc2VlIHtAbGluayBDb25uZWN0VG9DZHBPcHRpb25zLnNob3VsZFJlbW92ZVZhdWx0T25EaXNwb3NlfSk7IGFcbiAgICogcmVhbCB2YXVsdCBwYXNzZWQgdmlhIHtAbGluayBDb25uZWN0VG9DZHBPcHRpb25zLnZhdWx0fSBpcyBuZXZlciBkZWxldGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgZGlzcG9zYWwgY29tcGxldGVzLlxuICAgKi9cbiAgZGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgcnVudGltZSBFbGVjdHJvbiBjb21wYXRpYmlsaXR5IHZlcmRpY3QgZm9yIGFuIG93bmVkIGluc3RhbmNlLCByZWFkIGxpdmVcbiAgICogYWZ0ZXIgYm9vdDogd2hldGhlciB0aGUgRWxlY3Ryb24gdmVyc2lvbiBpdCBpcyBhY3R1YWxseSBydW5uaW5nIGlzIG5ldyBlbm91Z2hcbiAgICogZm9yIHRoZSBydW5uaW5nIGFwcCB2ZXJzaW9uLiBgdW5kZWZpbmVkYCBpbiBhdHRhY2ggbW9kZSwgb3Igd2hlbiB0aGUgdmVyZGljdFxuICAgKiBpcyB1bmtub3duICh0aGUgbGl2ZSB2ZXJzaW9uIHdhcyB1bnJlYWRhYmxlLCBvciB0aGUgYXBwIHZlcnNpb24gY2FycmllcyBub1xuICAgKiByZWNvbW1lbmRlZCBFbGVjdHJvbiB2ZXJzaW9uKS4gQW4gb2xkIEVsZWN0cm9uIG5ldmVyIGJsb2NrcyBcdTIwMTQgaXQgb25seSB3YXJucyBcdTIwMTRcbiAgICogc28gdW5saWtlIHtAbGluayBjb21wYXRpYmlsaXR5fSB0aGVyZSBpcyBubyB0aHJvd2luZyB0aWVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZWxlY3Ryb25Db21wYXRpYmlsaXR5PzogRWxlY3Ryb25Db21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSBzZWxmLWNvbnRhaW5lZCBmdW5jdGlvbiBpbnNpZGUgT2JzaWRpYW4gdmlhIHRoZSByaWNoIGhlbHBlclxuICAgKiBwYXRoLCByZWNlaXZpbmcgYHsgYXBwLCBsaWIsIG9ic2lkaWFuTW9kdWxlLCBjb250ZXh0IH1gIHBsdXMgYW55IGBhcmdzYFxuICAgKiAoc2hhcmVkIGhlbHBlcnMgbGlrZSBgdHlwZUludG9FZGl0b3JgIC8gYHdhaXRVbnRpbGAgbGl2ZSBvbiBgbGliYCkuIE1pcnJvcnNcbiAgICogdGhlIHRvcC1sZXZlbCBgZXZhbEluT2JzaWRpYW5gLCB3aXRoIHRoZSB0cmFuc3BvcnQgYW5kIHZhdWx0IHBhdGggcHJlLWJvdW5kXG4gICAqIHRvIHRoaXMgY29ubmVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBldmFsdWF0aW9uIHBhcmFtZXRlcnMgKGBmbmAsIG9wdGlvbmFsIGBhcmdzYC9gY29udGV4dElkYCkuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBgZm5gLlxuICAgKi9cbiAgZXZhbEluT2JzaWRpYW48QXJncyBleHRlbmRzIEdlbmVyaWNPYmplY3QsIFJlc3VsdCwgVENvbnRleHRJZCBleHRlbmRzIENvbnRleHRJZDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gICAgcGFyYW1zOiBFeGNlcHQ8RXZhbEluT2JzaWRpYW5QYXJhbXM8QXJncywgUmVzdWx0LCBUQ29udGV4dElkPiwgJ3RyYW5zcG9ydCcgfCAndmF1bHRQYXRoJz5cbiAgKTogUHJvbWlzZTxSZXN1bHQ+O1xuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgYSByYXcgSmF2YVNjcmlwdCBleHByZXNzaW9uIGluc2lkZSBPYnNpZGlhbiBhbmQgcmV0dXJucyB0aGVcbiAgICogbm9ybWFsaXplZCBzdHJpbmcgcmVzdWx0IChlLmcuIGAnNSdgLCBhIEpTT04gc3RyaW5nLCBvciBgJyhubyBvdXRwdXQpJ2ApLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAtIEEgc2VsZi1jb250YWluZWQgSmF2YVNjcmlwdCBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByYXcgcmVzdWx0IHN0cmluZy5cbiAgICovXG4gIGludm9rZShleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBDRFAgcG9ydCB0aGUgaW5zdGFuY2UgaXMgcmVhY2hhYmxlIG9uICh0aGUgZnJlZSBwb3J0IGNob3NlbiBmb3IgYW5cbiAgICogb3duZWQgaW5zdGFuY2UsIG9yIHRoZSBhdHRhY2hlZCB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9ucy5wb3J0fSkuXG4gICAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVuZWQgdmF1bHQuIEV4cG9zZXMgYHBhdGhgIGFuZCBgcG9wdWxhdGUoLi4uKWAgZm9yIHNlZWRpbmcgZmlsZXMuXG4gICAqL1xuICByZWFkb25seSB2YXVsdDogVGVtcFZhdWx0O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBjb25uZWN0VG9DZHB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3RUb0NkcE9wdGlvbnMge1xuICAvKipcbiAgICogVGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGluZGl2aWR1YWwgQ0RQIGNvbW1hbmRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMzAwMDBgXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBHcmFjZSB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGZvciBmYXN0LWZhaWxpbmcgYSBkZWFkIGJvb3Qgb2YgdGhlIG93bmVkXG4gICAqIGluc3RhbmNlIFx1MjAxNCB0aGUgcmVuZGVyZXIgbG9hZGVkIGJ1dCB0aGUgYXBwIG5ldmVyIGJvb3RzdHJhcHBlZCAoZW1wdHlcbiAgICogYDxib2R5PmAsIG5vIGB3aW5kb3cuYXBwYCksIHRoZSB0ZXJtaW5hbCBzdGF0ZSB3aGVuIHRoZSBhc2FyIGNhbm5vdCBydW4gb25cbiAgICogdGhlIGxhdW5jaGVkIEVsZWN0cm9uIHNoZWxsLiBPbmNlIGl0IGhhcyBoZWxkIHRoaXMgbG9uZyBhXG4gICAqIGBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yYCBpcyB0aHJvd24gaW5zdGVhZCBvZiB3YWl0aW5nIG91dCB0aGUgZnVsbFxuICAgKiByZWFkaW5lc3MgdGltZW91dC4gSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIHBvcnR9IHNldCkuIFNldCBgMGAgdG9cbiAgICogZGlzYWJsZSBmYXN0LWZhaWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAxMDAwMGBcbiAgICovXG4gIHJlYWRvbmx5IGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQ0RQIGhvc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnbG9jYWxob3N0J2BcbiAgICovXG4gIHJlYWRvbmx5IGhvc3Q/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIE9ic2lkaWFuIHdpbmRvdyBpcyBzaG93biBvbiBzY3JlZW4uIERlZmF1bHRzIHRvIGB0cnVlYDsgc2V0XG4gICAqIGBmYWxzZWAgdG8gbGF1bmNoIGl0IG9mZi1zY3JlZW4uXG4gICAqIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IGlzT2JzaWRpYW5BcHBWaXNpYmxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGlucyB0aGUgRWxlY3Ryb24gc2hlbGwgKGluc3RhbGxlciBidWlsZCkgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMuIEFjY2VwdHNcbiAgICogYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC4gSWdub3JlZCB3aGVuXG4gICAqIHtAbGluayBwb3J0fSAoYXR0YWNoIG1vZGUpIGlzIHNldC4gV2hlbiBvbWl0dGVkLCB0aGUgaW5zdGFsbGVkIHNoZWxsIGlzIHVzZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBvYnNpZGlhbkluc3RhbGxlclZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBpbnMgdGhlIE9ic2lkaWFuIGFwcCB2ZXJzaW9uIChhc2FyKSB0aGUgb3duZWQgaW5zdGFuY2UgcnVucy4gQWNjZXB0c1xuICAgKiBgJ3gueS56J2AsIGAncHVibGljLWxhdGVzdCdgLCBvciBgJ2NhdGFseXN0LWxhdGVzdCdgLiBJZ25vcmVkIHdoZW5cbiAgICoge0BsaW5rIHBvcnR9IChhdHRhY2ggbW9kZSkgaXMgc2V0LiBXaGVuIG9taXR0ZWQsIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBpcyB1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDRFAgcG9ydCBvZiBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gdG8gKiphdHRhY2gqKiB0by4gV2hlbiBvbWl0dGVkLCBhblxuICAgKiBpc29sYXRlZCBpbnN0YW5jZSBpcyBsYXVuY2hlZCBvbiBhbiBhdXRvbWF0aWNhbGx5IGNob3NlbiBmcmVlIHBvcnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB1bmRlZmluZWRgXG4gICAqL1xuICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGxhdW5jaCB0aGUgb3duZWQgaW5zdGFuY2Ugd2l0aCBDaHJvbWl1bSdzIHNhbmRib3ggZGlzYWJsZWRcbiAgICogKGAtLW5vLXNhbmRib3hgKS5cbiAgICpcbiAgICogTmVlZGVkIHRvIGJvb3Qgb24gTGludXggd2l0aG91dCBhIGNvcnJlY3RseS1jb25maWd1cmVkIHNldHVpZFxuICAgKiBgY2hyb21lLXNhbmRib3hgIGhlbHBlciAoZS5nLiBhbiBpbnN0YWxsZXItZXh0cmFjdGVkIHBvcnRhYmxlIHNoZWxsLCBvciBDSVxuICAgKiBydW5uaW5nIGFzIGEgbm9uLXJvb3QgdXNlcik7IGhhcm1sZXNzIG9uIFdpbmRvd3MvbWFjT1MuIElnbm9yZWQgaW4gYXR0YWNoXG4gICAqIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBzaG91bGREaXNhYmxlU2FuZGJveD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVtb3ZlIHRoZSB2YXVsdCBkaXJlY3Rvcnkgb24ge0BsaW5rIENkcENvbm5lY3Rpb24uZGlzcG9zZX0uXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgZGVmYXVsdHMgdG8gYHRydWVgIGZvciBhbiBpbXBsaWNpdCB0aHJvdy1hd2F5IHRlbXAgdmF1bHRcbiAgICogKHtAbGluayB2YXVsdH0gbm90IGdpdmVuKSBhbmQgYGZhbHNlYCB3aGVuIGEge0BsaW5rIHZhdWx0fSBwYXRoIGlzIGdpdmVuLCBzb1xuICAgKiBhIHJlYWwgdmF1bHQgaXMgbmV2ZXIgZGVsZXRlZC4gU2V0IGV4cGxpY2l0bHkgdG8gb3ZlcnJpZGUuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYW4gKip1bnJ1bm5hYmxlKiogaW5zdGFsbGVyXHUyMTk0YXBwIHZlcnNpb24gcGFpciBmYWlscyBmYXN0IGJlZm9yZSBsYXVuY2guXG4gICAqXG4gICAqIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIGFuIGluc3RhbGxlciBiZWxvdyB0aGUgYXBwJ3MgcnVuIGZsb29yIHRocm93c1xuICAgKiBgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yYCBmcm9tIHZlcnNpb24gcmVzb2x1dGlvbiBiZWZvcmUgYW55dGhpbmcgaXNcbiAgICogZG93bmxvYWRlZCBvciBsYXVuY2hlZC4gU2V0IGBmYWxzZWAgdG8gbGV0IHRoZSBwaW4gcHJvY2VlZCB0byBsYXVuY2ggXHUyMDE0IHdoZXJlXG4gICAqIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3QgZmFzdC1mYWlsIHN0aWxsIGNhdGNoZXMgdGhlIGJsYWNrLXNjcmVlbiBib290LCBhbmQgdGhlXG4gICAqIGAndW5ydW5uYWJsZSdgIHZlcmRpY3QgaXMgc3VyZmFjZWQgb24ge0BsaW5rIENkcENvbm5lY3Rpb24uY29tcGF0aWJpbGl0eX1cbiAgICogcmF0aGVyIHRoYW4gdGhyb3duLiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciBhIHBvc3QtYm9vdCAqKnNpbGVudCBhc2FyIGZhbGxiYWNrKiogZmFpbHMgZmFzdC5cbiAgICpcbiAgICogV2hlbiBhbiBhc2FyIGlzIHN3YXBwZWQgb250byBhbiBpbnN0YWxsZXIgc2hlbGwgdG9vIG9sZCBmb3IgaXQsIHRoZSBpbnN0YW5jZVxuICAgKiBtYXkgc2lsZW50bHkgcmV2ZXJ0IHRvIHRoZSBpbnN0YWxsZXIncyBvd24gYnVuZGxlZCBhc2FyIGFuZCBydW4gdGhlICoqd3JvbmdcbiAgICogKG9sZGVyKSoqIHZlcnNpb24gYmVoaW5kIGEgaGVhbHRoeSBVSS4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSwgdGhlIHJ1bm5pbmdcbiAgICogYXBwIHZlcnNpb24gaXMgdmVyaWZpZWQgYWdhaW5zdCB0aGUgcGluIHBvc3QtYm9vdCBhbmQgYSBtaXNtYXRjaCB0aHJvd3NcbiAgICogYFNpbGVudEFzYXJGYWxsYmFja0Vycm9yYC4gU2V0IGBmYWxzZWAgdG8gbGV0IHRoZSBib290IHByb2NlZWQgXHUyMDE0IHRoZSBtaXNtYXRjaFxuICAgKiBpcyB0aGVuIHN1cmZhY2VkIG9uIHtAbGluayBDZHBDb25uZWN0aW9uLmFzYXJGYWxsYmFja30gcmF0aGVyIHRoYW4gdGhyb3duLlxuICAgKiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KSBhbmQgd2hlbiBubyBhc2FyIGlzIHN3YXBwZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjaz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG93bmVkLWluc3RhbmNlIGNvbXBhdGliaWxpdHkgKipuYWcgd2FybmluZ3MqKiBhcmUgZW1pdHRlZC5cbiAgICpcbiAgICogQ292ZXJzIGJvdGggdGhlIG9mZmxpbmUgaW5zdGFsbGVyXHUyMTk0YXBwIHdhcm5pbmcgYW5kIHRoZSBwb3N0LWJvb3RcbiAgICogcnVudGltZS1FbGVjdHJvbiB3YXJuaW5nLiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpIGVhY2ggZmlyZXMgdmlhIHRoZSBoYXJuZXNzXG4gICAqIGxvZzsgc2V0IGBmYWxzZWAgdG8gc2lsZW5jZSBib3RoIFx1MjAxNCB0aGUgdmVyZGljdHMgYXJlIHN0aWxsIHN1cmZhY2VkIG9uXG4gICAqIHtAbGluayBDZHBDb25uZWN0aW9uLmNvbXBhdGliaWxpdHl9IC8ge0BsaW5rIENkcENvbm5lY3Rpb24uZWxlY3Ryb25Db21wYXRpYmlsaXR5fSxcbiAgICogb25seSB0aGUgbG9nIGlzIHN1cHByZXNzZWQuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSBwYXRoIHRvIGFuIGV4aXN0aW5nIHZhdWx0IHRvIG9wZW4uIFdoZW4gb21pdHRlZCwgYW4gZW1wdHkgdGVtcG9yYXJ5XG4gICAqIHZhdWx0IGlzIGNyZWF0ZWQgKGFuZCByZW1vdmVkIG9uIGRpc3Bvc2UgdW5sZXNzXG4gICAqIHtAbGluayBzaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZX0gc2F5cyBvdGhlcndpc2UpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHQ/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSByZXNvbHZlZCBDRFAgaG9zdC9wb3J0IHBhaXIuXG4gKi9cbmludGVyZmFjZSBSZXNvbHZlZEVuZHBvaW50IHtcbiAgaG9zdDogc3RyaW5nO1xuICBwb3J0OiBudW1iZXI7XG59XG5cbi8qKlxuICogTGF1bmNoZXMgKG9yIGF0dGFjaGVzIHRvKSBhIENEUC1lbmFibGVkIE9ic2lkaWFuIGluc3RhbmNlLCBvcGVucyBhIHZhdWx0LCBhbmRcbiAqIGJvb3RzdHJhcHMgdGhlIHJ1bnRpbWUgaGVscGVyIG5hbWVzcGFjZSwgcmV0dXJuaW5nIGEgZGlzcG9zYWJsZSBjb25uZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29ubmVjdGlvbiBvcHRpb25zLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgbGl2ZSB7QGxpbmsgQ2RwQ29ubmVjdGlvbn0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0VG9DZHAob3B0aW9ucz86IENvbm5lY3RUb0NkcE9wdGlvbnMpOiBQcm9taXNlPENkcENvbm5lY3Rpb24+IHtcbiAgY29uc3QgdHJhbnNwb3J0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMoYnVpbGRDZHBUcmFuc3BvcnRPcHRpb25zKG9wdGlvbnMpKTtcbiAgY29uc3QgdmF1bHQgPSBuZXcgVGVtcFZhdWx0KG9wdGlvbnM/LnZhdWx0KTtcbiAgY29uc3Qgc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2UgPSBvcHRpb25zPy5zaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZSA/PyAob3B0aW9ucz8udmF1bHQgPT09IHVuZGVmaW5lZCk7XG5cbiAgLy8gUmVnaXN0ZXJpbmcgdGhlIHZhdWx0IGlzIHdoYXQgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIChwcm92aXNpb25zIHRoZVxuICAvLyBBc2FyLCBvcGVucyB0aGUgdmF1bHQsIGFuZCBib290c3RyYXBzIHRoZSBoZWxwZXIgbmFtZXNwYWNlKSwgb3Igb3BlbnMgdGhlXG4gIC8vIFZhdWx0IGluIHRoZSBhdHRhY2hlZCBpbnN0YW5jZS5cbiAgYXdhaXQgdmF1bHQucmVnaXN0ZXIodHJhbnNwb3J0KTtcblxuICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IHJlc29sdmVFbmRwb2ludCh0cmFuc3BvcnQsIG9wdGlvbnMpO1xuICBjb25zdCBjZHBVcmwgPSBgaHR0cDovLyR7aG9zdH06JHtTdHJpbmcocG9ydCl9YDtcbiAgY29uc3QgYXNhckZhbGxiYWNrID0gdHJhbnNwb3J0IGluc3RhbmNlb2YgRGVza3RvcENkcFRyYW5zcG9ydCA/IHRyYW5zcG9ydC5nZXRBc2FyRmFsbGJhY2soKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY29tcGF0aWJpbGl0eSA9IHRyYW5zcG9ydCBpbnN0YW5jZW9mIERlc2t0b3BDZHBUcmFuc3BvcnQgPyB0cmFuc3BvcnQuZ2V0Q29tcGF0aWJpbGl0eSgpIDogdW5kZWZpbmVkO1xuICBjb25zdCBlbGVjdHJvbkNvbXBhdGliaWxpdHkgPSB0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0ID8gdHJhbnNwb3J0LmdldEVsZWN0cm9uQ29tcGF0aWJpbGl0eSgpIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNvbm5lY3Rpb246IENkcENvbm5lY3Rpb24gPSB7XG4gICAgY2RwVXJsLFxuICAgIC4uLihhc2FyRmFsbGJhY2sgJiYgeyBhc2FyRmFsbGJhY2sgfSksXG4gICAgLi4uKGNvbXBhdGliaWxpdHkgJiYgeyBjb21wYXRpYmlsaXR5IH0pLFxuICAgIC4uLihlbGVjdHJvbkNvbXBhdGliaWxpdHkgJiYgeyBlbGVjdHJvbkNvbXBhdGliaWxpdHkgfSksXG5cbiAgICBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZVZhdWx0T25EaXNwb3NlKSB7XG4gICAgICAgICAgYXdhaXQgdmF1bHQuZGlzcG9zZSh0cmFuc3BvcnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRyYW5zcG9ydC51bnJlZ2lzdGVyVmF1bHQodmF1bHQucGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRyYW5zcG9ydC5kaXNwb3NlPy4oKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbEluT2JzaWRpYW48QXJncyBleHRlbmRzIEdlbmVyaWNPYmplY3QsIFJlc3VsdCwgVENvbnRleHRJZCBleHRlbmRzIENvbnRleHRJZDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gICAgICBwYXJhbXM6IEV4Y2VwdDxFdmFsSW5PYnNpZGlhblBhcmFtczxBcmdzLCBSZXN1bHQsIFRDb250ZXh0SWQ+LCAndHJhbnNwb3J0JyB8ICd2YXVsdFBhdGgnPlxuICAgICk6IFByb21pc2U8UmVzdWx0PiB7XG4gICAgICByZXR1cm4gZXZhbEluT2JzaWRpYW48QXJncywgUmVzdWx0LCBUQ29udGV4dElkPih7IC4uLnBhcmFtcywgdHJhbnNwb3J0LCB2YXVsdFBhdGg6IHZhdWx0LnBhdGggfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGludm9rZShleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgcmV0dXJuIHRyYW5zcG9ydC5ldmFsdWF0ZShleHByZXNzaW9uLCB7IGN3ZDogdmF1bHQucGF0aCB9KTtcbiAgICB9LFxuXG4gICAgcG9ydCxcblxuICAgIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uZGlzcG9zZSgpO1xuICAgIH0sXG5cbiAgICB2YXVsdFxuICB9O1xuXG4gIHJldHVybiBjb25uZWN0aW9uO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUge0BsaW5rIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9uc30gZm9yIGEgY29ubmVjdGlvbiwgdGhyZWFkaW5nIG9ubHlcbiAqIHRoZSBwcm92aWRlZCB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9uc30gdGhyb3VnaCAob3duZWQtdmlzaWJsZSBkZWZhdWx0cyB0b1xuICogYHRydWVgLCB1bmxpa2UgdGhlIGhpZGRlbi1ieS1kZWZhdWx0IHRlc3QgdHJhbnNwb3J0cykuIFVuc2V0IGtub2JzIHBhc3MgdGhyb3VnaFxuICogYXMgYHVuZGVmaW5lZGAgYW5kIGFyZSByZWFkIHdpdGggYD8/IGRlZmF1bHRgIC8gYCE9PSB1bmRlZmluZWRgIGd1YXJkc1xuICogZG93bnN0cmVhbSwgc28gYW4gZXhwbGljaXQgYHVuZGVmaW5lZGAgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBhYnNlbnQga2V5LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGNvbm5lY3Rpb24gb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSB0cmFuc3BvcnQgb3B0aW9ucyB0byBjcmVhdGUgdGhlIGNvbm5lY3Rpb24ncyB0cmFuc3BvcnQgZnJvbS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDZHBUcmFuc3BvcnRPcHRpb25zKG9wdGlvbnM/OiBDb25uZWN0VG9DZHBPcHRpb25zKTogT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnM+KHtcbiAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogb3B0aW9ucz8uZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzLFxuICAgIGhvc3Q6IG9wdGlvbnM/Lmhvc3QsXG4gICAgaXNPYnNpZGlhbkFwcFZpc2libGU6IG9wdGlvbnM/LmlzT2JzaWRpYW5BcHBWaXNpYmxlID8/IHRydWUsXG4gICAgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uOiBvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24sXG4gICAgb2JzaWRpYW5WZXJzaW9uOiBvcHRpb25zPy5vYnNpZGlhblZlcnNpb24sXG4gICAgcG9ydDogb3B0aW9ucz8ucG9ydCxcbiAgICBzaG91bGREaXNhYmxlU2FuZGJveDogb3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3gsXG4gICAgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogb3B0aW9ucz8uc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcixcbiAgICBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrOiBvcHRpb25zPy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrLFxuICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM6IG9wdGlvbnM/LnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMsXG4gICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIENEUCBob3N0L3BvcnQgZm9yIHRoZSBjb25uZWN0aW9uOiBmcm9tIHRoZSBvd25lZCBpbnN0YW5jZSdzXG4gKiBsYXVuY2hlZCBlbmRwb2ludCB3aGVuIHByZXNlbnQsIG90aGVyd2lzZSBmcm9tIHRoZSBhdHRhY2ggb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBjcmVhdGVkIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBjb25uZWN0aW9uIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgaG9zdCBhbmQgcG9ydC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHBvcnQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFbmRwb2ludCh0cmFuc3BvcnQ6IHVua25vd24sIG9wdGlvbnM6IENvbm5lY3RUb0NkcE9wdGlvbnMgfCB1bmRlZmluZWQpOiBSZXNvbHZlZEVuZHBvaW50IHtcbiAgaWYgKHRyYW5zcG9ydCBpbnN0YW5jZW9mIERlc2t0b3BDZHBUcmFuc3BvcnQpIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRyYW5zcG9ydC5nZXRPd25lZEluc3RhbmNlRW5kcG9pbnQoKTtcbiAgICBpZiAoZW5kcG9pbnQpIHtcbiAgICAgIHJldHVybiB7IGhvc3Q6IGVuZHBvaW50Lmhvc3QsIHBvcnQ6IGVuZHBvaW50LnBvcnQgfTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucz8ucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgaG9zdDogb3B0aW9ucy5ob3N0ID8/IERFRkFVTFRfQ0RQX0hPU1QsIHBvcnQ6IG9wdGlvbnMucG9ydCB9O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdjb25uZWN0VG9DZHA6IGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIENEUCBwb3J0LicpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTJCQSw4QkFBK0I7QUFDL0IsMkNBQTRDO0FBQzVDLHdCQUEwQjtBQUMxQixtQ0FBb0M7QUFDcEMsK0JBQTJDO0FBRTNDLE1BQU0sbUJBQW1CO0FBd1B6QixlQUFzQixhQUFhLFNBQXVEO0FBQ3hGLFFBQU0sWUFBWSxVQUFNLHFEQUEyQix5QkFBeUIsT0FBTyxDQUFDO0FBQ3BGLFFBQU0sUUFBUSxJQUFJLDRCQUFVLFNBQVMsS0FBSztBQUMxQyxRQUFNLDZCQUE2QixTQUFTLDhCQUErQixTQUFTLFVBQVU7QUFLOUYsUUFBTSxNQUFNLFNBQVMsU0FBUztBQUU5QixRQUFNLEVBQUUsTUFBTSxLQUFLLElBQUksZ0JBQWdCLFdBQVcsT0FBTztBQUN6RCxRQUFNLFNBQVMsVUFBVSxJQUFJLElBQUksT0FBTyxJQUFJLENBQUM7QUFDN0MsUUFBTSxlQUFlLHFCQUFxQixtREFBc0IsVUFBVSxnQkFBZ0IsSUFBSTtBQUM5RixRQUFNLGdCQUFnQixxQkFBcUIsbURBQXNCLFVBQVUsaUJBQWlCLElBQUk7QUFDaEcsUUFBTSx3QkFBd0IscUJBQXFCLG1EQUFzQixVQUFVLHlCQUF5QixJQUFJO0FBRWhILFFBQU0sYUFBNEI7QUFBQSxJQUNoQztBQUFBLElBQ0EsR0FBSSxnQkFBZ0IsRUFBRSxhQUFhO0FBQUEsSUFDbkMsR0FBSSxpQkFBaUIsRUFBRSxjQUFjO0FBQUEsSUFDckMsR0FBSSx5QkFBeUIsRUFBRSxzQkFBc0I7QUFBQSxJQUVyRCxNQUFNLFVBQXlCO0FBQzdCLFVBQUk7QUFDRixZQUFJLDRCQUE0QjtBQUM5QixnQkFBTSxNQUFNLFFBQVEsU0FBUztBQUFBLFFBQy9CLE9BQU87QUFDTCxnQkFBTSxVQUFVLGdCQUFnQixNQUFNLElBQUk7QUFBQSxRQUM1QztBQUFBLE1BQ0YsVUFBRTtBQUNBLGNBQU0sVUFBVSxVQUFVO0FBQUEsTUFDNUI7QUFBQSxJQUNGO0FBQUEsSUFFQSxNQUFNLGVBQ0osUUFDaUI7QUFDakIsaUJBQU8sd0NBQXlDLEVBQUUsR0FBRyxRQUFRLFdBQVcsV0FBVyxNQUFNLEtBQUssQ0FBQztBQUFBLElBQ2pHO0FBQUEsSUFFQSxNQUFNLE9BQU8sWUFBcUM7QUFDaEQsYUFBTyxVQUFVLFNBQVMsWUFBWSxFQUFFLEtBQUssTUFBTSxLQUFLLENBQUM7QUFBQSxJQUMzRDtBQUFBLElBRUE7QUFBQSxJQUVBLE9BQU8sT0FBTyxZQUFZLElBQW1CO0FBQzNDLFlBQU0sV0FBVyxRQUFRO0FBQUEsSUFDM0I7QUFBQSxJQUVBO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVlBLFNBQVMseUJBQXlCLFNBQTREO0FBQzVGLGFBQU8sa0VBQXlEO0FBQUEsSUFDOUQsOEJBQThCLFNBQVM7QUFBQSxJQUN2Qyw2QkFBNkIsU0FBUztBQUFBLElBQ3RDLE1BQU0sU0FBUztBQUFBLElBQ2Ysc0JBQXNCLFNBQVMsd0JBQXdCO0FBQUEsSUFDdkQsMEJBQTBCLFNBQVM7QUFBQSxJQUNuQyxpQkFBaUIsU0FBUztBQUFBLElBQzFCLE1BQU0sU0FBUztBQUFBLElBQ2Ysc0JBQXNCLFNBQVM7QUFBQSxJQUMvQixvQ0FBb0MsU0FBUztBQUFBLElBQzdDLGlDQUFpQyxTQUFTO0FBQUEsSUFDMUMsaUNBQWlDLFNBQVM7QUFBQSxJQUMxQyxNQUFNO0FBQUEsRUFDUixDQUFDO0FBQ0g7QUFXQSxTQUFTLGdCQUFnQixXQUFvQixTQUE0RDtBQUN2RyxNQUFJLHFCQUFxQixrREFBcUI7QUFDNUMsVUFBTSxXQUFXLFVBQVUseUJBQXlCO0FBQ3BELFFBQUksVUFBVTtBQUNaLGFBQU8sRUFBRSxNQUFNLFNBQVMsTUFBTSxNQUFNLFNBQVMsS0FBSztBQUFBLElBQ3BEO0FBQUEsRUFDRjtBQUVBLE1BQUksU0FBUyxTQUFTLFFBQVc7QUFDL0IsV0FBTyxFQUFFLE1BQU0sUUFBUSxRQUFRLGtCQUFrQixNQUFNLFFBQVEsS0FBSztBQUFBLEVBQ3RFO0FBRUEsUUFBTSxJQUFJLE1BQU0saURBQWlEO0FBQ25FOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Nvbm5lY3QtdG8tY2RwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHJvZ3JhbW1hdGljIGhlbHBlciB0byBsYXVuY2ggKG9yIGF0dGFjaCB0bykgYSBDRFAtZW5hYmxlZCBPYnNpZGlhbiBpbnN0YW5jZVxuICogd2l0aCB0aGUgcnVudGltZSBoZWxwZXIgbmFtZXNwYWNlIGJvb3RzdHJhcHBlZCwgZm9yIGFkLWhvYyByZWFsLWFwcCBkZWJ1Z2dpbmcuXG4gKlxuICogQSBzaW5nbGUge0BsaW5rIGNvbm5lY3RUb0NkcH0gY2FsbCByZXNvbHZlcyB0aGUgb3duZWQtaW5zdGFuY2UgY29uZmlnLCBvcGVucyBhXG4gKiB2YXVsdCwgYW5kIGJvb3RzdHJhcHMgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCAoc28gYGV2YWxXcmFwcGVyYCxcbiAqIHRoZSBiYXNlIGBsaWJgIGhlbHBlcnMsIGBlcnJvclRvU3RyaW5nYCwgYGdldE9ic2lkaWFuTW9kdWxlYCwgXHUyMDI2IGFyZSBhdmFpbGFibGUpLCB0aGVuXG4gKiBoYW5kcyBiYWNrIGEgZGlzcG9zYWJsZSB7QGxpbmsgQ2RwQ29ubmVjdGlvbn0gZXhwb3NpbmcgdGhlIGNob3NlbiBDRFAgcG9ydCwgYVxuICogcmF3IHtAbGluayBDZHBDb25uZWN0aW9uLmludm9rZX0gYW5kIHRoZSByaWNoIHtAbGluayBDZHBDb25uZWN0aW9uLmV2YWxJbk9ic2lkaWFufS5cbiAqL1xuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gSW50ZWdyYXRpb24tdGltZSBjb2RlIChsYXVuY2hlcyBPYnNpZGlhbiAvIENEUCkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgRXhjZXB0IH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHR5cGUgeyBBc2FyRmFsbGJhY2sgfSBmcm9tICcuL2FzYXItZmFsbGJhY2stZGV0ZWN0aW9uLmNqcyc7XG5pbXBvcnQgdHlwZSB7IENvbnRleHRJZCB9IGZyb20gJy4vY29udGV4dC1pZC5janMnO1xuaW1wb3J0IHR5cGUgeyBFbGVjdHJvbkNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2VsZWN0cm9uLWNvbXBhdGliaWxpdHkuY2pzJztcbmltcG9ydCB0eXBlIHtcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIEdlbmVyaWNPYmplY3Rcbn0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLmNqcyc7XG5pbXBvcnQgdHlwZSB7IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5LmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMuY2pzJztcblxuaW1wb3J0IHsgZXZhbEluT2JzaWRpYW4gfSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4uY2pzJztcbmltcG9ydCB7XG4gIHJlc29sdmVMZWZ0b3Zlck1heEFnZUluTWlsbGlzZWNvbmRzLFxuICByZXNvbHZlU2hvdWxkU3dlZXBMZWZ0b3ZlcnMsXG4gIHN3ZWVwSG9zdExlZnRvdmVyc1xufSBmcm9tICcuL2xlZnRvdmVyLWNsZWFudXAuY2pzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLmNqcyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuL25vcm1hbGl6ZS1vcHRpb25hbC1wcm9wZXJ0aWVzLmNqcyc7XG5pbXBvcnQgeyBUZW1wVmF1bHQgfSBmcm9tICcuL3RlbXAtdmF1bHQuY2pzJztcbmltcG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5janMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5cbmNvbnN0IERFRkFVTFRfQ0RQX0hPU1QgPSAnbG9jYWxob3N0JztcblxuLyoqXG4gKiBBIGxpdmUgY29ubmVjdGlvbiB0byBhIENEUC1lbmFibGVkIE9ic2lkaWFuIGluc3RhbmNlIHdpdGggdGhlIHJ1bnRpbWUgaGVscGVyXG4gKiBuYW1lc3BhY2UgYm9vdHN0cmFwcGVkLlxuICpcbiAqIEltcGxlbWVudHMgYEFzeW5jRGlzcG9zYWJsZWAsIHNvIGBhd2FpdCB1c2luZyBjb25uID0gYXdhaXQgY29ubmVjdFRvQ2RwKFx1MjAyNilgXG4gKiBkaXNwb3NlcyBpdCAoa2lsbGluZyBhbiBvd25lZCBpbnN0YW5jZSBhbmQgXHUyMDE0IGZvciBhIHRocm93LWF3YXkgdGVtcCB2YXVsdCBcdTIwMTRcbiAqIHJlbW92aW5nIGl0cyBkaXJlY3RvcnkpIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2RwQ29ubmVjdGlvbiBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBUaGUgc2lsZW50LWFzYXItZmFsbGJhY2sgdmVyZGljdCBmb3IgYW4gb3duZWQgaW5zdGFuY2UsIHJlYWQgbGl2ZSBhZnRlciBib290OlxuICAgKiB3aGV0aGVyIHRoZSBhcHAgdmVyc2lvbiBpdCBpcyBhY3R1YWxseSBydW5uaW5nIG1hdGNoZXMgdGhlIHN3YXBwZWQtaW4gcGluLCBvclxuICAgKiB0aGUgaW5zdGFsbGVyIHNpbGVudGx5IHJldmVydGVkIHRvIGl0cyBvd24gYnVuZGxlZCBhc2FyLiBgdW5kZWZpbmVkYCBpbiBhdHRhY2hcbiAgICogbW9kZSwgd2hlbiBubyBhc2FyIHdhcyBzd2FwcGVkLCBvciB3aGVuIHRoZSBydW5uaW5nIHZlcnNpb24gd2FzIHVucmVhZGFibGUuIEFcbiAgICogYCdmYWxsYmFjaydgIHZlcmRpY3QgcmVhY2hlcyBoZXJlIG9ubHkgd2hlbiB0aGUgdGhyb3cgaXMgZGlzYWJsZWRcbiAgICogKHtAbGluayBDb25uZWN0VG9DZHBPcHRpb25zLnNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2t9IGBmYWxzZWApO1xuICAgKiBvdGhlcndpc2UgaXQgdGhyb3dzIGBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcmAgYmVmb3JlIHRoZSBjb25uZWN0aW9uIGlzIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBhc2FyRmFsbGJhY2s/OiBBc2FyRmFsbGJhY2sgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBiYXNlIENEUCBVUkwsIGUuZy4gYGh0dHA6Ly9sb2NhbGhvc3Q6NTE4ODhgLlxuICAgKi9cbiAgcmVhZG9ubHkgY2RwVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvbHZlZCBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSB2ZXJkaWN0IGZvciBhbiBvd25lZCBpbnN0YW5jZSwgd2hlblxuICAgKiBpdCBjb3VsZCBiZSBkZXRlcm1pbmVkLiBgdW5kZWZpbmVkYCBpbiBhdHRhY2ggbW9kZSwgb3Igd2hlbiB0aGUgdmVyZGljdCBpc1xuICAgKiB1bmtub3duICh1bmRldGVjdGFibGUgc2hlbGwgdmVyc2lvbiwgb3IgdGhlIGFwcCB2ZXJzaW9uIGlzIGFic2VudCBmcm9tIHRoZVxuICAgKiB0YWJsZSkuIEFuIGAndW5ydW5uYWJsZSdgIHZlcmRpY3QgcmVhY2hlcyBoZXJlIG9ubHkgd2hlbiB0aGUgcHJvYWN0aXZlIHRocm93XG4gICAqIGlzIGRpc2FibGVkICh7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9ucy5zaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyfVxuICAgKiBgZmFsc2VgKTsgb3RoZXJ3aXNlIGl0IHRocm93cyBgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yYCBiZWZvcmUgdGhlXG4gICAqIGNvbm5lY3Rpb24gaXMgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBhdGliaWxpdHk/OiBJbnN0YWxsZXJDb21wYXRpYmlsaXR5IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgY29ubmVjdGlvbjoga2lsbHMgYW4gb3duZWQgaW5zdGFuY2UgYW5kIHJlbW92ZXMgaXRzIGlzb2xhdGVkXG4gICAqIHVzZXItZGF0YSBkaXIuIFRoZSB2YXVsdCBkaXJlY3RvcnkgaXMgcmVtb3ZlZCBvbmx5IHdoZW4gaXQgaXMgYSB0aHJvdy1hd2F5XG4gICAqIHRlbXAgdmF1bHQgKHNlZSB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9ucy5zaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZX0pOyBhXG4gICAqIHJlYWwgdmF1bHQgcGFzc2VkIHZpYSB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9ucy52YXVsdH0gaXMgbmV2ZXIgZGVsZXRlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIGRpc3Bvc2FsIGNvbXBsZXRlcy5cbiAgICovXG4gIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIHJ1bnRpbWUgRWxlY3Ryb24gY29tcGF0aWJpbGl0eSB2ZXJkaWN0IGZvciBhbiBvd25lZCBpbnN0YW5jZSwgcmVhZCBsaXZlXG4gICAqIGFmdGVyIGJvb3Q6IHdoZXRoZXIgdGhlIEVsZWN0cm9uIHZlcnNpb24gaXQgaXMgYWN0dWFsbHkgcnVubmluZyBpcyBuZXcgZW5vdWdoXG4gICAqIGZvciB0aGUgcnVubmluZyBhcHAgdmVyc2lvbi4gYHVuZGVmaW5lZGAgaW4gYXR0YWNoIG1vZGUsIG9yIHdoZW4gdGhlIHZlcmRpY3RcbiAgICogaXMgdW5rbm93biAodGhlIGxpdmUgdmVyc2lvbiB3YXMgdW5yZWFkYWJsZSwgb3IgdGhlIGFwcCB2ZXJzaW9uIGNhcnJpZXMgbm9cbiAgICogcmVjb21tZW5kZWQgRWxlY3Ryb24gdmVyc2lvbikuIEFuIG9sZCBFbGVjdHJvbiBuZXZlciBibG9ja3MgXHUyMDE0IGl0IG9ubHkgd2FybnMgXHUyMDE0XG4gICAqIHNvIHVubGlrZSB7QGxpbmsgY29tcGF0aWJpbGl0eX0gdGhlcmUgaXMgbm8gdGhyb3dpbmcgdGllci5cbiAgICovXG4gIHJlYWRvbmx5IGVsZWN0cm9uQ29tcGF0aWJpbGl0eT86IEVsZWN0cm9uQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgc2VsZi1jb250YWluZWQgZnVuY3Rpb24gaW5zaWRlIE9ic2lkaWFuIHZpYSB0aGUgcmljaCBoZWxwZXJcbiAgICogcGF0aCwgcmVjZWl2aW5nIGB7IGFwcCwgbGliLCBvYnNpZGlhbk1vZHVsZSwgY29udGV4dCB9YCBwbHVzIGFueSBgYXJnc2BcbiAgICogKHNoYXJlZCBoZWxwZXJzIGxpa2UgYHR5cGVJbnRvRWRpdG9yYCAvIGB3YWl0VW50aWxgIGxpdmUgb24gYGxpYmApLiBNaXJyb3JzXG4gICAqIHRoZSB0b3AtbGV2ZWwgYGV2YWxJbk9ic2lkaWFuYCwgd2l0aCB0aGUgdHJhbnNwb3J0IGFuZCB2YXVsdCBwYXRoIHByZS1ib3VuZFxuICAgKiB0byB0aGlzIGNvbm5lY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZXZhbHVhdGlvbiBwYXJhbWV0ZXJzIChgZm5gLCBvcHRpb25hbCBgYXJnc2AvYGNvbnRleHRJZGApLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgYGZuYC5cbiAgICovXG4gIGV2YWxJbk9ic2lkaWFuPEFyZ3MgZXh0ZW5kcyBHZW5lcmljT2JqZWN0LCBSZXN1bHQsIFRDb250ZXh0SWQgZXh0ZW5kcyBDb250ZXh0SWQ8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+KFxuICAgIHBhcmFtczogRXhjZXB0PEV2YWxJbk9ic2lkaWFuUGFyYW1zPEFyZ3MsIFJlc3VsdCwgVENvbnRleHRJZD4sICd0cmFuc3BvcnQnIHwgJ3ZhdWx0UGF0aCc+XG4gICk6IFByb21pc2U8UmVzdWx0PjtcblxuICAvKipcbiAgICogRXZhbHVhdGVzIGEgcmF3IEphdmFTY3JpcHQgZXhwcmVzc2lvbiBpbnNpZGUgT2JzaWRpYW4gYW5kIHJldHVybnMgdGhlXG4gICAqIG5vcm1hbGl6ZWQgc3RyaW5nIHJlc3VsdCAoZS5nLiBgJzUnYCwgYSBKU09OIHN0cmluZywgb3IgYCcobm8gb3V0cHV0KSdgKS5cbiAgICpcbiAgICogQHBhcmFtIGV4cHJlc3Npb24gLSBBIHNlbGYtY29udGFpbmVkIEphdmFTY3JpcHQgZXhwcmVzc2lvbi5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmF3IHJlc3VsdCBzdHJpbmcuXG4gICAqL1xuICBpbnZva2UoZXhwcmVzc2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgQ0RQIHBvcnQgdGhlIGluc3RhbmNlIGlzIHJlYWNoYWJsZSBvbiAodGhlIGZyZWUgcG9ydCBjaG9zZW4gZm9yIGFuXG4gICAqIG93bmVkIGluc3RhbmNlLCBvciB0aGUgYXR0YWNoZWQge0BsaW5rIENvbm5lY3RUb0NkcE9wdGlvbnMucG9ydH0pLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlbmVkIHZhdWx0LiBFeHBvc2VzIGBwYXRoYCBhbmQgYHBvcHVsYXRlKC4uLilgIGZvciBzZWVkaW5nIGZpbGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgdmF1bHQ6IFRlbXBWYXVsdDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY29ubmVjdFRvQ2RwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0VG9DZHBPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciBpbmRpdmlkdWFsIENEUCBjb21tYW5kcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDMwMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogR3JhY2Ugd2luZG93IGluIG1pbGxpc2Vjb25kcyBmb3IgZmFzdC1mYWlsaW5nIGEgZGVhZCBib290IG9mIHRoZSBvd25lZFxuICAgKiBpbnN0YW5jZSBcdTIwMTQgdGhlIHJlbmRlcmVyIGxvYWRlZCBidXQgdGhlIGFwcCBuZXZlciBib290c3RyYXBwZWQgKGVtcHR5XG4gICAqIGA8Ym9keT5gLCBubyBgd2luZG93LmFwcGApLCB0aGUgdGVybWluYWwgc3RhdGUgd2hlbiB0aGUgYXNhciBjYW5ub3QgcnVuIG9uXG4gICAqIHRoZSBsYXVuY2hlZCBFbGVjdHJvbiBzaGVsbC4gT25jZSBpdCBoYXMgaGVsZCB0aGlzIGxvbmcgYVxuICAgKiBgUmVuZGVyZXJGYWlsZWRUb0luaXRpYWxpemVFcnJvcmAgaXMgdGhyb3duIGluc3RlYWQgb2Ygd2FpdGluZyBvdXQgdGhlIGZ1bGxcbiAgICogcmVhZGluZXNzIHRpbWVvdXQuIElnbm9yZWQgaW4gYXR0YWNoIG1vZGUgKHtAbGluayBwb3J0fSBzZXQpLiBTZXQgYDBgIHRvXG4gICAqIGRpc2FibGUgZmFzdC1mYWlsLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgMTAwMDBgXG4gICAqL1xuICByZWFkb25seSBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENEUCBob3N0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2xvY2FsaG9zdCdgXG4gICAqL1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBPYnNpZGlhbiB3aW5kb3cgaXMgc2hvd24gb24gc2NyZWVuLiBEZWZhdWx0cyB0byBgdHJ1ZWA7IHNldFxuICAgKiBgZmFsc2VgIHRvIGxhdW5jaCBpdCBvZmYtc2NyZWVuLlxuICAgKiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBpc09ic2lkaWFuQXBwVmlzaWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFBpbnMgdGhlIEVsZWN0cm9uIHNoZWxsIChpbnN0YWxsZXIgYnVpbGQpIHRoZSBvd25lZCBpbnN0YW5jZSBydW5zLiBBY2NlcHRzXG4gICAqIGAneC55LnonYCwgYCdwdWJsaWMtbGF0ZXN0J2AsIG9yIGAnY2F0YWx5c3QtbGF0ZXN0J2AuIElnbm9yZWQgd2hlblxuICAgKiB7QGxpbmsgcG9ydH0gKGF0dGFjaCBtb2RlKSBpcyBzZXQuIFdoZW4gb21pdHRlZCwgdGhlIGluc3RhbGxlZCBzaGVsbCBpcyB1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQaW5zIHRoZSBPYnNpZGlhbiBhcHAgdmVyc2lvbiAoYXNhcikgdGhlIG93bmVkIGluc3RhbmNlIHJ1bnMuIEFjY2VwdHNcbiAgICogYCd4LnkueidgLCBgJ3B1YmxpYy1sYXRlc3QnYCwgb3IgYCdjYXRhbHlzdC1sYXRlc3QnYC4gSWdub3JlZCB3aGVuXG4gICAqIHtAbGluayBwb3J0fSAoYXR0YWNoIG1vZGUpIGlzIHNldC4gV2hlbiBvbWl0dGVkLCB0aGUgaW5zdGFsbGVkIHZlcnNpb24gaXMgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IG9ic2lkaWFuVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQ0RQIHBvcnQgb2YgYW4gYWxyZWFkeS1ydW5uaW5nIE9ic2lkaWFuIHRvICoqYXR0YWNoKiogdG8uIFdoZW4gb21pdHRlZCwgYW5cbiAgICogaXNvbGF0ZWQgaW5zdGFuY2UgaXMgbGF1bmNoZWQgb24gYW4gYXV0b21hdGljYWxseSBjaG9zZW4gZnJlZSBwb3J0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdW5kZWZpbmVkYFxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBsYXVuY2ggdGhlIG93bmVkIGluc3RhbmNlIHdpdGggQ2hyb21pdW0ncyBzYW5kYm94IGRpc2FibGVkXG4gICAqIChgLS1uby1zYW5kYm94YCkuXG4gICAqXG4gICAqIE5lZWRlZCB0byBib290IG9uIExpbnV4IHdpdGhvdXQgYSBjb3JyZWN0bHktY29uZmlndXJlZCBzZXR1aWRcbiAgICogYGNocm9tZS1zYW5kYm94YCBoZWxwZXIgKGUuZy4gYW4gaW5zdGFsbGVyLWV4dHJhY3RlZCBwb3J0YWJsZSBzaGVsbCwgb3IgQ0lcbiAgICogcnVubmluZyBhcyBhIG5vbi1yb290IHVzZXIpOyBoYXJtbGVzcyBvbiBXaW5kb3dzL21hY09TLiBJZ25vcmVkIGluIGF0dGFjaFxuICAgKiBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRGlzYWJsZVNhbmRib3g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbW92ZSB0aGUgdmF1bHQgZGlyZWN0b3J5IG9uIHtAbGluayBDZHBDb25uZWN0aW9uLmRpc3Bvc2V9LlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGRlZmF1bHRzIHRvIGB0cnVlYCBmb3IgYW4gaW1wbGljaXQgdGhyb3ctYXdheSB0ZW1wIHZhdWx0XG4gICAqICh7QGxpbmsgdmF1bHR9IG5vdCBnaXZlbikgYW5kIGBmYWxzZWAgd2hlbiBhIHtAbGluayB2YXVsdH0gcGF0aCBpcyBnaXZlbiwgc29cbiAgICogYSByZWFsIHZhdWx0IGlzIG5ldmVyIGRlbGV0ZWQuIFNldCBleHBsaWNpdGx5IHRvIG92ZXJyaWRlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuICoqdW5ydW5uYWJsZSoqIGluc3RhbGxlclx1MjE5NGFwcCB2ZXJzaW9uIHBhaXIgZmFpbHMgZmFzdCBiZWZvcmUgbGF1bmNoLlxuICAgKlxuICAgKiBXaGVuIGB0cnVlYCAodGhlIGRlZmF1bHQpLCBhbiBpbnN0YWxsZXIgYmVsb3cgdGhlIGFwcCdzIHJ1biBmbG9vciB0aHJvd3NcbiAgICogYEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcmAgZnJvbSB2ZXJzaW9uIHJlc29sdXRpb24gYmVmb3JlIGFueXRoaW5nIGlzXG4gICAqIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQuIFNldCBgZmFsc2VgIHRvIGxldCB0aGUgcGluIHByb2NlZWQgdG8gbGF1bmNoIFx1MjAxNCB3aGVyZVxuICAgKiB0aGUgcmVhY3RpdmUgZGVhZC1ib290IGZhc3QtZmFpbCBzdGlsbCBjYXRjaGVzIHRoZSBibGFjay1zY3JlZW4gYm9vdCwgYW5kIHRoZVxuICAgKiBgJ3VucnVubmFibGUnYCB2ZXJkaWN0IGlzIHN1cmZhY2VkIG9uIHtAbGluayBDZHBDb25uZWN0aW9uLmNvbXBhdGliaWxpdHl9XG4gICAqIHJhdGhlciB0aGFuIHRocm93bi4gSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIHBvcnR9IHNldCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBwb3N0LWJvb3QgKipzaWxlbnQgYXNhciBmYWxsYmFjayoqIGZhaWxzIGZhc3QuXG4gICAqXG4gICAqIFdoZW4gYW4gYXNhciBpcyBzd2FwcGVkIG9udG8gYW4gaW5zdGFsbGVyIHNoZWxsIHRvbyBvbGQgZm9yIGl0LCB0aGUgaW5zdGFuY2VcbiAgICogbWF5IHNpbGVudGx5IHJldmVydCB0byB0aGUgaW5zdGFsbGVyJ3Mgb3duIGJ1bmRsZWQgYXNhciBhbmQgcnVuIHRoZSAqKndyb25nXG4gICAqIChvbGRlcikqKiB2ZXJzaW9uIGJlaGluZCBhIGhlYWx0aHkgVUkuIFdoZW4gYHRydWVgICh0aGUgZGVmYXVsdCksIHRoZSBydW5uaW5nXG4gICAqIGFwcCB2ZXJzaW9uIGlzIHZlcmlmaWVkIGFnYWluc3QgdGhlIHBpbiBwb3N0LWJvb3QgYW5kIGEgbWlzbWF0Y2ggdGhyb3dzXG4gICAqIGBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvcmAuIFNldCBgZmFsc2VgIHRvIGxldCB0aGUgYm9vdCBwcm9jZWVkIFx1MjAxNCB0aGUgbWlzbWF0Y2hcbiAgICogaXMgdGhlbiBzdXJmYWNlZCBvbiB7QGxpbmsgQ2RwQ29ubmVjdGlvbi5hc2FyRmFsbGJhY2t9IHJhdGhlciB0aGFuIHRocm93bi5cbiAgICogSWdub3JlZCBpbiBhdHRhY2ggbW9kZSAoe0BsaW5rIHBvcnR9IHNldCkgYW5kIHdoZW4gbm8gYXNhciBpcyBzd2FwcGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgdHJ1ZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBvd25lZC1pbnN0YW5jZSBjb21wYXRpYmlsaXR5ICoqbmFnIHdhcm5pbmdzKiogYXJlIGVtaXR0ZWQuXG4gICAqXG4gICAqIENvdmVycyBib3RoIHRoZSBvZmZsaW5lIGluc3RhbGxlclx1MjE5NGFwcCB3YXJuaW5nIGFuZCB0aGUgcG9zdC1ib290XG4gICAqIHJ1bnRpbWUtRWxlY3Ryb24gd2FybmluZy4gV2hlbiBgdHJ1ZWAgKHRoZSBkZWZhdWx0KSBlYWNoIGZpcmVzIHZpYSB0aGUgaGFybmVzc1xuICAgKiBsb2c7IHNldCBgZmFsc2VgIHRvIHNpbGVuY2UgYm90aCBcdTIwMTQgdGhlIHZlcmRpY3RzIGFyZSBzdGlsbCBzdXJmYWNlZCBvblxuICAgKiB7QGxpbmsgQ2RwQ29ubmVjdGlvbi5jb21wYXRpYmlsaXR5fSAvIHtAbGluayBDZHBDb25uZWN0aW9uLmVsZWN0cm9uQ29tcGF0aWJpbGl0eX0sXG4gICAqIG9ubHkgdGhlIGxvZyBpcyBzdXBwcmVzc2VkLiBJZ25vcmVkIGluIGF0dGFjaCBtb2RlICh7QGxpbmsgcG9ydH0gc2V0KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHRydWVgXG4gICAqL1xuICByZWFkb25seSBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byBhbiBleGlzdGluZyB2YXVsdCB0byBvcGVuLiBXaGVuIG9taXR0ZWQsIGFuIGVtcHR5IHRlbXBvcmFyeVxuICAgKiB2YXVsdCBpcyBjcmVhdGVkIChhbmQgcmVtb3ZlZCBvbiBkaXNwb3NlIHVubGVzc1xuICAgKiB7QGxpbmsgc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2V9IHNheXMgb3RoZXJ3aXNlKS5cbiAgICpcbiAgICogQGRlZmF1bHQgYHVuZGVmaW5lZGBcbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcmVzb2x2ZWQgQ0RQIGhvc3QvcG9ydCBwYWlyLlxuICovXG5pbnRlcmZhY2UgUmVzb2x2ZWRFbmRwb2ludCB7XG4gIGhvc3Q6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIExhdW5jaGVzIChvciBhdHRhY2hlcyB0bykgYSBDRFAtZW5hYmxlZCBPYnNpZGlhbiBpbnN0YW5jZSwgb3BlbnMgYSB2YXVsdCwgYW5kXG4gKiBib290c3RyYXBzIHRoZSBydW50aW1lIGhlbHBlciBuYW1lc3BhY2UsIHJldHVybmluZyBhIGRpc3Bvc2FibGUgY29ubmVjdGlvbi5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbm5lY3Rpb24gb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGxpdmUge0BsaW5rIENkcENvbm5lY3Rpb259LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdFRvQ2RwKG9wdGlvbnM/OiBDb25uZWN0VG9DZHBPcHRpb25zKTogUHJvbWlzZTxDZHBDb25uZWN0aW9uPiB7XG4gIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSBidWlsZENkcFRyYW5zcG9ydE9wdGlvbnMob3B0aW9ucyk7XG4gIGF3YWl0IHN3ZWVwTGVmdG92ZXJzKHRyYW5zcG9ydE9wdGlvbnMpO1xuICBjb25zdCB0cmFuc3BvcnQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zKTtcbiAgY29uc3QgdmF1bHQgPSBuZXcgVGVtcFZhdWx0KG9wdGlvbnM/LnZhdWx0KTtcbiAgY29uc3Qgc2hvdWxkUmVtb3ZlVmF1bHRPbkRpc3Bvc2UgPSBvcHRpb25zPy5zaG91bGRSZW1vdmVWYXVsdE9uRGlzcG9zZSA/PyAob3B0aW9ucz8udmF1bHQgPT09IHVuZGVmaW5lZCk7XG5cbiAgLy8gUmVnaXN0ZXJpbmcgdGhlIHZhdWx0IGlzIHdoYXQgbGF1bmNoZXMgdGhlIG93bmVkIGluc3RhbmNlIChwcm92aXNpb25zIHRoZVxuICAvLyBBc2FyLCBvcGVucyB0aGUgdmF1bHQsIGFuZCBib290c3RyYXBzIHRoZSBoZWxwZXIgbmFtZXNwYWNlKSwgb3Igb3BlbnMgdGhlXG4gIC8vIFZhdWx0IGluIHRoZSBhdHRhY2hlZCBpbnN0YW5jZS5cbiAgYXdhaXQgdmF1bHQucmVnaXN0ZXIodHJhbnNwb3J0KTtcblxuICBjb25zdCB7IGhvc3QsIHBvcnQgfSA9IHJlc29sdmVFbmRwb2ludCh0cmFuc3BvcnQsIG9wdGlvbnMpO1xuICBjb25zdCBjZHBVcmwgPSBgaHR0cDovLyR7aG9zdH06JHtTdHJpbmcocG9ydCl9YDtcbiAgY29uc3QgYXNhckZhbGxiYWNrID0gdHJhbnNwb3J0IGluc3RhbmNlb2YgRGVza3RvcENkcFRyYW5zcG9ydCA/IHRyYW5zcG9ydC5nZXRBc2FyRmFsbGJhY2soKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY29tcGF0aWJpbGl0eSA9IHRyYW5zcG9ydCBpbnN0YW5jZW9mIERlc2t0b3BDZHBUcmFuc3BvcnQgPyB0cmFuc3BvcnQuZ2V0Q29tcGF0aWJpbGl0eSgpIDogdW5kZWZpbmVkO1xuICBjb25zdCBlbGVjdHJvbkNvbXBhdGliaWxpdHkgPSB0cmFuc3BvcnQgaW5zdGFuY2VvZiBEZXNrdG9wQ2RwVHJhbnNwb3J0ID8gdHJhbnNwb3J0LmdldEVsZWN0cm9uQ29tcGF0aWJpbGl0eSgpIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNvbm5lY3Rpb246IENkcENvbm5lY3Rpb24gPSB7XG4gICAgY2RwVXJsLFxuICAgIC4uLihhc2FyRmFsbGJhY2sgJiYgeyBhc2FyRmFsbGJhY2sgfSksXG4gICAgLi4uKGNvbXBhdGliaWxpdHkgJiYgeyBjb21wYXRpYmlsaXR5IH0pLFxuICAgIC4uLihlbGVjdHJvbkNvbXBhdGliaWxpdHkgJiYgeyBlbGVjdHJvbkNvbXBhdGliaWxpdHkgfSksXG5cbiAgICBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHNob3VsZFJlbW92ZVZhdWx0T25EaXNwb3NlKSB7XG4gICAgICAgICAgYXdhaXQgdmF1bHQuZGlzcG9zZSh0cmFuc3BvcnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IHRyYW5zcG9ydC51bnJlZ2lzdGVyVmF1bHQodmF1bHQucGF0aCk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGF3YWl0IHRyYW5zcG9ydC5kaXNwb3NlPy4oKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbEluT2JzaWRpYW48QXJncyBleHRlbmRzIEdlbmVyaWNPYmplY3QsIFJlc3VsdCwgVENvbnRleHRJZCBleHRlbmRzIENvbnRleHRJZDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gICAgICBwYXJhbXM6IEV4Y2VwdDxFdmFsSW5PYnNpZGlhblBhcmFtczxBcmdzLCBSZXN1bHQsIFRDb250ZXh0SWQ+LCAndHJhbnNwb3J0JyB8ICd2YXVsdFBhdGgnPlxuICAgICk6IFByb21pc2U8UmVzdWx0PiB7XG4gICAgICByZXR1cm4gZXZhbEluT2JzaWRpYW48QXJncywgUmVzdWx0LCBUQ29udGV4dElkPih7IC4uLnBhcmFtcywgdHJhbnNwb3J0LCB2YXVsdFBhdGg6IHZhdWx0LnBhdGggfSk7XG4gICAgfSxcblxuICAgIGFzeW5jIGludm9rZShleHByZXNzaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgcmV0dXJuIHRyYW5zcG9ydC5ldmFsdWF0ZShleHByZXNzaW9uLCB7IGN3ZDogdmF1bHQucGF0aCB9KTtcbiAgICB9LFxuXG4gICAgcG9ydCxcblxuICAgIGFzeW5jIFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IGNvbm5lY3Rpb24uZGlzcG9zZSgpO1xuICAgIH0sXG5cbiAgICB2YXVsdFxuICB9O1xuXG4gIHJldHVybiBjb25uZWN0aW9uO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUge0BsaW5rIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9uc30gZm9yIGEgY29ubmVjdGlvbiwgdGhyZWFkaW5nIG9ubHlcbiAqIHRoZSBwcm92aWRlZCB7QGxpbmsgQ29ubmVjdFRvQ2RwT3B0aW9uc30gdGhyb3VnaCAob3duZWQtdmlzaWJsZSBkZWZhdWx0cyB0b1xuICogYHRydWVgLCB1bmxpa2UgdGhlIGhpZGRlbi1ieS1kZWZhdWx0IHRlc3QgdHJhbnNwb3J0cykuIFVuc2V0IGtub2JzIHBhc3MgdGhyb3VnaFxuICogYXMgYHVuZGVmaW5lZGAgYW5kIGFyZSByZWFkIHdpdGggYD8/IGRlZmF1bHRgIC8gYCE9PSB1bmRlZmluZWRgIGd1YXJkc1xuICogZG93bnN0cmVhbSwgc28gYW4gZXhwbGljaXQgYHVuZGVmaW5lZGAgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBhYnNlbnQga2V5LlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIGNvbm5lY3Rpb24gb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSB0cmFuc3BvcnQgb3B0aW9ucyB0byBjcmVhdGUgdGhlIGNvbm5lY3Rpb24ncyB0cmFuc3BvcnQgZnJvbS5cbiAqL1xuZnVuY3Rpb24gYnVpbGRDZHBUcmFuc3BvcnRPcHRpb25zKG9wdGlvbnM/OiBDb25uZWN0VG9DZHBPcHRpb25zKTogT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIHtcbiAgcmV0dXJuIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnM+KHtcbiAgICBjb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zPy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIGRlYWRCb290R3JhY2VJbk1pbGxpc2Vjb25kczogb3B0aW9ucz8uZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzLFxuICAgIGhvc3Q6IG9wdGlvbnM/Lmhvc3QsXG4gICAgaXNPYnNpZGlhbkFwcFZpc2libGU6IG9wdGlvbnM/LmlzT2JzaWRpYW5BcHBWaXNpYmxlID8/IHRydWUsXG4gICAgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uOiBvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24sXG4gICAgb2JzaWRpYW5WZXJzaW9uOiBvcHRpb25zPy5vYnNpZGlhblZlcnNpb24sXG4gICAgcG9ydDogb3B0aW9ucz8ucG9ydCxcbiAgICBzaG91bGREaXNhYmxlU2FuZGJveDogb3B0aW9ucz8uc2hvdWxkRGlzYWJsZVNhbmRib3gsXG4gICAgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogb3B0aW9ucz8uc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcixcbiAgICBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrOiBvcHRpb25zPy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrLFxuICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM6IG9wdGlvbnM/LnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMsXG4gICAgdHlwZTogJ29ic2lkaWFuLWNkcCdcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIENEUCBob3N0L3BvcnQgZm9yIHRoZSBjb25uZWN0aW9uOiBmcm9tIHRoZSBvd25lZCBpbnN0YW5jZSdzXG4gKiBsYXVuY2hlZCBlbmRwb2ludCB3aGVuIHByZXNlbnQsIG90aGVyd2lzZSBmcm9tIHRoZSBhdHRhY2ggb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0IC0gVGhlIHRyYW5zcG9ydCBjcmVhdGVkIGZvciB0aGlzIGNvbm5lY3Rpb24uXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBjb25uZWN0aW9uIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgaG9zdCBhbmQgcG9ydC5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIHBvcnQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVFbmRwb2ludCh0cmFuc3BvcnQ6IHVua25vd24sIG9wdGlvbnM6IENvbm5lY3RUb0NkcE9wdGlvbnMgfCB1bmRlZmluZWQpOiBSZXNvbHZlZEVuZHBvaW50IHtcbiAgaWYgKHRyYW5zcG9ydCBpbnN0YW5jZW9mIERlc2t0b3BDZHBUcmFuc3BvcnQpIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IHRyYW5zcG9ydC5nZXRPd25lZEluc3RhbmNlRW5kcG9pbnQoKTtcbiAgICBpZiAoZW5kcG9pbnQpIHtcbiAgICAgIHJldHVybiB7IGhvc3Q6IGVuZHBvaW50Lmhvc3QsIHBvcnQ6IGVuZHBvaW50LnBvcnQgfTtcbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucz8ucG9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgaG9zdDogb3B0aW9ucy5ob3N0ID8/IERFRkFVTFRfQ0RQX0hPU1QsIHBvcnQ6IG9wdGlvbnMucG9ydCB9O1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdjb25uZWN0VG9DZHA6IGNvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIENEUCBwb3J0LicpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGhvc3Qtc2lkZSB0ZW1wIGRpcmVjdG9yaWVzIGVhcmxpZXIgcnVucyBsZWFrZWQsIGJlZm9yZSB0aGlzXG4gKiBjb25uZWN0aW9uIGFkZHMgaXRzIG93bi5cbiAqXG4gKiBgY29ubmVjdFRvQ2RwYCBtaW50cyB0aGUgc2FtZSBgdGVtcC12YXVsdC0qYCAvIG93bmVkIGB1c2VyZGF0YS0qYCBkaXJlY3Rvcmllc1xuICogdGhlIHRlc3QgZ2xvYmFsIHNldHVwIGRvZXMsIGFuZCBhbiBhZC1ob2MgZGVidWdnaW5nIHNlc3Npb24gaXMgZXhhY3RseSB0aGVcbiAqIGtpbmQgdGhhdCBnZXRzIGtpbGxlZCB3aXRoIGEgbGVmdG92ZXIgYmVoaW5kIFx1MjAxNCBzbyBpdCBzd2VlcHMgdG9vLiBBZ2UtZ2F0ZWQgYW5kXG4gKiBiZXN0LWVmZm9ydDsgc2VlIHRoZSBjb3JlJ3MgYHN3ZWVwTGVmdG92ZXJzYC5cbiAqXG4gKiBAcGFyYW0gdHJhbnNwb3J0T3B0aW9ucyAtIFRoZSByZXNvbHZlZCB0cmFuc3BvcnQgb3B0aW9ucyAoc291cmNlIG9mIHRoZSBzd2VlcCBrbm9icykuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN3ZWVwTGVmdG92ZXJzKHRyYW5zcG9ydE9wdGlvbnM6IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIXJlc29sdmVTaG91bGRTd2VlcExlZnRvdmVycyh0cmFuc3BvcnRPcHRpb25zKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc3dlZXBIb3N0TGVmdG92ZXJzKHtcbiAgICAgIG1heEFnZUluTWlsbGlzZWNvbmRzOiByZXNvbHZlTGVmdG92ZXJNYXhBZ2VJbk1pbGxpc2Vjb25kcyh0cmFuc3BvcnRPcHRpb25zKVxuICAgIH0pO1xuICAgIGlmIChyZXN1bHQucmVtb3ZlZENvdW50ID4gMCB8fCByZXN1bHQuZmFpbGVkQ291bnQgPiAwKSB7XG4gICAgICBsb2coXG4gICAgICAgIGBbY29ubmVjdC10by1jZHBdIFN3ZXB0ICR7U3RyaW5nKHJlc3VsdC5yZW1vdmVkQ291bnQpfSBsZWZ0b3ZlciB0ZW1wIGRpcmVjdG9yKGllcykgZnJvbSBlYXJsaWVyIHJ1bnMgYFxuICAgICAgICAgICsgYCgke1N0cmluZyhyZXN1bHQuZmFpbGVkQ291bnQpfSBzdGlsbCBpbiB1c2UpLmBcbiAgICAgICk7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZyhgW2Nvbm5lY3QtdG8tY2RwXSBMZWZ0b3ZlciBzd2VlcCBlcnJvciAobm9uLWZhdGFsKTogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMkJBLDhCQUErQjtBQUMvQiw4QkFJTztBQUNQLGlCQUFvQjtBQUNwQiwyQ0FBNEM7QUFDNUMsd0JBQTBCO0FBQzFCLG1DQUFvQztBQUNwQywrQkFBMkM7QUFFM0MsTUFBTSxtQkFBbUI7QUF3UHpCLGVBQXNCLGFBQWEsU0FBdUQ7QUFDeEYsUUFBTSxtQkFBbUIseUJBQXlCLE9BQU87QUFDekQsUUFBTSxlQUFlLGdCQUFnQjtBQUNyQyxRQUFNLFlBQVksVUFBTSxxREFBMkIsZ0JBQWdCO0FBQ25FLFFBQU0sUUFBUSxJQUFJLDRCQUFVLFNBQVMsS0FBSztBQUMxQyxRQUFNLDZCQUE2QixTQUFTLDhCQUErQixTQUFTLFVBQVU7QUFLOUYsUUFBTSxNQUFNLFNBQVMsU0FBUztBQUU5QixRQUFNLEVBQUUsTUFBTSxLQUFLLElBQUksZ0JBQWdCLFdBQVcsT0FBTztBQUN6RCxRQUFNLFNBQVMsVUFBVSxJQUFJLElBQUksT0FBTyxJQUFJLENBQUM7QUFDN0MsUUFBTSxlQUFlLHFCQUFxQixtREFBc0IsVUFBVSxnQkFBZ0IsSUFBSTtBQUM5RixRQUFNLGdCQUFnQixxQkFBcUIsbURBQXNCLFVBQVUsaUJBQWlCLElBQUk7QUFDaEcsUUFBTSx3QkFBd0IscUJBQXFCLG1EQUFzQixVQUFVLHlCQUF5QixJQUFJO0FBRWhILFFBQU0sYUFBNEI7QUFBQSxJQUNoQztBQUFBLElBQ0EsR0FBSSxnQkFBZ0IsRUFBRSxhQUFhO0FBQUEsSUFDbkMsR0FBSSxpQkFBaUIsRUFBRSxjQUFjO0FBQUEsSUFDckMsR0FBSSx5QkFBeUIsRUFBRSxzQkFBc0I7QUFBQSxJQUVyRCxNQUFNLFVBQXlCO0FBQzdCLFVBQUk7QUFDRixZQUFJLDRCQUE0QjtBQUM5QixnQkFBTSxNQUFNLFFBQVEsU0FBUztBQUFBLFFBQy9CLE9BQU87QUFDTCxnQkFBTSxVQUFVLGdCQUFnQixNQUFNLElBQUk7QUFBQSxRQUM1QztBQUFBLE1BQ0YsVUFBRTtBQUNBLGNBQU0sVUFBVSxVQUFVO0FBQUEsTUFDNUI7QUFBQSxJQUNGO0FBQUEsSUFFQSxNQUFNLGVBQ0osUUFDaUI7QUFDakIsaUJBQU8sd0NBQXlDLEVBQUUsR0FBRyxRQUFRLFdBQVcsV0FBVyxNQUFNLEtBQUssQ0FBQztBQUFBLElBQ2pHO0FBQUEsSUFFQSxNQUFNLE9BQU8sWUFBcUM7QUFDaEQsYUFBTyxVQUFVLFNBQVMsWUFBWSxFQUFFLEtBQUssTUFBTSxLQUFLLENBQUM7QUFBQSxJQUMzRDtBQUFBLElBRUE7QUFBQSxJQUVBLE9BQU8sT0FBTyxZQUFZLElBQW1CO0FBQzNDLFlBQU0sV0FBVyxRQUFRO0FBQUEsSUFDM0I7QUFBQSxJQUVBO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQVlBLFNBQVMseUJBQXlCLFNBQTREO0FBQzVGLGFBQU8sa0VBQXlEO0FBQUEsSUFDOUQsOEJBQThCLFNBQVM7QUFBQSxJQUN2Qyw2QkFBNkIsU0FBUztBQUFBLElBQ3RDLE1BQU0sU0FBUztBQUFBLElBQ2Ysc0JBQXNCLFNBQVMsd0JBQXdCO0FBQUEsSUFDdkQsMEJBQTBCLFNBQVM7QUFBQSxJQUNuQyxpQkFBaUIsU0FBUztBQUFBLElBQzFCLE1BQU0sU0FBUztBQUFBLElBQ2Ysc0JBQXNCLFNBQVM7QUFBQSxJQUMvQixvQ0FBb0MsU0FBUztBQUFBLElBQzdDLGlDQUFpQyxTQUFTO0FBQUEsSUFDMUMsaUNBQWlDLFNBQVM7QUFBQSxJQUMxQyxNQUFNO0FBQUEsRUFDUixDQUFDO0FBQ0g7QUFXQSxTQUFTLGdCQUFnQixXQUFvQixTQUE0RDtBQUN2RyxNQUFJLHFCQUFxQixrREFBcUI7QUFDNUMsVUFBTSxXQUFXLFVBQVUseUJBQXlCO0FBQ3BELFFBQUksVUFBVTtBQUNaLGFBQU8sRUFBRSxNQUFNLFNBQVMsTUFBTSxNQUFNLFNBQVMsS0FBSztBQUFBLElBQ3BEO0FBQUEsRUFDRjtBQUVBLE1BQUksU0FBUyxTQUFTLFFBQVc7QUFDL0IsV0FBTyxFQUFFLE1BQU0sUUFBUSxRQUFRLGtCQUFrQixNQUFNLFFBQVEsS0FBSztBQUFBLEVBQ3RFO0FBRUEsUUFBTSxJQUFJLE1BQU0saURBQWlEO0FBQ25FO0FBYUEsZUFBZSxlQUFlLGtCQUE4RDtBQUMxRixNQUFJLEtBQUMscURBQTRCLGdCQUFnQixHQUFHO0FBQ2xEO0FBQUEsRUFDRjtBQUVBLE1BQUk7QUFDRixVQUFNLFNBQVMsVUFBTSw0Q0FBbUI7QUFBQSxNQUN0QywwQkFBc0IsNkRBQW9DLGdCQUFnQjtBQUFBLElBQzVFLENBQUM7QUFDRCxRQUFJLE9BQU8sZUFBZSxLQUFLLE9BQU8sY0FBYyxHQUFHO0FBQ3JEO0FBQUEsUUFDRSwwQkFBMEIsT0FBTyxPQUFPLFlBQVksQ0FBQyxtREFDN0MsT0FBTyxPQUFPLFdBQVcsQ0FBQztBQUFBLE1BQ3BDO0FBQUEsSUFDRjtBQUFBLEVBQ0YsU0FBUyxPQUFnQjtBQUN2Qix3QkFBSSxzREFBc0QsT0FBTyxLQUFLLENBQUMsRUFBRTtBQUFBLEVBQzNFO0FBQ0Y7IiwKICAibmFtZXMiOiBbXQp9Cg==
|
|
@@ -79,4 +79,4 @@ ${sanitizedDetail}`);
|
|
|
79
79
|
0 && (module.exports = {
|
|
80
80
|
evalInObsidian
|
|
81
81
|
});
|
|
82
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2V2YWwtaW4tb2JzaWRpYW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFdmFsdWF0ZXMgYSBmdW5jdGlvbiBpbnNpZGUgYSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBhIHBsdWdnYWJsZSB0cmFuc3BvcnQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEVkaXRvcixcbiAgTW9kaWZpZXJcbn0gZnJvbSAnb2JzaWRpYW4nO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC14L25vLW5hbWVzcGFjZSAtLSBXZSBuZWVkIHRvIHJlZmVyZW5jZSBgb2JzaWRpYW5gIG1vZHVsZS5cbmltcG9ydCB0eXBlICogYXMgb2JzaWRpYW4gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUge1xuICBDb250ZXh0QXJncyxcbiAgQ29udGV4dElkXG59IGZyb20gJy4vY29udGV4dC1pZC5janMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU5hbWVzcGFjZUNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQge1xuICBnZXRUcmFuc3BvcnRPcHRpb25zLFxuICBnZXRWYXVsdFBhdGhcbn0gZnJvbSAnLi9jb250ZXh0LXByb3ZpZGVyLmNqcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU5hbWVzcGFjZUNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB7IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCB9IGZyb20gJy4vbmFtZXNwYWNlLWJvb3RzdHJhcC5janMnO1xuaW1wb3J0IHsgZ2V0T3JDcmVhdGVUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5cbmludGVyZmFjZSBFdmFsRXJyb3JFbnZlbG9wZSB7XG4gIHR5cGU6ICdlcnJvcic7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGlzY3JpbWluYXRlZCBlbnZlbG9wZSByZXR1cm5lZCBieSB0aGUgcmVnaXN0ZXJlZCBgZXZhbFdyYXBwZXJgIGZyb20gaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLlxuICpcbiAqIC0gYEV2YWxFcnJvckVudmVsb3BlYCBcdTIwMTQgYGZuYCB0aHJldzsgYHZhbHVlYCBpcyB0aGUgc2VyaWFsaXplZCBlcnJvci5cbiAqIC0gYEV2YWxVbmRlZmluZWRFbnZlbG9wZWAgXHUyMDE0IGBmbmAgcmV0dXJuZWQgYHVuZGVmaW5lZGAuXG4gKiAtIGBFdmFsVmFsdWVFbnZlbG9wZWAgXHUyMDE0IGBmbmAgcmV0dXJuZWQgYSBKU09OLXNlcmlhbGl6YWJsZSB2YWx1ZS5cbiAqL1xudHlwZSBFdmFsUmVzdWx0RW52ZWxvcGUgPVxuICB8IEV2YWxFcnJvckVudmVsb3BlXG4gIHwgRXZhbFVuZGVmaW5lZEVudmVsb3BlXG4gIHwgRXZhbFZhbHVlRW52ZWxvcGU7XG5cbmludGVyZmFjZSBFdmFsVW5kZWZpbmVkRW52ZWxvcGUge1xuICB0eXBlOiAndW5kZWZpbmVkJztcbn1cblxuaW50ZXJmYWNlIEV2YWxWYWx1ZUVudmVsb3BlIHtcbiAgdmFsdWU6IHVua25vd247XG59XG5cbmNvbnN0IE5PX09VVFBVVCA9ICcobm8gb3V0cHV0KSc7XG5cbi8qKlxuICogQ29tbW9uIGFyZ3VtZW50cyBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIHRvIGV2ZXJ5IHtAbGluayBldmFsSW5PYnNpZGlhbn0gY2FsbGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4ge0BsaW5rIEFwcH0gaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVGhlIHNoYXJlZCBsaWJyYXJ5IGJhZyBpbmplY3RlZCBpbnRvIGV2ZXJ5IGNhbGxiYWNrIFx1MjAxNCBzZWUge0BsaW5rIExpYn0uXG4gICAqXG4gICAqIE5ldmVyIGVtcHR5OiB0aGUgaGFybmVzcyBwcmUtcG9wdWxhdGVzIGEgKipiYXNlKiogc2V0IG9mIHJlbmRlcmVyLWRyaXZpbmdcbiAgICogaGVscGVycyAodHJ1c3RlZCBpbnB1dCBcdTIwMTQgYHR5cGVJbnRvRWRpdG9yYCAvIGBwcmVzc0tleWAgLyBgbW92ZU1vdXNlYCAvXG4gICAqIGBob3ZlckVsZW1lbnRgIC8gYHVuaG92ZXJFbGVtZW50YCBcdTIwMTQgYW5kIGB3YWl0VW50aWxgKSwgYW5kIHByb3ZpZGVyIHBhY2thZ2VzXG4gICAqIChjaGllZmx5IGBvYnNpZGlhbi1kZXYtdXRpbHNgKSBgT2JqZWN0LmFzc2lnbmAgdGhlaXIgd2hvbGUgcmVuZGVyZXItc2FmZVxuICAgKiBsaWJyYXJ5IG9uIHRvcCB2aWEge0BsaW5rIHJlZ2lzdGVyTGliUmVzb2x2ZXJ9LiBBIHNlcmlhbGl6ZWQgY2xvc3VyZSByZWFjaGVzXG4gICAqIGV2ZXJ5IHNoYXJlZCBoZWxwZXIgdGhyb3VnaCBgbGliYCBcdTIwMTQgYGxpYi50eXBlSW50b0VkaXRvcih7IGVkaXRvciwgdGV4dCB9KWAsXG4gICAqIGBsaWIuZ2V0RmlsZU9yTnVsbCh7IGFwcCwgXHUyMDI2IH0pYCBcdTIwMTQgaW5zdGVhZCBvZiBpbXBvcnRpbmcgb3IgaGFuZC1yb2xsaW5nIHRoZW0uXG4gICAqL1xuICBsaWI6IExpYjtcblxuICAvKipcbiAgICogVGhlIGBvYnNpZGlhbmAgbW9kdWxlLCByZXNvbHZlZCBhdCBydW50aW1lIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAgICovXG4gIG9ic2lkaWFuTW9kdWxlOiB0eXBlb2Ygb2JzaWRpYW47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGV2YWxJbk9ic2lkaWFufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmFsSW5PYnNpZGlhblBhcmFtczxBcmdzIGV4dGVuZHMgR2VuZXJpY09iamVjdCwgUmVzdWx0LCBUQ29udGV4dElkIGV4dGVuZHMgQ29udGV4dElkPHVua25vd24+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPiB7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbi4gVmFsdWVzIG1heSBpbmNsdWRlIGZ1bmN0aW9ucyBcdTIwMTRcbiAgICogdGhleSBhcmUgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJncz86IEFyZ3M7XG5cbiAgLyoqXG4gICAqIEEge0BsaW5rIENvbnRleHRJZH0gbGlua2luZyB0aGlzIGNhbGwgdG8gYSBwZXJzaXN0ZW50IHN0b3JlIG9uIGB3aW5kb3dgXG4gICAqIGluIHRoZSBPYnNpZGlhbiBwcm9jZXNzLiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgYSB0eXBlZCBgY29udGV4dGAgb2JqZWN0XG4gICAqIHRoYXQgc3Vydml2ZXMgYWNyb3NzIGNhbGxzIHNoYXJpbmcgdGhlIHNhbWUgSUQuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgYGNvbnRleHRgIGlzIGEgZnJlc2ggZW1wdHkgb2JqZWN0IGVhY2ggY2FsbC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHRJZD86IFRDb250ZXh0SWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZSBpbiB0aGUgT2JzaWRpYW4gY29udGV4dC5cbiAgICovXG4gIGZuKGFyZ3M6IEFyZ3MgJiBDb21tb25BcmdzICYgQ29udGV4dEFyZ3M8VENvbnRleHRJZD4pOiBQcm9taXNhYmxlPFJlc3VsdD47XG5cbiAgLyoqXG4gICAqIFNraXBzIHByZS1mbGlnaHQgY2hlY2tzICh2YXVsdCByZWdpc3RyYXRpb24sIENMSSBhdmFpbGFiaWxpdHkpLlxuICAgKiBVc2VkIGludGVybmFsbHkgYnkgdmF1bHQgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHRyYW5zcG9ydCBmb3IgdGhpcyBjYWxsLiBXaGVuIG9taXR0ZWQsIHVzZXMgdGhlIHRyYW5zcG9ydFxuICAgKiBjb25maWd1cmVkIHZpYSB0aGUgY29udGV4dCBwcm92aWRlciAoc2V0IGJ5IHRoZSBmcmFtZXdvcmsgYWRhcHRlcidzIGdsb2JhbCBzZXR1cCkuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ/OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIE9ic2lkaWFuIHZhdWx0LiBEZWZhdWx0cyB0byBgcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwbGFpbiBvYmplY3Qgd2l0aCBzdHJpbmcga2V5cy5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuZXJpY09iamVjdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25BcmdzLmhvdmVyRWxlbWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG92ZXJFbGVtZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRvIGhvdmVyLiBUaGUgcG9pbnRlciBpcyBtb3ZlZCB0byBpdHMgY2VudGVyLiBUaGlzIGlzIGEgbGl2ZVxuICAgKiByZW5kZXJlciBET00gbm9kZSBcdTIwMTQgdGhlIGNhbGxiYWNrIHJ1bnMgaW4tcmVuZGVyZXIsIHNvIG5vIGNyb3NzLXByb2Nlc3NcbiAgICogc2VyaWFsaXphdGlvbiBpcyBuZWVkZWQgKHNhbWUgYXMge0BsaW5rIFR5cGVJbnRvRWRpdG9yUGFyYW1zLmVkaXRvcn0pLlxuICAgKi9cbiAgcmVhZG9ubHkgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG59XG5cbi8qKlxuICogVGhlIHNoYXJlZCBsaWJyYXJ5IGJhZyBpbmplY3RlZCBpbnRvIGV2ZXJ5IHtAbGluayBldmFsSW5PYnNpZGlhbn0gY2FsbGJhY2sgYXNcbiAqIHtAbGluayBDb21tb25BcmdzLmxpYn0uXG4gKlxuICogVHdvIGxheWVycyBjb21wb3NlIGludG8gdGhpcyBvbmUgYmFnLiBUaGUgKipiYXNlKiogXHUyMDE0IHRoZSBoYXJuZXNzLXByb3ZpZGVkXG4gKiByZW5kZXJlci1kcml2aW5nIGhlbHBlcnMgZGVjbGFyZWQgYmVsb3cgKHRoZSB0cnVzdGVkLWlucHV0IHByaW1pdGl2ZXMgYW5kXG4gKiB7QGxpbmsgTGliLndhaXRVbnRpbH0pIFx1MjAxNCBpcyBhbHdheXMgcHJlc2VudC4gT24gdG9wLCBwcm92aWRlciBwYWNrYWdlcyByZWdpc3RlclxuICogYSByZW5kZXJlci1zaWRlIHJlc29sdmVyIHZpYSB7QGxpbmsgcmVnaXN0ZXJMaWJSZXNvbHZlcn0gdG8gYE9iamVjdC5hc3NpZ25gXG4gKiB0aGVpciB3aG9sZSByZW5kZXJlci1zYWZlIGxpYnJhcnkgYXQgcnVudGltZSwgYW5kIGF1Z21lbnQgdGhpcyAqKmF1Z21lbnRhYmxlKipcbiAqIGludGVyZmFjZSAodGhlIGBpMThuZXh0YCBgQ3VzdG9tVHlwZU9wdGlvbnNgIGlkaW9tKSB2aWFcbiAqIGBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZydgIHRvIHR5cGUgaXQuIE11bHRpcGxlIHByb3ZpZGVyc1xuICogY29tcG9zZTogdGhlaXIgZXhwb3J0cyBtZXJnZSBhdCBydW50aW1lIGFuZCB0aGVpciBhdWdtZW50YXRpb25zIG1lcmdlIGluIHRoZVxuICogdHlwZSBzeXN0ZW0gKGBpbnRlcmZhY2UgTGliIGV4dGVuZHMgXHUyMDI2YCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZycge1xuICogICBpbnRlcmZhY2UgTGliIGV4dGVuZHMgKHR5cGVvZiBpbXBvcnQoJ29ic2lkaWFuLWRldi11dGlscy9fX21lcmdlZCcpKSB7fVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGliIHtcbiAgLyoqXG4gICAqIE1vdmVzIHRoZSBtb3VzZSBwb2ludGVyIHRvIHRoZSBjZW50ZXIgb2YgYW4gZWxlbWVudCB1c2luZyAqKnRydXN0ZWQqKlxuICAgKiBFbGVjdHJvbiBwb2ludGVyIGlucHV0LCB0aGVuIHBvbGxzIHVudGlsIHRoZSBlbGVtZW50IGFjdHVhbGx5IG1hdGNoZXNcbiAgICogYDpob3ZlcmAuXG4gICAqXG4gICAqIEJlY2F1c2UgdGhlIG1vdmUgaXMgdHJ1c3RlZCAoc2VlIHtAbGluayBMaWIubW92ZU1vdXNlfSksIHRoZSByZWFsIGA6aG92ZXJgXG4gICAqIHN0YXRlIHRha2VzIGVmZmVjdCBpbiB0aGUgQ1NTIGVuZ2luZSBcdTIwMTQgcmVhbCB0aGVtZSBgdmFyKClgIHZhbHVlcyBhbmQgcmVhbFxuICAgKiBjb21wb3NpdGluZyBcdTIwMTQgaW5zdGVhZCBvZiBhIGhhbmQtc2ltdWxhdGVkIGNhc2NhZGUuIEl0IHBvbGxzIHRoZSBsaXZlXG4gICAqIGBlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpYCBzdGF0ZSAobm90IGEgZml4ZWQgZGVsYXkpLCBzbyBpdCBpcyByb2J1c3QgdW5kZXJcbiAgICogc2hhcmVkLWluc3RhbmNlIGxvYWQuIEl0IHRhcmdldHMgdGhlIHNpbmdsZSBzaGFyZWQgd2luZG93J3MgKipnbG9iYWwqKlxuICAgKiBwb2ludGVyLCBzbyBvbmx5IG9uZSBlbGVtZW50IGlzIGhvdmVyZWQgYXQgYSB0aW1lLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVsZW1lbnQgdG8gaG92ZXIuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZWxlbWVudCBtYXRjaGVzIGA6aG92ZXJgLlxuICAgKi9cbiAgaG92ZXJFbGVtZW50KHRoaXM6IHZvaWQsIHBhcmFtczogSG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogTW92ZXMgdGhlIG1vdXNlIHBvaW50ZXIgdG8gdGhlIGdpdmVuIHdlYi1jb250ZW50cyBjb29yZGluYXRlcyB1c2luZyBhXG4gICAqICoqdHJ1c3RlZCoqIEVsZWN0cm9uIHBvaW50ZXIgbW92ZS5cbiAgICpcbiAgICogQSB0cnVzdGVkIG1vdmUgKGluamVjdGVkIHZpYSBFbGVjdHJvbidzIGB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudGApXG4gICAqIHVwZGF0ZXMgdGhlIHJlYWwgcG9pbnRlciBzdGF0ZSBpbiB0aGUgQ1NTIGVuZ2luZSwgc28gYDpob3ZlcmAgcnVsZXNcbiAgICogZ2VudWluZWx5IGFwcGx5IFx1MjAxNCB1bmxpa2UgYGRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ21vdXNlb3ZlcicpKWAsXG4gICAqIHdoaWNoIGlzIHVudHJ1c3RlZCBhbmQgbmV2ZXIgc2V0cyBgOmhvdmVyYC4gSXQgdGFyZ2V0cyB0aGUgc2luZ2xlIHNoYXJlZFxuICAgKiB3aW5kb3cncyAqKmdsb2JhbCoqIHBvaW50ZXIsIHNvIG9ubHkgb25lIGVsZW1lbnQgaXMgaG92ZXJlZCBhdCBhIHRpbWUuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGxvdy1sZXZlbCBwcmltaXRpdmU6IGl0IHBlcmZvcm1zIGEgc2luZ2xlIG1vdmUgYW5kIGRvZXMgKipub3QqKlxuICAgKiB3YWl0IGZvciBhbnkgc3RhdGUgdG8gc2V0dGxlIChjYWxsZXJzIHBvbGwgdGhlaXIgb3duIHJlYWRpbmVzcyBzaWduYWwpLlxuICAgKiBQcmVmZXIge0BsaW5rIExpYi5ob3ZlckVsZW1lbnR9IC8ge0BsaW5rIExpYi51bmhvdmVyRWxlbWVudH0gZm9yXG4gICAqIGVsZW1lbnQtcmVsYXRpdmUgbW92ZXM7IHVzZSBgbW92ZU1vdXNlYCBkaXJlY3RseSB3aGVuIGFuIGVsZW1lbnQtcmVsYXRpdmVcbiAgICogdGFyZ2V0IGRvZXMgbm90IGZpdCAoZS5nLiBhbiBlbGVtZW50IHNwYW5uaW5nIHRoZSBmdWxsIHZpZXdwb3J0IHdpZHRoKS5cbiAgICpcbiAgICogU3luY2hyb25vdXM6IGluamVjdGluZyB0aGUgdHJ1c3RlZCBtb3ZlIGRvZXMgbm8gcmVhbCBhd2FpdGluZywgc28gdGhlIGNhbGxlclxuICAgKiBkb2VzIG5vdCBuZWVkIHRvIGBhd2FpdGAgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgd2ViLWNvbnRlbnRzIERJUCBjb29yZGluYXRlcyB0byBtb3ZlIHRvLlxuICAgKi9cbiAgbW92ZU1vdXNlKHRoaXM6IHZvaWQsIHBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogdm9pZDtcblxuICAvKipcbiAgICogUHJlc3NlcyBhIHNpbmdsZSBrZXkgKG9wdGlvbmFsbHkgd2l0aCBtb2RpZmllcnMpIHVzaW5nICoqdHJ1c3RlZCoqIEVsZWN0cm9uXG4gICAqIGtleWJvYXJkIGlucHV0LCBmaXJpbmcgdGhlIGZ1bGwgcmVhbCBrZXkgcGlwZWxpbmUgXHUyMDE0XG4gICAqIGBrZXlkb3duYCBcdTIxOTIgYGtleXByZXNzYCBcdTIxOTIgYGJlZm9yZWlucHV0YCBcdTIxOTIgYGlucHV0YCBcdTIxOTIgYGtleXVwYC5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUga2V5LXByZXNzIGFuYWxvZyBvZiB7QGxpbmsgTGliLnR5cGVJbnRvRWRpdG9yfTogaXQgaW5qZWN0cyBhXG4gICAqIHRydXN0ZWQgYGtleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGAgc2VxdWVuY2UgdmlhIEVsZWN0cm9uJ3NcbiAgICogYHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50YCwgc28gaXQgaXMgZGVsaXZlcmVkIHRvIHRoZSB3aW5kb3cncyBET00tZm9jdXNlZFxuICAgKiBlbGVtZW50IGFuZCBmbG93cyB0aHJvdWdoIHRoZSByZWFsIGlucHV0IHBpcGVsaW5lIFx1MjAxNCB1bmxpa2VcbiAgICogYGRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoLi4uKSlgLCB3aGljaCBpcyB1bnRydXN0ZWQgKGBpc1RydXN0ZWQ6XG4gICAqIGZhbHNlYCkgYW5kIGlnbm9yZWQgYnkgQ29kZU1pcnJvciBhbmQgbW9zdCBrZXkgaGFuZGxlcnMuIFVzZSBpdCBmb3Igc3BlY2lhbFxuICAgKiBrZXlzIChgJ0VudGVyJ2AsIGAnRXNjYXBlJ2AsIGAnVGFiJ2AsIGFycm93IGtleXMpIGFuZCBtb2RpZmllciBjb21iaW5hdGlvbnNcbiAgICogKGBTaGlmdCtFbnRlcmAsIGBDdHJsK0FgKSB0aGF0IHtAbGluayBMaWIudHlwZUludG9FZGl0b3J9ICh3aGljaCB0eXBlc1xuICAgKiBwcmludGFibGUgdGV4dCkgZG9lcyBub3QgY292ZXIuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGxvdy1sZXZlbCBwcmltaXRpdmU6IGl0IGluamVjdHMgdGhlIGtleSBwcmVzcyBhbmQgZG9lcyAqKm5vdCoqXG4gICAqIHBvbGwgZm9yIGFueSBlZmZlY3QgKGEga2V5IHByZXNzIGhhcyBubyB1bml2ZXJzYWwgb2JzZXJ2YWJsZSBvdXRjb21lIFx1MjAxNFxuICAgKiBgRW50ZXJgIGVkaXRzIHRoZSBkb2N1bWVudCwgYEVzY2FwZWAgY2xvc2VzIGEgbW9kYWwsIGBBcnJvd0Rvd25gIG1vdmVzIHRoZVxuICAgKiBzZWxlY3Rpb24pLiBUaGUgY2FsbGVyIGZvY3VzZXMgdGhlIGludGVuZGVkIHRhcmdldCBmaXJzdCwgdGhlbiBhd2FpdHMgdGhlXG4gICAqIGV4cGVjdGVkIGVmZmVjdCB2aWEge0BsaW5rIExpYi53YWl0VW50aWx9LiBJdCB0YXJnZXRzIHRoZSBzaW5nbGUgc2hhcmVkXG4gICAqIHdpbmRvdydzICoqZ2xvYmFsKiogZm9jdXMsIHNvIG9ubHkgdGhlIERPTS1mb2N1c2VkIGVsZW1lbnQgcmVjZWl2ZXMgdGhlIGtleS5cbiAgICpcbiAgICogU3luY2hyb25vdXM6IGluamVjdGluZyB0aGUgdHJ1c3RlZCBrZXkgcHJlc3MgZG9lcyBubyByZWFsIGF3YWl0aW5nLCBzbyB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG5lZWQgdG8gYGF3YWl0YCBpdC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBrZXkgdG8gcHJlc3MgYW5kIGFueSBtb2RpZmllcnMgdG8gaG9sZC5cbiAgICovXG4gIHByZXNzS2V5KHRoaXM6IHZvaWQsIHBhcmFtczogUHJlc3NLZXlQYXJhbXMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUeXBlcyB0ZXh0IGludG8gYSBDb2RlTWlycm9yIHtAbGluayBFZGl0b3J9IHVzaW5nICoqdHJ1c3RlZCoqIEVsZWN0cm9uXG4gICAqIGtleWJvYXJkIGlucHV0LlxuICAgKlxuICAgKiBUeXBpbmcgaXMgcHJlc3NpbmcgZWFjaCBjaGFyYWN0ZXIga2V5IGluIHR1cm46IHRoaXMgZm9jdXNlcyB0aGUgZWRpdG9yXG4gICAqIChjYXJldCB0byBlbmQpIGFuZCBwcmVzc2VzIGV2ZXJ5IGNvZGUgcG9pbnQgb2YgYHRleHRgIHZpYVxuICAgKiB7QGxpbmsgTGliLnByZXNzS2V5fSBcdTIwMTQgdGhlIHNhbWUgdHJ1c3RlZCBga2V5RG93bmAgXHUyMTkyIGBjaGFyYCBcdTIxOTIgYGtleVVwYCBhIHJlYWxcbiAgICogdXNlciBwcm9kdWNlcy4gRWFjaCBrZXlzdHJva2UgaXMgZGVsaXZlcmVkIHRvIHRoZSB3aW5kb3cncyBET00tZm9jdXNlZFxuICAgKiBlbGVtZW50IGFuZCBmbG93cyB0aHJvdWdoIENvZGVNaXJyb3IncyByZWFsIGlucHV0IHBpcGVsaW5lLCBzbyB0aGUgdHlwZWRcbiAgICogdGV4dCByZWFjaGVzIHRoZSBkb2N1bWVudCAqKm9ubHkgaWYgdGhlIGVkaXRvciBnZW51aW5lbHkgaG9sZHMgZm9jdXMqKi5cbiAgICogVGhpcyBtYWtlcyBcInRoZSB1c2VyIHR5cGVkIGludG8gdGhlIGVkaXRvclwiIGEgZmFpdGhmdWwgZW5kLXRvLWVuZCBjaGVjayxcbiAgICogdW5saWtlIGBkaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KC4uLikpYCAodW50cnVzdGVkIFx1MjAxNCBpZ25vcmVkIGJ5XG4gICAqIENvZGVNaXJyb3IpIG9yIGBleGVjQ29tbWFuZCgnaW5zZXJ0VGV4dCcpYCAobXV0YXRlcyB0aGUgc2VsZWN0aW9uIGV2ZW5cbiAgICogd2hlbiB0aGUgZWRpdG9yIGlzIG5vdCBmb2N1c2VkLCBtYXNraW5nIGZvY3VzIGJ1Z3MgYXMgZmFsc2UgcG9zaXRpdmVzKS5cbiAgICpcbiAgICogQWZ0ZXIgaW5qZWN0aW5nIHRoZSBrZXlzdHJva2VzIGl0IHBvbGxzIHVudGlsIHRoZSBkb2N1bWVudCByZWZsZWN0cyB0aGVcbiAgICogaW5wdXQsIG9yIGEgYm91bmRlZCB0aW1lb3V0IGVsYXBzZXMgKHRoZSBleHBlY3RlZCBvdXRjb21lIHdoZW4gdGhlIGVkaXRvclxuICAgKiBpcyByZWFkLW9ubHkgYW5kIHJlamVjdHMgdGhlIGlucHV0LCBvciB3aGVuIGZvY3VzIHdhcyBzdG9sZW4pLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVkaXRvciB0byB0eXBlIGludG8gYW5kIHRoZSB0ZXh0IHRvIHR5cGUuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUga2V5c3Ryb2tlcyBoYXZlIHNldHRsZWQuXG4gICAqL1xuICB0eXBlSW50b0VkaXRvcih0aGlzOiB2b2lkLCBwYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogTW92ZXMgdGhlIG1vdXNlIHBvaW50ZXIgdG8gYSBwb2ludCBqdXN0IG91dHNpZGUgYW4gZWxlbWVudCdzIGJvdW5kaW5nIGJveFxuICAgKiB1c2luZyBhICoqdHJ1c3RlZCoqIEVsZWN0cm9uIHBvaW50ZXIgbW92ZSwgdGhlbiBwb2xscyB1bnRpbCB0aGUgZWxlbWVudCBub1xuICAgKiBsb25nZXIgbWF0Y2hlcyBgOmhvdmVyYC5cbiAgICpcbiAgICogVGhlIGludmVyc2Ugb2Yge0BsaW5rIExpYi5ob3ZlckVsZW1lbnR9LiBJdCB0YXJnZXRzIHRoZSBzaW5nbGUgc2hhcmVkXG4gICAqIHdpbmRvdydzICoqZ2xvYmFsKiogcG9pbnRlciwgc28gb25seSBvbmUgZWxlbWVudCBpcyBob3ZlcmVkIGF0IGEgdGltZS4gV2hlblxuICAgKiBhbiBlbGVtZW50IHNwYW5zIHRoZSBmdWxsIHZpZXdwb3J0IChubyBwb2ludCBvdXRzaWRlIGl0cyBib3ggaXMgcmVhY2hhYmxlKSxcbiAgICogdXNlIHtAbGluayBMaWIubW92ZU1vdXNlfSBkaXJlY3RseSB0byBtb3ZlIHRoZSBwb2ludGVyIHRvIGEga25vd24gZW1wdHlcbiAgICogY29vcmRpbmF0ZSBpbnN0ZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgcG9pbnRlciBhd2F5IGZyb20uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZWxlbWVudCBubyBsb25nZXIgbWF0Y2hlc1xuICAgKiAgIGA6aG92ZXJgLlxuICAgKi9cbiAgdW5ob3ZlckVsZW1lbnQodGhpczogdm9pZCwgcGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFBvbGxzIGEgcHJlZGljYXRlIHVudGlsIGl0IGJlY29tZXMgdHJ1dGh5LCBvciByZWplY3RzIG9uY2UgYSBib3VuZGVkXG4gICAqIHRpbWVvdXQgZWxhcHNlcy5cbiAgICpcbiAgICogSW50ZWdyYXRpb24tdGVzdCBgZXZhbEluT2JzaWRpYW5gIGNhbGxiYWNrcyByb3V0aW5lbHkgbmVlZCB0byB3YWl0IGZvciBhblxuICAgKiBhc3luY2hyb25vdXMgZWZmZWN0IHRvIHNldHRsZSAoYSB2aWV3IHRvIG9wZW4sIGEgRE9NIG5vZGUgdG8gYXBwZWFyLCBhXG4gICAqIHNldHRpbmcgdG8gYXBwbHkpLiBCZWNhdXNlIHRoZSBjYWxsYmFjayBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kXG4gICAqIGNhbm5vdCBpbXBvcnQgbW9kdWxlcywgaXQgY2FuJ3QgcmV1c2UgYG9ic2lkaWFuLWRldi11dGlsc2AnXG4gICAqIGByZXRyeVdpdGhUaW1lb3V0YCAvIGBydW5XaXRoVGltZW91dGAuIFRoaXMgaGVscGVyIGlzIHRoZSBzaGFyZWQsIGluamVjdGVkXG4gICAqIHJlcGxhY2VtZW50IGZvciB0aGUgcGVyLWNsb3N1cmUgcG9sbCBsb29wcyBjb25zdW1lcnMgd291bGQgb3RoZXJ3aXNlXG4gICAqIGhhbmQtcm9sbC5cbiAgICpcbiAgICogVGhlIGBwcmVkaWNhdGVgIG1heSBiZSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMgXHUyMDE0IGl0IGlzIGF3YWl0ZWQgb24gZXZlcnlcbiAgICogcG9sbC4gSXQgaXMgY2hlY2tlZCBpbW1lZGlhdGVseSwgdGhlbiByZS1jaGVja2VkIGV2ZXJ5XG4gICAqIGBpbnRlcnZhbEluTWlsbGlzZWNvbmRzYCB1bnRpbCBpdCByZXR1cm5zIHRydXRoeSBvciBgdGltZW91dEluTWlsbGlzZWNvbmRzYFxuICAgKiBlbGFwc2VzLCBhdCB3aGljaCBwb2ludCB0aGUgcmV0dXJuZWQge0BsaW5rIFByb21pc2V9IHJlamVjdHMgKHRoZSBlcnJvclxuICAgKiBpbmNsdWRlcyBgbWVzc2FnZWAgd2hlbiBwcm92aWRlZCkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcHJlZGljYXRlIHRvIHBvbGwgcGx1cyBvcHRpb25hbCB0aW1lb3V0LCBpbnRlcnZhbCwgYW5kXG4gICAqICAgdGltZW91dCBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHByZWRpY2F0ZSBpcyB0cnV0aHkuXG4gICAqL1xuICB3YWl0VW50aWwodGhpczogdm9pZCwgcGFyYW1zOiBXYWl0VW50aWxQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25BcmdzLm1vdmVNb3VzZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW92ZU1vdXNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSB4IGNvb3JkaW5hdGUgKHdlYi1jb250ZW50cyBESVApIHRvIG1vdmUgdGhlIHBvaW50ZXIgdG8uXG4gICAqL1xuICByZWFkb25seSB4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB5IGNvb3JkaW5hdGUgKHdlYi1jb250ZW50cyBESVApIHRvIG1vdmUgdGhlIHBvaW50ZXIgdG8uXG4gICAqL1xuICByZWFkb25seSB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIENvbW1vbkFyZ3MucHJlc3NLZXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXNzS2V5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gcHJlc3MsIGdpdmVuIGFzIGFuIEVsZWN0cm9uIEFjY2VsZXJhdG9yIGtleSBuYW1lIFx1MjAxNCBlLmcuXG4gICAqIGAnRW50ZXInYCwgYCdFc2NhcGUnYCwgYCdUYWInYCwgYCdCYWNrc3BhY2UnYCwgYCdEZWxldGUnYCwgYW4gYXJyb3cga2V5XG4gICAqIChgJ1VwJ2AgLyBgJ0Rvd24nYCAvIGAnTGVmdCdgIC8gYCdSaWdodCdgKSwgb3IgYSBwcmludGFibGUgY2hhcmFjdGVyXG4gICAqIChgJ2EnYCwgYCcxJ2ApLiBUaGUgcHJvZHVjZWQgY2hhcmFjdGVyICh3aGVuIHRoZSBrZXkgaW5zZXJ0cyB0ZXh0KSBpcyB0aGVcbiAgICogbGl0ZXJhbCBga2V5YCB2YWx1ZTsgY2FzZS1jb3JyZWN0IHRleHQgYmVsb25ncyB0b1xuICAgKiB7QGxpbmsgQ29tbW9uQXJncy50eXBlSW50b0VkaXRvcn0sIG5vdCBhIGtleS1wcmVzcyBwcmltaXRpdmUuXG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vZGlmaWVyIGtleXMgdG8gaG9sZCB3aGlsZSB0aGUga2V5IGlzIHByZXNzZWQsIHVzaW5nIE9ic2lkaWFuJ3NcbiAgICoge0BsaW5rIE1vZGlmaWVyfSBuYW1lcyAodGhlIHNhbWUgdmFsdWVzIGFzIGFuIE9ic2lkaWFuIGBIb3RrZXlgKS4gYCdNb2QnYFxuICAgKiByZXNvbHZlcyBwZXItcGxhdGZvcm0gKENtZCBvbiBtYWNPUywgQ3RybCBlbHNld2hlcmUpOyBlYWNoIGlzIG1hcHBlZCB0b1xuICAgKiBFbGVjdHJvbidzIGxvd2VyY2FzZSBgc2VuZElucHV0RXZlbnRgIG1vZGlmaWVyIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbXWBcbiAgICovXG4gIHJlYWRvbmx5IG1vZGlmaWVycz86IHJlYWRvbmx5IE1vZGlmaWVyW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIENvbW1vbkFyZ3MudHlwZUludG9FZGl0b3J9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVJbnRvRWRpdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBlZGl0b3IgdG8gdHlwZSBpbnRvLiBJdCBpcyBmb2N1c2VkICh3aXRoIHRoZSBjYXJldCBtb3ZlZCB0byB0aGUgZW5kIG9mXG4gICAqIHRoZSBkb2N1bWVudCkgYmVmb3JlIHRoZSBrZXlzdHJva2VzIGFyZSBpbmplY3RlZC5cbiAgICovXG4gIHJlYWRvbmx5IGVkaXRvcjogRWRpdG9yO1xuXG4gIC8qKlxuICAgKiBUaGUgdGV4dCB0byB0eXBlLiBFYWNoIGNvZGUgcG9pbnQgaXMgcHJlc3NlZCB2aWEge0BsaW5rIENvbW1vbkFyZ3MucHJlc3NLZXl9XG4gICAqIChhIHRydXN0ZWQgYGtleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGApLCBleGFjdGx5IGFzIGEgcmVhbCB1c2VyIHR5cGluZy5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQ29tbW9uQXJncy51bmhvdmVyRWxlbWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5ob3ZlckVsZW1lbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgcG9pbnRlciBhd2F5IGZyb20uIFRoZSBwb2ludGVyIGlzIG1vdmVkIHRvIGEgcG9pbnRcbiAgICoganVzdCBvdXRzaWRlIGl0cyBib3VuZGluZyBib3guIFRoaXMgaXMgYSBsaXZlIHJlbmRlcmVyIERPTSBub2RlIFx1MjAxNCB0aGVcbiAgICogY2FsbGJhY2sgcnVucyBpbi1yZW5kZXJlciwgc28gbm8gY3Jvc3MtcHJvY2VzcyBzZXJpYWxpemF0aW9uIGlzIG5lZWRlZFxuICAgKiAoc2FtZSBhcyB7QGxpbmsgVHlwZUludG9FZGl0b3JQYXJhbXMuZWRpdG9yfSkuXG4gICAqL1xuICByZWFkb25seSBlbGVtZW50OiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQ29tbW9uQXJncy53YWl0VW50aWx9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRVbnRpbFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgcG9sbGluZyBpbnRlcnZhbCBiZXR3ZWVuIHByZWRpY2F0ZSBjaGVja3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA1MGBcbiAgICovXG4gIHJlYWRvbmx5IGludGVydmFsSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGRldGFpbCBhcHBlbmRlZCB0byB0aGUgdGltZW91dCBlcnJvciBtZXNzYWdlLCBkZXNjcmliaW5nIHdoYXRcbiAgICogd2FzIGJlaW5nIHdhaXRlZCBmb3IuXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgY29uZGl0aW9uIHRvIHdhaXQgZm9yLiBQb2xsZWQgaW1tZWRpYXRlbHksIHRoZW4gb24gZXZlcnkgaW50ZXJ2YWwgdW50aWxcbiAgICogaXQgcmV0dXJucyBhIHRydXRoeSB2YWx1ZS4gTWF5IGJlIHN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cyBcdTIwMTQgaXQgaXNcbiAgICogYXdhaXRlZCBvbiBlYWNoIHBvbGwuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGF3YWl0ZWQgY29uZGl0aW9uIGhhcyBiZWVuIG1ldC5cbiAgICovXG4gIHByZWRpY2F0ZSh0aGlzOiB2b2lkKTogYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBiZWZvcmUgcmVqZWN0aW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTAwMGBcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFdmFsdWF0ZXMgYSBmdW5jdGlvbiBpbnNpZGUgdGhlIHJ1bm5pbmcgT2JzaWRpYW4gaW5zdGFuY2VcbiAqIHZpYSB0aGUgYWN0aXZlIHRyYW5zcG9ydCBhbmQgcmV0dXJucyB0aGUgcGFyc2VkIHJlc3VsdC5cbiAqXG4gKiBUaGUgZnVuY3Rpb24gcmVjZWl2ZXMgYW4gYXJncyBvYmplY3QgdGhhdCBpbmNsdWRlcyBgYXBwYCwgYG9ic2lkaWFuTW9kdWxlYCxcbiAqIGBjb250ZXh0YCwgYW5kIGFueSBhZGRpdGlvbmFsIGBhcmdzYCBwYXNzZWQgYnkgdGhlIGNhbGxlci5cbiAqIEl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgaW52b2tlZCBhcyBhbiBJSUZFLlxuICogVGhlIGZ1bmN0aW9uIG11c3QgYmUgc2VsZi1jb250YWluZWQgXHUyMDE0IGNsb3N1cmVzIG92ZXIgbG9jYWwgdmFyaWFibGVzIHdpbGwgbm90IHdvcmsuXG4gKiBQYXNzIGFueSBuZWVkZWQgdmFsdWVzIGFzIGBhcmdzYCBcdTIwMTQgdGhleSBhcmUgSlNPTi1zZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQgb24gdGhlIE9ic2lkaWFuIHNpZGUuXG4gKlxuICogVGhlIHJlc3VsdCBpcyBgSlNPTi5zdHJpbmdpZnlgJ2Qgb24gdGhlIE9ic2lkaWFuIHNpZGUgYW5kIHBhcnNlZCBiYWNrLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycyBmb3IgdGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0dXJuIHZhbHVlIG9mIGBmbmAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsSW5PYnNpZGlhbjxBcmdzIGV4dGVuZHMgR2VuZXJpY09iamVjdCwgUmVzdWx0LCBUQ29udGV4dElkIGV4dGVuZHMgQ29udGV4dElkPHVua25vd24+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcbiAgcGFyYW1zOiBFdmFsSW5PYnNpZGlhblBhcmFtczxBcmdzLCBSZXN1bHQsIFRDb250ZXh0SWQ+XG4pOiBQcm9taXNlPFJlc3VsdD4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kIC0tIGBmbmAgY2FuIGJlIHVuYm91bmQuXG4gIGNvbnN0IHsgYXJncyA9IHt9LCBjb250ZXh0SWQsIGZuLCBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzID0gZmFsc2UsIHRyYW5zcG9ydDogdHJhbnNwb3J0T3ZlcnJpZGUsIHZhdWx0UGF0aCB9ID0gcGFyYW1zO1xuICBjb25zdCBjd2QgPSB2YXVsdFBhdGggPz8gZ2V0VmF1bHRQYXRoKCkgPz8gcHJvY2Vzcy5jd2QoKTtcblxuICAvLyBDaGVjazogVmF1bHQgcGF0aCBleGlzdHMgb24gZGlzay5cbiAgaWYgKHZhdWx0UGF0aCAhPT0gdW5kZWZpbmVkICYmICFleGlzdHNTeW5jKHZhdWx0UGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFZhdWx0IHBhdGggZG9lcyBub3QgZXhpc3Q6ICR7dmF1bHRQYXRofWApO1xuICB9XG5cbiAgY29uc3QgdHJhbnNwb3J0ID0gdHJhbnNwb3J0T3ZlcnJpZGUgPz8gYXdhaXQgZ2V0T3JDcmVhdGVUcmFuc3BvcnQoZ2V0VHJhbnNwb3J0T3B0aW9ucygpKTtcblxuICBpZiAoIXNob3VsZFNraXBQcmVmbGlnaHRDaGVja3MpIHtcbiAgICBhd2FpdCB0cmFuc3BvcnQucHJlZmxpZ2h0Q2hlY2soY3dkKTtcbiAgfVxuXG4gIGF3YWl0IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0cmFuc3BvcnQsIGN3ZCk7XG5cbiAgY29uc3QgbmFtZXNwYWNlQ2FsbFBhcmFtczogR2VuZXJhdGVOYW1lc3BhY2VDYWxsUGFyYW1zID0ge1xuICAgIGFyZ3MsXG4gICAgZm4sXG4gICAgLi4uKGNvbnRleHRJZCAhPT0gdW5kZWZpbmVkICYmIHsgY29udGV4dElkOiBTdHJpbmcoY29udGV4dElkKSB9KVxuICB9O1xuXG4gIGNvbnN0IGV4cHJlc3Npb24gPSBnZW5lcmF0ZU5hbWVzcGFjZUNhbGwobmFtZXNwYWNlQ2FsbFBhcmFtcyk7XG5cbiAgY29uc3QgcmVzdWx0U3RyID0gYXdhaXQgdHJhbnNwb3J0LmV2YWx1YXRlKGV4cHJlc3Npb24sIHsgY3dkIH0pO1xuXG4gIGlmIChyZXN1bHRTdHIgPT09ICcnIHx8IHJlc3VsdFN0ciA9PT0gTk9fT1VUUFVUKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBSZXN1bHQ7XG4gIH1cblxuICBsZXQgZW52ZWxvcGU6IEV2YWxSZXN1bHRFbnZlbG9wZTtcbiAgdHJ5IHtcbiAgICBlbnZlbG9wZSA9IEpTT04ucGFyc2UocmVzdWx0U3RyKSBhcyBFdmFsUmVzdWx0RW52ZWxvcGU7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgZXZhbEluT2JzaWRpYW46IE9ic2lkaWFuIHJldHVybmVkIG5vbi1KU09OIG91dHB1dDogJHtyZXN1bHRTdHJ9YCk7XG4gIH1cblxuICBpZiAoJ3R5cGUnIGluIGVudmVsb3BlKSB7XG4gICAgaWYgKGVudmVsb3BlLnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgIC8vIFJld3JpdGUgYmFyZS1vcmlnaW4gbG9jYWxob3N0IHN0YWNrIGZyYW1lcyBsaWtlIFwiKGh0dHA6Ly9sb2NhbGhvc3QvOjkxNTozMilcIlxuICAgICAgLy8gU28gVml0ZXN0J3Mgc291cmNlLW1hcCByZXNvbHZlciB3b24ndCBleHRyYWN0IFwiL1wiIGFzIHRoZSBmaWxlIHBhdGggYW5kIGNyYXNoXG4gICAgICAvLyBXaXRoIEVJU0RJUiB3aGVuIGl0IHRyaWVzIHRvIHJlYWRGaWxlU3luYyBvbiB0aGUgcm9vdCBkaXJlY3RvcnkuXG4gICAgICBjb25zdCBzYW5pdGl6ZWREZXRhaWwgPSBlbnZlbG9wZS52YWx1ZVxuICAgICAgICAucmVwbGFjZSgvXFwoaHR0cHM/OlxcL1xcL2xvY2FsaG9zdFxcLzooPzxsaW5lPlxcZCkvZywgJyhvYnNpZGlhbi13ZWJ2aWV3OiQ8bGluZT4nKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXZhbEluT2JzaWRpYW46IEVycm9yIGluc2lkZSBPYnNpZGlhbjpcXG4ke3Nhbml0aXplZERldGFpbH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBlbnZlbG9wZS52YWx1ZSBhcyBSZXN1bHQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBLHFCQUEyQjtBQUMzQiwwQkFBb0I7QUFTcEIsOEJBR087QUFDUCxvQ0FBc0M7QUFDdEMsaUNBQTRDO0FBQzVDLCtCQUFxQztBQTJCckMsTUFBTSxZQUFZO0FBK1dsQixlQUFzQixlQUNwQixRQUNpQjtBQUVqQixRQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsV0FBVyxJQUFJLDRCQUE0QixPQUFPLFdBQVcsbUJBQW1CLFVBQVUsSUFBSTtBQUNqSCxRQUFNLE1BQU0saUJBQWEsc0NBQWEsS0FBSyxvQkFBQUEsUUFBUSxJQUFJO0FBR3ZELE1BQUksY0FBYyxVQUFhLEtBQUMsMkJBQVcsU0FBUyxHQUFHO0FBQ3JELFVBQU0sSUFBSSxNQUFNLDhCQUE4QixTQUFTLEVBQUU7QUFBQSxFQUMzRDtBQUVBLFFBQU0sWUFBWSxxQkFBcUIsVUFBTSxtREFBcUIsNkNBQW9CLENBQUM7QUFFdkYsTUFBSSxDQUFDLDJCQUEyQjtBQUM5QixVQUFNLFVBQVUsZUFBZSxHQUFHO0FBQUEsRUFDcEM7QUFFQSxZQUFNLHdEQUE0QixXQUFXLEdBQUc7QUFFaEQsUUFBTSxzQkFBbUQ7QUFBQSxJQUN2RDtBQUFBLElBQ0E7QUFBQSxJQUNBLEdBQUksY0FBYyxVQUFhLEVBQUUsV0FBVyxPQUFPLFNBQVMsRUFBRTtBQUFBLEVBQ2hFO0FBRUEsUUFBTSxpQkFBYSxxREFBc0IsbUJBQW1CO0FBRTVELFFBQU0sWUFBWSxNQUFNLFVBQVUsU0FBUyxZQUFZLEVBQUUsSUFBSSxDQUFDO0FBRTlELE1BQUksY0FBYyxNQUFNLGNBQWMsV0FBVztBQUMvQyxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFDSixNQUFJO0FBQ0YsZUFBVyxLQUFLLE1BQU0sU0FBUztBQUFBLEVBQ2pDLFFBQVE7QUFDTixVQUFNLElBQUksTUFBTSxzREFBc0QsU0FBUyxFQUFFO0FBQUEsRUFDbkY7QUFFQSxNQUFJLFVBQVUsVUFBVTtBQUN0QixRQUFJLFNBQVMsU0FBUyxTQUFTO0FBSTdCLFlBQU0sa0JBQWtCLFNBQVMsTUFDOUIsUUFBUSx5Q0FBeUMsMkJBQTJCO0FBQy9FLFlBQU0sSUFBSSxNQUFNO0FBQUEsRUFBMkMsZUFBZSxFQUFFO0FBQUEsSUFDOUU7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sU0FBUztBQUNsQjsiLAogICJuYW1lcyI6IFsicHJvY2VzcyJdCn0K
|
|
82
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2V2YWwtaW4tb2JzaWRpYW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFdmFsdWF0ZXMgYSBmdW5jdGlvbiBpbnNpZGUgYSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBhIHBsdWdnYWJsZSB0cmFuc3BvcnQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEVkaXRvcixcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQteC9uby1uYW1lc3BhY2UgLS0gV2UgbmVlZCB0byByZWZlcmVuY2UgYG9ic2lkaWFuYCBtb2R1bGUuXG5pbXBvcnQgdHlwZSAqIGFzIG9ic2lkaWFuIGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQ29udGV4dEFyZ3MsXG4gIENvbnRleHRJZFxufSBmcm9tICcuL2NvbnRleHQtaWQuY2pzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVOYW1lc3BhY2VDYWxsUGFyYW1zIH0gZnJvbSAnLi9nZW5lcmF0ZS1mdW5jdGlvbi1jYWxsLmNqcyc7XG5pbXBvcnQgdHlwZSB7IE9ic2lkaWFuVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQuY2pzJztcblxuaW1wb3J0IHtcbiAgZ2V0VHJhbnNwb3J0T3B0aW9ucyxcbiAgZ2V0VmF1bHRQYXRoXG59IGZyb20gJy4vY29udGV4dC1wcm92aWRlci5janMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVOYW1lc3BhY2VDYWxsIH0gZnJvbSAnLi9nZW5lcmF0ZS1mdW5jdGlvbi1jYWxsLmNqcyc7XG5pbXBvcnQgeyBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQgfSBmcm9tICcuL25hbWVzcGFjZS1ib290c3RyYXAuY2pzJztcbmltcG9ydCB7IGdldE9yQ3JlYXRlVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtZmFjdG9yeS5janMnO1xuXG5pbnRlcmZhY2UgRXZhbEVycm9yRW52ZWxvcGUge1xuICB0eXBlOiAnZXJyb3InO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIERpc2NyaW1pbmF0ZWQgZW52ZWxvcGUgcmV0dXJuZWQgYnkgdGhlIHJlZ2lzdGVyZWQgYGV2YWxXcmFwcGVyYCBmcm9tIGluc2lkZSB0aGUgT2JzaWRpYW4gcHJvY2Vzcy5cbiAqXG4gKiAtIGBFdmFsRXJyb3JFbnZlbG9wZWAgXHUyMDE0IGBmbmAgdGhyZXc7IGB2YWx1ZWAgaXMgdGhlIHNlcmlhbGl6ZWQgZXJyb3IuXG4gKiAtIGBFdmFsVW5kZWZpbmVkRW52ZWxvcGVgIFx1MjAxNCBgZm5gIHJldHVybmVkIGB1bmRlZmluZWRgLlxuICogLSBgRXZhbFZhbHVlRW52ZWxvcGVgIFx1MjAxNCBgZm5gIHJldHVybmVkIGEgSlNPTi1zZXJpYWxpemFibGUgdmFsdWUuXG4gKi9cbnR5cGUgRXZhbFJlc3VsdEVudmVsb3BlID1cbiAgfCBFdmFsRXJyb3JFbnZlbG9wZVxuICB8IEV2YWxVbmRlZmluZWRFbnZlbG9wZVxuICB8IEV2YWxWYWx1ZUVudmVsb3BlO1xuXG5pbnRlcmZhY2UgRXZhbFVuZGVmaW5lZEVudmVsb3BlIHtcbiAgdHlwZTogJ3VuZGVmaW5lZCc7XG59XG5cbmludGVyZmFjZSBFdmFsVmFsdWVFbnZlbG9wZSB7XG4gIHZhbHVlOiB1bmtub3duO1xufVxuXG5jb25zdCBOT19PVVRQVVQgPSAnKG5vIG91dHB1dCknO1xuXG4vKipcbiAqIENvbW1vbiBhcmd1bWVudHMgYXV0b21hdGljYWxseSBwcm92aWRlZCB0byBldmVyeSB7QGxpbmsgZXZhbEluT2JzaWRpYW59IGNhbGxiYWNrLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1vbkFyZ3Mge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIHtAbGluayBBcHB9IGluc3RhbmNlLlxuICAgKi9cbiAgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBzaGFyZWQgbGlicmFyeSBiYWcgaW5qZWN0ZWQgaW50byBldmVyeSBjYWxsYmFjayBcdTIwMTQgc2VlIHtAbGluayBMaWJ9LlxuICAgKlxuICAgKiBOZXZlciBlbXB0eTogdGhlIGhhcm5lc3MgcHJlLXBvcHVsYXRlcyBhICoqYmFzZSoqIHNldCBvZiByZW5kZXJlci1kcml2aW5nXG4gICAqIGhlbHBlcnMgKHRydXN0ZWQgaW5wdXQgXHUyMDE0IGB0eXBlSW50b0VkaXRvcmAgLyBgcHJlc3NLZXlgIC8gYG1vdmVNb3VzZWAgL1xuICAgKiBgaG92ZXJFbGVtZW50YCAvIGB1bmhvdmVyRWxlbWVudGAgXHUyMDE0IGFuZCBgd2FpdFVudGlsYCksIGFuZCBwcm92aWRlciBwYWNrYWdlc1xuICAgKiAoY2hpZWZseSBgb2JzaWRpYW4tZGV2LXV0aWxzYCkgYE9iamVjdC5hc3NpZ25gIHRoZWlyIHdob2xlIHJlbmRlcmVyLXNhZmVcbiAgICogbGlicmFyeSBvbiB0b3AgdmlhIHtAbGluayByZWdpc3RlckxpYlJlc29sdmVyfS4gQSBzZXJpYWxpemVkIGNsb3N1cmUgcmVhY2hlc1xuICAgKiBldmVyeSBzaGFyZWQgaGVscGVyIHRocm91Z2ggYGxpYmAgXHUyMDE0IGBsaWIudHlwZUludG9FZGl0b3IoeyBlZGl0b3IsIHRleHQgfSlgLFxuICAgKiBgbGliLmdldEZpbGVPck51bGwoeyBhcHAsIFx1MjAyNiB9KWAgXHUyMDE0IGluc3RlYWQgb2YgaW1wb3J0aW5nIG9yIGhhbmQtcm9sbGluZyB0aGVtLlxuICAgKi9cbiAgbGliOiBMaWI7XG5cbiAgLyoqXG4gICAqIFRoZSBgb2JzaWRpYW5gIG1vZHVsZSwgcmVzb2x2ZWQgYXQgcnVudGltZSBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gICAqL1xuICBvYnNpZGlhbk1vZHVsZTogdHlwZW9mIG9ic2lkaWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25BcmdzLmNyZWF0ZU5vdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU5vdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5vdGUncyBjb250ZW50LiBUaGlzIGV4YWN0IHN0cmluZyBpcyB3aGF0IHRoZSBjcmVhdGVkIG5vdGUgaXMgcmVhZCBiYWNrXG4gICAqIGFnYWluc3QsIHNvIGl0IGlzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3VjY2Vzc2Z1bCB3cml0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhdWx0LXJlbGF0aXZlIHBhdGggdG8gY3JlYXRlLCBleHRlbnNpb24gaW5jbHVkZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGV2YWxJbk9ic2lkaWFufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmFsSW5PYnNpZGlhblBhcmFtczxBcmdzIGV4dGVuZHMgR2VuZXJpY09iamVjdCwgUmVzdWx0LCBUQ29udGV4dElkIGV4dGVuZHMgQ29udGV4dElkPHVua25vd24+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPiB7XG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbi4gVmFsdWVzIG1heSBpbmNsdWRlIGZ1bmN0aW9ucyBcdTIwMTRcbiAgICogdGhleSBhcmUgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXJncz86IEFyZ3M7XG5cbiAgLyoqXG4gICAqIEEge0BsaW5rIENvbnRleHRJZH0gbGlua2luZyB0aGlzIGNhbGwgdG8gYSBwZXJzaXN0ZW50IHN0b3JlIG9uIGB3aW5kb3dgXG4gICAqIGluIHRoZSBPYnNpZGlhbiBwcm9jZXNzLiBUaGUgY2FsbGJhY2sgcmVjZWl2ZXMgYSB0eXBlZCBgY29udGV4dGAgb2JqZWN0XG4gICAqIHRoYXQgc3Vydml2ZXMgYWNyb3NzIGNhbGxzIHNoYXJpbmcgdGhlIHNhbWUgSUQuXG4gICAqXG4gICAqIFdoZW4gb21pdHRlZCwgYGNvbnRleHRgIGlzIGEgZnJlc2ggZW1wdHkgb2JqZWN0IGVhY2ggY2FsbC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRleHRJZD86IFRDb250ZXh0SWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZSBpbiB0aGUgT2JzaWRpYW4gY29udGV4dC5cbiAgICovXG4gIGZuKGFyZ3M6IEFyZ3MgJiBDb21tb25BcmdzICYgQ29udGV4dEFyZ3M8VENvbnRleHRJZD4pOiBQcm9taXNhYmxlPFJlc3VsdD47XG5cbiAgLyoqXG4gICAqIFNraXBzIHByZS1mbGlnaHQgY2hlY2tzICh2YXVsdCByZWdpc3RyYXRpb24sIENMSSBhdmFpbGFiaWxpdHkpLlxuICAgKiBVc2VkIGludGVybmFsbHkgYnkgdmF1bHQgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHRyYW5zcG9ydCBmb3IgdGhpcyBjYWxsLiBXaGVuIG9taXR0ZWQsIHVzZXMgdGhlIHRyYW5zcG9ydFxuICAgKiBjb25maWd1cmVkIHZpYSB0aGUgY29udGV4dCBwcm92aWRlciAoc2V0IGJ5IHRoZSBmcmFtZXdvcmsgYWRhcHRlcidzIGdsb2JhbCBzZXR1cCkuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ/OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIE9ic2lkaWFuIHZhdWx0LiBEZWZhdWx0cyB0byBgcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwbGFpbiBvYmplY3Qgd2l0aCBzdHJpbmcga2V5cy5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuZXJpY09iamVjdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25BcmdzLmhvdmVyRWxlbWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG92ZXJFbGVtZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRvIGhvdmVyLiBUaGUgcG9pbnRlciBpcyBtb3ZlZCB0byBpdHMgY2VudGVyLiBUaGlzIGlzIGEgbGl2ZVxuICAgKiByZW5kZXJlciBET00gbm9kZSBcdTIwMTQgdGhlIGNhbGxiYWNrIHJ1bnMgaW4tcmVuZGVyZXIsIHNvIG5vIGNyb3NzLXByb2Nlc3NcbiAgICogc2VyaWFsaXphdGlvbiBpcyBuZWVkZWQgKHNhbWUgYXMge0BsaW5rIFR5cGVJbnRvRWRpdG9yUGFyYW1zLmVkaXRvcn0pLlxuICAgKi9cbiAgcmVhZG9ubHkgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG59XG5cbi8qKlxuICogVGhlIHNoYXJlZCBsaWJyYXJ5IGJhZyBpbmplY3RlZCBpbnRvIGV2ZXJ5IHtAbGluayBldmFsSW5PYnNpZGlhbn0gY2FsbGJhY2sgYXNcbiAqIHtAbGluayBDb21tb25BcmdzLmxpYn0uXG4gKlxuICogVHdvIGxheWVycyBjb21wb3NlIGludG8gdGhpcyBvbmUgYmFnLiBUaGUgKipiYXNlKiogXHUyMDE0IHRoZSBoYXJuZXNzLXByb3ZpZGVkXG4gKiByZW5kZXJlci1kcml2aW5nIGhlbHBlcnMgZGVjbGFyZWQgYmVsb3cgKHRoZSB0cnVzdGVkLWlucHV0IHByaW1pdGl2ZXMgYW5kXG4gKiB7QGxpbmsgTGliLndhaXRVbnRpbH0pIFx1MjAxNCBpcyBhbHdheXMgcHJlc2VudC4gT24gdG9wLCBwcm92aWRlciBwYWNrYWdlcyByZWdpc3RlclxuICogYSByZW5kZXJlci1zaWRlIHJlc29sdmVyIHZpYSB7QGxpbmsgcmVnaXN0ZXJMaWJSZXNvbHZlcn0gdG8gYE9iamVjdC5hc3NpZ25gXG4gKiB0aGVpciB3aG9sZSByZW5kZXJlci1zYWZlIGxpYnJhcnkgYXQgcnVudGltZSwgYW5kIGF1Z21lbnQgdGhpcyAqKmF1Z21lbnRhYmxlKipcbiAqIGludGVyZmFjZSAodGhlIGBpMThuZXh0YCBgQ3VzdG9tVHlwZU9wdGlvbnNgIGlkaW9tKSB2aWFcbiAqIGBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZydgIHRvIHR5cGUgaXQuIE11bHRpcGxlIHByb3ZpZGVyc1xuICogY29tcG9zZTogdGhlaXIgZXhwb3J0cyBtZXJnZSBhdCBydW50aW1lIGFuZCB0aGVpciBhdWdtZW50YXRpb25zIG1lcmdlIGluIHRoZVxuICogdHlwZSBzeXN0ZW0gKGBpbnRlcmZhY2UgTGliIGV4dGVuZHMgXHUyMDI2YCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZycge1xuICogICBpbnRlcmZhY2UgTGliIGV4dGVuZHMgKHR5cGVvZiBpbXBvcnQoJ29ic2lkaWFuLWRldi11dGlscy9fX21lcmdlZCcpKSB7fVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGliIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBub3RlIGFuZCBkb2VzIG5vdCByZXR1cm4gdW50aWwgaXRzIGNvbnRlbnQgaXMgdmVyaWZpYWJseSBvblxuICAgKiBkaXNrLCByZXdyaXRpbmcgaXQgaWYgaXQgaXMgbm90LlxuICAgKlxuICAgKiBVc2UgdGhpcyBpbnN0ZWFkIG9mIGBhcHAudmF1bHQuY3JlYXRlYCBpbiBhbnkgc3VpdGUgdGhhdCBtYXkgcnVuIG9uXG4gICAqIEFuZHJvaWQuIFRoZSBlbXVsYXRvciB0cmFuc3BvcnQgbG9zZXMgcm91Z2hseSAqKjAuOSAlKiogb2YgYHZhdWx0LmNyZWF0ZWBcbiAgICogd3JpdGVzIChtZWFzdXJlZDogNyBsb3N0IGluIDgwMCBjcmVhdGVzKTogdGhlIGZpbGUgbGFuZHMgKiowIGJ5dGVzKiogb25cbiAgICogZGlzayB3aGlsZSBPYnNpZGlhbidzIGluLW1lbW9yeSBgVEZpbGUuc3RhdGAgcmVwb3J0cyB0aGUgZnVsbCBieXRlIGNvdW50LFxuICAgKiBhbmQgaXQgZG9lcyBub3QgaGVhbCBvbiBpdHMgb3duLiBBIHN1aXRlIGRvaW5nIH4zNCBjcmVhdGVzIHBlciBydW5cbiAgICogdGhlcmVmb3JlIGhhcyBhIH4yNiAlIGNoYW5jZSBvZiBhdCBsZWFzdCBvbmUgbG9zdCB3cml0ZSwgYW5kIHdoaWNoZXZlciB0ZXN0XG4gICAqIGxvc2VzIHRoYXQgbG90dGVyeSBmYWlscyBvbiBhIGB3YWl0VW50aWxgIGZvciBjb250ZW50IHRoYXQgd2FzIG5ldmVyXG4gICAqIHdyaXR0ZW4gXHUyMDE0IHdoaWNoIGlzIHdoeSBpdCByZWFkcyBhcyBhbiB1bnJlbGF0ZWQgcGVyLXRlc3QgZmxha2UgcmF0aGVyIHRoYW5cbiAgICogb25lIHNoYXJlZCBjYXVzZS5cbiAgICpcbiAgICogVmVyaWZpY2F0aW9uIGlzIGJ5ICoqcmVhZGluZyB0aGUgbm90ZSBiYWNrKiosIG5ldmVyIGJ5IGluc3BlY3RpbmdcbiAgICogYFRGaWxlLnN0YXRgOiBgc3RhdGAgaXMgZXhhY3RseSB0aGUgZmllbGQgdGhhdCBsaWVzIGhlcmUuIEEgcmV3cml0ZSB0aHJvdWdoXG4gICAqIGB2YXVsdC5tb2RpZnlgIHdpdGggdGhlIHNhbWUgY29udGVudCBsYW5kcyBjb3JyZWN0bHkgKGFsc28gbWVhc3VyZWQpLCBzbyBhXG4gICAqIGxvc3Qgd3JpdGUgY29zdHMgYSByZXRyeSByYXRoZXIgdGhhbiBhIGZhaWx1cmUuIEEgbm90ZSB3aG9zZSBjb250ZW50IHN0aWxsXG4gICAqIGRvZXMgbm90IG1hdGNoIGFmdGVyIHRoZSBib3VuZGVkIHJldHJpZXMgdGhyb3dzLCBuYW1pbmcgdGhlIHBhdGggYW5kIGJvdGhcbiAgICogbGVuZ3Rocywgc28gYSBnZW51aW5lbHkgYnJva2VuIHdyaXRlIGZhaWxzIGxvdWRseSBpbnN0ZWFkIG9mIHNwaW5uaW5nLlxuICAgKlxuICAgKiBIYXJtbGVzcyBldmVyeXdoZXJlIGVsc2UgXHUyMDE0IG9uIGEgdHJhbnNwb3J0IHRoYXQgZG9lcyBub3QgbG9zZSB3cml0ZXMgdGhlXG4gICAqIHJlYWQtYmFjayBtYXRjaGVzIGZpcnN0IHRpbWUgYW5kIG5vdGhpbmcgaXMgcmV3cml0dGVuLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIG5vdGUgcGF0aCBhbmQgY29udGVudC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gcmVzb2x2aW5nIHRvIHRoZSBjcmVhdGVkIGZpbGUsIG9uY2UgaXRzIGNvbnRlbnRcbiAgICogICBpcyBjb25maXJtZWQuXG4gICAqL1xuICBjcmVhdGVOb3RlKHRoaXM6IHZvaWQsIHBhcmFtczogQ3JlYXRlTm90ZVBhcmFtcyk6IFByb21pc2U8VEZpbGU+O1xuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgbW91c2UgcG9pbnRlciB0byB0aGUgY2VudGVyIG9mIGFuIGVsZW1lbnQgdXNpbmcgKip0cnVzdGVkKipcbiAgICogRWxlY3Ryb24gcG9pbnRlciBpbnB1dCwgdGhlbiBwb2xscyB1bnRpbCB0aGUgZWxlbWVudCBhY3R1YWxseSBtYXRjaGVzXG4gICAqIGA6aG92ZXJgLlxuICAgKlxuICAgKiBCZWNhdXNlIHRoZSBtb3ZlIGlzIHRydXN0ZWQgKHNlZSB7QGxpbmsgTGliLm1vdmVNb3VzZX0pLCB0aGUgcmVhbCBgOmhvdmVyYFxuICAgKiBzdGF0ZSB0YWtlcyBlZmZlY3QgaW4gdGhlIENTUyBlbmdpbmUgXHUyMDE0IHJlYWwgdGhlbWUgYHZhcigpYCB2YWx1ZXMgYW5kIHJlYWxcbiAgICogY29tcG9zaXRpbmcgXHUyMDE0IGluc3RlYWQgb2YgYSBoYW5kLXNpbXVsYXRlZCBjYXNjYWRlLiBJdCBwb2xscyB0aGUgbGl2ZVxuICAgKiBgZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKWAgc3RhdGUgKG5vdCBhIGZpeGVkIGRlbGF5KSwgc28gaXQgaXMgcm9idXN0IHVuZGVyXG4gICAqIHNoYXJlZC1pbnN0YW5jZSBsb2FkLiBJdCB0YXJnZXRzIHRoZSBzaW5nbGUgc2hhcmVkIHdpbmRvdydzICoqZ2xvYmFsKipcbiAgICogcG9pbnRlciwgc28gb25seSBvbmUgZWxlbWVudCBpcyBob3ZlcmVkIGF0IGEgdGltZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbGVtZW50IHRvIGhvdmVyLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGVsZW1lbnQgbWF0Y2hlcyBgOmhvdmVyYC5cbiAgICovXG4gIGhvdmVyRWxlbWVudCh0aGlzOiB2b2lkLCBwYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoZSBtb3VzZSBwb2ludGVyIHRvIHRoZSBnaXZlbiB3ZWItY29udGVudHMgY29vcmRpbmF0ZXMgdXNpbmcgYVxuICAgKiAqKnRydXN0ZWQqKiBFbGVjdHJvbiBwb2ludGVyIG1vdmUuXG4gICAqXG4gICAqIEEgdHJ1c3RlZCBtb3ZlIChpbmplY3RlZCB2aWEgRWxlY3Ryb24ncyBgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnRgKVxuICAgKiB1cGRhdGVzIHRoZSByZWFsIHBvaW50ZXIgc3RhdGUgaW4gdGhlIENTUyBlbmdpbmUsIHNvIGA6aG92ZXJgIHJ1bGVzXG4gICAqIGdlbnVpbmVseSBhcHBseSBcdTIwMTQgdW5saWtlIGBkaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZW92ZXInKSlgLFxuICAgKiB3aGljaCBpcyB1bnRydXN0ZWQgYW5kIG5ldmVyIHNldHMgYDpob3ZlcmAuIEl0IHRhcmdldHMgdGhlIHNpbmdsZSBzaGFyZWRcbiAgICogd2luZG93J3MgKipnbG9iYWwqKiBwb2ludGVyLCBzbyBvbmx5IG9uZSBlbGVtZW50IGlzIGhvdmVyZWQgYXQgYSB0aW1lLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBsb3ctbGV2ZWwgcHJpbWl0aXZlOiBpdCBwZXJmb3JtcyBhIHNpbmdsZSBtb3ZlIGFuZCBkb2VzICoqbm90KipcbiAgICogd2FpdCBmb3IgYW55IHN0YXRlIHRvIHNldHRsZSAoY2FsbGVycyBwb2xsIHRoZWlyIG93biByZWFkaW5lc3Mgc2lnbmFsKS5cbiAgICogUHJlZmVyIHtAbGluayBMaWIuaG92ZXJFbGVtZW50fSAvIHtAbGluayBMaWIudW5ob3ZlckVsZW1lbnR9IGZvclxuICAgKiBlbGVtZW50LXJlbGF0aXZlIG1vdmVzOyB1c2UgYG1vdmVNb3VzZWAgZGlyZWN0bHkgd2hlbiBhbiBlbGVtZW50LXJlbGF0aXZlXG4gICAqIHRhcmdldCBkb2VzIG5vdCBmaXQgKGUuZy4gYW4gZWxlbWVudCBzcGFubmluZyB0aGUgZnVsbCB2aWV3cG9ydCB3aWR0aCkuXG4gICAqXG4gICAqIFN5bmNocm9ub3VzOiBpbmplY3RpbmcgdGhlIHRydXN0ZWQgbW92ZSBkb2VzIG5vIHJlYWwgYXdhaXRpbmcsIHNvIHRoZSBjYWxsZXJcbiAgICogZG9lcyBub3QgbmVlZCB0byBgYXdhaXRgIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHdlYi1jb250ZW50cyBESVAgY29vcmRpbmF0ZXMgdG8gbW92ZSB0by5cbiAgICovXG4gIG1vdmVNb3VzZSh0aGlzOiB2b2lkLCBwYXJhbXM6IE1vdmVNb3VzZVBhcmFtcyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFByZXNzZXMgYSBzaW5nbGUga2V5IChvcHRpb25hbGx5IHdpdGggbW9kaWZpZXJzKSB1c2luZyAqKnRydXN0ZWQqKiBFbGVjdHJvblxuICAgKiBrZXlib2FyZCBpbnB1dCwgZmlyaW5nIHRoZSBmdWxsIHJlYWwga2V5IHBpcGVsaW5lIFx1MjAxNFxuICAgKiBga2V5ZG93bmAgXHUyMTkyIGBrZXlwcmVzc2AgXHUyMTkyIGBiZWZvcmVpbnB1dGAgXHUyMTkyIGBpbnB1dGAgXHUyMTkyIGBrZXl1cGAuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGtleS1wcmVzcyBhbmFsb2cgb2Yge0BsaW5rIExpYi50eXBlSW50b0VkaXRvcn06IGl0IGluamVjdHMgYVxuICAgKiB0cnVzdGVkIGBrZXlEb3duYCBcdTIxOTIgYGNoYXJgIFx1MjE5MiBga2V5VXBgIHNlcXVlbmNlIHZpYSBFbGVjdHJvbidzXG4gICAqIGB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudGAsIHNvIGl0IGlzIGRlbGl2ZXJlZCB0byB0aGUgd2luZG93J3MgRE9NLWZvY3VzZWRcbiAgICogZWxlbWVudCBhbmQgZmxvd3MgdGhyb3VnaCB0aGUgcmVhbCBpbnB1dCBwaXBlbGluZSBcdTIwMTQgdW5saWtlXG4gICAqIGBkaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KC4uLikpYCwgd2hpY2ggaXMgdW50cnVzdGVkIChgaXNUcnVzdGVkOlxuICAgKiBmYWxzZWApIGFuZCBpZ25vcmVkIGJ5IENvZGVNaXJyb3IgYW5kIG1vc3Qga2V5IGhhbmRsZXJzLiBVc2UgaXQgZm9yIHNwZWNpYWxcbiAgICoga2V5cyAoYCdFbnRlcidgLCBgJ0VzY2FwZSdgLCBgJ1RhYidgLCBhcnJvdyBrZXlzKSBhbmQgbW9kaWZpZXIgY29tYmluYXRpb25zXG4gICAqIChgU2hpZnQrRW50ZXJgLCBgQ3RybCtBYCkgdGhhdCB7QGxpbmsgTGliLnR5cGVJbnRvRWRpdG9yfSAod2hpY2ggdHlwZXNcbiAgICogcHJpbnRhYmxlIHRleHQpIGRvZXMgbm90IGNvdmVyLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBsb3ctbGV2ZWwgcHJpbWl0aXZlOiBpdCBpbmplY3RzIHRoZSBrZXkgcHJlc3MgYW5kIGRvZXMgKipub3QqKlxuICAgKiBwb2xsIGZvciBhbnkgZWZmZWN0IChhIGtleSBwcmVzcyBoYXMgbm8gdW5pdmVyc2FsIG9ic2VydmFibGUgb3V0Y29tZSBcdTIwMTRcbiAgICogYEVudGVyYCBlZGl0cyB0aGUgZG9jdW1lbnQsIGBFc2NhcGVgIGNsb3NlcyBhIG1vZGFsLCBgQXJyb3dEb3duYCBtb3ZlcyB0aGVcbiAgICogc2VsZWN0aW9uKS4gVGhlIGNhbGxlciBmb2N1c2VzIHRoZSBpbnRlbmRlZCB0YXJnZXQgZmlyc3QsIHRoZW4gYXdhaXRzIHRoZVxuICAgKiBleHBlY3RlZCBlZmZlY3QgdmlhIHtAbGluayBMaWIud2FpdFVudGlsfS4gSXQgdGFyZ2V0cyB0aGUgc2luZ2xlIHNoYXJlZFxuICAgKiB3aW5kb3cncyAqKmdsb2JhbCoqIGZvY3VzLCBzbyBvbmx5IHRoZSBET00tZm9jdXNlZCBlbGVtZW50IHJlY2VpdmVzIHRoZSBrZXkuXG4gICAqXG4gICAqIFN5bmNocm9ub3VzOiBpbmplY3RpbmcgdGhlIHRydXN0ZWQga2V5IHByZXNzIGRvZXMgbm8gcmVhbCBhd2FpdGluZywgc28gdGhlXG4gICAqIGNhbGxlciBkb2VzIG5vdCBuZWVkIHRvIGBhd2FpdGAgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUga2V5IHRvIHByZXNzIGFuZCBhbnkgbW9kaWZpZXJzIHRvIGhvbGQuXG4gICAqL1xuICBwcmVzc0tleSh0aGlzOiB2b2lkLCBwYXJhbXM6IFByZXNzS2V5UGFyYW1zKTogdm9pZDtcblxuICAvKipcbiAgICogVHlwZXMgdGV4dCBpbnRvIGEgQ29kZU1pcnJvciB7QGxpbmsgRWRpdG9yfSB1c2luZyAqKnRydXN0ZWQqKiBFbGVjdHJvblxuICAgKiBrZXlib2FyZCBpbnB1dC5cbiAgICpcbiAgICogVHlwaW5nIGlzIHByZXNzaW5nIGVhY2ggY2hhcmFjdGVyIGtleSBpbiB0dXJuOiB0aGlzIGZvY3VzZXMgdGhlIGVkaXRvclxuICAgKiAoY2FyZXQgdG8gZW5kKSBhbmQgcHJlc3NlcyBldmVyeSBjb2RlIHBvaW50IG9mIGB0ZXh0YCB2aWFcbiAgICoge0BsaW5rIExpYi5wcmVzc0tleX0gXHUyMDE0IHRoZSBzYW1lIHRydXN0ZWQgYGtleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGAgYSByZWFsXG4gICAqIHVzZXIgcHJvZHVjZXMuIEVhY2gga2V5c3Ryb2tlIGlzIGRlbGl2ZXJlZCB0byB0aGUgd2luZG93J3MgRE9NLWZvY3VzZWRcbiAgICogZWxlbWVudCBhbmQgZmxvd3MgdGhyb3VnaCBDb2RlTWlycm9yJ3MgcmVhbCBpbnB1dCBwaXBlbGluZSwgc28gdGhlIHR5cGVkXG4gICAqIHRleHQgcmVhY2hlcyB0aGUgZG9jdW1lbnQgKipvbmx5IGlmIHRoZSBlZGl0b3IgZ2VudWluZWx5IGhvbGRzIGZvY3VzKiouXG4gICAqIFRoaXMgbWFrZXMgXCJ0aGUgdXNlciB0eXBlZCBpbnRvIHRoZSBlZGl0b3JcIiBhIGZhaXRoZnVsIGVuZC10by1lbmQgY2hlY2ssXG4gICAqIHVubGlrZSBgZGlzcGF0Y2hFdmVudChuZXcgS2V5Ym9hcmRFdmVudCguLi4pKWAgKHVudHJ1c3RlZCBcdTIwMTQgaWdub3JlZCBieVxuICAgKiBDb2RlTWlycm9yKSBvciBgZXhlY0NvbW1hbmQoJ2luc2VydFRleHQnKWAgKG11dGF0ZXMgdGhlIHNlbGVjdGlvbiBldmVuXG4gICAqIHdoZW4gdGhlIGVkaXRvciBpcyBub3QgZm9jdXNlZCwgbWFza2luZyBmb2N1cyBidWdzIGFzIGZhbHNlIHBvc2l0aXZlcykuXG4gICAqXG4gICAqIEFmdGVyIGluamVjdGluZyB0aGUga2V5c3Ryb2tlcyBpdCBwb2xscyB1bnRpbCB0aGUgZG9jdW1lbnQgcmVmbGVjdHMgdGhlXG4gICAqIGlucHV0LCBvciBhIGJvdW5kZWQgdGltZW91dCBlbGFwc2VzICh0aGUgZXhwZWN0ZWQgb3V0Y29tZSB3aGVuIHRoZSBlZGl0b3JcbiAgICogaXMgcmVhZC1vbmx5IGFuZCByZWplY3RzIHRoZSBpbnB1dCwgb3Igd2hlbiBmb2N1cyB3YXMgc3RvbGVuKS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlZGl0b3IgdG8gdHlwZSBpbnRvIGFuZCB0aGUgdGV4dCB0byB0eXBlLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGtleXN0cm9rZXMgaGF2ZSBzZXR0bGVkLlxuICAgKi9cbiAgdHlwZUludG9FZGl0b3IodGhpczogdm9pZCwgcGFyYW1zOiBUeXBlSW50b0VkaXRvclBhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoZSBtb3VzZSBwb2ludGVyIHRvIGEgcG9pbnQganVzdCBvdXRzaWRlIGFuIGVsZW1lbnQncyBib3VuZGluZyBib3hcbiAgICogdXNpbmcgYSAqKnRydXN0ZWQqKiBFbGVjdHJvbiBwb2ludGVyIG1vdmUsIHRoZW4gcG9sbHMgdW50aWwgdGhlIGVsZW1lbnQgbm9cbiAgICogbG9uZ2VyIG1hdGNoZXMgYDpob3ZlcmAuXG4gICAqXG4gICAqIFRoZSBpbnZlcnNlIG9mIHtAbGluayBMaWIuaG92ZXJFbGVtZW50fS4gSXQgdGFyZ2V0cyB0aGUgc2luZ2xlIHNoYXJlZFxuICAgKiB3aW5kb3cncyAqKmdsb2JhbCoqIHBvaW50ZXIsIHNvIG9ubHkgb25lIGVsZW1lbnQgaXMgaG92ZXJlZCBhdCBhIHRpbWUuIFdoZW5cbiAgICogYW4gZWxlbWVudCBzcGFucyB0aGUgZnVsbCB2aWV3cG9ydCAobm8gcG9pbnQgb3V0c2lkZSBpdHMgYm94IGlzIHJlYWNoYWJsZSksXG4gICAqIHVzZSB7QGxpbmsgTGliLm1vdmVNb3VzZX0gZGlyZWN0bHkgdG8gbW92ZSB0aGUgcG9pbnRlciB0byBhIGtub3duIGVtcHR5XG4gICAqIGNvb3JkaW5hdGUgaW5zdGVhZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbGVtZW50IHRvIG1vdmUgdGhlIHBvaW50ZXIgYXdheSBmcm9tLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGVsZW1lbnQgbm8gbG9uZ2VyIG1hdGNoZXNcbiAgICogICBgOmhvdmVyYC5cbiAgICovXG4gIHVuaG92ZXJFbGVtZW50KHRoaXM6IHZvaWQsIHBhcmFtczogVW5ob3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBQb2xscyBhIHByZWRpY2F0ZSB1bnRpbCBpdCBiZWNvbWVzIHRydXRoeSwgb3IgcmVqZWN0cyBvbmNlIGEgYm91bmRlZFxuICAgKiB0aW1lb3V0IGVsYXBzZXMuXG4gICAqXG4gICAqIEludGVncmF0aW9uLXRlc3QgYGV2YWxJbk9ic2lkaWFuYCBjYWxsYmFja3Mgcm91dGluZWx5IG5lZWQgdG8gd2FpdCBmb3IgYW5cbiAgICogYXN5bmNocm9ub3VzIGVmZmVjdCB0byBzZXR0bGUgKGEgdmlldyB0byBvcGVuLCBhIERPTSBub2RlIHRvIGFwcGVhciwgYVxuICAgKiBzZXR0aW5nIHRvIGFwcGx5KS4gQmVjYXVzZSB0aGUgY2FsbGJhY2sgaXMgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZFxuICAgKiBjYW5ub3QgaW1wb3J0IG1vZHVsZXMsIGl0IGNhbid0IHJldXNlIGBvYnNpZGlhbi1kZXYtdXRpbHNgJ1xuICAgKiBgcmV0cnlXaXRoVGltZW91dGAgLyBgcnVuV2l0aFRpbWVvdXRgLiBUaGlzIGhlbHBlciBpcyB0aGUgc2hhcmVkLCBpbmplY3RlZFxuICAgKiByZXBsYWNlbWVudCBmb3IgdGhlIHBlci1jbG9zdXJlIHBvbGwgbG9vcHMgY29uc3VtZXJzIHdvdWxkIG90aGVyd2lzZVxuICAgKiBoYW5kLXJvbGwuXG4gICAqXG4gICAqIFRoZSBgcHJlZGljYXRlYCBtYXkgYmUgc3luY2hyb25vdXMgb3IgYXN5bmNocm9ub3VzIFx1MjAxNCBpdCBpcyBhd2FpdGVkIG9uIGV2ZXJ5XG4gICAqIHBvbGwuIEl0IGlzIGNoZWNrZWQgaW1tZWRpYXRlbHksIHRoZW4gcmUtY2hlY2tlZCBldmVyeVxuICAgKiBgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kc2AgdW50aWwgaXQgcmV0dXJucyB0cnV0aHkgb3IgYHRpbWVvdXRJbk1pbGxpc2Vjb25kc2BcbiAgICogZWxhcHNlcywgYXQgd2hpY2ggcG9pbnQgdGhlIHJldHVybmVkIHtAbGluayBQcm9taXNlfSByZWplY3RzICh0aGUgZXJyb3JcbiAgICogaW5jbHVkZXMgYG1lc3NhZ2VgIHdoZW4gcHJvdmlkZWQpLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHByZWRpY2F0ZSB0byBwb2xsIHBsdXMgb3B0aW9uYWwgdGltZW91dCwgaW50ZXJ2YWwsIGFuZFxuICAgKiAgIHRpbWVvdXQgbWVzc2FnZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBwcmVkaWNhdGUgaXMgdHJ1dGh5LlxuICAgKi9cbiAgd2FpdFVudGlsKHRoaXM6IHZvaWQsIHBhcmFtczogV2FpdFVudGlsUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQ29tbW9uQXJncy5tb3ZlTW91c2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vdmVNb3VzZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgeCBjb29yZGluYXRlICh3ZWItY29udGVudHMgRElQKSB0byBtb3ZlIHRoZSBwb2ludGVyIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgeDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgeSBjb29yZGluYXRlICh3ZWItY29udGVudHMgRElQKSB0byBtb3ZlIHRoZSBwb2ludGVyIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgeTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25BcmdzLnByZXNzS2V5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVzc0tleVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHByZXNzLCBnaXZlbiBhcyBhbiBFbGVjdHJvbiBBY2NlbGVyYXRvciBrZXkgbmFtZSBcdTIwMTQgZS5nLlxuICAgKiBgJ0VudGVyJ2AsIGAnRXNjYXBlJ2AsIGAnVGFiJ2AsIGAnQmFja3NwYWNlJ2AsIGAnRGVsZXRlJ2AsIGFuIGFycm93IGtleVxuICAgKiAoYCdVcCdgIC8gYCdEb3duJ2AgLyBgJ0xlZnQnYCAvIGAnUmlnaHQnYCksIG9yIGEgcHJpbnRhYmxlIGNoYXJhY3RlclxuICAgKiAoYCdhJ2AsIGAnMSdgKS4gVGhlIHByb2R1Y2VkIGNoYXJhY3RlciAod2hlbiB0aGUga2V5IGluc2VydHMgdGV4dCkgaXMgdGhlXG4gICAqIGxpdGVyYWwgYGtleWAgdmFsdWU7IGNhc2UtY29ycmVjdCB0ZXh0IGJlbG9uZ3MgdG9cbiAgICoge0BsaW5rIENvbW1vbkFyZ3MudHlwZUludG9FZGl0b3J9LCBub3QgYSBrZXktcHJlc3MgcHJpbWl0aXZlLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RpZmllciBrZXlzIHRvIGhvbGQgd2hpbGUgdGhlIGtleSBpcyBwcmVzc2VkLCB1c2luZyBPYnNpZGlhbidzXG4gICAqIHtAbGluayBNb2RpZmllcn0gbmFtZXMgKHRoZSBzYW1lIHZhbHVlcyBhcyBhbiBPYnNpZGlhbiBgSG90a2V5YCkuIGAnTW9kJ2BcbiAgICogcmVzb2x2ZXMgcGVyLXBsYXRmb3JtIChDbWQgb24gbWFjT1MsIEN0cmwgZWxzZXdoZXJlKTsgZWFjaCBpcyBtYXBwZWQgdG9cbiAgICogRWxlY3Ryb24ncyBsb3dlcmNhc2UgYHNlbmRJbnB1dEV2ZW50YCBtb2RpZmllciBuYW1lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgW11gXG4gICAqL1xuICByZWFkb25seSBtb2RpZmllcnM/OiByZWFkb25seSBNb2RpZmllcltdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25BcmdzLnR5cGVJbnRvRWRpdG9yfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlSW50b0VkaXRvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZWRpdG9yIHRvIHR5cGUgaW50by4gSXQgaXMgZm9jdXNlZCAod2l0aCB0aGUgY2FyZXQgbW92ZWQgdG8gdGhlIGVuZCBvZlxuICAgKiB0aGUgZG9jdW1lbnQpIGJlZm9yZSB0aGUga2V5c3Ryb2tlcyBhcmUgaW5qZWN0ZWQuXG4gICAqL1xuICByZWFkb25seSBlZGl0b3I6IEVkaXRvcjtcblxuICAvKipcbiAgICogVGhlIHRleHQgdG8gdHlwZS4gRWFjaCBjb2RlIHBvaW50IGlzIHByZXNzZWQgdmlhIHtAbGluayBDb21tb25BcmdzLnByZXNzS2V5fVxuICAgKiAoYSB0cnVzdGVkIGBrZXlEb3duYCBcdTIxOTIgYGNoYXJgIFx1MjE5MiBga2V5VXBgKSwgZXhhY3RseSBhcyBhIHJlYWwgdXNlciB0eXBpbmcuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIENvbW1vbkFyZ3MudW5ob3ZlckVsZW1lbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVuaG92ZXJFbGVtZW50UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRvIG1vdmUgdGhlIHBvaW50ZXIgYXdheSBmcm9tLiBUaGUgcG9pbnRlciBpcyBtb3ZlZCB0byBhIHBvaW50XG4gICAqIGp1c3Qgb3V0c2lkZSBpdHMgYm91bmRpbmcgYm94LiBUaGlzIGlzIGEgbGl2ZSByZW5kZXJlciBET00gbm9kZSBcdTIwMTQgdGhlXG4gICAqIGNhbGxiYWNrIHJ1bnMgaW4tcmVuZGVyZXIsIHNvIG5vIGNyb3NzLXByb2Nlc3Mgc2VyaWFsaXphdGlvbiBpcyBuZWVkZWRcbiAgICogKHNhbWUgYXMge0BsaW5rIFR5cGVJbnRvRWRpdG9yUGFyYW1zLmVkaXRvcn0pLlxuICAgKi9cbiAgcmVhZG9ubHkgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIENvbW1vbkFyZ3Mud2FpdFVudGlsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWl0VW50aWxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBvbGxpbmcgaW50ZXJ2YWwgYmV0d2VlbiBwcmVkaWNhdGUgY2hlY2tzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTBgXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBkZXRhaWwgYXBwZW5kZWQgdG8gdGhlIHRpbWVvdXQgZXJyb3IgbWVzc2FnZSwgZGVzY3JpYmluZyB3aGF0XG4gICAqIHdhcyBiZWluZyB3YWl0ZWQgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbiB0byB3YWl0IGZvci4gUG9sbGVkIGltbWVkaWF0ZWx5LCB0aGVuIG9uIGV2ZXJ5IGludGVydmFsIHVudGlsXG4gICAqIGl0IHJldHVybnMgYSB0cnV0aHkgdmFsdWUuIE1heSBiZSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMgXHUyMDE0IGl0IGlzXG4gICAqIGF3YWl0ZWQgb24gZWFjaCBwb2xsLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhd2FpdGVkIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuXG4gICAqL1xuICBwcmVkaWNhdGUodGhpczogdm9pZCk6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgYmVmb3JlIHJlamVjdGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDUwMDBgXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRXZhbHVhdGVzIGEgZnVuY3Rpb24gaW5zaWRlIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlXG4gKiB2aWEgdGhlIGFjdGl2ZSB0cmFuc3BvcnQgYW5kIHJldHVybnMgdGhlIHBhcnNlZCByZXN1bHQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGFuIGFyZ3Mgb2JqZWN0IHRoYXQgaW5jbHVkZXMgYGFwcGAsIGBvYnNpZGlhbk1vZHVsZWAsXG4gKiBgY29udGV4dGAsIGFuZCBhbnkgYWRkaXRpb25hbCBgYXJnc2AgcGFzc2VkIGJ5IHRoZSBjYWxsZXIuXG4gKiBJdCBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGludm9rZWQgYXMgYW4gSUlGRS5cbiAqIFRoZSBmdW5jdGlvbiBtdXN0IGJlIHNlbGYtY29udGFpbmVkIFx1MjAxNCBjbG9zdXJlcyBvdmVyIGxvY2FsIHZhcmlhYmxlcyB3aWxsIG5vdCB3b3JrLlxuICogUGFzcyBhbnkgbmVlZGVkIHZhbHVlcyBhcyBgYXJnc2AgXHUyMDE0IHRoZXkgYXJlIEpTT04tc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIG9uIHRoZSBPYnNpZGlhbiBzaWRlLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgYEpTT04uc3RyaW5naWZ5YCdkIG9uIHRoZSBPYnNpZGlhbiBzaWRlIGFuZCBwYXJzZWQgYmFjay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBgZm5gLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXZhbEluT2JzaWRpYW48QXJncyBleHRlbmRzIEdlbmVyaWNPYmplY3QsIFJlc3VsdCwgVENvbnRleHRJZCBleHRlbmRzIENvbnRleHRJZDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oXG4gIHBhcmFtczogRXZhbEluT2JzaWRpYW5QYXJhbXM8QXJncywgUmVzdWx0LCBUQ29udGV4dElkPlxuKTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZCAtLSBgZm5gIGNhbiBiZSB1bmJvdW5kLlxuICBjb25zdCB7IGFyZ3MgPSB7fSwgY29udGV4dElkLCBmbiwgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrcyA9IGZhbHNlLCB0cmFuc3BvcnQ6IHRyYW5zcG9ydE92ZXJyaWRlLCB2YXVsdFBhdGggfSA9IHBhcmFtcztcbiAgY29uc3QgY3dkID0gdmF1bHRQYXRoID8/IGdldFZhdWx0UGF0aCgpID8/IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gQ2hlY2s6IFZhdWx0IHBhdGggZXhpc3RzIG9uIGRpc2suXG4gIGlmICh2YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiAhZXhpc3RzU3luYyh2YXVsdFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBwYXRoIGRvZXMgbm90IGV4aXN0OiAke3ZhdWx0UGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zcG9ydCA9IHRyYW5zcG9ydE92ZXJyaWRlID8/IGF3YWl0IGdldE9yQ3JlYXRlVHJhbnNwb3J0KGdldFRyYW5zcG9ydE9wdGlvbnMoKSk7XG5cbiAgaWYgKCFzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzKSB7XG4gICAgYXdhaXQgdHJhbnNwb3J0LnByZWZsaWdodENoZWNrKGN3ZCk7XG4gIH1cblxuICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodHJhbnNwb3J0LCBjd2QpO1xuXG4gIGNvbnN0IG5hbWVzcGFjZUNhbGxQYXJhbXM6IEdlbmVyYXRlTmFtZXNwYWNlQ2FsbFBhcmFtcyA9IHtcbiAgICBhcmdzLFxuICAgIGZuLFxuICAgIC4uLihjb250ZXh0SWQgIT09IHVuZGVmaW5lZCAmJiB7IGNvbnRleHRJZDogU3RyaW5nKGNvbnRleHRJZCkgfSlcbiAgfTtcblxuICBjb25zdCBleHByZXNzaW9uID0gZ2VuZXJhdGVOYW1lc3BhY2VDYWxsKG5hbWVzcGFjZUNhbGxQYXJhbXMpO1xuXG4gIGNvbnN0IHJlc3VsdFN0ciA9IGF3YWl0IHRyYW5zcG9ydC5ldmFsdWF0ZShleHByZXNzaW9uLCB7IGN3ZCB9KTtcblxuICBpZiAocmVzdWx0U3RyID09PSAnJyB8fCByZXN1bHRTdHIgPT09IE5PX09VVFBVVCkge1xuICAgIHJldHVybiB1bmRlZmluZWQgYXMgUmVzdWx0O1xuICB9XG5cbiAgbGV0IGVudmVsb3BlOiBFdmFsUmVzdWx0RW52ZWxvcGU7XG4gIHRyeSB7XG4gICAgZW52ZWxvcGUgPSBKU09OLnBhcnNlKHJlc3VsdFN0cikgYXMgRXZhbFJlc3VsdEVudmVsb3BlO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGV2YWxJbk9ic2lkaWFuOiBPYnNpZGlhbiByZXR1cm5lZCBub24tSlNPTiBvdXRwdXQ6ICR7cmVzdWx0U3RyfWApO1xuICB9XG5cbiAgaWYgKCd0eXBlJyBpbiBlbnZlbG9wZSkge1xuICAgIGlmIChlbnZlbG9wZS50eXBlID09PSAnZXJyb3InKSB7XG4gICAgICAvLyBSZXdyaXRlIGJhcmUtb3JpZ2luIGxvY2FsaG9zdCBzdGFjayBmcmFtZXMgbGlrZSBcIihodHRwOi8vbG9jYWxob3N0Lzo5MTU6MzIpXCJcbiAgICAgIC8vIFNvIFZpdGVzdCdzIHNvdXJjZS1tYXAgcmVzb2x2ZXIgd29uJ3QgZXh0cmFjdCBcIi9cIiBhcyB0aGUgZmlsZSBwYXRoIGFuZCBjcmFzaFxuICAgICAgLy8gV2l0aCBFSVNESVIgd2hlbiBpdCB0cmllcyB0byByZWFkRmlsZVN5bmMgb24gdGhlIHJvb3QgZGlyZWN0b3J5LlxuICAgICAgY29uc3Qgc2FuaXRpemVkRGV0YWlsID0gZW52ZWxvcGUudmFsdWVcbiAgICAgICAgLnJlcGxhY2UoL1xcKGh0dHBzPzpcXC9cXC9sb2NhbGhvc3RcXC86KD88bGluZT5cXGQpL2csICcob2JzaWRpYW4td2VidmlldzokPGxpbmU+Jyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGV2YWxJbk9ic2lkaWFuOiBFcnJvciBpbnNpZGUgT2JzaWRpYW46XFxuJHtzYW5pdGl6ZWREZXRhaWx9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBSZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gZW52ZWxvcGUudmFsdWUgYXMgUmVzdWx0O1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQkEscUJBQTJCO0FBQzNCLDBCQUFvQjtBQVNwQiw4QkFHTztBQUNQLG9DQUFzQztBQUN0QyxpQ0FBNEM7QUFDNUMsK0JBQXFDO0FBMkJyQyxNQUFNLFlBQVk7QUE2WmxCLGVBQXNCLGVBQ3BCLFFBQ2lCO0FBRWpCLFFBQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxXQUFXLElBQUksNEJBQTRCLE9BQU8sV0FBVyxtQkFBbUIsVUFBVSxJQUFJO0FBQ2pILFFBQU0sTUFBTSxpQkFBYSxzQ0FBYSxLQUFLLG9CQUFBQSxRQUFRLElBQUk7QUFHdkQsTUFBSSxjQUFjLFVBQWEsS0FBQywyQkFBVyxTQUFTLEdBQUc7QUFDckQsVUFBTSxJQUFJLE1BQU0sOEJBQThCLFNBQVMsRUFBRTtBQUFBLEVBQzNEO0FBRUEsUUFBTSxZQUFZLHFCQUFxQixVQUFNLG1EQUFxQiw2Q0FBb0IsQ0FBQztBQUV2RixNQUFJLENBQUMsMkJBQTJCO0FBQzlCLFVBQU0sVUFBVSxlQUFlLEdBQUc7QUFBQSxFQUNwQztBQUVBLFlBQU0sd0RBQTRCLFdBQVcsR0FBRztBQUVoRCxRQUFNLHNCQUFtRDtBQUFBLElBQ3ZEO0FBQUEsSUFDQTtBQUFBLElBQ0EsR0FBSSxjQUFjLFVBQWEsRUFBRSxXQUFXLE9BQU8sU0FBUyxFQUFFO0FBQUEsRUFDaEU7QUFFQSxRQUFNLGlCQUFhLHFEQUFzQixtQkFBbUI7QUFFNUQsUUFBTSxZQUFZLE1BQU0sVUFBVSxTQUFTLFlBQVksRUFBRSxJQUFJLENBQUM7QUFFOUQsTUFBSSxjQUFjLE1BQU0sY0FBYyxXQUFXO0FBQy9DLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSTtBQUNKLE1BQUk7QUFDRixlQUFXLEtBQUssTUFBTSxTQUFTO0FBQUEsRUFDakMsUUFBUTtBQUNOLFVBQU0sSUFBSSxNQUFNLHNEQUFzRCxTQUFTLEVBQUU7QUFBQSxFQUNuRjtBQUVBLE1BQUksVUFBVSxVQUFVO0FBQ3RCLFFBQUksU0FBUyxTQUFTLFNBQVM7QUFJN0IsWUFBTSxrQkFBa0IsU0FBUyxNQUM5QixRQUFRLHlDQUF5QywyQkFBMkI7QUFDL0UsWUFBTSxJQUFJLE1BQU07QUFBQSxFQUEyQyxlQUFlLEVBQUU7QUFBQSxJQUM5RTtBQUVBLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTyxTQUFTO0FBQ2xCOyIsCiAgIm5hbWVzIjogWyJwcm9jZXNzIl0KfQo=
|